gas/ChangeLog:
authorJames Lemke <jwlemke@codesourcery.com>
Wed, 1 Aug 2012 13:46:59 +0000 (13:46 +0000)
committerJames Lemke <jwlemke@codesourcery.com>
Wed, 1 Aug 2012 13:46:59 +0000 (13:46 +0000)
2012-08-01  James Lemke  <jwlemke@codesourcery.com>

* gas/dwarf2dbg.c (out_set_addr): Allow for non-constant value of
DWARF2_LINE_MIN_INSN_LENGTH
* gas/config/tc-ppc.c (ppc_dwarf2_line_min_insn_length): Declare
and initialize.
(md_apply_fix): Branch addr can be a multiple of 2 or 4.
* gas/config/tc-ppc.h (DWARF2_LINE_MIN_INSN_LENGTH): Now a
variable reference.

gas/testsuite/ChangeLog:
2012-08-01  James Lemke  <jwlemke@codesourcery.com>

* gas/cfi/cfi-ppc-1.d: Allow for code alignment of 2 or 4.

ld/ChangeLog:
2012-08-01  James Lemke  <jwlemke@codesourcery.com>

* ld/testsuite/ld-gc/pr13683.d: XFAIL for powerpc*-*-eabivle.

gas/ChangeLog
gas/config/tc-ppc.c
gas/config/tc-ppc.h
gas/dwarf2dbg.c
gas/testsuite/ChangeLog
gas/testsuite/gas/cfi/cfi-ppc-1.d
ld/ChangeLog
ld/testsuite/ld-gc/pr13683.d

index 2c78673..bd51030 100644 (file)
@@ -1,3 +1,13 @@
+2012-08-01  James Lemke  <jwlemke@codesourcery.com>
+
+       * gas/dwarf2dbg.c (out_set_addr): Allow for non-constant value of
+       DWARF2_LINE_MIN_INSN_LENGTH
+       * gas/config/tc-ppc.c (ppc_dwarf2_line_min_insn_length): Declare
+       and initialize.
+       (md_apply_fix): Branch addr can be a multiple of 2 or 4.
+       * gas/config/tc-ppc.h (DWARF2_LINE_MIN_INSN_LENGTH): Now a
+       variable reference.
+
 2012-07-31  Maciej W. Rozycki  <macro@codesourcery.com>
             Chao-Ying Fu  <fu@mips.com>
             Catherine Moore  <clm@codesourcery.com>
index af1f4cf..2820c31 100644 (file)
@@ -213,6 +213,9 @@ const char ppc_symbol_chars[] = "%[";
 /* The dwarf2 data alignment, adjusted for 32 or 64 bit.  */
 int ppc_cie_data_alignment;
 
+/* The dwarf2 minimum instruction length.  */
+int ppc_dwarf2_line_min_insn_length;
+
 /* More than this number of nops in an alignment op gets a branch
    instead.  */
 unsigned long nop_limit = 4;
@@ -1695,6 +1698,7 @@ md_begin (void)
   ppc_set_cpu ();
 
   ppc_cie_data_alignment = ppc_obj64 ? -8 : -4;
+  ppc_dwarf2_line_min_insn_length = (ppc_cpu & PPC_OPCODE_VLE) ? 2 : 4;
 
 #ifdef OBJ_ELF
   /* Set the ELF flags if desired.  */
@@ -6882,9 +6886,18 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
                insn = bfd_getb32 ((unsigned char *) where);
              else
                insn = bfd_getl32 ((unsigned char *) where);
-             if ((value & 3) != 0)
-               as_bad_where (fixP->fx_file, fixP->fx_line,
-                             _("must branch to an address a multiple of 4"));
+             if (ppc_mach() == bfd_mach_ppc_vle)
+               {
+                 if ((value & 1) != 0)
+                   as_bad_where (fixP->fx_file, fixP->fx_line,
+                                 _("branch address must be a multiple of 2"));
+               }
+             else
+               {
+                 if ((value & 3) != 0)
+                   as_bad_where (fixP->fx_file, fixP->fx_line,
+                                 _("branch address must be a multiple of 4"));
+               }
              if ((offsetT) value < -0x40000000
                  || (offsetT) value >= 0x40000000)
                as_bad_where (fixP->fx_file, fixP->fx_line,
index eb19017..e053c9c 100644 (file)
@@ -270,6 +270,8 @@ extern int tc_ppc_regname_to_dw2regnum (char *);
 
 extern int ppc_cie_data_alignment;
 
-#define DWARF2_LINE_MIN_INSN_LENGTH     4
+extern int ppc_dwarf2_line_min_insn_length;
+
+#define DWARF2_LINE_MIN_INSN_LENGTH     ppc_dwarf2_line_min_insn_length
 #define DWARF2_DEFAULT_RETURN_COLUMN    0x41
 #define DWARF2_CIE_DATA_ALIGNMENT       ppc_cie_data_alignment
index 2ec329a..2fa6d51 100644 (file)
@@ -882,24 +882,22 @@ out_set_addr (symbolS *sym)
   emit_expr (&exp, sizeof_address);
 }
 
-#if DWARF2_LINE_MIN_INSN_LENGTH > 1
 static void scale_addr_delta (addressT *);
 
 static void
 scale_addr_delta (addressT *addr_delta)
 {
   static int printed_this = 0;
-  if (*addr_delta % DWARF2_LINE_MIN_INSN_LENGTH != 0)
+  if (DWARF2_LINE_MIN_INSN_LENGTH > 1)
     {
-      if (!printed_this)
-       as_bad("unaligned opcodes detected in executable segment");
-      printed_this = 1;
+      if (*addr_delta % DWARF2_LINE_MIN_INSN_LENGTH != 0  && !printed_this)
+        {
+         as_bad("unaligned opcodes detected in executable segment");
+          printed_this = 1;
+        }
+      *addr_delta /= DWARF2_LINE_MIN_INSN_LENGTH;
     }
-  *addr_delta /= DWARF2_LINE_MIN_INSN_LENGTH;
 }
-#else
-#define scale_addr_delta(A)
-#endif
 
 /* Encode a pair of line and address skips as efficiently as possible.
    Note that the line skip is signed, whereas the address skip is unsigned.
index 65e57de..b2bf5ec 100644 (file)
@@ -1,3 +1,7 @@
+2012-08-01  James Lemke  <jwlemke@codesourcery.com>
+
+       * gas/cfi/cfi-ppc-1.d: Allow for code alignment of 2 or 4.
+
 2012-07-31  Catherine Moore  <clm@codesourcery.com>
             Maciej W. Rozycki  <macro@codesourcery.com>
 
index 4fa4131..c14a060 100644 (file)
@@ -7,7 +7,7 @@ Contents of the .eh_frame section:
 00000000 00000010 00000000 CIE
   Version:               1
   Augmentation:          "zR"
-  Code alignment factor: 4
+  Code alignment factor: [24]
   Data alignment factor: -4
   Return address column: 65
   Augmentation data:     1b
index c066fef..59f0481 100644 (file)
@@ -1,3 +1,7 @@
+2012-08-01  James Lemke  <jwlemke@codesourcery.com>
+
+       * ld/testsuite/ld-gc/pr13683.d: XFAIL for powerpc*-*-eabivle.
+
 2012-07-31  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/14156
index e497088..19b2598 100644 (file)
@@ -2,7 +2,7 @@
 #source: dummy.s
 #ld: --gc-sections -e main --defsym foo=foo2 tmpdir/pr13683.o
 #nm: --format=bsd
-#xfail: sh64*-*-* iq2000-*-* lm32-*-* epiphany-*-* mips64vr-*-* frv-*-* m32c-*-* rl78-*-* rx-*-* sh-*-*
+#xfail: sh64*-*-* iq2000-*-* lm32-*-* epiphany-*-* mips64vr-*-* frv-*-* m32c-*-* rl78-*-* rx-*-* sh-*-* powerpc*-*-eabivle
 
 # Note - look for both "foo" and "foo2" being defined, non-zero function symbols