Merge [2190] from trunk.
svn path=/branches/yasm-0.8.x/; revision=2191
diff --git a/modules/parsers/nasm/nasm-parse.c b/modules/parsers/nasm/nasm-parse.c
index 0e80b58..6ec14fd 100644
--- a/modules/parsers/nasm/nasm-parse.c
+++ b/modules/parsers/nasm/nasm-parse.c
@@ -62,8 +62,9 @@
(yasm_parser_nasm *parser_nasm, const char *name,
/*@null@*/ yasm_valparamhead *valparams,
/*@null@*/ yasm_valparamhead *objext_valparams);
+static void set_nonlocal_label(yasm_parser_nasm *parser_nasm, const char *name);
static void define_label(yasm_parser_nasm *parser_nasm, /*@only@*/ char *name,
- unsigned int size, int local);
+ unsigned int size);
static void yasm_ea_set_implicit_size_segment(yasm_parser_nasm *parser_nasm,
yasm_effaddr *ea, yasm_expr *e)
@@ -384,7 +385,9 @@
/* label alone on the line */
yasm_warn_set(YASM_WARN_ORPHAN_LABEL,
N_("label alone on a line without a colon might be in error"));
- define_label(parser_nasm, name, 0, local);
+ if (!local)
+ set_nonlocal_label(parser_nasm, name);
+ define_label(parser_nasm, name, 0);
return NULL;
}
if (curtok == ':')
@@ -420,12 +423,15 @@
get_next_token();
}
+ if (!local)
+ set_nonlocal_label(parser_nasm, name);
+
if (is_eol()) {
- define_label(parser_nasm, name, size, local);
+ define_label(parser_nasm, name, size);
return NULL;
}
if (curtok == TIMES) {
- define_label(parser_nasm, name, size, local);
+ define_label(parser_nasm, name, size);
get_next_token();
return parse_times(parser_nasm);
}
@@ -435,7 +441,7 @@
N_("instruction expected after label"));
if (parser_nasm->tasm && bc && !size)
size = yasm_bc_elem_size(bc);
- define_label(parser_nasm, name, size, local);
+ define_label(parser_nasm, name, size);
return bc;
}
default:
@@ -1439,12 +1445,9 @@
}
static void
-define_label(yasm_parser_nasm *parser_nasm, char *name, unsigned int size,
- int local)
+set_nonlocal_label(yasm_parser_nasm *parser_nasm, const char *name)
{
- yasm_symrec *symrec;
-
- if ((!parser_nasm->tasm || tasm_locals) && !local) {
+ if (!parser_nasm->tasm || tasm_locals) {
if (parser_nasm->locallabel_base)
yasm_xfree(parser_nasm->locallabel_base);
parser_nasm->locallabel_base_len = strlen(name);
@@ -1452,6 +1455,12 @@
yasm_xmalloc(parser_nasm->locallabel_base_len+1);
strcpy(parser_nasm->locallabel_base, name);
}
+}
+
+static void
+define_label(yasm_parser_nasm *parser_nasm, char *name, unsigned int size)
+{
+ yasm_symrec *symrec;
if (parser_nasm->abspos)
symrec = yasm_symtab_define_equ(p_symtab, name,
diff --git a/modules/parsers/nasm/tests/Makefile.inc b/modules/parsers/nasm/tests/Makefile.inc
index f4589c3..9a1d5db 100644
--- a/modules/parsers/nasm/tests/Makefile.inc
+++ b/modules/parsers/nasm/tests/Makefile.inc
@@ -23,6 +23,8 @@
EXTRA_DIST += modules/parsers/nasm/tests/long.hex
EXTRA_DIST += modules/parsers/nasm/tests/locallabel.asm
EXTRA_DIST += modules/parsers/nasm/tests/locallabel.hex
+EXTRA_DIST += modules/parsers/nasm/tests/locallabel2.asm
+EXTRA_DIST += modules/parsers/nasm/tests/locallabel2.hex
EXTRA_DIST += modules/parsers/nasm/tests/nasm-prefix.asm
EXTRA_DIST += modules/parsers/nasm/tests/nasm-prefix.hex
EXTRA_DIST += modules/parsers/nasm/tests/newsect.asm
diff --git a/modules/parsers/nasm/tests/locallabel2.asm b/modules/parsers/nasm/tests/locallabel2.asm
new file mode 100644
index 0000000..ea0f8c9
--- /dev/null
+++ b/modules/parsers/nasm/tests/locallabel2.asm
@@ -0,0 +1,4 @@
+nl1:
+nl2:db .0 - nl2
+.0: db .1 - nl2
+.1:
diff --git a/modules/parsers/nasm/tests/locallabel2.hex b/modules/parsers/nasm/tests/locallabel2.hex
new file mode 100644
index 0000000..2633481
--- /dev/null
+++ b/modules/parsers/nasm/tests/locallabel2.hex
@@ -0,0 +1,2 @@
+01
+02