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: 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/ : { *(.*) }
+}


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