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: [GAS PATCH]: Some SunPRO compat items...


From: Hans-Peter Nilsson <hp@bitrange.com>
Date: Fri, 18 Apr 2008 09:53:48 -0400 (EDT)

> On Fri, 18 Apr 2008, David Miller wrote:
> 
> > 	* config/obj-elf.c (obj_elf_section_type): Move before
> > 	obj_elf_section_word and add 'warn' arg.
> 
> Not really an objection FWIW, but won't it work to just
> prototype it instead of moving the whole function?

Sure.

> > +   The sizth (emitted by recent SunPRO under Solaris) is
> 
> Typo.

Both issues corrected, here is the updated patch.

Thanks for your comments.

2008-04-18  David S. Miller  <davem@davemloft.net>

	* config/obj-elf.c (obj_elf_section_type): Add prototype
	before obj_elf_section_word and add 'warn' arg.
	(obj_elf_section_word): Add type pointer arg, and if no #SECTION
	is matched, try checking for #SECTION_TYPE.
	(obj_elf_section): Adjust for new args.
	(obj_elf_type_name): New function.
	(obj_elf_type): Call it, and accept STT_foo number strings
	in .type statements as output by SunPRO compiler.
	
Index: config/obj-elf.c
===================================================================
RCS file: /cvs/src/src/gas/config/obj-elf.c,v
retrieving revision 1.108
diff -u -p -r1.108 obj-elf.c
--- config/obj-elf.c	27 Oct 2007 17:45:53 -0000	1.108
+++ config/obj-elf.c	18 Apr 2008 21:22:11 -0000
@@ -781,9 +781,13 @@ obj_elf_parse_section_letters (char *str
   return attr;
 }
 
+static int obj_elf_section_type (char *, size_t, int);
+
 static int
-obj_elf_section_word (char *str, size_t len)
+obj_elf_section_word (char *str, size_t len, int *type)
 {
+  int ret;
+
   if (len == 5 && strncmp (str, "write", 5) == 0)
     return SHF_WRITE;
   if (len == 5 && strncmp (str, "alloc", 5) == 0)
@@ -801,12 +805,19 @@ obj_elf_section_word (char *str, size_t 
   }
 #endif
 
+  ret = obj_elf_section_type(str, len, 0);
+  if (ret != 0)
+    {
+      *type = ret;
+      return 0;
+    }
+
   as_warn (_("unrecognized section attribute"));
   return 0;
 }
 
 static int
-obj_elf_section_type (char *str, size_t len)
+obj_elf_section_type (char *str, size_t len, int warn)
 {
   if (len == 8 && strncmp (str, "progbits", 8) == 0)
     return SHT_PROGBITS;
@@ -829,7 +840,8 @@ obj_elf_section_type (char *str, size_t 
   }
 #endif
 
-  as_warn (_("unrecognized section type"));
+  if (warn)
+    as_warn (_("unrecognized section type"));
   return 0;
 }
 
@@ -965,14 +977,14 @@ obj_elf_section (int push)
 		      ignore_rest_of_line ();
 		      return;
 		    }
-		  type = obj_elf_section_type (beg, strlen (beg));
+		  type = obj_elf_section_type (beg, strlen (beg), 1);
 		}
 	      else if (c == '@' || c == '%')
 		{
 		  beg = ++input_line_pointer;
 		  c = get_symbol_end ();
 		  *input_line_pointer = c;
-		  type = obj_elf_section_type (beg, input_line_pointer - beg);
+		  type = obj_elf_section_type (beg, input_line_pointer - beg, 1);
 		}
 	      else
 		input_line_pointer = save;
@@ -1035,7 +1047,7 @@ obj_elf_section (int push)
 	      c = get_symbol_end ();
 	      *input_line_pointer = c;
 
-	      attr |= obj_elf_section_word (beg, input_line_pointer - beg);
+	      attr |= obj_elf_section_word (beg, input_line_pointer - beg, &type);
 
 	      SKIP_WHITESPACE ();
 	    }
@@ -1543,7 +1555,7 @@ obj_elf_size (int ignore ATTRIBUTE_UNUSE
 }
 
 /* Handle the ELF .type pseudo-op.  This sets the type of a symbol.
-   There are five syntaxes:
+   There are six syntaxes:
 
    The first (used on Solaris) is
        .type SYM,#function
@@ -1555,7 +1567,30 @@ obj_elf_size (int ignore ATTRIBUTE_UNUSE
        .type SYM,%function
    The fifth (used on SVR4/860) is
        .type SYM,"function"
+   The sixth (emitted by recent SunPRO under Solaris) is
+       .type SYM,[0-9]
+   where the integer is the STT_* value.
    */
+static char *
+obj_elf_type_name (char *cp)
+{
+  char *p;
+
+  p = input_line_pointer;
+  if (*input_line_pointer >= '0'
+      && *input_line_pointer <= '9')
+    {
+      while (*input_line_pointer >= '0'
+	     && *input_line_pointer <= '9')
+	++input_line_pointer;
+      *cp = *input_line_pointer;
+      *input_line_pointer = '\0';
+    }
+  else
+    *cp = get_symbol_end ();
+
+  return p;
+}
 
 static void
 obj_elf_type (int ignore ATTRIBUTE_UNUSED)
@@ -1584,24 +1619,28 @@ obj_elf_type (int ignore ATTRIBUTE_UNUSE
       || *input_line_pointer == '%')
     ++input_line_pointer;
 
-  typename = input_line_pointer;
-  c = get_symbol_end ();
+  typename = obj_elf_type_name (&c);
 
   type = 0;
   if (strcmp (typename, "function") == 0
-      || strcmp (typename, "STT_FUNC") == 0)
+      || strcmp (typename, "STT_FUNC") == 0
+      || strcmp (typename, "2") == 0)
     type = BSF_FUNCTION;
   else if (strcmp (typename, "object") == 0
-	   || strcmp (typename, "STT_OBJECT") == 0)
+	   || strcmp (typename, "STT_OBJECT") == 0
+	   || strcmp (typename, "1") == 0)
     type = BSF_OBJECT;
   else if (strcmp (typename, "tls_object") == 0
-	   || strcmp (typename, "STT_TLS") == 0)
+	   || strcmp (typename, "STT_TLS") == 0
+	   || strcmp (typename, "6") == 0)
     type = BSF_OBJECT | BSF_THREAD_LOCAL;
   else if (strcmp (typename, "notype") == 0
-	   || strcmp (typename, "STT_NOTYPE") == 0)
+	   || strcmp (typename, "STT_NOTYPE") == 0
+	   || strcmp (typename, "0") == 0)
     ;
   else if (strcmp (typename, "common") == 0
-	   || strcmp (typename, "STT_COMMON") == 0)
+	   || strcmp (typename, "STT_COMMON") == 0
+	   || strcmp (typename, "5") == 0)
     {
       type = BSF_OBJECT;
 


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