Skip to content

Commit 7c2ece5

Browse files
committed
[libc] Normalize LIBC_TARGET_MACHINE
Current implementation defines LIBC_TARGET_MACHINE with the use of CMAKE_SYSTEM_PROCESSOR. Unfortunately CMAKE_SYSTEM_PROCESSOR is OS dependent and can produce different results. An evidence of this is the various matchers used to detect whether the architecture is x86. This patch normalizes LIBC_TARGET_MACHINE and renames it LIBC_TARGET_ARCHITECTURE. I've added many architectures but we may want to limit ourselves to x86 and ARM. Differential Revision: https://reviews.llvm.org/D101524
1 parent efc31be commit 7c2ece5

File tree

17 files changed

+72
-52
lines changed

17 files changed

+72
-52
lines changed

libc/CMakeLists.txt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ set(LIBC_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} CACHE PATH "Define libc destinat
1919
set(LIBC_TARGET_OS ${CMAKE_SYSTEM_NAME})
2020
string(TOLOWER ${LIBC_TARGET_OS} LIBC_TARGET_OS)
2121

22-
set(LIBC_TARGET_MACHINE ${CMAKE_SYSTEM_PROCESSOR})
22+
# Defines LIBC_TARGET_ARCHITECTURE and associated macros.
23+
include(LLVMLibCArchitectures)
2324

2425
# Check --print-resource-dir to find the compiler resource dir if this flag
2526
# is supported by the compiler.
@@ -73,8 +74,8 @@ include(CMakeParseArguments)
7374
include(LLVMLibCRules)
7475
include(LLVMLibCCheckCpuFeatures)
7576

76-
include("${LIBC_SOURCE_DIR}/config/${LIBC_TARGET_OS}/${LIBC_TARGET_MACHINE}/entrypoints.txt")
77-
include("${LIBC_SOURCE_DIR}/config/${LIBC_TARGET_OS}/${LIBC_TARGET_MACHINE}/headers.txt")
77+
include("${LIBC_SOURCE_DIR}/config/${LIBC_TARGET_OS}/${LIBC_TARGET_ARCHITECTURE}/entrypoints.txt")
78+
include("${LIBC_SOURCE_DIR}/config/${LIBC_TARGET_OS}/${LIBC_TARGET_ARCHITECTURE}/headers.txt")
7879

7980
set(TARGET_ENTRYPOINT_NAME_LIST "")
8081
foreach(entrypoint IN LISTS TARGET_LLVMLIBC_ENTRYPOINTS)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# ------------------------------------------------------------------------------
2+
# Architecture definitions
3+
# ------------------------------------------------------------------------------
4+
5+
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips")
6+
set(LIBC_TARGET_ARCHITECTURE_IS_MIPS TRUE)
7+
set(LIBC_TARGET_ARCHITECTURE "mips")
8+
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
9+
set(LIBC_TARGET_ARCHITECTURE_IS_ARM TRUE)
10+
set(LIBC_TARGET_ARCHITECTURE "arm")
11+
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64")
12+
set(LIBC_TARGET_ARCHITECTURE_IS_AARCH64 TRUE)
13+
set(LIBC_TARGET_ARCHITECTURE "aarch64")
14+
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(AMD64|amd64)|(^i.86$)")
15+
set(LIBC_TARGET_ARCHITECTURE_IS_X86 TRUE)
16+
set(LIBC_TARGET_ARCHITECTURE "x86_64")
17+
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)")
18+
set(LIBC_TARGET_ARCHITECTURE_IS_POWER TRUE)
19+
set(LIBC_TARGET_ARCHITECTURE "power")
20+
else()
21+
message(FATAL_ERROR "Unsupported processor ${CMAKE_SYSTEM_PROCESSOR}")
22+
endif()

libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# Cpu features definition and flags
33
# ------------------------------------------------------------------------------
44

5-
if(${LIBC_TARGET_MACHINE} MATCHES "x86|x86_64")
5+
if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
66
set(ALL_CPU_FEATURES SSE SSE2 AVX AVX2 AVX512F)
77
list(SORT ALL_CPU_FEATURES)
88
endif()

libc/config/linux/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ add_gen_header(
33
DEF_FILE syscall.h.def
44
GEN_HDR syscall.h
55
PARAMS
6-
inline_syscalls=${LIBC_TARGET_MACHINE}/syscall.h.inc
6+
inline_syscalls=${LIBC_TARGET_ARCHITECTURE}/syscall.h.inc
77
DATA_FILES
8-
${LIBC_TARGET_MACHINE}/syscall.h.inc
8+
${LIBC_TARGET_ARCHITECTURE}/syscall.h.inc
99
DEPENDS
1010
libc.src.__support.common
1111
)

libc/loader/linux/CMakeLists.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,16 +56,16 @@ function(add_loader_object name)
5656
)
5757
endfunction()
5858

59-
if(NOT (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_MACHINE}))
60-
message(STATUS "Skipping loader for target machine ${LIBC_TARGET_MACHINE}")
59+
if(NOT (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_ARCHITECTURE}))
60+
message(STATUS "Skipping loader for target architecture ${LIBC_TARGET_ARCHITECTURE}")
6161
return()
6262
endif()
6363

64-
add_subdirectory(${LIBC_TARGET_MACHINE})
64+
add_subdirectory(${LIBC_TARGET_ARCHITECTURE})
6565

6666
add_loader_object(
6767
crt1
6868
ALIAS
6969
DEPENDS
70-
.${LIBC_TARGET_MACHINE}.crt1
70+
.${LIBC_TARGET_ARCHITECTURE}.crt1
7171
)

libc/src/math/CMakeLists.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
add_subdirectory(generic)
2-
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_MACHINE})
3-
add_subdirectory(${LIBC_TARGET_MACHINE})
2+
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_ARCHITECTURE})
3+
add_subdirectory(${LIBC_TARGET_ARCHITECTURE})
44
endif()
55

66
function(add_math_entrypoint_object name)
77
# We prefer machine specific implementation if available. Hence we check
88
# that first and retrun early if we are able to add an alias target for the
99
# machine specific implementation.
10-
get_fq_target_name("${LIBC_TARGET_MACHINE}.${name}" fq_machine_specific_target_name)
10+
get_fq_target_name("${LIBC_TARGET_ARCHITECTURE}.${name}" fq_machine_specific_target_name)
1111
if(TARGET ${fq_machine_specific_target_name})
1212
add_entrypoint_object(
1313
${name}
1414
ALIAS
1515
DEPENDS
16-
.${LIBC_TARGET_MACHINE}.${name}
16+
.${LIBC_TARGET_ARCHITECTURE}.${name}
1717
)
1818
return()
1919
endif()

libc/src/string/CMakeLists.txt

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -211,16 +211,13 @@ endfunction()
211211
# ------------------------------------------------------------------------------
212212

213213
# include the relevant architecture specific implementations
214-
if(${LIBC_TARGET_MACHINE} STREQUAL "x86_64")
215-
set(LIBC_STRING_TARGET_ARCH "x86")
216-
set(MEMCPY_SRC ${LIBC_SOURCE_DIR}/src/string/x86/memcpy.cpp)
217-
elseif(${LIBC_TARGET_MACHINE} STREQUAL "aarch64")
218-
set(LIBC_STRING_TARGET_ARCH "aarch64")
219-
set(MEMCPY_SRC ${LIBC_SOURCE_DIR}/src/string/aarch64/memcpy.cpp)
214+
if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
215+
set(MEMCPY_SRC ${LIBC_SOURCE_DIR}/src/string/${LIBC_TARGET_ARCHITECTURE}/memcpy.cpp)
216+
elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
217+
set(MEMCPY_SRC ${LIBC_SOURCE_DIR}/src/string/${LIBC_TARGET_ARCHITECTURE}/memcpy.cpp)
220218
#Disable tail merging as it leads to lower performance
221219
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mllvm --tail-merge-threshold=0")
222220
else()
223-
set(LIBC_STRING_TARGET_ARCH ${LIBC_TARGET_MACHINE})
224221
set(MEMCPY_SRC ${LIBC_SOURCE_DIR}/src/string/memcpy.cpp)
225222
endif()
226223

@@ -237,7 +234,7 @@ function(add_memcpy memcpy_name)
237234
)
238235
endfunction()
239236

240-
if(${LIBC_STRING_TARGET_ARCH} STREQUAL "x86")
237+
if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
241238
add_memcpy(memcpy MARCH native)
242239
else()
243240
add_memcpy(memcpy)
@@ -260,7 +257,7 @@ function(add_memset memset_name)
260257
)
261258
endfunction()
262259

263-
if(${LIBC_STRING_TARGET_ARCH} STREQUAL "x86")
260+
if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
264261
add_memset(memset MARCH native)
265262
else()
266263
add_memset(memset)
@@ -284,7 +281,7 @@ function(add_bzero bzero_name)
284281
)
285282
endfunction()
286283

287-
if(${LIBC_STRING_TARGET_ARCH} STREQUAL "x86")
284+
if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
288285
add_bzero(bzero MARCH native)
289286
else()
290287
add_bzero(bzero)
@@ -294,6 +291,6 @@ endif()
294291
# Add all other relevant implementations for the native target.
295292
# ------------------------------------------------------------------------------
296293

297-
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_STRING_TARGET_ARCH})
298-
include(${LIBC_STRING_TARGET_ARCH}/CMakeLists.txt)
294+
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_ARCHITECTURE})
295+
include(${LIBC_TARGET_ARCHITECTURE}/CMakeLists.txt)
299296
endif()
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
add_memcpy("memcpy_${LIBC_TARGET_MACHINE}")
1+
add_memcpy("memcpy_${LIBC_TARGET_ARCHITECTURE}")

libc/src/string/x86/CMakeLists.txt

Lines changed: 0 additions & 14 deletions
This file was deleted.

libc/src/string/x86_64/CMakeLists.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
add_memcpy("memcpy_${LIBC_TARGET_ARCHITECTURE}_opt_none" REJECT "${ALL_CPU_FEATURES}")
2+
add_memcpy("memcpy_${LIBC_TARGET_ARCHITECTURE}_opt_sse" REQUIRE "SSE" REJECT "SSE2")
3+
add_memcpy("memcpy_${LIBC_TARGET_ARCHITECTURE}_opt_avx" REQUIRE "AVX" REJECT "AVX2")
4+
add_memcpy("memcpy_${LIBC_TARGET_ARCHITECTURE}_opt_avx512f" REQUIRE "AVX512F")
5+
6+
add_memset("memset_${LIBC_TARGET_ARCHITECTURE}_opt_none" REJECT "${ALL_CPU_FEATURES}")
7+
add_memset("memset_${LIBC_TARGET_ARCHITECTURE}_opt_sse" REQUIRE "SSE" REJECT "SSE2")
8+
add_memset("memset_${LIBC_TARGET_ARCHITECTURE}_opt_avx" REQUIRE "AVX" REJECT "AVX2")
9+
add_memset("memset_${LIBC_TARGET_ARCHITECTURE}_opt_avx512f" REQUIRE "AVX512F")
10+
11+
add_bzero("bzero_${LIBC_TARGET_ARCHITECTURE}_opt_none" REJECT "${ALL_CPU_FEATURES}")
12+
add_bzero("bzero_${LIBC_TARGET_ARCHITECTURE}_opt_sse" REQUIRE "SSE" REJECT "SSE2")
13+
add_bzero("bzero_${LIBC_TARGET_ARCHITECTURE}_opt_avx" REQUIRE "AVX" REJECT "AVX2")
14+
add_bzero("bzero_${LIBC_TARGET_ARCHITECTURE}_opt_avx512f" REQUIRE "AVX512F")

0 commit comments

Comments
 (0)