[clang] 8d0a484 - [XRay] Fix argument parsing with offloading (#140748) (#141043)
via cfe-commits
cfe-commits at lists.llvm.org
Thu May 22 07:06:27 PDT 2025
Author: Sebastian Kreutzer
Date: 2025-05-22T09:06:24-05:00
New Revision: 8d0a484983ef3e35e46d7979d749c96203b0296b
URL: https://github.com/llvm/llvm-project/commit/8d0a484983ef3e35e46d7979d749c96203b0296b
DIFF: https://github.com/llvm/llvm-project/commit/8d0a484983ef3e35e46d7979d749c96203b0296b.diff
LOG: [XRay] Fix argument parsing with offloading (#140748) (#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`.
Added:
Modified:
clang/include/clang/Driver/ToolChain.h
clang/lib/Driver/ToolChain.cpp
clang/lib/Driver/ToolChains/Clang.cpp
clang/lib/Driver/ToolChains/CommonArgs.cpp
clang/lib/Driver/ToolChains/Darwin.cpp
clang/test/Driver/XRay/xray-instrument.c
Removed:
################################################################################
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..d3cefb6680f4c 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 -### --target=x86_64-unknown-linux-gnu -Xarch_host -fxray-instrument -c %s -o /dev/null 2>&1 | FileCheck %s
+// RUN: not %clang -### --target=x86_64-unknown-linux-gnu -x hip --offload-arch=gfx906 -nogpulib -nogpuinc -fxray-instrument -c %s -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR
+// RUN: %clang -### --target=x86_64-unknown-linux-gnu -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
More information about the cfe-commits
mailing list