AVR: Assembler now prepares for linker relaxation by default.
authorAndrew Burgess <andrew.burgess@embecosm.com>
Mon, 27 Oct 2014 10:51:17 +0000 (10:51 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Wed, 24 Dec 2014 21:27:43 +0000 (21:27 +0000)
Have the assembler prepare for linker relaxation by default.  This
means that users will be able to make use of linker relaxation without
having to adjust the assembler flags, this can make life easier when
compiling libraries.

Having this on by default in the assembler should make no difference to
the assembler code produced, however, some of the debug information will
be slightly less compressed.

A few tests needed to be updated as a result of this change as they
relied on linker relaxation support being off by default.

I've tightened up the definition of which sections can be relaxed on AVR
as part of this commit, the assembler used to think that all
non-debugging sections could be relaxed, when in reality only code
sections can be relaxed for AVR.  The previous definition was not
dangerous, just over cautious.  The new tighter definition allows an
extra test (gas/testsuite/gas/all/forward.d) to continue to pass.

gas/ChangeLog:

* config/tc-avr.c (struct avr_opt_s): Change link_relax to
no_link_relax, extend comment.
(enum options): Add new OPTION_NO_LINK_RELAX.
(md_longopts): Add entry for -mno-link-relax.
(md_parse_option): Handle OPTION_NO_LINK_RELAX, and update
OPTION_LINK_RELAX.
(md_begin): Initialise linkrelax from no_link_relax.
(md_show_usage): Include -mno-link-relax option.
(relaxable_section): Only allocatable code sections can be
relaxed.
* config/tc-avr.h (TC_LINKRELAX_FIXUP): Define.

gas/testsuite/ChangeLog:

* gas/all/gas.exp: Test will not pass on AVR due to linker
relaxation support.
* gas/avr/noreloc_withoutrelax.d: Add -mno-link-relax option.
* gas/avr/link-relax-elf-flag-clear.d: Likewise.

ld/testsuite/ChangeLog:

* ld/testsuite/ld-avr/relax-elf-flags-02.d: Add -mno-link-relax
option.
* ld/testsuite/ld-avr/relax-elf-flags-03.d: Likewise.
* ld/testsuite/ld-avr/relax-elf-flags-04.d: Likewise.
* ld/testsuite/ld-avr/relax-elf-flags-05.d: Likewise.
* ld/testsuite/ld-avr/relax-elf-flags-06.d: Likewise.

12 files changed:
gas/ChangeLog
gas/config/tc-avr.c
gas/testsuite/ChangeLog
gas/testsuite/gas/all/gas.exp
gas/testsuite/gas/avr/link-relax-elf-flag-clear.d
gas/testsuite/gas/avr/noreloc_withoutrelax.d
ld/testsuite/ChangeLog
ld/testsuite/ld-avr/relax-elf-flags-02.d
ld/testsuite/ld-avr/relax-elf-flags-03.d
ld/testsuite/ld-avr/relax-elf-flags-04.d
ld/testsuite/ld-avr/relax-elf-flags-05.d
ld/testsuite/ld-avr/relax-elf-flags-06.d

index d5c489a533d6e28ea00f42f9b8ad32e48d4b1819..f28116041606a9cebab64829398957c1c07a428c 100644 (file)
@@ -1,3 +1,16 @@
+2014-12-24  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * config/tc-avr.c (struct avr_opt_s): Change link_relax to
+       no_link_relax, extend comment.
+       (enum options): Add new OPTION_NO_LINK_RELAX.
+       (md_longopts): Add entry for -mno-link-relax.
+       (md_parse_option): Handle OPTION_NO_LINK_RELAX, and update
+       OPTION_LINK_RELAX.
+       (md_begin): Initialise linkrelax from no_link_relax.
+       (md_show_usage): Include -mno-link-relax option.
+       (relaxable_section): Only allocatable code sections can be
+       relaxed.
+
 2014-12-23  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * config/tc-avr.c: Add include for elf/avr.h.
index bda0bd636988969742024470bdac9134d3345dad..79560acf17a5dab48366ac53c3e823f5ddbc9955 100644 (file)
@@ -345,8 +345,8 @@ struct avr_opt_s
   int all_opcodes;  /* -mall-opcodes: accept all known AVR opcodes.  */
   int no_skip_bug;  /* -mno-skip-bug: no warnings for skipping 2-word insns.  */
   int no_wrap;      /* -mno-wrap: reject rjmp/rcall with 8K wrap-around.  */
-  int link_relax;   /* -mlink-relax: generate relocations for linker
-                       relaxation.  */
+  int no_link_relax;   /* -mno-link-relax / -mlink-relax: generate (or not)
+                          relocations for linker relaxation.  */
 };
 
 static struct avr_opt_s avr_opt = { 0, 0, 0, 0 };
@@ -411,7 +411,8 @@ enum options
   OPTION_NO_SKIP_BUG,
   OPTION_NO_WRAP,
   OPTION_ISA_RMW,
-  OPTION_LINK_RELAX
+  OPTION_LINK_RELAX,
+  OPTION_NO_LINK_RELAX
 };
 
 struct option md_longopts[] =
@@ -422,6 +423,7 @@ struct option md_longopts[] =
   { "mno-wrap",     no_argument, NULL, OPTION_NO_WRAP     },
   { "mrmw",         no_argument, NULL, OPTION_ISA_RMW     },
   { "mlink-relax",  no_argument, NULL, OPTION_LINK_RELAX  },
+  { "mno-link-relax",  no_argument, NULL, OPTION_NO_LINK_RELAX  },
   { NULL, no_argument, NULL, 0 }
 };
 
@@ -528,8 +530,9 @@ md_show_usage (FILE *stream)
        "  -mno-wrap        reject rjmp/rcall instructions with 8K wrap-around\n"
        "                   (default for avr3, avr5)\n"
        "  -mrmw            accept Read-Modify-Write instructions\n"
-    "  -mlink-relax     generate relocations for linker relaxation\n"
-    ));
+       "  -mlink-relax     generate relocations for linker relaxation (default)\n"
+       "  -mno-link-relax  don't generate relocations for linker relaxation.\n"
+        ));
   show_mcu_list (stream);
 }
 
@@ -600,7 +603,10 @@ md_parse_option (int c, char *arg)
       specified_mcu.isa |= AVR_ISA_RMW;
       return 1;
     case OPTION_LINK_RELAX:
-      avr_opt.link_relax = 1;
+      avr_opt.no_link_relax = 0;
+      return 1;
+    case OPTION_NO_LINK_RELAX:
+      avr_opt.no_link_relax = 1;
       return 1;
     }
 
@@ -652,7 +658,7 @@ md_begin (void)
     }
 
   bfd_set_arch_mach (stdoutput, TARGET_ARCH, avr_mcu->mach);
-  linkrelax = avr_opt.link_relax;
+  linkrelax = !avr_opt.no_link_relax;
 }
 
 /* Resolve STR as a constant expression and return the result.
@@ -1239,7 +1245,9 @@ md_pcrel_from_section (fixS *fixp, segT sec)
 static bfd_boolean
 relaxable_section (asection *sec)
 {
-  return (sec->flags & SEC_DEBUGGING) == 0;
+  return ((sec->flags & SEC_DEBUGGING) == 0
+          && (sec->flags & SEC_CODE) != 0
+          && (sec->flags & SEC_ALLOC) != 0);
 }
 
 /* Does whatever the xtensa port does.  */
index d6d64506bdd3e2e386321fe0729064169ad4b2d6..772ee7d4baf1eec5b2a484d67b2407f76891aff3 100644 (file)
@@ -1,3 +1,10 @@
+2014-12-24  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * gas/all/gas.exp: Test will not pass on AVR due to linker
+       relaxation support.
+       * gas/avr/noreloc_withoutrelax.d: Add -mno-link-relax option.
+       * gas/avr/link-relax-elf-flag-clear.d: Likewise.
+
 2014-12-23  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * gas/avr/link-relax-elf-flag-clear.d: New file.
index 8fa89e41a83d7a19b59f6eb9797838d7ed01e999..6002def9737defe86e966e9875a8f6c66adfbdef 100644 (file)
@@ -55,9 +55,10 @@ if { ![istarget cris-*-*] && ![istarget crisv32-*-*]
 # The MN10300 port supports link time relaxation which in turn allows
 # for link time resolution of the differneces of two symbols which are
 # undefined at assembly time.  Hence this test will not pass for the
-# MN10300.  The same thing is true for the RX port as well.
+# MN10300.  The same thing is true for the RX and AVR port as well.
 if { ![istarget hppa*-*-*]
      && ![istarget alpha*-*-*vms*]
+     && ![istarget avr-*-*]
      && ![istarget rx-*-*]
      && ![istarget mn10300-*-*]
      && ![istarget msp430*-*-*]
index 88cd3c9d4b916728af3ec16ea3fa84173078eb8f..e7ef22c9de2781bab638e5a4aa292bd1415e6761 100644 (file)
@@ -1,5 +1,5 @@
 #name: AVR, check elf link-relax header flag is clear.
-#as: -mmcu=avrxmega2
+#as: -mno-link-relax -mmcu=avrxmega2
 #readelf: -h
 #source: link-relax-elf-flag.s
 #target: avr-*-*
index daaaeb281d44fde323450a7e243079e6fb8c90ea..7ec7d32066dc045292bdd99e59deabedb738f28e 100644 (file)
@@ -1,5 +1,5 @@
 #name: AVR no DIFF relocs without link relax
-#as: -mmcu=avrxmega2
+#as: -mmcu=avrxmega2 -mno-link-relax
 #objdump: -r
 #source: relax.s
 #target: avr-*-*
index 628c9068dbbee0d89c06560f183c4ad0c515ad69..d987267775ce06a5aa42df2e0362802ebe83086e 100644 (file)
@@ -1,3 +1,12 @@
+2014-12-24  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * ld/testsuite/ld-avr/relax-elf-flags-02.d: Add -mno-link-relax
+       option.
+       * ld/testsuite/ld-avr/relax-elf-flags-03.d: Likewise.
+       * ld/testsuite/ld-avr/relax-elf-flags-04.d: Likewise.
+       * ld/testsuite/ld-avr/relax-elf-flags-05.d: Likewise.
+       * ld/testsuite/ld-avr/relax-elf-flags-06.d: Likewise.
+
 2014-12-24  Alan Modra  <amodra@gmail.com>
 
        * ld-scripts/defined6.s,
index 6a008bd8e61895e6df3abaed83547f6008259feb..c4d76605b17686033611f7402916527c7d7d9906 100644 (file)
@@ -1,7 +1,7 @@
 #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-a.s -mno-link-relax
 #source: relax-elf-flags-b.s -mlink-relax
 #readelf: -h
 #target: avr-*-*
index 3d2a70df2121372702a828a1ac54e98cca803c86..c75c1dfd499e5ac57b5e36c23906c90ec927496c 100644 (file)
@@ -2,7 +2,7 @@
 #as: -mmcu=avrxmega2
 #ld: -r -mavrxmega2
 #source: relax-elf-flags-a.s -mlink-relax
-#source: relax-elf-flags-b.s
+#source: relax-elf-flags-b.s -mno-link-relax
 #readelf: -h
 #target: avr-*-*
 
index e2a9bb6fdf2a335f2acb19e485e28b78cf445908..8fa457420111455b1d3c5069a7d8d59e8f8caa2d 100644 (file)
@@ -1,8 +1,8 @@
 #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
+#source: relax-elf-flags-a.s -mno-link-relax
+#source: relax-elf-flags-b.s -mno-link-relax
 #readelf: -h
 #target: avr-*-*
 
index 8c41e8d6230657835379809f6d866993ac3157dc..de62bbbd432d15934cf0d370addd309db8c755aa 100644 (file)
@@ -1,8 +1,8 @@
 #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
+#source: relax-elf-flags-a.s -mno-link-relax
+#source: relax-elf-flags-b.s -mno-link-relax
 #readelf: -h
 #target: avr-*-*
 
index 5d8e3c1183138c3250c0c5250a67a6fb844f7d3b..5a8e8107e22f4402ce88bb0ed92a6d34412f3824 100644 (file)
@@ -2,7 +2,7 @@
 #as: -mmcu=avrxmega2
 #ld: -relax -mavrxmega2
 #source: relax-elf-flags-a.s -mlink-relax
-#source: relax-elf-flags-b.s
+#source: relax-elf-flags-b.s -mno-link-relax
 #readelf: -h
 #target: avr-*-*