This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] Arm BE8 mode and mapping sybols


> There have only ever been three mapping symbols: $a, $t and $d.  The
> remainder have always been 'tagging' symbols.  Maybe the routine should
> be renamed to bfd_is_arm_special_symbol name and then given an argument
> TYPE_MAP, TYPE_TAG or TYPE_ANY.

Something like this?

Paul

2006-05-09  Paul Brook  <paul@codesourcery.com>

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.
	* 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-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-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-arm/arm-be8.s: New test.
	* ld-arm/arm-elf.exp: Add arm-be8.
Index: bfd/bfd-in.h
===================================================================
RCS file: /var/cvsroot/src-cvs/src/bfd/bfd-in.h,v
retrieving revision 1.114
diff -u -p -r1.114 bfd-in.h
--- bfd/bfd-in.h	1 May 2006 19:36:27 -0000	1.114
+++ bfd/bfd-in.h	9 May 2006 13:26:52 -0000
@@ -850,8 +850,12 @@ extern bfd_boolean bfd_elf32_arm_add_glu
   (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
+#define BFD_ARM_SPECIAL_SYM_TYPE_TAG	2
+#define BFD_ARM_SPECIAL_SYM_TYPE_OTHER  4
+#define BFD_ARM_SPECIAL_SYM_TYPE_ANY	7
+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: bfd/cpu-arm.c
===================================================================
RCS file: /var/cvsroot/src-cvs/src/bfd/cpu-arm.c,v
retrieving revision 1.21
diff -u -p -r1.21 cpu-arm.c
--- bfd/cpu-arm.c	4 May 2006 18:15:21 -0000	1.21
+++ bfd/cpu-arm.c	9 May 2006 13:26:52 -0000
@@ -402,14 +402,22 @@ bfd_arm_get_mach_from_notes (bfd *abfd, 
 }
 
 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.  We are somewhat loose
      in what we accept here, since the full set is not documented.  */
-  return (name != NULL)
-    && (name[0] == '$')
-    && (name[1] >= 'a' && name[1] <= 'z')
-    && (name[2] == 0 || name[2] == '.');
+  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: bfd/elf32-arm.c
===================================================================
RCS file: /var/cvsroot/src-cvs/src/bfd/elf32-arm.c,v
retrieving revision 1.73
diff -u -p -r1.73 elf32-arm.c
--- bfd/elf32-arm.c	3 May 2006 14:26:40 -0000	1.73
+++ bfd/elf32-arm.c	9 May 2006 13:26:52 -0000
@@ -6021,7 +6021,8 @@ elf32_arm_check_relocs (bfd *abfd, struc
 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
@@ -6057,9 +6058,10 @@ arm_elf_find_function (bfd *         abf
 	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
@@ -7790,7 +7792,7 @@ elf32_arm_output_symbol_hook (struct bfd
     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: gas/config/tc-arm.c
===================================================================
RCS file: /var/cvsroot/src-cvs/src/gas/config/tc-arm.c,v
retrieving revision 1.265
diff -u -p -r1.265 tc-arm.c
--- gas/config/tc-arm.c	5 May 2006 18:54:44 -0000	1.265
+++ gas/config/tc-arm.c	9 May 2006 13:26:52 -0000
@@ -17171,7 +17171,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: ld/testsuite/ld-arm/arm-be8.d
===================================================================
RCS file: ld/testsuite/ld-arm/arm-be8.d
diff -N ld/testsuite/ld-arm/arm-be8.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-arm/arm-be8.d	9 May 2006 15:19:17 -0000
@@ -0,0 +1,8 @@
+
+.*:     file format.*
+
+Contents of section .text:
+ 8000 0000a0e3 1eff2fe1 c0467047 fff7fcff .*
+ 8010 12345678                            .*
+# Ignore .ARM.attributes section
+#...
Index: ld/testsuite/ld-arm/arm-be8.s
===================================================================
RCS file: ld/testsuite/ld-arm/arm-be8.s
diff -N ld/testsuite/ld-arm/arm-be8.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-arm/arm-be8.s	9 May 2006 15:19:17 -0000
@@ -0,0 +1,14 @@
+.arch armv6
+.text
+arm:
+mov r0, #0
+$m:
+bx lr
+.thumb
+.thumb_func
+thumb:
+nop
+bx lr
+bl thumb
+data:
+.word 0x12345678
Index: ld/testsuite/ld-arm/arm-elf.exp
===================================================================
RCS file: /var/cvsroot/src-cvs/src/ld/testsuite/ld-arm/arm-elf.exp,v
retrieving revision 1.12
diff -u -p -r1.12 arm-elf.exp
--- ld/testsuite/ld-arm/arm-elf.exp	2 May 2006 13:09:18 -0000	1.12
+++ ld/testsuite/ld-arm/arm-elf.exp	9 May 2006 13:26:52 -0000
@@ -122,6 +122,9 @@ set armelftests {
     {"thumb-rel32" "-static -T arm.ld" "" {thumb-rel32.s}
      {{objdump -s thumb-rel32.d}}
      "thumb-rel32"}
+    {"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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]