summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@linux.intel.com>2018-06-14 19:53:45 -0700
committerH. Peter Anvin <hpa@linux.intel.com>2018-06-14 19:53:45 -0700
commitaf5f918a9235ec8a4ce72553141c06b9631fb550 (patch)
tree15ddc1c8ac4e559a2972747497f741a71c04b0e3
parent58ab877402f60c69cae5b482b65dec65501e82fa (diff)
downloadnasm-af5f918a9235ec8a4ce72553141c06b9631fb550.tar.gz
Don't keep assigning segment numbers to EXTERN or COMMON
If a symbol is EXTERN or COMMON, then we should not keep assigning it new segment numbers over and over. Instead, change the label code so that it assignes a new segment value if and only if one has not been assigned before. Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
-rw-r--r--asm/directiv.c2
-rw-r--r--asm/labels.c8
2 files changed, 7 insertions, 3 deletions
diff --git a/asm/directiv.c b/asm/directiv.c
index 53c1917c..68a74a12 100644
--- a/asm/directiv.c
+++ b/asm/directiv.c
@@ -369,7 +369,7 @@ bool process_directives(char *directive)
break;
if (type == LBL_COMMON || type == LBL_EXTERN)
- define_label(value, seg_alloc(), size, false);
+ define_label(value, 0, size, false);
break;
}
diff --git a/asm/labels.c b/asm/labels.c
index eec5a844..ccdedace 100644
--- a/asm/labels.c
+++ b/asm/labels.c
@@ -77,7 +77,6 @@ static bool ismagic(const char *l)
#define END_LIST -3 /* don't clash with NO_SEG! */
#define END_BLOCK -2
-#define BOGUS_VALUE -4
#define PERMTS_SIZE 16384 /* size of text blocks */
#if (PERMTS_SIZE < IDLEN_MAX)
@@ -230,7 +229,6 @@ static union label *find_label(const char *label, bool create, bool *created)
*created = true;
nasm_zero(*lfree);
- lfree->admin.movingon = BOGUS_VALUE;
lfree->defn.label = perm_copy(label);
lfree->defn.subsection = NO_SEG;
if (label_str)
@@ -426,6 +424,12 @@ void define_label(const char *label, int32_t segment,
nasm_error(ERR_WARNING, "label `%s' defined on pass two", label);
}
+ if (!segment) {
+ segment = lptr->defn.segment;
+ if (!segment)
+ segment = lptr->defn.segment = seg_alloc();
+ }
+
if (lptr->defn.defined || lptr->defn.type == LBL_BACKEND) {
/* We have seen this on at least one previous pass */
mangle_label_name(lptr);