diff options
author | Alex Voicu <alexandru.voicu@amd.com> | 2024-11-05 10:53:05 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-05 10:53:05 +0200 |
commit | dc62edf10543137fbf7f3d4aaa21c17ff073a8fe (patch) | |
tree | a10e0054adc47496275e8545372e2a23cb81e7a0 /clang/lib/Driver/Driver.cpp | |
parent | d084bc291a21895fa2ecc74e2d1c9d1818ba4fd7 (diff) | |
download | llvm-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.cpp | 20 |
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)); |