Skip to content

Commit 233e479

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 3472f36 commit 233e479

File tree

1 file changed

+40
-13
lines changed

1 file changed

+40
-13
lines changed

output/outobj.c

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,6 +1574,8 @@ obj_directive(enum directive directive, char *value)
15741574
struct Segment *seg;
15751575
struct External **extp;
15761576
int obj_idx;
1577+
const char *segname;
1578+
int i;
15771579

15781580
q = value;
15791581
while (*q == '.')
@@ -1602,22 +1604,23 @@ obj_directive(enum directive directive, char *value)
16021604
for (grp = grphead; grp; grp = grp->next) {
16031605
obj_idx++;
16041606
if (!strcmp(grp->name, v)) {
1605-
nasm_nonfatal("group `%s' defined twice", v);
1606-
return DIRR_ERROR;
1607+
break;
16071608
}
16081609
}
16091610

1610-
*grptail = grp = nasm_malloc(sizeof(*grp));
1611-
grp->next = NULL;
1612-
grptail = &grp->next;
1613-
grp->index = seg_alloc();
1614-
grp->obj_index = obj_idx;
1615-
grp->nindices = grp->nentries = 0;
1616-
grp->name = NULL;
1617-
1618-
obj_grp_needs_update = grp;
1619-
backend_label(v, grp->index + 1, 0L);
1620-
obj_grp_needs_update = NULL;
1611+
if (!grp) {
1612+
*grptail = grp = nasm_malloc(sizeof(*grp));
1613+
grp->next = NULL;
1614+
grptail = &grp->next;
1615+
grp->index = seg_alloc();
1616+
grp->obj_index = obj_idx;
1617+
grp->nindices = grp->nentries = 0;
1618+
grp->name = NULL;
1619+
1620+
obj_grp_needs_update = grp;
1621+
backend_label(v, grp->index + 1, 0L);
1622+
obj_grp_needs_update = NULL;
1623+
}
16211624

16221625
while (*q) {
16231626
p = q;
@@ -1631,6 +1634,30 @@ obj_directive(enum directive directive, char *value)
16311634
/*
16321635
* Now p contains a segment name. Find it.
16331636
*/
1637+
for (i = 0; i < grp->nentries; i++) {
1638+
if (i < grp->nindices) {
1639+
segname = NULL; /* make compiler happy */
1640+
for (seg = seghead; seg; seg = seg->next) {
1641+
if (grp->segs[i].index == seg->obj_index) {
1642+
segname = seg->name;
1643+
break;
1644+
}
1645+
}
1646+
}
1647+
else
1648+
segname = grp->segs[i].name;
1649+
/*
1650+
* See if this segment is defined in this group.
1651+
*/
1652+
if (!strcmp(segname, p))
1653+
break;
1654+
}
1655+
if (i < grp->nentries) {
1656+
/*
1657+
* We have already this segment. Skip.
1658+
*/
1659+
continue;
1660+
}
16341661
for (seg = seghead; seg; seg = seg->next)
16351662
if (!strcmp(seg->name, p))
16361663
break;

0 commit comments

Comments
 (0)