mirror of
https://github.com/intel/llvm.git
synced 2026-01-26 03:56:16 +08:00
[clang-offload-bundler] Standardize TargetID field for bundler
The bundler accepts both of the following for the --target option: hip-amdgcn-amd-amdhsa-gfx900 (no env field) hip-amdgcn-amd-amdhsa--gfx900 (blank env field) The environment field is defined as optional for Triples in Triple.h. However, in this patch we update the bundler to internally standardize to include the env field. While users aren't required to specify an env field when listing targets on the commandline, bundles generated by the offload-bundler will include the ABI field. This standardization simplifies things for APIs that deal with bundles generated by the clang-offload-bundler tool. Differential Revision: https://reviews.llvm.org/D145770
This commit is contained in:
@@ -174,7 +174,20 @@ Where:
|
||||
============= ==============================================================
|
||||
|
||||
**target-triple**
|
||||
The target triple of the code object.
|
||||
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:
|
||||
|
||||
``<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:
|
||||
|
||||
``<arch><sub>-<vendor>-<sys>-<env>``
|
||||
|
||||
**target-id**
|
||||
The canonical target ID of the code object. Present only if the target
|
||||
|
||||
@@ -72,12 +72,22 @@ OffloadTargetInfo::OffloadTargetInfo(const StringRef Target,
|
||||
if (clang::StringToCudaArch(TripleOrGPU.second) != clang::CudaArch::UNKNOWN) {
|
||||
auto KindTriple = TripleOrGPU.first.split('-');
|
||||
this->OffloadKind = KindTriple.first;
|
||||
this->Triple = llvm::Triple(KindTriple.second);
|
||||
|
||||
// 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;
|
||||
this->Triple = llvm::Triple(KindTriple.second);
|
||||
|
||||
// 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 = "";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,12 +21,12 @@
|
||||
|
||||
// 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
|
||||
// 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]
|
||||
// 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
|
||||
// HIPOpenMPCOMPATIBILITY: Compatible: Code Objects are compatible [CodeObject: openmp-amdgcn-amd-amdhsa-gfx906] : [Target: hip-amdgcn-amd-amdhsa--gfx906]
|
||||
// HIPOpenMPCOMPATIBILITY: Compatible: Code Objects are compatible [CodeObject: openmp-amdgcn-amd-amdhsa--gfx908] : [Target: hipv4-amdgcn-amd-amdhsa-gfx908]
|
||||
// HIPOpenMPCOMPATIBILITY: Compatible: Code Objects are compatible [CodeObject: openmp-amdgcn-amd-amdhsa--gfx906] : [Target: hip-amdgcn-amd-amdhsa--gfx906]
|
||||
// HIPOpenMPCOMPATIBILITY: Compatible: Code Objects are compatible [CodeObject: openmp-amdgcn-amd-amdhsa--gfx908] : [Target: hipv4-amdgcn-amd-amdhsa--gfx908]
|
||||
|
||||
// Some code so that we can create a binary out of this file.
|
||||
int A = 0;
|
||||
|
||||
35
clang/test/Driver/clang-offload-bundler-standardize.c
Normal file
35
clang/test/Driver/clang-offload-bundler-standardize.c
Normal file
@@ -0,0 +1,35 @@
|
||||
// REQUIRES: x86-registered-target
|
||||
// UNSUPPORTED: target={{.*}}-darwin{{.*}}, target={{.*}}-aix{{.*}}
|
||||
|
||||
// Generate the file we can bundle.
|
||||
// RUN: %clang -O0 -target %itanium_abi_triple %s -c -o %t.o
|
||||
|
||||
//
|
||||
// Generate a couple of files to bundle with.
|
||||
//
|
||||
// RUN: echo 'Content of device file 1' > %t.tgt1
|
||||
// RUN: echo 'Content of device file 2' > %t.tgt2
|
||||
|
||||
//
|
||||
// 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
|
||||
|
||||
|
||||
// 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]
|
||||
|
||||
// Some code so that we can create a binary out of this file.
|
||||
int A = 0;
|
||||
void test_func(void) {
|
||||
++A;
|
||||
}
|
||||
@@ -1,5 +1,4 @@
|
||||
// REQUIRES: x86-registered-target
|
||||
// REQUIRES: powerpc-registered-target
|
||||
// UNSUPPORTED: target={{.*}}-darwin{{.*}}, target={{.*}}-aix{{.*}}
|
||||
|
||||
//
|
||||
@@ -297,11 +296,11 @@
|
||||
|
||||
// RUN: clang-offload-bundler -type=o -targets=host-%itanium_abi_triple,openmp-powerpc64le-ibm-linux-gnu,openmp-x86_64-pc-linux-gnu -input=%t.o -input=%t.tgt1 -input=%t.tgt2 -output=%t.bundle3.o -### 2>&1 \
|
||||
// RUN: | FileCheck %s -DHOST=%itanium_abi_triple -DINOBJ1=%t.o -DINOBJ2=%t.tgt1 -DINOBJ3=%t.tgt2 -DOUTOBJ=%t.bundle3.o --check-prefix CK-OBJ-CMD
|
||||
// CK-OBJ-CMD: llvm-objcopy{{(.exe)?}}" "--add-section=__CLANG_OFFLOAD_BUNDLE__host-[[HOST]]={{.*}}" "--set-section-flags=__CLANG_OFFLOAD_BUNDLE__host-[[HOST]]=readonly,exclude" "--add-section=__CLANG_OFFLOAD_BUNDLE__openmp-powerpc64le-ibm-linux-gnu=[[INOBJ2]]" "--set-section-flags=__CLANG_OFFLOAD_BUNDLE__openmp-powerpc64le-ibm-linux-gnu=readonly,exclude" "--add-section=__CLANG_OFFLOAD_BUNDLE__openmp-x86_64-pc-linux-gnu=[[INOBJ3]]" "--set-section-flags=__CLANG_OFFLOAD_BUNDLE__openmp-x86_64-pc-linux-gnu=readonly,exclude" "--" "[[INOBJ1]]" "[[OUTOBJ]]"
|
||||
// CK-OBJ-CMD: llvm-objcopy{{(.exe)?}}" "--add-section=__CLANG_OFFLOAD_BUNDLE__host-[[HOST]]-={{.*}}" "--set-section-flags=__CLANG_OFFLOAD_BUNDLE__host-[[HOST]]-=readonly,exclude" "--add-section=__CLANG_OFFLOAD_BUNDLE__openmp-powerpc64le-ibm-linux-gnu-=[[INOBJ2]]" "--set-section-flags=__CLANG_OFFLOAD_BUNDLE__openmp-powerpc64le-ibm-linux-gnu-=readonly,exclude" "--add-section=__CLANG_OFFLOAD_BUNDLE__openmp-x86_64-pc-linux-gnu-=[[INOBJ3]]" "--set-section-flags=__CLANG_OFFLOAD_BUNDLE__openmp-x86_64-pc-linux-gnu-=readonly,exclude" "--" "[[INOBJ1]]" "[[OUTOBJ]]"
|
||||
|
||||
// RUN: clang-offload-bundler -type=o -targets=host-%itanium_abi_triple,openmp-powerpc64le-ibm-linux-gnu,openmp-x86_64-pc-linux-gnu -input=%t.o -input=%t.tgt1 -input=%t.tgt2 -output=%t.bundle3.o -### 2>&1 \
|
||||
// RUN: | FileCheck %s -DHOST=%itanium_abi_triple -DINOBJ1=%t.o -DINOBJ2=%t.tgt1 -DINOBJ3=%t.tgt2 -DOUTOBJ=%t.bundle3.o --check-prefix CK-OBJ-CMD-INPUTS
|
||||
// CK-OBJ-CMD-INPUTS: llvm-objcopy{{(.exe)?}}" "--add-section=__CLANG_OFFLOAD_BUNDLE__host-[[HOST]]={{.*}}" "--set-section-flags=__CLANG_OFFLOAD_BUNDLE__host-[[HOST]]=readonly,exclude" "--add-section=__CLANG_OFFLOAD_BUNDLE__openmp-powerpc64le-ibm-linux-gnu=[[INOBJ2]]" "--set-section-flags=__CLANG_OFFLOAD_BUNDLE__openmp-powerpc64le-ibm-linux-gnu=readonly,exclude" "--add-section=__CLANG_OFFLOAD_BUNDLE__openmp-x86_64-pc-linux-gnu=[[INOBJ3]]" "--set-section-flags=__CLANG_OFFLOAD_BUNDLE__openmp-x86_64-pc-linux-gnu=readonly,exclude" "--" "[[INOBJ1]]" "[[OUTOBJ]]"
|
||||
// CK-OBJ-CMD-INPUTS: llvm-objcopy{{(.exe)?}}" "--add-section=__CLANG_OFFLOAD_BUNDLE__host-[[HOST]]-={{.*}}" "--set-section-flags=__CLANG_OFFLOAD_BUNDLE__host-[[HOST]]-=readonly,exclude" "--add-section=__CLANG_OFFLOAD_BUNDLE__openmp-powerpc64le-ibm-linux-gnu-=[[INOBJ2]]" "--set-section-flags=__CLANG_OFFLOAD_BUNDLE__openmp-powerpc64le-ibm-linux-gnu-=readonly,exclude" "--add-section=__CLANG_OFFLOAD_BUNDLE__openmp-x86_64-pc-linux-gnu-=[[INOBJ3]]" "--set-section-flags=__CLANG_OFFLOAD_BUNDLE__openmp-x86_64-pc-linux-gnu-=readonly,exclude" "--" "[[INOBJ1]]" "[[OUTOBJ]]"
|
||||
|
||||
// RUN: clang-offload-bundler -type=o -targets=host-%itanium_abi_triple,openmp-powerpc64le-ibm-linux-gnu,openmp-x86_64-pc-linux-gnu -input=%t.o -input=%t.tgt1 -input=%t.tgt2 -output=%t.bundle3.o
|
||||
// RUN: clang-offload-bundler -type=o -input=%t.bundle3.o -list | FileCheck -check-prefix=CKLST %s
|
||||
@@ -482,15 +481,15 @@
|
||||
// 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: llvm-ar t %t-archive-gfx906-simple.a | FileCheck %s -check-prefix=GFX906
|
||||
// GFX906: simple-openmp-amdgcn-amd-amdhsa-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
|
||||
// BADTARGETS: error: Cannot bundle inputs with conflicting targets: 'openmp-amdgcn-amd-amdhsa-gfx906' and 'openmp-amdgcn-amd-amdhsa-gfx906:sramecc+'
|
||||
// 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
|
||||
// INCOMPATIBLEARCHIVE: error: no compatible code object found for the target 'openmp-amdgcn-amd-amdhsa-gfx803' in heterogeneous archive library
|
||||
// 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
|
||||
@@ -500,7 +499,7 @@
|
||||
// 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: llvm-ar t %t-hip-archive-gfx906-simple.a | FileCheck %s -check-prefix=HIPOPENMPCOMPAT
|
||||
// HIPOPENMPCOMPAT: simple-openmp-amdgcn-amd-amdhsa-gfx906
|
||||
// HIPOPENMPCOMPAT: simple-openmp-amdgcn-amd-amdhsa--gfx906
|
||||
// RUN: llvm-ar t %t-hipv4-archive-gfx908-simple.a | FileCheck %s -check-prefix=HIPv4OPENMPCOMPAT
|
||||
// HIPv4OPENMPCOMPAT: simple-openmp-amdgcn-amd-amdhsa--gfx908
|
||||
|
||||
|
||||
@@ -313,6 +313,8 @@ int main(int argc, const char **argv) {
|
||||
llvm::DenseSet<StringRef> ParsedTargets;
|
||||
// Map {offload-kind}-{triple} to target IDs.
|
||||
std::map<std::string, std::set<StringRef>> TargetIDs;
|
||||
// Standardize target names to include env field
|
||||
std::vector<std::string> StandardizedTargetNames;
|
||||
for (StringRef Target : TargetNames) {
|
||||
if (ParsedTargets.contains(Target)) {
|
||||
reportError(createStringError(errc::invalid_argument,
|
||||
@@ -324,6 +326,8 @@ int main(int argc, const char **argv) {
|
||||
bool KindIsValid = OffloadInfo.isOffloadKindValid();
|
||||
bool TripleIsValid = OffloadInfo.isTripleValid();
|
||||
|
||||
StandardizedTargetNames.push_back(OffloadInfo.str());
|
||||
|
||||
if (!KindIsValid || !TripleIsValid) {
|
||||
SmallVector<char, 128u> Buf;
|
||||
raw_svector_ostream Msg(Buf);
|
||||
@@ -348,6 +352,9 @@ int main(int argc, const char **argv) {
|
||||
|
||||
++Index;
|
||||
}
|
||||
|
||||
BundlerConfig.TargetNames = StandardizedTargetNames;
|
||||
|
||||
for (const auto &TargetID : TargetIDs) {
|
||||
if (auto ConflictingTID =
|
||||
clang::getConflictTargetIDCombination(TargetID.second)) {
|
||||
|
||||
Reference in New Issue
Block a user