[PATCH 4/5] tcg/mips: Check O32/N32/64 ABI definitions actually exist

Philippe Mathieu-Daudé posted 5 patches 2 months, 3 weeks ago
Maintainers: "Alex Bennée" <alex.bennee@linaro.org>, "Philippe Mathieu-Daudé" <philmd@linaro.org>, Thomas Huth <thuth@redhat.com>, Riku Voipio <riku.voipio@iki.fi>, Paolo Bonzini <pbonzini@redhat.com>, Aurelien Jarno <aurelien@aurel32.net>, Huacai Chen <chenhuacai@kernel.org>, Jiaxun Yang <jiaxun.yang@flygoat.com>, Aleksandar Rikalo <arikalo@gmail.com>, Richard Henderson <richard.henderson@linaro.org>
There is a newer version of this series
[PATCH 4/5] tcg/mips: Check O32/N32/64 ABI definitions actually exist
Posted by Philippe Mathieu-Daudé 2 months, 3 weeks ago
Similarly noted in libunwind: https://reviews.llvm.org/D38110#895887,
when _ABIO32 / _ABIN32 / _ABI64 are not defined (like on OpenBSD) we
get:

  [666/1234] Compiling C object libsystem.a.p/tcg_tcg-common.c.o
  In file included from ../tcg/tcg-common.c:26:
  In file included from include/tcg/tcg.h:34:
  tcg/mips/tcg-target-reg-bits.h:10:18: warning: '_ABIO32' is not defined, evaluates to 0 [-Wundef]
  #if _MIPS_SIM == _ABIO32
                   ^
  tcg/mips/tcg-target-reg-bits.h:12:20: warning: '_ABIN32' is not defined, evaluates to 0 [-Wundef]
  #elif _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
                     ^
  2 warnings generated.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 tcg/mips/tcg-target-reg-bits.h           | 5 +++--
 tcg/mips/tcg-target.c.inc                | 5 +++--
 common-user/host/mips/safe-syscall.inc.S | 4 ++--
 3 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/tcg/mips/tcg-target-reg-bits.h b/tcg/mips/tcg-target-reg-bits.h
index 56fe0a725e9..a957d2312f3 100644
--- a/tcg/mips/tcg-target-reg-bits.h
+++ b/tcg/mips/tcg-target-reg-bits.h
@@ -7,9 +7,10 @@
 #ifndef TCG_TARGET_REG_BITS_H
 #define TCG_TARGET_REG_BITS_H
 
-#if _MIPS_SIM == _ABIO32
+#if defined(_ABIO32) && _MIPS_SIM == _ABIO32
 # define TCG_TARGET_REG_BITS 32
-#elif _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
+#elif (defined(_ABIN32) && _MIPS_SIM == _ABIN32) \
+       || (defined(_ABI64) && _MIPS_SIM == _ABI64)
 # define TCG_TARGET_REG_BITS 64
 #else
 # error "Unknown ABI"
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
index 400eafbab4b..5cdaaaa9286 100644
--- a/tcg/mips/tcg-target.c.inc
+++ b/tcg/mips/tcg-target.c.inc
@@ -26,7 +26,7 @@
 
 /* used for function call generation */
 #define TCG_TARGET_STACK_ALIGN        16
-#if _MIPS_SIM == _ABIO32
+#if defined(_ABIO32) && _MIPS_SIM == _ABIO32
 # define TCG_TARGET_CALL_STACK_OFFSET 16
 # define TCG_TARGET_CALL_ARG_I64      TCG_CALL_ARG_EVEN
 # define TCG_TARGET_CALL_RET_I128     TCG_CALL_RET_BY_REF
@@ -135,7 +135,8 @@ static const TCGReg tcg_target_call_iarg_regs[] = {
     TCG_REG_A1,
     TCG_REG_A2,
     TCG_REG_A3,
-#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
+#if (defined(_ABIN32) && _MIPS_SIM == _ABIN32) \
+     || (defined(_ABI64) && _MIPS_SIM == _ABI64)
     TCG_REG_T0,
     TCG_REG_T1,
     TCG_REG_T2,
diff --git a/common-user/host/mips/safe-syscall.inc.S b/common-user/host/mips/safe-syscall.inc.S
index 6a446149704..8857d708dae 100644
--- a/common-user/host/mips/safe-syscall.inc.S
+++ b/common-user/host/mips/safe-syscall.inc.S
@@ -30,7 +30,7 @@
          * arguments being syscall arguments (also 'long').
          */
 
-#if _MIPS_SIM == _ABIO32
+#if defined(_ABIO32) && _MIPS_SIM == _ABIO32
 /* 8 * 4 = 32 for outgoing parameters; 1 * 4 for s0 save; 1 * 4 for align. */
 #define FRAME    40
 #define OFS_S0   32
@@ -47,7 +47,7 @@ NESTED(safe_syscall_base, FRAME, ra)
         .cfi_adjust_cfa_offset FRAME
         REG_S   s0, OFS_S0(sp)
         .cfi_rel_offset s0, OFS_S0
-#if _MIPS_SIM == _ABIO32
+#if defined(_ABIO32) && _MIPS_SIM == _ABIO32
         /*
          * The syscall calling convention is nearly the same as C:
          * we enter with a0 == &signal_pending
-- 
2.51.0


Re: [PATCH 4/5] tcg/mips: Check O32/N32/64 ABI definitions actually exist
Posted by Richard Henderson 2 months, 3 weeks ago
On 8/21/25 00:21, Philippe Mathieu-Daudé wrote:
> Similarly noted in libunwind: https://reviews.llvm.org/D38110#895887,
> when _ABIO32 / _ABIN32 / _ABI64 are not defined (like on OpenBSD) we
> get:
> 
>    [666/1234] Compiling C object libsystem.a.p/tcg_tcg-common.c.o
>    In file included from ../tcg/tcg-common.c:26:
>    In file included from include/tcg/tcg.h:34:
>    tcg/mips/tcg-target-reg-bits.h:10:18: warning: '_ABIO32' is not defined, evaluates to 0 [-Wundef]
>    #if _MIPS_SIM == _ABIO32
>                     ^
>    tcg/mips/tcg-target-reg-bits.h:12:20: warning: '_ABIN32' is not defined, evaluates to 0 [-Wundef]
>    #elif _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
>                       ^
>    2 warnings generated.



> 
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
>   tcg/mips/tcg-target-reg-bits.h           | 5 +++--
>   tcg/mips/tcg-target.c.inc                | 5 +++--
>   common-user/host/mips/safe-syscall.inc.S | 4 ++--
>   3 files changed, 8 insertions(+), 6 deletions(-)
> 
> diff --git a/tcg/mips/tcg-target-reg-bits.h b/tcg/mips/tcg-target-reg-bits.h
> index 56fe0a725e9..a957d2312f3 100644
> --- a/tcg/mips/tcg-target-reg-bits.h
> +++ b/tcg/mips/tcg-target-reg-bits.h
> @@ -7,9 +7,10 @@
>   #ifndef TCG_TARGET_REG_BITS_H
>   #define TCG_TARGET_REG_BITS_H
>   
> -#if _MIPS_SIM == _ABIO32
> +#if defined(_ABIO32) && _MIPS_SIM == _ABIO32
>   # define TCG_TARGET_REG_BITS 32
> -#elif _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
> +#elif (defined(_ABIN32) && _MIPS_SIM == _ABIN32) \
> +       || (defined(_ABI64) && _MIPS_SIM == _ABI64)
>   # define TCG_TARGET_REG_BITS 64
>   #else
>   # error "Unknown ABI"


Alternately, remove all of this.  If we're removing 32-bit hosts, _ABI64 is the only valid 
answer (N32 has 64-bit registers but 32-bit pointers).


r~

Re: [PATCH 4/5] tcg/mips: Check O32/N32/64 ABI definitions actually exist
Posted by Philippe Mathieu-Daudé 1 month ago
On 21/8/25 23:09, Richard Henderson wrote:
> On 8/21/25 00:21, Philippe Mathieu-Daudé wrote:
>> Similarly noted in libunwind: https://reviews.llvm.org/D38110#895887,
>> when _ABIO32 / _ABIN32 / _ABI64 are not defined (like on OpenBSD) we
>> get:
>>
>>    [666/1234] Compiling C object libsystem.a.p/tcg_tcg-common.c.o
>>    In file included from ../tcg/tcg-common.c:26:
>>    In file included from include/tcg/tcg.h:34:
>>    tcg/mips/tcg-target-reg-bits.h:10:18: warning: '_ABIO32' is not 
>> defined, evaluates to 0 [-Wundef]
>>    #if _MIPS_SIM == _ABIO32
>>                     ^
>>    tcg/mips/tcg-target-reg-bits.h:12:20: warning: '_ABIN32' is not 
>> defined, evaluates to 0 [-Wundef]
>>    #elif _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
>>                       ^
>>    2 warnings generated.
> 
> 
> 
>>
>> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
>> ---
>>   tcg/mips/tcg-target-reg-bits.h           | 5 +++--
>>   tcg/mips/tcg-target.c.inc                | 5 +++--
>>   common-user/host/mips/safe-syscall.inc.S | 4 ++--
>>   3 files changed, 8 insertions(+), 6 deletions(-)
>>
>> diff --git a/tcg/mips/tcg-target-reg-bits.h b/tcg/mips/tcg-target-reg- 
>> bits.h
>> index 56fe0a725e9..a957d2312f3 100644
>> --- a/tcg/mips/tcg-target-reg-bits.h
>> +++ b/tcg/mips/tcg-target-reg-bits.h
>> @@ -7,9 +7,10 @@
>>   #ifndef TCG_TARGET_REG_BITS_H
>>   #define TCG_TARGET_REG_BITS_H
>> -#if _MIPS_SIM == _ABIO32
>> +#if defined(_ABIO32) && _MIPS_SIM == _ABIO32
>>   # define TCG_TARGET_REG_BITS 32
>> -#elif _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
>> +#elif (defined(_ABIN32) && _MIPS_SIM == _ABIN32) \
>> +       || (defined(_ABI64) && _MIPS_SIM == _ABI64)
>>   # define TCG_TARGET_REG_BITS 64
>>   #else
>>   # error "Unknown ABI"
> 
> 
> Alternately, remove all of this.  If we're removing 32-bit hosts, _ABI64 
> is the only valid answer (N32 has 64-bit registers but 32-bit pointers).

OK, but meanwhile can you consider this patch out of 32-bit host
removal? (I should have posted it separately for OpenBSD).