Skip to content

Commit

Permalink
pythongh-95855: Refactor platform triplet detection code, add detecti…
Browse files Browse the repository at this point in the history
…on for MIPS soft float and musl libc (python#107221)

- Move platform triplet detection code into Misc/platform_triplet.c
- Refactor MIPS detection, use defined(__mips64) to detect MIPS64
- Compute libc values in separate section
- Add detection for MIPS soft float
- Add detection for musl

musl supports SPE with its soft-float ABI:
https://git.musl-libc.org/cgit/musl/commit/?id=7be59733d71ada3a32a98622507399253f1d5e48

Original patch by Christian Heimes.

Co-authored-by: Christian Heimes <christian@python.org>
Co-authored-by: Erlend E. Aasland <erlend@python.org>
  • Loading branch information
3 people committed Aug 24, 2023
1 parent 809ea7c commit c163d7f
Show file tree
Hide file tree
Showing 4 changed files with 265 additions and 376 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Refactor platform triplet detection code and add detection for MIPS soft
float and musl libc.
255 changes: 255 additions & 0 deletions Misc/platform_triplet.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,255 @@
/* Detect platform triplet from builtin defines
* cc -E Misc/platform_triplet.c | grep '^PLATFORM_TRIPLET=' | tr -d ' '
*/
#undef bfin
#undef cris
#undef fr30
#undef linux
#undef hppa
#undef hpux
#undef i386
#undef mips
#undef powerpc
#undef sparc
#undef unix
#if defined(__ANDROID__)
# Android is not a multiarch system.
#elif defined(__linux__)
/*
* BEGIN of Linux block
*/
// Detect libc (based on config.guess)
# include <features.h>
# if defined(__UCLIBC__)
# error uclibc not supported
# elif defined(__dietlibc__)
# error dietlibc not supported
# elif defined(__GLIBC__)
# define LIBC gnu
# define LIBC_X32 gnux32
# if defined(__ARM_PCS_VFP)
# define LIBC_ARM gnueabihf
# else
# define LIBC_ARM gnueabi
# endif
# if defined(__loongarch__)
# if defined(__loongarch_soft_float)
# define LIBC_LA gnusf
# elif defined(__loongarch_single_float)
# define LIBC_LA gnuf32
# elif defined(__loongarch_double_float)
# define LIBC_LA gnu
# else
# error unknown loongarch floating-point base abi
# endif
# endif
# if defined(_MIPS_SIM)
# if defined(__mips_hard_float)
# if _MIPS_SIM == _ABIO32
# define LIBC_MIPS gnu
# elif _MIPS_SIM == _ABIN32
# define LIBC_MIPS gnuabin32
# elif _MIPS_SIM == _ABI64
# define LIBC_MIPS gnuabi64
# else
# error unknown mips sim value
# endif
# else
# if _MIPS_SIM == _ABIO32
# define LIBC_MIPS gnusf
# elif _MIPS_SIM == _ABIN32
# define LIBC_MIPS gnuabin32sf
# elif _MIPS_SIM == _ABI64
# define LIBC_MIPS gnuabi64sf
# else
# error unknown mips sim value
# endif
# endif
# endif
# if defined(__SPE__)
# define LIBC_PPC gnuspe
# else
# define LIBC_PPC gnu
# endif
# else
// Heuristic to detect musl libc
# include <stdarg.h>
# ifdef __DEFINED_va_list
# define LIBC musl
# define LIBC_X32 muslx32
# if defined(__ARM_PCS_VFP)
# define LIBC_ARM musleabihf
# else
# define LIBC_ARM musleabi
# endif
# if defined(__loongarch__)
# if defined(__loongarch_soft_float)
# define LIBC_LA muslsf
# elif defined(__loongarch_single_float)
# define LIBC_LA muslf32
# elif defined(__loongarch_double_float)
# define LIBC_LA musl
# else
# error unknown loongarch floating-point base abi
# endif
# endif
# if defined(_MIPS_SIM)
# if defined(__mips_hard_float)
# if _MIPS_SIM == _ABIO32
# define LIBC_MIPS musl
# elif _MIPS_SIM == _ABIN32
# define LIBC_MIPS musln32
# elif _MIPS_SIM == _ABI64
# define LIBC_MIPS musl
# else
# error unknown mips sim value
# endif
# else
# if _MIPS_SIM == _ABIO32
# define LIBC_MIPS muslsf
# elif _MIPS_SIM == _ABIN32
# define LIBC_MIPS musln32sf
# elif _MIPS_SIM == _ABI64
# define LIBC_MIPS muslsf
# else
# error unknown mips sim value
# endif
# endif
# endif
# if defined(_SOFT_FLOAT) || defined(__NO_FPRS__)
# define LIBC_PPC muslsf
# else
# define LIBC_PPC musl
# endif
# else
# error unknown libc
# endif
# endif

# if defined(__x86_64__) && defined(__LP64__)
PLATFORM_TRIPLET=x86_64-linux-LIBC
# elif defined(__x86_64__) && defined(__ILP32__)
PLATFORM_TRIPLET=x86_64-linux-LIBC_X32
# elif defined(__i386__)
PLATFORM_TRIPLET=i386-linux-LIBC
# elif defined(__aarch64__) && defined(__AARCH64EL__)
# if defined(__ILP32__)
PLATFORM_TRIPLET=aarch64_ilp32-linux-LIBC
# else
PLATFORM_TRIPLET=aarch64-linux-LIBC
# endif
# elif defined(__aarch64__) && defined(__AARCH64EB__)
# if defined(__ILP32__)
PLATFORM_TRIPLET=aarch64_be_ilp32-linux-LIBC
# else
PLATFORM_TRIPLET=aarch64_be-linux-LIBC
# endif
# elif defined(__alpha__)
PLATFORM_TRIPLET=alpha-linux-LIBC
# elif defined(__ARM_EABI__)
# if defined(__ARMEL__)
PLATFORM_TRIPLET=arm-linux-LIBC_ARM
# else
PLATFORM_TRIPLET=armeb-linux-LIBC_ARM
# endif
# elif defined(__hppa__)
PLATFORM_TRIPLET=hppa-linux-LIBC
# elif defined(__ia64__)
PLATFORM_TRIPLET=ia64-linux-LIBC
# elif defined(__loongarch__) && defined(__loongarch_lp64)
PLATFORM_TRIPLET=loongarch64-linux-LIBC_LA
# elif defined(__m68k__) && !defined(__mcoldfire__)
PLATFORM_TRIPLET=m68k-linux-LIBC
# elif defined(__mips__)
# if defined(__mips_isa_rev) && (__mips_isa_rev >=6)
# if defined(_MIPSEL) && defined(__mips64)
PLATFORM_TRIPLET=mipsisa64r6el-linux-LIBC_MIPS
# elif defined(_MIPSEL)
PLATFORM_TRIPLET=mipsisa32r6el-linux-LIBC_MIPS
# elif defined(__mips64)
PLATFORM_TRIPLET=mipsisa64r6-linux-LIBC_MIPS
# else
PLATFORM_TRIPLET=mipsisa32r6-linux-LIBC_MIPS
# endif
# else
# if defined(_MIPSEL) && defined(__mips64)
PLATFORM_TRIPLET=mips64el-linux-LIBC_MIPS
# elif defined(_MIPSEL)
PLATFORM_TRIPLET=mipsel-linux-LIBC_MIPS
# elif defined(__mips64)
PLATFORM_TRIPLET=mips64-linux-LIBC_MIPS
# else
PLATFORM_TRIPLET=mips-linux-LIBC_MIPS
# endif
# endif
# elif defined(__or1k__)
PLATFORM_TRIPLET=or1k-linux-LIBC
# elif defined(__powerpc64__)
# if defined(__LITTLE_ENDIAN__)
PLATFORM_TRIPLET=powerpc64le-linux-LIBC
# else
PLATFORM_TRIPLET=powerpc64-linux-LIBC
# endif
# elif defined(__powerpc__)
PLATFORM_TRIPLET=powerpc-linux-LIBC_PPC
# elif defined(__s390x__)
PLATFORM_TRIPLET=s390x-linux-LIBC
# elif defined(__s390__)
PLATFORM_TRIPLET=s390-linux-LIBC
# elif defined(__sh__) && defined(__LITTLE_ENDIAN__)
PLATFORM_TRIPLET=sh4-linux-LIBC
# elif defined(__sparc__) && defined(__arch64__)
PLATFORM_TRIPLET=sparc64-linux-LIBC
# elif defined(__sparc__)
PLATFORM_TRIPLET=sparc-linux-LIBC
# elif defined(__riscv)
# if __riscv_xlen == 32
PLATFORM_TRIPLET=riscv32-linux-LIBC
# elif __riscv_xlen == 64
PLATFORM_TRIPLET=riscv64-linux-LIBC
# else
# error unknown platform triplet
# endif
# else
# error unknown platform triplet
# endif
/*
* END of Linux block
*/
#elif defined(__FreeBSD_kernel__)
# if defined(__LP64__)
PLATFORM_TRIPLET=x86_64-kfreebsd-gnu
# elif defined(__i386__)
PLATFORM_TRIPLET=i386-kfreebsd-gnu
# else
# error unknown platform triplet
# endif
#elif defined(__gnu_hurd__)
PLATFORM_TRIPLET=i386-gnu
#elif defined(__APPLE__)
PLATFORM_TRIPLET=darwin
#elif defined(__VXWORKS__)
PLATFORM_TRIPLET=vxworks
#elif defined(__wasm32__)
# if defined(__EMSCRIPTEN__)
PLATFORM_TRIPLET=wasm32-emscripten
# elif defined(__wasi__)
# if defined(_REENTRANT)
PLATFORM_TRIPLET=wasm32-wasi-threads
# else
PLATFORM_TRIPLET=wasm32-wasi
# endif
# else
# error unknown wasm32 platform
# endif
#elif defined(__wasm64__)
# if defined(__EMSCRIPTEN__)
PLATFORM_TRIPLET=wasm64-emscripten
# elif defined(__wasi__)
PLATFORM_TRIPLET=wasm64-wasi
# else
# error unknown wasm64 platform
# endif
#else
# error unknown platform triplet
#endif

0 comments on commit c163d7f

Please sign in to comment.