aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ChangeLog7
-rw-r--r--ld/ldlang.c12
-rw-r--r--ld/testsuite/ChangeLog12
-rw-r--r--ld/testsuite/ld-scripts/provide-4-map.d13
-rw-r--r--ld/testsuite/ld-scripts/provide-4.d9
-rw-r--r--ld/testsuite/ld-scripts/provide-4.t16
-rw-r--r--ld/testsuite/ld-scripts/provide-5-map.d6
-rw-r--r--ld/testsuite/ld-scripts/provide-5.d6
-rw-r--r--ld/testsuite/ld-scripts/provide-5.s4
-rw-r--r--ld/testsuite/ld-scripts/provide-5.t10
-rw-r--r--ld/testsuite/ld-scripts/provide.exp2
11 files changed, 95 insertions, 2 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 1ca6fe3..4641ff0 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,10 @@
+2015-01-20 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * ldlang.c (print_assignment): Only evaluate the expression for a
+ PROVIDE'd assignment when the destination is being defined.
+ Display a special message for PROVIDE'd symbols that are not being
+ provided.
+
2015-01-20 Alan Modra <amodra@gmail.com>
* emulparams/elf64ppc.sh (BSS_PLT): Don't define.
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 0c72333..3ea22c2 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -3983,7 +3983,12 @@ print_assignment (lang_assignment_statement_type *assignment,
osec = output_section->bfd_section;
if (osec == NULL)
osec = bfd_abs_section_ptr;
- exp_fold_tree (tree, osec, &print_dot);
+
+ if (assignment->exp->type.node_class != etree_provide)
+ exp_fold_tree (tree, osec, &print_dot);
+ else
+ expld.result.valid_p = FALSE;
+
if (expld.result.valid_p)
{
bfd_vma value;
@@ -4021,7 +4026,10 @@ print_assignment (lang_assignment_statement_type *assignment,
}
else
{
- minfo ("*undef* ");
+ if (assignment->exp->type.node_class == etree_provide)
+ minfo ("[!provide]");
+ else
+ minfo ("*undef* ");
#ifdef BFD64
minfo (" ");
#endif
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index b6e3481..0b47494 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,5 +1,17 @@
2015-01-20 Andrew Burgess <andrew.burgess@embecosm.com>
+ * ld-scripts/provide-4.d: New file.
+ * ld-scripts/provide-4-map.d: New file.
+ * ld-scripts/provide-4.t: New file.
+ * ld-scripts/provide-5.d: New file.
+ * ld-scripts/provide-5.s: New file.
+ * ld-scripts/provide-5-map.d: New file.
+ * ld-scripts/provide-5.t: New file.
+ * ld-scripts/provide.exp: Run the provide-4.d and provide-5.d
+ tests.
+
+2015-01-20 Andrew Burgess <andrew.burgess@embecosm.com>
+
* ld-scripts/overlay-size.d: Add 'map' option.
* ld-scripts/overlay-size.exp: Remove manual check of mapfile.
* lib/ld-lib.exp (run_dump_test): Add support for new 'map'
diff --git a/ld/testsuite/ld-scripts/provide-4-map.d b/ld/testsuite/ld-scripts/provide-4-map.d
new file mode 100644
index 0000000..d8e4a28
--- /dev/null
+++ b/ld/testsuite/ld-scripts/provide-4-map.d
@@ -0,0 +1,13 @@
+#...
+Linker script and memory map
+#...
+ \[!provide\] PROVIDE \(foo, 0x1\)
+ \[!provide\] PROVIDE \(bar, 0x2\)
+ 0x0+3 PROVIDE \(baz, 0x3\)
+#...
+ 0x0+2000 foo
+ \[!provide\] PROVIDE \(loc1, ALIGN \(\., 0x10\)\)
+ 0x0+2010 PROVIDE \(loc2, ALIGN \(\., 0x10\)\)
+ \[!provide\] PROVIDE \(loc3, \(loc1 \+ 0x20\)\)
+ 0x0+2030 loc4 = \(loc2 \+ 0x20\)
+#...
diff --git a/ld/testsuite/ld-scripts/provide-4.d b/ld/testsuite/ld-scripts/provide-4.d
new file mode 100644
index 0000000..a7d37e3
--- /dev/null
+++ b/ld/testsuite/ld-scripts/provide-4.d
@@ -0,0 +1,9 @@
+#source: provide-2.s
+#ld: -T provide-4.t
+#PROG: nm
+#map: provide-4-map.d
+#...
+0+3 A baz
+0+2000 D foo
+0+2010 D loc2
+0+2030 A loc4
diff --git a/ld/testsuite/ld-scripts/provide-4.t b/ld/testsuite/ld-scripts/provide-4.t
new file mode 100644
index 0000000..424c238
--- /dev/null
+++ b/ld/testsuite/ld-scripts/provide-4.t
@@ -0,0 +1,16 @@
+SECTIONS
+{
+ PROVIDE (foo = 1);
+ PROVIDE (bar = 2);
+ PROVIDE (baz = 3);
+ .data 0x2000 :
+ {
+ *(.data)
+
+ PROVIDE (loc1 = ALIGN (., 0x10));
+ PROVIDE (loc2 = ALIGN (., 0x10));
+ }
+
+ PROVIDE (loc3 = loc1 + 0x20);
+ loc4 = loc2 + 0x20;
+}
diff --git a/ld/testsuite/ld-scripts/provide-5-map.d b/ld/testsuite/ld-scripts/provide-5-map.d
new file mode 100644
index 0000000..2271dfd
--- /dev/null
+++ b/ld/testsuite/ld-scripts/provide-5-map.d
@@ -0,0 +1,6 @@
+#...
+Linker script and memory map
+#...
+ 0x0+10 foo = 0x10
+ \[!provide\] PROVIDE \(foo, bar\)
+#...
diff --git a/ld/testsuite/ld-scripts/provide-5.d b/ld/testsuite/ld-scripts/provide-5.d
new file mode 100644
index 0000000..1b14fa6
--- /dev/null
+++ b/ld/testsuite/ld-scripts/provide-5.d
@@ -0,0 +1,6 @@
+#source: provide-5.s
+#ld: -T provide-5.t
+#PROG: nm
+#map: provide-5-map.d
+#...
+0+10 A foo
diff --git a/ld/testsuite/ld-scripts/provide-5.s b/ld/testsuite/ld-scripts/provide-5.s
new file mode 100644
index 0000000..1d05efd
--- /dev/null
+++ b/ld/testsuite/ld-scripts/provide-5.s
@@ -0,0 +1,4 @@
+ .data
+ .global baz
+baz:
+ .word 0
diff --git a/ld/testsuite/ld-scripts/provide-5.t b/ld/testsuite/ld-scripts/provide-5.t
new file mode 100644
index 0000000..eda741e
--- /dev/null
+++ b/ld/testsuite/ld-scripts/provide-5.t
@@ -0,0 +1,10 @@
+SECTIONS
+{
+ foo = 0x10;
+ PROVIDE (foo = bar);
+
+ .data 0x1000 :
+ {
+ *(.data)
+ }
+}
diff --git a/ld/testsuite/ld-scripts/provide.exp b/ld/testsuite/ld-scripts/provide.exp
index 7f45e58..3ddbb22 100644
--- a/ld/testsuite/ld-scripts/provide.exp
+++ b/ld/testsuite/ld-scripts/provide.exp
@@ -40,5 +40,7 @@ run_dump_test provide-1
run_dump_test provide-2
setup_xfail *-*-*
run_dump_test provide-3
+run_dump_test provide-4
+run_dump_test provide-5
set LDFLAGS "$saved_LDFLAGS"