mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-06 08:00:15 +02:00
Thunks: Add support for building with clang
Fairly straightforward, just requires enabling lld in this case since cross-compiling doesn't work well with gnu linker. Also lld doesn't understand the linker script program header symbolic names for read/write/execute. So we need to use the raw number there. Works around an issue where GCC 11 generates broken `init_array` section and also plt sections that glibc doesn't understand.
This commit is contained in:
1 parent
7b4b9a80fa
commit
b75e8f2abf
8 files changed
+61
-10
No files matched your search
@@ -7,6 +7,7 @@ CHECK_INCLUDE_FILES ("gdb/jit-reader.h" HAVE_GDB_JIT_READER_H)
|
||||
option(BUILD_TESTS "Build unit tests to ensure sanity" TRUE)
|
||||
option(BUILD_FEX_LINUX_TESTS "Build FEXLinuxTests, requires x86 compiler" FALSE)
|
||||
option(BUILD_THUNKS "Build thunks" FALSE)
|
||||
option(BUILD_CLANG_THUNKS "Build thunks with clang" FALSE)
|
||||
option(ENABLE_CLANG_FORMAT "Run clang format over the source" FALSE)
|
||||
option(ENABLE_IWYU "Enables include what you use program" FALSE)
|
||||
option(ENABLE_LTO "Enable LTO with compilation" TRUE)
|
||||
@@ -415,6 +416,7 @@ if (BUILD_THUNKS)
|
||||
CMAKE_ARGS
|
||||
"-DBITNESS=64"
|
||||
"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
|
||||
"-DENABLE_CLANG_THUNKS=${ENABLE_CLANG_THUNKS}"
|
||||
"-DCMAKE_TOOLCHAIN_FILE:FILEPATH=${X86_64_TOOLCHAIN_FILE}"
|
||||
"-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}"
|
||||
"-DSTRUCT_VERIFIER=${CMAKE_SOURCE_DIR}/Scripts/StructPackVerifier.py"
|
||||
@@ -432,6 +434,7 @@ if (BUILD_THUNKS)
|
||||
CMAKE_ARGS
|
||||
"-DBITNESS=32"
|
||||
"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
|
||||
"-DENABLE_CLANG_THUNKS=${ENABLE_CLANG_THUNKS}"
|
||||
"-DCMAKE_TOOLCHAIN_FILE:FILEPATH=${X86_32_TOOLCHAIN_FILE}"
|
||||
"-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}"
|
||||
"-DSTRUCT_VERIFIER=${CMAKE_SOURCE_DIR}/Scripts/StructPackVerifier.py"
|
||||
|
||||
@@ -2,6 +2,12 @@ cmake_minimum_required(VERSION 3.14)
|
||||
project(guest-thunks)
|
||||
|
||||
option(BITNESS "Which bitness the thunks are building for" 64)
|
||||
option(ENABLE_CLANG_THUNKS "Enable building thunks with clang" FALSE)
|
||||
|
||||
if (ENABLE_CLANG_THUNKS)
|
||||
set (LD_OVERRIDE "-fuse-ld=lld")
|
||||
add_link_options(${LD_OVERRIDE})
|
||||
endif()
|
||||
|
||||
if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
|
||||
# We've been included using ExternalProject_add, so set up the actual thunk libraries to be cross-compiled
|
||||
|
||||
@@ -3,6 +3,12 @@ project(host-thunks)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set (HOSTLIBS_DATA_DIRECTORY "${CMAKE_INSTALL_PREFIX}/lib/fex-emu" CACHE PATH "global data directory")
|
||||
option(ENABLE_CLANG_THUNKS "Enable building thunks with clang" FALSE)
|
||||
|
||||
if (ENABLE_CLANG_THUNKS)
|
||||
set (LD_OVERRIDE "-fuse-ld=lld")
|
||||
add_link_options(${LD_OVERRIDE})
|
||||
endif()
|
||||
|
||||
# Syntax: generate(libxyz libxyz-interface.cpp)
|
||||
# This defines two targets and a custom command:
|
||||
|
||||
@@ -7,8 +7,12 @@
|
||||
#if __SIZEOF_POINTER__ == 8
|
||||
#define THUNK_ABI
|
||||
#else
|
||||
#ifdef __clang__
|
||||
#define THUNK_ABI __fastcall
|
||||
#else
|
||||
#define THUNK_ABI [[gnu::fastcall]]
|
||||
#endif
|
||||
#endif
|
||||
|
||||
template<typename signature>
|
||||
THUNK_ABI
|
||||
|
||||
@@ -29,9 +29,9 @@ SECTIONS {
|
||||
}
|
||||
|
||||
PHDRS {
|
||||
text PT_LOAD FLAGS(PF_R | PF_X) FILEHDR PHDRS;
|
||||
dynamic PT_DYNAMIC FLAGS(PF_R);
|
||||
note PT_NOTE FLAGS(PF_R);
|
||||
text PT_LOAD FLAGS(4 | 1) FILEHDR PHDRS;
|
||||
dynamic PT_DYNAMIC FLAGS(4);
|
||||
note PT_NOTE FLAGS(4);
|
||||
}
|
||||
|
||||
VERSION {
|
||||
|
||||
@@ -29,9 +29,9 @@ SECTIONS {
|
||||
}
|
||||
|
||||
PHDRS {
|
||||
text PT_LOAD FLAGS(PF_R | PF_X) FILEHDR PHDRS;
|
||||
dynamic PT_DYNAMIC FLAGS(PF_R);
|
||||
note PT_NOTE FLAGS(PF_R);
|
||||
text PT_LOAD FLAGS(4 | 1) FILEHDR PHDRS;
|
||||
dynamic PT_DYNAMIC FLAGS(4);
|
||||
note PT_NOTE FLAGS(4);
|
||||
}
|
||||
|
||||
VERSION {
|
||||
|
||||
+18
-2
@@ -1,4 +1,20 @@
|
||||
option(ENABLE_CLANG_THUNKS "Enable building thunks with clang" FALSE)
|
||||
|
||||
set(CMAKE_SYSTEM_PROCESSOR i686)
|
||||
|
||||
set(CMAKE_C_COMPILER x86_64-linux-gnu-gcc -m32)
|
||||
set(CMAKE_CXX_COMPILER x86_64-linux-gnu-g++ -m32)
|
||||
if (ENABLE_CLANG_THUNKS)
|
||||
message(STATUS "Enabling thunk clang building. Force enabling LLD as well")
|
||||
|
||||
set(CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=lld")
|
||||
set(CMAKE_MODULE_LINKER_FLAGS_INIT "-fuse-ld=lld")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=lld")
|
||||
set(CMAKE_C_COMPILER clang)
|
||||
set(CMAKE_CXX_COMPILER clang++)
|
||||
set(CLANG_FLAGS "-target i686-linux-gnu -msse2 -mfpmath=sse")
|
||||
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CLANG_FLAGS}")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CLANG_FLAGS}")
|
||||
else()
|
||||
set(CMAKE_C_COMPILER x86_64-linux-gnu-gcc -m32)
|
||||
set(CMAKE_CXX_COMPILER x86_64-linux-gnu-g++ -m32)
|
||||
endif()
|
||||
+18
-2
@@ -1,4 +1,20 @@
|
||||
option(ENABLE_CLANG_THUNKS "Enable building thunks with clang" FALSE)
|
||||
|
||||
set(CMAKE_SYSTEM_PROCESSOR x86_64)
|
||||
|
||||
set(CMAKE_C_COMPILER x86_64-linux-gnu-gcc)
|
||||
set(CMAKE_CXX_COMPILER x86_64-linux-gnu-g++)
|
||||
if (ENABLE_CLANG_THUNKS)
|
||||
message(STATUS "Enabling thunk clang building. Force enabling LLD as well")
|
||||
|
||||
set(CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=lld")
|
||||
set(CMAKE_MODULE_LINKER_FLAGS_INIT "-fuse-ld=lld")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=lld")
|
||||
set(CMAKE_C_COMPILER clang)
|
||||
set(CMAKE_CXX_COMPILER clang++)
|
||||
set(CLANG_FLAGS "-target x86_64-linux-gnu")
|
||||
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CLANG_FLAGS}")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CLANG_FLAGS}")
|
||||
else()
|
||||
set(CMAKE_C_COMPILER x86_64-linux-gnu-gcc)
|
||||
set(CMAKE_CXX_COMPILER x86_64-linux-gnu-g++)
|
||||
endif()
|
||||
Reference in new issue
Block a user