https://github.com/sebastiankreutzer created https://github.com/llvm/llvm-project/pull/141043
This PR addressed issue #140748 to support XRay instrumentation on the host side when using offloading. It makes the following changes: - Initializes `XRayArgs` using the processed toolchain arguments instead of the raw input. - Removes the current caching mechanism of `XRayArgs` in the `ToolChain` class, as this is error-prone and potential benefits are questionable. For reference, `SanitizierArgs`, which is constructed in a similar manner but is much more complex, does not use any caching. - Adds driver tests to verify that XRay flags are set correctly with offloading and `-Xarch_host`. >From ff1ff0ca990bc42bbc2a484144050fe3993a0347 Mon Sep 17 00:00:00 2001 From: Sebastian Kreutzer <sebastiankreut...@gmx.net> Date: Thu, 22 May 2025 12:55:48 +0200 Subject: [PATCH] [XRay] Fix argument parsing with offloading --- clang/include/clang/Driver/ToolChain.h | 3 +-- clang/lib/Driver/ToolChain.cpp | 7 +++---- clang/lib/Driver/ToolChains/Clang.cpp | 2 +- clang/lib/Driver/ToolChains/CommonArgs.cpp | 7 ++++--- clang/lib/Driver/ToolChains/Darwin.cpp | 2 +- clang/test/Driver/XRay/xray-instrument.c | 5 +++++ 6 files changed, 15 insertions(+), 11 deletions(-) diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h index 58edf2b3887b0..b8899e78176b4 100644 --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -179,7 +179,6 @@ class ToolChain { Tool *getLinkerWrapper() const; mutable bool SanitizerArgsChecked = false; - mutable std::unique_ptr<XRayArgs> XRayArguments; /// The effective clang triple for the current Job. mutable llvm::Triple EffectiveTriple; @@ -323,7 +322,7 @@ class ToolChain { SanitizerArgs getSanitizerArgs(const llvm::opt::ArgList &JobArgs) const; - const XRayArgs& getXRayArgs() const; + const XRayArgs getXRayArgs(const llvm::opt::ArgList &) const; // Returns the Arg * that explicitly turned on/off rtti, or nullptr. const llvm::opt::Arg *getRTTIArg() const { return CachedRTTIArg; } diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 4adea6a8e75ab..4dab08cb6fd88 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -389,10 +389,9 @@ ToolChain::getSanitizerArgs(const llvm::opt::ArgList &JobArgs) const { return SanArgs; } -const XRayArgs& ToolChain::getXRayArgs() const { - if (!XRayArguments) - XRayArguments.reset(new XRayArgs(*this, Args)); - return *XRayArguments; +const XRayArgs ToolChain::getXRayArgs(const llvm::opt::ArgList &JobArgs) const { + XRayArgs XRayArguments(*this, JobArgs); + return XRayArguments; } namespace { diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 355a48be9f493..2fb6cf8ea2bdc 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -6913,7 +6913,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("--offload-new-driver"); } - const XRayArgs &XRay = TC.getXRayArgs(); + const XRayArgs &XRay = TC.getXRayArgs(Args); XRay.addArgs(TC, Args, CmdArgs, InputType); for (const auto &Filename : diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index d2535d1a2624a..fa641b5d8196d 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -1647,17 +1647,18 @@ bool tools::addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, } bool tools::addXRayRuntime(const ToolChain&TC, const ArgList &Args, ArgStringList &CmdArgs) { + const XRayArgs &XRay = TC.getXRayArgs(Args); if (Args.hasArg(options::OPT_shared)) { - if (TC.getXRayArgs().needsXRayDSORt()) { + if (XRay.needsXRayDSORt()) { CmdArgs.push_back("--whole-archive"); CmdArgs.push_back(TC.getCompilerRTArgString(Args, "xray-dso")); CmdArgs.push_back("--no-whole-archive"); return true; } - } else if (TC.getXRayArgs().needsXRayRt()) { + } else if (XRay.needsXRayRt()) { CmdArgs.push_back("--whole-archive"); CmdArgs.push_back(TC.getCompilerRTArgString(Args, "xray")); - for (const auto &Mode : TC.getXRayArgs().modeList()) + for (const auto &Mode : XRay.modeList()) CmdArgs.push_back(TC.getCompilerRTArgString(Args, Mode)); CmdArgs.push_back("--no-whole-archive"); return true; diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index 26e24ad0ab17c..452820159435f 100644 --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -1627,7 +1627,7 @@ void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args, CmdArgs, llvm::memprof::getMemprofOptionsSymbolDarwinLinkageName().data()); - const XRayArgs &XRay = getXRayArgs(); + const XRayArgs &XRay = getXRayArgs(Args); if (XRay.needsXRayRt()) { AddLinkRuntimeLib(Args, CmdArgs, "xray"); AddLinkRuntimeLib(Args, CmdArgs, "xray-basic"); diff --git a/clang/test/Driver/XRay/xray-instrument.c b/clang/test/Driver/XRay/xray-instrument.c index 48e20c45be4ac..d00d8972eb1a1 100644 --- a/clang/test/Driver/XRay/xray-instrument.c +++ b/clang/test/Driver/XRay/xray-instrument.c @@ -3,6 +3,11 @@ // RUN: %clang -### --target=x86_64-apple-darwin -fxray-instrument -c %s -o /dev/null 2>&1 | FileCheck %s // RUN: not %clang -### --target=x86_64-pc-windows -fxray-instrument -c %s -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR +/// Checking -fxray-instrument with offloading and -Xarch_host +// RUN: %clang -### -Xarch_host -fxray-instrument -c %s -o /dev/null 2>&1 | FileCheck %s +// RUN: not %clang -### -x hip --offload-arch=gfx906 -nogpulib -nogpuinc -fxray-instrument -c %s -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR +// RUN: %clang -### -x hip --offload-arch=gfx906 -nogpulib -nogpuinc -Xarch_host -fxray-instrument -c %s -o /dev/null 2>&1 | FileCheck %s + // CHECK: "-cc1" {{.*}}"-fxray-instrument" // ERR: error: unsupported option '-fxray-instrument' for target _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits