https://github.com/sebastiankreutzer updated https://github.com/llvm/llvm-project/pull/114431
>From 63760cffc53815f3c8398bd3351486b658d0a1a8 Mon Sep 17 00:00:00 2001 From: Sebastian Kreutzer <sebastiankreut...@gmx.net> Date: Thu, 31 Oct 2024 16:01:29 +0100 Subject: [PATCH 1/2] [XRay][AArch64] Support -fxray-shared --- clang/lib/Driver/XRayArgs.cpp | 8 +++-- clang/test/Driver/XRay/xray-shared.cpp | 16 +++++++--- .../cmake/Modules/AllSupportedArchDefs.cmake | 2 +- compiler-rt/lib/xray/CMakeLists.txt | 4 +++ .../lib/xray/xray_trampoline_AArch64.S | 32 +++++++++++-------- .../xray/TestCases/Posix/basic-mode-dso.cpp | 3 +- .../TestCases/Posix/clang-xray-shared.cpp | 2 +- .../test/xray/TestCases/Posix/dlopen.cpp | 2 +- .../xray/TestCases/Posix/dso-dep-chains.cpp | 2 +- .../TestCases/Posix/patch-premain-dso.cpp | 2 +- .../Posix/patching-unpatching-dso.cpp | 2 +- 11 files changed, 47 insertions(+), 28 deletions(-) diff --git a/clang/lib/Driver/XRayArgs.cpp b/clang/lib/Driver/XRayArgs.cpp index d0bb5d4887c184..18bd8640f01308 100644 --- a/clang/lib/Driver/XRayArgs.cpp +++ b/clang/lib/Driver/XRayArgs.cpp @@ -67,8 +67,12 @@ XRayArgs::XRayArgs(const ToolChain &TC, const ArgList &Args) { false)) { XRayShared = true; - // DSO instrumentation is currently limited to x86_64 - if (Triple.getArch() != llvm::Triple::x86_64) { + // DSO instrumentation is currently limited to x86_64 and aarch64 + switch (Triple.getArch()) { + case llvm::Triple::x86_64: + case llvm::Triple::aarch64: + break; + default: D.Diag(diag::err_drv_unsupported_opt_for_target) << "-fxray-shared" << Triple.str(); } diff --git a/clang/test/Driver/XRay/xray-shared.cpp b/clang/test/Driver/XRay/xray-shared.cpp index e331fefed1e0c9..820c5b363d2c62 100644 --- a/clang/test/Driver/XRay/xray-shared.cpp +++ b/clang/test/Driver/XRay/xray-shared.cpp @@ -1,15 +1,21 @@ +// Check supported targets // RUN: %clang -### --target=x86_64-unknown-linux-gnu -fPIC -fxray-instrument -fxray-shared -c %s -o /dev/null 2>&1 | FileCheck %s +// RUN: %clang -### --target=aarch64-unknown-linux-gnu -fPIC -fxray-instrument -fxray-shared -c %s -o /dev/null 2>&1 | FileCheck %s + +// Check unsupported targets +// RUN: not %clang -### --target=arm-unknown-linux-gnu -fPIC -fxray-instrument -fxray-shared -c %s -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR-TARGET +// RUN: not %clang -### --target=mips-unknown-linux-gnu -fPIC -fxray-instrument -fxray-shared -c %s -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR-TARGET +// RUN: not %clang -### --target=loongarch64-unknown-linux-gnu -fPIC -fxray-instrument -fxray-shared -c %s -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR-TARGET +// RUN: not %clang -### --target=hexagon-unknown-linux-gnu -fPIC -fxray-instrument -fxray-shared -c %s -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR-TARGET +// RUN: not %clang -### --target=powerpc64le-unknown-linux-gnu -fPIC -fxray-instrument -fxray-shared -c %s -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR-TARGET + +// Check PIC requirement // RUN: %clang -### --target=x86_64-unknown-linux-gnu -fpic -fxray-instrument -fxray-shared -c %s -o /dev/null 2>&1 | FileCheck %s // RUN: not %clang -### --target=x86_64-unknown-linux-gnu -fno-PIC -fxray-instrument -fxray-shared -c %s -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR-PIC // RUN: not %clang -### --target=x86_64-unknown-linux-gnu -fno-pic -fxray-instrument -fxray-shared -c %s -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR-PIC - // On 64 bit darwin, PIC is always enabled // RUN: %clang -### --target=x86_64-apple-darwin -fxray-instrument -fxray-shared -c %s -o /dev/null 2>&1 | FileCheck %s -// Check unsupported targets -// RUN: not %clang -### --target=aarch64-pc-freebsd -fPIC -fxray-instrument -fxray-shared -c %s -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR-TARGET -// RUN: not %clang -### --target=arm64-apple-macos -fPIC -fxray-instrument -fxray-shared -c %s -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR-TARGET - // CHECK: "-cc1" {{.*}}"-fxray-instrument" {{.*}}"-fxray-shared" // ERR-TARGET: error: unsupported option '-fxray-shared' for target // ERR-PIC: error: option '-fxray-shared' cannot be specified without '-fPIC' diff --git a/compiler-rt/cmake/Modules/AllSupportedArchDefs.cmake b/compiler-rt/cmake/Modules/AllSupportedArchDefs.cmake index fb4dfa7bd09dfe..b29ae179c2b4f4 100644 --- a/compiler-rt/cmake/Modules/AllSupportedArchDefs.cmake +++ b/compiler-rt/cmake/Modules/AllSupportedArchDefs.cmake @@ -104,7 +104,7 @@ else() set(ALL_XRAY_SUPPORTED_ARCH ${X86_64} ${ARM32} ${ARM64} ${MIPS32} ${MIPS64} powerpc64le ${HEXAGON} ${LOONGARCH64}) endif() -set(ALL_XRAY_DSO_SUPPORTED_ARCH ${X86_64}) +set(ALL_XRAY_DSO_SUPPORTED_ARCH ${X86_64} ${ARM64}) set(ALL_SHADOWCALLSTACK_SUPPORTED_ARCH ${ARM64}) if (UNIX) diff --git a/compiler-rt/lib/xray/CMakeLists.txt b/compiler-rt/lib/xray/CMakeLists.txt index f38c07420c9abf..633c2e3a402f50 100644 --- a/compiler-rt/lib/xray/CMakeLists.txt +++ b/compiler-rt/lib/xray/CMakeLists.txt @@ -56,6 +56,10 @@ set(aarch64_SOURCES xray_trampoline_AArch64.S ) +set(aarch64_DSO_SOURCES + xray_trampoline_AArch64.S + ) + set(loongarch64_SOURCES xray_loongarch64.cpp xray_trampoline_loongarch64.S diff --git a/compiler-rt/lib/xray/xray_trampoline_AArch64.S b/compiler-rt/lib/xray/xray_trampoline_AArch64.S index 536a79e0d150e7..2586def04cbb19 100644 --- a/compiler-rt/lib/xray/xray_trampoline_AArch64.S +++ b/compiler-rt/lib/xray/xray_trampoline_AArch64.S @@ -26,6 +26,17 @@ ldp x1, x2, [sp], #16 .endm +.macro LOAD_HANDLER_ADDR reg handler +#if !defined(XRAY_PIC) + adrp \reg, ASM_SYMBOL(\handler) + ldr \reg, [\reg, :lo12:ASM_SYMBOL(\handler)] +#else + adrp \reg, :got:ASM_SYMBOL(\handler) + ldr \reg, [\reg, :got_lo12:ASM_SYMBOL(\handler)] + ldr \reg, [\reg] +#endif +.endm + .text .p2align 2 .global ASM_SYMBOL(__xray_FunctionEntry) @@ -42,8 +53,7 @@ ASM_SYMBOL(__xray_FunctionEntry): SAVE_REGISTERS // Load the handler function pointer. - adrp x2, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE) - ldr x2, [x2, #:lo12:ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)] + LOAD_HANDLER_ADDR x2, _ZN6__xray19XRayPatchedFunctionE cbz x2, 1f // Set w0 to the function ID (w17). Set x1 to XRayEntryType::ENTRY = 0. mov w0, w17 @@ -69,8 +79,7 @@ ASM_SYMBOL(__xray_FunctionExit): SAVE_REGISTERS // Load the handler function pointer into x2. - adrp x2, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE) - ldr x2, [x2, #:lo12:ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)] + LOAD_HANDLER_ADDR x2, _ZN6__xray19XRayPatchedFunctionE cbz x2, 1f // Set w0 to the function ID (w17). Set x1 to XRayEntryType::EXIT = 1. mov w0, w17 @@ -96,8 +105,7 @@ ASM_SYMBOL(__xray_FunctionTailExit): // Save the registers which may be modified by the handler function. SAVE_REGISTERS // Load the handler function pointer into x2. - adrp x2, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE) - ldr x2, [x2, #:lo12:ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)] + LOAD_HANDLER_ADDR x2, _ZN6__xray19XRayPatchedFunctionE cbz x2, 1f // Set w0 to the function ID (w17). Set x1 to XRayEntryType::TAIL = 2. mov w0, w17 @@ -118,13 +126,11 @@ ASM_SYMBOL(__xray_ArgLoggerEntry): // Push the registers which may be modified by the handler function. SAVE_REGISTERS - adrp x8, ASM_SYMBOL(_ZN6__xray13XRayArgLoggerE) - ldr x8, [x8, #:lo12:ASM_SYMBOL(_ZN6__xray13XRayArgLoggerE)] + LOAD_HANDLER_ADDR x8, _ZN6__xray13XRayArgLoggerE cbnz x8, 2f // Load the handler function pointer. - adrp x8, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE) - ldr x8, [x8, #:lo12:ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)] + LOAD_HANDLER_ADDR x8, _ZN6__xray19XRayPatchedFunctionE cbz x8, 1f 2: @@ -144,8 +150,7 @@ ASM_SIZE(__xray_ArgLoggerEntry) ASM_TYPE_FUNCTION(__xray_CustomEvent) ASM_SYMBOL(__xray_CustomEvent): SAVE_REGISTERS - adrp x8, ASM_SYMBOL(_ZN6__xray22XRayPatchedCustomEventE) - ldr x8, [x8, #:lo12:ASM_SYMBOL(_ZN6__xray22XRayPatchedCustomEventE)] + LOAD_HANDLER_ADDR x8, _ZN6__xray22XRayPatchedCustomEventE cbz x8, 1f blr x8 1: @@ -157,8 +162,7 @@ ASM_SIZE(__xray_CustomEvent) ASM_TYPE_FUNCTION(__xray_TypedEvent) ASM_SYMBOL(__xray_TypedEvent): SAVE_REGISTERS - adrp x8, ASM_SYMBOL(_ZN6__xray21XRayPatchedTypedEventE) - ldr x8, [x8, #:lo12:ASM_SYMBOL(_ZN6__xray21XRayPatchedTypedEventE)] + LOAD_HANDLER_ADDR x8, _ZN6__xray21XRayPatchedTypedEventE cbz x8, 1f blr x8 1: diff --git a/compiler-rt/test/xray/TestCases/Posix/basic-mode-dso.cpp b/compiler-rt/test/xray/TestCases/Posix/basic-mode-dso.cpp index 31c615bd1f81bf..d40dcd808bcbaf 100644 --- a/compiler-rt/test/xray/TestCases/Posix/basic-mode-dso.cpp +++ b/compiler-rt/test/xray/TestCases/Posix/basic-mode-dso.cpp @@ -8,7 +8,8 @@ // RUN: %llvm_xray account --format=csv --sort=funcid "`ls basic-mode-dso-* | head -1`" | FileCheck --check-prefix=ACCOUNT %s // RUN: rm basic-mode-dso-* -// REQUIRES: target=x86_64{{.*}} +// REQUIRES: target={{(aarch64|x86_64)-.*}} +// REQUIRES: built-in-llvm-tree //--- main.cpp diff --git a/compiler-rt/test/xray/TestCases/Posix/clang-xray-shared.cpp b/compiler-rt/test/xray/TestCases/Posix/clang-xray-shared.cpp index 0dd721571de9b8..f36b64dd59f1ab 100644 --- a/compiler-rt/test/xray/TestCases/Posix/clang-xray-shared.cpp +++ b/compiler-rt/test/xray/TestCases/Posix/clang-xray-shared.cpp @@ -6,7 +6,7 @@ // RUN: %clangxx -fxray-instrument %s -shared -o %t.so // RUN: llvm-nm %t.so | FileCheck %s --check-prefix DISABLED // -// REQUIRES: target=x86_64{{.*}} +// REQUIRES: target={{(aarch64|x86_64)-.*}} [[clang::xray_always_instrument]] int always_instrumented() { return 42; } diff --git a/compiler-rt/test/xray/TestCases/Posix/dlopen.cpp b/compiler-rt/test/xray/TestCases/Posix/dlopen.cpp index 9db411d5ff1c6e..9567269e8ff1b8 100644 --- a/compiler-rt/test/xray/TestCases/Posix/dlopen.cpp +++ b/compiler-rt/test/xray/TestCases/Posix/dlopen.cpp @@ -7,7 +7,7 @@ // // RUN: XRAY_OPTIONS="patch_premain=true" %run %t/main.o %t/testlib.so 2>&1 | FileCheck %s -// REQUIRES: target=x86_64{{.*}} +// REQUIRES: target={{(aarch64|x86_64)-.*}} //--- main.cpp diff --git a/compiler-rt/test/xray/TestCases/Posix/dso-dep-chains.cpp b/compiler-rt/test/xray/TestCases/Posix/dso-dep-chains.cpp index 89da2764c35cee..82cc127b521a6f 100644 --- a/compiler-rt/test/xray/TestCases/Posix/dso-dep-chains.cpp +++ b/compiler-rt/test/xray/TestCases/Posix/dso-dep-chains.cpp @@ -17,7 +17,7 @@ // // RUN: XRAY_OPTIONS="patch_premain=true" %run %t/main.o %t/testlibd.so %t/testlibe.so 2>&1 | FileCheck %s -// REQUIRES: target=x86_64{{.*}} +// REQUIRES: target={{(aarch64|x86_64)-.*}} //--- main.cpp diff --git a/compiler-rt/test/xray/TestCases/Posix/patch-premain-dso.cpp b/compiler-rt/test/xray/TestCases/Posix/patch-premain-dso.cpp index 0708d0383439d0..7bce653fe72337 100644 --- a/compiler-rt/test/xray/TestCases/Posix/patch-premain-dso.cpp +++ b/compiler-rt/test/xray/TestCases/Posix/patch-premain-dso.cpp @@ -6,7 +6,7 @@ // RUN: XRAY_OPTIONS="patch_premain=true,verbosity=1" %run %t/main.o 2>&1 | FileCheck %s -// REQUIRES: target=x86_64{{.*}} +// REQUIRES: target={{(aarch64|x86_64)-.*}} //--- main.cpp diff --git a/compiler-rt/test/xray/TestCases/Posix/patching-unpatching-dso.cpp b/compiler-rt/test/xray/TestCases/Posix/patching-unpatching-dso.cpp index d3e992dd497725..640cf9bcc1a341 100644 --- a/compiler-rt/test/xray/TestCases/Posix/patching-unpatching-dso.cpp +++ b/compiler-rt/test/xray/TestCases/Posix/patching-unpatching-dso.cpp @@ -8,7 +8,7 @@ // RUN: XRAY_OPTIONS="patch_premain=false" %run %t/main.o 2>&1 | FileCheck %s -// REQUIRES: target=x86_64{{.*}} +// REQUIRES: target={{(aarch64|x86_64)-.*}} //--- main.cpp >From ab01281ba77b488066ee2828669112b8cbd64f3b Mon Sep 17 00:00:00 2001 From: Sebastian Kreutzer <sebastiankreut...@gmx.net> Date: Mon, 4 Nov 2024 10:37:13 +0100 Subject: [PATCH 2/2] fixup! [XRay][AArch64] Support -fxray-shared --- clang/lib/Driver/XRayArgs.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/Driver/XRayArgs.cpp b/clang/lib/Driver/XRayArgs.cpp index 18bd8640f01308..c270a94f216ebd 100644 --- a/clang/lib/Driver/XRayArgs.cpp +++ b/clang/lib/Driver/XRayArgs.cpp @@ -67,10 +67,10 @@ XRayArgs::XRayArgs(const ToolChain &TC, const ArgList &Args) { false)) { XRayShared = true; - // DSO instrumentation is currently limited to x86_64 and aarch64 + // Certain targets support DSO instrumentation switch (Triple.getArch()) { - case llvm::Triple::x86_64: case llvm::Triple::aarch64: + case llvm::Triple::x86_64: break; default: D.Diag(diag::err_drv_unsupported_opt_for_target) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits