From 21be61f5885f889c05f0bc9c36125a68e4995810 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 16 Mar 2011 12:58:26 +0000 Subject: [PATCH] Add --size-check=[error|warning]. gas/ 2011-03-16 H.J. Lu * as.c (show_usage): Add --size-check=. (parse_args): Add and handle OPTION_SIZE_CHECK. * as.h (flag_size_check): New. * config/obj-elf.c (elf_frob_symbol): Use as_bad to report bad .size directive only for --size-check=error. * doc/as.texinfo: Document --size-check=. gas/testsuite/ 2011-03-16 H.J. Lu * gas/i386/bad-size.d: New. * gas/i386/bad-size.s: Likewise. * gas/i386/bad-size.warn: Likewise. * gas/i386/i386.exp: Run bad-size for ELF targets. --- gas/ChangeLog | 12 ++++++++++++ gas/as.c | 14 ++++++++++++++ gas/as.h | 10 ++++++++++ gas/config/obj-elf.c | 20 ++++++++++++++------ gas/doc/as.texinfo | 5 +++++ gas/testsuite/ChangeLog | 8 ++++++++ gas/testsuite/gas/i386/bad-size.d | 18 ++++++++++++++++++ gas/testsuite/gas/i386/bad-size.s | 6 ++++++ gas/testsuite/gas/i386/bad-size.warn | 2 ++ gas/testsuite/gas/i386/i386.exp | 2 ++ 10 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 gas/testsuite/gas/i386/bad-size.d create mode 100644 gas/testsuite/gas/i386/bad-size.s create mode 100644 gas/testsuite/gas/i386/bad-size.warn diff --git a/gas/ChangeLog b/gas/ChangeLog index ecbe9ec..df7ecd5 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,15 @@ +2011-03-16 H.J. Lu + + * as.c (show_usage): Add --size-check=. + (parse_args): Add and handle OPTION_SIZE_CHECK. + + * as.h (flag_size_check): New. + + * config/obj-elf.c (elf_frob_symbol): Use as_bad to report + bad .size directive only for --size-check=error. + + * doc/as.texinfo: Document --size-check=. + 2011-03-14 Mike Frysinger * config/tc-bfin.c (bfin_cpus[]): Add 0.4 for diff --git a/gas/as.c b/gas/as.c index 2c55047..380259c 100644 --- a/gas/as.c +++ b/gas/as.c @@ -284,6 +284,9 @@ Options:\n\ --execstack require executable stack for this object\n")); fprintf (stream, _("\ --noexecstack don't require executable stack for this object\n")); + fprintf (stream, _("\ + --size-check=[error|warning]\n\ + ELF .size directive check (default --size-check=error)\n")); #endif fprintf (stream, _("\ -f skip whitespace and comment preprocessing\n")); @@ -443,6 +446,7 @@ parse_args (int * pargc, char *** pargv) OPTION_TARGET_HELP, OPTION_EXECSTACK, OPTION_NOEXECSTACK, + OPTION_SIZE_CHECK, OPTION_ALTERNATE, OPTION_AL, OPTION_HASH_TABLE_SIZE, @@ -476,6 +480,7 @@ parse_args (int * pargc, char *** pargv) #if defined OBJ_ELF || defined OBJ_MAYBE_ELF ,{"execstack", no_argument, NULL, OPTION_EXECSTACK} ,{"noexecstack", no_argument, NULL, OPTION_NOEXECSTACK} + ,{"size-check", required_argument, NULL, OPTION_SIZE_CHECK} #endif ,{"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL} ,{"gdwarf-2", no_argument, NULL, OPTION_GDWARF2} @@ -813,6 +818,15 @@ This program has absolutely no warranty.\n")); flag_noexecstack = 1; flag_execstack = 0; break; + + case OPTION_SIZE_CHECK: + if (strcasecmp (optarg, "error") == 0) + flag_size_check = size_check_error; + else if (strcasecmp (optarg, "warning") == 0) + flag_size_check = size_check_warning; + else + as_fatal (_("Invalid --size-check= option: `%s'"), optarg); + break; #endif case 'Z': flag_always_generate_output = 1; diff --git a/gas/as.h b/gas/as.h index 7c16382..5408e1a 100644 --- a/gas/as.h +++ b/gas/as.h @@ -575,6 +575,16 @@ COMMON unsigned int found_comment; COMMON char * found_comment_file; #endif +#if defined OBJ_ELF || defined OBJ_MAYBE_ELF +/* If .size directive failure should be error or warning. */ +COMMON enum + { + size_check_error = 0, + size_check_warning + } +flag_size_check; +#endif + #ifndef DOLLAR_AMBIGU #define DOLLAR_AMBIGU 0 #endif diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index d43409a..37a8020 100644 --- a/gas/config/obj-elf.c +++ b/gas/config/obj-elf.c @@ -1898,6 +1898,12 @@ elf_frob_symbol (symbolS *symp, int *puntp) { const char *op_name = NULL; const char *add_name = NULL; + PRINTF_LIKE ((*as_error)); + + if (flag_size_check == size_check_error) + as_error = as_bad; + else + as_error = as_warn; if (size->X_op == O_subtract) { @@ -1909,9 +1915,9 @@ elf_frob_symbol (symbolS *symp, int *puntp) add_name = NULL; if (op_name && add_name) - as_bad (_(".size expression with symbols `%s' and `%s' " - "does not evaluate to a constant"), - op_name, add_name); + as_error (_(".size expression with symbols `%s' and " + "`%s' does not evaluate to a constant"), + op_name, add_name); else { const char *name; @@ -1924,13 +1930,15 @@ elf_frob_symbol (symbolS *symp, int *puntp) name = NULL; if (name) - as_bad (_(".size expression with symbol `%s' " - "does not evaluate to a constant"), name); + as_error (_(".size expression with symbol `%s' " + "does not evaluate to a constant"), + name); } } if (!op_name && !add_name) - as_bad (_(".size expression does not evaluate to a constant")); + as_error (_(".size expression does not evaluate to a " + "constant")); } free (sy_obj->size); sy_obj->size = NULL; diff --git a/gas/doc/as.texinfo b/gas/doc/as.texinfo index 748c96c..bb7f063 100644 --- a/gas/doc/as.texinfo +++ b/gas/doc/as.texinfo @@ -243,6 +243,7 @@ gcc(1), ld(1), and the Info entries for @file{binutils} and @file{ld}. @var{objfile}] [@b{-R}] [@b{--reduce-memory-overheads}] [@b{--statistics}] [@b{-v}] [@b{-version}] [@b{--version}] [@b{-W}] [@b{--warn}] [@b{--fatal-warnings}] [@b{-w}] [@b{-x}] [@b{-Z}] [@b{@@@var{FILE}}] + [@b{--size-check=[error|warning]}] [@b{--target-help}] [@var{target-options}] [@b{--}|@var{files} @dots{}] @c @@ -611,6 +612,10 @@ Generate DWARF2 debugging information for each assembler line. This may help debugging assembler code, if the debugger can handle it. Note---this option is only supported by some targets, not all of them. +@item --size-check=error +@itemx --size-check=warning +Issue an error or warning for invalid ELF .size directive. + @item --help Print a summary of the command line options and exit. diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 2ec9fdb..6634781 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2011-03-16 H.J. Lu + + * gas/i386/bad-size.d: New. + * gas/i386/bad-size.s: Likewise. + * gas/i386/bad-size.warn: Likewise. + + * gas/i386/i386.exp: Run bad-size for ELF targets. + 2011-03-06 H.J. Lu * gas/elf/bad-size.err: Revert the last change. diff --git a/gas/testsuite/gas/i386/bad-size.d b/gas/testsuite/gas/i386/bad-size.d new file mode 100644 index 0000000..0bcf381 --- /dev/null +++ b/gas/testsuite/gas/i386/bad-size.d @@ -0,0 +1,18 @@ +#as: --size-check=warning +#objdump: -dw +#name: Check bad size directive +#error-output: bad-size.warn + +.*: +file format .* + + +Disassembly of section .text: + +0+ <_test_nop>: +[ ]*[a-f0-9]+: 90 nop + +Disassembly of section .text.entry.continue: + +0+ <.text.entry.continue>: +[ ]*[a-f0-9]+: 90 nop +#pass diff --git a/gas/testsuite/gas/i386/bad-size.s b/gas/testsuite/gas/i386/bad-size.s new file mode 100644 index 0000000..6e02eef --- /dev/null +++ b/gas/testsuite/gas/i386/bad-size.s @@ -0,0 +1,6 @@ + .text +_test_nop: + nop + .section .text.entry.continue, "xa" + nop + .size _test_nop, .-_test_nop diff --git a/gas/testsuite/gas/i386/bad-size.warn b/gas/testsuite/gas/i386/bad-size.warn new file mode 100644 index 0000000..149b3c0 --- /dev/null +++ b/gas/testsuite/gas/i386/bad-size.warn @@ -0,0 +1,2 @@ +.*bad-size\.s: Assembler messages: +.*bad-size\.s:6: Warning: .* diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp index 306da65..ea5cdac 100644 --- a/gas/testsuite/gas/i386/i386.exp +++ b/gas/testsuite/gas/i386/i386.exp @@ -228,6 +228,8 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_32_check]] run_dump_test "debug1" run_dump_test "dw2-compress-2" + + run_dump_test "bad-size" } # This is a PE specific test. -- 2.7.4