This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: PR 12001, --defsym
- From: Alan Modra <amodra at gmail dot com>
- To: "H.J. Lu" <hjl dot tools at gmail dot com>
- Cc: binutils at sourceware dot org
- Date: Thu, 13 Jan 2011 23:35:39 +1030
- Subject: Re: PR 12001, --defsym
- References: <20101220063057.GK15607@bubble.grove.modra.org> <AANLkTinvt_eT9HGx7syjxh9ow=DF5k9X5EWFaom0SF7N@mail.gmail.com>
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