10 #include "llvm/Support/ErrorHandling.h"
14 using namespace clang;
15 using namespace driver;
22 case InputClass:
return "input";
23 case BindArchClass:
return "bind-arch";
26 case PreprocessJobClass:
return "preprocessor";
27 case PrecompileJobClass:
return "precompiler";
28 case HeaderModulePrecompileJobClass:
return "header-module-precompiler";
29 case ExtractAPIJobClass:
30 return "api-extractor";
31 case AnalyzeJobClass:
return "analyzer";
32 case MigrateJobClass:
return "migrator";
33 case CompileJobClass:
return "compiler";
34 case BackendJobClass:
return "backend";
35 case AssembleJobClass:
return "assembler";
36 case IfsMergeJobClass:
return "interface-stub-merger";
37 case LinkJobClass:
return "linker";
38 case LipoJobClass:
return "lipo";
39 case DsymutilJobClass:
return "dsymutil";
40 case VerifyDebugInfoJobClass:
return "verify-debug-info";
41 case VerifyPCHJobClass:
return "verify-pch";
42 case OffloadBundlingJobClass:
43 return "clang-offload-bundler";
44 case OffloadUnbundlingJobClass:
45 return "clang-offload-unbundler";
46 case OffloadWrapperJobClass:
47 return "clang-offload-wrapper";
48 case OffloadPackagerJobClass:
49 return "clang-offload-packager";
50 case LinkerWrapperJobClass:
51 return "clang-linker-wrapper";
52 case StaticLibJobClass:
53 return "static-lib-linker";
56 llvm_unreachable(
"invalid class");
62 if (
Kind == OffloadClass)
65 if (
Kind == OffloadUnbundlingJobClass)
68 assert((OffloadingDeviceKind == OKind || OffloadingDeviceKind == OFK_None) &&
69 "Setting device kind to a different device??");
70 assert(!ActiveOffloadKindMask &&
"Setting a device kind in a host action??");
71 OffloadingDeviceKind = OKind;
72 OffloadingArch = OArch;
73 OffloadingToolChain = OToolChain;
75 for (
auto *A : Inputs)
76 A->propagateDeviceOffloadInfo(OffloadingDeviceKind, OArch, OToolChain);
81 if (
Kind == OffloadClass)
84 assert(OffloadingDeviceKind == OFK_None &&
85 "Setting a host kind in a device action.");
86 ActiveOffloadKindMask |= OKinds;
87 OffloadingArch = OArch;
89 for (
auto *A : Inputs)
90 A->propagateHostOffloadInfo(ActiveOffloadKindMask, OArch);
103 switch (OffloadingDeviceKind) {
107 llvm_unreachable(
"Host kind is not an offloading device kind.");
110 return "device-cuda";
112 return "device-openmp";
119 if (!ActiveOffloadKindMask)
123 assert(!((ActiveOffloadKindMask & OFK_Cuda) &&
124 (ActiveOffloadKindMask & OFK_HIP)) &&
125 "Cannot offload CUDA and HIP at the same time");
126 if (ActiveOffloadKindMask & OFK_Cuda)
128 if (ActiveOffloadKindMask & OFK_HIP)
130 if (ActiveOffloadKindMask & OFK_OpenMP)
142 StringRef NormalizedTriple,
143 bool CreatePrefixForHost) {
145 if (!CreatePrefixForHost && (
Kind == OFK_None ||
Kind == OFK_Host))
149 Res += GetOffloadKindName(
Kind);
151 Res += NormalizedTriple;
172 llvm_unreachable(
"invalid offload kind");
175 void InputAction::anchor() {}
178 :
Action(InputClass, _Type), Input(_Input),
Id(_Id.str()) {}
180 void BindArchAction::anchor() {}
183 :
Action(BindArchClass, Input), ArchName(ArchName) {}
185 void OffloadAction::anchor() {}
188 :
Action(OffloadClass, HDep.getAction()), HostTC(HDep.getToolChain()) {
196 :
Action(OffloadClass, DDeps.getActions(), Ty),
197 DevToolChains(DDeps.getToolChains()) {
203 if (llvm::all_of(OKinds, [&](
OffloadKind K) {
return K == OKinds.front(); }))
207 if (OKinds.size() == 1)
212 getInputs()[i]->propagateDeviceOffloadInfo(OKinds[i], BArchs[i], OTCs[i]);
217 :
Action(OffloadClass, HDep.getAction()), HostTC(HDep.getToolChain()),
218 DevToolChains(DDeps.getToolChains()) {
227 for (
unsigned i = 0, e = DDeps.
getActions().size(); i != e; ++i)
239 assert(!
getInputs().empty() &&
"No dependencies for offload action??");
241 Work(A, HostTC, A->getOffloadingArch());
254 assert(
getInputs().
size() == DevToolChains.size() + (HostTC ? 1 : 0) &&
255 "Sizes of action dependences and toolchains are not consistent!");
261 auto TI = DevToolChains.begin();
262 for (; I != E; ++I, ++TI)
263 Work(*I, *TI, (*I)->getOffloadingArch());
273 if (IsHostDependence)
283 assert(!
getInputs().empty() &&
"No dependencies for offload action??");
284 return HostTC ?
getInputs().front() :
nullptr;
288 bool DoNotConsiderHostActions)
const {
289 if (DoNotConsiderHostActions)
290 return getInputs().size() == (HostTC ? 2 : 1);
291 return !HostTC &&
getInputs().size() == 1;
297 "Single device dependence does not exist!");
304 const char *BoundArch,
306 DeviceActions.push_back(&A);
307 DeviceToolChains.push_back(&TC);
308 DeviceBoundArchs.push_back(BoundArch);
309 DeviceOffloadKinds.push_back(OKind);
313 const char *BoundArch,
315 : HostAction(A), HostToolChain(TC), HostBoundArch(BoundArch) {
317 HostOffloadKinds |= K;
320 void JobAction::anchor() {}
328 void PreprocessJobAction::anchor() {}
331 :
JobAction(PreprocessJobClass, Input, OutputType) {}
333 void PrecompileJobAction::anchor() {}
336 :
JobAction(PrecompileJobClass, Input, OutputType) {}
341 assert(isa<PrecompileJobAction>((
Action*)
this) &&
"invalid action kind");
344 void HeaderModulePrecompileJobAction::anchor() {}
349 ModuleName(ModuleName) {}
351 void ExtractAPIJobAction::anchor() {}
354 :
JobAction(ExtractAPIJobClass, Inputs, OutputType) {}
356 void AnalyzeJobAction::anchor() {}
359 :
JobAction(AnalyzeJobClass, Input, OutputType) {}
361 void MigrateJobAction::anchor() {}
364 :
JobAction(MigrateJobClass, Input, OutputType) {}
366 void CompileJobAction::anchor() {}
369 :
JobAction(CompileJobClass, Input, OutputType) {}
371 void BackendJobAction::anchor() {}
374 :
JobAction(BackendJobClass, Input, OutputType) {}
376 void AssembleJobAction::anchor() {}
379 :
JobAction(AssembleJobClass, Input, OutputType) {}
381 void IfsMergeJobAction::anchor() {}
386 void LinkJobAction::anchor() {}
391 void LipoJobAction::anchor() {}
396 void DsymutilJobAction::anchor() {}
401 void VerifyJobAction::anchor() {}
407 "ActionClass is not a valid VerifyJobAction");
410 void VerifyDebugInfoJobAction::anchor() {}
416 void VerifyPCHJobAction::anchor() {}
421 void OffloadBundlingJobAction::anchor() {}
424 :
JobAction(OffloadBundlingJobClass, Inputs, Inputs.back()->getType()) {}
426 void OffloadUnbundlingJobAction::anchor() {}
429 :
JobAction(OffloadUnbundlingJobClass, Input, Input->getType()) {}
431 void OffloadWrapperJobAction::anchor() {}
437 void OffloadPackagerJobAction::anchor() {}
443 void LinkerWrapperJobAction::anchor() {}
449 void StaticLibJobAction::anchor() {}