Check R_X86_64_32 overflow and allow R_X86_64_64 for x32.
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 1 Aug 2011 23:04:23 +0000 (23:04 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 1 Aug 2011 23:04:23 +0000 (23:04 +0000)
bfd/

2011-08-01  H.J. Lu  <hongjiu.lu@intel.com>

PR ld/13048
* archures.c (bfd_mach_i386_intel_syntax): New.
(bfd_mach_i386_i8086): Updated.
(bfd_mach_i386_i386): Likewise.
(bfd_mach_x86_64): Likewise.
(bfd_mach_x64_32): Likewise.
(bfd_mach_i386_i386_intel_syntax): Likewise.
(bfd_mach_x86_64_intel_syntax): Likewise.
(bfd_mach_x64_32_intel_syntax): Likewise.
(bfd_mach_l1om): Likewise.
(bfd_mach_l1om_intel_syntax): Likewise.
(bfd_mach_k1om): Likewise.
(bfd_mach_k1om_intel_syntax): Likewise.

* bfd-in2.h: Regenerated.

* cpu-i386.c (bfd_i386_compatible): Check mach instead of
bits_per_address.
(bfd_x64_32_arch_intel_syntax): Set bits_per_address to 64.
(bfd_x64_32_arch): Likewise.

* elf64-x86-64.c: Include "libiberty.h".
(x86_64_elf_howto_table): Append x32 R_X86_64_32.
(elf_x86_64_rtype_to_howto): Support x32 R_X86_64_32.
(elf_x86_64_reloc_type_lookup): Likewise.
(elf_x86_64_reloc_name_lookup): Likewise.
(elf_x86_64_relocate_section): Likewise.
(elf_x86_64_check_relocs): Allow R_X86_64_64 relocations for x32.

gas/

2011-08-01  H.J. Lu  <hongjiu.lu@intel.com>

PR ld/13048
* config/tc-i386.c (handle_quad): Removed.
(md_pseudo_table): Remove "quad".
(tc_gen_reloc): Don't check BFD_RELOC_64 for disallow_64bit_reloc.
(x86_dwarf2_addr_size): New.

* config/tc-i386.h (x86_dwarf2_addr_size): New.
(DWARF2_ADDR_SIZE): Likewise.

gas/testsuite/

2011-08-01  H.J. Lu  <hongjiu.lu@intel.com>

PR ld/13048
* gas/i386/ilp32/ilp32.exp: Don't run inval.

* gas/i386/ilp32/inval.l: Removed.
* gas/i386/ilp32/inval.s: Likewise.

* gas/i386/ilp32/quad.d: Expect R_X86_64_64 instead of
R_X86_64_32.

* gas/i386/ilp32/x86-64-pcrel.s: Add tests for movabs.
* gas/i386/ilp32/x86-64-pcrel.d: Updated.

ld/testsuite/

2011-08-01  H.J. Lu  <hongjiu.lu@intel.com>

PR ld/13048
* ld-x86-64/ilp32-6.d: New.
* ld-x86-64/ilp32-6.s: Likewise.
* ld-x86-64/ilp32-7.d: Likewise.
* ld-x86-64/ilp32-7.s: Likewise.
* ld-x86-64/ilp32-8.d: Likewise.
* ld-x86-64/ilp32-8.s: Likewise.
* ld-x86-64/ilp32-9.d: Likewise.
* ld-x86-64/ilp32-9.s: Likewise.

* ld-x86-64/x86-64.exp: Run ilp32-6, ilp32-7, ilp32-8 and ilp32-9.

opcodes/

2011-08-01  H.J. Lu  <hongjiu.lu@intel.com>

PR ld/13048
* i386-dis.c (print_insn): Optimize info->mach check.

27 files changed:
bfd/ChangeLog
bfd/archures.c
bfd/bfd-in2.h
bfd/cpu-i386.c
bfd/elf64-x86-64.c
gas/ChangeLog
gas/config/tc-i386.c
gas/config/tc-i386.h
gas/testsuite/ChangeLog
gas/testsuite/gas/i386/ilp32/ilp32.exp
gas/testsuite/gas/i386/ilp32/inval.l [deleted file]
gas/testsuite/gas/i386/ilp32/inval.s [deleted file]
gas/testsuite/gas/i386/ilp32/quad.d
gas/testsuite/gas/i386/ilp32/x86-64-pcrel.d
gas/testsuite/gas/i386/ilp32/x86-64-pcrel.s
ld/testsuite/ChangeLog
ld/testsuite/ld-x86-64/ilp32-6.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/ilp32-6.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/ilp32-7.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/ilp32-7.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/ilp32-8.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/ilp32-8.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/ilp32-9.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/ilp32-9.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp
opcodes/ChangeLog
opcodes/i386-dis.c

index 9a4b3f69c0af4ce7e9c0d095e004f2d1fde7a3f6..2ef36864bbd9340f1e64fef415e06710477ee813 100644 (file)
@@ -1,3 +1,34 @@
+2011-08-01  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/13048
+       * archures.c (bfd_mach_i386_intel_syntax): New.
+       (bfd_mach_i386_i8086): Updated.
+       (bfd_mach_i386_i386): Likewise.
+       (bfd_mach_x86_64): Likewise.
+       (bfd_mach_x64_32): Likewise.
+       (bfd_mach_i386_i386_intel_syntax): Likewise.
+       (bfd_mach_x86_64_intel_syntax): Likewise.
+       (bfd_mach_x64_32_intel_syntax): Likewise.
+       (bfd_mach_l1om): Likewise.
+       (bfd_mach_l1om_intel_syntax): Likewise.
+       (bfd_mach_k1om): Likewise.
+       (bfd_mach_k1om_intel_syntax): Likewise.
+
+       * bfd-in2.h: Regenerated.
+
+       * cpu-i386.c (bfd_i386_compatible): Check mach instead of
+       bits_per_address.
+       (bfd_x64_32_arch_intel_syntax): Set bits_per_address to 64.
+       (bfd_x64_32_arch): Likewise.
+
+       * elf64-x86-64.c: Include "libiberty.h".
+       (x86_64_elf_howto_table): Append x32 R_X86_64_32.
+       (elf_x86_64_rtype_to_howto): Support x32 R_X86_64_32.
+       (elf_x86_64_reloc_type_lookup): Likewise.
+       (elf_x86_64_reloc_name_lookup): Likewise.
+       (elf_x86_64_relocate_section): Likewise.
+       (elf_x86_64_check_relocs): Allow R_X86_64_64 relocations for x32.
+
 2011-07-29  Maciej W. Rozycki  <macro@codesourcery.com>
 
        * elfxx-mips.c (check_br32): Fix return type.
index 65682f2e18b49543aab0644d67039559c715e1fe..44850e75dc50d18860238f9445899f7015f39d63 100644 (file)
@@ -183,19 +183,20 @@ DESCRIPTION
 .#define bfd_mach_mipsisa64r2           65
 .#define bfd_mach_mips_micromips        96
 .  bfd_arch_i386,      {* Intel 386 *}
-.#define bfd_mach_i386_i386 1
-.#define bfd_mach_i386_i8086 2
-.#define bfd_mach_i386_i386_intel_syntax 3
-.#define bfd_mach_x64_32 32
-.#define bfd_mach_x64_32_intel_syntax 33
-.#define bfd_mach_x86_64 64
-.#define bfd_mach_x86_64_intel_syntax 65
+.#define bfd_mach_i386_intel_syntax    (1 << 0)
+.#define bfd_mach_i386_i8086           (1 << 1)
+.#define bfd_mach_i386_i386            (1 << 2)
+.#define bfd_mach_x86_64               (1 << 3)
+.#define bfd_mach_x64_32               (1 << 4)
+.#define bfd_mach_i386_i386_intel_syntax (bfd_mach_i386_i386 | bfd_mach_i386_intel_syntax)
+.#define bfd_mach_x86_64_intel_syntax  (bfd_mach_x86_64 | bfd_mach_i386_intel_syntax)
+.#define bfd_mach_x64_32_intel_syntax  (bfd_mach_x64_32 | bfd_mach_i386_intel_syntax)
 .  bfd_arch_l1om,   {* Intel L1OM *}
-.#define bfd_mach_l1om 66
-.#define bfd_mach_l1om_intel_syntax 67
+.#define bfd_mach_l1om                 (1 << 5)
+.#define bfd_mach_l1om_intel_syntax    (bfd_mach_l1om | bfd_mach_i386_intel_syntax)
 .  bfd_arch_k1om,   {* Intel K1OM *}
-.#define bfd_mach_k1om 68
-.#define bfd_mach_k1om_intel_syntax 69
+.#define bfd_mach_k1om                 (1 << 6)
+.#define bfd_mach_k1om_intel_syntax    (bfd_mach_k1om | bfd_mach_i386_intel_syntax)
 .  bfd_arch_we32k,     {* AT&T WE32xxx *}
 .  bfd_arch_tahoe,     {* CCI/Harris Tahoe *}
 .  bfd_arch_i860,      {* Intel 860 *}
index 6b7be67e578ab638b474588adcca013be4d51357..ac8145d77664c6c24dc9d2c85cb5f7c7e9f67fe8 100644 (file)
@@ -1886,19 +1886,20 @@ enum bfd_architecture
 #define bfd_mach_mipsisa64r2           65
 #define bfd_mach_mips_micromips        96
   bfd_arch_i386,      /* Intel 386 */
-#define bfd_mach_i386_i386 1
-#define bfd_mach_i386_i8086 2
-#define bfd_mach_i386_i386_intel_syntax 3
-#define bfd_mach_x64_32 32
-#define bfd_mach_x64_32_intel_syntax 33
-#define bfd_mach_x86_64 64
-#define bfd_mach_x86_64_intel_syntax 65
+#define bfd_mach_i386_intel_syntax     (1 << 0)
+#define bfd_mach_i386_i8086            (1 << 1)
+#define bfd_mach_i386_i386             (1 << 2)
+#define bfd_mach_x86_64                (1 << 3)
+#define bfd_mach_x64_32                (1 << 4)
+#define bfd_mach_i386_i386_intel_syntax (bfd_mach_i386_i386 | bfd_mach_i386_intel_syntax)
+#define bfd_mach_x86_64_intel_syntax   (bfd_mach_x86_64 | bfd_mach_i386_intel_syntax)
+#define bfd_mach_x64_32_intel_syntax   (bfd_mach_x64_32 | bfd_mach_i386_intel_syntax)
   bfd_arch_l1om,   /* Intel L1OM */
-#define bfd_mach_l1om 66
-#define bfd_mach_l1om_intel_syntax 67
+#define bfd_mach_l1om                  (1 << 5)
+#define bfd_mach_l1om_intel_syntax     (bfd_mach_l1om | bfd_mach_i386_intel_syntax)
   bfd_arch_k1om,   /* Intel K1OM */
-#define bfd_mach_k1om 68
-#define bfd_mach_k1om_intel_syntax 69
+#define bfd_mach_k1om                  (1 << 6)
+#define bfd_mach_k1om_intel_syntax     (bfd_mach_k1om | bfd_mach_i386_intel_syntax)
   bfd_arch_we32k,     /* AT&T WE32xxx */
   bfd_arch_tahoe,     /* CCI/Harris Tahoe */
   bfd_arch_i860,      /* Intel 860 */
index c4f41c50c2c7ee18c3e723a0b0375d0a55f5f997..f98c0e50529a74432ee797db0e9c4e11939310b3 100644 (file)
@@ -31,7 +31,8 @@ bfd_i386_compatible (const bfd_arch_info_type *a,
   const bfd_arch_info_type *compat = bfd_default_compatible (a, b);
 
   /* Don't allow mixing x64_32 with x86_64.  */
-  if (compat && a->bits_per_address != b->bits_per_address)
+  if (compat
+      && (a->mach & bfd_mach_x64_32) != (b->mach & bfd_mach_x64_32))
     compat = NULL;
 
   return compat;
@@ -40,7 +41,7 @@ bfd_i386_compatible (const bfd_arch_info_type *a,
 static const bfd_arch_info_type bfd_x64_32_arch_intel_syntax =
 {
   64, /* 64 bits in a word */
-  32, /* 32 bits in an address */
+  64, /* 64 bits in an address */
   8,  /* 8 bits in a byte */
   bfd_arch_i386,
   bfd_mach_x64_32_intel_syntax,
@@ -104,7 +105,7 @@ static const bfd_arch_info_type i8086_arch =
 static const bfd_arch_info_type bfd_x64_32_arch =
 {
   64, /* 64 bits in a word */
-  32, /* 32 bits in an address */
+  64, /* 64 bits in an address */
   8,  /* 8 bits in a byte */
   bfd_arch_i386,
   bfd_mach_x64_32,
index 975b5584731e3937deddc6399693fd2aca2fe8f8..7b920971207a02422acff6cd01893e9d02b81089 100644 (file)
@@ -30,6 +30,7 @@
 #include "objalloc.h"
 #include "hashtab.h"
 #include "dwarf2.h"
+#include "libiberty.h"
 
 #include "elf/x86-64.h"
 
@@ -178,7 +179,12 @@ static reloc_howto_type x86_64_elf_howto_table[] =
 /* GNU extension to record C++ vtable member usage.  */
   HOWTO (R_X86_64_GNU_VTENTRY, 0, 4, 0, FALSE, 0, complain_overflow_dont,
         _bfd_elf_rel_vtable_reloc_fn, "R_X86_64_GNU_VTENTRY", FALSE, 0, 0,
-        FALSE)
+        FALSE),
+
+/* Use complain_overflow_bitfield on R_X86_64_32 for x32.  */
+  HOWTO(R_X86_64_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
+       bfd_elf_generic_reloc, "R_X86_64_32", FALSE, 0xffffffff, 0xffffffff,
+       FALSE)
 };
 
 #define IS_X86_64_PCREL_TYPE(TYPE)     \
@@ -241,8 +247,15 @@ elf_x86_64_rtype_to_howto (bfd *abfd, unsigned r_type)
 {
   unsigned i;
 
-  if (r_type < (unsigned int) R_X86_64_GNU_VTINHERIT
-      || r_type >= (unsigned int) R_X86_64_max)
+  if (r_type == (unsigned int) R_X86_64_32)
+    {
+      if (ABI_64_P (abfd))
+       i = r_type;
+      else
+       i = ARRAY_SIZE (x86_64_elf_howto_table) - 1;
+    }
+  else if (r_type < (unsigned int) R_X86_64_GNU_VTINHERIT
+          || r_type >= (unsigned int) R_X86_64_max)
     {
       if (r_type >= (unsigned int) R_X86_64_standard)
        {
@@ -276,15 +289,21 @@ elf_x86_64_reloc_type_lookup (bfd *abfd,
 }
 
 static reloc_howto_type *
-elf_x86_64_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+elf_x86_64_reloc_name_lookup (bfd *abfd,
                              const char *r_name)
 {
   unsigned int i;
 
-  for (i = 0;
-       i < (sizeof (x86_64_elf_howto_table)
-           / sizeof (x86_64_elf_howto_table[0]));
-       i++)
+  if (!ABI_64_P (abfd) && strcasecmp (r_name, "R_X86_64_32") == 0)
+    {
+      /* Get x32 R_X86_64_32.  */
+      reloc_howto_type *reloc
+       = &x86_64_elf_howto_table[ARRAY_SIZE (x86_64_elf_howto_table) - 1];
+      BFD_ASSERT (reloc->type == (unsigned int) R_X86_64_32);
+      return reloc;
+    }
+
+  for (i = 0; i < ARRAY_SIZE (x86_64_elf_howto_table); i++)
     if (x86_64_elf_howto_table[i].name != NULL
        && strcasecmp (x86_64_elf_howto_table[i].name, r_name) == 0)
       return &x86_64_elf_howto_table[i];
@@ -1396,14 +1415,6 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
          default:
            break;
 
-         case R_X86_64_64:
-           /* Allow R_X86_64_64 relocations in SEC_DEBUGGING sections
-              when building shared libraries.  */
-           if (info->shared
-               && !info->executable
-               && (sec->flags & SEC_DEBUGGING) != 0)
-             break;
-
          case R_X86_64_DTPOFF64:
          case R_X86_64_TPOFF64:
          case R_X86_64_PC64:
@@ -3022,7 +3033,12 @@ elf_x86_64_relocate_section (bfd *output_bfd,
          return FALSE;
        }
 
-      howto = x86_64_elf_howto_table + r_type;
+      if (r_type != (int) R_X86_64_32
+         || ABI_64_P (output_bfd)) 
+       howto = x86_64_elf_howto_table + r_type;
+      else
+       howto = (x86_64_elf_howto_table
+                + ARRAY_SIZE (x86_64_elf_howto_table) - 1);
       r_symndx = htab->r_sym (rel->r_info);
       h = NULL;
       sym = NULL;
index 8c0e298e99db0fb74dadf7f894694033d156ba21..6b94a0ab52409c06e726389050e25428b4f64203 100644 (file)
@@ -1,3 +1,14 @@
+2011-08-01  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/13048
+       * config/tc-i386.c (handle_quad): Removed.
+       (md_pseudo_table): Remove "quad".
+       (tc_gen_reloc): Don't check BFD_RELOC_64 for disallow_64bit_reloc.
+       (x86_dwarf2_addr_size): New.
+
+       * config/tc-i386.h (x86_dwarf2_addr_size): New.
+       (DWARF2_ADDR_SIZE): Likewise.
+
 2011-08-01  Nick Clifton  <nickc@redhat.com>
 
        PR ld/12974
index 1159572041b67fb133ebc743666e7db8396d5fea..59182bbeabd46671cb2e3acfd695f4ac541cfde0 100644 (file)
@@ -182,7 +182,6 @@ static void s_bss (int);
 #endif
 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
 static void handle_large_common (int small ATTRIBUTE_UNUSED);
-static void handle_quad (int);
 #endif
 
 static const char *default_arch = DEFAULT_ARCH;
@@ -828,7 +827,6 @@ const pseudo_typeS md_pseudo_table[] =
   {"sse_check", set_sse_check, 0},
 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
   {"largecomm", handle_large_common, 0},
-  {"quad", handle_quad, 8},
 #else
   {"file", (void (*) (int)) dwarf2_directive_file, 0},
   {"loc", dwarf2_directive_loc, 0},
@@ -9059,7 +9057,6 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
       if (disallow_64bit_reloc)
        switch (code)
          {
-         case BFD_RELOC_64:
          case BFD_RELOC_X86_64_DTPOFF64:
          case BFD_RELOC_X86_64_TPOFF64:
          case BFD_RELOC_64_PCREL:
@@ -9168,6 +9165,16 @@ tc_x86_frame_initial_instructions (void)
   cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
 }
 
+int
+x86_dwarf2_addr_size (void)
+{
+#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
+  if (x86_elf_abi == X86_64_X32_ABI)
+    return 4;
+#endif
+  return bfd_arch_bits_per_address (stdoutput) / 8;
+}
+
 int
 i386_elf_section_type (const char *str, size_t len)
 {
@@ -9267,50 +9274,4 @@ handle_large_common (int small ATTRIBUTE_UNUSED)
       bss_section = saved_bss_section;
     }
 }
-
-static void
-handle_quad (int nbytes)
-{
-  expressionS exp;
-
-  if (x86_elf_abi != X86_64_X32_ABI)
-    {
-      cons (nbytes);
-      return;
-    }
-
-  if (is_it_end_of_statement ())
-    {
-      demand_empty_rest_of_line ();
-      return;
-    }
-
-  do
-    {
-      if (*input_line_pointer == '"')
-       {
-         as_bad (_("unexpected `\"' in expression"));
-         ignore_rest_of_line ();
-         return;
-       }
-      x86_cons (&exp, nbytes);
-      /* Output 4 bytes if not constant.  */
-      if (exp.X_op != O_constant)
-       nbytes = 4;
-      emit_expr (&exp, (unsigned int) nbytes);
-      /* Zero-extends to 8 bytes if not constant.  */
-      if (nbytes == 4)
-       {
-         memset (&exp, '\0', sizeof (exp));
-         exp.X_op = O_constant;
-         emit_expr (&exp, nbytes);
-       }
-      nbytes = 8;
-    }
-  while (*input_line_pointer++ == ',');
-
-  input_line_pointer--;                /* Put terminator back into stream.  */
-
-  demand_empty_rest_of_line ();
-}
 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
index deb2e9f7207e3fd3fdcac141fb96292b5b110202..6a6b31d648551c80f2130fb6f788472d93a8172f 100644 (file)
@@ -279,6 +279,9 @@ extern unsigned int x86_dwarf2_return_column;
 extern int x86_cie_data_alignment;
 #define DWARF2_CIE_DATA_ALIGNMENT x86_cie_data_alignment
 
+extern int x86_dwarf2_addr_size (void);
+#define DWARF2_ADDR_SIZE(bfd) x86_dwarf2_addr_size ()
+
 #define tc_parse_to_dw2regnum tc_x86_parse_to_dw2regnum
 extern void tc_x86_parse_to_dw2regnum (expressionS *);
 
index 063f89947595c046a6241dbf9cff5bbdc6c8ff12..28a549f1ecacd0a95d913f3cac6e7972b134f75f 100644 (file)
@@ -1,3 +1,17 @@
+2011-08-01  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/13048
+       * gas/i386/ilp32/ilp32.exp: Don't run inval.
+
+       * gas/i386/ilp32/inval.l: Removed.
+       * gas/i386/ilp32/inval.s: Likewise.
+
+       * gas/i386/ilp32/quad.d: Expect R_X86_64_64 instead of
+       R_X86_64_32.
+
+       * gas/i386/ilp32/x86-64-pcrel.s: Add tests for movabs.
+       * gas/i386/ilp32/x86-64-pcrel.d: Updated.
+
 2011-08-01  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR gas/13046
index 7145fad3f8b96a88fffe1db0d7a9f3c51420d1e0..de43bf25ed78ceb7fe21f740a6330e9b92a9fea5 100644 (file)
@@ -25,7 +25,6 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_64_check] &&
        }
     }
 
-    run_list_test "inval" "-al"
     run_list_test "reloc64" "--defsym _bad_=1"
 
     set ASFLAGS "$old_ASFLAGS"
diff --git a/gas/testsuite/gas/i386/ilp32/inval.l b/gas/testsuite/gas/i386/ilp32/inval.l
deleted file mode 100644 (file)
index d037bae..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-.*: Assembler messages:
-.*:3: Error: .*
-.*:4: Error: .*
-.*:5: Error: .*
-.*:6: Error: .*
-GAS LISTING .*
-
-
-[      ]*1[    ]+\.text
-[      ]*2[    ]+\# All the following should be illegal for x32
-[      ]*3[    ]+\?\?\?\? 48A10000             movabs xxx,%rax
-[      ]*3[    ]+00000000 
-[      ]*3[    ]+0000
-[      ]*4[    ]+\?\?\?\? 48A10000             movabs foo,%rax
-[      ]*4[    ]+00000000 
-[      ]*4[    ]+0000
-[      ]*5[    ]+\?\?\?\? 48A10000             movabsq xxx,%rax
-[      ]*5[    ]+00000000 
-[      ]*5[    ]+0000
-[      ]*6[    ]+\?\?\?\? 48A10000             movabsq foo,%rax
-\*\*\*\*  Error:cannot represent relocation type BFD_RELOC_[   ]*64[   ]+in x32 mode
-[      ]*6[    ]+00000000 
-[      ]*6[    ]+0000
diff --git a/gas/testsuite/gas/i386/ilp32/inval.s b/gas/testsuite/gas/i386/ilp32/inval.s
deleted file mode 100644 (file)
index f117ca0..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-       .text
-# All the following should be illegal for x32
-       movabs xxx,%rax
-       movabs foo,%rax
-       movabsq xxx,%rax
-       movabsq foo,%rax
index 6f8a6c6f57a81608ebac627a6b444957f1442bf6..f337baec7577aac94ac6b1dbb1b615fb38d8bdda 100644 (file)
@@ -1,14 +1,14 @@
 #objdump: -sr
-#name: xquad
+#name: x86-64 (ILP32) quad
 
 .*: +file format .*
 
 RELOCATION RECORDS FOR \[.data\]:
 OFFSET +TYPE +VALUE 
-0+ R_X86_64_32 +foo
-0+10 R_X86_64_32 +bar
-0+20 R_X86_64_32 +foo
-0+30 R_X86_64_32 +bar
+0+ R_X86_64_64 +foo
+0+10 R_X86_64_64 +bar
+0+20 R_X86_64_64 +foo
+0+30 R_X86_64_64 +bar
 
 
 Contents of section .data:
index decbf58d269e95438d0d95320b5d18342b84d848..6d113810fdffca1704081f8a3b4ba566930a042d 100644 (file)
@@ -5,13 +5,15 @@
 
 Disassembly of section .text:
 
-0+000 <_start>:
-[       ]*[0-9a-f]+:[   ]+b0 00[        ]+movb?[        ]+\$(0x)?0,%al[         ]*[0-9a-f]+:[   ]+R_X86_64_PC8[         ]+xtrn\+(0x)?1
-[       ]*[0-9a-f]+:[   ]+66 b8 00 00[  ]+movw?[        ]+\$(0x)?0,%ax[         ]*[0-9a-f]+:[   ]+R_X86_64_PC16[        ]+xtrn\+(0x)?2
-[       ]*[0-9a-f]+:[   ]+b8( 00){4}[   ]+movl?[        ]+\$(0x)?0,%eax[        ]*[0-9a-f]+:[   ]+R_X86_64_PC32[        ]+xtrn\+(0x)?1
-[       ]*[0-9a-f]+:[   ]+48 c7 c0( 00){4}[     ]+movq?[        ]+\$(0x)?0,%rax[        ]*[0-9a-f]+:[   ]+R_X86_64_PC32[        ]+xtrn\+(0x)?3
-[       ]*[0-9a-f]+:[   ]+b0 00[        ]+movb?[        ]+\$(0x)?0,%al[         ]*[0-9a-f]+:[   ]+R_X86_64_8[   ]+xtrn
-[       ]*[0-9a-f]+:[   ]+66 b8 00 00[  ]+movw?[        ]+\$(0x)?0,%ax[         ]*[0-9a-f]+:[   ]+R_X86_64_16[  ]+xtrn
-[       ]*[0-9a-f]+:[   ]+b8( 00){4}[   ]+movl?[        ]+\$(0x)?0,%eax[        ]*[0-9a-f]+:[   ]+R_X86_64_32[  ]+xtrn
-[       ]*[0-9a-f]+:[   ]+48 c7 c0( 00){4}[     ]+movq?[        ]+\$(0x)?0,%rax[        ]*[0-9a-f]+:[   ]+R_X86_64_32S[         ]+xtrn
+0+ <_start>:
+[      ]*[a-f0-9]+:    b0 00                   mov    \$0x0,%al        1: R_X86_64_PC8 xtrn\+0x1
+[      ]*[a-f0-9]+:    66 b8 00 00             mov    \$0x0,%ax        4: R_X86_64_PC16        xtrn\+0x2
+[      ]*[a-f0-9]+:    b8 00 00 00 00          mov    \$0x0,%eax       7: R_X86_64_PC32        xtrn\+0x1
+[      ]*[a-f0-9]+:    48 c7 c0 00 00 00 00    mov    \$0x0,%rax       e: R_X86_64_PC32        xtrn\+0x3
+[      ]*[a-f0-9]+:    b0 00                   mov    \$0x0,%al        13: R_X86_64_8  xtrn
+[      ]*[a-f0-9]+:    66 b8 00 00             mov    \$0x0,%ax        16: R_X86_64_16 xtrn
+[      ]*[a-f0-9]+:    b8 00 00 00 00          mov    \$0x0,%eax       19: R_X86_64_32 xtrn
+[      ]*[a-f0-9]+:    48 c7 c0 00 00 00 00    mov    \$0x0,%rax       20: R_X86_64_32S        xtrn
+[      ]*[a-f0-9]+:    48 b8 00 00 00 00 00 00 00 00   movabs \$0x0,%rax       26: R_X86_64_64 xtrn
+[      ]*[a-f0-9]+:    48 a1 00 00 00 00 00 00 00 00   movabs 0x0,%rax 30: R_X86_64_64 xtrn
 #pass
index 0fbee46efdfe618d57f8e18470e63e2852cbfd69..f8392eee7e5bbc5fa6c19874f049391f00bed727 100644 (file)
@@ -9,3 +9,5 @@ _start:
        movw    $xtrn, %ax
        movl    $xtrn, %eax
        movq    $xtrn, %rax
+       movabs  $xtrn, %rax
+       movabsq xtrn, %rax
index dd0d74dee5c6c913c61fca0c4ee3677d202e388c..7a3fd7066931e07de88045f9f0d7d8448061e777 100644 (file)
@@ -1,3 +1,17 @@
+2011-08-01  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/13048
+       * ld-x86-64/ilp32-6.d: New.
+       * ld-x86-64/ilp32-6.s: Likewise.
+       * ld-x86-64/ilp32-7.d: Likewise.
+       * ld-x86-64/ilp32-7.s: Likewise.
+       * ld-x86-64/ilp32-8.d: Likewise.
+       * ld-x86-64/ilp32-8.s: Likewise.
+       * ld-x86-64/ilp32-9.d: Likewise.
+       * ld-x86-64/ilp32-9.s: Likewise.
+
+       * ld-x86-64/x86-64.exp: Run ilp32-6, ilp32-7, ilp32-8 and ilp32-9.
+
 2011-07-27  Roland McGrath  <mcgrathr@google.com>
 
        * ld-i386/vxworks1-lib.rd: Swap order of sections expected in output.
diff --git a/ld/testsuite/ld-x86-64/ilp32-6.d b/ld/testsuite/ld-x86-64/ilp32-6.d
new file mode 100644 (file)
index 0000000..dbd808e
--- /dev/null
@@ -0,0 +1,3 @@
+#as: --x32
+#ld: -m elf32_x86_64 -Ttext-segment 0xe0000000
+#error: .*relocation truncated to fit: R_X86_64_32S.*
diff --git a/ld/testsuite/ld-x86-64/ilp32-6.s b/ld/testsuite/ld-x86-64/ilp32-6.s
new file mode 100644 (file)
index 0000000..f49edf7
--- /dev/null
@@ -0,0 +1,3 @@
+       .globl _start
+_start:
+       mov $_start,%rax
diff --git a/ld/testsuite/ld-x86-64/ilp32-7.d b/ld/testsuite/ld-x86-64/ilp32-7.d
new file mode 100644 (file)
index 0000000..dbd808e
--- /dev/null
@@ -0,0 +1,3 @@
+#as: --x32
+#ld: -m elf32_x86_64 -Ttext-segment 0xe0000000
+#error: .*relocation truncated to fit: R_X86_64_32S.*
diff --git a/ld/testsuite/ld-x86-64/ilp32-7.s b/ld/testsuite/ld-x86-64/ilp32-7.s
new file mode 100644 (file)
index 0000000..397aba3
--- /dev/null
@@ -0,0 +1,3 @@
+       .globl _start
+_start:
+       mov _start,%rax
diff --git a/ld/testsuite/ld-x86-64/ilp32-8.d b/ld/testsuite/ld-x86-64/ilp32-8.d
new file mode 100644 (file)
index 0000000..2fe2c60
--- /dev/null
@@ -0,0 +1,13 @@
+#as: --x32
+#ld: -m elf32_x86_64 -Ttext-segment 0xe0000000
+#objdump: -dw
+
+.*: +file format elf32-x86-64
+
+
+Disassembly of section .text:
+
+e0000054 <_start>:
+[      ]*[a-f0-9]+:    48 b8 54 00 00 e0 00 00 00 00   movabs \$0xe0000054,%rax
+[      ]*[a-f0-9]+:    48 a1 54 00 00 e0 00 00 00 00   movabs 0xe0000054,%rax
+#pass
diff --git a/ld/testsuite/ld-x86-64/ilp32-8.s b/ld/testsuite/ld-x86-64/ilp32-8.s
new file mode 100644 (file)
index 0000000..c466a6c
--- /dev/null
@@ -0,0 +1,5 @@
+       .text
+       .globl _start
+_start:
+       movabs $_start,%rax
+       movabs _start,%rax
diff --git a/ld/testsuite/ld-x86-64/ilp32-9.d b/ld/testsuite/ld-x86-64/ilp32-9.d
new file mode 100644 (file)
index 0000000..8fced17
--- /dev/null
@@ -0,0 +1,9 @@
+#as: --x32
+#ld: -m elf32_x86_64 -Ttext-segment 0xe0000000
+#objdump: -s -j .text
+
+.*: +file format .*
+
+Contents of section .text:
+ e0000054 540000e0 00000000                    T.......        
+#pass
diff --git a/ld/testsuite/ld-x86-64/ilp32-9.s b/ld/testsuite/ld-x86-64/ilp32-9.s
new file mode 100644 (file)
index 0000000..432a458
--- /dev/null
@@ -0,0 +1,4 @@
+       .text
+       .globl _start
+_start:
+       .quad   _start
index bf75d00a660c7804f2c50e6e1c7d859d761ac03c..2b8721c1422c6ed779eb5a0267078718354378cc 100644 (file)
@@ -203,6 +203,10 @@ run_dump_test "ilp32-2"
 run_dump_test "ilp32-3"
 run_dump_test "ilp32-4"
 run_dump_test "ilp32-5"
+run_dump_test "ilp32-6"
+run_dump_test "ilp32-7"
+run_dump_test "ilp32-8"
+run_dump_test "ilp32-9"
 run_dump_test "ia32-1"
 run_dump_test "ia32-2"
 run_dump_test "ia32-3"
index 4e39050000c15bdf2ee72c6e18412f2c19de9a01..a5358310857efa1ded9ce5ada9d69d9d7fdd4ad3 100644 (file)
@@ -1,3 +1,8 @@
+2011-08-01  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/13048
+       * i386-dis.c (print_insn): Optimize info->mach check.
+
 2011-08-01  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR gas/13046
index 8420f55772fc60bdc2c561b6256adc9f0f84694b..6b5ccf2a7086cdd3b08bed907adb0c97a42fb8ff 100644 (file)
@@ -11161,40 +11161,19 @@ print_insn (bfd_vma pc, disassemble_info *info)
   int prefix_length;
   int default_prefixes;
 
-  if (info->mach == bfd_mach_x86_64_intel_syntax
-      || info->mach == bfd_mach_x86_64
-      || info->mach == bfd_mach_x64_32_intel_syntax
-      || info->mach == bfd_mach_x64_32
-      || info->mach == bfd_mach_l1om
-      || info->mach == bfd_mach_l1om_intel_syntax
-      || info->mach == bfd_mach_k1om
-      || info->mach == bfd_mach_k1om_intel_syntax)
-    address_mode = mode_64bit;
-  else
+  priv.orig_sizeflag = AFLAG | DFLAG;
+  if ((info->mach & bfd_mach_i386_i386) != 0)
     address_mode = mode_32bit;
-
-  if (intel_syntax == (char) -1)
-    intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
-                   || info->mach == bfd_mach_x86_64_intel_syntax
-                   || info->mach == bfd_mach_x64_32_intel_syntax
-                   || info->mach == bfd_mach_l1om_intel_syntax
-                   || info->mach == bfd_mach_k1om_intel_syntax);
-
-  if (info->mach == bfd_mach_i386_i386
-      || info->mach == bfd_mach_x86_64
-      || info->mach == bfd_mach_x64_32
-      || info->mach == bfd_mach_l1om
-      || info->mach == bfd_mach_k1om
-      || info->mach == bfd_mach_i386_i386_intel_syntax
-      || info->mach == bfd_mach_x86_64_intel_syntax
-      || info->mach == bfd_mach_x64_32_intel_syntax
-      || info->mach == bfd_mach_l1om_intel_syntax
-      || info->mach == bfd_mach_k1om_intel_syntax)
-    priv.orig_sizeflag = AFLAG | DFLAG;
   else if (info->mach == bfd_mach_i386_i8086)
-    priv.orig_sizeflag = 0;
+    {
+      address_mode = mode_16bit;
+      priv.orig_sizeflag = 0;
+    }
   else
-    abort ();
+    address_mode = mode_64bit;
+
+  if (intel_syntax == (char) -1)
+    intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
 
   for (p = info->disassembler_options; p != NULL; )
     {
@@ -11299,8 +11278,7 @@ print_insn (bfd_vma pc, disassemble_info *info)
   /* The output looks better if we put 7 bytes on a line, since that
      puts most long word instructions on a single line.  Use 8 bytes
      for Intel L1OM.  */
-  if (info->mach == bfd_mach_l1om
-      || info->mach == bfd_mach_l1om_intel_syntax)
+  if ((info->mach & bfd_mach_l1om) != 0)
     info->bytes_per_line = 8;
   else
     info->bytes_per_line = 7;