This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
PATCH: Add --size-check=[error|warning]
- From: "H.J. Lu" <hongjiu dot lu at intel dot com>
- To: binutils at sourceware dot org
- Cc: amodra at gmail dot com
- Date: Fri, 11 Mar 2011 08:58:02 -0800
- Subject: PATCH: Add --size-check=[error|warning]
- Reply-to: "H.J. Lu" <hjl dot tools at gmail dot com>
Hi,
Issue an error for bad ELF .size directive on Linux kernel bisect where
the bad assembly codes aren't fixed. This patch adds
--size-check=[error|warning] so that we can issue a warning instead of
an error. OK to install?
Thanks.
H.J.
---
diff --git a/gas/ChangeLog.x86 b/gas/ChangeLog.x86
index 33bf5bb..2787c65 100644
--- a/gas/ChangeLog.x86
+++ b/gas/ChangeLog.x86
@@ -1,3 +1,15 @@
+2011-03-11 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-01-15 H.J. Lu <hongjiu.lu@intel.com>
* config/tc-i386.c (disallow_64bit_disp): New.
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.x86 b/gas/testsuite/ChangeLog.x86
index 01e62bc..bf76320 100644
--- a/gas/testsuite/ChangeLog.x86
+++ b/gas/testsuite/ChangeLog.x86
@@ -1,3 +1,11 @@
+2011-03-11 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-01-15 H.J. Lu <hongjiu.lu@intel.com>
* gas/i386/ilp32/ilp32.exp: Run inval.
diff --git a/gas/testsuite/gas/i386/bad-size.d b/gas/testsuite/gas/i386/bad-size.d
index be9655e..0bcf381 100644
--- a/gas/testsuite/gas/i386/bad-size.d
+++ b/gas/testsuite/gas/i386/bad-size.d
@@ -1,7 +1,7 @@
#as: --size-check=warning
#objdump: -dw
#name: Check bad size directive
-#error-output: bad-size.err
+#error-output: bad-size.warn
.*: +file format .*
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.