From 3f97bdeac88274d2991176ea478452c8fac84095 Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Thu, 31 Oct 2024 15:38:42 -0700 Subject: [PATCH 1/2] [libc][cmake] make i386 distinct from x86_64 Configured via: $ cmake ../runtimes -G Ninja -DLLVM_ENABLE_LLD=ON \ -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_RUNTIMES="libc" \ -DLIBC_TARGET_TRIPLE=i386-linux-gnu -DCMAKE_C_COMPILER=clang \ -DCMAKE_CXX_COMPILER=clang++ Link: #93709 --- libc/cmake/modules/LLVMLibCArchitectures.cmake | 6 +++++- libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake | 2 +- libc/cmake/modules/LLVMLibCCompileOptionRules.cmake | 6 +++--- libc/cmake/modules/LLVMLibCFlagRules.cmake | 6 +++--- libc/cmake/modules/LLVMLibCTestRules.cmake | 2 +- libc/config/linux/i386/entrypoints.txt | 11 +++++++++++ libc/config/linux/i386/headers.txt | 3 +++ libc/src/__support/OSUtil/linux/i386/CMakeLists.txt | 11 +++++++++++ libc/src/__support/OSUtil/linux/i386/vdso.h | 0 9 files changed, 38 insertions(+), 9 deletions(-) create mode 100644 libc/config/linux/i386/entrypoints.txt create mode 100644 libc/config/linux/i386/headers.txt create mode 100644 libc/src/__support/OSUtil/linux/i386/CMakeLists.txt create mode 100644 libc/src/__support/OSUtil/linux/i386/vdso.h diff --git a/libc/cmake/modules/LLVMLibCArchitectures.cmake b/libc/cmake/modules/LLVMLibCArchitectures.cmake index 1e5ed723194a2..fbb1091ddabab 100644 --- a/libc/cmake/modules/LLVMLibCArchitectures.cmake +++ b/libc/cmake/modules/LLVMLibCArchitectures.cmake @@ -39,8 +39,10 @@ function(get_arch_and_system_from_triple triple arch_var sys_var) set(target_arch "arm") elseif(target_arch MATCHES "^aarch64") set(target_arch "aarch64") - elseif(target_arch MATCHES "(x86_64)|(AMD64|amd64)|(^i.86$)") + elseif(target_arch MATCHES "(x86_64)|(AMD64|amd64)") set(target_arch "x86_64") + elseif(target_arch MATCHES "(^i.86$)") + set(target_arch "i386") elseif(target_arch MATCHES "^(powerpc|ppc)") set(target_arch "power") elseif(target_arch MATCHES "^riscv32") @@ -147,6 +149,8 @@ if(LIBC_TARGET_ARCHITECTURE STREQUAL "arm") elseif(LIBC_TARGET_ARCHITECTURE STREQUAL "aarch64") set(LIBC_TARGET_ARCHITECTURE_IS_AARCH64 TRUE) elseif(LIBC_TARGET_ARCHITECTURE STREQUAL "x86_64") + set(LIBC_TARGET_ARCHITECTURE_IS_X86_64 TRUE) +elseif(LIBC_TARGET_ARCHITECTURE STREQUAL "i386") set(LIBC_TARGET_ARCHITECTURE_IS_X86 TRUE) elseif(LIBC_TARGET_ARCHITECTURE STREQUAL "riscv64") set(LIBC_TARGET_ARCHITECTURE_IS_RISCV64 TRUE) diff --git a/libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake b/libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake index 3b6b6f56fc80c..c8a2827d33a8d 100644 --- a/libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake +++ b/libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake @@ -5,7 +5,7 @@ # Initialize ALL_CPU_FEATURES as empty list. set(ALL_CPU_FEATURES "") -if(${LIBC_TARGET_ARCHITECTURE_IS_X86}) +if(${LIBC_TARGET_ARCHITECTURE_IS_X86_64}) set(ALL_CPU_FEATURES SSE2 SSE4_2 AVX AVX2 AVX512F AVX512BW FMA) set(LIBC_COMPILE_OPTIONS_NATIVE -march=native) elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64}) diff --git a/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake b/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake index e30f7d322eb02..65851f1c86571 100644 --- a/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake +++ b/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake @@ -10,7 +10,7 @@ function(_get_compile_options_from_flags output_var) if(LLVM_COMPILER_IS_GCC_COMPATIBLE) if(ADD_FMA_FLAG) - if(LIBC_TARGET_ARCHITECTURE_IS_X86) + if(LIBC_TARGET_ARCHITECTURE_IS_X86_64) list(APPEND compile_options "-mavx2") list(APPEND compile_options "-mfma") elseif(LIBC_TARGET_ARCHITECTURE_IS_RISCV64) @@ -18,7 +18,7 @@ function(_get_compile_options_from_flags output_var) endif() endif() if(ADD_ROUND_OPT_FLAG) - if(LIBC_TARGET_ARCHITECTURE_IS_X86) + if(LIBC_TARGET_ARCHITECTURE_IS_X86_64) # ROUND_OPT_FLAG is only enabled if SSE4.2 is detected, not just SSE4.1, # because there was code to check for SSE4.2 already, and few CPUs only # have SSE4.1. @@ -145,7 +145,7 @@ function(_get_common_compile_options output_var flags) endif() if (LIBC_CONF_KEEP_FRAME_POINTER) list(APPEND compile_options "-fno-omit-frame-pointer") - if (LIBC_TARGET_ARCHITECTURE_IS_X86) + if (LIBC_TARGET_ARCHITECTURE_IS_X86_64) list(APPEND compile_options "-mno-omit-leaf-frame-pointer") endif() endif() diff --git a/libc/cmake/modules/LLVMLibCFlagRules.cmake b/libc/cmake/modules/LLVMLibCFlagRules.cmake index 69f31ace80dd3..e5b0e249c9067 100644 --- a/libc/cmake/modules/LLVMLibCFlagRules.cmake +++ b/libc/cmake/modules/LLVMLibCFlagRules.cmake @@ -268,21 +268,21 @@ set(EXPLICIT_SIMD_OPT_FLAG "EXPLICIT_SIMD_OPT") set(MISC_MATH_BASIC_OPS_OPT_FLAG "MISC_MATH_BASIC_OPS_OPT") # Skip FMA_OPT flag for targets that don't support fma. -if(NOT((LIBC_TARGET_ARCHITECTURE_IS_X86 AND (LIBC_CPU_FEATURES MATCHES "FMA")) OR +if(NOT((LIBC_TARGET_ARCHITECTURE_IS_X86_64 AND (LIBC_CPU_FEATURES MATCHES "FMA")) OR LIBC_TARGET_ARCHITECTURE_IS_RISCV64)) set(SKIP_FLAG_EXPANSION_FMA_OPT TRUE) endif() # Skip EXPLICIT_SIMD_OPT flag for targets that don't support SSE2. # Note: one may want to revisit it if they want to control other explicit SIMD -if(NOT(LIBC_TARGET_ARCHITECTURE_IS_X86 AND (LIBC_CPU_FEATURES MATCHES "SSE2"))) +if(NOT(LIBC_TARGET_ARCHITECTURE_IS_X86_64 AND (LIBC_CPU_FEATURES MATCHES "SSE2"))) set(SKIP_FLAG_EXPANSION_EXPLICIT_SIMD_OPT TRUE) endif() # Skip ROUND_OPT flag for targets that don't support rounding instructions. On # x86, these are SSE4.1 instructions, but we already had code to check for # SSE4.2 support. -if(NOT((LIBC_TARGET_ARCHITECTURE_IS_X86 AND (LIBC_CPU_FEATURES MATCHES "SSE4_2")) OR +if(NOT((LIBC_TARGET_ARCHITECTURE_IS_X86_64 AND (LIBC_CPU_FEATURES MATCHES "SSE4_2")) OR LIBC_TARGET_ARCHITECTURE_IS_AARCH64 OR LIBC_TARGET_OS_IS_GPU)) set(SKIP_FLAG_EXPANSION_ROUND_OPT TRUE) endif() diff --git a/libc/cmake/modules/LLVMLibCTestRules.cmake b/libc/cmake/modules/LLVMLibCTestRules.cmake index 35cc6fe46be53..c3a0f371cd620 100644 --- a/libc/cmake/modules/LLVMLibCTestRules.cmake +++ b/libc/cmake/modules/LLVMLibCTestRules.cmake @@ -402,7 +402,7 @@ function(add_integration_test test_name) if(NOT INTEGRATION_TEST_SRCS) message(FATAL_ERROR "The SRCS list for add_integration_test is missing.") endif() - if(NOT TARGET libc.startup.${LIBC_TARGET_OS}.crt1) + if(NOT LLVM_LIBC_FULL_BUILD AND NOT TARGET libc.startup.${LIBC_TARGET_OS}.crt1) message(FATAL_ERROR "The 'crt1' target for the integration test is missing.") endif() diff --git a/libc/config/linux/i386/entrypoints.txt b/libc/config/linux/i386/entrypoints.txt new file mode 100644 index 0000000000000..6548c9b816c93 --- /dev/null +++ b/libc/config/linux/i386/entrypoints.txt @@ -0,0 +1,11 @@ +set(TARGET_LIBC_ENTRYPOINTS + # errno.h entrypoints + libc.src.errno.errno +) + +set(TARGET_LIBM_ENTRYPOINTS "") + +set(TARGET_LLVMLIBC_ENTRYPOINTS + ${TARGET_LIBC_ENTRYPOINTS} + ${TARGET_LIBM_ENTRYPOINTS} +) diff --git a/libc/config/linux/i386/headers.txt b/libc/config/linux/i386/headers.txt new file mode 100644 index 0000000000000..f34ff9141cbca --- /dev/null +++ b/libc/config/linux/i386/headers.txt @@ -0,0 +1,3 @@ +set(TARGET_PUBLIC_HEADERS + libc.include.assert +) diff --git a/libc/src/__support/OSUtil/linux/i386/CMakeLists.txt b/libc/src/__support/OSUtil/linux/i386/CMakeLists.txt new file mode 100644 index 0000000000000..aa35d7e153d1b --- /dev/null +++ b/libc/src/__support/OSUtil/linux/i386/CMakeLists.txt @@ -0,0 +1,11 @@ +add_header_library( + linux_i386_util + HDRS + syscall.h +) + +add_header_library( + vdso + HDRS + vdso.h +) diff --git a/libc/src/__support/OSUtil/linux/i386/vdso.h b/libc/src/__support/OSUtil/linux/i386/vdso.h new file mode 100644 index 0000000000000..e69de29bb2d1d From 76a871beef440df57ba0ae6f6e945a52ea950058 Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Fri, 1 Nov 2024 08:21:29 -0700 Subject: [PATCH 2/2] remove unnecessary variable expansion --- libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake b/libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake index c8a2827d33a8d..c09d4751d3907 100644 --- a/libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake +++ b/libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake @@ -5,10 +5,10 @@ # Initialize ALL_CPU_FEATURES as empty list. set(ALL_CPU_FEATURES "") -if(${LIBC_TARGET_ARCHITECTURE_IS_X86_64}) +if(LIBC_TARGET_ARCHITECTURE_IS_X86_64) set(ALL_CPU_FEATURES SSE2 SSE4_2 AVX AVX2 AVX512F AVX512BW FMA) set(LIBC_COMPILE_OPTIONS_NATIVE -march=native) -elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64}) +elseif(LIBC_TARGET_ARCHITECTURE_IS_AARCH64) set(ALL_CPU_FEATURES "FullFP16") set(LIBC_COMPILE_OPTIONS_NATIVE -mcpu=native) endif()