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.e...@ibm.com> Date: Wed, 5 Mar 2025 01:57:38 -0500 Subject: [PATCH 1/3] [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.e...@ibm.com> Date: Sun, 9 Mar 2025 00:21:16 -0500 Subject: [PATCH 2/3] 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.e...@ibm.com> Date: Thu, 24 Apr 2025 13:49:20 -0400 Subject: [PATCH 3/3] 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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits