* 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.
This commit is contained in:
Nick Clifton 2008-04-23 13:54:56 +00:00
parent 09d71d234a
commit 44bf236263
2 changed files with 69 additions and 33 deletions

View File

@ -782,31 +782,7 @@ obj_elf_parse_section_letters (char *str, size_t len)
} }
static int static int
obj_elf_section_word (char *str, size_t len) obj_elf_section_type (char *str, size_t len, bfd_boolean warn)
{
if (len == 5 && strncmp (str, "write", 5) == 0)
return SHF_WRITE;
if (len == 5 && strncmp (str, "alloc", 5) == 0)
return SHF_ALLOC;
if (len == 9 && strncmp (str, "execinstr", 9) == 0)
return SHF_EXECINSTR;
if (len == 3 && strncmp (str, "tls", 3) == 0)
return SHF_TLS;
#ifdef md_elf_section_word
{
int md_attr = md_elf_section_word (str, len);
if (md_attr >= 0)
return md_attr;
}
#endif
as_warn (_("unrecognized section attribute"));
return 0;
}
static int
obj_elf_section_type (char *str, size_t len)
{ {
if (len == 8 && strncmp (str, "progbits", 8) == 0) if (len == 8 && strncmp (str, "progbits", 8) == 0)
return SHT_PROGBITS; return SHT_PROGBITS;
@ -829,7 +805,39 @@ obj_elf_section_type (char *str, size_t len)
} }
#endif #endif
as_warn (_("unrecognized section type")); if (warn)
as_warn (_("unrecognized section type"));
return 0;
}
static int
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)
return SHF_ALLOC;
if (len == 9 && strncmp (str, "execinstr", 9) == 0)
return SHF_EXECINSTR;
if (len == 3 && strncmp (str, "tls", 3) == 0)
return SHF_TLS;
#ifdef md_elf_section_word
{
int md_attr = md_elf_section_word (str, len);
if (md_attr >= 0)
return md_attr;
}
#endif
ret = obj_elf_section_type (str, len, FALSE);
if (ret != 0)
*type = ret;
else
as_warn (_("unrecognized section attribute"));
return 0; return 0;
} }
@ -965,14 +973,14 @@ obj_elf_section (int push)
ignore_rest_of_line (); ignore_rest_of_line ();
return; return;
} }
type = obj_elf_section_type (beg, strlen (beg)); type = obj_elf_section_type (beg, strlen (beg), TRUE);
} }
else if (c == '@' || c == '%') else if (c == '@' || c == '%')
{ {
beg = ++input_line_pointer; beg = ++input_line_pointer;
c = get_symbol_end (); c = get_symbol_end ();
*input_line_pointer = c; *input_line_pointer = c;
type = obj_elf_section_type (beg, input_line_pointer - beg); type = obj_elf_section_type (beg, input_line_pointer - beg, TRUE);
} }
else else
input_line_pointer = save; input_line_pointer = save;
@ -1035,7 +1043,7 @@ obj_elf_section (int push)
c = get_symbol_end (); c = get_symbol_end ();
*input_line_pointer = c; *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 (); SKIP_WHITESPACE ();
} }
@ -1543,7 +1551,7 @@ obj_elf_size (int ignore ATTRIBUTE_UNUSED)
} }
/* Handle the ELF .type pseudo-op. This sets the type of a symbol. /* 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 The first (used on Solaris) is
.type SYM,#function .type SYM,#function
@ -1555,8 +1563,32 @@ obj_elf_size (int ignore ATTRIBUTE_UNUSED)
.type SYM,%function .type SYM,%function
The fifth (used on SVR4/860) is The fifth (used on SVR4/860) is
.type SYM,"function" .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 static void
obj_elf_type (int ignore ATTRIBUTE_UNUSED) obj_elf_type (int ignore ATTRIBUTE_UNUSED)
{ {
@ -1584,23 +1616,27 @@ obj_elf_type (int ignore ATTRIBUTE_UNUSED)
|| *input_line_pointer == '%') || *input_line_pointer == '%')
++input_line_pointer; ++input_line_pointer;
typename = input_line_pointer; typename = obj_elf_type_name (& c);
c = get_symbol_end ();
type = 0; type = 0;
if (strcmp (typename, "function") == 0 if (strcmp (typename, "function") == 0
|| strcmp (typename, "2") == 0
|| strcmp (typename, "STT_FUNC") == 0) || strcmp (typename, "STT_FUNC") == 0)
type = BSF_FUNCTION; type = BSF_FUNCTION;
else if (strcmp (typename, "object") == 0 else if (strcmp (typename, "object") == 0
|| strcmp (typename, "1") == 0
|| strcmp (typename, "STT_OBJECT") == 0) || strcmp (typename, "STT_OBJECT") == 0)
type = BSF_OBJECT; type = BSF_OBJECT;
else if (strcmp (typename, "tls_object") == 0 else if (strcmp (typename, "tls_object") == 0
|| strcmp (typename, "6") == 0
|| strcmp (typename, "STT_TLS") == 0) || strcmp (typename, "STT_TLS") == 0)
type = BSF_OBJECT | BSF_THREAD_LOCAL; type = BSF_OBJECT | BSF_THREAD_LOCAL;
else if (strcmp (typename, "notype") == 0 else if (strcmp (typename, "notype") == 0
|| strcmp (typename, "0") == 0
|| strcmp (typename, "STT_NOTYPE") == 0) || strcmp (typename, "STT_NOTYPE") == 0)
; ;
else if (strcmp (typename, "common") == 0 else if (strcmp (typename, "common") == 0
|| strcmp (typename, "5") == 0
|| strcmp (typename, "STT_COMMON") == 0) || strcmp (typename, "STT_COMMON") == 0)
{ {
type = BSF_OBJECT; type = BSF_OBJECT;

View File

@ -9819,7 +9819,7 @@ do_t_mrs (void)
{ {
constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1), constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1),
_("selected processor does not support " _("selected processor does not support "
"requested special purpose register %x")); "requested special purpose register"));
/* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all. */ /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all. */
constraint ((flags & ~SPSR_BIT) != (PSR_c|PSR_f), constraint ((flags & ~SPSR_BIT) != (PSR_c|PSR_f),
_("'CPSR' or 'SPSR' expected")); _("'CPSR' or 'SPSR' expected"));