aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog15
-rw-r--r--gas/read.c6
-rw-r--r--gas/symbols.c6
-rw-r--r--gas/testsuite/ChangeLog9
-rw-r--r--gas/testsuite/gas/i386/i386.exp2
-rw-r--r--gas/testsuite/gas/i386/inval-equ-1.l14
-rw-r--r--gas/testsuite/gas/i386/inval-equ-1.s7
-rw-r--r--gas/testsuite/gas/i386/inval-equ-2.l19
-rw-r--r--gas/testsuite/gas/i386/inval-equ-2.s8
-rw-r--r--gas/write.c11
10 files changed, 97 insertions, 0 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index f577d0b..99c63fa 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,18 @@
+2008-03-03 Denys Vlasenko <vda.linux@googlemail.com>
+ H.J. Lu <hongjiu.lu@intel.com>
+
+ PR gas/5543
+ * read.c (pseudo_set): Don't allow global register symbol.
+
+ * symbols.c (S_SET_EXTERNAL): Don't allow register symbol
+ global.
+
+2008-03-03 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR gas/5543
+ * write.c (write_object_file): Don't allow symbols which were
+ equated to register. Stop if there is an error.
+
2008-03-01 Alan Modra <amodra@bigpond.net.au>
* config/tc-ppc.h (struct _ppc_fix_extra): New.
diff --git a/gas/read.c b/gas/read.c
index ed3be37..8163c5a 100644
--- a/gas/read.c
+++ b/gas/read.c
@@ -3604,6 +3604,12 @@ pseudo_set (symbolS *symbolP)
break;
case O_register:
+ if (S_IS_EXTERNAL (symbolP))
+ {
+ as_bad ("can't equate global symbol `%s' with register name",
+ S_GET_NAME (symbolP));
+ return;
+ }
S_SET_SEGMENT (symbolP, reg_section);
S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
set_zero_frag (symbolP);
diff --git a/gas/symbols.c b/gas/symbols.c
index b631a1d..252cfce 100644
--- a/gas/symbols.c
+++ b/gas/symbols.c
@@ -2184,6 +2184,12 @@ S_SET_EXTERNAL (symbolS *s)
_("section symbols are already global"));
return;
}
+ if (S_GET_SEGMENT (s) == reg_section)
+ {
+ as_bad ("can't make register symbol `%s' global",
+ S_GET_NAME (s));
+ return;
+ }
s->bsym->flags |= BSF_GLOBAL;
s->bsym->flags &= ~(BSF_LOCAL | BSF_WEAK);
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index df138a3..deef675 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,12 @@
+2008-03-03 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR gas/5543
+ * gas/i386/i386.exp: Run inval-equ-1 and inval-equ-2.
+
+ * gas/i386/inval-equ-1.l: New.
+ * gas/i386/inval-equ-1.s: Likewise.
+ * gas/i386/inval-equ-2.l: Likewise.
+ * gas/i386/inval-equ-2.s: Likewise.
2008-03-01 H.J. Lu <hongjiu.lu@intel.com>
diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
index 442e235..30459e9 100644
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -148,6 +148,8 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_32_check]]
run_dump_test "mixed-mode-reloc32"
run_dump_test "att-regs"
run_dump_test "intel-regs"
+ run_list_test "inval-equ-1" "-al"
+ run_list_test "inval-equ-2" "-al"
}
# This is a PE specific test.
diff --git a/gas/testsuite/gas/i386/inval-equ-1.l b/gas/testsuite/gas/i386/inval-equ-1.l
new file mode 100644
index 0000000..decda65
--- /dev/null
+++ b/gas/testsuite/gas/i386/inval-equ-1.l
@@ -0,0 +1,14 @@
+.*: Assembler messages:
+.*:3: Error: .*
+.*:5: Error: .*
+GAS LISTING .*
+
+
+[ ]*1[ ]+\.text
+[ ]*2[ ]+\.globl bar1
+[ ]*3[ ]+\.equ bar1,%eax
+[ ]*4[ ]+\.equ bar2,%eax
+[ ]*5[ ]+\.globl bar2
+[ ]*6[ ]+\?\?\?\? A1000000 mov bar1,%eax
+[ ]*6[ ]+00
+[ ]*7[ ]+\?\?\?\? 89C0 mov bar2,%eax
diff --git a/gas/testsuite/gas/i386/inval-equ-1.s b/gas/testsuite/gas/i386/inval-equ-1.s
new file mode 100644
index 0000000..fd5ed48
--- /dev/null
+++ b/gas/testsuite/gas/i386/inval-equ-1.s
@@ -0,0 +1,7 @@
+ .text
+ .globl bar1
+ .equ bar1,%eax
+ .equ bar2,%eax
+ .globl bar2
+ mov bar1,%eax
+ mov bar2,%eax
diff --git a/gas/testsuite/gas/i386/inval-equ-2.l b/gas/testsuite/gas/i386/inval-equ-2.l
new file mode 100644
index 0000000..d598d0b
--- /dev/null
+++ b/gas/testsuite/gas/i386/inval-equ-2.l
@@ -0,0 +1,19 @@
+.*: Assembler messages:
+.*:8: Error: .*
+.*:8: Error: .*
+.*:8: Error: .*
+GAS LISTING .*
+
+
+[ ]*1[ ]+\.globl bar1
+[ ]*2[ ]+\.set bar1,\(%eax\+1\)
+[ ]*3[ ]+\?\?\?\? A12A0000 mov bar1,%eax
+[ ]*3[ ]+00
+[ ]*4[ ]+\.set bar2,\(%eax\+1\)
+[ ]*5[ ]+\?\?\?\? A12A0000 mov bar2,%eax
+[ ]*5[ ]+00
+[ ]*6[ ]+\.globl bar2
+[ ]*7[ ]+\.set bar3,\(%eax\+1\)
+[ ]*8[ ]+\?\?\?\? A12A0000 mov bar3,%eax
+\*\*\*\* Error:can't make global register symbol `bar3'
+[ ]*8[ ]+00
diff --git a/gas/testsuite/gas/i386/inval-equ-2.s b/gas/testsuite/gas/i386/inval-equ-2.s
new file mode 100644
index 0000000..90caa25
--- /dev/null
+++ b/gas/testsuite/gas/i386/inval-equ-2.s
@@ -0,0 +1,8 @@
+ .globl bar1
+ .set bar1,(%eax+1)
+ mov bar1,%eax
+ .set bar2,(%eax+1)
+ mov bar2,%eax
+ .globl bar2
+ .set bar3,(%eax+1)
+ mov bar3,%eax
diff --git a/gas/write.c b/gas/write.c
index 03641df..9875f7f 100644
--- a/gas/write.c
+++ b/gas/write.c
@@ -1763,6 +1763,13 @@ write_object_file (void)
as_bad (_("Local symbol `%s' can't be equated to common symbol `%s'"),
name, S_GET_NAME (e->X_add_symbol));
}
+ if (S_GET_SEGMENT (symp) == reg_section)
+ {
+ /* Report error only if we know the symbol name. */
+ if (S_GET_NAME (symp) != reg_section->name)
+ as_bad (_("can't make global register symbol `%s'"),
+ name);
+ }
symbol_remove (symp, &symbol_rootP, &symbol_lastP);
continue;
}
@@ -1830,6 +1837,10 @@ write_object_file (void)
obj_adjust_symtab ();
#endif
+ /* Stop if there is an error. */
+ if (had_errors ())
+ return;
+
/* Now that all the sizes are known, and contents correct, we can
start writing to the file. */
set_symtab ();