Early expression evaluation

Folding a constant expression early can lead to loss of tokens, eg.
ABSOLUTE, that are significant in ld's horrible context sensitive
expression evaluation.  Also, MAXPAGESIZE and other "constants" may
not have taken values specified on the command line, leading to the
wrong value being cached.

	* ldexp.c (exp_unop, exp_binop, exp_trinop, exp_nameop): Don't
	fold expression.
	* testsuite/ld-elf/maxpage3b.d: Expect correct maxpagesize.
This commit is contained in:
Alan Modra 2016-07-20 09:44:46 +09:30
parent 3ce512885b
commit b751e639fc
3 changed files with 35 additions and 53 deletions

View file

@ -1,3 +1,9 @@
2016-07-20 Alan Modra <amodra@gmail.com>
* ldexp.c (exp_unop, exp_binop, exp_trinop, exp_nameop): Don't
fold expression.
* testsuite/ld-elf/maxpage3b.d: Expect correct maxpagesize.
2016-07-19 Roland McGrath <roland@hack.frob.com>
* emulparams/aarch64elf.sh (GENERATE_PIE_SCRIPT): Set to yes.

View file

@ -1255,80 +1255,55 @@ exp_fold_tree_no_dot (etree_type *tree)
etree_type *
exp_binop (int code, etree_type *lhs, etree_type *rhs)
{
etree_type value, *new_e;
etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->binary));
value.type.node_code = code;
value.type.filename = lhs->type.filename;
value.type.lineno = lhs->type.lineno;
value.binary.lhs = lhs;
value.binary.rhs = rhs;
value.type.node_class = etree_binary;
exp_fold_tree_no_dot (&value);
if (expld.result.valid_p)
return exp_intop (expld.result.value);
new_e = (etree_type *) stat_alloc (sizeof (new_e->binary));
memcpy (new_e, &value, sizeof (new_e->binary));
new_e->type.node_code = code;
new_e->type.filename = lhs->type.filename;
new_e->type.lineno = lhs->type.lineno;
new_e->binary.lhs = lhs;
new_e->binary.rhs = rhs;
new_e->type.node_class = etree_binary;
return new_e;
}
etree_type *
exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs)
{
etree_type value, *new_e;
etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->trinary));
value.type.node_code = code;
value.type.filename = cond->type.filename;
value.type.lineno = cond->type.lineno;
value.trinary.lhs = lhs;
value.trinary.cond = cond;
value.trinary.rhs = rhs;
value.type.node_class = etree_trinary;
exp_fold_tree_no_dot (&value);
if (expld.result.valid_p)
return exp_intop (expld.result.value);
new_e = (etree_type *) stat_alloc (sizeof (new_e->trinary));
memcpy (new_e, &value, sizeof (new_e->trinary));
new_e->type.node_code = code;
new_e->type.filename = cond->type.filename;
new_e->type.lineno = cond->type.lineno;
new_e->trinary.lhs = lhs;
new_e->trinary.cond = cond;
new_e->trinary.rhs = rhs;
new_e->type.node_class = etree_trinary;
return new_e;
}
etree_type *
exp_unop (int code, etree_type *child)
{
etree_type value, *new_e;
etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->unary));
value.unary.type.node_code = code;
value.unary.type.filename = child->type.filename;
value.unary.type.lineno = child->type.lineno;
value.unary.child = child;
value.unary.type.node_class = etree_unary;
exp_fold_tree_no_dot (&value);
if (expld.result.valid_p)
return exp_intop (expld.result.value);
new_e = (etree_type *) stat_alloc (sizeof (new_e->unary));
memcpy (new_e, &value, sizeof (new_e->unary));
new_e->unary.type.node_code = code;
new_e->unary.type.filename = child->type.filename;
new_e->unary.type.lineno = child->type.lineno;
new_e->unary.child = child;
new_e->unary.type.node_class = etree_unary;
return new_e;
}
etree_type *
exp_nameop (int code, const char *name)
{
etree_type value, *new_e;
etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->name));
value.name.type.node_code = code;
value.name.type.filename = ldlex_filename ();
value.name.type.lineno = lineno;
value.name.name = name;
value.name.type.node_class = etree_name;
exp_fold_tree_no_dot (&value);
if (expld.result.valid_p)
return exp_intop (expld.result.value);
new_e = (etree_type *) stat_alloc (sizeof (new_e->name));
memcpy (new_e, &value, sizeof (new_e->name));
new_e->name.type.node_code = code;
new_e->name.type.filename = ldlex_filename ();
new_e->name.type.lineno = lineno;
new_e->name.name = name;
new_e->name.type.node_class = etree_name;
return new_e;
}

View file

@ -4,7 +4,8 @@
#target: x86_64-*-linux*
#...
\[[ 0-9]+\] \.data[ \t]+PROGBITS[ \t]+0*200000[ \t]+[ \t0-9a-f]+WA?.*
\[[ 0-9]+\] \.data[ \t]+PROGBITS[ \t]+0*10000000[ \t]+[ \t0-9a-f]+WA?.*
#...
LOAD+.*0x10000000
LOAD+.*0x10000000
#pass