Skip to content

Commit c7e17f5

Browse files
komhH. Peter Anvin
authored andcommitted
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 <komh78@gmail.com>
1 parent 755593b commit c7e17f5

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
@@ -1652,6 +1652,8 @@ obj_directive(enum directive directive, char *value)
16521652
struct Segment *seg;
16531653
struct External **extp;
16541654
int obj_idx;
1655+
const char *segname;
1656+
int i;
16551657

16561658
q = value;
16571659
while (*q == '.')
@@ -1680,22 +1682,23 @@ obj_directive(enum directive directive, char *value)
16801682
for (grp = grphead; grp; grp = grp->next) {
16811683
obj_idx++;
16821684
if (!strcmp(grp->name, v)) {
1683-
nasm_nonfatal("group `%s' defined twice", v);
1684-
return DIRR_ERROR;
1685+
break;
16851686
}
16861687
}
16871688

1688-
*grptail = grp = nasm_malloc(sizeof(*grp));
1689-
grp->next = NULL;
1690-
grptail = &grp->next;
1691-
grp->index = seg_alloc();
1692-
grp->obj_index = obj_idx;
1693-
grp->nindices = grp->nentries = 0;
1694-
grp->name = NULL;
1695-
1696-
obj_grp_needs_update = grp;
1697-
backend_label(v, grp->index + 1, 0L);
1698-
obj_grp_needs_update = NULL;
1689+
if (!grp) {
1690+
*grptail = grp = nasm_malloc(sizeof(*grp));
1691+
grp->next = NULL;
1692+
grptail = &grp->next;
1693+
grp->index = seg_alloc();
1694+
grp->obj_index = obj_idx;
1695+
grp->nindices = grp->nentries = 0;
1696+
grp->name = NULL;
1697+
1698+
obj_grp_needs_update = grp;
1699+
backend_label(v, grp->index + 1, 0L);
1700+
obj_grp_needs_update = NULL;
1701+
}
16991702

17001703
while (*q) {
17011704
p = q;
@@ -1709,6 +1712,30 @@ obj_directive(enum directive directive, char *value)
17091712
/*
17101713
* Now p contains a segment name. Find it.
17111714
*/
1715+
for (i = 0; i < grp->nentries; i++) {
1716+
if (i < grp->nindices) {
1717+
segname = NULL; /* make compiler happy */
1718+
for (seg = seghead; seg; seg = seg->next) {
1719+
if (grp->segs[i].index == seg->obj_index) {
1720+
segname = seg->name;
1721+
break;
1722+
}
1723+
}
1724+
}
1725+
else
1726+
segname = grp->segs[i].name;
1727+
/*
1728+
* See if this segment is defined in this group.
1729+
*/
1730+
if (!strcmp(segname, p))
1731+
break;
1732+
}
1733+
if (i < grp->nentries) {
1734+
/*
1735+
* We have already this segment. Skip.
1736+
*/
1737+
continue;
1738+
}
17121739
for (seg = seghead; seg; seg = seg->next)
17131740
if (!strcmp(seg->name, p))
17141741
break;

0 commit comments

Comments
 (0)