Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-95855: Refactor platform triplet detection code, add detection for MIPS soft float and musl libc #107221

Merged
merged 12 commits into from
Aug 24, 2023
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(__powerpc__)
PLATFORM_TRIPLET=powerpc-linux-LIBC_PPC
# elif defined(__powerpc64__)
# if defined(__LITTLE_ENDIAN__)
PLATFORM_TRIPLET=powerpc64le-linux-LIBC
# else
PLATFORM_TRIPLET=powerpc64-linux-LIBC
# endif
# 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
Loading