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 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
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
4 changes: 4 additions & 0 deletions compiler-rt/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,10 @@ 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 assembler flags for execute-only code generation. C and C++ flags should have already
# been added to CMAKE_C_FLAGS and CMAKE_CXX_FLAGS.
append_string_if(LLVM_EXECUTE_ONLY_CODE -DCOMPILER_RT_EXECUTE_ONLY_CODE CMAKE_ASM_FLAGS)

# 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
22 changes: 21 additions & 1 deletion compiler-rt/lib/builtins/assembly.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,24 @@

#endif

#if defined(__aarch64__) && defined(__ELF__) && \
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do wish that there was a compiler driven macro that we could check instead.

defined(COMPILER_RT_EXECUTE_ONLY_CODE)
// The assembler always creates an implicit '.text' section with default flags
// (SHF_ALLOC | SHF_EXECINSTR), which is incompatible with the execute-only
// '.text' section we want to create here because of the missing
// SHF_AARCH64_PURECODE section flag. To solve this, we use 'unique,0' to
// differentiate the two sections. The output will therefore have two separate
// sections named '.text', where code will be placed into the execute-only
// '.text' section, and the implicitly-created one will be empty.
#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 +245,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 +255,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 +265,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 +275,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 +284,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
1 change: 1 addition & 0 deletions compiler-rt/lib/fuzzer/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ if(OS_NAME MATCHES "Android|Linux|Fuchsia" AND
CFLAGS ${TARGET_CFLAGS}
CMAKE_ARGS -DCMAKE_CXX_COMPILER_WORKS=ON
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
-DLLVM_EXECUTE_ONLY_CODE=${LLVM_EXECUTE_ONLY_CODE}
-DLIBCXXABI_ENABLE_EXCEPTIONS=OFF
-DLIBCXX_ABI_NAMESPACE=__Fuzzer
-DLIBCXX_ENABLE_EXCEPTIONS=OFF)
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
1 change: 1 addition & 0 deletions compiler-rt/lib/msan/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ 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 -DLLVM_EXECUTE_ONLY_CODE=${LLVM_EXECUTE_ONLY_CODE}
USE_TOOLCHAIN)
set(MSAN_LIBCXX_DIR ${LIBCXX_PREFIX}/lib/)

Expand Down
4 changes: 3 additions & 1 deletion compiler-rt/lib/orc/elfnix_tls.aarch64.S
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,11 @@
// The content of this file is aarch64-only
#if defined(__arm64__) || defined(__aarch64__)

#include "builtins/assembly.h"

#define REGISTER_SAVE_SPACE_SIZE 32 * 24

.text
TEXT_SECTION

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

.text
#include "builtins/assembly.h"

TEXT_SECTION

// 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
1 change: 1 addition & 0 deletions compiler-rt/lib/tsan/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ 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 -DLLVM_EXECUTE_ONLY_CODE=${LLVM_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