Richard Earnshaw <richard.earns...@foss.arm.com> writes:
> On 13/06/2022 15:33, Richard Sandiford via Gcc-patches wrote:
>> On aarch64, --with-arch, --with-cpu and --with-tune only have an
>> effect on the driver, so “./xgcc -B./ -O3” can give significantly
>> different results from “./cc1 -O3”.  --with-arch did have a limited
>> effect on ./cc1 in previous releases, although it didn't work
>> entirely correctly.
>> 
>> Being of a lazy persuasion, I've got used to ./cc1 selecting SVE for
>> --with-arch=armv8.2-a+sve without having to supply an explicit -march,
>> so this patch makes ./cc1 emulate the relevant OPTION_DEFAULT_SPECS.
>> It relies on Wilco's earlier clean-ups.
>> 
>> The patch makes config.gcc define WITH_FOO_STRING macros for each
>> supported --with-foo option.  This could be done only in aarch64-
>> specific code, but I thought it could be useful on other targets
>> too (and can be safely ignored otherwise).  There didn't seem to
>> be any existing and potentially clashing uses of macros with this
>> style of name.
>> 
>> Tested on aarch64-linux-gnu & x86_64-linux-gnu.  OK for the configure
>> bits?
>> 
>> Richard
>> 
>> 
>> gcc/
>>      * config.gcc: Define WITH_FOO_STRING macros for each supported
>>      --with-foo option.
>>      * config/aarch64/aarch64.cc (aarch64_override_options): Emulate
>>      OPTION_DEFAULT_SPECS.
>>      * config/aarch64/aarch64.h (OPTION_DEFAULT_SPECS): Reference the above.
>> ---
>>   gcc/config.gcc                | 14 ++++++++++++++
>>   gcc/config/aarch64/aarch64.cc |  8 ++++++++
>>   gcc/config/aarch64/aarch64.h  |  5 ++++-
>>   3 files changed, 26 insertions(+), 1 deletion(-)
>> 
>> diff --git a/gcc/config.gcc b/gcc/config.gcc
>> index cdbefb5b4f5..e039230431c 100644
>> --- a/gcc/config.gcc
>> +++ b/gcc/config.gcc
>> @@ -5865,6 +5865,20 @@ else
>>      configure_default_options="{ ${t} }"
>>   fi
>>   
>> +for option in $supported_defaults
>> +do
>> +    lc_option=`echo $option | sed s/-/_/g`
>> +    uc_option=`echo $lc_option | tr a-z A-Z`
>> +    eval "val=\$with_$lc_option"
>> +    if test -n "$val"
>> +    then
>> +            val="\\\"$val\\\""
>> +    else
>> +            val=nullptr
>> +    fi
>> +    tm_defines="$tm_defines WITH_${uc_option}_STRING=$val"
>> +done
>
> This bit would really be best reviewed by a non-arm maintainer.  It 
> generally looks OK.  My only comment would be why define anything if the 
> corresponding --with-foo was not specified.  They you can use #ifdef to 
> test if the user specified a default.

Yeah, could do it that way instead, but:

>> diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
>> index d21e041eccb..0bc700b81ad 100644
>> --- a/gcc/config/aarch64/aarch64.cc
>> +++ b/gcc/config/aarch64/aarch64.cc
>> @@ -18109,6 +18109,14 @@ aarch64_override_options (void)
>>     if (aarch64_branch_protection_string)
>>       aarch64_validate_mbranch_protection (aarch64_branch_protection_string);
>>   
>> +  /* Emulate OPTION_DEFAULT_SPECS.  */
>> +  if (!aarch64_arch_string && !aarch64_cpu_string)
>> +    aarch64_arch_string = WITH_ARCH_STRING;
>> +  if (!aarch64_arch_string && !aarch64_cpu_string)
>> +    aarch64_cpu_string = WITH_CPU_STRING;
>> +  if (!aarch64_cpu_string && !aarch64_tune_string)
>> +    aarch64_tune_string = WITH_TUNE_STRING;

(without the preprocessor stuff) IMO reads better.  If a preprocessor
is/isn't present test turns out to be useful, perhaps we should add
macros like HAVE_WITH_TUNE/WITH_TUNE_PRESENT/... too?  I guess it
should only be done when something needs it though.

Thanks,
Richard

>> +
>>     /* -mcpu=CPU is shorthand for -march=ARCH_FOR_CPU, -mtune=CPU.
>>        If either of -march or -mtune is given, they override their
>>        respective component of -mcpu.  */
>> diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
>> index 80cfe4b7407..3122dbd7098 100644
>> --- a/gcc/config/aarch64/aarch64.h
>> +++ b/gcc/config/aarch64/aarch64.h
>> @@ -1267,7 +1267,10 @@ extern enum aarch64_code_model aarch64_cmodel;
>>   /* Support for configure-time --with-arch, --with-cpu and --with-tune.
>>      --with-arch and --with-cpu are ignored if either -mcpu or -march is 
>> used.
>>      --with-tune is ignored if either -mtune or -mcpu is used (but is not
>> -   affected by -march).  */
>> +   affected by -march).
>> +
>> +   There is corresponding code in aarch64_override_options that emulates
>> +   this behavior when cc1 &co are invoked directly.  */
>>   #define OPTION_DEFAULT_SPECS                               \
>>     {"arch", "%{!march=*:%{!mcpu=*:-march=%(VALUE)}}" },     \
>>     {"cpu",  "%{!march=*:%{!mcpu=*:-mcpu=%(VALUE)}}" },   \

Reply via email to