[PATCH] bug 5543: do not allow register symbols to be global
H.J. Lu
hjl.tools@gmail.com
Sun Mar 2 17:29:00 GMT 2008
On Fri, Feb 29, 2008 at 04:32:35PM +0000, Nick Clifton wrote:
> Hi H.J.,
>
>> We get into trouble only when we try to use bar3. This patch catches
>> all cases. But it doesn't report the correct line number.
>
> I think that we should make an attempt to report the correct line number.
> If there was code in read.c:s_global() for instance you could catch the
> 'bar2' example in your testcase.
>
>
Here is the updated patch.
H.J.
----
gas/
2008-03-02 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-02 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.
gas/testsuite/
2008-03-02 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.
--- gas/read.c.set 2008-02-08 05:46:40.000000000 -0800
+++ gas/read.c 2008-03-02 08:29:09.000000000 -0800
@@ -3604,6 +3604,12 @@ pseudo_set (symbolS *symbolP)
break;
case O_register:
+ if (S_IS_EXTERNAL (symbolP))
+ {
+ as_bad ("can't make global register symbol `%s'",
+ S_GET_NAME (symbolP));
+ return;
+ }
S_SET_SEGMENT (symbolP, reg_section);
S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
set_zero_frag (symbolP);
--- gas/symbols.c.set 2007-07-12 11:59:25.000000000 -0700
+++ gas/symbols.c 2008-03-02 08:28:46.000000000 -0800
@@ -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);
--- gas/testsuite/gas/i386/i386.exp.set 2008-02-18 06:05:31.000000000 -0800
+++ gas/testsuite/gas/i386/i386.exp 2008-03-02 09:13:37.000000000 -0800
@@ -148,6 +148,8 @@ if [expr ([istarget "i*86-*-*"] || [ist
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.
--- gas/testsuite/gas/i386/inval-equ-1.l.set 2008-03-02 08:31:36.000000000 -0800
+++ gas/testsuite/gas/i386/inval-equ-1.l 2008-03-02 08:49:39.000000000 -0800
@@ -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
--- gas/testsuite/gas/i386/inval-equ-1.s.set 2008-03-02 08:31:36.000000000 -0800
+++ gas/testsuite/gas/i386/inval-equ-1.s 2008-03-02 08:33:31.000000000 -0800
@@ -0,0 +1,7 @@
+ .text
+ .globl bar1
+ .equ bar1,%eax
+ .equ bar2,%eax
+ .globl bar2
+ mov bar1,%eax
+ mov bar2,%eax
--- gas/testsuite/gas/i386/inval-equ-2.l.set 2008-03-02 09:13:59.000000000 -0800
+++ gas/testsuite/gas/i386/inval-equ-2.l 2008-03-02 09:26:39.000000000 -0800
@@ -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
--- gas/testsuite/gas/i386/inval-equ-2.s.set 2008-03-02 09:13:47.000000000 -0800
+++ gas/testsuite/gas/i386/inval-equ-2.s 2008-03-02 09:26:31.000000000 -0800
@@ -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
--- gas/write.c.set 2007-07-12 11:59:25.000000000 -0700
+++ gas/write.c 2008-03-02 09:22:12.000000000 -0800
@@ -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 ();
More information about the Binutils
mailing list