[OffloadBundler] Rework the ctor of OffloadTargetInfo to support AMDGPU's generic target (#122629)
The current parsing logic for the target string assumes it follows the format `<kind>-<triple>-<target id>:<feature>`, such as `hipv4-amdgcn-amd-amdhsa-gfx1030:+xnack`. Specifically, it assumes that `<target id>` does not contain any `-`, relying on `rsplit` for parsing. However, this assumption breaks for AMDGPU's generic targets, which may contain one or more `-`, such as `gfx10-3-generic` or `gfx12-generic`. As a result, the existing approach using `rstrip` is no longer reliable. This patch reworks the parsing logic to handle target strings more robustly, including support for generic targets. The bundler now strictly requires a 4-field target triple. Additionally, a new Python helper function has been added to `config.py` to normalize the target triple into the 4-field format when it is not, ensuring tests pass reliably.
This commit is contained in:
parent
ca87823438
commit
d85a81b4e4
@ -266,15 +266,14 @@ without differentiation based on offload kind.
|
||||
The target triple of the code object. See `Target Triple
|
||||
<https://clang.llvm.org/docs/CrossCompilation.html#target-triple>`_.
|
||||
|
||||
The bundler accepts target triples with or without the optional environment
|
||||
field:
|
||||
LLVM target triples can be with or without the optional environment field:
|
||||
|
||||
``<arch><sub>-<vendor>-<sys>``, or
|
||||
``<arch><sub>-<vendor>-<sys>-<env>``
|
||||
|
||||
However, in order to standardize outputs for tools that consume bitcode
|
||||
bundles, bundles written by the bundler internally use only the 4-field
|
||||
target triple:
|
||||
However, in order to standardize outputs for tools that consume bitcode bundles
|
||||
and to parse target ID containing dashes, the bundler only accepts target
|
||||
triples in the 4-field format:
|
||||
|
||||
``<arch><sub>-<vendor>-<sys>-<env>``
|
||||
|
||||
@ -543,4 +542,4 @@ The compressed offload bundle begins with a header followed by the compressed bi
|
||||
- **Compressed Data**:
|
||||
The actual compressed binary data follows the header. Its size can be inferred from the total size of the file minus the header size.
|
||||
|
||||
> **Note**: Version 3 of the format is under development. It uses 64-bit fields for Total File Size and Uncompressed Binary Size to support files larger than 4GB. To experiment with version 3, set the environment variable `COMPRESSED_BUNDLE_FORMAT_VERSION=3`. This support is experimental and not recommended for production use.
|
||||
> **Note**: Version 3 of the format is under development. It uses 64-bit fields for Total File Size and Uncompressed Binary Size to support files larger than 4GB. To experiment with version 3, set the environment variable `COMPRESSED_BUNDLE_FORMAT_VERSION=3`. This support is experimental and not recommended for production use.
|
||||
|
||||
@ -158,6 +158,11 @@ public:
|
||||
static llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>>
|
||||
decompress(const llvm::MemoryBuffer &Input, bool Verbose = false);
|
||||
};
|
||||
|
||||
/// Check whether the bundle id is in the following format:
|
||||
/// <kind>-<triple>[-<target id>[:target features]]
|
||||
/// <triple> := <arch>-<vendor>-<os>-<env>
|
||||
bool checkOffloadBundleID(const llvm::StringRef Str);
|
||||
} // namespace clang
|
||||
|
||||
#endif // LLVM_CLANG_DRIVER_OFFLOADBUNDLER_H
|
||||
|
||||
@ -83,32 +83,27 @@ OffloadTargetInfo::OffloadTargetInfo(const StringRef Target,
|
||||
const OffloadBundlerConfig &BC)
|
||||
: BundlerConfig(BC) {
|
||||
|
||||
// TODO: Add error checking from ClangOffloadBundler.cpp
|
||||
auto TargetFeatures = Target.split(':');
|
||||
auto TripleOrGPU = TargetFeatures.first.rsplit('-');
|
||||
|
||||
if (clang::StringToOffloadArch(TripleOrGPU.second) !=
|
||||
clang::OffloadArch::UNKNOWN) {
|
||||
auto KindTriple = TripleOrGPU.first.split('-');
|
||||
this->OffloadKind = KindTriple.first;
|
||||
|
||||
// Enforce optional env field to standardize bundles
|
||||
llvm::Triple t = llvm::Triple(KindTriple.second);
|
||||
this->Triple = llvm::Triple(t.getArchName(), t.getVendorName(),
|
||||
t.getOSName(), t.getEnvironmentName());
|
||||
|
||||
this->TargetID = Target.substr(Target.find(TripleOrGPU.second));
|
||||
} else {
|
||||
auto KindTriple = TargetFeatures.first.split('-');
|
||||
this->OffloadKind = KindTriple.first;
|
||||
|
||||
// Enforce optional env field to standardize bundles
|
||||
llvm::Triple t = llvm::Triple(KindTriple.second);
|
||||
this->Triple = llvm::Triple(t.getArchName(), t.getVendorName(),
|
||||
t.getOSName(), t.getEnvironmentName());
|
||||
// <kind>-<triple>[-<target id>[:target features]]
|
||||
// <triple> := <arch>-<vendor>-<os>-<env>
|
||||
SmallVector<StringRef, 6> Components;
|
||||
Target.split(Components, '-', /*MaxSplit=*/5);
|
||||
assert((Components.size() == 5 || Components.size() == 6) &&
|
||||
"malformed target string");
|
||||
|
||||
StringRef TargetIdWithFeature =
|
||||
Components.size() == 6 ? Components.back() : "";
|
||||
StringRef TargetId = TargetIdWithFeature.split(':').first;
|
||||
if (!TargetId.empty() &&
|
||||
clang::StringToOffloadArch(TargetId) != clang::OffloadArch::UNKNOWN)
|
||||
this->TargetID = TargetIdWithFeature;
|
||||
else
|
||||
this->TargetID = "";
|
||||
}
|
||||
|
||||
this->OffloadKind = Components.front();
|
||||
ArrayRef<StringRef> TripleSlice{&Components[1], /*length=*/4};
|
||||
llvm::Triple T = llvm::Triple(llvm::join(TripleSlice, "-"));
|
||||
this->Triple = llvm::Triple(T.getArchName(), T.getVendorName(), T.getOSName(),
|
||||
T.getEnvironmentName());
|
||||
}
|
||||
|
||||
bool OffloadTargetInfo::hasHostKind() const {
|
||||
@ -148,7 +143,18 @@ bool OffloadTargetInfo::operator==(const OffloadTargetInfo &Target) const {
|
||||
}
|
||||
|
||||
std::string OffloadTargetInfo::str() const {
|
||||
return Twine(OffloadKind + "-" + Triple.str() + "-" + TargetID).str();
|
||||
std::string NormalizedTriple;
|
||||
// Unfortunately we need some special sauce for AMDGPU because all the runtime
|
||||
// assumes the triple to be "amdgcn-amd-amdhsa-" (empty environment) instead
|
||||
// of "amdgcn-amd-amdhsa-unknown". It's gonna be very tricky to patch
|
||||
// different layers of runtime.
|
||||
if (Triple.isAMDGPU()) {
|
||||
NormalizedTriple = Triple.normalize(Triple::CanonicalForm::THREE_IDENT);
|
||||
NormalizedTriple.push_back('-');
|
||||
} else {
|
||||
NormalizedTriple = Triple.normalize(Triple::CanonicalForm::FOUR_IDENT);
|
||||
}
|
||||
return Twine(OffloadKind + "-" + NormalizedTriple + "-" + TargetID).str();
|
||||
}
|
||||
|
||||
static StringRef getDeviceFileExtension(StringRef Device,
|
||||
@ -1507,6 +1513,9 @@ Error OffloadBundler::UnbundleFiles() {
|
||||
StringMap<StringRef> Worklist;
|
||||
auto Output = BundlerConfig.OutputFileNames.begin();
|
||||
for (auto &Triple : BundlerConfig.TargetNames) {
|
||||
if (!checkOffloadBundleID(Triple))
|
||||
return createStringError(errc::invalid_argument,
|
||||
"invalid bundle id from bundle config");
|
||||
Worklist[Triple] = *Output;
|
||||
++Output;
|
||||
}
|
||||
@ -1526,6 +1535,9 @@ Error OffloadBundler::UnbundleFiles() {
|
||||
|
||||
StringRef CurTriple = **CurTripleOrErr;
|
||||
assert(!CurTriple.empty());
|
||||
if (!checkOffloadBundleID(CurTriple))
|
||||
return createStringError(errc::invalid_argument,
|
||||
"invalid bundle id read from the bundle");
|
||||
|
||||
auto Output = Worklist.begin();
|
||||
for (auto E = Worklist.end(); Output != E; Output++) {
|
||||
@ -1584,6 +1596,8 @@ Error OffloadBundler::UnbundleFiles() {
|
||||
return createFileError(E.second, EC);
|
||||
|
||||
// If this entry has a host kind, copy the input file to the output file.
|
||||
// We don't need to check E.getKey() here through checkOffloadBundleID
|
||||
// because the entire WorkList has been checked above.
|
||||
auto OffloadInfo = OffloadTargetInfo(E.getKey(), BundlerConfig);
|
||||
if (OffloadInfo.hasHostKind())
|
||||
OutputFile.write(Input.getBufferStart(), Input.getBufferSize());
|
||||
@ -1813,6 +1827,10 @@ Error OffloadBundler::UnbundleArchive() {
|
||||
// archive.
|
||||
while (!CodeObject.empty()) {
|
||||
SmallVector<StringRef> CompatibleTargets;
|
||||
if (!checkOffloadBundleID(CodeObject)) {
|
||||
return createStringError(errc::invalid_argument,
|
||||
"Invalid bundle id read from code object");
|
||||
}
|
||||
auto CodeObjectInfo = OffloadTargetInfo(CodeObject, BundlerConfig);
|
||||
if (getCompatibleOffloadTargets(CodeObjectInfo, CompatibleTargets,
|
||||
BundlerConfig)) {
|
||||
@ -1894,3 +1912,11 @@ Error OffloadBundler::UnbundleArchive() {
|
||||
|
||||
return Error::success();
|
||||
}
|
||||
|
||||
bool clang::checkOffloadBundleID(const llvm::StringRef Str) {
|
||||
// <kind>-<triple>[-<target id>[:target features]]
|
||||
// <triple> := <arch>-<vendor>-<os>-<env>
|
||||
SmallVector<StringRef, 6> Components;
|
||||
Str.split(Components, '-', /*MaxSplit=*/5);
|
||||
return Components.size() == 5 || Components.size() == 6;
|
||||
}
|
||||
|
||||
@ -8978,7 +8978,8 @@ void OffloadBundler::ConstructJob(Compilation &C, const JobAction &JA,
|
||||
}
|
||||
Triples += Action::GetOffloadKindName(CurKind);
|
||||
Triples += '-';
|
||||
Triples += CurTC->getTriple().normalize();
|
||||
Triples +=
|
||||
CurTC->getTriple().normalize(llvm::Triple::CanonicalForm::FOUR_IDENT);
|
||||
if ((CurKind == Action::OFK_HIP || CurKind == Action::OFK_Cuda) &&
|
||||
!StringRef(CurDep->getOffloadingArch()).empty()) {
|
||||
Triples += '-';
|
||||
@ -9072,7 +9073,8 @@ void OffloadBundler::ConstructJobMultipleOutputs(
|
||||
auto &Dep = DepInfo[I];
|
||||
Triples += Action::GetOffloadKindName(Dep.DependentOffloadKind);
|
||||
Triples += '-';
|
||||
Triples += Dep.DependentToolChain->getTriple().normalize();
|
||||
Triples += Dep.DependentToolChain->getTriple().normalize(
|
||||
llvm::Triple::CanonicalForm::FOUR_IDENT);
|
||||
if ((Dep.DependentOffloadKind == Action::OFK_HIP ||
|
||||
Dep.DependentOffloadKind == Action::OFK_Cuda) &&
|
||||
!Dep.DependentBoundArch.empty()) {
|
||||
|
||||
@ -2577,7 +2577,8 @@ static void GetSDLFromOffloadArchive(
|
||||
SmallString<128> DeviceTriple;
|
||||
DeviceTriple += Action::GetOffloadKindName(JA.getOffloadingDeviceKind());
|
||||
DeviceTriple += '-';
|
||||
std::string NormalizedTriple = T.getToolChain().getTriple().normalize();
|
||||
std::string NormalizedTriple = T.getToolChain().getTriple().normalize(
|
||||
llvm::Triple::CanonicalForm::FOUR_IDENT);
|
||||
DeviceTriple += NormalizedTriple;
|
||||
if (!Target.empty()) {
|
||||
DeviceTriple += '-';
|
||||
|
||||
@ -45,7 +45,7 @@ static std::string normalizeForBundler(const llvm::Triple &T,
|
||||
return HasTargetID ? (T.getArchName() + "-" + T.getVendorName() + "-" +
|
||||
T.getOSName() + "-" + T.getEnvironmentName())
|
||||
.str()
|
||||
: T.normalize();
|
||||
: T.normalize(llvm::Triple::CanonicalForm::FOUR_IDENT);
|
||||
}
|
||||
|
||||
// Collect undefined __hip_fatbin* and __hip_gpubin_handle* symbols from all
|
||||
|
||||
@ -15,18 +15,18 @@
|
||||
// Check code object compatibility for archive unbundling
|
||||
//
|
||||
// Create few code object bundles and archive them to create an input archive
|
||||
// RUN: clang-offload-bundler -type=o -targets=host-%itanium_abi_triple,openmp-amdgcn-amd-amdhsa-gfx906,openmp-amdgcn-amd-amdhsa--gfx908 -input=%t.o -input=%t.tgt1 -input=%t.tgt2 -output=%t.simple.bundle
|
||||
// RUN: clang-offload-bundler -type=o -targets=host-%itanium_abi_triple,openmp-amdgcn-amd-amdhsa--gfx906,openmp-amdgcn-amd-amdhsa--gfx908 -input=%t.o -input=%t.tgt1 -input=%t.tgt2 -output=%t.simple.bundle
|
||||
// RUN: clang-offload-bundler -type=o -targets=host-%itanium_abi_triple,openmp-amdgcn-amd-amdhsa--gfx906:sramecc+:xnack+,openmp-amdgcn-amd-amdhsa--gfx908:sramecc+:xnack+ -inputs=%t.o,%t.tgt1,%t.tgt1 -outputs=%t.targetID1.bundle
|
||||
// RUN: clang-offload-bundler -type=o -targets=host-%itanium_abi_triple,openmp-amdgcn-amd-amdhsa--gfx906:sramecc+:xnack-,openmp-amdgcn-amd-amdhsa--gfx908:sramecc+:xnack- -inputs=%t.o,%t.tgt1,%t.tgt1 -outputs=%t.targetID2.bundle
|
||||
// RUN: clang-offload-bundler -type=o -targets=host-%itanium_abi_triple,openmp-amdgcn-amd-amdhsa--gfx906:xnack-,openmp-amdgcn-amd-amdhsa--gfx908:xnack- -inputs=%t.o,%t.tgt1,%t.tgt1 -outputs=%t.targetID3.bundle
|
||||
// RUN: llvm-ar cr %t.input-archive.a %t.simple.bundle %t.targetID1.bundle %t.targetID2.bundle %t.targetID3.bundle
|
||||
|
||||
// Tests to check compatibility between Bundle Entry ID formats i.e. between presence/absence of extra hyphen in case of missing environment field
|
||||
// RUN: clang-offload-bundler -unbundle -type=a -targets=openmp-amdgcn-amd-amdhsa--gfx906,openmp-amdgcn-amd-amdhsa-gfx908 -input=%t.input-archive.a -output=%t-archive-gfx906-simple.a -output=%t-archive-gfx908-simple.a -debug-only=CodeObjectCompatibility 2>&1 | FileCheck %s -check-prefix=BUNDLECOMPATIBILITY
|
||||
// RUN: clang-offload-bundler -unbundle -type=a -targets=openmp-amdgcn-amd-amdhsa--gfx906,openmp-amdgcn-amd-amdhsa--gfx908 -input=%t.input-archive.a -output=%t-archive-gfx906-simple.a -output=%t-archive-gfx908-simple.a -debug-only=CodeObjectCompatibility 2>&1 | FileCheck %s -check-prefix=BUNDLECOMPATIBILITY
|
||||
// BUNDLECOMPATIBILITY: Compatible: Exact match: [CodeObject: openmp-amdgcn-amd-amdhsa--gfx906] : [Target: openmp-amdgcn-amd-amdhsa--gfx906]
|
||||
// BUNDLECOMPATIBILITY: Compatible: Exact match: [CodeObject: openmp-amdgcn-amd-amdhsa--gfx908] : [Target: openmp-amdgcn-amd-amdhsa--gfx908]
|
||||
|
||||
// RUN: clang-offload-bundler -unbundle -type=a -targets=hip-amdgcn-amd-amdhsa--gfx906,hipv4-amdgcn-amd-amdhsa-gfx908 -input=%t.input-archive.a -output=%t-hip-archive-gfx906-simple.a -output=%t-hipv4-archive-gfx908-simple.a -hip-openmp-compatible -debug-only=CodeObjectCompatibility 2>&1 | FileCheck %s -check-prefix=HIPOpenMPCOMPATIBILITY
|
||||
// RUN: clang-offload-bundler -unbundle -type=a -targets=hip-amdgcn-amd-amdhsa--gfx906,hipv4-amdgcn-amd-amdhsa--gfx908 -input=%t.input-archive.a -output=%t-hip-archive-gfx906-simple.a -output=%t-hipv4-archive-gfx908-simple.a -hip-openmp-compatible -debug-only=CodeObjectCompatibility 2>&1 | FileCheck %s -check-prefix=HIPOpenMPCOMPATIBILITY
|
||||
// HIPOpenMPCOMPATIBILITY: Compatible: Target IDs are compatible [CodeObject: openmp-amdgcn-amd-amdhsa--gfx906] : [Target: hip-amdgcn-amd-amdhsa--gfx906]
|
||||
// HIPOpenMPCOMPATIBILITY: Compatible: Target IDs are compatible [CodeObject: openmp-amdgcn-amd-amdhsa--gfx908] : [Target: hipv4-amdgcn-amd-amdhsa--gfx908]
|
||||
|
||||
|
||||
@ -15,20 +15,12 @@
|
||||
//
|
||||
// Check code object compatibility for archive unbundling
|
||||
//
|
||||
// Create an object bundle with and without env fields
|
||||
// RUN: clang-offload-bundler -type=o -targets=host-%itanium_abi_triple,hip-amdgcn-amd-amdhsa-gfx906,hip-amdgcn-amd-amdhsa-gfx908 -input=%t.o -input=%t.tgt1 -input=%t.tgt2 -output=%t.bundle.no.env
|
||||
// RUN: clang-offload-bundler -type=o -targets=host-%itanium_abi_triple-,hip-amdgcn-amd-amdhsa--gfx906,hip-amdgcn-amd-amdhsa--gfx908 -input=%t.o -input=%t.tgt1 -input=%t.tgt2 -output=%t.bundle.env
|
||||
// Create an object bundle
|
||||
// RUN: clang-offload-bundler -type=o -targets=host-%itanium_abi_triple,hip-amdgcn-amd-amdhsa--gfx906,hip-amdgcn-amd-amdhsa--gfx908 -input=%t.o -input=%t.tgt1 -input=%t.tgt2 -output=%t.bundle
|
||||
|
||||
|
||||
// Unbundle bundle.no.env while providing targets with env
|
||||
// RUN: clang-offload-bundler -unbundle -type=o -targets=hip-amdgcn-amd-amdhsa--gfx906,hip-amdgcn-amd-amdhsa--gfx908 -input=%t.bundle.no.env -output=%t-hip-amdgcn-amd-amdhsa--gfx906.bc -output=%t-hip-amdgcn-amd-amdhsa--gfx908.bc -debug-only=CodeObjectCompatibility 2>&1 | FileCheck %s -check-prefix=BUNDLE-NO-ENV
|
||||
// BUNDLE-NO-ENV: Compatible: Exact match: [CodeObject: hip-amdgcn-amd-amdhsa--gfx906] : [Target: hip-amdgcn-amd-amdhsa--gfx906]
|
||||
// BUNDLE-NO-ENV: Compatible: Exact match: [CodeObject: hip-amdgcn-amd-amdhsa--gfx908] : [Target: hip-amdgcn-amd-amdhsa--gfx908]
|
||||
|
||||
// Unbundle bundle.env while providing targets with no env
|
||||
// RUN: clang-offload-bundler -unbundle -type=o -targets=hip-amdgcn-amd-amdhsa-gfx906,hip-amdgcn-amd-amdhsa-gfx908 -input=%t.bundle.env -output=%t-hip-amdgcn-amd-amdhsa-gfx906.bc -output=%t-hip-amdgcn-amd-amdhsa-gfx908.bc -debug-only=CodeObjectCompatibility 2>&1 | FileCheck %s -check-prefix=BUNDLE-ENV
|
||||
// BUNDLE-ENV: Compatible: Exact match: [CodeObject: hip-amdgcn-amd-amdhsa--gfx906] : [Target: hip-amdgcn-amd-amdhsa--gfx906]
|
||||
// BUNDLE-ENV: Compatible: Exact match: [CodeObject: hip-amdgcn-amd-amdhsa--gfx908] : [Target: hip-amdgcn-amd-amdhsa--gfx908]
|
||||
// RUN: clang-offload-bundler -unbundle -type=o -targets=hip-amdgcn-amd-amdhsa--gfx906,hip-amdgcn-amd-amdhsa--gfx908 -input=%t.bundle -output=%t-hip-amdgcn-amd-amdhsa--gfx906.bc -output=%t-hip-amdgcn-amd-amdhsa--gfx908.bc -debug-only=CodeObjectCompatibility 2>&1 | FileCheck %s -check-prefix=BUNDLE
|
||||
// BUNDLE: Compatible: Exact match: [CodeObject: hip-amdgcn-amd-amdhsa--gfx906] : [Target: hip-amdgcn-amd-amdhsa--gfx906]
|
||||
// BUNDLE: Compatible: Exact match: [CodeObject: hip-amdgcn-amd-amdhsa--gfx908] : [Target: hip-amdgcn-amd-amdhsa--gfx908]
|
||||
|
||||
// Some code so that we can create a binary out of this file.
|
||||
int A = 0;
|
||||
|
||||
@ -116,7 +116,7 @@
|
||||
// RUN: not clang-offload-bundler -type=i -targets=host-powerpc64le-ibm-linux-gnu,openmp-powerpc64le-ibm-linux-gnu,xpenmp-x86_xx-pc-linux-gnu -input=%t.i -input=%t.tgt1 -input=%t.tgt2 -output=%t.bundle.i 2>&1 | FileCheck %s --check-prefix CK-ERR8B
|
||||
// CK-ERR8B: error: invalid target 'xpenmp-x86_xx-pc-linux-gnu', unknown offloading kind 'xpenmp', unknown target triple 'x86_xx-pc-linux-gnu'
|
||||
|
||||
// RUN: not clang-offload-bundler -type=i -targets=openmp-powerpc64le-linux,openmp-powerpc64le-ibm-linux-gnu,openmp-x86_64-pc-linux-gnu -input=%t.i -input=%t.tgt1 -input=%t.tgt2 -output=%t.bundle.i 2>&1 | FileCheck %s --check-prefix CK-ERR9A
|
||||
// RUN: not clang-offload-bundler -type=i -targets=openmp-powerpc64le-ibm-linux-gnu,openmp-x86_64-pc-linux-gnu -input=%t.i -input=%t.tgt1 -output=%t.bundle.i 2>&1 | FileCheck %s --check-prefix CK-ERR9A
|
||||
// CK-ERR9A: error: expecting exactly one host target but got 0
|
||||
|
||||
// RUN: not clang-offload-bundler -type=i -targets=host-%itanium_abi_triple,host-%itanium_abi_triple,openmp-x86_64-pc-linux-gnu -input=%t.i -input=%t.tgt1 -input=%t.tgt2 -output=%t.bundle.i 2>&1 | FileCheck %s --check-prefix CK-ERR9B
|
||||
@ -238,7 +238,7 @@
|
||||
|
||||
// Check that bindler prints an error if given host bundle does not exist in the fat binary.
|
||||
// RUN: not clang-offload-bundler -type=s -targets=host-amdgcn-xxx-linux-gnu,openmp-powerpc64le-ibm-linux-gnu -output=%t.res.s -output=%t.res.tgt1 -input=%t.bundle3.s -unbundle 2>&1 | FileCheck %s --check-prefix CK-NO-HOST-BUNDLE
|
||||
// CK-NO-HOST-BUNDLE: error: Can't find bundles for host-amdgcn-xxx-linux-gnu
|
||||
// CK-NO-HOST-BUNDLE: error: Can't find bundles for host-amdgcn-xxx-linux-
|
||||
|
||||
// Check missing host entry is allowed with -allow-missing-bundles
|
||||
// RUN: clang-offload-bundler -type=s -targets=host-amdgcn-xxx-linux-gnu,openmp-powerpc64le-ibm-linux-gnu -output=%t.res.s -output=%t.res.tgt1 -input=%t.bundle3.s -unbundle -allow-missing-bundles
|
||||
@ -520,32 +520,32 @@
|
||||
// Check archive unbundling
|
||||
//
|
||||
// Create few code object bundles and archive them to create an input archive
|
||||
// RUN: clang-offload-bundler -type=o -targets=host-%itanium_abi_triple,openmp-amdgcn-amd-amdhsa-gfx906,openmp-amdgcn-amd-amdhsa--gfx908 -input=%t.o -input=%t.tgt1 -input=%t.tgt2 -output=%t.simple.bundle
|
||||
// RUN: clang-offload-bundler -type=o -targets=host-%itanium_abi_triple,openmp-amdgcn-amd-amdhsa--gfx906,openmp-amdgcn-amd-amdhsa--gfx908 -input=%t.o -input=%t.tgt1 -input=%t.tgt2 -output=%t.simple.bundle
|
||||
// RUN: clang-offload-bundler -type=o -targets=host-%itanium_abi_triple,openmp-amdgcn-amd-amdhsa--gfx903 -input=%t.o -input=%t.tgt1 -output=%t.simple1.bundle
|
||||
// RUN: clang-offload-bundler -type=o -targets=host-%itanium_abi_triple,hip-amdgcn-amd-amdhsa--gfx906 -input=%t.o -input=%t.tgt1 -output=%t.simple2.bundle
|
||||
// RUN: llvm-ar cr %t.input-archive.a %t.simple.bundle %t.simple1.bundle %t.simple2.bundle
|
||||
|
||||
// RUN: clang-offload-bundler -unbundle -type=a -targets=openmp-amdgcn-amd-amdhsa-gfx906,openmp-amdgcn-amd-amdhsa-gfx908 -input=%t.input-archive.a -output=%t-archive-gfx906-simple.a -output=%t-archive-gfx908-simple.a
|
||||
// RUN: clang-offload-bundler -unbundle -type=a -targets=openmp-amdgcn-amd-amdhsa--gfx906,openmp-amdgcn-amd-amdhsa--gfx908 -input=%t.input-archive.a -output=%t-archive-gfx906-simple.a -output=%t-archive-gfx908-simple.a
|
||||
// RUN: llvm-ar t %t-archive-gfx906-simple.a | FileCheck %s -check-prefix=GFX906
|
||||
// RUN: clang-offload-bundler -unbundle -type=a -targets=openmp-amdgcn-amd-amdhsa-gfx906:xnack+ -input=%t.input-archive.a -output=%t-archive-gfx906-simple.a
|
||||
// RUN: clang-offload-bundler -unbundle -type=a -targets=openmp-amdgcn-amd-amdhsa--gfx906:xnack+ -input=%t.input-archive.a -output=%t-archive-gfx906-simple.a
|
||||
// RUN: llvm-ar t %t-archive-gfx906-simple.a | FileCheck %s -check-prefix=GFX906
|
||||
// GFX906: simple-openmp-amdgcn-amd-amdhsa--gfx906
|
||||
// RUN: llvm-ar t %t-archive-gfx908-simple.a | FileCheck %s -check-prefix=GFX908
|
||||
// GFX908-NOT: {{gfx906}}
|
||||
// RUN: not clang-offload-bundler -type=o -targets=host-%itanium_abi_triple,openmp-amdgcn-amd-amdhsa-gfx906,openmp-amdgcn-amd-amdhsa-gfx906:sramecc+ -input=%t.o -input=%t.tgt1 -input=%t.tgt2 -output=%t.bad.bundle 2>&1 | FileCheck %s -check-prefix=BADTARGETS
|
||||
// RUN: not clang-offload-bundler -type=o -targets=host-%itanium_abi_triple,openmp-amdgcn-amd-amdhsa--gfx906,openmp-amdgcn-amd-amdhsa--gfx906:sramecc+ -input=%t.o -input=%t.tgt1 -input=%t.tgt2 -output=%t.bad.bundle 2>&1 | FileCheck %s -check-prefix=BADTARGETS
|
||||
// BADTARGETS: error: Cannot bundle inputs with conflicting targets: 'openmp-amdgcn-amd-amdhsa--gfx906' and 'openmp-amdgcn-amd-amdhsa--gfx906:sramecc+'
|
||||
|
||||
// Check for error if no compatible code object is found in the heterogeneous archive library
|
||||
// RUN: not clang-offload-bundler -unbundle -type=a -targets=openmp-amdgcn-amd-amdhsa-gfx803 -input=%t.input-archive.a -output=%t-archive-gfx803-incompatible.a 2>&1 | FileCheck %s -check-prefix=INCOMPATIBLEARCHIVE
|
||||
// RUN: not clang-offload-bundler -unbundle -type=a -targets=openmp-amdgcn-amd-amdhsa--gfx803 -input=%t.input-archive.a -output=%t-archive-gfx803-incompatible.a 2>&1 | FileCheck %s -check-prefix=INCOMPATIBLEARCHIVE
|
||||
// INCOMPATIBLEARCHIVE: error: no compatible code object found for the target 'openmp-amdgcn-amd-amdhsa--gfx803' in heterogeneous archive library
|
||||
|
||||
// Check creation of empty archive if allow-missing-bundles is present and no compatible code object is found in the heterogeneous archive library
|
||||
// RUN: clang-offload-bundler -unbundle -type=a -targets=openmp-amdgcn-amd-amdhsa-gfx803 -input=%t.input-archive.a -output=%t-archive-gfx803-empty.a -allow-missing-bundles
|
||||
// RUN: clang-offload-bundler -unbundle -type=a -targets=openmp-amdgcn-amd-amdhsa--gfx803 -input=%t.input-archive.a -output=%t-archive-gfx803-empty.a -allow-missing-bundles
|
||||
// RUN: cat %t-archive-gfx803-empty.a | FileCheck %s -check-prefix=EMPTYARCHIVE
|
||||
// EMPTYARCHIVE: !<arch>
|
||||
|
||||
// Check compatibility of OpenMP code objects found in the heterogeneous archive library with HIP code objects of the target
|
||||
// RUN: clang-offload-bundler -unbundle -type=a -targets=hip-amdgcn-amd-amdhsa-gfx906,hipv4-amdgcn-amd-amdhsa-gfx908 -input=%t.input-archive.a -output=%t-hip-archive-gfx906-simple.a -output=%t-hipv4-archive-gfx908-simple.a -hip-openmp-compatible
|
||||
// RUN: clang-offload-bundler -unbundle -type=a -targets=hip-amdgcn-amd-amdhsa--gfx906,hipv4-amdgcn-amd-amdhsa--gfx908 -input=%t.input-archive.a -output=%t-hip-archive-gfx906-simple.a -output=%t-hipv4-archive-gfx908-simple.a -hip-openmp-compatible
|
||||
// RUN: llvm-ar t %t-hip-archive-gfx906-simple.a | FileCheck %s -check-prefix=HIPOPENMPCOMPAT
|
||||
// HIPOPENMPCOMPAT: simple-openmp-amdgcn-amd-amdhsa--gfx906
|
||||
// RUN: llvm-ar t %t-hipv4-archive-gfx908-simple.a | FileCheck %s -check-prefix=HIPv4OPENMPCOMPAT
|
||||
@ -557,6 +557,12 @@
|
||||
// RUN: llvm-ar t %T/hip-openmp_906.a | FileCheck -check-prefix=OPENMPHIPCOMPAT %s
|
||||
// OPENMPHIPCOMPAT: hip_bundle1-hip-amdgcn-amd-amdhsa--gfx906
|
||||
|
||||
// Check if a malformat bundle id can be detected and an error can be emitted.
|
||||
// RUN: not clang-offload-bundler -unbundle -type=a -targets=openmp-amdgcn-amd-amdhsa -output=%T/hip-openmp_906.a -input=%T/hip_archive.a -hip-openmp-compatible 2>&1 | FileCheck %s -check-prefix=ERROR-WRONG-FORMAT
|
||||
// ERROR-WRONG-FORMAT: error: Targets need to follow the format '<offload kind>-<target triple>', where '<target triple>' follows the format '<kind>-<arch>-<vendor>-<os>-<env>[-<target id>[:target features]]'.
|
||||
// RUN: not clang-offload-bundler -unbundle -type=a -targets=openmp-amdgcn-amd-amdhsa-gfx906 -output=%T/hip-openmp_906.a -input=%T/hip_archive.a -hip-openmp-compatible 2>&1 | FileCheck %s -check-prefix=ERROR-NO-ENV
|
||||
// ERROR-NO-ENV: error: no compatible code object found for the target 'openmp-amdgcn-amd-amdhsa--'
|
||||
|
||||
// Some code so that we can create a binary out of this file.
|
||||
int A = 0;
|
||||
void test_func(void) {
|
||||
|
||||
@ -8,10 +8,10 @@
|
||||
// RUN: --no-offload-new-driver %t/bundle1.bc %t/bundle2.bc \
|
||||
// RUN: 2>&1 | FileCheck -check-prefix=BITCODE %s
|
||||
|
||||
// BITCODE: "{{.*}}clang-offload-bundler" "-type=bc" "-targets=host-x86_64-unknown-linux-gnu,hip-amdgcn-amd-amdhsa-gfx906" "-input={{.*}}bundle1.bc" "-output=[[B1HOST:.*\.bc]]" "-output=[[B1DEV1:.*\.bc]]" "-unbundle" "-allow-missing-bundles"
|
||||
// BITCODE: "{{.*}}clang-offload-bundler" "-type=bc" "-targets=host-x86_64-unknown-linux-gnu,hip-amdgcn-amd-amdhsa-unknown-gfx906" "-input={{.*}}bundle1.bc" "-output=[[B1HOST:.*\.bc]]" "-output=[[B1DEV1:.*\.bc]]" "-unbundle" "-allow-missing-bundles"
|
||||
// BITCODE: "{{.*}}clang{{.*}}" "-o" "[[B1DEV2:.*bundle1-gfx906-.*\.bc]]" "-x" "ir" "[[B1DEV1]]"
|
||||
|
||||
// BITCODE: "{{.*}}clang-offload-bundler" "-type=bc" "-targets=host-x86_64-unknown-linux-gnu,hip-amdgcn-amd-amdhsa-gfx906" "-input={{.*}}bundle2.bc" "-output=[[B2HOST:.*\.bc]]" "-output=[[B2DEV1:.*\.bc]]" "-unbundle" "-allow-missing-bundles"
|
||||
// BITCODE: "{{.*}}clang-offload-bundler" "-type=bc" "-targets=host-x86_64-unknown-linux-gnu,hip-amdgcn-amd-amdhsa-unknown-gfx906" "-input={{.*}}bundle2.bc" "-output=[[B2HOST:.*\.bc]]" "-output=[[B2DEV1:.*\.bc]]" "-unbundle" "-allow-missing-bundles"
|
||||
// BITCODE: "{{.*}}clang{{.*}}" "-o" "[[B2DEV2:.*bundle2-gfx906-.*\.bc]]" "-x" "ir" "[[B2DEV1]]"
|
||||
|
||||
// BITCODE: "{{.*}}llvm-link" "-o" "bundle1-hip-amdgcn-amd-amdhsa-gfx906.bc" "[[B1DEV2]]" "[[B2DEV2]]"
|
||||
@ -25,9 +25,9 @@
|
||||
// RUN: --no-offload-new-driver %t/bundle.bc -L%t -lhipbundle \
|
||||
// RUN: 2>&1 | FileCheck -check-prefix=ARCHIVE %s
|
||||
|
||||
// ARCHIVE: "{{.*}}clang-offload-bundler" "-type=bc" "-targets=host-x86_64-unknown-linux-gnu,hip-amdgcn-amd-amdhsa-gfx906" "-input={{.*}}bundle.bc" "-output=[[HOST:.*\.bc]]" "-output=[[DEV1:.*\.bc]]" "-unbundle" "-allow-missing-bundles"
|
||||
// ARCHIVE: "{{.*}}clang-offload-bundler" "-type=bc" "-targets=host-x86_64-unknown-linux-gnu,hip-amdgcn-amd-amdhsa-unknown-gfx906" "-input={{.*}}bundle.bc" "-output=[[HOST:.*\.bc]]" "-output=[[DEV1:.*\.bc]]" "-unbundle" "-allow-missing-bundles"
|
||||
// ARCHIVE: "{{.*}}clang{{.*}}" "-o" "[[DEV2:.*\.bc]]" "-x" "ir" "[[DEV1]]"
|
||||
|
||||
// ARCHIVE: "{{.*}}clang-offload-bundler" "-unbundle" "-type=a" "-input={{.*}}libhipbundle.a" "-targets=hip-amdgcn-amd-amdhsa-gfx906" "-output=[[AR:.*\.a]]" "-allow-missing-bundles" "-hip-openmp-compatible"
|
||||
// ARCHIVE: "{{.*}}clang-offload-bundler" "-unbundle" "-type=a" "-input={{.*}}libhipbundle.a" "-targets=hip-amdgcn-amd-amdhsa-unknown-gfx906" "-output=[[AR:.*\.a]]" "-allow-missing-bundles" "-hip-openmp-compatible"
|
||||
|
||||
// ARCHIVE: "{{.*}}llvm-link" "-o" "bundle-hip-amdgcn-amd-amdhsa-gfx906.bc" "[[DEV2]]" "[[AR]]"
|
||||
|
||||
@ -68,10 +68,10 @@
|
||||
// RUN: -nogpuinc -nogpulib %s -fgpu-rdc %t/hipBundled2.lib \
|
||||
// RUN: 2>&1 | FileCheck -check-prefix=MSVC %s
|
||||
|
||||
// GNU1: "{{.*}}clang-offload-bundler" "-unbundle" "-type=a" "-input={{.*}}[[LIB:libhipBundled\.a]]" "-targets=hip-amdgcn-amd-amdhsa-gfx1030" "-output=[[A1030:.*\.a]]" "-allow-missing-bundles"
|
||||
// GNU2: "{{.*}}clang-offload-bundler" "-unbundle" "-type=a" "-input={{.*}}[[LIB:libhipBundled\.a\.5\.2]]" "-targets=hip-amdgcn-amd-amdhsa-gfx1030" "-output=[[A1030:.*\.a]]" "-allow-missing-bundles"
|
||||
// GNU1: "{{.*}}clang-offload-bundler" "-unbundle" "-type=a" "-input={{.*}}[[LIB:libhipBundled\.a]]" "-targets=hip-amdgcn-amd-amdhsa-unknown-gfx1030" "-output=[[A1030:.*\.a]]" "-allow-missing-bundles"
|
||||
// GNU2: "{{.*}}clang-offload-bundler" "-unbundle" "-type=a" "-input={{.*}}[[LIB:libhipBundled\.a\.5\.2]]" "-targets=hip-amdgcn-amd-amdhsa-unknown-gfx1030" "-output=[[A1030:.*\.a]]" "-allow-missing-bundles"
|
||||
// GNU: "{{.*}}lld{{.*}}" {{.*}}"-plugin-opt=mcpu=gfx1030" {{.*}} "[[A1030]]"
|
||||
// GNU: "{{.*}}clang-offload-bundler" "-unbundle" "-type=a" "-input={{.*}}[[LIB]]" "-targets=hip-amdgcn-amd-amdhsa-gfx906" "-output=[[A906:.*\.a]]" "-allow-missing-bundles"
|
||||
// GNU: "{{.*}}clang-offload-bundler" "-unbundle" "-type=a" "-input={{.*}}[[LIB]]" "-targets=hip-amdgcn-amd-amdhsa-unknown-gfx906" "-output=[[A906:.*\.a]]" "-allow-missing-bundles"
|
||||
// GNU: "{{.*}}lld{{.*}}" {{.*}}"-plugin-opt=mcpu=gfx906" {{.*}} "[[A906]]"
|
||||
// GNU-L: "{{.*}}ld{{.*}}" {{.*}}"-o" "a.out" {{.*}}"-lhipBundled"
|
||||
// GNU-LA: "{{.*}}ld{{.*}}" {{.*}}"-o" "a.out" {{.*}}"-l:libhipBundled.a"
|
||||
@ -79,8 +79,8 @@
|
||||
// NONARCHIVE-NOT: "{{.*}}clang-offload-bundler" "-unbundle" "-type=a" "-input={{.*libNonArchive\.a}}"
|
||||
// NONE-NOT: "{{.*}}clang-offload-bundler" "-unbundle" "-type=a" "-input={{.*NoneExist\.a}}"
|
||||
|
||||
// MSVC: "{{.*}}clang-offload-bundler" "-unbundle" "-type=a" "-input={{.*}}hipBundled2.lib" "-targets=hip-amdgcn-amd-amdhsa-gfx1030" "-output=[[A1030:.*\.a]]" "-allow-missing-bundles"
|
||||
// MSVC: "{{.*}}clang-offload-bundler" "-unbundle" "-type=a" "-input={{.*}}hipBundled2.lib" "-targets=hip-amdgcn-amd-amdhsa-unknown-gfx1030" "-output=[[A1030:.*\.a]]" "-allow-missing-bundles"
|
||||
// MSVC: "{{.*}}lld{{.*}}" {{.*}}"-plugin-opt=mcpu=gfx1030" {{.*}} "[[A1030]]"
|
||||
// MSVC: "{{.*}}clang-offload-bundler" "-unbundle" "-type=a" "-input={{.*}}hipBundled2.lib" "-targets=hip-amdgcn-amd-amdhsa-gfx906" "-output=[[A906:.*\.a]]" "-allow-missing-bundles"
|
||||
// MSVC: "{{.*}}clang-offload-bundler" "-unbundle" "-type=a" "-input={{.*}}hipBundled2.lib" "-targets=hip-amdgcn-amd-amdhsa-unknown-gfx906" "-output=[[A906:.*\.a]]" "-allow-missing-bundles"
|
||||
// MSVC: "{{.*}}lld{{.*}}" {{.*}}"-plugin-opt=mcpu=gfx906" {{.*}} "[[A906]]"
|
||||
// MSVC: "{{.*}}link{{.*}}" {{.*}}"-out:a.exe" {{.*}}hipBundled2.lib"
|
||||
|
||||
@ -13,7 +13,7 @@
|
||||
// RUN: 2>&1 | FileCheck %s
|
||||
|
||||
// CHECK: clang-offload-bundler{{.*}} -type=bc
|
||||
// CHECK-SAME: -targets={{.*}}hip-amdgcn-amd-amdhsa-gfx1100,hip-amdgcn-amd-amdhsa-gfx1101
|
||||
// CHECK-SAME: -targets={{.*}}hip-amdgcn-amd-amdhsa-unknown-gfx1100,hip-amdgcn-amd-amdhsa-unknown-gfx1101
|
||||
// CHECK-SAME: -compress -verbose -compression-level=9
|
||||
// CHECK: Compressed bundle format
|
||||
|
||||
@ -26,7 +26,7 @@
|
||||
// RUN: 2>&1 | FileCheck -check-prefix=UNBUNDLE %s
|
||||
|
||||
// UNBUNDLE: clang-offload-bundler{{.*}} "-type=bc"
|
||||
// UNBUNDLE-SAME: -targets={{.*}}hip-amdgcn-amd-amdhsa-gfx1100,hip-amdgcn-amd-amdhsa-gfx1101
|
||||
// UNBUNDLE-SAME: -targets={{.*}}hip-amdgcn-amd-amdhsa-unknown-gfx1100,hip-amdgcn-amd-amdhsa-unknown-gfx1101
|
||||
// UNBUNDLE-SAME: -unbundle
|
||||
// UNBUNDLE-SAME: -verbose
|
||||
|
||||
|
||||
@ -13,7 +13,7 @@
|
||||
// RUN: 2>&1 | FileCheck %s
|
||||
|
||||
// CHECK: clang-offload-bundler{{.*}} -type=bc
|
||||
// CHECK-SAME: -targets={{.*}}hip-amdgcn-amd-amdhsa-gfx1100,hip-amdgcn-amd-amdhsa-gfx1101
|
||||
// CHECK-SAME: -targets={{.*}}hip-amdgcn-amd-amdhsa-unknown-gfx1100,hip-amdgcn-amd-amdhsa-unknown-gfx1101
|
||||
// CHECK-SAME: -compress -verbose -compression-level=9
|
||||
// CHECK: Compressed bundle format
|
||||
|
||||
@ -26,7 +26,7 @@
|
||||
// RUN: 2>&1 | FileCheck -check-prefix=UNBUNDLE %s
|
||||
|
||||
// UNBUNDLE: clang-offload-bundler{{.*}} "-type=bc"
|
||||
// UNBUNDLE-SAME: -targets={{.*}}hip-amdgcn-amd-amdhsa-gfx1100,hip-amdgcn-amd-amdhsa-gfx1101
|
||||
// UNBUNDLE-SAME: -targets={{.*}}hip-amdgcn-amd-amdhsa-unknown-gfx1100,hip-amdgcn-amd-amdhsa-unknown-gfx1101
|
||||
// UNBUNDLE-SAME: -unbundle
|
||||
// UNBUNDLE-SAME: -verbose
|
||||
|
||||
|
||||
@ -88,7 +88,7 @@
|
||||
// COMMON-SAME: {{.*}} {{".*a.cu"}}
|
||||
|
||||
// COMMON: "{{.*}}clang-offload-bundler" "-type={{(bc|ll)}}"
|
||||
// COMMON-SAME: "-targets=hip-amdgcn-amd-amdhsa-gfx803,hip-amdgcn-amd-amdhsa-gfx900"
|
||||
// COMMON-SAME: "-targets=hip-amdgcn-amd-amdhsa-unknown-gfx803,hip-amdgcn-amd-amdhsa-unknown-gfx900"
|
||||
// COMMON-SAME: "-output=a-hip-amdgcn-amd-amdhsa.{{(bc|ll)}}"
|
||||
|
||||
// COMMON: [[CLANG]] "-cc1" "-triple" "amdgcn-amd-amdhsa"
|
||||
@ -118,7 +118,7 @@
|
||||
// COMMON-SAME: {{.*}} {{".*b.hip"}}
|
||||
|
||||
// COMMON: "{{.*}}clang-offload-bundler" "-type={{(bc|ll)}}"
|
||||
// COMMON-SAME: "-targets=hip-amdgcn-amd-amdhsa-gfx803,hip-amdgcn-amd-amdhsa-gfx900"
|
||||
// COMMON-SAME: "-targets=hip-amdgcn-amd-amdhsa-unknown-gfx803,hip-amdgcn-amd-amdhsa-unknown-gfx900"
|
||||
// COMMON-SAME: "-output=b-hip-amdgcn-amd-amdhsa.{{(bc|ll)}}"
|
||||
|
||||
// SAVETEMP: [[CLANG:".*clang.*"]] "-cc1" "-triple" "amdgcn-amd-amdhsa" "-aux-triple" "x86_64-unknown-linux-gnu"
|
||||
@ -148,7 +148,7 @@
|
||||
// SAVETEMP-SAME: {{.*}} "-o" {{"a.*.ll"}} "-x" "ir" [[A_GFX900_TMP_BC]]
|
||||
|
||||
// SAVETEMP: "{{.*}}clang-offload-bundler" "-type=ll"
|
||||
// SAVETEMP-SAME: "-targets=hip-amdgcn-amd-amdhsa-gfx803,hip-amdgcn-amd-amdhsa-gfx900"
|
||||
// SAVETEMP-SAME: "-targets=hip-amdgcn-amd-amdhsa-unknown-gfx803,hip-amdgcn-amd-amdhsa-unknown-gfx900"
|
||||
// SAVETEMP-SAME: "-output=a-hip-amdgcn-amd-amdhsa.ll"
|
||||
|
||||
// SAVETEMP: [[CLANG]] "-cc1" "-triple" "amdgcn-amd-amdhsa" "-aux-triple" "x86_64-unknown-linux-gnu"
|
||||
@ -178,7 +178,7 @@
|
||||
// SAVETEMP-SAME: {{.*}} "-o" {{"b.*.ll"}} "-x" "ir" [[B_GFX900_TMP_BC]]
|
||||
|
||||
// SAVETEMP: "{{.*}}clang-offload-bundler" "-type=ll"
|
||||
// SAVETEMP-SAME: "-targets=hip-amdgcn-amd-amdhsa-gfx803,hip-amdgcn-amd-amdhsa-gfx900"
|
||||
// SAVETEMP-SAME: "-targets=hip-amdgcn-amd-amdhsa-unknown-gfx803,hip-amdgcn-amd-amdhsa-unknown-gfx900"
|
||||
// SAVETEMP-SAME: "-output=b-hip-amdgcn-amd-amdhsa.ll"
|
||||
|
||||
// FAIL: error: cannot specify -o when generating multiple output files
|
||||
|
||||
@ -41,7 +41,7 @@
|
||||
// CHECK-SAME: {{.*}} [[A_SRC]]
|
||||
|
||||
// CHECK: [[BUNDLER:".*clang-offload-bundler"]] "-type=o"
|
||||
// CHECK-SAME: "-targets=hip-amdgcn-amd-amdhsa-gfx803,hip-amdgcn-amd-amdhsa-gfx900,host-x86_64-unknown-linux-gnu"
|
||||
// CHECK-SAME: "-targets=hip-amdgcn-amd-amdhsa-unknown-gfx803,hip-amdgcn-amd-amdhsa-unknown-gfx900,host-x86_64-unknown-linux-gnu"
|
||||
// CHECK-SAME: "-output=[[A_O:.*a.o]]" "-input=[[A_BC1]]" "-input=[[A_BC2]]" "-input=[[A_OBJ_HOST]]"
|
||||
|
||||
// CHECK: [[CLANG]] "-cc1" "-triple" "amdgcn-amd-amdhsa"
|
||||
@ -76,7 +76,7 @@
|
||||
// CHECK-SAME: {{.*}} [[B_SRC]]
|
||||
|
||||
// CHECK: [[BUNDLER:".*clang-offload-bundler"]] "-type=o"
|
||||
// CHECK-SAME: "-targets=hip-amdgcn-amd-amdhsa-gfx803,hip-amdgcn-amd-amdhsa-gfx900,host-x86_64-unknown-linux-gnu"
|
||||
// CHECK-SAME: "-targets=hip-amdgcn-amd-amdhsa-unknown-gfx803,hip-amdgcn-amd-amdhsa-unknown-gfx900,host-x86_64-unknown-linux-gnu"
|
||||
// CHECK-SAME: "-output=[[B_O:.*b.o]]" "-input=[[B_BC1]]" "-input=[[B_BC2]]" "-input=[[B_OBJ_HOST]]"
|
||||
|
||||
// RUN: touch %t/a.o %t/b.o
|
||||
@ -99,22 +99,22 @@
|
||||
// RUN: 2>&1 | FileCheck -check-prefixes=LINK,LLD-FIN,LINK-NOBUNDLE,LINK-NOEMBED %s
|
||||
|
||||
// LINK-HOST-UNBUNDLE: [[BUNDLER:".*clang-offload-bundler"]] "-type=o"
|
||||
// LINK-HOST-UNBUNDLE-SAME: "-targets=host-x86_64-unknown-linux-gnu,hip-amdgcn-amd-amdhsa-gfx803,hip-amdgcn-amd-amdhsa-gfx900"
|
||||
// LINK-HOST-UNBUNDLE-SAME: "-targets=host-x86_64-unknown-linux-gnu,hip-amdgcn-amd-amdhsa-unknown-gfx803,hip-amdgcn-amd-amdhsa-unknown-gfx900"
|
||||
// LINK-HOST-UNBUNDLE-SAME: "-input=[[A_O:.*a.o]]" "-output=[[A_OBJ_HOST:.*o]]" "-output={{.*o}}" "-output={{.*o}}"
|
||||
// LINK-HOST-UNBUNDLE: "-unbundle" "-allow-missing-bundles"
|
||||
|
||||
// LINK-HOST-UNBUNDLE: [[BUNDLER:".*clang-offload-bundler"]] "-type=o"
|
||||
// LINK-HOST-UNBUNDLE-SAME: "-targets=host-x86_64-unknown-linux-gnu,hip-amdgcn-amd-amdhsa-gfx803,hip-amdgcn-amd-amdhsa-gfx900"
|
||||
// LINK-HOST-UNBUNDLE-SAME: "-targets=host-x86_64-unknown-linux-gnu,hip-amdgcn-amd-amdhsa-unknown-gfx803,hip-amdgcn-amd-amdhsa-unknown-gfx900"
|
||||
// LINK-HOST-UNBUNDLE-SAME: "-input=[[B_O:.*b.o]]" "-output=[[B_OBJ_HOST:.*o]]" "-output={{.*o}}" "-output={{.*o}}"
|
||||
// LINK-HOST-UNBUNDLE: "-unbundle" "-allow-missing-bundles"
|
||||
|
||||
// LINK: [[BUNDLER:".*clang-offload-bundler"]] "-type=o"
|
||||
// LINK-SAME: "-targets=host-x86_64-unknown-linux-gnu,hip-amdgcn-amd-amdhsa-gfx803,hip-amdgcn-amd-amdhsa-gfx900"
|
||||
// LINK-SAME: "-targets=host-x86_64-unknown-linux-gnu,hip-amdgcn-amd-amdhsa-unknown-gfx803,hip-amdgcn-amd-amdhsa-unknown-gfx900"
|
||||
// LINK-SAME: "-input=[[A_O:.*a.o]]" "-output={{.*o}}" "-output=[[A_BC1:.*o]]" "-output=[[A_BC2:.*o]]"
|
||||
// LINK-SAME: "-unbundle" "-allow-missing-bundles"
|
||||
|
||||
// LINK: [[BUNDLER:".*clang-offload-bundler"]] "-type=o"
|
||||
// LINK-SAME: "-targets=host-x86_64-unknown-linux-gnu,hip-amdgcn-amd-amdhsa-gfx803,hip-amdgcn-amd-amdhsa-gfx900"
|
||||
// LINK-SAME: "-targets=host-x86_64-unknown-linux-gnu,hip-amdgcn-amd-amdhsa-unknown-gfx803,hip-amdgcn-amd-amdhsa-unknown-gfx900"
|
||||
// LINK-SAME: "-input=[[B_O:.*b.o]]" "-output={{.*o}}" "-output=[[B_BC1:.*o]]" "-output=[[B_BC2:.*o]]"
|
||||
// LINK-SAME: "-unbundle" "-allow-missing-bundles"
|
||||
|
||||
|
||||
@ -355,6 +355,15 @@ int main(int argc, const char **argv) {
|
||||
errc::invalid_argument, "Duplicate targets are not allowed"));
|
||||
}
|
||||
|
||||
if (!checkOffloadBundleID(Target)) {
|
||||
return reportError(createStringError(
|
||||
errc::invalid_argument,
|
||||
"Targets need to follow the format '<offload kind>-<target triple>', "
|
||||
"where '<target triple>' follows the format "
|
||||
"'<kind>-<arch>-<vendor>-<os>-<env>[-<target id>[:target "
|
||||
"features]]'."));
|
||||
}
|
||||
|
||||
auto OffloadInfo = OffloadTargetInfo(Target, BundlerConfig);
|
||||
bool KindIsValid = OffloadInfo.isOffloadKindValid();
|
||||
bool TripleIsValid = OffloadInfo.isTripleValid();
|
||||
|
||||
@ -355,6 +355,14 @@ class LLVMConfig(object):
|
||||
|
||||
return False
|
||||
|
||||
# Normalize 3-field target triple to 4-field triple with "unknown" as environment
|
||||
def normalize_triple(self, triple):
|
||||
compoments = triple.split("-", maxsplit=3)
|
||||
if len(compoments) == 4:
|
||||
return triple
|
||||
assert len(compoments) == 3
|
||||
return triple + "-unknown"
|
||||
|
||||
def make_itanium_abi_triple(self, triple):
|
||||
m = re.match(r"(\w+)-(\w+)-(\w+)", triple)
|
||||
if not m:
|
||||
@ -665,7 +673,9 @@ class LLVMConfig(object):
|
||||
self.config.substitutions.append(
|
||||
(
|
||||
"%itanium_abi_triple",
|
||||
self.make_itanium_abi_triple(self.config.target_triple),
|
||||
self.normalize_triple(
|
||||
self.make_itanium_abi_triple(self.config.target_triple)
|
||||
),
|
||||
)
|
||||
)
|
||||
self.config.substitutions.append(
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user