From 6e8bd58f83483eae7876138516e0131e82cfa369 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Thu, 15 Jul 2010 14:34:42 +0000 Subject: [PATCH] * 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. --- gas/ChangeLog | 10 ++++++ gas/config/obj-elf.c | 69 ++++++++++++++++++------------------------ gas/testsuite/ChangeLog | 7 +++++ gas/testsuite/gas/elf/elf.exp | 1 + gas/testsuite/gas/elf/pseudo.d | 2 ++ gas/testsuite/gas/elf/pseudo.l | 12 ++++++++ gas/testsuite/gas/elf/pseudo.s | 18 +++++++++++ 7 files changed, 79 insertions(+), 40 deletions(-) create mode 100644 gas/testsuite/gas/elf/pseudo.d create mode 100644 gas/testsuite/gas/elf/pseudo.l create mode 100644 gas/testsuite/gas/elf/pseudo.s diff --git a/gas/ChangeLog b/gas/ChangeLog index 7f541c5..2a0f291 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,13 @@ +2010-07-15 Rhonda Wittels + + * 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 * config/obj-coff-seh.c diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index 3ffe6e9..b123b6b 100644 --- a/gas/config/obj-elf.c +++ b/gas/config/obj-elf.c @@ -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; diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index f0ca9e0..aca2626 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2010-07-14 Rhonda Wittels + + * 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 * config/default.exp (ADDR2LINE): New. diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp index b2a29aa..55a08b1 100644 --- a/gas/testsuite/gas/elf/elf.exp +++ b/gas/testsuite/gas/elf/elf.exp @@ -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 { diff --git a/gas/testsuite/gas/elf/pseudo.d b/gas/testsuite/gas/elf/pseudo.d new file mode 100644 index 0000000..59d4801 --- /dev/null +++ b/gas/testsuite/gas/elf/pseudo.d @@ -0,0 +1,2 @@ +#name: Ill-formed directives +#error-output: pseudo.l diff --git a/gas/testsuite/gas/elf/pseudo.l b/gas/testsuite/gas/elf/pseudo.l new file mode 100644 index 0000000..605f5b8 --- /dev/null +++ b/gas/testsuite/gas/elf/pseudo.l @@ -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 "" diff --git a/gas/testsuite/gas/elf/pseudo.s b/gas/testsuite/gas/elf/pseudo.s new file mode 100644 index 0000000..971f8fb --- /dev/null +++ b/gas/testsuite/gas/elf/pseudo.s @@ -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 -- 2.7.4