Skip to content

Commit c941d8b

Browse files
committed
outobj: make a group cumulative
On any other OMF assemblers such as MASM, TASM and ALP, a group is cumulative. Signed-off-by: KO Myung-Hun <[email protected]>
1 parent 888d9ab commit c941d8b

File tree

1 file changed

+35
-9
lines changed

1 file changed

+35
-9
lines changed

output/outobj.c

+35-9
Original file line numberDiff line numberDiff line change
@@ -1584,6 +1584,8 @@ obj_directive(enum directive directive, char *value)
15841584
struct Segment *seg;
15851585
struct External **extp;
15861586
int obj_idx;
1587+
const char *segname;
1588+
int i;
15871589

15881590
q = value;
15891591
while (*q == '.')
@@ -1612,18 +1614,19 @@ obj_directive(enum directive directive, char *value)
16121614
for (grp = grphead; grp; grp = grp->next) {
16131615
obj_idx++;
16141616
if (!strcmp(grp->name, v)) {
1615-
nasm_nonfatal("group `%s' defined twice", v);
1616-
return DIRR_ERROR;
1617+
break;
16171618
}
16181619
}
16191620

1620-
*grptail = grp = nasm_malloc(sizeof(*grp));
1621-
grp->next = NULL;
1622-
grptail = &grp->next;
1623-
grp->index = seg_alloc();
1624-
grp->obj_index = obj_idx;
1625-
grp->nindices = grp->nentries = 0;
1626-
grp->name = NULL;
1621+
if (!grp) {
1622+
*grptail = grp = nasm_malloc(sizeof(*grp));
1623+
grp->next = NULL;
1624+
grptail = &grp->next;
1625+
grp->index = seg_alloc();
1626+
grp->obj_index = obj_idx;
1627+
grp->nindices = grp->nentries = 0;
1628+
grp->name = NULL;
1629+
}
16271630

16281631
obj_grp_needs_update = grp;
16291632
backend_label(v, grp->index + 1, 0L);
@@ -1641,6 +1644,29 @@ obj_directive(enum directive directive, char *value)
16411644
/*
16421645
* Now p contains a segment name. Find it.
16431646
*/
1647+
for (i = 0; i < grp->nentries; i++) {
1648+
if (i < grp->nindices) {
1649+
for (seg = seghead; seg; seg = seg->next) {
1650+
if (grp->segs[i].index == seg->obj_index) {
1651+
segname = seg->name;
1652+
break;
1653+
}
1654+
}
1655+
}
1656+
else
1657+
segname = grp->segs[i].name;
1658+
/*
1659+
* See if this segment is defined in this group.
1660+
*/
1661+
if (!strcmp(segname, p))
1662+
break;
1663+
}
1664+
if (i < grp->nentries) {
1665+
/*
1666+
* We have already this segment. Skip.
1667+
*/
1668+
continue;
1669+
}
16441670
for (seg = seghead; seg; seg = seg->next)
16451671
if (!strcmp(seg->name, p))
16461672
break;

0 commit comments

Comments
 (0)