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: PR 12001, --defsym


On Wed, Dec 29, 2010 at 09:30:14AM -0800, H.J. Lu wrote:
> This caused:
> 
> http://sourceware.org/bugzilla/show_bug.cgi?id=12356

Given this bug report and Daniel's objections over using a linker
script assignment to control ld behaviour, I've implemented a new
LD_FEATURE linker script keyword.

The following is just a tidy of exp_assop, which is everywhere passed
'=' as its first argument.  Oh, and one new function in preparation
for the real fix, exp_defsym.

	PR ld/12356
	* ldexp.h (exp_assop): Delete.
	(exp_assign, exp_defsym): Declare.
	* ldexp.c (exp_assop): Make static, handle all assignment variations.
	(exp_assign, exp_defsym): New functions.
	(exp_provide): Use exp_assop.
	* ldgram.y (defsym_expr): Use exp_defsym.
	* ldctor.c, * ldgram.y, * ldlang.c, * mri.c, * emultempl/beos.em,
	* emultempl/pe.em, * emultempl/pep.em, * emultempl/spuelf.em,
	* emultempl/xtensaelf.em: Update exp_assop -> exp_assign.

Index: ld/ldexp.h
===================================================================
RCS file: /cvs/src/src/ld/ldexp.h,v
retrieving revision 1.26
diff -u -p -r1.26 ldexp.h
--- ld/ldexp.h	12 Jan 2011 12:07:19 -0000	1.26
+++ ld/ldexp.h	13 Jan 2011 12:36:28 -0000
@@ -46,7 +46,7 @@ enum node_tree_enum {
 typedef struct {
   int node_code;
   unsigned int lineno;
-  enum  node_tree_enum node_class;
+  enum node_tree_enum node_class;
 } node_type;
 
 typedef union etree_union {
@@ -190,8 +190,10 @@ etree_type *exp_unop
   (int, etree_type *);
 etree_type *exp_nameop
   (int, const char *);
-etree_type *exp_assop
-  (int, const char *, etree_type *);
+etree_type *exp_assign
+  (const char *, etree_type *);
+etree_type *exp_defsym
+  (const char *, etree_type *);
 etree_type *exp_provide
   (const char *, etree_type *, bfd_boolean);
 etree_type *exp_assert
Index: ld/ldexp.c
===================================================================
RCS file: /cvs/src/src/ld/ldexp.c,v
retrieving revision 1.90
diff -u -p -r1.90 ldexp.c
--- ld/ldexp.c	12 Jan 2011 12:07:19 -0000	1.90
+++ ld/ldexp.c	13 Jan 2011 12:36:28 -0000
@@ -974,37 +974,44 @@ exp_nameop (int code, const char *name)
 
 }
 
-etree_type *
-exp_assop (int code, const char *dst, etree_type *src)
-{
-  etree_type *new_e;
-
-  new_e = (etree_type *) stat_alloc (sizeof (new_e->assign));
-  new_e->type.node_code = code;
-  new_e->type.lineno = src->type.lineno;
-  new_e->type.node_class = etree_assign;
-  new_e->assign.src = src;
-  new_e->assign.dst = dst;
-  return new_e;
-}
-
-/* Handle PROVIDE.  */
-
-etree_type *
-exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
+static etree_type *
+exp_assop (const char *dst,
+	   etree_type *src,
+	   enum node_tree_enum class,
+	   bfd_boolean hidden)
 {
   etree_type *n;
 
   n = (etree_type *) stat_alloc (sizeof (n->assign));
   n->assign.type.node_code = '=';
   n->assign.type.lineno = src->type.lineno;
-  n->assign.type.node_class = etree_provide;
+  n->assign.type.node_class = class;
   n->assign.src = src;
   n->assign.dst = dst;
   n->assign.hidden = hidden;
   return n;
 }
 
+etree_type *
+exp_assign (const char *dst, etree_type *src)
+{
+  return exp_assop (dst, src, etree_assign, FALSE);
+}
+
+etree_type *
+exp_defsym (const char *dst, etree_type *src)
+{
+  return exp_assop (dst, src, etree_assign, TRUE);
+}
+
+/* Handle PROVIDE.  */
+
+etree_type *
+exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
+{
+  return exp_assop (dst, src, etree_provide, hidden);
+}
+
 /* Handle ASSERT.  */
 
 etree_type *
Index: ld/ldctor.c
===================================================================
RCS file: /cvs/src/src/ld/ldctor.c,v
retrieving revision 1.17
diff -u -p -r1.17 ldctor.c
--- ld/ldctor.c	11 Sep 2009 15:27:35 -0000	1.17
+++ ld/ldctor.c	13 Jan 2011 11:00:19 -0000
@@ -319,11 +319,11 @@ ldctor_build_sets (void)
 	  break;
 	}
 
-      lang_add_assignment (exp_assop ('=', ".",
-				      exp_unop (ALIGN_K,
-						exp_intop (reloc_size))));
-      lang_add_assignment (exp_assop ('=', p->h->root.string,
-				      exp_nameop (NAME, ".")));
+      lang_add_assignment (exp_assign (".",
+				       exp_unop (ALIGN_K,
+						 exp_intop (reloc_size))));
+      lang_add_assignment (exp_assign (p->h->root.string,
+				       exp_nameop (NAME, ".")));
       lang_add_data (size, exp_intop (p->count));
 
       for (e = p->elements; e != NULL; e = e->next)
Index: ld/ldgram.y
===================================================================
RCS file: /cvs/src/src/ld/ldgram.y,v
retrieving revision 1.63
diff -u -p -r1.63 ldgram.y
--- ld/ldgram.y	15 Dec 2010 14:56:37 -0000	1.63
+++ ld/ldgram.y	13 Jan 2011 11:00:20 -0000
@@ -176,7 +177,7 @@ defsym_expr:
 		NAME '=' exp
 		{
 		  ldlex_popstate();
-		  lang_add_assignment(exp_assop($3,$2,$4));
+		  lang_add_assignment (exp_defsym ($2, $4));
 		}
 	;
 
@@ -657,15 +660,15 @@ end:	';' | ','
 assignment:
 		NAME '=' mustbe_exp
 		{
-		  lang_add_assignment (exp_assop ($2, $1, $3));
+		  lang_add_assignment (exp_assign ($1, $3));
 		}
 	|	NAME assign_op mustbe_exp
 		{
-		  lang_add_assignment (exp_assop ('=', $1,
-						  exp_binop ($2,
-							     exp_nameop (NAME,
-									 $1),
-							     $3)));
+		  lang_add_assignment (exp_assign ($1,
+						   exp_binop ($2,
+							      exp_nameop (NAME,
+									  $1),
+							      $3)));
 		}
 	|	PROVIDE '(' NAME '=' mustbe_exp ')'
 		{
@@ -983,7 +986,7 @@ section:	NAME 		{ ldlex_expression(); }
 		opt_exp_with_type
 		{
 		  ldlex_popstate ();
-		  lang_add_assignment (exp_assop ('=', ".", $3));
+		  lang_add_assignment (exp_assign (".", $3));
 		}
 		'{' sec_or_group_p1 '}'
 	|	INCLUDE filename
Index: ld/ldlang.c
===================================================================
RCS file: /cvs/src/src/ld/ldlang.c,v
retrieving revision 1.357
diff -u -p -r1.357 ldlang.c
--- ld/ldlang.c	12 Jan 2011 12:07:19 -0000	1.357
+++ ld/ldlang.c	13 Jan 2011 11:00:24 -0000
@@ -1809,7 +1808,7 @@ lang_insert_orphan (asection *s,
 	  sprintf (symname + (symname[0] != 0), "__start_%s", secname);
 	  e_align = exp_unop (ALIGN_K,
 			      exp_intop ((bfd_vma) 1 << s->alignment_power));
-	  lang_add_assignment (exp_assop ('=', ".", e_align));
+	  lang_add_assignment (exp_assign (".", e_align));
 	  lang_add_assignment (exp_provide (symname,
 					    exp_unop (ABSOLUTE,
 						      exp_nameop (NAME, ".")),
@@ -7229,7 +7230,7 @@ lang_leave_overlay (etree_type *lma_expr
      overlay region.  */
   if (overlay_list != NULL)
     overlay_list->os->update_dot_tree
-      = exp_assop ('=', ".", exp_binop ('+', overlay_vma, overlay_max));
+      = exp_assign (".", exp_binop ('+', overlay_vma, overlay_max));
 
   l = overlay_list;
   while (l != NULL)
Index: ld/mri.c
===================================================================
RCS file: /cvs/src/src/ld/mri.c,v
retrieving revision 1.23
diff -u -p -r1.23 mri.c
--- ld/mri.c	11 Sep 2009 15:27:35 -0000	1.23
+++ ld/mri.c	13 Jan 2011 11:00:24 -0000
@@ -295,7 +295,7 @@ mri_format (const char *name)
 void
 mri_public (const char *name, etree_type *exp)
 {
-  lang_add_assignment (exp_assop ('=', name, exp));
+  lang_add_assignment (exp_assign (name, exp));
 }
 
 void
Index: ld/emultempl/beos.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/beos.em,v
retrieving revision 1.45
diff -u -p -r1.45 beos.em
--- ld/emultempl/beos.em	20 Dec 2010 13:00:14 -0000	1.45
+++ ld/emultempl/beos.em	13 Jan 2011 11:00:25 -0000
@@ -351,7 +351,7 @@ gld_${EMULATION_NAME}_set_symbols (void)
   for (j = 0; init[j].ptr; j++)
     {
       long val = init[j].value;
-      lang_add_assignment (exp_assop ('=', init[j].symbol, exp_intop (val)));
+      lang_add_assignment (exp_assign (init[j].symbol, exp_intop (val)));
       if (init[j].size == sizeof(short))
 	*(short *)init[j].ptr = val;
       else if (init[j].size == sizeof(int))
Index: ld/emultempl/pe.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/pe.em,v
retrieving revision 1.165
diff -u -p -r1.165 pe.em
--- ld/emultempl/pe.em	20 Dec 2010 13:00:14 -0000	1.165
+++ ld/emultempl/pe.em	13 Jan 2011 11:00:26 -0000
@@ -946,8 +946,8 @@ gld_${EMULATION_NAME}_set_symbols (void)
       long val = init[j].value;
       lang_assignment_statement_type *rv;
 
-      rv = lang_add_assignment (exp_assop ('=', GET_INIT_SYMBOL_NAME (j),
-					   exp_intop (val)));
+      rv = lang_add_assignment (exp_assign (GET_INIT_SYMBOL_NAME (j),
+					    exp_intop (val)));
       if (init[j].size == sizeof (short))
 	*(short *) init[j].ptr = val;
       else if (init[j].size == sizeof (int))
@@ -1722,8 +1722,8 @@ gld_${EMULATION_NAME}_unrecognized_file 
 		= pe_def_file->base_address;
 	      init[IMAGEBASEOFF].inited = 1;
 	      if (image_base_statement)
-		image_base_statement->exp = exp_assop ('=', "__image_base__",
-						       exp_intop (pe.ImageBase));
+		image_base_statement->exp = exp_assign ("__image_base__",
+							exp_intop (pe.ImageBase));
 	    }
 
 	  if (pe_def_file->stack_reserve != -1
Index: ld/emultempl/pep.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/pep.em,v
retrieving revision 1.41
diff -u -p -r1.41 pep.em
--- ld/emultempl/pep.em	20 Dec 2010 13:00:14 -0000	1.41
+++ ld/emultempl/pep.em	13 Jan 2011 11:00:26 -0000
@@ -858,8 +858,8 @@ gld_${EMULATION_NAME}_set_symbols (void)
       bfd_vma val = init[j].value;
       lang_assignment_statement_type *rv;
 
-      rv = lang_add_assignment (exp_assop ('=', GET_INIT_SYMBOL_NAME (j),
-					   exp_intop (val)));
+      rv = lang_add_assignment (exp_assign (GET_INIT_SYMBOL_NAME (j),
+					    exp_intop (val)));
       if (init[j].size == sizeof (short))
 	*(short *) init[j].ptr = (short) val;
       else if (init[j].size == sizeof (int))
@@ -1525,8 +1525,8 @@ gld_${EMULATION_NAME}_unrecognized_file 
 		= pep_def_file->base_address;
 	      init[IMAGEBASEOFF].inited = 1;
 	      if (image_base_statement)
-		image_base_statement->exp = exp_assop ('=', "__image_base__",
-						       exp_intop (pep.ImageBase));
+		image_base_statement->exp = exp_assign ("__image_base__",
+							exp_intop (pep.ImageBase));
 	    }
 
 	  if (pep_def_file->stack_reserve != -1
Index: ld/emultempl/spuelf.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/spuelf.em,v
retrieving revision 1.42
diff -u -p -r1.42 spuelf.em
--- ld/emultempl/spuelf.em	5 Nov 2010 17:20:17 -0000	1.42
+++ ld/emultempl/spuelf.em	13 Jan 2011 11:00:27 -0000
@@ -164,7 +164,7 @@ spu_place_special_section (asection *s, 
 
 	  push_stat_ptr (&os->children);
 	  e_size = exp_intop (params.line_size - s->size);
-	  lang_add_assignment (exp_assop ('=', ".", e_size));
+	  lang_add_assignment (exp_assign (".", e_size));
 	  pop_stat_ptr ();
 	}
       lang_add_section (&os->children, s, os);
Index: ld/emultempl/xtensaelf.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/xtensaelf.em,v
retrieving revision 1.27
diff -u -p -r1.27 xtensaelf.em
--- ld/emultempl/xtensaelf.em	4 Oct 2010 14:13:10 -0000	1.27
+++ ld/emultempl/xtensaelf.em	13 Jan 2011 11:00:28 -0000
@@ -1885,7 +1885,7 @@ ld_xtensa_insert_page_offsets (bfd_vma d
 		etree_type *name_op = exp_nameop (NAME, ".");
 		etree_type *addend_op = exp_intop (1 << xtensa_page_power);
 		etree_type *add_op = exp_binop ('+', name_op, addend_op);
-		etree_type *assign_op = exp_assop ('=', ".", add_op);
+		etree_type *assign_op = exp_assign (".", add_op);
 
 		lang_assignment_statement_type *assign_stmt;
 		lang_statement_union_type *assign_union;

-- 
Alan Modra
Australia Development Lab, IBM


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