9 #ifndef LLVM_CLANG_DRIVER_ACTION_H 10 #define LLVM_CLANG_DRIVER_ACTION_H 15 #include "llvm/ADT/ArrayRef.h" 16 #include "llvm/ADT/STLExtras.h" 17 #include "llvm/ADT/SmallVector.h" 18 #include "llvm/ADT/StringRef.h" 19 #include "llvm/ADT/iterator_range.h" 75 JobClassFirst = PreprocessJobClass,
76 JobClassLast = OffloadUnbundlingJobClass
108 bool CanBeCollapsedWithNextDependentAction =
true;
118 unsigned ActiveOffloadKindMask = 0u;
124 const char *OffloadingArch =
nullptr;
132 : Kind(Kind), Type(Type), Inputs(Inputs) {}
158 CanBeCollapsedWithNextDependentAction =
false;
163 return CanBeCollapsedWithNextDependentAction;
167 std::string getOffloadingKindPrefix()
const;
174 StringRef NormalizedTriple,
175 bool CreatePrefixForHost =
false);
178 static StringRef GetOffloadKindName(
OffloadKind Kind);
182 void propagateDeviceOffloadInfo(
OffloadKind OKind,
const char *OArch);
186 void propagateHostOffloadInfo(
unsigned OKinds,
const char *OArch);
190 void propagateOffloadInfo(
const Action *A);
193 return ActiveOffloadKindMask;
202 return ActiveOffloadKindMask & OKind;
205 return OffloadingDeviceKind == OKind;
208 return isHostOffloading(OKind) || isDeviceOffloading(OKind);
213 const llvm::opt::Arg &Input;
215 virtual void anchor();
223 return A->
getKind() == InputClass;
228 virtual void anchor();
240 return A->
getKind() == BindArchClass;
248 virtual void anchor();
288 return DeviceOffloadKinds;
302 const char *HostBoundArch =
nullptr;
305 unsigned HostOffloadKinds = 0u;
309 const unsigned OffloadKinds)
310 : HostAction(A), HostToolChain(TC), HostBoundArch(BoundArch),
311 HostOffloadKinds(OffloadKinds) {}
324 llvm::function_ref<void(Action *, const ToolChain *, const char *)>;
349 void doOnEachDependence(
bool IsHostDependence,
353 bool hasHostDependence()
const;
357 Action *getHostDependence()
const;
362 bool hasSingleDeviceDependence(
bool DoNotConsiderHostActions =
false)
const;
368 getSingleDeviceDependence(
bool DoNotConsiderHostActions =
false)
const;
374 virtual void anchor();
382 return (A->
getKind() >= JobClassFirst &&
388 void anchor()
override;
394 return A->
getKind() == PreprocessJobClass;
399 void anchor()
override;
408 return A->
getKind() == PrecompileJobClass ||
409 A->
getKind() == HeaderModulePrecompileJobClass;
414 void anchor()
override;
416 const char *ModuleName;
420 const char *ModuleName);
423 return A->
getKind() == HeaderModulePrecompileJobClass;
427 getInputs().push_back(Input);
434 void anchor()
override;
440 return A->
getKind() == AnalyzeJobClass;
445 void anchor()
override;
451 return A->
getKind() == MigrateJobClass;
456 void anchor()
override;
462 return A->
getKind() == CompileJobClass;
467 void anchor()
override;
473 return A->
getKind() == BackendJobClass;
478 void anchor()
override;
484 return A->
getKind() == AssembleJobClass;
489 void anchor()
override;
495 return A->
getKind() == LinkJobClass;
500 void anchor()
override;
506 return A->
getKind() == LipoJobClass;
511 void anchor()
override;
517 return A->
getKind() == DsymutilJobClass;
522 void anchor()
override;
528 return A->
getKind() == VerifyDebugInfoJobClass ||
529 A->
getKind() == VerifyPCHJobClass;
534 void anchor()
override;
540 return A->
getKind() == VerifyDebugInfoJobClass;
545 void anchor()
override;
551 return A->
getKind() == VerifyPCHJobClass;
556 void anchor()
override;
563 return A->
getKind() == OffloadBundlingJobClass;
568 void anchor()
override;
584 StringRef DependentBoundArch,
586 : DependentToolChain(DependentToolChain),
587 DependentBoundArch(DependentBoundArch),
588 DependentOffloadKind(DependentOffloadKind) {}
603 DependentActionInfoArray.push_back({TC, BoundArch, Kind});
608 return DependentActionInfoArray;
612 return A->
getKind() == OffloadUnbundlingJobClass;
619 #endif // LLVM_CLANG_DRIVER_ACTION_H Type that provides information about the actions that depend on this unbundling action.
static bool classof(const Action *A)
Action(ActionClass Kind, Action *Input, types::ID Type)
bool isCollapsingWithNextDependentActionLegal() const
Return true if this function can be collapsed with others.
const OffloadKindList & getOffloadKinds() const
ActionList::size_type size_type
Specialize PointerLikeTypeTraits to allow LazyGenerationalUpdatePtr to be placed into a PointerUnion...
DependentActionInfo(const ToolChain *DependentToolChain, StringRef DependentBoundArch, const OffloadKind DependentOffloadKind)
The base class of the type hierarchy.
static bool classof(const Action *A)
bool isHostOffloading(OffloadKind OKind) const
Check if this action have any offload kinds.
Action(ActionClass Kind, types::ID Type)
Type used to communicate device actions.
const char * getClassName() const
void registerDependentActionInfo(const ToolChain *TC, StringRef BoundArch, OffloadKind Kind)
Register information about a dependent action.
StringRef DependentBoundArch
The bound architecture of the dependent action.
llvm::iterator_range< input_const_iterator > input_const_range
static bool classof(const Action *A)
Type used to communicate host actions.
const ToolChain * getToolChain() const
bool isOffloading(OffloadKind OKind) const
Action - Represent an abstract compilation step to perform.
static bool classof(const Action *A)
input_const_iterator input_begin() const
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified...
types::ID getType() const
static bool classof(const Action *A)
bool isDeviceOffloading(OffloadKind OKind) const
OffloadKind getOffloadingDeviceKind() const
llvm::iterator_range< input_iterator > input_range
static bool classof(const Action *A)
input_iterator input_begin()
input_iterator input_end()
const ToolChainList & getToolChains() const
const char * getBoundArch() const
static bool classof(const Action *A)
static bool classof(const Action *A)
ActionList::const_iterator input_const_iterator
ActionClass getKind() const
const ActionList & getInputs() const
static bool classof(const Action *A)
static bool classof(const Action *A)
const BoundArchList & getBoundArchs() const
input_const_iterator input_end() const
static bool classof(const Action *A)
void setCannotBeCollapsedWithNextDependentAction()
Mark this action as not legal to collapse.
const ActionList & getActions() const
Get each of the individual arrays.
HostDependence(Action &A, const ToolChain &TC, const char *BoundArch, const unsigned OffloadKinds)
Action(ActionClass Kind, Action *Input)
ArrayRef< DependentActionInfo > getDependentActionsInfo() const
Return the information about all depending actions.
static bool classof(const Action *A)
An offload action combines host or/and device actions according to the programming model implementati...
input_const_range inputs() const
static bool classof(const Action *A)
unsigned getOffloadingHostActiveKinds() const
Dataflow Directional Tag Classes.
llvm::function_ref< void(Action *, const ToolChain *, const char *)> OffloadActionWorkTy
Action(ActionClass Kind, const ActionList &Inputs, types::ID Type)
Action * getAction() const
ActionList::iterator input_iterator
unsigned getOffloadKinds() const
static bool classof(const Action *A)
static Decl::Kind getKind(const Decl *D)
static bool classof(const Action *A)
static bool classof(const Action *A)
static bool classof(const Action *A)
const char * getOffloadingArch() const
StringRef getArchName() const
static bool classof(const Action *A)