> On 22 Feb 2024, at 17:45, Andrew Pinski <pins...@gmail.com> wrote:
>
> On Thu, Feb 22, 2024 at 3:56 AM Richard Earnshaw (lists)
> <richard.earns...@arm.com> wrote:
>>
>> On 21/02/2024 18:30, Evgeny Karpov wrote:
>>>
>> +/* X18 reserved for the TEB on Windows. */
>> +#ifdef TARGET_ARM64_MS_ABI
>> +# define FIXED_X18 1
>> +# define CALL_USED_X18 0
>> +#else
>> +# define FIXED_X18 0
>> +# define CALL_USED_X18 1
>> +#endif
>>
>> I'm not overly keen on ifdefs like this (and the one below), it can get
>> quite confusing if we have to support more than a couple of ABIs. Perhaps
>> we could create a couple of new headers, one for the EABI (which all
>> existing targets would then need to include) and one for the MS ABI. Then
>> the mingw port would use that instead of the EABI header.
>>
>> An alternative is to make all this dynamic, based on the setting of the
>> aarch64_calling_abi enum and to make the adjustments in
>> aarch64_conditional_register_usage.
>
> Dynamically might be needed also if we want to support ms_abi
> attribute and/or -mabi=ms to support the wine folks.
X18 is also reserved on Darwin - in my current branch I have it non-dynamic too.
Iain
>
> Thanks,
> Andrew Pinski
>
>>
>> +# define CALL_USED_X18 0
>>
>> Is that really correct? If the register is really reserved, but some code
>> modifies it anyway, this will cause the compiler to restore the old value at
>> the end of a function; generally, for a reserved register, code that knows
>> what it's doing would want to make permanent changes to this value.
>>
>> +#ifdef TARGET_ARM64_MS_ABI
>> +# define STATIC_CHAIN_REGNUM R17_REGNUM
>> +#else
>> +# define STATIC_CHAIN_REGNUM R18_REGNUM
>> +#endif
>>
>> If we went the enum way, we'd want something like
>>
>> #define STATIC_CHAIN_REGNUM (calling_abi == AARCH64_CALLING_ABI_MS ?
>> R17_REGNUM : R18_REGNUM)
>>
>> R.