* config/obj-elf.c (get_sym_from_input_line_and_check): New

function to catch missing pseudo-op arguments.
	(obj_elf_local): Call new function.
	(obj_elf_weak): Likewise.
	(obj_elf_visibility): Likewise.
	(obj_elf_vtable_entry): Likewise.
	(obj_elf_type): Likewise.

	testsuite/
	* gas/elf/pseudo.s: New.
	* gas/elf/pseudo.l: New.
	* gas/elf/pseudo.d: New.
	* gas/elf/elf.exp: Run the new test.
This commit is contained in:
Nathan Sidwell 2010-07-15 14:34:42 +00:00
parent 1e17085dea
commit 6e8bd58f83
7 changed files with 79 additions and 40 deletions

View File

@ -1,3 +1,13 @@
2010-07-15 Rhonda Wittels <rhonda@codesourcery.com>
* config/obj-elf.c (get_sym_from_input_line_and_check): New
function to catch missing pseudo-op arguments.
(obj_elf_local): Call new function.
(obj_elf_weak): Likewise.
(obj_elf_visibility): Likewise.
(obj_elf_vtable_entry): Likewise.
(obj_elf_type): Likewise.
2010-07-15 Kai Tietz <kai.tietz@onevision.com>
* config/obj-coff-seh.c

View File

@ -393,20 +393,35 @@ obj_elf_lcomm (int ignore ATTRIBUTE_UNUSED)
symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
}
static symbolS *
get_sym_from_input_line_and_check (void)
{
char *name;
char c;
symbolS *sym;
name = input_line_pointer;
c = get_symbol_end ();
sym = symbol_find_or_make (name);
*input_line_pointer = c;
SKIP_WHITESPACE ();
/* There is no symbol name if input_line_pointer has not moved. */
if (name == input_line_pointer)
as_bad (_("Missing symbol name in directive"));
return sym;
}
static void
obj_elf_local (int ignore ATTRIBUTE_UNUSED)
{
char *name;
int c;
symbolS *symbolP;
do
{
name = input_line_pointer;
c = get_symbol_end ();
symbolP = symbol_find_or_make (name);
*input_line_pointer = c;
SKIP_WHITESPACE ();
symbolP = get_sym_from_input_line_and_check ();
c = *input_line_pointer;
S_CLEAR_EXTERNAL (symbolP);
symbol_get_obj (symbolP)->local = 1;
if (c == ',')
@ -424,17 +439,13 @@ obj_elf_local (int ignore ATTRIBUTE_UNUSED)
static void
obj_elf_weak (int ignore ATTRIBUTE_UNUSED)
{
char *name;
int c;
symbolS *symbolP;
do
{
name = input_line_pointer;
c = get_symbol_end ();
symbolP = symbol_find_or_make (name);
*input_line_pointer = c;
SKIP_WHITESPACE ();
symbolP = get_sym_from_input_line_and_check ();
c = *input_line_pointer;
S_SET_WEAK (symbolP);
symbol_get_obj (symbolP)->local = 1;
if (c == ',')
@ -452,7 +463,6 @@ obj_elf_weak (int ignore ATTRIBUTE_UNUSED)
static void
obj_elf_visibility (int visibility)
{
char *name;
int c;
symbolS *symbolP;
asymbol *bfdsym;
@ -460,12 +470,7 @@ obj_elf_visibility (int visibility)
do
{
name = input_line_pointer;
c = get_symbol_end ();
symbolP = symbol_find_or_make (name);
*input_line_pointer = c;
SKIP_WHITESPACE ();
symbolP = get_sym_from_input_line_and_check ();
bfdsym = symbol_get_bfdsym (symbolP);
elfsym = elf_symbol_from (bfd_asymbol_bfd (bfdsym), bfdsym);
@ -475,6 +480,7 @@ obj_elf_visibility (int visibility)
elfsym->internal_elf_sym.st_other &= ~3;
elfsym->internal_elf_sym.st_other |= visibility;
c = *input_line_pointer;
if (c == ',')
{
input_line_pointer ++;
@ -1242,14 +1248,8 @@ obj_elf_symver (int ignore ATTRIBUTE_UNUSED)
char old_lexat;
symbolS *sym;
name = input_line_pointer;
c = get_symbol_end ();
sym = get_sym_from_input_line_and_check ();
sym = symbol_find_or_make (name);
*input_line_pointer = c;
SKIP_WHITESPACE ();
if (*input_line_pointer != ',')
{
as_bad (_("expected comma after name in .symver"));
@ -1378,20 +1378,13 @@ obj_elf_vtable_inherit (int ignore ATTRIBUTE_UNUSED)
struct fix *
obj_elf_vtable_entry (int ignore ATTRIBUTE_UNUSED)
{
char *name;
symbolS *sym;
offsetT offset;
char c;
if (*input_line_pointer == '#')
++input_line_pointer;
name = input_line_pointer;
c = get_symbol_end ();
sym = symbol_find_or_make (name);
*input_line_pointer = c;
SKIP_WHITESPACE ();
sym = get_sym_from_input_line_and_check ();
if (*input_line_pointer != ',')
{
as_bad (_("expected comma after name in .vtable_entry"));
@ -1613,20 +1606,16 @@ obj_elf_type_name (char *cp)
static void
obj_elf_type (int ignore ATTRIBUTE_UNUSED)
{
char *name;
char c;
int type;
const char *type_name;
symbolS *sym;
elf_symbol_type *elfsym;
name = input_line_pointer;
c = get_symbol_end ();
sym = symbol_find_or_make (name);
sym = get_sym_from_input_line_and_check ();
c = *input_line_pointer;
elfsym = (elf_symbol_type *) symbol_get_bfdsym (sym);
*input_line_pointer = c;
SKIP_WHITESPACE ();
if (*input_line_pointer == ',')
++input_line_pointer;

View File

@ -1,3 +1,10 @@
2010-07-14 Rhonda Wittels <rhonda@codesourcery.com>
* gas/elf/pseudo.s: New.
* gas/elf/pseudo.l: New.
* gas/elf/pseudo.d: New.
* gas/elf/elf.exp: Run the new test.
2010-07-14 H.J. Lu <hongjiu.lu@intel.com>
* config/default.exp (ADDR2LINE): New.

View File

@ -127,6 +127,7 @@ if { ([istarget "*-*-*elf*"]
run_dump_test equ-reloc
}
}
run_dump_test "pseudo"
run_dump_test "section0"
run_dump_test "section1"
if {! [istarget "h8300-*-*"]} then {

View File

@ -0,0 +1,2 @@
#name: Ill-formed directives
#error-output: pseudo.l

View File

@ -0,0 +1,12 @@
[^:]*: Assembler messages:
[^:]*:2: Error: Missing symbol name in directive
[^:]*:4: Error: Missing symbol name in directive
[^:]*:6: Error: Missing symbol name in directive
[^:]*:8: Error: Missing symbol name in directive
[^:]*:10: Error: Missing symbol name in directive
[^:]*:12: Error: Missing symbol name in directive
[^:]*:14: Error: Missing symbol name in directive
[^:]*:14: Error: expected comma after name in .symver
[^:]*:16: Error: Missing symbol name in directive
[^:]*:18: Error: Missing symbol name in directive
[^:]*:18: Error: unrecognized symbol type ""

View File

@ -0,0 +1,18 @@
.hidden h1n1
.hidden
# next line has spaces
.hidden
# next line has tabs
.hidden
.internal i2
.internal
.protected porpoise
.protected
.local foo
.local
.symver foo, foo@version1
.symver
.weak wimp
.weak
.type foo1,object
.type