aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ChangeLog6
-rw-r--r--ld/emultempl/avrelf.em37
-rw-r--r--ld/testsuite/ChangeLog13
-rw-r--r--ld/testsuite/ld-avr/relax-elf-flags-01.d12
-rw-r--r--ld/testsuite/ld-avr/relax-elf-flags-02.d12
-rw-r--r--ld/testsuite/ld-avr/relax-elf-flags-03.d12
-rw-r--r--ld/testsuite/ld-avr/relax-elf-flags-04.d12
-rw-r--r--ld/testsuite/ld-avr/relax-elf-flags-05.d12
-rw-r--r--ld/testsuite/ld-avr/relax-elf-flags-06.d12
-rw-r--r--ld/testsuite/ld-avr/relax-elf-flags-07.d12
-rw-r--r--ld/testsuite/ld-avr/relax-elf-flags-08.d12
-rw-r--r--ld/testsuite/ld-avr/relax-elf-flags-a.s4
-rw-r--r--ld/testsuite/ld-avr/relax-elf-flags-b.s4
13 files changed, 160 insertions, 0 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 154def7..0b2f058 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,9 @@
+2014-12-23 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * emultempl/avrelf.em: Add include of elf/avr.h.
+ (avr_finish): New function.
+ (LDEMUL_FINISH): Added.
+
2014-12-23 Alan Modra <amodra@gmail.com>
* ldexp.c (update_definedness): Return false if script symbol is
diff --git a/ld/emultempl/avrelf.em b/ld/emultempl/avrelf.em
index 170dc3e..f4e2654 100644
--- a/ld/emultempl/avrelf.em
+++ b/ld/emultempl/avrelf.em
@@ -28,6 +28,7 @@ fragment <<EOF
#include "elf32-avr.h"
#include "ldctor.h"
+#include "elf/avr.h"
/* The fake file and it's corresponding section meant to hold
the linker stubs if needed. */
@@ -175,6 +176,41 @@ avr_elf_before_parse (void)
gld${EMULATION_NAME}_before_parse ();
}
+static void
+avr_finish (void)
+{
+ bfd *abfd;
+ bfd_boolean avr_link_relax;
+
+ if (link_info.relocatable)
+ {
+ avr_link_relax = TRUE;
+ for (abfd = link_info.input_bfds; abfd != NULL; abfd = abfd->link.next)
+ {
+ /* Don't let the linker stubs prevent the final object being
+ marked as link-relax ready. */
+ if ((elf_elfheader (abfd)->e_flags
+ & EF_AVR_LINKRELAX_PREPARED) == 0
+ && abfd != stub_file->the_bfd)
+ {
+ avr_link_relax = FALSE;
+ break;
+ }
+ }
+ }
+ else
+ {
+ avr_link_relax = RELAXATION_ENABLED;
+ }
+
+ abfd = link_info.output_bfd;
+ if (avr_link_relax)
+ elf_elfheader (abfd)->e_flags |= EF_AVR_LINKRELAX_PREPARED;
+ else
+ elf_elfheader (abfd)->e_flags &= ~EF_AVR_LINKRELAX_PREPARED;
+
+ finish_default ();
+}
EOF
@@ -274,3 +310,4 @@ LDEMUL_BEFORE_PARSE=avr_elf_before_parse
LDEMUL_BEFORE_ALLOCATION=avr_elf_${EMULATION_NAME}_before_allocation
LDEMUL_AFTER_ALLOCATION=avr_elf_after_allocation
LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=avr_elf_create_output_section_statements
+LDEMUL_FINISH=avr_finish
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index cfc0284..fdef038 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,16 @@
+2014-12-23 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * ld-avr/relax-elf-flags-01.d: New file.
+ * ld-avr/relax-elf-flags-02.d: New file.
+ * ld-avr/relax-elf-flags-03.d: New file.
+ * ld-avr/relax-elf-flags-04.d: New file.
+ * ld-avr/relax-elf-flags-05.d: New file.
+ * ld-avr/relax-elf-flags-06.d: New file.
+ * ld-avr/relax-elf-flags-07.d: New file.
+ * ld-avr/relax-elf-flags-08.d: New file.
+ * ld-avr/relax-elf-flags-a.s: New file.
+ * ld-avr/relax-elf-flags-b.s: New file.
+
2014-12-23 Alan Modra <amodra@gmail.com>
* ld-powerpc/sdabase.s,
diff --git a/ld/testsuite/ld-avr/relax-elf-flags-01.d b/ld/testsuite/ld-avr/relax-elf-flags-01.d
new file mode 100644
index 0000000..6cf4920
--- /dev/null
+++ b/ld/testsuite/ld-avr/relax-elf-flags-01.d
@@ -0,0 +1,12 @@
+#name: AVR, check link-relax flag is set on partial link
+#as: -mmcu=avrxmega2
+#ld: -r -mavrxmega2
+#source: relax-elf-flags-a.s -mlink-relax
+#source: relax-elf-flags-b.s -mlink-relax
+#readelf: -h
+#target: avr-*-*
+
+ELF Header:
+#...
+ Flags: 0xe6, avr:102, link-relax
+#... \ No newline at end of file
diff --git a/ld/testsuite/ld-avr/relax-elf-flags-02.d b/ld/testsuite/ld-avr/relax-elf-flags-02.d
new file mode 100644
index 0000000..6a008bd
--- /dev/null
+++ b/ld/testsuite/ld-avr/relax-elf-flags-02.d
@@ -0,0 +1,12 @@
+#name: AVR, check link-relax flag is clear on partial link (first file)
+#as: -mmcu=avrxmega2
+#ld: -r -mavrxmega2
+#source: relax-elf-flags-a.s
+#source: relax-elf-flags-b.s -mlink-relax
+#readelf: -h
+#target: avr-*-*
+
+ELF Header:
+#...
+ Flags: 0x66, avr:102
+#... \ No newline at end of file
diff --git a/ld/testsuite/ld-avr/relax-elf-flags-03.d b/ld/testsuite/ld-avr/relax-elf-flags-03.d
new file mode 100644
index 0000000..3d2a70d
--- /dev/null
+++ b/ld/testsuite/ld-avr/relax-elf-flags-03.d
@@ -0,0 +1,12 @@
+#name: AVR, check link-relax flag is clear on partial link, second file.
+#as: -mmcu=avrxmega2
+#ld: -r -mavrxmega2
+#source: relax-elf-flags-a.s -mlink-relax
+#source: relax-elf-flags-b.s
+#readelf: -h
+#target: avr-*-*
+
+ELF Header:
+#...
+ Flags: 0x66, avr:102
+#... \ No newline at end of file
diff --git a/ld/testsuite/ld-avr/relax-elf-flags-04.d b/ld/testsuite/ld-avr/relax-elf-flags-04.d
new file mode 100644
index 0000000..e2a9bb6
--- /dev/null
+++ b/ld/testsuite/ld-avr/relax-elf-flags-04.d
@@ -0,0 +1,12 @@
+#name: AVR, check link-relax flag is clear on partial link (both files)
+#as: -mmcu=avrxmega2
+#ld: -r -mavrxmega2
+#source: relax-elf-flags-a.s
+#source: relax-elf-flags-b.s
+#readelf: -h
+#target: avr-*-*
+
+ELF Header:
+#...
+ Flags: 0x66, avr:102
+#... \ No newline at end of file
diff --git a/ld/testsuite/ld-avr/relax-elf-flags-05.d b/ld/testsuite/ld-avr/relax-elf-flags-05.d
new file mode 100644
index 0000000..8c41e8d
--- /dev/null
+++ b/ld/testsuite/ld-avr/relax-elf-flags-05.d
@@ -0,0 +1,12 @@
+#name: AVR, check link-relax flag is set final link (no inputs relaxable)
+#as: -mmcu=avrxmega2
+#ld: -relax -mavrxmega2
+#source: relax-elf-flags-a.s
+#source: relax-elf-flags-b.s
+#readelf: -h
+#target: avr-*-*
+
+ELF Header:
+#...
+ Flags: 0xe6, avr:102, link-relax
+#... \ No newline at end of file
diff --git a/ld/testsuite/ld-avr/relax-elf-flags-06.d b/ld/testsuite/ld-avr/relax-elf-flags-06.d
new file mode 100644
index 0000000..5d8e3c1
--- /dev/null
+++ b/ld/testsuite/ld-avr/relax-elf-flags-06.d
@@ -0,0 +1,12 @@
+#name: AVR, check link-relax flag is set final link (first input relaxable)
+#as: -mmcu=avrxmega2
+#ld: -relax -mavrxmega2
+#source: relax-elf-flags-a.s -mlink-relax
+#source: relax-elf-flags-b.s
+#readelf: -h
+#target: avr-*-*
+
+ELF Header:
+#...
+ Flags: 0xe6, avr:102, link-relax
+#... \ No newline at end of file
diff --git a/ld/testsuite/ld-avr/relax-elf-flags-07.d b/ld/testsuite/ld-avr/relax-elf-flags-07.d
new file mode 100644
index 0000000..25b70e7
--- /dev/null
+++ b/ld/testsuite/ld-avr/relax-elf-flags-07.d
@@ -0,0 +1,12 @@
+#name: AVR, check link-relax flag is set final link (both inputs relaxable)
+#as: -mmcu=avrxmega2
+#ld: -relax -mavrxmega2
+#source: relax-elf-flags-a.s -mlink-relax
+#source: relax-elf-flags-b.s -mlink-relax
+#readelf: -h
+#target: avr-*-*
+
+ELF Header:
+#...
+ Flags: 0xe6, avr:102, link-relax
+#... \ No newline at end of file
diff --git a/ld/testsuite/ld-avr/relax-elf-flags-08.d b/ld/testsuite/ld-avr/relax-elf-flags-08.d
new file mode 100644
index 0000000..0b2152a
--- /dev/null
+++ b/ld/testsuite/ld-avr/relax-elf-flags-08.d
@@ -0,0 +1,12 @@
+#name: AVR, check link-relax flag is clear final link (both inputs relaxable)
+#as: -mmcu=avrxmega2
+#ld: -mavrxmega2
+#source: relax-elf-flags-a.s -mlink-relax
+#source: relax-elf-flags-b.s -mlink-relax
+#readelf: -h
+#target: avr-*-*
+
+ELF Header:
+#...
+ Flags: 0x66, avr:102
+#... \ No newline at end of file
diff --git a/ld/testsuite/ld-avr/relax-elf-flags-a.s b/ld/testsuite/ld-avr/relax-elf-flags-a.s
new file mode 100644
index 0000000..af543e1
--- /dev/null
+++ b/ld/testsuite/ld-avr/relax-elf-flags-a.s
@@ -0,0 +1,4 @@
+ .text
+ .global _start
+_start:
+ nop
diff --git a/ld/testsuite/ld-avr/relax-elf-flags-b.s b/ld/testsuite/ld-avr/relax-elf-flags-b.s
new file mode 100644
index 0000000..59ca0cc
--- /dev/null
+++ b/ld/testsuite/ld-avr/relax-elf-flags-b.s
@@ -0,0 +1,4 @@
+ .text
+ .global func
+func:
+ nop