Skip to content

Commit 9aa6c0f

Browse files
maksimsabmdtoguchi
andcommitted
[Driver][SYCL] Improve FPGA archive device unbundling with AOCO
AOCO specific objects can be added to an archive. When this occurs, the archive was being completely ignored, causing issues with device compilation. Take advantage of the additional -excluded-targets option from the clang-offload-bundler so we can process these archives for the needed device information, excluding potential unbundling of the target device in the presense of aoco binaries in that same object. Co-authored-by: Michael Toguchi <michael.d.toguchi@intel.com>
1 parent af18927 commit 9aa6c0f

File tree

7 files changed

+107
-37
lines changed

7 files changed

+107
-37
lines changed

clang/include/clang/Driver/OffloadBundler.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#ifndef LLVM_CLANG_DRIVER_OFFLOADBUNDLER_H
1818
#define LLVM_CLANG_DRIVER_OFFLOADBUNDLER_H
1919

20+
#include "llvm/ADT/StringRef.h"
2021
#include "llvm/Support/Error.h"
2122
#include "llvm/TargetParser/Triple.h"
2223
#include <string>
@@ -43,6 +44,9 @@ class OffloadBundlerConfig {
4344
std::vector<std::string> TargetNames;
4445
std::vector<std::string> InputFileNames;
4546
std::vector<std::string> OutputFileNames;
47+
48+
// List of excluded target names from unbundling.
49+
std::vector<std::string> ExcludedTargetNames;
4650
};
4751

4852
class OffloadBundler {
@@ -60,6 +64,9 @@ class OffloadBundler {
6064
llvm::Error BundleFiles();
6165
llvm::Error UnbundleFiles();
6266
llvm::Error UnbundleArchive();
67+
68+
private:
69+
bool CheckTripleIsExcluded(llvm::StringRef Triple);
6370
};
6471

6572
/// Obtain the offload kind, real machine triple, and an optional GPUArch

clang/lib/Driver/Driver.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6747,11 +6747,6 @@ class OffloadingActionBuilder final {
67476747
// not needed for emulation, as these are treated as regular archives.
67486748
if (!C.getDriver().isFPGAEmulationMode())
67496749
unbundleStaticLib(types::TY_FPGA_AOCO, LA);
6750-
// Do not unbundle any AOCO archive as a regular archive when we are
6751-
// in FPGA Hardware/Simulation mode.
6752-
if (!C.getDriver().isFPGAEmulationMode() &&
6753-
hasFPGABinary(C, LA.str(), types::TY_FPGA_AOCO))
6754-
continue;
67556750
unbundleStaticLib(types::TY_Archive, LA);
67566751
}
67576752
}

clang/lib/Driver/OffloadBundler.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ using namespace clang;
7171
/// Section name which holds target symbol names.
7272
#define SYMBOLS_SECTION_NAME ".tgtsym"
7373

74+
#define DEBUG_TYPE "clang-offload-bundler"
75+
7476
OffloadTargetInfo::OffloadTargetInfo(const StringRef Target,
7577
const OffloadBundlerConfig &BC)
7678
: BundlerConfig(BC) {
@@ -1365,6 +1367,20 @@ Error OffloadBundler::BundleFiles() {
13651367
return Error::success();
13661368
}
13671369

1370+
bool OffloadBundler::CheckTripleIsExcluded(StringRef Triple) {
1371+
// NOTE: "-sycldevice" Triple component has been deprecated.
1372+
// However, it still can be met in libraries that have been compiled before
1373+
// deprecation. For example, here Triple might be the following:
1374+
// sycl-fpga_aoco-intel-unknown-sycldevice
1375+
//
1376+
// The workaround is to strip this Triple component if it is present.
1377+
Triple.consume_back("-sycldevice");
1378+
const auto &ExcludedTargetNames = BundlerConfig.ExcludedTargetNames;
1379+
auto it =
1380+
std::find(ExcludedTargetNames.begin(), ExcludedTargetNames.end(), Triple);
1381+
return it != ExcludedTargetNames.end();
1382+
}
1383+
13681384
// Unbundle the files. Return true if an error was found.
13691385
Error OffloadBundler::UnbundleFiles() {
13701386
// Open Input file.
@@ -1414,6 +1430,11 @@ Error OffloadBundler::UnbundleFiles() {
14141430

14151431
StringRef CurTriple = **CurTripleOrErr;
14161432
assert(!CurTriple.empty());
1433+
if (CheckTripleIsExcluded(CurTriple)) {
1434+
LLVM_DEBUG(outs() << "Triple: \"" << CurTriple.str()
1435+
<< "\" has been skipped by -excluded-targets list\n");
1436+
continue;
1437+
}
14171438

14181439
auto Output = Worklist.begin();
14191440
for (auto E = Worklist.end(); Output != E; Output++) {

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9088,15 +9088,37 @@ void OffloadBundler::ConstructJobMultipleOutputs(
90889088
TypeArg = "o";
90899089

90909090
bool HasSPIRTarget = false;
9091+
bool HasFPGATarget = false;
90919092
auto SYCLTCRange = C.getOffloadToolChains<Action::OFK_SYCL>();
9092-
for (auto TI = SYCLTCRange.first, TE = SYCLTCRange.second; TI != TE; ++TI)
9093-
HasSPIRTarget |= TI->second->getTriple().isSPIR();
9093+
for (auto TI = SYCLTCRange.first, TE = SYCLTCRange.second; TI != TE; ++TI) {
9094+
llvm::Triple TT(TI->second->getTriple());
9095+
if (TT.isSPIR()) {
9096+
HasSPIRTarget = true;
9097+
if (TT.getSubArch() == llvm::Triple::SPIRSubArch_fpga)
9098+
HasFPGATarget = true;
9099+
}
9100+
}
90949101
if (InputType == types::TY_Archive && HasSPIRTarget)
90959102
TypeArg = "aoo";
90969103

90979104
// Get the type.
90989105
CmdArgs.push_back(TCArgs.MakeArgString(Twine("-type=") + TypeArg));
90999106

9107+
// For FPGA Archives that contain AOCO in them, we only want to unbundle
9108+
// the objects from the archive that do not have AOCO associated in that
9109+
// specific object. Only do this when in hardware mode.
9110+
if (InputType == types::TY_Archive && HasFPGATarget && !IsFPGADepUnbundle &&
9111+
!IsFPGADepLibUnbundle && !C.getDriver().isFPGAEmulationMode()) {
9112+
llvm::Triple TT;
9113+
TT.setArchName(types::getTypeName(types::TY_FPGA_AOCO));
9114+
TT.setVendorName("intel");
9115+
TT.setOS(getToolChain().getTriple().getOS());
9116+
SmallString<128> ExcludedTargets("-excluded-targets=");
9117+
ExcludedTargets += "sycl-";
9118+
ExcludedTargets += TT.normalize();
9119+
CmdArgs.push_back(TCArgs.MakeArgString(ExcludedTargets));
9120+
}
9121+
91009122
// Get the targets.
91019123
SmallString<128> Triples;
91029124
Triples += "-targets=";

clang/test/Driver/sycl-intelfpga-aoco-win.cpp

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
// RUN: %clangxx -target x86_64-pc-windows-msvc -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fintelfpga -Xshardware %t_aoco.a %s -ccc-print-phases 2>&1 \
1313
// RUN: | FileCheck -check-prefixes=CHK-FPGA-AOCO-PHASES-WIN %s
1414
// CHK-FPGA-AOCO-PHASES-WIN: 0: input, "[[INPUTA:.+\.a]]", object, (host-sycl)
15-
// CHK-FPGA-AOCO-PHASES-WIN: 1: input, "[[INPUTSRC:.+\.cpp]]", c++, (host-sycl)
15+
// CHK-FPGA-AOCO-PHASES-WIN: 1: input, "[[INPUTCPP:.+\.cpp]]", c++, (host-sycl)
1616
// CHK-FPGA-AOCO-PHASES-WIN: 2: append-footer, {1}, c++, (host-sycl)
1717
// CHK-FPGA-AOCO-PHASES-WIN: 3: preprocessor, {2}, c++-cpp-output, (host-sycl)
18-
// CHK-FPGA-AOCO-PHASES-WIN: 4: input, "[[INPUTSRC]]", c++, (device-sycl)
18+
// CHK-FPGA-AOCO-PHASES-WIN: 4: input, "[[INPUTCPP]]", c++, (device-sycl)
1919
// CHK-FPGA-AOCO-PHASES-WIN: 5: preprocessor, {4}, c++-cpp-output, (device-sycl)
2020
// CHK-FPGA-AOCO-PHASES-WIN: 6: compiler, {5}, ir, (device-sycl)
2121
// CHK-FPGA-AOCO-PHASES-WIN: 7: offload, "host-sycl (x86_64-pc-windows-msvc)" {3}, "device-sycl (spir64_fpga-unknown-unknown)" {6}, c++-cpp-output
@@ -25,29 +25,35 @@
2525
// CHK-FPGA-AOCO-PHASES-WIN: 11: linker, {0, 10}, image, (host-sycl)
2626
// CHK-FPGA-AOCO-PHASES-WIN: 12: linker, {0, 10}, host_dep_image, (host-sycl)
2727
// CHK-FPGA-AOCO-PHASES-WIN: 13: clang-offload-deps, {12}, ir, (host-sycl)
28-
// CHK-FPGA-AOCO-PHASES-WIN: 14: linker, {6, 13}, ir, (device-sycl)
29-
// CHK-FPGA-AOCO-PHASES-WIN: 15: sycl-post-link, {14}, tempfiletable, (device-sycl)
30-
// CHK-FPGA-AOCO-PHASES-WIN: 16: file-table-tform, {15}, tempfilelist, (device-sycl)
31-
// CHK-FPGA-AOCO-PHASES-WIN: 17: llvm-spirv, {16}, tempfilelist, (device-sycl)
32-
// CHK-FPGA-AOCO-PHASES-WIN: 18: input, "[[INPUTA]]", archive
33-
// CHK-FPGA-AOCO-PHASES-WIN: 19: clang-offload-unbundler, {18}, fpga_dep_list
34-
// CHK-FPGA-AOCO-PHASES-WIN: 20: input, "[[INPUTA]]", fpga_aoco
35-
// CHK-FPGA-AOCO-PHASES-WIN: 21: clang-offload-unbundler, {20}, fpga_aoco
36-
// CHK-FPGA-AOCO-PHASES-WIN: 22: backend-compiler, {17, 19, 21}, fpga_aocx, (device-sycl)
37-
// CHK-FPGA-AOCO-PHASES-WIN: 23: file-table-tform, {15, 22}, tempfiletable, (device-sycl)
38-
// CHK-FPGA-AOCO-PHASES-WIN: 24: clang-offload-wrapper, {23}, object, (device-sycl)
39-
// CHK-FPGA-AOCO-PHASES-WIN: 25: offload, "host-sycl (x86_64-pc-windows-msvc)" {11}, "device-sycl (spir64_fpga-unknown-unknown)" {24}, image
28+
// CHK-FPGA-AOCO-PHASES-WIN: 14: input, "[[INPUTA]]", archive
29+
// CHK-FPGA-AOCO-PHASES-WIN: 15: clang-offload-unbundler, {14}, tempfilelist
30+
// CHK-FPGA-AOCO-PHASES-WIN: 16: spirv-to-ir-wrapper, {15}, tempfilelist, (device-sycl)
31+
// CHK-FPGA-AOCO-PHASES-WIN: 17: linker, {6, 13, 16}, ir, (device-sycl)
32+
// CHK-FPGA-AOCO-PHASES-WIN: 18: sycl-post-link, {17}, tempfiletable, (device-sycl)
33+
// CHK-FPGA-AOCO-PHASES-WIN: 19: file-table-tform, {18}, tempfilelist, (device-sycl)
34+
// CHK-FPGA-AOCO-PHASES-WIN: 20: llvm-spirv, {19}, tempfilelist, (device-sycl)
35+
// CHK-FPGA-AOCO-PHASES-WIN: 21: input, "[[INPUTA]]", archive
36+
// CHK-FPGA-AOCO-PHASES-WIN: 22: clang-offload-unbundler, {21}, fpga_dep_list
37+
// CHK-FPGA-AOCO-PHASES-WIN: 23: input, "[[INPUTA]]", fpga_aoco
38+
// CHK-FPGA-AOCO-PHASES-WIN: 24: clang-offload-unbundler, {23}, fpga_aoco
39+
// CHK-FPGA-AOCO-PHASES-WIN: 25: backend-compiler, {20, 22, 24}, fpga_aocx, (device-sycl)
40+
// CHK-FPGA-AOCO-PHASES-WIN: 26: file-table-tform, {18, 25}, tempfiletable, (device-sycl)
41+
// CHK-FPGA-AOCO-PHASES-WIN: 27: clang-offload-wrapper, {26}, object, (device-sycl)
42+
// CHK-FPGA-AOCO-PHASES-WIN: 28: offload, "host-sycl (x86_64-pc-windows-msvc)" {11}, "device-sycl (spir64_fpga-unknown-unknown)" {27}, image
4043

4144
/// aoco test, checking tools
4245
// RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fintelfpga %t_aoco.a -Xshardware -### %s 2>&1 \
4346
// RUN: | FileCheck -check-prefix=CHK-FPGA-AOCO %s
4447
// RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fintelfpga %t_aoco.a -Xshardware -### %s 2>&1 \
4548
// RUN: | FileCheck -check-prefix=CHK-FPGA-AOCO %s
49+
// CHK-FPGA-AOCO: clang-offload-bundler{{.*}} "-type=aoo" "-excluded-targets=sycl-fpga_aoco-intel-unknown" "-targets=sycl-spir64_fpga-unknown-unknown" "-input=[[INPUTLIB:.+\.a]]" "-output=[[LIBLIST:.+\.txt]]" "-unbundle"
50+
// CHK-FPGA-AOCO: spirv-to-ir-wrapper{{.*}} "[[LIBLIST]]" "-o" "[[LIBLIST2:.+\.txt]]"
4651
// CHK-FPGA-AOCO: llvm-link{{.*}} "-o" "[[LINKEDBC:.+\.bc]]"
47-
// CHK-FPGA-AOCO: sycl-post-link{{.*}} "-split-esimd"{{.*}} "-O2" "-spec-const=default" {{.*}} "-o" "[[SPLTABLE:.+\.table]]" "[[LINKEDBC]]"
52+
// CHK-FPGA-AOCO: llvm-link{{.*}} "--only-needed" "[[LINKEDBC]]" "@[[LIBLIST2]]" "-o" "[[LINKEDBC2:.+\.bc]]"
53+
// CHK-FPGA-AOCO: sycl-post-link{{.*}} "-split-esimd"{{.*}} "-O2" "-spec-const=default" "-device-globals" "-o" "[[SPLTABLE:.+\.table]]" "[[LINKEDBC2]]"
4854
// CHK-FPGA-AOCO: file-table-tform{{.*}} "-o" "[[TABLEOUT:.+\.txt]]" "[[SPLTABLE]]"
4955
// CHK-FPGA-AOCO: llvm-spirv{{.*}} "-o" "[[TARGSPV:.+\.txt]]" {{.*}} "[[TABLEOUT]]"
50-
// CHK-FPGA-AOCO: clang-offload-bundler{{.*}} "-type=aoo" "-targets=sycl-fpga_aoco-intel-unknown" "-input=[[INPUTLIB:.+\.a]]" "-output=[[AOCOLIST:.+\.txt]]" "-unbundle"
56+
// CHK-FPGA-AOCO: clang-offload-bundler{{.*}} "-type=aoo" "-targets=sycl-fpga_aoco-intel-unknown" "-input=[[INPUTLIB]]" "-output=[[AOCOLIST:.+\.txt]]" "-unbundle"
5157
// CHK-FPGA-AOCO: aoc{{.*}} "-o" "[[AOCXOUT:.+\.aocx]]" "[[TARGSPV]]" "-library-list=[[AOCOLIST]]" "-sycl"
5258
// CHK-FPGA-AOCO: file-table-tform{{.*}} "-o" "[[TABLEOUT2:.+\.table]]" "[[SPLTABLE]]" "[[AOCXOUT]]"
5359
// CHK-FPGA-AOCO: clang-offload-wrapper{{.*}} "-o=[[FINALBC:.+\.bc]]" {{.*}} "-target=spir64_fpga" "-kind=sycl" "-batch" "[[TABLEOUT2]]"

clang/test/Driver/sycl-intelfpga-aoco.cpp

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,21 @@
2929
// CHK-FPGA-AOCO-PHASES: 11: linker, {0, 10}, image, (host-sycl)
3030
// CHK-FPGA-AOCO-PHASES: 12: linker, {0, 10}, host_dep_image, (host-sycl)
3131
// CHK-FPGA-AOCO-PHASES: 13: clang-offload-deps, {12}, ir, (host-sycl)
32-
// CHK-FPGA-AOCO-PHASES: 14: linker, {6, 13}, ir, (device-sycl)
33-
// CHK-FPGA-AOCO-PHASES: 15: sycl-post-link, {14}, tempfiletable, (device-sycl)
34-
// CHK-FPGA-AOCO-PHASES: 16: file-table-tform, {15}, tempfilelist, (device-sycl)
35-
// CHK-FPGA-AOCO-PHASES: 17: llvm-spirv, {16}, tempfilelist, (device-sycl)
36-
// CHK-FPGA-AOCO-PHASES: 18: input, "[[INPUTA]]", archive
37-
// CHK-FPGA-AOCO-PHASES: 19: clang-offload-unbundler, {18}, fpga_dep_list
38-
// CHK-FPGA-AOCO-PHASES: 20: input, "[[INPUTA]]", fpga_aoco
39-
// CHK-FPGA-AOCO-PHASES: 21: clang-offload-unbundler, {20}, fpga_aoco
40-
// CHK-FPGA-AOCO-PHASES: 22: backend-compiler, {17, 19, 21}, fpga_aocx, (device-sycl)
41-
// CHK-FPGA-AOCO-PHASES: 23: file-table-tform, {15, 22}, tempfiletable, (device-sycl)
42-
// CHK-FPGA-AOCO-PHASES: 24: clang-offload-wrapper, {23}, object, (device-sycl)
43-
// CHK-FPGA-AOCO-PHASES: 25: offload, "host-sycl (x86_64-unknown-linux-gnu)" {11}, "device-sycl (spir64_fpga-unknown-unknown)" {24}, image
32+
// CHK-FPGA-AOCO-PHASES: 14: input, "[[INPUTA]]", archive
33+
// CHK-FPGA-AOCO-PHASES: 15: clang-offload-unbundler, {14}, tempfilelist
34+
// CHK-FPGA-AOCO-PHASES: 16: spirv-to-ir-wrapper, {15}, tempfilelist, (device-sycl)
35+
// CHK-FPGA-AOCO-PHASES: 17: linker, {6, 13, 16}, ir, (device-sycl)
36+
// CHK-FPGA-AOCO-PHASES: 18: sycl-post-link, {17}, tempfiletable, (device-sycl)
37+
// CHK-FPGA-AOCO-PHASES: 19: file-table-tform, {18}, tempfilelist, (device-sycl)
38+
// CHK-FPGA-AOCO-PHASES: 20: llvm-spirv, {19}, tempfilelist, (device-sycl)
39+
// CHK-FPGA-AOCO-PHASES: 21: input, "[[INPUTA]]", archive
40+
// CHK-FPGA-AOCO-PHASES: 22: clang-offload-unbundler, {21}, fpga_dep_list
41+
// CHK-FPGA-AOCO-PHASES: 23: input, "[[INPUTA]]", fpga_aoco
42+
// CHK-FPGA-AOCO-PHASES: 24: clang-offload-unbundler, {23}, fpga_aoco
43+
// CHK-FPGA-AOCO-PHASES: 25: backend-compiler, {20, 22, 24}, fpga_aocx, (device-sycl)
44+
// CHK-FPGA-AOCO-PHASES: 26: file-table-tform, {18, 25}, tempfiletable, (device-sycl)
45+
// CHK-FPGA-AOCO-PHASES: 27: clang-offload-wrapper, {26}, object, (device-sycl)
46+
// CHK-FPGA-AOCO-PHASES: 28: offload, "host-sycl (x86_64-unknown-linux-gnu)" {11}, "device-sycl (spir64_fpga-unknown-unknown)" {27}, image
4447

4548
/// aoco test, checking tools
4649
// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fintelfpga -Xshardware -foffload-static-lib=%t_aoco.a -### %s 2>&1 \
@@ -51,11 +54,14 @@
5154
// RUN: | FileCheck -check-prefixes=CHK-FPGA-AOCO,CHK-FPGA-AOCO-WIN %s
5255
// RUN: %clang_cl -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fintelfpga -Xshardware %t_aoco_cl.a -### %s 2>&1 \
5356
// RUN: | FileCheck -check-prefixes=CHK-FPGA-AOCO,CHK-FPGA-AOCO-WIN %s
57+
// CHK-FPGA-AOCO: clang-offload-bundler{{.*}} "-type=aoo" "-excluded-targets=sycl-fpga_aoco-intel-unknown" "-targets=sycl-spir64_fpga-unknown-unknown" "-input=[[INPUTLIB:.+\.a]]" "-output=[[LIBLIST:.+\.txt]]" "-unbundle"
58+
// CHK-FPGA-AOCO: spirv-to-ir-wrapper{{.*}} "[[LIBLIST]]" "-o" "[[LIBLIST2:.+\.txt]]"
5459
// CHK-FPGA-AOCO: llvm-link{{.*}} "-o" "[[LINKEDBC:.+\.bc]]"
55-
// CHK-FPGA-AOCO: sycl-post-link{{.*}} "-split-esimd"{{.*}} "-O2" "-spec-const=default" "-device-globals" "-o" "[[SPLTABLE:.+\.table]]" "[[LINKEDBC]]"
60+
// CHK-FPGA-AOCO: llvm-link{{.*}} "--only-needed" "[[LINKEDBC]]" "@[[LIBLIST2]]" "-o" "[[LINKEDBC2:.+\.bc]]"
61+
// CHK-FPGA-AOCO: sycl-post-link{{.*}} "-split-esimd"{{.*}} "-O2" "-spec-const=default" "-device-globals" "-o" "[[SPLTABLE:.+\.table]]" "[[LINKEDBC2]]"
5662
// CHK-FPGA-AOCO: file-table-tform{{.*}} "-o" "[[TABLEOUT:.+\.txt]]" "[[SPLTABLE]]"
5763
// CHK-FPGA-AOCO: llvm-spirv{{.*}} "-o" "[[TARGSPV:.+\.txt]]" {{.*}} "[[TABLEOUT]]"
58-
// CHK-FPGA-AOCO: clang-offload-bundler{{.*}} "-type=aoo" "-targets=sycl-fpga_aoco-intel-unknown" "-input=[[INPUTLIB:.+\.a]]" "-output=[[AOCOLIST:.+\.txt]]" "-unbundle"
64+
// CHK-FPGA-AOCO: clang-offload-bundler{{.*}} "-type=aoo" "-targets=sycl-fpga_aoco-intel-unknown" "-input=[[INPUTLIB]]" "-output=[[AOCOLIST:.+\.txt]]" "-unbundle"
5965
// CHK-FPGA-AOCO: aoc{{.*}} "-o" "[[AOCXOUT:.+\.aocx]]" "[[TARGSPV]]" "-library-list=[[AOCOLIST]]" "-sycl"
6066
// CHK-FPGA-AOCO: file-table-tform{{.*}} "-o" "[[TABLEOUT2:.+\.table]]" "[[SPLTABLE]]" "[[AOCXOUT]]"
6167
// CHK-FPGA-AOCO: clang-offload-wrapper{{.*}} "-o=[[FINALBC:.+\.bc]]" {{.*}} "-target=spir64_fpga" "-kind=sycl" "-batch" "[[TABLEOUT2]]"

clang/tools/clang-offload-bundler/ClangOffloadBundler.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,12 @@ int main(int argc, const char **argv) {
101101
cl::desc("[<offload kind>-<target triple>,...]"),
102102
cl::cat(ClangOffloadBundlerCategory));
103103

104+
cl::list<std::string> ExcludedTargetNames(
105+
"excluded-targets", cl::CommaSeparated,
106+
cl::desc("[<target name>,...]. List of targets that are excluded from "
107+
"unbundling."),
108+
cl::cat(ClangOffloadBundlerCategory));
109+
104110
cl::opt<std::string> FilesType(
105111
"type", cl::Required,
106112
cl::desc("Type of the files to be bundled/unbundled/checked.\n"
@@ -202,6 +208,7 @@ int main(int argc, const char **argv) {
202208
BundlerConfig.ObjcopyPath = "";
203209

204210
BundlerConfig.TargetNames = TargetNames;
211+
BundlerConfig.ExcludedTargetNames = ExcludedTargetNames;
205212
BundlerConfig.InputFileNames = InputFileNames;
206213
BundlerConfig.OutputFileNames = OutputFileNames;
207214

@@ -369,6 +376,12 @@ int main(int argc, const char **argv) {
369376
}
370377
}
371378

379+
// check -excluded-targets without unbundle
380+
if (!ExcludedTargetNames.empty() && !Unbundle)
381+
reportError(createStringError(errc::invalid_argument,
382+
"-excluded-targets option should be used "
383+
"only in conjunction with -unbundle"));
384+
372385
// Verify that the offload kinds and triples are known. We also check that we
373386
// have exactly one host target.
374387
unsigned Index = 0u;

0 commit comments

Comments
 (0)