summaryrefslogtreecommitdiff
path: root/ld/ldexp.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2012-02-17 14:09:55 +0000
committerAlan Modra <amodra@bigpond.net.au>2012-02-17 14:09:55 +0000
commit488915c3aae8d8c37e397be0bfe4be8706d09ea5 (patch)
tree4993d454da63a9d187ae6a940ac813df643ccb88 /ld/ldexp.c
parent29c4be2d9344b923f6df7adc4d63f431e3eed760 (diff)
downloadbinutils-redhat-488915c3aae8d8c37e397be0bfe4be8706d09ea5.tar.gz
PR ld/13343
* ld.h (parsing_defsym): Delete. * ldexp.c (exp_intop, exp_bigintop, exp_relop): Set type.filename. (fold_binary, fold_name, exp_fold_tree_1, exp_get_vma, exp_get_fill, exp_get_abs_int): Add tree arg for %S in error messages. Don't fudge lineno. (exp_binop, exp_unop, exp_nameop, exp_assop, exp_assert): Copy type.filename from sub-tree. (exp_trinop): Likewise, and use "cond" rather than "lhs". * ldexp.h (node_type): Add filename field to struct. * ldfile.c (ldfile_input_filename): Delete. Remove all refs. * ldfile.h (ldfile_input_filename): Delete. * ldgram.y (phdr_type, phdr_qualifiers, yyerror): Add NULL arg for %S in error messages. * ldemul.c (syslib_default, hll_default): Likewise. * ldlang.c (lang_memory_region_lookup, lang_memory_region_alias, lang_get_regions, lang_new_phdr): Likewise. (lang_size_sections_1): Pass addr_tree for %S. * ldlex.h (lex_redirect): Update prototype. (ldlex_filename): Declare. * ldlex.l (<EOF>): Don't set ldfile_input_filename. (lex_redirect): Add fake_filename and count params. Push fake_filename to file_name_stack and init lineno from count. (ldlex_filename): New function. (lex_warn_invalid): Use above. * ldmain.c (main): Update lex_redirect call. * ldmisc.c (vfinfo <%S>): Take file name and line number from etree_type arg, or use current if arg is NULL. * lexsup.c (parsing_defsym): Delete. (parse_args <OPTION_DEFSYM>): Update lex_redirect call.
Diffstat (limited to 'ld/ldexp.c')
-rw-r--r--ld/ldexp.c68
1 files changed, 44 insertions, 24 deletions
diff --git a/ld/ldexp.c b/ld/ldexp.c
index 68617d8553..293d28a98c 100644
--- a/ld/ldexp.c
+++ b/ld/ldexp.c
@@ -1,6 +1,6 @@
/* This module handles expression trees.
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
+ 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
Free Software Foundation, Inc.
Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
@@ -156,6 +156,7 @@ exp_intop (bfd_vma value)
{
etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->value));
new_e->type.node_code = INT;
+ new_e->type.filename = ldlex_filename ();
new_e->type.lineno = lineno;
new_e->value.value = value;
new_e->value.str = NULL;
@@ -168,6 +169,7 @@ exp_bigintop (bfd_vma value, char *str)
{
etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->value));
new_e->type.node_code = INT;
+ new_e->type.filename = ldlex_filename ();
new_e->type.lineno = lineno;
new_e->value.value = value;
new_e->value.str = str;
@@ -182,6 +184,7 @@ exp_relop (asection *section, bfd_vma value)
{
etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->rel));
new_e->type.node_code = REL;
+ new_e->type.filename = ldlex_filename ();
new_e->type.lineno = lineno;
new_e->type.node_class = etree_rel;
new_e->rel.section = section;
@@ -404,7 +407,7 @@ fold_binary (etree_type *tree)
expld.result.value = ((bfd_signed_vma) lhs.value
% (bfd_signed_vma) expld.result.value);
else if (expld.phase != lang_mark_phase_enum)
- einfo (_("%F%S %% by zero\n"));
+ einfo (_("%F%S %% by zero\n"), tree->binary.rhs);
if (expld.result.section == lhs.section)
expld.result.section = NULL;
break;
@@ -414,7 +417,7 @@ fold_binary (etree_type *tree)
expld.result.value = ((bfd_signed_vma) lhs.value
/ (bfd_signed_vma) expld.result.value);
else if (expld.phase != lang_mark_phase_enum)
- einfo (_("%F%S / by zero\n"));
+ einfo (_("%F%S / by zero\n"), tree->binary.rhs);
if (expld.result.section == lhs.section)
expld.result.section = NULL;
break;
@@ -590,7 +593,7 @@ fold_name (etree_type *tree)
if (expld.phase != lang_mark_phase_enum)
einfo (_("%X%S: unresolvable symbol `%s'"
" referenced in expression\n"),
- tree->name.name);
+ tree, tree->name.name);
}
else if (output_section == bfd_abs_section_ptr
&& (expld.section != bfd_abs_section_ptr
@@ -602,8 +605,9 @@ fold_name (etree_type *tree)
}
else if (expld.phase == lang_final_phase_enum
|| expld.assigning_to_dot)
- einfo (_("%F%S: undefined symbol `%s' referenced in expression\n"),
- tree->name.name);
+ einfo (_("%F%S: undefined symbol `%s'"
+ " referenced in expression\n"),
+ tree, tree->name.name);
else if (h->type == bfd_link_hash_new)
{
h->type = bfd_link_hash_undefined;
@@ -623,8 +627,9 @@ fold_name (etree_type *tree)
if (os == NULL)
{
if (expld.phase == lang_final_phase_enum)
- einfo (_("%F%S: undefined section `%s' referenced in expression\n"),
- tree->name.name);
+ einfo (_("%F%S: undefined section `%s'"
+ " referenced in expression\n"),
+ tree, tree->name.name);
}
else if (os->processed_vma)
new_rel (0, os->bfd_section);
@@ -640,8 +645,9 @@ fold_name (etree_type *tree)
if (os == NULL)
{
if (expld.phase == lang_final_phase_enum)
- einfo (_("%F%S: undefined section `%s' referenced in expression\n"),
- tree->name.name);
+ einfo (_("%F%S: undefined section `%s'"
+ " referenced in expression\n"),
+ tree, tree->name.name);
}
else if (os->processed_lma)
{
@@ -667,8 +673,9 @@ fold_name (etree_type *tree)
if (os == NULL)
{
if (expld.phase == lang_final_phase_enum)
- einfo (_("%F%S: undefined section `%s' referenced in expression\n"),
- tree->name.name);
+ einfo (_("%F%S: undefined section `%s'"
+ " referenced in expression\n"),
+ tree, tree->name.name);
new_number (0);
}
else if (os->processed_vma)
@@ -695,7 +702,8 @@ fold_name (etree_type *tree)
new_number (mem->length);
else
einfo (_("%F%S: undefined MEMORY region `%s'"
- " referenced in expression\n"), tree->name.name);
+ " referenced in expression\n"),
+ tree, tree->name.name);
}
break;
@@ -709,7 +717,8 @@ fold_name (etree_type *tree)
new_rel_from_abs (mem->origin);
else
einfo (_("%F%S: undefined MEMORY region `%s'"
- " referenced in expression\n"), tree->name.name);
+ " referenced in expression\n"),
+ tree, tree->name.name);
}
break;
@@ -720,7 +729,7 @@ fold_name (etree_type *tree)
new_number (config.commonpagesize);
else
einfo (_("%F%S: unknown constant `%s' referenced in expression\n"),
- tree->name.name);
+ tree, tree->name.name);
break;
default:
@@ -784,7 +793,8 @@ exp_fold_tree_1 (etree_type *tree)
if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
{
if (tree->type.node_class != etree_assign)
- einfo (_("%F%S can not PROVIDE assignment to location counter\n"));
+ einfo (_("%F%S can not PROVIDE assignment to"
+ " location counter\n"), tree);
/* After allocation, assignment to dot should not be done inside
an output section since allocation adds a padding statement
that effectively duplicates the assignment. */
@@ -802,11 +812,12 @@ exp_fold_tree_1 (etree_type *tree)
if (!expld.result.valid_p)
{
if (expld.phase != lang_mark_phase_enum)
- einfo (_("%F%S invalid assignment to location counter\n"));
+ einfo (_("%F%S invalid assignment to"
+ " location counter\n"), tree);
}
else if (expld.dotp == NULL)
einfo (_("%F%S assignment to location counter"
- " invalid outside of SECTION\n"));
+ " invalid outside of SECTION\n"), tree);
else
{
bfd_vma nextdot;
@@ -819,7 +830,8 @@ exp_fold_tree_1 (etree_type *tree)
if (nextdot < expld.dot
&& expld.section != bfd_abs_section_ptr)
einfo (_("%F%S cannot move location counter backwards"
- " (from %V to %V)\n"), expld.dot, nextdot);
+ " (from %V to %V)\n"),
+ tree, expld.dot, nextdot);
else
{
expld.dot = nextdot;
@@ -955,6 +967,7 @@ exp_binop (int code, etree_type *lhs, etree_type *rhs)
etree_type value, *new_e;
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;
@@ -974,7 +987,8 @@ exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs)
etree_type value, *new_e;
value.type.node_code = code;
- value.type.lineno = lhs->type.lineno;
+ value.type.filename = cond->type.filename;
+ value.type.lineno = cond->type.lineno;
value.trinary.lhs = lhs;
value.trinary.cond = cond;
value.trinary.rhs = rhs;
@@ -994,6 +1008,7 @@ exp_unop (int code, etree_type *child)
etree_type value, *new_e;
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;
@@ -1012,6 +1027,7 @@ exp_nameop (int code, const char *name)
etree_type value, *new_e;
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;
@@ -1036,6 +1052,7 @@ exp_assop (const char *dst,
n = (etree_type *) stat_alloc (sizeof (n->assign));
n->assign.type.node_code = '=';
+ n->assign.type.filename = src->type.filename;
n->assign.type.lineno = src->type.lineno;
n->assign.type.node_class = class;
n->assign.src = src;
@@ -1073,6 +1090,7 @@ exp_assert (etree_type *exp, const char *message)
n = (etree_type *) stat_alloc (sizeof (n->assert_s));
n->assert_s.type.node_code = '!';
+ n->assert_s.type.filename = exp->type.filename;
n->assert_s.type.lineno = exp->type.lineno;
n->assert_s.type.node_class = etree_assert;
n->assert_s.child = exp;
@@ -1188,7 +1206,8 @@ exp_get_vma (etree_type *tree, bfd_vma def, char *name)
if (expld.result.valid_p)
return expld.result.value;
else if (name != NULL && expld.phase != lang_mark_phase_enum)
- einfo (_("%F%S: nonconstant expression for %s\n"), name);
+ einfo (_("%F%S: nonconstant expression for %s\n"),
+ tree, name);
}
return def;
}
@@ -1213,7 +1232,8 @@ exp_get_fill (etree_type *tree, fill_type *def, char *name)
if (!expld.result.valid_p)
{
if (name != NULL && expld.phase != lang_mark_phase_enum)
- einfo (_("%F%S: nonconstant expression for %s\n"), name);
+ einfo (_("%F%S: nonconstant expression for %s\n"),
+ tree, name);
return def;
}
@@ -1272,8 +1292,8 @@ exp_get_abs_int (etree_type *tree, int def, char *name)
}
else if (name != NULL && expld.phase != lang_mark_phase_enum)
{
- lineno = tree->type.lineno;
- einfo (_("%F%S: nonconstant expression for %s\n"), name);
+ einfo (_("%F%S: nonconstant expression for %s\n"),
+ tree, name);
}
}
return def;