2006-05-15 Paul Brook <paul@codesourcery.com>
authorPaul Brook <paul@codesourcery.com>
Mon, 15 May 2006 20:46:24 +0000 (20:46 +0000)
committerPaul Brook <paul@codesourcery.com>
Mon, 15 May 2006 20:46:24 +0000 (20:46 +0000)
Backport from mainline.
* bfd/cpu-arm.c (bfd_is_arm_mapping_symbol_name): Rename ...
(bfd_is_arm_special_symbol_name): ... to this.  Add type argument.
Check symbol name is of specified type.
* bfd/elf32-arm.c (elf32_arm_is_target_special_symbol,
arm_elf_find_function, elf32_arm_output_symbol_hook): Use
bfd_is_arm_special_symbol_name.
* bfd/bfd-in.h (BFD_ARM_SPECIAL_SYM_TYPE_MAP,
BFD_ARM_SPECIAL_SYM_TYPE_TAG, BFD_ARM_SPECIAL_SYM_TYPE_OTHER,
BFD_ARM_SPECIAL_SYM_TYPE_ANY): Define.
(bfd_is_arm_mapping_symbol_name): Remove prototype.
(bfd_is_arm_special_symbol_name): Add prototype.
* bfd/bfd-in2.h: Regenerate.
* gas/config/tc-arm.c (arm_adjust_symtab): Use
bfd_is_arm_special_symbol_name.
* ld/testsuite/ld-arm/arm-be8.d: New test.
* ld/testsuite/ld-arm/arm-be8.s: New test.
* ld/testsuite/ld-arm/arm-elf.exp: Add arm-be8.

ChangeLog.csl
bfd/bfd-in.h
bfd/bfd-in2.h
bfd/cpu-arm.c
bfd/elf32-arm.c
gas/config/tc-arm.c
ld/testsuite/ld-arm/arm-elf.exp

index df7052b..352d0f6 100644 (file)
@@ -1,3 +1,24 @@
+2006-05-15  Paul Brook  <paul@codesourcery.com>
+
+       Backport from mainline.
+       * bfd/cpu-arm.c (bfd_is_arm_mapping_symbol_name): Rename ...
+       (bfd_is_arm_special_symbol_name): ... to this.  Add type argument.
+       Check symbol name is of specified type.
+       * bfd/elf32-arm.c (elf32_arm_is_target_special_symbol,
+       arm_elf_find_function, elf32_arm_output_symbol_hook): Use
+       bfd_is_arm_special_symbol_name.
+       * bfd/bfd-in.h (BFD_ARM_SPECIAL_SYM_TYPE_MAP,
+       BFD_ARM_SPECIAL_SYM_TYPE_TAG, BFD_ARM_SPECIAL_SYM_TYPE_OTHER,
+       BFD_ARM_SPECIAL_SYM_TYPE_ANY): Define.
+       (bfd_is_arm_mapping_symbol_name): Remove prototype.
+       (bfd_is_arm_special_symbol_name): Add prototype.
+       * bfd/bfd-in2.h: Regenerate.
+       * gas/config/tc-arm.c (arm_adjust_symtab): Use
+       bfd_is_arm_special_symbol_name.
+       * ld/testsuite/ld-arm/arm-be8.d: New test.
+       * ld/testsuite/ld-arm/arm-be8.s: New test.
+       * ld/testsuite/ld-arm/arm-elf.exp: Add arm-be8.
+
 2006-05-12  Carlos O'Donell  <carlos@codesourcery.com>
 
        * binutils/doc/binutils.texi: Rename "Index" to "Binutils Index"
index 9daa578..730cdca 100644 (file)
@@ -848,8 +848,12 @@ extern bfd_boolean bfd_elf32_arm_add_glue_sections_to_bfd
   (bfd *, struct bfd_link_info *);
 
 /* ELF ARM mapping symbol support */
-extern bfd_boolean bfd_is_arm_mapping_symbol_name
-  (const char * name);
+#define BFD_ARM_SPECIAL_SYM_TYPE_MAP   (1 << 0)
+#define BFD_ARM_SPECIAL_SYM_TYPE_TAG   (1 << 1)
+#define BFD_ARM_SPECIAL_SYM_TYPE_OTHER  (1 << 2)
+#define BFD_ARM_SPECIAL_SYM_TYPE_ANY   (~0)
+extern bfd_boolean bfd_is_arm_special_symbol_name
+  (const char * name, int type);
 
 /* ARM Note section processing.  */
 extern bfd_boolean bfd_arm_merge_machines
index de564e2..0e90052 100644 (file)
@@ -855,8 +855,12 @@ extern bfd_boolean bfd_elf32_arm_add_glue_sections_to_bfd
   (bfd *, struct bfd_link_info *);
 
 /* ELF ARM mapping symbol support */
-extern bfd_boolean bfd_is_arm_mapping_symbol_name
-  (const char * name);
+#define BFD_ARM_SPECIAL_SYM_TYPE_MAP   (1 << 0)
+#define BFD_ARM_SPECIAL_SYM_TYPE_TAG   (1 << 1)
+#define BFD_ARM_SPECIAL_SYM_TYPE_OTHER  (1 << 2)
+#define BFD_ARM_SPECIAL_SYM_TYPE_ANY   (~0)
+extern bfd_boolean bfd_is_arm_special_symbol_name
+  (const char * name, int type);
 
 /* ARM Note section processing.  */
 extern bfd_boolean bfd_arm_merge_machines
index a28a1f9..f92d83b 100644 (file)
@@ -402,14 +402,21 @@ bfd_arm_get_mach_from_notes (bfd *abfd, const char *note_section)
 }
 
 bfd_boolean
-bfd_is_arm_mapping_symbol_name (const char * name)
+bfd_is_arm_special_symbol_name (const char * name, int type)
 {
   /* The ARM compiler outputs several obsolete forms.  Recognize them
-     in addition to the standard $a, $t and $d.  */
-  return (name != NULL)
-    && (name[0] == '$')
-    && ((name[1] == 'a') || (name[1] == 't') || (name[1] == 'd')
-       || (name[1] == 'm') || (name[1] == 'f') || (name[1] == 'p'))
-    && (name[2] == 0 || name[2] == '.');
-}
+     in addition to the standard $a, $t and $d.  We are somewhat loose
+     in what we accept here, since the full set is not documented.  */
+  if (!name || name[0] != '$')
+    return FALSE;
+  if (name[1] == 'a' || name[1] == 't' || name[1] == 'd')
+    type &= BFD_ARM_SPECIAL_SYM_TYPE_MAP;
+  else if (name[1] == 'm' || name[1] == 'f' || name[1] == 'p')
+    type &= BFD_ARM_SPECIAL_SYM_TYPE_TAG;
+  else if (name[1] >= 'a' && name[1] <= 'z')
+    type &= BFD_ARM_SPECIAL_SYM_TYPE_OTHER;
+  else
+    return FALSE;
 
+  return (type != 0 && (name[2] == 0 || name[2] == '.'));
+}
index b350001..18dc0fb 100644 (file)
@@ -6110,7 +6110,8 @@ elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
 static bfd_boolean
 elf32_arm_is_target_special_symbol (bfd * abfd ATTRIBUTE_UNUSED, asymbol * sym)
 {
-  return bfd_is_arm_mapping_symbol_name (sym->name);
+  return bfd_is_arm_special_symbol_name (sym->name,
+                                        BFD_ARM_SPECIAL_SYM_TYPE_ANY);
 }
 
 /* This is a copy of elf_find_function() from elf.c except that
@@ -6146,9 +6147,10 @@ arm_elf_find_function (bfd *         abfd ATTRIBUTE_UNUSED,
        case STT_FUNC:
        case STT_ARM_TFUNC:
        case STT_NOTYPE:
-         /* Skip $a and $t symbols.  */
+         /* Skip mapping symbols.  */
          if ((q->symbol.flags & BSF_LOCAL)
-             && bfd_is_arm_mapping_symbol_name (q->symbol.name))
+             && bfd_is_arm_special_symbol_name (q->symbol.name,
+                   BFD_ARM_SPECIAL_SYM_TYPE_ANY))
            continue;
          /* Fall through.  */
          if (bfd_get_section (&q->symbol) == section
@@ -7879,7 +7881,7 @@ elf32_arm_output_symbol_hook (struct bfd_link_info *info,
     return TRUE;
 
   /* We only want mapping symbols.  */
-  if (! bfd_is_arm_mapping_symbol_name (name))
+  if (!bfd_is_arm_special_symbol_name (name, BFD_ARM_SPECIAL_SYM_TYPE_MAP))
     return TRUE;
 
   /* If this section has not been allocated an _arm_elf_section_data
index ca8fb61..0775c27 100644 (file)
@@ -18268,7 +18268,8 @@ arm_adjust_symtab (void)
          elf_sym = elf_symbol (symbol_get_bfdsym (sym));
          bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
 
-         if (! bfd_is_arm_mapping_symbol_name (elf_sym->symbol.name))
+         if (! bfd_is_arm_special_symbol_name (elf_sym->symbol.name,
+               BFD_ARM_SPECIAL_SYM_TYPE_ANY))
            {
              /* If it's a .thumb_func, declare it as so,
                 otherwise tag label as .code 16.  */
index 04aa09c..eedbe10 100644 (file)
@@ -125,6 +125,9 @@ set armelftests {
     {"MOVW/MOVT" "-static -T arm.ld" "" {arm-movwt.s}
      {{objdump -dw arm-movwt.d}}
      "arm-movwt"}
+    {"BE8 Mapping Symbols" "-static -T arm.ld -EB --be8" "-EB" {arm-be8.s}
+     {{objdump -s arm-be8.d}}
+     "arm-be8"}
 }
 
 run_ld_link_tests $armelftests