include/elf/
authorRichard Sandiford <rdsandiford@googlemail.com>
Thu, 10 Jul 2008 19:05:29 +0000 (19:05 +0000)
committerRichard Sandiford <rdsandiford@googlemail.com>
Thu, 10 Jul 2008 19:05:29 +0000 (19:05 +0000)
* mips.h (ELF_ST_IS_MIPS16, ELF_ST_SET_MIPS16): New macros.

bfd/
* elfxx-mips.c (mips_elf_check_mips16_stubs): Use ELF_ST_IS_MIPS16.
(mips_elf_calculate_relocation): Likewise.
(_bfd_mips_elf_add_symbol_hook): Likewise.
(_bfd_mips_elf_finish_dynamic_symbol): Likewise.
(_bfd_mips_vxworks_finish_dynamic_symbol): Likewise.

opcodes/
* mips-dis.c (_print_insn_mips): Use ELF_ST_IS_MIPS16.

gas/
* config/tc-mips.c (mips16_mark_labels): Use ELF_ST_SET_MIPS16.
(mips_fix_adjustable): Likewise.
(mips_frob_file_after_relocs): Likewise.

gas/testsuite/
* gas/mips/mips16-vis-1.d, gas/mips/mips16-vis-1.s: New tests.
* gas/mips/mips.exp: Run them.

12 files changed:
bfd/ChangeLog
bfd/elfxx-mips.c
gas/ChangeLog
gas/config/tc-mips.c
gas/testsuite/ChangeLog
gas/testsuite/gas/mips/mips.exp
gas/testsuite/gas/mips/mips16-vis-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-vis-1.s [new file with mode: 0644]
include/elf/ChangeLog
include/elf/mips.h
opcodes/ChangeLog
opcodes/mips-dis.c

index 291aebf747724cdd53cdf59f9401edeef3f9c03d..60ba1a37a440ce3cab0ea8dfabd9a7caaca9cb39 100644 (file)
@@ -1,3 +1,11 @@
+2008-07-10  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * elfxx-mips.c (mips_elf_check_mips16_stubs): Use ELF_ST_IS_MIPS16.
+       (mips_elf_calculate_relocation): Likewise.
+       (_bfd_mips_elf_add_symbol_hook): Likewise.
+       (_bfd_mips_elf_finish_dynamic_symbol): Likewise.
+       (_bfd_mips_vxworks_finish_dynamic_symbol): Likewise.
+
 2008-07-10  Andreas Schwab  <schwab@suse.de>
 
        * elfxx-mips.c (_bfd_mips_elf_section_from_shdr): Add missing
index 08399131f591f21ab0066569c71959a2c40f6a3f..fabae69cdf34e4c20e2349a2451ebbcb32cc8060 100644 (file)
@@ -1172,7 +1172,7 @@ mips_elf_check_mips16_stubs (struct mips_elf_link_hash_entry *h,
     }
 
   if (h->call_stub != NULL
-      && h->root.other == STO_MIPS16)
+      && ELF_ST_IS_MIPS16 (h->root.other))
     {
       /* We don't need the call_stub; this is a 16 bit function, so
          calls from other 16 bit functions are OK.  Clobber the size
@@ -1184,7 +1184,7 @@ mips_elf_check_mips16_stubs (struct mips_elf_link_hash_entry *h,
     }
 
   if (h->call_fp_stub != NULL
-      && h->root.other == STO_MIPS16)
+      && ELF_ST_IS_MIPS16 (h->root.other))
     {
       /* We don't need the call_stub; this is a 16 bit function, so
          calls from other 16 bit functions are OK.  Clobber the size
@@ -4182,7 +4182,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
        }
 
       /* MIPS16 text labels should be treated as odd.  */
-      if (sym->st_other == STO_MIPS16)
+      if (ELF_ST_IS_MIPS16 (sym->st_other))
        ++symbol;
 
       /* Record the name of this symbol, for our caller.  */
@@ -4192,7 +4192,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
       if (*namep == '\0')
        *namep = bfd_section_name (input_bfd, sec);
 
-      target_is_16_bit_code_p = (sym->st_other == STO_MIPS16);
+      target_is_16_bit_code_p = ELF_ST_IS_MIPS16 (sym->st_other);
     }
   else
     {
@@ -4288,7 +4288,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
          symbol = 0;
        }
 
-      target_is_16_bit_code_p = (h->root.other == STO_MIPS16);
+      target_is_16_bit_code_p = ELF_ST_IS_MIPS16 (h->root.other);
     }
 
   /* If this is a 32- or 64-bit call to a 16-bit function with a stub, we
@@ -6121,7 +6121,7 @@ _bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
   /* If this is a mips16 text symbol, add 1 to the value to make it
      odd.  This will cause something like .word SYM to come up with
      the right value when it is loaded into the PC.  */
-  if (sym->st_other == STO_MIPS16)
+  if (ELF_ST_IS_MIPS16 (sym->st_other))
     ++*valp;
 
   return TRUE;
@@ -6144,7 +6144,7 @@ _bfd_mips_elf_link_output_symbol_hook
       && strcmp (input_sec->name, ".scommon") == 0)
     sym->st_shndx = SHN_MIPS_SCOMMON;
 
-  if (sym->st_other == STO_MIPS16)
+  if (ELF_ST_IS_MIPS16 (sym->st_other))
     sym->st_value &= ~1;
 
   return TRUE;
@@ -8721,7 +8721,7 @@ _bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
     }
 
   /* If this is a mips16 symbol, force the value to be even.  */
-  if (sym->st_other == STO_MIPS16)
+  if (ELF_ST_IS_MIPS16 (sym->st_other))
     sym->st_value &= ~1;
 
   return TRUE;
@@ -8893,7 +8893,7 @@ _bfd_mips_vxworks_finish_dynamic_symbol (bfd *output_bfd,
     }
 
   /* If this is a mips16 symbol, force the value to be even.  */
-  if (sym->st_other == STO_MIPS16)
+  if (ELF_ST_IS_MIPS16 (sym->st_other))
     sym->st_value &= ~1;
 
   return TRUE;
index 16ee4def211d47206d9aaf5ba9433af8d4d6732d..447c152923d42b80cfbe9998125deafcda5f3089 100644 (file)
@@ -1,3 +1,9 @@
+2008-07-10  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * config/tc-mips.c (mips16_mark_labels): Use ELF_ST_SET_MIPS16.
+       (mips_fix_adjustable): Likewise.
+       (mips_frob_file_after_relocs): Likewise.
+
 2008-07-08  Nathan Sidwell  <nathan@codesourcery.com>
 
        * config/tc-m68k.c (m68k_set_cpu, m68k_set_arch): Don't complain
index d5ed84ceb2bedf9dc40125b65e54b2225c847dc5..d12d3c412b6097c7adb7969dd134c89894d6c09b 100644 (file)
@@ -2321,7 +2321,7 @@ mips16_mark_labels (void)
 
 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
       if (IS_ELF)
-       S_SET_OTHER (label, STO_MIPS16);
+       S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
 #endif
       if ((S_GET_VALUE (label) & 1) == 0
        /* Don't adjust the address if the label is global or weak, or
@@ -13976,7 +13976,7 @@ mips_fix_adjustable (fixS *fixp)
      that we have for MIPS16 symbols.  */
   if (IS_ELF
       && fixp->fx_subsy == NULL
-      && (S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16
+      && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
          || *symbol_get_tc (fixp->fx_addsy)))
     return 0;
 #endif
@@ -14453,7 +14453,7 @@ mips_frob_file_after_relocs (void)
   count = bfd_get_symcount (stdoutput);
   for (i = 0; i < count; i++, syms++)
     {
-      if (elf_symbol (*syms)->internal_elf_sym.st_other == STO_MIPS16
+      if (ELF_ST_IS_MIPS16 (elf_symbol (*syms)->internal_elf_sym.st_other)
          && ((*syms)->value & 1) != 0)
        {
          (*syms)->value &= ~1;
index d3cead1b6a947fb2d5e36ddbf4944dd8340be97d..680badd06e59560d31939de55c98f49eb8c1dce0 100644 (file)
@@ -1,3 +1,8 @@
+2008-07-10  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * gas/mips/mips16-vis-1.d, gas/mips/mips16-vis-1.s: New tests.
+       * gas/mips/mips.exp: Run them.
+
 2008-07-09  Kai Tietz  <kai.tietz@onevision.com>
 
        * gas/i386/i386.exp (x86-64-pcrel): Disable for w64.
index 8ee4646ecf0495a5141bdd258fbceea1a9159619..16edfb73a9bab35a91413e3195c35025ce06e9cd 100644 (file)
@@ -827,4 +827,6 @@ if { [istarget mips*-*-vxworks*] } {
     run_list_test_arches "mips-double-float-flag" \
        "-32 -msingle-float -mdouble-float" \
                                        [mips_arch_list_matching mips1]
+
+    run_dump_test "mips16-vis-1"
 }
diff --git a/gas/testsuite/gas/mips/mips16-vis-1.d b/gas/testsuite/gas/mips/mips16-vis-1.d
new file mode 100644 (file)
index 0000000..7cdce48
--- /dev/null
@@ -0,0 +1,3 @@
+# readelf: --symbols
+#...
+.*: 0+0 * 2 * FUNC * GLOBAL * HIDDEN \[MIPS16\] * [0-9]+ foo
diff --git a/gas/testsuite/gas/mips/mips16-vis-1.s b/gas/testsuite/gas/mips/mips16-vis-1.s
new file mode 100644 (file)
index 0000000..01cb1ba
--- /dev/null
@@ -0,0 +1,7 @@
+       .set    mips16
+       .globl  foo
+       .hidden foo
+       .ent    foo
+foo:
+       nop
+       .end    foo
index 9fc0fd8369f9453e464efe6257d02eb8805fc7af..9f6198255d36bc83d6d7f1edb063d9934badc625 100644 (file)
@@ -1,3 +1,7 @@
+2008-07-10  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * mips.h (ELF_ST_IS_MIPS16, ELF_ST_SET_MIPS16): New macros.
+
 2008-06-18  M R Swami Reddy <MR.Swami.Reddy@nsc.com>
 
        * common.h (EM_CR16): Correct value.
index 55ecfb3c0408416e33382c56dfadc3bb065560bd..474f54ff4e803f1e1fbde632fc89283630feb9f1 100644 (file)
@@ -725,6 +725,8 @@ extern void bfd_mips_elf32_swap_reginfo_out
 
 /* This value is used for a mips16 .text symbol.  */
 #define STO_MIPS16             0xf0
+#define ELF_ST_IS_MIPS16(OTHER) (((OTHER) & 0xf0) == STO_MIPS16)
+#define ELF_ST_SET_MIPS16(OTHER) (((OTHER) & ~0xf0) | STO_MIPS16)
 
 /* This bit is used on Irix to indicate a symbol whose definition
    is optional - if, at final link time, it cannot be found, no
index 762c7247ac94f86638ae16c0f7848fae8550732a..4110c10dfa0e3a7931152f7319bc87fae0d3386b 100644 (file)
@@ -1,3 +1,7 @@
+2008-07-10  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * mips-dis.c (_print_insn_mips): Use ELF_ST_IS_MIPS16.
+
 2008-07-07  Adam Nemet  <anemet@caviumnetworks.com>
 
        * mips-opc.c (CP): New macro.
index 35a51191525903913eef8c9b7b1212d16ac79106..744d5a92bcbb6cd5b17ab17ba960428f4d4e9c3c 100644 (file)
@@ -2068,8 +2068,8 @@ _print_insn_mips (bfd_vma memaddr,
   if (info->mach == bfd_mach_mips16
       || (info->symbols != NULL
          && bfd_asymbol_flavour (*info->symbols) == bfd_target_elf_flavour
-         && ((*(elf_symbol_type **) info->symbols)->internal_elf_sym.st_other
-             == STO_MIPS16)))
+         && ELF_ST_IS_MIPS16 ((*(elf_symbol_type **) info->symbols)
+                              ->internal_elf_sym.st_other)))
     return print_insn_mips16 (memaddr, info);
 #endif