diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/Driver/Action.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/Driver/Action.cpp | 78 |
1 files changed, 57 insertions, 21 deletions
diff --git a/contrib/llvm-project/clang/lib/Driver/Action.cpp b/contrib/llvm-project/clang/lib/Driver/Action.cpp index 2ec063d873be..849bf6035ebd 100644 --- a/contrib/llvm-project/clang/lib/Driver/Action.cpp +++ b/contrib/llvm-project/clang/lib/Driver/Action.cpp @@ -25,7 +25,8 @@ const char *Action::getClassName(ActionClass AC) { return "offload"; case PreprocessJobClass: return "preprocessor"; case PrecompileJobClass: return "precompiler"; - case HeaderModulePrecompileJobClass: return "header-module-precompiler"; + case ExtractAPIJobClass: + return "api-extractor"; case AnalyzeJobClass: return "analyzer"; case MigrateJobClass: return "migrator"; case CompileJobClass: return "compiler"; @@ -41,16 +42,21 @@ const char *Action::getClassName(ActionClass AC) { return "clang-offload-bundler"; case OffloadUnbundlingJobClass: return "clang-offload-unbundler"; - case OffloadWrapperJobClass: - return "clang-offload-wrapper"; + case OffloadPackagerJobClass: + return "clang-offload-packager"; + case LinkerWrapperJobClass: + return "clang-linker-wrapper"; case StaticLibJobClass: return "static-lib-linker"; + case BinaryAnalyzeJobClass: + return "binary-analyzer"; } llvm_unreachable("invalid class"); } -void Action::propagateDeviceOffloadInfo(OffloadKind OKind, const char *OArch) { +void Action::propagateDeviceOffloadInfo(OffloadKind OKind, const char *OArch, + const ToolChain *OToolChain) { // Offload action set its own kinds on their dependences. if (Kind == OffloadClass) return; @@ -63,9 +69,10 @@ void Action::propagateDeviceOffloadInfo(OffloadKind OKind, const char *OArch) { assert(!ActiveOffloadKindMask && "Setting a device kind in a host action??"); OffloadingDeviceKind = OKind; OffloadingArch = OArch; + OffloadingToolChain = OToolChain; for (auto *A : Inputs) - A->propagateDeviceOffloadInfo(OffloadingDeviceKind, OArch); + A->propagateDeviceOffloadInfo(OffloadingDeviceKind, OArch, OToolChain); } void Action::propagateHostOffloadInfo(unsigned OKinds, const char *OArch) { @@ -87,7 +94,8 @@ void Action::propagateOffloadInfo(const Action *A) { propagateHostOffloadInfo(HK, A->getOffloadingArch()); else propagateDeviceOffloadInfo(A->getOffloadingDeviceKind(), - A->getOffloadingArch()); + A->getOffloadingArch(), + A->getOffloadingToolChain()); } std::string Action::getOffloadingKindPrefix() const { @@ -165,8 +173,8 @@ StringRef Action::GetOffloadKindName(OffloadKind Kind) { void InputAction::anchor() {} -InputAction::InputAction(const Arg &_Input, types::ID _Type) - : Action(InputClass, _Type), Input(_Input) {} +InputAction::InputAction(const Arg &_Input, types::ID _Type, StringRef _Id) + : Action(InputClass, _Type), Input(_Input), Id(_Id.str()) {} void BindArchAction::anchor() {} @@ -188,9 +196,10 @@ OffloadAction::OffloadAction(const DeviceDependences &DDeps, types::ID Ty) DevToolChains(DDeps.getToolChains()) { auto &OKinds = DDeps.getOffloadKinds(); auto &BArchs = DDeps.getBoundArchs(); + auto &OTCs = DDeps.getToolChains(); // If all inputs agree on the same kind, use it also for this action. - if (llvm::all_of(OKinds, [&](OffloadKind K) { return K == OKinds.front(); })) + if (llvm::all_equal(OKinds)) OffloadingDeviceKind = OKinds.front(); // If we have a single dependency, inherit the architecture from it. @@ -199,7 +208,7 @@ OffloadAction::OffloadAction(const DeviceDependences &DDeps, types::ID Ty) // Propagate info to the dependencies. for (unsigned i = 0, e = getInputs().size(); i != e; ++i) - getInputs()[i]->propagateDeviceOffloadInfo(OKinds[i], BArchs[i]); + getInputs()[i]->propagateDeviceOffloadInfo(OKinds[i], BArchs[i], OTCs[i]); } OffloadAction::OffloadAction(const HostDependence &HDep, @@ -214,12 +223,17 @@ OffloadAction::OffloadAction(const HostDependence &HDep, // Add device inputs and propagate info to the device actions. Do work only if // we have dependencies. - for (unsigned i = 0, e = DDeps.getActions().size(); i != e; ++i) + for (unsigned i = 0, e = DDeps.getActions().size(); i != e; ++i) { if (auto *A = DDeps.getActions()[i]) { getInputs().push_back(A); A->propagateDeviceOffloadInfo(DDeps.getOffloadKinds()[i], - DDeps.getBoundArchs()[i]); + DDeps.getBoundArchs()[i], + DDeps.getToolChains()[i]); + // If this action is used to forward single dependency, set the toolchain. + if (DDeps.getActions().size() == 1) + OffloadingToolChain = DDeps.getToolChains()[i]; } + } } void OffloadAction::doOnHostDependence(const OffloadActionWorkTy &Work) const { @@ -298,6 +312,19 @@ void OffloadAction::DeviceDependences::add(Action &A, const ToolChain &TC, DeviceOffloadKinds.push_back(OKind); } +void OffloadAction::DeviceDependences::add(Action &A, const ToolChain &TC, + const char *BoundArch, + unsigned OffloadKindMask) { + DeviceActions.push_back(&A); + DeviceToolChains.push_back(&TC); + DeviceBoundArchs.push_back(BoundArch); + + // Add each active offloading kind from a mask. + for (OffloadKind OKind : {OFK_OpenMP, OFK_Cuda, OFK_HIP}) + if (OKind & OffloadKindMask) + DeviceOffloadKinds.push_back(OKind); +} + OffloadAction::HostDependence::HostDependence(Action &A, const ToolChain &TC, const char *BoundArch, const DeviceDependences &DDeps) @@ -330,12 +357,10 @@ PrecompileJobAction::PrecompileJobAction(ActionClass Kind, Action *Input, assert(isa<PrecompileJobAction>((Action*)this) && "invalid action kind"); } -void HeaderModulePrecompileJobAction::anchor() {} +void ExtractAPIJobAction::anchor() {} -HeaderModulePrecompileJobAction::HeaderModulePrecompileJobAction( - Action *Input, types::ID OutputType, const char *ModuleName) - : PrecompileJobAction(HeaderModulePrecompileJobClass, Input, OutputType), - ModuleName(ModuleName) {} +ExtractAPIJobAction::ExtractAPIJobAction(Action *Inputs, types::ID OutputType) + : JobAction(ExtractAPIJobClass, Inputs, OutputType) {} void AnalyzeJobAction::anchor() {} @@ -412,13 +437,24 @@ void OffloadUnbundlingJobAction::anchor() {} OffloadUnbundlingJobAction::OffloadUnbundlingJobAction(Action *Input) : JobAction(OffloadUnbundlingJobClass, Input, Input->getType()) {} -void OffloadWrapperJobAction::anchor() {} +void OffloadPackagerJobAction::anchor() {} + +OffloadPackagerJobAction::OffloadPackagerJobAction(ActionList &Inputs, + types::ID Type) + : JobAction(OffloadPackagerJobClass, Inputs, Type) {} -OffloadWrapperJobAction::OffloadWrapperJobAction(ActionList &Inputs, - types::ID Type) - : JobAction(OffloadWrapperJobClass, Inputs, Type) {} +void LinkerWrapperJobAction::anchor() {} + +LinkerWrapperJobAction::LinkerWrapperJobAction(ActionList &Inputs, + types::ID Type) + : JobAction(LinkerWrapperJobClass, Inputs, Type) {} void StaticLibJobAction::anchor() {} StaticLibJobAction::StaticLibJobAction(ActionList &Inputs, types::ID Type) : JobAction(StaticLibJobClass, Inputs, Type) {} + +void BinaryAnalyzeJobAction::anchor() {} + +BinaryAnalyzeJobAction::BinaryAnalyzeJobAction(Action *Input, types::ID Type) + : JobAction(BinaryAnalyzeJobClass, Input, Type) {} |