Skip to content

[compiler-rt] Add CMake option to enable execute-only code generation on AArch64 #140555

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions compiler-rt/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,12 @@ option(COMPILER_RT_USE_BUILTINS_LIBRARY

option(COMPILER_RT_USE_ATOMIC_LIBRARY "Use compiler-rt atomic instead of libatomic" OFF)

option(COMPILER_RT_EXECUTE_ONLY_CODE "Compile compiler-rt as execute-only" OFF)
if (COMPILER_RT_EXECUTE_ONLY_CODE AND NOT LLVM_RUNTIMES_BUILD)
message(SEND_ERROR "COMPILER_RT_EXECUTE_ONLY_CODE is only supported "
"for runtimes build of compiler-rt.")
endif()

include(config-ix)

#================================
Expand Down Expand Up @@ -603,6 +609,20 @@ string(REGEX REPLACE "-stdlib=[a-zA-Z+]*" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}
list(APPEND COMPILER_RT_COMMON_CFLAGS ${stdlib_flag})
list(APPEND COMPILER_RT_COMMON_LINK_FLAGS ${stdlib_flag})

# Add flags for execute-only code generation.
# We need to add to both COMPILER_RT_COMMON_CFLAGS and CMAKE_<LANG>_FLAGS.
if (COMPILER_RT_HAS_MEXECUTE_ONLY_FLAG)
append_list_if(COMPILER_RT_EXECUTE_ONLY_CODE -mexecute-only COMPILER_RT_COMMON_CFLAGS)
append_list_if(COMPILER_RT_EXECUTE_ONLY_CODE -DCOMPILER_RT_EXECUTE_ONLY_CODE COMPILER_RT_COMMON_CFLAGS)
append_string_if(COMPILER_RT_EXECUTE_ONLY_CODE -mexecute-only CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
append_string_if(COMPILER_RT_EXECUTE_ONLY_CODE -DCOMPILER_RT_EXECUTE_ONLY_CODE CMAKE_ASM_FLAGS)
elseif (COMPILER_RT_HAS_MPURE_CODE_FLAG)
append_list_if(COMPILER_RT_EXECUTE_ONLY_CODE -mpure-code COMPILER_RT_COMMON_CFLAGS)
append_list_if(COMPILER_RT_EXECUTE_ONLY_CODE -DCOMPILER_RT_EXECUTE_ONLY_CODE COMPILER_RT_COMMON_CFLAGS)
append_string_if(COMPILER_RT_EXECUTE_ONLY_CODE -mpure-code CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
append_string_if(COMPILER_RT_EXECUTE_ONLY_CODE -DCOMPILER_RT_EXECUTE_ONLY_CODE CMAKE_ASM_FLAGS)
endif()

# TODO: There's a lot of duplication across lib/*/tests/CMakeLists.txt files,
# move some of the common flags to COMPILER_RT_UNITTEST_CFLAGS.

Expand Down
2 changes: 2 additions & 0 deletions compiler-rt/cmake/builtin-config-ix.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ builtin_check_c_compiler_flag("-Xclang -mcode-object-version=none" COMPILER_RT_H
builtin_check_c_compiler_flag(-Wbuiltin-declaration-mismatch COMPILER_RT_HAS_WBUILTIN_DECLARATION_MISMATCH_FLAG)
builtin_check_c_compiler_flag(/Zl COMPILER_RT_HAS_ZL_FLAG)
builtin_check_c_compiler_flag(-fcf-protection=full COMPILER_RT_HAS_FCF_PROTECTION_FLAG)
builtin_check_c_compiler_flag(-mexecute-only COMPILER_RT_HAS_MEXECUTE_ONLY_FLAG)
builtin_check_c_compiler_flag(-mpure-code COMPILER_RT_HAS_MPURE_CODE_FLAG)

builtin_check_c_compiler_source(COMPILER_RT_HAS_ATOMIC_KEYWORD
"
Expand Down
2 changes: 2 additions & 0 deletions compiler-rt/cmake/config-ix.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,8 @@ check_cxx_compiler_flag(--sysroot=. COMPILER_RT_HAS_SYSROOT_FLAG)
check_cxx_compiler_flag("-Werror -mcrc" COMPILER_RT_HAS_MCRC_FLAG)
check_cxx_compiler_flag(-fno-partial-inlining COMPILER_RT_HAS_FNO_PARTIAL_INLINING_FLAG)
check_cxx_compiler_flag("-Werror -ftrivial-auto-var-init=pattern" COMPILER_RT_HAS_TRIVIAL_AUTO_INIT)
check_cxx_compiler_flag(-mexecute-only COMPILER_RT_HAS_MEXECUTE_ONLY_FLAG)
check_cxx_compiler_flag(-mpure-code COMPILER_RT_HAS_MPURE_CODE_FLAG)

if(NOT WIN32 AND NOT CYGWIN)
# MinGW warns if -fvisibility-inlines-hidden is used.
Expand Down
15 changes: 14 additions & 1 deletion compiler-rt/lib/builtins/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -885,6 +885,7 @@ else ()
cmake_push_check_state()
# TODO: we should probably make most of the checks in builtin-config depend on the target flags.
set(BUILTIN_CFLAGS_${arch} ${BUILTIN_CFLAGS})
set(BUILTIN_DEFS_${arch} ${BUILTIN_DEFS})
# CMAKE_REQUIRED_FLAGS must be a space separated string
# Join BUILTIN_CFLAGS_${arch} and TARGET_${arch}_CFLAGS as a
# space-separated string.
Expand Down Expand Up @@ -922,6 +923,13 @@ else ()
if(COMPILER_RT_HAS_${arch}_BFLOAT16)
list(APPEND ${arch}_SOURCES ${BF16_SOURCES})
endif()
if (COMPILER_RT_HAS_MEXECUTE_ONLY_FLAG)
append_list_if(COMPILER_RT_EXECUTE_ONLY_CODE -mexecute-only BUILTIN_CFLAGS_${arch})
append_list_if(COMPILER_RT_EXECUTE_ONLY_CODE COMPILER_RT_EXECUTE_ONLY_CODE BUILTIN_DEFS_${arch})
elseif (COMPILER_RT_HAS_MPURE_CODE_FLAG)
append_list_if(COMPILER_RT_EXECUTE_ONLY_CODE -mpure-code BUILTIN_CFLAGS_${arch})
append_list_if(COMPILER_RT_EXECUTE_ONLY_CODE COMPILER_RT_EXECUTE_ONLY_CODE BUILTIN_DEFS_${arch})
endif()

# Remove a generic C builtin when an arch-specific builtin is specified.
filter_builtin_sources(${arch}_SOURCES ${arch})
Expand All @@ -943,7 +951,7 @@ else ()
ARCHS ${arch}
DEPS ${deps_${arch}}
SOURCES ${${arch}_SOURCES}
DEFS ${BUILTIN_DEFS}
DEFS ${BUILTIN_DEFS_${arch}}
CFLAGS ${BUILTIN_CFLAGS_${arch}}
PARENT_TARGET builtins)
cmake_pop_check_state()
Expand Down Expand Up @@ -1015,6 +1023,11 @@ if (COMPILER_RT_BUILD_CRT)
if (COMPILER_RT_HAS_FCF_PROTECTION_FLAG)
append_list_if(COMPILER_RT_ENABLE_CET -fcf-protection=full CRT_CFLAGS)
endif()
if (COMPILER_RT_HAS_MEXECUTE_ONLY_FLAG)
append_list_if(COMPILER_RT_EXECUTE_ONLY_CODE -mexecute-only CRT_CFLAGS)
elseif (COMPILER_RT_HAS_MPURE_CODE_FLAG)
append_list_if(COMPILER_RT_EXECUTE_ONLY_CODE -mpure-code CRT_CFLAGS)
endif()

foreach(arch ${BUILTIN_SUPPORTED_ARCH})
add_compiler_rt_runtime(clang_rt.crtbegin
Expand Down
15 changes: 14 additions & 1 deletion compiler-rt/lib/builtins/assembly.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,17 @@

#endif

#if defined(__aarch64__) && defined(__ELF__) && \
defined(COMPILER_RT_EXECUTE_ONLY_CODE)
#define TEXT_SECTION \
.section .text,"axy",@progbits,unique,0
#else
#define TEXT_SECTION \
.text
#endif

#if defined(__arm__) || defined(__aarch64__) || defined(__arm64ec__)
#define FUNC_ALIGN \
.text SEPARATOR \
.balign 16 SEPARATOR
#else
#define FUNC_ALIGN
Expand Down Expand Up @@ -230,6 +238,7 @@
#endif

#define DEFINE_COMPILERRT_FUNCTION(name) \
TEXT_SECTION SEPARATOR \
DEFINE_CODE_STATE \
FILE_LEVEL_DIRECTIVE SEPARATOR \
.globl FUNC_SYMBOL(SYMBOL_NAME(name)) SEPARATOR \
Expand All @@ -239,6 +248,7 @@
FUNC_SYMBOL(SYMBOL_NAME(name)):

#define DEFINE_COMPILERRT_THUMB_FUNCTION(name) \
TEXT_SECTION SEPARATOR \
DEFINE_CODE_STATE \
FILE_LEVEL_DIRECTIVE SEPARATOR \
.globl FUNC_SYMBOL(SYMBOL_NAME(name)) SEPARATOR \
Expand All @@ -248,6 +258,7 @@
FUNC_SYMBOL(SYMBOL_NAME(name)):

#define DEFINE_COMPILERRT_PRIVATE_FUNCTION(name) \
TEXT_SECTION SEPARATOR \
DEFINE_CODE_STATE \
FILE_LEVEL_DIRECTIVE SEPARATOR \
.globl FUNC_SYMBOL(SYMBOL_NAME(name)) SEPARATOR \
Expand All @@ -257,6 +268,7 @@
FUNC_SYMBOL(SYMBOL_NAME(name)):

#define DEFINE_COMPILERRT_PRIVATE_FUNCTION_UNMANGLED(name) \
TEXT_SECTION SEPARATOR \
DEFINE_CODE_STATE \
.globl FUNC_SYMBOL(name) SEPARATOR \
SYMBOL_IS_FUNC(name) SEPARATOR \
Expand All @@ -265,6 +277,7 @@
FUNC_SYMBOL(name):

#define DEFINE_COMPILERRT_OUTLINE_FUNCTION_UNMANGLED(name) \
TEXT_SECTION SEPARATOR \
DEFINE_CODE_STATE \
FUNC_ALIGN \
.globl FUNC_SYMBOL(name) SEPARATOR \
Expand Down
4 changes: 3 additions & 1 deletion compiler-rt/lib/fuzzer/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,10 @@ if(OS_NAME MATCHES "Android|Linux|Fuchsia" AND
CMAKE_ARGS -DCMAKE_CXX_COMPILER_WORKS=ON
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
-DLIBCXXABI_ENABLE_EXCEPTIONS=OFF
-DLIBCXXABI_EXECUTE_ONLY_CODE=${COMPILER_RT_EXECUTE_ONLY_CODE}
-DLIBCXX_ABI_NAMESPACE=__Fuzzer
-DLIBCXX_ENABLE_EXCEPTIONS=OFF)
-DLIBCXX_ENABLE_EXCEPTIONS=OFF
-DLIBCXX_EXECUTE_ONLY_CODE=${COMPILER_RT_EXECUTE_ONLY_CODE})
target_compile_options(RTfuzzer.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1)
add_dependencies(RTfuzzer.${arch} libcxx_fuzzer_${arch}-install-cmake326-workaround)
target_compile_options(RTfuzzer_main.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1)
Expand Down
2 changes: 1 addition & 1 deletion compiler-rt/lib/hwasan/hwasan_setjmp_aarch64.S
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
// stack pointer when compiling a C function.
// Hence we have to write this function in assembly.

.section .text
TEXT_SECTION
.file "hwasan_setjmp_aarch64.S"

.global ASM_WRAPPER_NAME(setjmp)
Expand Down
2 changes: 1 addition & 1 deletion compiler-rt/lib/hwasan/hwasan_tag_mismatch_aarch64.S
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@
// clobbering the x17 register in error reports, and that the program will have
// a runtime dependency on the __hwasan_tag_mismatch_v2 symbol therefore it will
// fail to start up given an older (i.e. incompatible) runtime.
.section .text
TEXT_SECTION
.file "hwasan_tag_mismatch_aarch64.S"
.global __hwasan_tag_mismatch
.type __hwasan_tag_mismatch, %function
Expand Down
2 changes: 2 additions & 0 deletions compiler-rt/lib/msan/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,8 @@ if(COMPILER_RT_CAN_EXECUTE_TESTS AND
add_custom_libcxx(libcxx_msan_${arch} ${LIBCXX_PREFIX}
DEPS ${MSAN_RUNTIME_LIBRARIES}
CFLAGS ${MSAN_LIBCXX_CFLAGS} ${TARGET_CFLAGS}
CMAKE_ARGS -DLIBCXX_EXECUTE_ONLY_CODE=${COMPILER_RT_EXECUTE_ONLY_CODE}
-DLIBCXXABI_EXECUTE_ONLY_CODE=${COMPILER_RT_EXECUTE_ONLY_CODE}
USE_TOOLCHAIN)
set(MSAN_LIBCXX_DIR ${LIBCXX_PREFIX}/lib/)

Expand Down
4 changes: 4 additions & 0 deletions compiler-rt/lib/orc/elfnix_tls.aarch64.S
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@

#define REGISTER_SAVE_SPACE_SIZE 32 * 24

#if defined(COMPILER_RT_EXECUTE_ONLY_CODE)
.section .text,"axy",@progbits,unique,0
#else
.text
#endif

// returns address of TLV in x0, all other registers preserved
// TODO: add fast-path for repeat access
Expand Down
4 changes: 4 additions & 0 deletions compiler-rt/lib/orc/sysv_reenter.arm64.S
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,11 @@
// The content of this file is arm64-only
#if defined(__arm64__) || defined(__aarch64__)

#if defined(__ELF__) && defined(COMPILER_RT_EXECUTE_ONLY_CODE)
.section .text,"axy",@progbits,unique,0
#else
.text
#endif

// Saves GPRs, calls __orc_rt_resolve
.globl __orc_rt_sysv_reenter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

ASM_HIDDEN(COMMON_INTERCEPTOR_SPILL_AREA)

TEXT_SECTION
.comm _ZN14__interception10real_vforkE,8,8
.globl ASM_WRAPPER_NAME(vfork)
ASM_TYPE_FUNCTION(ASM_WRAPPER_NAME(vfork))
Expand Down
2 changes: 2 additions & 0 deletions compiler-rt/lib/tsan/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ if(COMPILER_RT_LIBCXX_PATH AND
add_custom_libcxx(libcxx_tsan_${arch} ${LIBCXX_PREFIX}
DEPS ${TSAN_RUNTIME_LIBRARIES}
CFLAGS ${TARGET_CFLAGS} -fsanitize=thread
CMAKE_ARGS -DLIBCXX_EXECUTE_ONLY_CODE=${COMPILER_RT_EXECUTE_ONLY_CODE}
-DLIBCXXABI_EXECUTE_ONLY_CODE=${COMPILER_RT_EXECUTE_ONLY_CODE}
USE_TOOLCHAIN)
list(APPEND libcxx_tsan_deps libcxx_tsan_${arch}-install-cmake326-workaround)
endforeach()
Expand Down
6 changes: 2 additions & 4 deletions compiler-rt/lib/tsan/rtl/tsan_rtl_aarch64.S
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,8 @@
#include "sanitizer_common/sanitizer_asm.h"
#include "builtins/assembly.h"

#if !defined(__APPLE__)
.section .text
#else
.section __TEXT,__text
TEXT_SECTION
#if defined(__APPLE__)
.align 3
#endif

Expand Down
2 changes: 1 addition & 1 deletion compiler-rt/lib/xray/xray_trampoline_AArch64.S
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
#endif
.endm

.text
TEXT_SECTION
.p2align 2
.global ASM_SYMBOL(__xray_FunctionEntry)
ASM_HIDDEN(__xray_FunctionEntry)
Expand Down
Loading