From d0548f348f221abbc1241e30f3e346b2c96cc8ad Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Mon, 3 Mar 2008 15:28:58 +0000 Subject: [PATCH] gas/ 2008-03-03 Denys Vlasenko H.J. Lu 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 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-03 H.J. Lu 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/ChangeLog | 15 +++++++++++++++ gas/read.c | 6 ++++++ gas/symbols.c | 6 ++++++ gas/testsuite/ChangeLog | 9 +++++++++ gas/testsuite/gas/i386/i386.exp | 2 ++ gas/testsuite/gas/i386/inval-equ-1.l | 14 ++++++++++++++ gas/testsuite/gas/i386/inval-equ-1.s | 7 +++++++ gas/testsuite/gas/i386/inval-equ-2.l | 19 +++++++++++++++++++ gas/testsuite/gas/i386/inval-equ-2.s | 8 ++++++++ gas/write.c | 11 +++++++++++ 10 files changed, 97 insertions(+) create mode 100644 gas/testsuite/gas/i386/inval-equ-1.l create mode 100644 gas/testsuite/gas/i386/inval-equ-1.s create mode 100644 gas/testsuite/gas/i386/inval-equ-2.l create mode 100644 gas/testsuite/gas/i386/inval-equ-2.s diff --git a/gas/ChangeLog b/gas/ChangeLog index f577d0bfe88..99c63faa687 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,18 @@ +2008-03-03 Denys Vlasenko + H.J. Lu + + 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 + + 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 * config/tc-ppc.h (struct _ppc_fix_extra): New. diff --git a/gas/read.c b/gas/read.c index ed3be3743b0..8163c5ababb 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 b631a1d6aa4..252cfcef4ec 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 df138a3a02d..deef67544b1 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2008-03-03 H.J. Lu + + 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 diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp index 442e235bb16..30459e9b9b5 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 00000000000..decda6549f6 --- /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 00000000000..fd5ed481927 --- /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 00000000000..d598d0b80ee --- /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 00000000000..90caa25df37 --- /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 03641dfa4b3..9875f7f6872 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 (); -- 2.30.2