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:
@@ -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,11 +1614,11 @@ 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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!grp) {
|
||||||
*grptail = grp = nasm_malloc(sizeof(*grp));
|
*grptail = grp = nasm_malloc(sizeof(*grp));
|
||||||
grp->next = NULL;
|
grp->next = NULL;
|
||||||
grptail = &grp->next;
|
grptail = &grp->next;
|
||||||
@@ -1628,6 +1630,7 @@ obj_directive(enum directive directive, char *value)
|
|||||||
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;
|
||||||
|
Reference in New Issue
Block a user