This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: PATCH: PR ld/4090: Can't use ADDR on section after
On Mon, Apr 02, 2007 at 04:09:21PM +0100, Nick Clifton wrote:
> Hi H.J.
>
> >>>2007-03-31 H.J. Lu <hongjiu.lu@intel.com>
> >>>
> >>> PR ld/4090
> >>> * ldexp.h (node_type): Add lineno.
> >>> * ldexp.c: Include "ldlex.h".
> >>> (exp_intop): Set the lineno field from lineno.
> >>> (exp_bigintop): Likewise.
> >>> (exp_relop): Likewise.
> >>> (exp_nameop): Likewise.
> >>> (exp_binop): Set the lineno field from lineno of lhs.
> >>> (exp_trinop): Likewise.
> >>> (exp_unop): Set the lineno field from lineno of child.
> >>> (exp_assop): Set the lineno field from lineno of src.
> >>> (exp_provide): Likewise.
> >>> (exp_assert): Set the lineno field from lineno of exp.
> >>> (exp_get_abs_int): Set lineno from lineno of nonconstant
> >>> expression when report problem.
> >>How did you test this patch ? Do any linker testsuite tests need
> >>updating because of the improved line number reporting ?
> >
> >I ran "make check" as well as the testcase in PR 4090. There are
> >no new failures in binutils testcases
>
> Great - in which case the patch is approved.
This is the patch I am checking in with a testcase.
H.J.
----
ld/
2007-04-02 H.J. Lu <hongjiu.lu@intel.com>
PR ld/4090
* ldexp.h (node_type): Add lineno.
* ldexp.c: Include "ldlex.h".
(exp_intop): Set the lineno field from lineno.
(exp_bigintop): Likewise.
(exp_relop): Likewise.
(exp_nameop): Likewise.
(exp_binop): Set the lineno field from lineno of lhs.
(exp_trinop): Likewise.
(exp_unop): Set the lineno field from lineno of child.
(exp_assop): Set the lineno field from lineno of src.
(exp_provide): Likewise.
(exp_assert): Set the lineno field from lineno of exp.
(exp_get_abs_int): Set lineno from lineno of nonconstant
expression when report problem.
ld/testsuite/
2007-04-02 H.J. Lu <hongjiu.lu@intel.com>
PR ld/4090
* ld-elf/expr1.d: New file.
* ld-elf/expr1.s: Likewise.
* ld-elf/expr1.t: Likewise.
--- ld/ldexp.c.loc 2007-04-02 09:15:38.000000000 -0700
+++ ld/ldexp.c 2007-04-02 09:15:38.000000000 -0700
@@ -36,6 +36,7 @@
#include "ldmain.h"
#include "ldmisc.h"
#include "ldexp.h"
+#include "ldlex.h"
#include <ldgram.h>
#include "ldlang.h"
#include "libiberty.h"
@@ -150,6 +151,7 @@ exp_intop (bfd_vma value)
{
etree_type *new = stat_alloc (sizeof (new->value));
new->type.node_code = INT;
+ new->type.lineno = lineno;
new->value.value = value;
new->value.str = NULL;
new->type.node_class = etree_value;
@@ -161,6 +163,7 @@ exp_bigintop (bfd_vma value, char *str)
{
etree_type *new = stat_alloc (sizeof (new->value));
new->type.node_code = INT;
+ new->type.lineno = lineno;
new->value.value = value;
new->value.str = str;
new->type.node_class = etree_value;
@@ -174,6 +177,7 @@ exp_relop (asection *section, bfd_vma va
{
etree_type *new = stat_alloc (sizeof (new->rel));
new->type.node_code = REL;
+ new->type.lineno = lineno;
new->type.node_class = etree_rel;
new->rel.section = section;
new->rel.value = value;
@@ -831,6 +835,7 @@ exp_binop (int code, etree_type *lhs, et
etree_type value, *new;
value.type.node_code = code;
+ value.type.lineno = lhs->type.lineno;
value.binary.lhs = lhs;
value.binary.rhs = rhs;
value.type.node_class = etree_binary;
@@ -849,6 +854,7 @@ exp_trinop (int code, etree_type *cond,
etree_type value, *new;
value.type.node_code = code;
+ value.type.lineno = lhs->type.lineno;
value.trinary.lhs = lhs;
value.trinary.cond = cond;
value.trinary.rhs = rhs;
@@ -868,6 +874,7 @@ exp_unop (int code, etree_type *child)
etree_type value, *new;
value.unary.type.node_code = code;
+ value.unary.type.lineno = child->type.lineno;
value.unary.child = child;
value.unary.type.node_class = etree_unary;
exp_fold_tree_no_dot (&value);
@@ -885,6 +892,7 @@ exp_nameop (int code, const char *name)
etree_type value, *new;
value.name.type.node_code = code;
+ value.name.type.lineno = lineno;
value.name.name = name;
value.name.type.node_class = etree_name;
@@ -905,6 +913,7 @@ exp_assop (int code, const char *dst, et
new = stat_alloc (sizeof (new->assign));
new->type.node_code = code;
+ new->type.lineno = src->type.lineno;
new->type.node_class = etree_assign;
new->assign.src = src;
new->assign.dst = dst;
@@ -920,6 +929,7 @@ exp_provide (const char *dst, etree_type
n = 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.src = src;
n->assign.dst = dst;
@@ -936,6 +946,7 @@ exp_assert (etree_type *exp, const char
n = stat_alloc (sizeof (n->assert_s));
n->assert_s.type.node_code = '!';
+ n->assert_s.type.lineno = exp->type.lineno;
n->assert_s.type.node_class = etree_assert;
n->assert_s.child = exp;
n->assert_s.message = message;
@@ -1114,7 +1125,10 @@ exp_get_abs_int (etree_type *tree, int d
return expld.result.value;
}
else if (name != NULL && expld.phase != lang_mark_phase_enum)
- einfo (_("%F%S nonconstant expression for %s\n"), name);
+ {
+ lineno = tree->type.lineno;
+ einfo (_("%F%S: nonconstant expression for %s\n"), name);
+ }
}
return def;
}
--- ld/ldexp.h.loc 2007-04-02 09:15:38.000000000 -0700
+++ ld/ldexp.h 2007-04-02 09:15:38.000000000 -0700
@@ -32,6 +32,7 @@ typedef struct {
typedef struct {
int node_code;
+ unsigned int lineno;
enum {
etree_binary,
etree_trinary,
--- ld/testsuite/ld-elf/expr1.d.loc 2007-04-02 09:26:58.000000000 -0700
+++ ld/testsuite/ld-elf/expr1.d 2007-04-02 09:26:22.000000000 -0700
@@ -0,0 +1,2 @@
+# ld: -T expr1.t
+# error: expr1.t:3: nonconstant expression for load base
--- ld/testsuite/ld-elf/expr1.s.loc 2007-04-02 09:26:58.000000000 -0700
+++ ld/testsuite/ld-elf/expr1.s 2007-02-22 02:24:40.000000000 -0800
@@ -0,0 +1,4 @@
+ .section .bar,"ax","progbits"
+ .byte 0
+ .section .foo,"aw","progbits"
+ .byte 0
--- ld/testsuite/ld-elf/expr1.t.loc 2007-04-02 09:26:58.000000000 -0700
+++ ld/testsuite/ld-elf/expr1.t 2007-02-22 02:24:26.000000000 -0800
@@ -0,0 +1,6 @@
+SECTIONS
+{
+ .bar : AT ((ADDR(.foo) + 4095) & ~(4095)) { *(.bar) }
+ .foo : { *(.foo) }
+ /DISCARD/ : { *(.*) }
+}