[clang] [clang] Implement address sanitizer on AIX (PR #129925)
Jake Egan via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 23 10:23:26 PDT 2025
https://github.com/jakeegan updated https://github.com/llvm/llvm-project/pull/129925
>From 072f4eca3825729d69d423d774c8a3298cb624a8 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Wed, 5 Mar 2025 01:57:38 -0500
Subject: [PATCH 01/12] [clang] Implement address sanitizer on AIX (1/3)
The PR includes clang changes needed for the address sanitizer on AIX. Will also post llvm and
compiler-rt PRs following this.
---
.../clang/Basic/DiagnosticDriverKinds.td | 2 +
clang/include/clang/Driver/Options.td | 2 +-
clang/lib/CodeGen/BackendUtil.cpp | 5 +-
clang/lib/Driver/ToolChain.cpp | 2 +-
clang/lib/Driver/ToolChains/AIX.cpp | 45 ++++++++
clang/lib/Driver/ToolChains/AIX.h | 2 +
clang/lib/Driver/ToolChains/CommonArgs.cpp | 36 +++++-
.../lib/aix/asan.link_with_main_exec.txt | 0
.../lib/aix/asan_cxx.link_with_main_exec.txt | 0
clang/test/Driver/sanitizer-ld.c | 104 ++++++++++++++++++
10 files changed, 189 insertions(+), 9 deletions(-)
create mode 100644 clang/test/Driver/Inputs/resource_dir/lib/aix/asan.link_with_main_exec.txt
create mode 100644 clang/test/Driver/Inputs/resource_dir/lib/aix/asan_cxx.link_with_main_exec.txt
diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 8d599c96eb4fb..c44d364d244bc 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -257,6 +257,8 @@ def err_drv_malformed_sanitizer_metadata_ignorelist : Error<
"malformed sanitizer metadata ignorelist: '%0'">;
def err_drv_unsupported_static_sanitizer_darwin : Error<
"static %0 runtime is not supported on darwin">;
+def err_drv_unsupported_shared_sanitizer_aix : Error<
+ "shared %0 runtime is not supported on AIX">;
def err_drv_duplicate_config : Error<
"no more than one option '--config' is allowed">;
def err_drv_cannot_open_config_file : Error<
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index 0ab923fcdd583..66959279d3fcf 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -1542,7 +1542,7 @@ defm xl_pragma_pack : BoolFOption<"xl-pragma-pack",
"Enable IBM XL #pragma pack handling">,
NegFlag<SetFalse>>;
def shared_libsan : Flag<["-"], "shared-libsan">,
- HelpText<"Dynamically link the sanitizer runtime">;
+ HelpText<"Dynamically link the sanitizer runtime (Not supported for ASan on AIX)">;
def static_libsan : Flag<["-"], "static-libsan">,
HelpText<"Statically link the sanitizer runtime (Not supported for ASan, TSan or UBSan on darwin)">;
def : Flag<["-"], "shared-libasan">, Alias<shared_libsan>;
diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp
index 97e9bbccd61ef..b47aff95f2430 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -275,13 +275,14 @@ static bool asanUseGlobalsGC(const Triple &T, const CodeGenOptions &CGOpts) {
return !CGOpts.DisableIntegratedAS;
case Triple::GOFF:
llvm::report_fatal_error("ASan not implemented for GOFF");
- case Triple::XCOFF:
- llvm::report_fatal_error("ASan not implemented for XCOFF.");
case Triple::Wasm:
case Triple::DXContainer:
case Triple::SPIRV:
case Triple::UnknownObjectFormat:
break;
+ case Triple::XCOFF:
+ // FIXME: try to enable GC-friendly instrumentation for globals on AIX.
+ return false;
}
return false;
}
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index ebc982096595e..d4aa71d031ba9 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -749,7 +749,7 @@ std::string ToolChain::buildCompilerRTBasename(const llvm::opt::ArgList &Args,
case ToolChain::FT_Shared:
Suffix = TT.isOSWindows()
? (TT.isWindowsGNUEnvironment() ? ".dll.a" : ".lib")
- : ".so";
+ : (TT.isOSAIX() ? ".a" : ".so");
break;
}
diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp
index 09a8dc2f4fa5d..30db6f45c7e81 100644
--- a/clang/lib/Driver/ToolChains/AIX.cpp
+++ b/clang/lib/Driver/ToolChains/AIX.cpp
@@ -20,6 +20,7 @@
#include <set>
using AIX = clang::driver::toolchains::AIX;
+using namespace clang;
using namespace clang::driver;
using namespace clang::driver::tools;
using namespace clang::driver::toolchains;
@@ -233,6 +234,44 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
// Specify linker input file(s).
AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);
+ // Add sanitizer libraries.
+ const SanitizerArgs &Sanitize = ToolChain.getSanitizerArgs(Args);
+ const char *sanitizer = nullptr;
+ bool NeedsSanitizerDeps = false;
+ // For now, only support address sanitizer.
+ if (Sanitize.needsAsanRt())
+ sanitizer = "AddressSanitizer";
+
+ if (sanitizer) {
+ if (Sanitize.needsSharedRt()) {
+ ToolChain.getDriver().Diag(diag::err_drv_unsupported_shared_sanitizer_aix) << sanitizer;
+ return;
+ }
+ NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
+ }
+
+ // Add sanitizer runtime dependencies.
+ if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
+ options::OPT_shared, options::OPT_r)) {
+ if (NeedsSanitizerDeps)
+ linkSanitizerRuntimeDeps(ToolChain, Args, CmdArgs);
+ }
+
+ // We won't add the static sanitizer libraries to the DSO, but we will
+ // introduce the undefined sanitizer symbols like __asan_init to the DSO. On
+ // AIX, this undefined sanitizer symbol cannot pass final link. Add the
+ // import file to make these undefined symbols be resolved at runtime.
+ if (Args.hasArg(options::OPT_shared) &&
+ ToolChain.getSanitizerArgs(Args).needsAsanRt()) {
+ CmdArgs.push_back(
+ Args.MakeArgString(Twine("-bI:") + ToolChain.getCompilerRTPath() +
+ "/asan.link_with_main_exec.txt"));
+ if (ToolChain.getSanitizerArgs(Args).linkCXXRuntimes())
+ CmdArgs.push_back(
+ Args.MakeArgString(Twine("-bI:") + ToolChain.getCompilerRTPath() +
+ "/asan_cxx.link_with_main_exec.txt"));
+ }
+
if (D.isUsingLTO()) {
assert(!Inputs.empty() && "Must have at least one input.");
// Find the first filename InputInfo object.
@@ -590,6 +629,12 @@ ToolChain::RuntimeLibType AIX::GetDefaultRuntimeLibType() const {
return ToolChain::RLT_CompilerRT;
}
+SanitizerMask AIX::getSupportedSanitizers() const {
+ SanitizerMask Res = ToolChain::getSupportedSanitizers();
+ Res |= SanitizerKind::Address;
+ return Res;
+}
+
auto AIX::buildAssembler() const -> Tool * { return new aix::Assembler(*this); }
auto AIX::buildLinker() const -> Tool * { return new aix::Linker(*this); }
diff --git a/clang/lib/Driver/ToolChains/AIX.h b/clang/lib/Driver/ToolChains/AIX.h
index 8f130f6b54547..297f3f2bc2a9f 100644
--- a/clang/lib/Driver/ToolChains/AIX.h
+++ b/clang/lib/Driver/ToolChains/AIX.h
@@ -98,6 +98,8 @@ class LLVM_LIBRARY_VISIBILITY AIX : public ToolChain {
return llvm::DebuggerKind::DBX;
}
+ SanitizerMask getSupportedSanitizers() const override;
+
protected:
Tool *buildAssembler() const override;
Tool *buildLinker() const override;
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index c3c22a419f352..8cedb3ef2bc43 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1395,6 +1395,19 @@ static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
// the option, so don't try to pass it.
if (TC.getTriple().isOSSolaris() && !LinkerIsGnuLd)
return true;
+
+ if (TC.getTriple().isOSAIX()) {
+ SmallString<128> SanRTSymbolList;
+ (Twine(TC.getCompilerRTPath()) + "/" + Sanitizer +
+ ".link_with_main_exec.txt")
+ .toVector(SanRTSymbolList);
+ if (llvm::sys::fs::exists(SanRTSymbolList)) {
+ CmdArgs.push_back(Args.MakeArgString(Twine("-bE:") + SanRTSymbolList));
+ return true;
+ }
+ return false;
+ }
+
SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
if (llvm::sys::fs::exists(SanRT + ".syms")) {
CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
@@ -1429,7 +1442,9 @@ void tools::linkSanitizerRuntimeDeps(const ToolChain &TC,
ArgStringList &CmdArgs) {
// Force linking against the system libraries sanitizers depends on
// (see PR15823 why this is necessary).
- addAsNeededOption(TC, Args, CmdArgs, false);
+ // AIX does not support any --as-needed options.
+ if (!TC.getTriple().isOSAIX())
+ addAsNeededOption(TC, Args, CmdArgs, false);
// There's no libpthread or librt on RTEMS & Android.
if (TC.getTriple().getOS() != llvm::Triple::RTEMS &&
!TC.getTriple().isAndroid() && !TC.getTriple().isOHOSFamily()) {
@@ -1453,6 +1468,9 @@ void tools::linkSanitizerRuntimeDeps(const ToolChain &TC,
if (TC.getTriple().isOSLinux() && !TC.getTriple().isAndroid() &&
!TC.getTriple().isMusl())
CmdArgs.push_back("-lresolv");
+
+ if (TC.getTriple().isOSAIX())
+ CmdArgs.push_back("-latomic");
}
static void
@@ -1508,7 +1526,8 @@ collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
StaticRuntimes.push_back("stats_client");
// Always link the static runtime regardless of DSO or executable.
- if (SanArgs.needsAsanRt())
+ // Don't see a reason that AIX needs asan_static library though.
+ if (SanArgs.needsAsanRt() && !TC.getTriple().isOSAIX())
HelperStaticRuntimes.push_back("asan_static");
// Collect static runtimes.
@@ -1642,7 +1661,9 @@ bool tools::addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
bool AddExportDynamic = false;
for (auto RT : StaticRuntimes) {
- addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
+ // AIX does not support --whole-archive.
+ addSanitizerRuntime(TC, Args, CmdArgs, RT, false,
+ !TC.getTriple().isOSAIX());
AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
}
for (auto RT : NonWholeStaticRuntimes) {
@@ -1651,8 +1672,13 @@ bool tools::addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
}
// If there is a static runtime with no dynamic list, force all the symbols
// to be dynamic to be sure we export sanitizer interface functions.
- if (AddExportDynamic)
- CmdArgs.push_back("--export-dynamic");
+ if (AddExportDynamic) {
+ if (!TC.getTriple().isOSAIX())
+ CmdArgs.push_back("--export-dynamic");
+ else
+ llvm::report_fatal_error("Sanitizer interface functions must be exported "
+ "by export files on AIX.");
+ }
if (SanArgs.hasCrossDsoCfi() && !AddExportDynamic)
CmdArgs.push_back("--export-dynamic-symbol=__cfi_check");
diff --git a/clang/test/Driver/Inputs/resource_dir/lib/aix/asan.link_with_main_exec.txt b/clang/test/Driver/Inputs/resource_dir/lib/aix/asan.link_with_main_exec.txt
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/Inputs/resource_dir/lib/aix/asan_cxx.link_with_main_exec.txt b/clang/test/Driver/Inputs/resource_dir/lib/aix/asan_cxx.link_with_main_exec.txt
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/sanitizer-ld.c b/clang/test/Driver/sanitizer-ld.c
index 71078342b3617..3a19626ad6224 100644
--- a/clang/test/Driver/sanitizer-ld.c
+++ b/clang/test/Driver/sanitizer-ld.c
@@ -1216,3 +1216,107 @@
// CHECK-DSO-SHARED-HWASAN-AARCH64-LINUX-NOT: "-lresolv"
// CHECK-DSO-SHARED-HWASAN-AARCH64-LINUX-NOT: "--export-dynamic"
// CHECK-DSO-SHARED-HWASAN-AARCH64-LINUX-NOT: "--dynamic-list"
+
+// RUN: %clang -fsanitize=address -### %s 2>&1 \
+// RUN: --target=powerpc-unknown-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
+// RUN: | FileCheck --check-prefixes=CHECK-ASAN-LINK-RUNTIME-AIX,CHECK-ASAN-LINK-RUNTIME-AIX32 %s
+//
+// RUN: %clang -fsanitize=address -### %s 2>&1 \
+// RUN: --target=powerpc64-unknown-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
+// RUN: | FileCheck --check-prefixes=CHECK-ASAN-LINK-RUNTIME-AIX,CHECK-ASAN-LINK-RUNTIME-AIX64 %s
+//
+// RUN: %clang --driver-mode=g++ -fsanitize=address -### %s 2>&1 \
+// RUN: --target=powerpc-unknown-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
+// RUN: | FileCheck --check-prefixes=CHECK-ASAN-LINK-RUNTIME-AIX,CHECK-ASAN-LINK-RUNTIME-AIX32,CHECK-ASAN-LINK-RUNTIME-AIXCXX32,CHECK-ASAN-LINK-RUNTIME-AIXCXX %s
+//
+// RUN: %clang --driver-mode=g++ -fsanitize=address -### %s 2>&1 \
+// RUN: --target=powerpc64-unknown-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
+// RUN: | FileCheck --check-prefixes=CHECK-ASAN-LINK-RUNTIME-AIX,CHECK-ASAN-LINK-RUNTIME-AIX64,CHECK-ASAN-LINK-RUNTIME-AIXCXX64,CHECK-ASAN-LINK-RUNTIME-AIXCXX %s
+//
+// RUN: %clang -fsanitize=address -### %s 2>&1 \
+// RUN: -static-libsan --target=powerpc-unknown-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
+// RUN: | FileCheck --check-prefixes=CHECK-ASAN-LINK-RUNTIME-AIX,CHECK-ASAN-LINK-RUNTIME-AIX32 %s
+//
+// RUN: %clang -fsanitize=address -### %s 2>&1 \
+// RUN: -static-libsan --target=powerpc64-unknown-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
+// RUN: | FileCheck --check-prefixes=CHECK-ASAN-LINK-RUNTIME-AIX,CHECK-ASAN-LINK-RUNTIME-AIX64 %s
+//
+// CHECK-ASAN-LINK-RUNTIME-AIX: "{{.*}}ld{{(.exe)?}}"
+// CHECK-ASAN-LINK-RUNTIME-AIX32: "-b32"
+// CHECK-ASAN-LINK-RUNTIME-AIX64: "-b64"
+// CHECK-ASAN-LINK-RUNTIME-AIX: "-bcdtors:all:0:s"
+// CHECK-ASAN-LINK-RUNTIME-AIX32: "{{.*}}libclang_rt.asan-powerpc.a"
+// CHECK-ASAN-LINK-RUNTIME-AIX64: "{{.*}}libclang_rt.asan-powerpc64.a"
+// CHECK-ASAN-LINK-RUNTIME-AIX: "-bE:{{.*}}asan.link_with_main_exec.txt"
+// CHECK-ASAN-LINK-RUNTIME-AIXCXX32: "{{.*}}libclang_rt.asan_cxx-powerpc.a"
+// CHECK-ASAN-LINK-RUNTIME-AIXCXX64: "{{.*}}libclang_rt.asan_cxx-powerpc64.a"
+// CHECK-ASAN-LINK-RUNTIME-AIXCXX: "-bE:{{.*}}asan_cxx.link_with_main_exec.txt"
+// CHECK-ASAN-LINK-RUNTIME-AIX: "-lpthread"
+// CHECK-ASAN-LINK-RUNTIME-AIX: "-latomic"
+// CHECK-ASAN-LINK-RUNTIME-AIX: "-lunwind"
+// CHECK-ASAN-LINK-RUNTIME-AIX: "-lc"
+
+// RUN: not %clang -fsanitize=address -### %s 2>&1 \
+// RUN: -shared-libsan --target=powerpc-unknown-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
+// RUN: | FileCheck --check-prefixes=CHECK-SHARED-ASAN-AIX %s
+//
+// RUN: not %clang -fsanitize=address -### %s 2>&1 \
+// RUN: -shared-libsan --target=powerpc64-unknown-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
+// RUN: | FileCheck --check-prefixes=CHECK-SHARED-ASAN-AIX %s
+//
+// CHECK-SHARED-ASAN-AIX: {{.*}}error: shared AddressSanitizer runtime is not supported on AIX
+
+// RUN: %clang -fsanitize=address -shared -### %s 2>&1 \
+// RUN: --target=powerpc-unknown-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
+// RUN: | FileCheck --check-prefixes=CHECK-ASAN-SHARED-LIBRARY-AIX,CHECK-ASAN-SHARED-LIBRARY-AIX32 %s
+//
+// RUN: %clang -fsanitize=address -shared -### %s 2>&1 \
+// RUN: --target=powerpc64-unknown-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
+// RUN: | FileCheck --check-prefixes=CHECK-ASAN-SHARED-LIBRARY-AIX,CHECK-ASAN-SHARED-LIBRARY-AIX64 %s
+//
+// RUN: %clang -fsanitize=address --driver-mode=g++ -shared -### %s 2>&1 \
+// RUN: --target=powerpc-unknown-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
+// RUN: | FileCheck --check-prefixes=CHECK-ASAN-SHARED-LIBRARY-AIX,CHECK-ASAN-SHARED-LIBRARY-AIX32,CHECK-ASAN-SHARED-LIBRARY-AIXCXX %s
+//
+// RUN: %clang -fsanitize=address --driver-mode=g++ -shared -### %s 2>&1 \
+// RUN: --target=powerpc64-unknown-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
+// RUN: | FileCheck --check-prefixes=CHECK-ASAN-SHARED-LIBRARY-AIX,CHECK-ASAN-SHARED-LIBRARY-AIX64,CHECK-ASAN-SHARED-LIBRARY-AIXCXX %s
+//
+// CHECK-ASAN-SHARED-LIBRARY-AIX: "{{.*}}ld{{(.exe)?}}"
+// CHECK-ASAN-SHARED-LIBRARY-AIX32: "-b32"
+// CHECK-ASAN-SHARED-LIBRARY-AIX64: "-b64"
+// CHECK-ASAN-SHARED-LIBRARY-AIX: "-bcdtors:all:0:s"
+// CHECK-ASAN-SHARED-LIBRARY-AIX: "-bI:{{.*}}asan.link_with_main_exec.txt"
+// CHECK-ASAN-SHARED-LIBRARY-AIXCXX: "-bI:{{.*}}asan_cxx.link_with_main_exec.txt"
+// CHECK-ASAN-SHARED-LIBRARY-AIX32-NOT: "{{.*}}libclang_rt.asan-powerpc.a"
+// CHECK-ASAN-SHARED-LIBRARY-AIX64-NOT: "{{.*}}libclang_rt.asan-powerpc64.a"
+// CHECK-ASAN-SHARED-LIBRARY-AIXCXX-NOT: "{{.*}}libclang_rt.asan_cxx-powerpc{{.*}}"
+// CHECK-ASAN-SHARED-LIBRARY-AIX-NOT: "-lpthread"
+// CHECK-ASAN-SHARED-LIBRARY-AIX-NOT: "-latomic"
+// CHECK-ASAN-SHARED-LIBRARY-AIX: "-lunwind"
+// CHECK-ASAN-SHARED-LIBRARY-AIX: "-lc"
+
>From bdcac7b402271038040ae71c8f9aa8ec44a1dff9 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Sun, 9 Mar 2025 00:21:16 -0500
Subject: [PATCH 02/12] Fix formatting
---
clang/lib/Driver/ToolChains/AIX.cpp | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp
index 30db6f45c7e81..56b6aadd52062 100644
--- a/clang/lib/Driver/ToolChains/AIX.cpp
+++ b/clang/lib/Driver/ToolChains/AIX.cpp
@@ -244,7 +244,8 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
if (sanitizer) {
if (Sanitize.needsSharedRt()) {
- ToolChain.getDriver().Diag(diag::err_drv_unsupported_shared_sanitizer_aix) << sanitizer;
+ ToolChain.getDriver().Diag(diag::err_drv_unsupported_shared_sanitizer_aix)
+ << sanitizer;
return;
}
NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
@@ -263,9 +264,9 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
// import file to make these undefined symbols be resolved at runtime.
if (Args.hasArg(options::OPT_shared) &&
ToolChain.getSanitizerArgs(Args).needsAsanRt()) {
- CmdArgs.push_back(
- Args.MakeArgString(Twine("-bI:") + ToolChain.getCompilerRTPath() +
- "/asan.link_with_main_exec.txt"));
+ CmdArgs.push_back(Args.MakeArgString(Twine("-bI:") +
+ ToolChain.getCompilerRTPath() +
+ "/asan.link_with_main_exec.txt"));
if (ToolChain.getSanitizerArgs(Args).linkCXXRuntimes())
CmdArgs.push_back(
Args.MakeArgString(Twine("-bI:") + ToolChain.getCompilerRTPath() +
>From 9fcb13d756e60d34c02b86178c3e917bb415fcb2 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Thu, 24 Apr 2025 13:49:20 -0400
Subject: [PATCH 03/12] Add library files to fix test
---
.../Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan-powerpc.a | 0
.../Inputs/resource_dir/lib/aix/libclang_rt.asan-powerpc64.a | 0
.../Inputs/resource_dir/lib/aix/libclang_rt.asan_cxx-powerpc.a | 0
.../Inputs/resource_dir/lib/aix/libclang_rt.asan_cxx-powerpc64.a | 0
4 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan-powerpc.a
create mode 100644 clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan-powerpc64.a
create mode 100644 clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan_cxx-powerpc.a
create mode 100644 clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan_cxx-powerpc64.a
diff --git a/clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan-powerpc.a b/clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan-powerpc.a
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan-powerpc64.a b/clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan-powerpc64.a
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan_cxx-powerpc.a b/clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan_cxx-powerpc.a
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan_cxx-powerpc64.a b/clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan_cxx-powerpc64.a
new file mode 100644
index 0000000000000..e69de29bb2d1d
>From 34c081370894094bb9f611d5f63ac918f33945a5 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Tue, 29 Apr 2025 20:05:48 -0400
Subject: [PATCH 04/12] Fix formatting
---
clang/lib/Driver/ToolChains/AIX.h | 2 --
1 file changed, 2 deletions(-)
diff --git a/clang/lib/Driver/ToolChains/AIX.h b/clang/lib/Driver/ToolChains/AIX.h
index de38def656670..3a713e24b7201 100644
--- a/clang/lib/Driver/ToolChains/AIX.h
+++ b/clang/lib/Driver/ToolChains/AIX.h
@@ -98,12 +98,10 @@ class LLVM_LIBRARY_VISIBILITY AIX : public ToolChain {
return llvm::DebuggerKind::DBX;
}
-
SanitizerMask getSupportedSanitizers() const override;
path_list getArchSpecificLibPaths() const override { return path_list(); };
-
protected:
Tool *buildAssembler() const override;
Tool *buildLinker() const override;
>From 6f90e6b8f7c69b501805bf935d654b1659e68b7b Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Sun, 25 May 2025 22:59:47 -0400
Subject: [PATCH 05/12] Use per target runtime dir
---
clang/lib/Driver/ToolChains/AIX.cpp | 23 ++++---
clang/lib/Driver/ToolChains/CommonArgs.cpp | 2 +-
.../asan.link_with_main_exec.txt | 0
.../asan_cxx.link_with_main_exec.txt | 0
.../lib/powerpc-ibm-aix/libclang_rt.asan.a} | 0
.../powerpc-ibm-aix/libclang_rt.asan_cxx.a} | 0
.../asan.link_with_main_exec.txt} | 0
.../asan_cxx.link_with_main_exec.txt} | 0
.../lib/powerpc64-ibm-aix/libclang_rt.asan.a | 0
.../powerpc64-ibm-aix/libclang_rt.asan_cxx.a | 0
clang/test/Driver/sanitizer-ld.c | 62 +++++++++----------
11 files changed, 48 insertions(+), 39 deletions(-)
rename clang/test/Driver/Inputs/{resource_dir/lib/aix => resource_dir_with_per_target_subdir/lib/powerpc-ibm-aix}/asan.link_with_main_exec.txt (100%)
rename clang/test/Driver/Inputs/{resource_dir/lib/aix => resource_dir_with_per_target_subdir/lib/powerpc-ibm-aix}/asan_cxx.link_with_main_exec.txt (100%)
rename clang/test/Driver/Inputs/{resource_dir/lib/aix/libclang_rt.asan-powerpc.a => resource_dir_with_per_target_subdir/lib/powerpc-ibm-aix/libclang_rt.asan.a} (100%)
rename clang/test/Driver/Inputs/{resource_dir/lib/aix/libclang_rt.asan-powerpc64.a => resource_dir_with_per_target_subdir/lib/powerpc-ibm-aix/libclang_rt.asan_cxx.a} (100%)
rename clang/test/Driver/Inputs/{resource_dir/lib/aix/libclang_rt.asan_cxx-powerpc.a => resource_dir_with_per_target_subdir/lib/powerpc64-ibm-aix/asan.link_with_main_exec.txt} (100%)
rename clang/test/Driver/Inputs/{resource_dir/lib/aix/libclang_rt.asan_cxx-powerpc64.a => resource_dir_with_per_target_subdir/lib/powerpc64-ibm-aix/asan_cxx.link_with_main_exec.txt} (100%)
create mode 100644 clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc64-ibm-aix/libclang_rt.asan.a
create mode 100644 clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc64-ibm-aix/libclang_rt.asan_cxx.a
diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp
index d0739ddd3c947..e665bd8897d80 100644
--- a/clang/lib/Driver/ToolChains/AIX.cpp
+++ b/clang/lib/Driver/ToolChains/AIX.cpp
@@ -290,13 +290,22 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
// import file to make these undefined symbols be resolved at runtime.
if (Args.hasArg(options::OPT_shared) &&
ToolChain.getSanitizerArgs(Args).needsAsanRt()) {
- CmdArgs.push_back(Args.MakeArgString(Twine("-bI:") +
- ToolChain.getCompilerRTPath() +
- "/asan.link_with_main_exec.txt"));
- if (ToolChain.getSanitizerArgs(Args).linkCXXRuntimes())
- CmdArgs.push_back(
- Args.MakeArgString(Twine("-bI:") + ToolChain.getCompilerRTPath() +
- "/asan_cxx.link_with_main_exec.txt"));
+ SmallString<128> SanRTSymbolList;
+ (Twine(ToolChain.getRuntimePath().value_or("")) +
+ "/asan.link_with_main_exec.txt").toVector(SanRTSymbolList);
+ if (llvm::sys::fs::exists(SanRTSymbolList))
+ CmdArgs.push_back(Args.MakeArgString(Twine("-bI:") + SanRTSymbolList));
+ else
+ llvm::report_fatal_error("Missing address sanitizer import list.");
+ if (ToolChain.getSanitizerArgs(Args).linkCXXRuntimes()) {
+ SanRTSymbolList.clear();
+ (Twine(ToolChain.getRuntimePath().value_or("")) +
+ "/asan_cxx.link_with_main_exec.txt").toVector(SanRTSymbolList);
+ if (llvm::sys::fs::exists(SanRTSymbolList))
+ CmdArgs.push_back(Args.MakeArgString(Twine("-bI:") + SanRTSymbolList));
+ else
+ llvm::report_fatal_error("Missing address sanitizer c++ import list.");
+ }
}
if (D.isUsingLTO()) {
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index c46e4219dbb98..4f72512fc6ac3 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1367,7 +1367,7 @@ static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
if (TC.getTriple().isOSAIX()) {
SmallString<128> SanRTSymbolList;
- (Twine(TC.getCompilerRTPath()) + "/" + Sanitizer +
+ (Twine(TC.getRuntimePath().value_or("")) + "/" + Sanitizer +
".link_with_main_exec.txt")
.toVector(SanRTSymbolList);
if (llvm::sys::fs::exists(SanRTSymbolList)) {
diff --git a/clang/test/Driver/Inputs/resource_dir/lib/aix/asan.link_with_main_exec.txt b/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc-ibm-aix/asan.link_with_main_exec.txt
similarity index 100%
rename from clang/test/Driver/Inputs/resource_dir/lib/aix/asan.link_with_main_exec.txt
rename to clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc-ibm-aix/asan.link_with_main_exec.txt
diff --git a/clang/test/Driver/Inputs/resource_dir/lib/aix/asan_cxx.link_with_main_exec.txt b/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc-ibm-aix/asan_cxx.link_with_main_exec.txt
similarity index 100%
rename from clang/test/Driver/Inputs/resource_dir/lib/aix/asan_cxx.link_with_main_exec.txt
rename to clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc-ibm-aix/asan_cxx.link_with_main_exec.txt
diff --git a/clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan-powerpc.a b/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc-ibm-aix/libclang_rt.asan.a
similarity index 100%
rename from clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan-powerpc.a
rename to clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc-ibm-aix/libclang_rt.asan.a
diff --git a/clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan-powerpc64.a b/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc-ibm-aix/libclang_rt.asan_cxx.a
similarity index 100%
rename from clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan-powerpc64.a
rename to clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc-ibm-aix/libclang_rt.asan_cxx.a
diff --git a/clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan_cxx-powerpc.a b/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc64-ibm-aix/asan.link_with_main_exec.txt
similarity index 100%
rename from clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan_cxx-powerpc.a
rename to clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc64-ibm-aix/asan.link_with_main_exec.txt
diff --git a/clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan_cxx-powerpc64.a b/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc64-ibm-aix/asan_cxx.link_with_main_exec.txt
similarity index 100%
rename from clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.asan_cxx-powerpc64.a
rename to clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc64-ibm-aix/asan_cxx.link_with_main_exec.txt
diff --git a/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc64-ibm-aix/libclang_rt.asan.a b/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc64-ibm-aix/libclang_rt.asan.a
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc64-ibm-aix/libclang_rt.asan_cxx.a b/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc64-ibm-aix/libclang_rt.asan_cxx.a
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/sanitizer-ld.c b/clang/test/Driver/sanitizer-ld.c
index dc06498e76b35..4df771d792bc3 100644
--- a/clang/test/Driver/sanitizer-ld.c
+++ b/clang/test/Driver/sanitizer-ld.c
@@ -1371,38 +1371,38 @@
// CHECK-DSO-SHARED-HWASAN-AARCH64-LINUX-NOT: "--dynamic-list"
// RUN: %clang -fsanitize=address -### %s 2>&1 \
-// RUN: --target=powerpc-unknown-aix \
-// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: --target=powerpc-ibm-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
// RUN: | FileCheck --check-prefixes=CHECK-ASAN-LINK-RUNTIME-AIX,CHECK-ASAN-LINK-RUNTIME-AIX32 %s
//
// RUN: %clang -fsanitize=address -### %s 2>&1 \
-// RUN: --target=powerpc64-unknown-aix \
-// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: --target=powerpc64-ibm-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
// RUN: | FileCheck --check-prefixes=CHECK-ASAN-LINK-RUNTIME-AIX,CHECK-ASAN-LINK-RUNTIME-AIX64 %s
//
// RUN: %clang --driver-mode=g++ -fsanitize=address -### %s 2>&1 \
-// RUN: --target=powerpc-unknown-aix \
-// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: --target=powerpc-ibm-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
// RUN: | FileCheck --check-prefixes=CHECK-ASAN-LINK-RUNTIME-AIX,CHECK-ASAN-LINK-RUNTIME-AIX32,CHECK-ASAN-LINK-RUNTIME-AIXCXX32,CHECK-ASAN-LINK-RUNTIME-AIXCXX %s
//
// RUN: %clang --driver-mode=g++ -fsanitize=address -### %s 2>&1 \
-// RUN: --target=powerpc64-unknown-aix \
-// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: --target=powerpc64-ibm-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
// RUN: | FileCheck --check-prefixes=CHECK-ASAN-LINK-RUNTIME-AIX,CHECK-ASAN-LINK-RUNTIME-AIX64,CHECK-ASAN-LINK-RUNTIME-AIXCXX64,CHECK-ASAN-LINK-RUNTIME-AIXCXX %s
//
// RUN: %clang -fsanitize=address -### %s 2>&1 \
-// RUN: -static-libsan --target=powerpc-unknown-aix \
-// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: -static-libsan --target=powerpc-ibm-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
// RUN: | FileCheck --check-prefixes=CHECK-ASAN-LINK-RUNTIME-AIX,CHECK-ASAN-LINK-RUNTIME-AIX32 %s
//
// RUN: %clang -fsanitize=address -### %s 2>&1 \
-// RUN: -static-libsan --target=powerpc64-unknown-aix \
-// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: -static-libsan --target=powerpc64-ibm-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
// RUN: | FileCheck --check-prefixes=CHECK-ASAN-LINK-RUNTIME-AIX,CHECK-ASAN-LINK-RUNTIME-AIX64 %s
//
@@ -1410,11 +1410,11 @@
// CHECK-ASAN-LINK-RUNTIME-AIX32: "-b32"
// CHECK-ASAN-LINK-RUNTIME-AIX64: "-b64"
// CHECK-ASAN-LINK-RUNTIME-AIX: "-bcdtors:all:0:s"
-// CHECK-ASAN-LINK-RUNTIME-AIX32: "{{.*}}libclang_rt.asan-powerpc.a"
-// CHECK-ASAN-LINK-RUNTIME-AIX64: "{{.*}}libclang_rt.asan-powerpc64.a"
+// CHECK-ASAN-LINK-RUNTIME-AIX32: "{{.*}}libclang_rt.asan.a"
+// CHECK-ASAN-LINK-RUNTIME-AIX64: "{{.*}}libclang_rt.asan.a"
// CHECK-ASAN-LINK-RUNTIME-AIX: "-bE:{{.*}}asan.link_with_main_exec.txt"
-// CHECK-ASAN-LINK-RUNTIME-AIXCXX32: "{{.*}}libclang_rt.asan_cxx-powerpc.a"
-// CHECK-ASAN-LINK-RUNTIME-AIXCXX64: "{{.*}}libclang_rt.asan_cxx-powerpc64.a"
+// CHECK-ASAN-LINK-RUNTIME-AIXCXX32: "{{.*}}libclang_rt.asan_cxx.a"
+// CHECK-ASAN-LINK-RUNTIME-AIXCXX64: "{{.*}}libclang_rt.asan_cxx.a"
// CHECK-ASAN-LINK-RUNTIME-AIXCXX: "-bE:{{.*}}asan_cxx.link_with_main_exec.txt"
// CHECK-ASAN-LINK-RUNTIME-AIX: "-lpthread"
// CHECK-ASAN-LINK-RUNTIME-AIX: "-latomic"
@@ -1422,40 +1422,40 @@
// CHECK-ASAN-LINK-RUNTIME-AIX: "-lc"
// RUN: not %clang -fsanitize=address -### %s 2>&1 \
-// RUN: -shared-libsan --target=powerpc-unknown-aix \
-// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: -shared-libsan --target=powerpc-ibm-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
// RUN: | FileCheck --check-prefixes=CHECK-SHARED-ASAN-AIX %s
//
// RUN: not %clang -fsanitize=address -### %s 2>&1 \
-// RUN: -shared-libsan --target=powerpc64-unknown-aix \
-// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: -shared-libsan --target=powerpc64-ibm-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
// RUN: | FileCheck --check-prefixes=CHECK-SHARED-ASAN-AIX %s
//
// CHECK-SHARED-ASAN-AIX: {{.*}}error: shared AddressSanitizer runtime is not supported on AIX
// RUN: %clang -fsanitize=address -shared -### %s 2>&1 \
-// RUN: --target=powerpc-unknown-aix \
-// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: --target=powerpc-ibm-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
// RUN: | FileCheck --check-prefixes=CHECK-ASAN-SHARED-LIBRARY-AIX,CHECK-ASAN-SHARED-LIBRARY-AIX32 %s
//
// RUN: %clang -fsanitize=address -shared -### %s 2>&1 \
-// RUN: --target=powerpc64-unknown-aix \
-// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: --target=powerpc64-ibm-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
// RUN: | FileCheck --check-prefixes=CHECK-ASAN-SHARED-LIBRARY-AIX,CHECK-ASAN-SHARED-LIBRARY-AIX64 %s
//
// RUN: %clang -fsanitize=address --driver-mode=g++ -shared -### %s 2>&1 \
-// RUN: --target=powerpc-unknown-aix \
-// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: --target=powerpc-ibm-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
// RUN: | FileCheck --check-prefixes=CHECK-ASAN-SHARED-LIBRARY-AIX,CHECK-ASAN-SHARED-LIBRARY-AIX32,CHECK-ASAN-SHARED-LIBRARY-AIXCXX %s
//
// RUN: %clang -fsanitize=address --driver-mode=g++ -shared -### %s 2>&1 \
-// RUN: --target=powerpc64-unknown-aix \
-// RUN: -resource-dir=%S/Inputs/resource_dir \
+// RUN: --target=powerpc64-ibm-aix \
+// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
// RUN: | FileCheck --check-prefixes=CHECK-ASAN-SHARED-LIBRARY-AIX,CHECK-ASAN-SHARED-LIBRARY-AIX64,CHECK-ASAN-SHARED-LIBRARY-AIXCXX %s
//
@@ -1465,9 +1465,9 @@
// CHECK-ASAN-SHARED-LIBRARY-AIX: "-bcdtors:all:0:s"
// CHECK-ASAN-SHARED-LIBRARY-AIX: "-bI:{{.*}}asan.link_with_main_exec.txt"
// CHECK-ASAN-SHARED-LIBRARY-AIXCXX: "-bI:{{.*}}asan_cxx.link_with_main_exec.txt"
-// CHECK-ASAN-SHARED-LIBRARY-AIX32-NOT: "{{.*}}libclang_rt.asan-powerpc.a"
-// CHECK-ASAN-SHARED-LIBRARY-AIX64-NOT: "{{.*}}libclang_rt.asan-powerpc64.a"
-// CHECK-ASAN-SHARED-LIBRARY-AIXCXX-NOT: "{{.*}}libclang_rt.asan_cxx-powerpc{{.*}}"
+// CHECK-ASAN-SHARED-LIBRARY-AIX32-NOT: "{{.*}}libclang_rt.asan.a"
+// CHECK-ASAN-SHARED-LIBRARY-AIX64-NOT: "{{.*}}libclang_rt.asan.a"
+// CHECK-ASAN-SHARED-LIBRARY-AIXCXX-NOT: "{{.*}}libclang_rt.asan_cxx.a"
// CHECK-ASAN-SHARED-LIBRARY-AIX-NOT: "-lpthread"
// CHECK-ASAN-SHARED-LIBRARY-AIX-NOT: "-latomic"
// CHECK-ASAN-SHARED-LIBRARY-AIX: "-lunwind"
>From b768d718851140d977f3ea6fb198107cb5a47084 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Mon, 26 May 2025 11:19:28 -0400
Subject: [PATCH 06/12] Fix formatting
---
clang/lib/Driver/ToolChains/AIX.cpp | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp
index c188c350a254a..a660214e942e4 100644
--- a/clang/lib/Driver/ToolChains/AIX.cpp
+++ b/clang/lib/Driver/ToolChains/AIX.cpp
@@ -291,16 +291,18 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
if (Args.hasArg(options::OPT_shared) &&
ToolChain.getSanitizerArgs(Args).needsAsanRt()) {
SmallString<128> SanRTSymbolList;
- (Twine(ToolChain.getRuntimePath().value_or("")) +
- "/asan.link_with_main_exec.txt").toVector(SanRTSymbolList);
+ (Twine(ToolChain.getRuntimePath().value_or("")) +
+ "/asan.link_with_main_exec.txt")
+ .toVector(SanRTSymbolList);
if (llvm::sys::fs::exists(SanRTSymbolList))
CmdArgs.push_back(Args.MakeArgString(Twine("-bI:") + SanRTSymbolList));
else
llvm::report_fatal_error("Missing address sanitizer import list.");
if (ToolChain.getSanitizerArgs(Args).linkCXXRuntimes()) {
SanRTSymbolList.clear();
- (Twine(ToolChain.getRuntimePath().value_or("")) +
- "/asan_cxx.link_with_main_exec.txt").toVector(SanRTSymbolList);
+ (Twine(ToolChain.getRuntimePath().value_or("")) +
+ "/asan_cxx.link_with_main_exec.txt")
+ .toVector(SanRTSymbolList);
if (llvm::sys::fs::exists(SanRTSymbolList))
CmdArgs.push_back(Args.MakeArgString(Twine("-bI:") + SanRTSymbolList));
else
>From 6fccd97bf7c465da10302b85c53bea9d34e879bd Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Thu, 29 May 2025 00:37:35 -0400
Subject: [PATCH 07/12] Add comment
---
clang/lib/Driver/ToolChains/AIX.cpp | 3 +++
1 file changed, 3 insertions(+)
diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp
index a660214e942e4..ee297155d99f0 100644
--- a/clang/lib/Driver/ToolChains/AIX.cpp
+++ b/clang/lib/Driver/ToolChains/AIX.cpp
@@ -278,6 +278,9 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
}
// Add sanitizer runtime dependencies.
+ // Note: having the static runtime linked into shared libraries can
+ // lead to multiple copies of the runtime with AIX's linkage model,
+ // so disallow that.
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
options::OPT_shared, options::OPT_r)) {
if (NeedsSanitizerDeps)
>From 94347da0701b540fa7533d6429b326ede1708400 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Sun, 1 Jun 2025 22:10:59 -0400
Subject: [PATCH 08/12] Make error more general
---
clang/include/clang/Basic/DiagnosticDriverKinds.td | 6 ++----
clang/lib/Driver/ToolChains/AIX.cpp | 4 ++--
clang/lib/Driver/ToolChains/Darwin.cpp | 4 ++--
3 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 10891f2e9e5c1..1410c67e001e5 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -254,10 +254,8 @@ def err_drv_malformed_sanitizer_coverage_ignorelist : Error<
"malformed sanitizer coverage ignorelist: '%0'">;
def err_drv_malformed_sanitizer_metadata_ignorelist : Error<
"malformed sanitizer metadata ignorelist: '%0'">;
-def err_drv_unsupported_static_sanitizer_darwin : Error<
- "static %0 runtime is not supported on darwin">;
-def err_drv_unsupported_shared_sanitizer_aix : Error<
- "shared %0 runtime is not supported on AIX">;
+def err_drv_unsupported_sanitizer : Error<
+ "%0 %1 runtime is not supported on %3">;
def err_drv_duplicate_config : Error<
"no more than one option '--config' is allowed">;
def err_drv_cannot_open_config_file : Error<
diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp
index ee297155d99f0..10dcf9a8fde40 100644
--- a/clang/lib/Driver/ToolChains/AIX.cpp
+++ b/clang/lib/Driver/ToolChains/AIX.cpp
@@ -270,8 +270,8 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
if (sanitizer) {
if (Sanitize.needsSharedRt()) {
- ToolChain.getDriver().Diag(diag::err_drv_unsupported_shared_sanitizer_aix)
- << sanitizer;
+ ToolChain.getDriver().Diag(diag::err_drv_unsupported_sanitizer)
+ << "shared" << sanitizer << "AIX";
return;
}
NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp
index 452820159435f..8927c3a587d96 100644
--- a/clang/lib/Driver/ToolChains/Darwin.cpp
+++ b/clang/lib/Driver/ToolChains/Darwin.cpp
@@ -1572,8 +1572,8 @@ void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
sanitizer = "ThreadSanitizer";
}
if (sanitizer) {
- getDriver().Diag(diag::err_drv_unsupported_static_sanitizer_darwin)
- << sanitizer;
+ getDriver().Diag(diag::err_drv_unsupportedsanitizer)
+ << "static" << sanitizer << "darwin";
return;
}
}
>From 8d816ba246ebf6fd1b8400af9f25dfcdd53519f2 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Sun, 1 Jun 2025 22:12:03 -0400
Subject: [PATCH 09/12] Add .
---
clang/lib/Driver/ToolChains/AIX.cpp | 4 ++--
clang/lib/Driver/ToolChains/CommonArgs.cpp | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp
index 10dcf9a8fde40..3aeb5cdfde513 100644
--- a/clang/lib/Driver/ToolChains/AIX.cpp
+++ b/clang/lib/Driver/ToolChains/AIX.cpp
@@ -294,7 +294,7 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
if (Args.hasArg(options::OPT_shared) &&
ToolChain.getSanitizerArgs(Args).needsAsanRt()) {
SmallString<128> SanRTSymbolList;
- (Twine(ToolChain.getRuntimePath().value_or("")) +
+ (Twine(ToolChain.getRuntimePath().value_or(".")) +
"/asan.link_with_main_exec.txt")
.toVector(SanRTSymbolList);
if (llvm::sys::fs::exists(SanRTSymbolList))
@@ -303,7 +303,7 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
llvm::report_fatal_error("Missing address sanitizer import list.");
if (ToolChain.getSanitizerArgs(Args).linkCXXRuntimes()) {
SanRTSymbolList.clear();
- (Twine(ToolChain.getRuntimePath().value_or("")) +
+ (Twine(ToolChain.getRuntimePath().value_or(".")) +
"/asan_cxx.link_with_main_exec.txt")
.toVector(SanRTSymbolList);
if (llvm::sys::fs::exists(SanRTSymbolList))
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index d1da46964d315..40698aa6fe4ba 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1379,7 +1379,7 @@ static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
if (TC.getTriple().isOSAIX()) {
SmallString<128> SanRTSymbolList;
- (Twine(TC.getRuntimePath().value_or("")) + "/" + Sanitizer +
+ (Twine(TC.getRuntimePath().value_or(".")) + "/" + Sanitizer +
".link_with_main_exec.txt")
.toVector(SanRTSymbolList);
if (llvm::sys::fs::exists(SanRTSymbolList)) {
>From a6bdac73a83e0ebe0be383de9eeba6ce3ac939e3 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Sun, 1 Jun 2025 23:51:53 -0400
Subject: [PATCH 10/12] Fix mispelling
---
clang/lib/Driver/ToolChains/Darwin.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp
index 8927c3a587d96..527e3e79a9537 100644
--- a/clang/lib/Driver/ToolChains/Darwin.cpp
+++ b/clang/lib/Driver/ToolChains/Darwin.cpp
@@ -1572,7 +1572,7 @@ void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
sanitizer = "ThreadSanitizer";
}
if (sanitizer) {
- getDriver().Diag(diag::err_drv_unsupportedsanitizer)
+ getDriver().Diag(diag::err_drv_unsupported_sanitizer)
<< "static" << sanitizer << "darwin";
return;
}
>From 5254c8d7d297c4d76fee5dbd47bad7a22b283dc9 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Mon, 2 Jun 2025 08:59:03 -0400
Subject: [PATCH 11/12] Fix num
---
clang/include/clang/Basic/DiagnosticDriverKinds.td | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 1410c67e001e5..8580379445820 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -255,7 +255,7 @@ def err_drv_malformed_sanitizer_coverage_ignorelist : Error<
def err_drv_malformed_sanitizer_metadata_ignorelist : Error<
"malformed sanitizer metadata ignorelist: '%0'">;
def err_drv_unsupported_sanitizer : Error<
- "%0 %1 runtime is not supported on %3">;
+ "%0 %1 runtime is not supported on %2">;
def err_drv_duplicate_config : Error<
"no more than one option '--config' is allowed">;
def err_drv_cannot_open_config_file : Error<
>From 2b760410dba9ec8750adf1089308a143484ca263 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Mon, 23 Jun 2025 13:23:03 -0400
Subject: [PATCH 12/12] Use preferred error reporting mechanism
---
.../clang/Basic/DiagnosticDriverKinds.td | 2 ++
clang/lib/Driver/ToolChains/AIX.cpp | 4 ++--
clang/lib/Driver/ToolChains/CommonArgs.cpp | 14 ++++++++----
clang/test/Driver/sanitizer-ld.c | 22 +++++++++++++++++++
4 files changed, 36 insertions(+), 6 deletions(-)
diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 8580379445820..2983c0ca7c277 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -256,6 +256,8 @@ def err_drv_malformed_sanitizer_metadata_ignorelist : Error<
"malformed sanitizer metadata ignorelist: '%0'">;
def err_drv_unsupported_sanitizer : Error<
"%0 %1 runtime is not supported on %2">;
+def err_drv_missing_sanitizer_file : Error<
+ "cannot link '%0': %1 file missing from resource directories">;
def err_drv_duplicate_config : Error<
"no more than one option '--config' is allowed">;
def err_drv_cannot_open_config_file : Error<
diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp
index 3aeb5cdfde513..04343aea1afb8 100644
--- a/clang/lib/Driver/ToolChains/AIX.cpp
+++ b/clang/lib/Driver/ToolChains/AIX.cpp
@@ -300,7 +300,7 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
if (llvm::sys::fs::exists(SanRTSymbolList))
CmdArgs.push_back(Args.MakeArgString(Twine("-bI:") + SanRTSymbolList));
else
- llvm::report_fatal_error("Missing address sanitizer import list.");
+ ToolChain.getDriver().Diag(diag::err_drv_missing_sanitizer_file) << sanitizer << "import";
if (ToolChain.getSanitizerArgs(Args).linkCXXRuntimes()) {
SanRTSymbolList.clear();
(Twine(ToolChain.getRuntimePath().value_or(".")) +
@@ -309,7 +309,7 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
if (llvm::sys::fs::exists(SanRTSymbolList))
CmdArgs.push_back(Args.MakeArgString(Twine("-bI:") + SanRTSymbolList));
else
- llvm::report_fatal_error("Missing address sanitizer c++ import list.");
+ ToolChain.getDriver().Diag(diag::err_drv_missing_sanitizer_file) << sanitizer << "c++ import";
}
}
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 40698aa6fe4ba..5f7b85851f45c 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1644,15 +1644,22 @@ bool tools::addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
for (auto RT : HelperStaticRuntimes)
addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
bool AddExportDynamic = false;
+ StringRef RTNeedsExport;
for (auto RT : StaticRuntimes) {
// AIX does not support --whole-archive.
addSanitizerRuntime(TC, Args, CmdArgs, RT, false,
!TC.getTriple().isOSAIX());
- AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
+ if (!addSanitizerDynamicList(TC, Args, CmdArgs, RT)) {
+ AddExportDynamic = true;
+ RTNeedsExport = RT;
+ }
}
for (auto RT : NonWholeStaticRuntimes) {
addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
- AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
+ if (!addSanitizerDynamicList(TC, Args, CmdArgs, RT)) {
+ AddExportDynamic = true;
+ RTNeedsExport = RT;
+ }
}
// If there is a static runtime with no dynamic list, force all the symbols
// to be dynamic to be sure we export sanitizer interface functions.
@@ -1660,8 +1667,7 @@ bool tools::addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
if (!TC.getTriple().isOSAIX())
CmdArgs.push_back("--export-dynamic");
else
- llvm::report_fatal_error("Sanitizer interface functions must be exported "
- "by export files on AIX.");
+ TC.getDriver().Diag(diag::err_drv_missing_sanitizer_file) << RTNeedsExport << "export";
}
if (SanArgs.hasCrossDsoCfi() && !AddExportDynamic)
diff --git a/clang/test/Driver/sanitizer-ld.c b/clang/test/Driver/sanitizer-ld.c
index 4df771d792bc3..334ed1a5c912a 100644
--- a/clang/test/Driver/sanitizer-ld.c
+++ b/clang/test/Driver/sanitizer-ld.c
@@ -1435,6 +1435,28 @@
//
// CHECK-SHARED-ASAN-AIX: {{.*}}error: shared AddressSanitizer runtime is not supported on AIX
+// RUN: not %clang -fsanitize=address -### %s 2>&1 \
+// RUN: --target=powerpc-ibm-aix \
+// RUN: -resource-dir=/missing_resource_dir \
+// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
+// RUN: | FileCheck --check-prefixes=CHECK-MISSING-EXPORT-AIX %s
+// CHECK-MISSING-EXPORT-AIX: {{.*}}error: cannot link 'asan': export file missing from resource directories
+
+// RUN: not %clang -fsanitize=address -### %s 2>&1 \
+// RUN: -shared --target=powerpc-ibm-aix \
+// RUN: -resource-dir=/missing_resource_dir \
+// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
+// RUN: | FileCheck --check-prefixes=CHECK-MISSING-IMPORT-AIX %s
+// CHECK-MISSING-IMPORT-AIX: {{.*}}error: cannot link 'AddressSanitizer': import file missing from resource directories
+
+// RUN: not %clang++ -fsanitize=address -### %s 2>&1 \
+// RUN: -shared --target=powerpc-ibm-aix \
+// RUN: -resource-dir=/missing_resource_dir \
+// RUN: --sysroot=%S/Inputs/aix_ppc_tree \
+// RUN: | FileCheck --check-prefixes=CHECK-MISSING-CXX-IMPORT-AIX %s
+// CHECK-MISSING-CXX-IMPORT-AIX: {{.*}}error: cannot link 'AddressSanitizer': c++ import file
+// missing from resource directories
+
// RUN: %clang -fsanitize=address -shared -### %s 2>&1 \
// RUN: --target=powerpc-ibm-aix \
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
More information about the cfe-commits
mailing list