aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Driver/Driver.cpp
diff options
context:
space:
mode:
authorAlex Voicu <alexandru.voicu@amd.com>2024-11-05 10:53:05 +0200
committerGitHub <noreply@github.com>2024-11-05 10:53:05 +0200
commitdc62edf10543137fbf7f3d4aaa21c17ff073a8fe (patch)
treea10e0054adc47496275e8545372e2a23cb81e7a0 /clang/lib/Driver/Driver.cpp
parentd084bc291a21895fa2ecc74e2d1c9d1818ba4fd7 (diff)
downloadllvm-dc62edf10543137fbf7f3d4aaa21c17ff073a8fe.zip
llvm-dc62edf10543137fbf7f3d4aaa21c17ff073a8fe.tar.gz
llvm-dc62edf10543137fbf7f3d4aaa21c17ff073a8fe.tar.bz2
[clang][Driver][HIP] Add support for mixing AMDGCNSPIRV & concrete `offload-arch`s. (#113509)
This removes the temporary ban on mixing AMDGCN flavoured SPIR-V and concrete targets (e.g. `gfx900`) in the same HIPAMD compilation. This is done primarily by tweaking the effective / observable triple when the target is `amdgcnspirv`, which seamlessly composes with the existing infra. The test is stolen from #75357.
Diffstat (limited to 'clang/lib/Driver/Driver.cpp')
-rw-r--r--clang/lib/Driver/Driver.cpp20
1 files changed, 9 insertions, 11 deletions
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index df80245..c5be122 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -149,13 +149,9 @@ static std::optional<llvm::Triple>
getHIPOffloadTargetTriple(const Driver &D, const ArgList &Args) {
if (!Args.hasArg(options::OPT_offload_EQ)) {
auto OffloadArchs = Args.getAllArgValues(options::OPT_offload_arch_EQ);
- if (llvm::is_contained(OffloadArchs, "amdgcnspirv")) {
- if (OffloadArchs.size() == 1)
- return llvm::Triple("spirv64-amd-amdhsa");
- // Mixing specific & SPIR-V compilation is not supported for now.
- D.Diag(diag::err_drv_only_one_offload_target_supported);
- return std::nullopt;
- }
+ if (llvm::is_contained(OffloadArchs, "amdgcnspirv") &&
+ OffloadArchs.size() == 1)
+ return llvm::Triple("spirv64-amd-amdhsa");
return llvm::Triple("amdgcn-amd-amdhsa"); // Default HIP triple.
}
auto TT = getOffloadTargetTriple(D, Args);
@@ -3477,9 +3473,11 @@ class OffloadingActionBuilder final {
llvm::StringMap<bool> Features;
// getHIPOffloadTargetTriple() is known to return valid value as it has
// been called successfully in the CreateOffloadingDeviceToolChains().
- auto ArchStr = parseTargetID(
- *getHIPOffloadTargetTriple(C.getDriver(), C.getInputArgs()), IdStr,
- &Features);
+ auto T =
+ (IdStr == "amdgcnspirv")
+ ? llvm::Triple("spirv64-amd-amdhsa")
+ : *getHIPOffloadTargetTriple(C.getDriver(), C.getInputArgs());
+ auto ArchStr = parseTargetID(T, IdStr, &Features);
if (!ArchStr) {
C.getDriver().Diag(clang::diag::err_drv_bad_target_id) << IdStr;
C.setContainsError();
@@ -5755,7 +5753,7 @@ InputInfoList Driver::BuildJobsForActionNoCache(
// We only have to generate a prefix for the host if this is not a top-level
// action.
std::string OffloadingPrefix = Action::GetOffloadingFileNamePrefix(
- A->getOffloadingDeviceKind(), TC->getTriple().normalize(),
+ A->getOffloadingDeviceKind(), EffectiveTriple.normalize(),
/*CreatePrefixForHost=*/isa<OffloadPackagerJobAction>(A) ||
!(A->getOffloadingHostActiveKinds() == Action::OFK_None ||
AtTopLevel));