diff --git a/CMakeLists.txt b/CMakeLists.txt index 11dac3e5a8..f1a3ac1bca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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" diff --git a/ThunkLibs/GuestLibs/CMakeLists.txt b/ThunkLibs/GuestLibs/CMakeLists.txt index 4079e74737..4ef51ed40a 100644 --- a/ThunkLibs/GuestLibs/CMakeLists.txt +++ b/ThunkLibs/GuestLibs/CMakeLists.txt @@ -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 diff --git a/ThunkLibs/HostLibs/CMakeLists.txt b/ThunkLibs/HostLibs/CMakeLists.txt index 90f7c928f7..124c66a653 100644 --- a/ThunkLibs/HostLibs/CMakeLists.txt +++ b/ThunkLibs/HostLibs/CMakeLists.txt @@ -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: diff --git a/ThunkLibs/include/common/Guest.h b/ThunkLibs/include/common/Guest.h index 2bd0c3b91f..bb357a4119 100644 --- a/ThunkLibs/include/common/Guest.h +++ b/ThunkLibs/include/common/Guest.h @@ -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 THUNK_ABI diff --git a/ThunkLibs/libVDSO/libVDSO_Guest.lds b/ThunkLibs/libVDSO/libVDSO_Guest.lds index 5a3bba7a5f..cb5bcc283d 100644 --- a/ThunkLibs/libVDSO/libVDSO_Guest.lds +++ b/ThunkLibs/libVDSO/libVDSO_Guest.lds @@ -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 { diff --git a/ThunkLibs/libVDSO/libVDSO_Guest_32.lds b/ThunkLibs/libVDSO/libVDSO_Guest_32.lds index 8febf830eb..cccb1488b3 100644 --- a/ThunkLibs/libVDSO/libVDSO_Guest_32.lds +++ b/ThunkLibs/libVDSO/libVDSO_Guest_32.lds @@ -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 { diff --git a/toolchain_x86_32.cmake b/toolchain_x86_32.cmake index 0ebaeeb33f..89e3134d3d 100644 --- a/toolchain_x86_32.cmake +++ b/toolchain_x86_32.cmake @@ -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() diff --git a/toolchain_x86_64.cmake b/toolchain_x86_64.cmake index 8af0f8473f..9aa856a019 100644 --- a/toolchain_x86_64.cmake +++ b/toolchain_x86_64.cmake @@ -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()