0
0
mirror of https://github.com/netwide-assembler/nasm.git synced 2025-09-22 10:43:39 -04:00

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>
This commit is contained in:
KO Myung-Hun
2024-11-27 13:49:02 +09:00
parent 888d9ab550
commit 17d62ba297

View File

@@ -1584,6 +1584,8 @@ obj_directive(enum directive directive, char *value)
struct Segment *seg; struct Segment *seg;
struct External **extp; struct External **extp;
int obj_idx; int obj_idx;
const char *segname;
int i;
q = value; q = value;
while (*q == '.') while (*q == '.')
@@ -1612,22 +1614,23 @@ obj_directive(enum directive directive, char *value)
for (grp = grphead; grp; grp = grp->next) { for (grp = grphead; grp; grp = grp->next) {
obj_idx++; obj_idx++;
if (!strcmp(grp->name, v)) { if (!strcmp(grp->name, v)) {
nasm_nonfatal("group `%s' defined twice", v); break;
return DIRR_ERROR;
} }
} }
*grptail = grp = nasm_malloc(sizeof(*grp)); if (!grp) {
grp->next = NULL; *grptail = grp = nasm_malloc(sizeof(*grp));
grptail = &grp->next; grp->next = NULL;
grp->index = seg_alloc(); grptail = &grp->next;
grp->obj_index = obj_idx; grp->index = seg_alloc();
grp->nindices = grp->nentries = 0; grp->obj_index = obj_idx;
grp->name = NULL; grp->nindices = grp->nentries = 0;
grp->name = NULL;
obj_grp_needs_update = grp; obj_grp_needs_update = grp;
backend_label(v, grp->index + 1, 0L); backend_label(v, grp->index + 1, 0L);
obj_grp_needs_update = NULL; obj_grp_needs_update = NULL;
}
while (*q) { while (*q) {
p = q; p = q;
@@ -1641,6 +1644,30 @@ obj_directive(enum directive directive, char *value)
/* /*
* Now p contains a segment name. Find it. * Now p contains a segment name. Find it.
*/ */
for (i = 0; i < grp->nentries; i++) {
if (i < grp->nindices) {
segname = NULL; /* make compiler happy */
for (seg = seghead; seg; seg = seg->next) {
if (grp->segs[i].index == seg->obj_index) {
segname = seg->name;
break;
}
}
}
else
segname = grp->segs[i].name;
/*
* See if this segment is defined in this group.
*/
if (!strcmp(segname, p))
break;
}
if (i < grp->nentries) {
/*
* We have already this segment. Skip.
*/
continue;
}
for (seg = seghead; seg; seg = seg->next) for (seg = seghead; seg; seg = seg->next)
if (!strcmp(seg->name, p)) if (!strcmp(seg->name, p))
break; break;