This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
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;