This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PATCH: Add --size-check=[error|warning]


>>> On 11.03.11 at 17:58, "H.J. Lu" <hongjiu.lu@intel.com> wrote:
> 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?

Please make it so that it'll be a warning by default, and an error
upon programmer request. Otherwise, for the very purpose of
bisection, it won't help much as you would have to override
compiler/assembler flags during that process.

Jan

> 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.



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]