This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] bug 5543: do not allow register symbols to be global


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 ();


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]