Add --size-check=[error|warning].
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 16 Mar 2011 12:58:26 +0000 (12:58 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 16 Mar 2011 12:58:26 +0000 (12:58 +0000)
gas/

2011-03-16  H.J. Lu  <hongjiu.lu@intel.com>

* 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  <hongjiu.lu@intel.com>

* 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
gas/as.c
gas/as.h
gas/config/obj-elf.c
gas/doc/as.texinfo
gas/testsuite/ChangeLog
gas/testsuite/gas/i386/bad-size.d [new file with mode: 0644]
gas/testsuite/gas/i386/bad-size.s [new file with mode: 0644]
gas/testsuite/gas/i386/bad-size.warn [new file with mode: 0644]
gas/testsuite/gas/i386/i386.exp

index ecbe9ec..df7ecd5 100644 (file)
@@ -1,3 +1,15 @@
+2011-03-16  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * 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  <vapier@gentoo.org>
 
        * config/tc-bfin.c (bfin_cpus[]): Add 0.4 for
index 2c55047..380259c 100644 (file)
--- 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;
index 7c16382..5408e1a 100644 (file)
--- 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
index d43409a..37a8020 100644 (file)
@@ -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;
index 748c96c..bb7f063 100644 (file)
@@ -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.
 
index 2ec9fdb..6634781 100644 (file)
@@ -1,3 +1,11 @@
+2011-03-16  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * 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  <hongjiu.lu@intel.com>
 
        * 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 (file)
index 0000000..0bcf381
--- /dev/null
@@ -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 (file)
index 0000000..6e02eef
--- /dev/null
@@ -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 (file)
index 0000000..149b3c0
--- /dev/null
@@ -0,0 +1,2 @@
+.*bad-size\.s: Assembler messages:
+.*bad-size\.s:6: Warning: .*
index 306da65..ea5cdac 100644 (file)
@@ -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.