Skip to content

Commit 0bc73dd

Browse files
marcaubereraengelke
authored andcommitted
[CMake] Make target architectures to build configurable
1 parent ddf19b0 commit 0bc73dd

5 files changed

Lines changed: 115 additions & 75 deletions

File tree

CMakeLists.txt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,22 @@ else ()
7676
endif ()
7777
endif ()
7878

79+
# CAUTION: This option is untested and it is recommended to always use all available targets
80+
set(TPDE_TARGETS "x86_64;aarch64" CACHE STRING "Target architectures: x86_64;aarch64 (semicolon-separated)")
81+
set(_allowed_archs "x86_64" "aarch64")
82+
foreach(arch IN LISTS TPDE_TARGETS)
83+
list(FIND _allowed_archs "${arch}" _idx)
84+
if(_idx EQUAL -1)
85+
message(FATAL_ERROR "Invalid architecture '${arch}'. Allowed: ${_allowed_archs}")
86+
endif()
87+
88+
string(TOUPPER ${arch} arch_upper)
89+
add_compile_definitions(TPDE_ARCH_${arch_upper})
90+
endforeach()
91+
if(NOT TPDE_TARGETS)
92+
message(FATAL_ERROR "No target architectures specified")
93+
endif()
94+
7995
if (TPDE_ENABLE_COVERAGE)
8096
if (NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
8197
error("coverage build only supported with Clang")
@@ -120,6 +136,10 @@ endif()
120136
if (TPDE_INCLUDE_TESTS)
121137
find_program(LIT NAMES ${LLVM_DEFAULT_EXTERNAL_LIT} lit llvm-lit REQUIRED)
122138
message(STATUS "Found lit: ${LIT}")
139+
140+
if (NOT ("x86_64" IN_LIST TPDE_TARGETS AND "aarch64" IN_LIST TPDE_TARGETS))
141+
message(FATAL_ERROR "Not all targets are enabled. Please enable all by not setting -DTPDE_TARGETS")
142+
endif ()
123143
endif ()
124144

125145
function(add_tpde_lit_target target)

tpde-encodegen/CMakeLists.txt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,18 @@ target_include_directories(tpde_encodegen SYSTEM PRIVATE ${LLVM_INCLUDE_DIRS})
1616
target_compile_definitions(tpde_encodegen PRIVATE ${LLVM_DEFINITIONS})
1717
target_compile_options(tpde_encodegen PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:-fno-rtti;-fno-exceptions>")
1818
if (TPDE_LINK_LLVM_STATIC)
19-
llvm_map_components_to_libnames(TPDE_ENCODEGEN_LLVM_LIBS
20-
core X86 AArch64 CodeGen irreader irprinter passes mc support targetparser asmparser asmprinter bitreader bitstreamreader
19+
set(LLVM_COMPONENTS
20+
core CodeGen irreader irprinter passes mc support targetparser asmparser asmprinter bitreader bitstreamreader
2121
)
22+
23+
if (x86_64 IN_LIST TPDE_TARGETS)
24+
list(APPEND LLVM_COMPONENTS X86)
25+
endif()
26+
if (aarch64 IN_LIST TPDE_TARGETS)
27+
list(APPEND LLVM_COMPONENTS AArch64)
28+
endif()
29+
30+
llvm_map_components_to_libnames(TPDE_ENCODEGEN_LLVM_LIBS ${LLVM_COMPONENTS})
2231
target_link_libraries(tpde_encodegen PRIVATE ${TPDE_ENCODEGEN_LLVM_LIBS})
2332
else ()
2433
target_link_libraries(tpde_encodegen PRIVATE LLVM)

tpde-encodegen/src/main.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,15 +106,18 @@ int main(const int argc, char *argv[]) {
106106
#endif
107107

108108
// Required so that our target triple is actually found
109+
#ifdef TPDE_ARCH_X86_64
109110
LLVMInitializeX86TargetInfo();
110-
LLVMInitializeAArch64TargetInfo();
111111
LLVMInitializeX86Target();
112-
LLVMInitializeAArch64Target();
113112
LLVMInitializeX86TargetMC();
114-
LLVMInitializeAArch64TargetMC();
115113
LLVMInitializeX86AsmPrinter();
114+
#endif
115+
#ifdef TPDE_ARCH_AARCH64
116+
LLVMInitializeAArch64TargetInfo();
117+
LLVMInitializeAArch64Target();
118+
LLVMInitializeAArch64TargetMC();
116119
LLVMInitializeAArch64AsmPrinter();
117-
120+
#endif
118121

119122
std::string error;
120123
const llvm::Target *target =

tpde-llvm/CMakeLists.txt

Lines changed: 73 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -118,77 +118,81 @@ find_program(TPDE_CLANG NO_CACHE REQUIRED
118118
VALIDATOR check_clang_version)
119119
message(STATUS "Found Clang: " ${TPDE_CLANG})
120120

121-
add_custom_command(
122-
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/encode_template_x64.bc
123-
COMMAND ${TPDE_CLANG} -c -emit-llvm -ffreestanding -fcf-protection=none
124-
-O3 -fomit-frame-pointer -fno-math-errno
125-
--target=x86_64-linux -march=x86-64-v4
126-
-o ${CMAKE_CURRENT_BINARY_DIR}/encode_template_x64.bc
127-
${CMAKE_CURRENT_SOURCE_DIR}/src/encode_template.c
128-
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/encode_template.c
129-
)
130-
add_custom_command(
131-
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/encode_template_x64.hpp
132-
COMMAND tpde_encodegen
133-
-o ${CMAKE_CURRENT_BINARY_DIR}/encode_template_x64.hpp
134-
${CMAKE_CURRENT_BINARY_DIR}/encode_template_x64.bc
135-
DEPENDS
136-
tpde_encodegen
137-
${CMAKE_CURRENT_BINARY_DIR}/encode_template_x64.bc
138-
)
139-
140-
target_compile_definitions(tpde_llvm PRIVATE TPDE_LLVM_X64)
141-
target_sources(tpde_llvm PRIVATE
142-
src/x64/LLVMCompilerX64.cpp
143-
144-
PRIVATE
145-
FILE_SET priv_headers TYPE HEADERS
146-
BASE_DIRS src
147-
FILES
148-
src/x64/LLVMCompilerX64.hpp
149-
150-
PRIVATE
151-
FILE_SET encodegen TYPE HEADERS
152-
BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR}
153-
FILES
154-
${CMAKE_CURRENT_BINARY_DIR}/encode_template_x64.hpp
155-
)
156-
157-
add_custom_command(
158-
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/encode_template_arm64.bc
159-
COMMAND ${TPDE_CLANG} -c -emit-llvm -ffreestanding -fcf-protection=none
160-
-O3 -fomit-frame-pointer -fno-math-errno
161-
--target=aarch64 -march=armv8.1-a
162-
-o ${CMAKE_CURRENT_BINARY_DIR}/encode_template_arm64.bc
163-
${CMAKE_CURRENT_SOURCE_DIR}/src/encode_template.c
164-
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/encode_template.c
165-
)
166-
add_custom_command(
167-
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/encode_template_arm64.hpp
168-
COMMAND tpde_encodegen
169-
-o ${CMAKE_CURRENT_BINARY_DIR}/encode_template_arm64.hpp
170-
${CMAKE_CURRENT_BINARY_DIR}/encode_template_arm64.bc
171-
DEPENDS
172-
tpde_encodegen
173-
${CMAKE_CURRENT_BINARY_DIR}/encode_template_arm64.bc
174-
)
175-
176-
target_compile_definitions(tpde_llvm PRIVATE TPDE_LLVM_ARM64)
177-
target_sources(tpde_llvm PRIVATE
178-
src/arm64/LLVMCompilerArm64.cpp
121+
if ("x86_64" IN_LIST TPDE_TARGETS)
122+
add_custom_command(
123+
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/encode_template_x64.bc
124+
COMMAND ${TPDE_CLANG} -c -emit-llvm -ffreestanding -fcf-protection=none
125+
-O3 -fomit-frame-pointer -fno-math-errno
126+
--target=x86_64-linux -march=x86-64-v4
127+
-o ${CMAKE_CURRENT_BINARY_DIR}/encode_template_x64.bc
128+
${CMAKE_CURRENT_SOURCE_DIR}/src/encode_template.c
129+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/encode_template.c
130+
)
131+
add_custom_command(
132+
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/encode_template_x64.hpp
133+
COMMAND tpde_encodegen
134+
-o ${CMAKE_CURRENT_BINARY_DIR}/encode_template_x64.hpp
135+
${CMAKE_CURRENT_BINARY_DIR}/encode_template_x64.bc
136+
DEPENDS
137+
tpde_encodegen
138+
${CMAKE_CURRENT_BINARY_DIR}/encode_template_x64.bc
139+
)
179140

180-
PRIVATE
181-
FILE_SET priv_headers TYPE HEADERS
182-
BASE_DIRS src
183-
FILES
184-
src/arm64/LLVMCompilerArm64.hpp
141+
target_compile_definitions(tpde_llvm PRIVATE TPDE_LLVM_X64)
142+
target_sources(tpde_llvm PRIVATE
143+
src/x64/LLVMCompilerX64.cpp
144+
145+
PRIVATE
146+
FILE_SET priv_headers TYPE HEADERS
147+
BASE_DIRS src
148+
FILES
149+
src/x64/LLVMCompilerX64.hpp
150+
151+
PRIVATE
152+
FILE_SET encodegen TYPE HEADERS
153+
BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR}
154+
FILES
155+
${CMAKE_CURRENT_BINARY_DIR}/encode_template_x64.hpp
156+
)
157+
endif()
158+
159+
if ("aarch64" IN_LIST TPDE_TARGETS)
160+
add_custom_command(
161+
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/encode_template_arm64.bc
162+
COMMAND ${TPDE_CLANG} -c -emit-llvm -ffreestanding -fcf-protection=none
163+
-O3 -fomit-frame-pointer -fno-math-errno
164+
--target=aarch64 -march=armv8.1-a
165+
-o ${CMAKE_CURRENT_BINARY_DIR}/encode_template_arm64.bc
166+
${CMAKE_CURRENT_SOURCE_DIR}/src/encode_template.c
167+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/encode_template.c
168+
)
169+
add_custom_command(
170+
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/encode_template_arm64.hpp
171+
COMMAND tpde_encodegen
172+
-o ${CMAKE_CURRENT_BINARY_DIR}/encode_template_arm64.hpp
173+
${CMAKE_CURRENT_BINARY_DIR}/encode_template_arm64.bc
174+
DEPENDS
175+
tpde_encodegen
176+
${CMAKE_CURRENT_BINARY_DIR}/encode_template_arm64.bc
177+
)
185178

186-
PRIVATE
187-
FILE_SET encodegen TYPE HEADERS
188-
BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR}
189-
FILES
190-
${CMAKE_CURRENT_BINARY_DIR}/encode_template_arm64.hpp
191-
)
179+
target_compile_definitions(tpde_llvm PRIVATE TPDE_LLVM_ARM64)
180+
target_sources(tpde_llvm PRIVATE
181+
src/arm64/LLVMCompilerArm64.cpp
182+
183+
PRIVATE
184+
FILE_SET priv_headers TYPE HEADERS
185+
BASE_DIRS src
186+
FILES
187+
src/arm64/LLVMCompilerArm64.hpp
188+
189+
PRIVATE
190+
FILE_SET encodegen TYPE HEADERS
191+
BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR}
192+
FILES
193+
${CMAKE_CURRENT_BINARY_DIR}/encode_template_arm64.hpp
194+
)
195+
endif()
192196

193197

194198
# tpde-llc binary

tpde-llvm/src/LLVMCompiler.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,12 @@ LLVMCompiler::~LLVMCompiler() = default;
1515

1616
std::unique_ptr<LLVMCompiler> LLVMCompiler::create(const llvm::Triple &triple) {
1717
switch (triple.getArch()) {
18+
#ifdef TPDE_ARCH_X86_64
1819
case llvm::Triple::x86_64: return x64::create_compiler(triple);
20+
#endif
21+
#ifdef TPDE_ARCH_AARCH64
1922
case llvm::Triple::aarch64: return arm64::create_compiler(triple);
23+
#endif
2024
default: return nullptr;
2125
}
2226
}

0 commit comments

Comments
 (0)