Skip to content

Commit 17d62ba

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 17d62ba

File tree

1 file changed

+40
-13
lines changed

1 file changed

+40
-13
lines changed

output/outobj.c

+40-13
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,22 +1614,23 @@ 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;
1627-
1628-
obj_grp_needs_update = grp;
1629-
backend_label(v, grp->index + 1, 0L);
1630-
obj_grp_needs_update = 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+
1630+
obj_grp_needs_update = grp;
1631+
backend_label(v, grp->index + 1, 0L);
1632+
obj_grp_needs_update = NULL;
1633+
}
16311634

16321635
while (*q) {
16331636
p = q;
@@ -1641,6 +1644,30 @@ 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+
segname = NULL; /* make compiler happy */
1650+
for (seg = seghead; seg; seg = seg->next) {
1651+
if (grp->segs[i].index == seg->obj_index) {
1652+
segname = seg->name;
1653+
break;
1654+
}
1655+
}
1656+
}
1657+
else
1658+
segname = grp->segs[i].name;
1659+
/*
1660+
* See if this segment is defined in this group.
1661+
*/
1662+
if (!strcmp(segname, p))
1663+
break;
1664+
}
1665+
if (i < grp->nentries) {
1666+
/*
1667+
* We have already this segment. Skip.
1668+
*/
1669+
continue;
1670+
}
16441671
for (seg = seghead; seg; seg = seg->next)
16451672
if (!strcmp(seg->name, p))
16461673
break;

0 commit comments

Comments
 (0)