10 #ifndef LLVM_CLANG_DRIVER_ACTION_H 11 #define LLVM_CLANG_DRIVER_ACTION_H 16 #include "llvm/ADT/STLExtras.h" 17 #include "llvm/ADT/SmallVector.h" 72 JobClassFirst = PreprocessJobClass,
73 JobClassLast = OffloadUnbundlingJobClass
102 bool CanBeCollapsedWithNextDependentAction =
true;
112 unsigned ActiveOffloadKindMask = 0u;
116 const char *OffloadingArch =
nullptr;
124 : Kind(Kind), Type(Type), Inputs(Inputs) {}
137 size_type
size()
const {
return Inputs.size(); }
141 input_range
inputs() {
return input_range(input_begin(), input_end()); }
142 input_const_iterator
input_begin()
const {
return Inputs.begin(); }
143 input_const_iterator
input_end()
const {
return Inputs.end(); }
145 return input_const_range(input_begin(), input_end());
150 CanBeCollapsedWithNextDependentAction =
false;
154 return CanBeCollapsedWithNextDependentAction;
158 std::string getOffloadingKindPrefix()
const;
164 llvm::StringRef NormalizedTriple,
165 bool CreatePrefixForHost =
false);
167 static StringRef GetOffloadKindName(
OffloadKind Kind);
171 void propagateDeviceOffloadInfo(
OffloadKind OKind,
const char *OArch);
174 void propagateHostOffloadInfo(
unsigned OKinds,
const char *OArch);
177 void propagateOffloadInfo(
const Action *A);
180 return ActiveOffloadKindMask;
188 return ActiveOffloadKindMask & OKind;
191 return OffloadingDeviceKind == OKind;
194 return isHostOffloading(OKind) || isDeviceOffloading(OKind);
199 virtual void anchor();
200 const llvm::opt::Arg &Input;
208 return A->
getKind() == InputClass;
213 virtual void anchor();
224 return A->
getKind() == BindArchClass;
232 virtual void anchor();
252 ToolChainList DeviceToolChains;
254 BoundArchList DeviceBoundArchs;
256 OffloadKindList DeviceOffloadKinds;
269 return DeviceOffloadKinds;
281 const char *HostBoundArch =
nullptr;
283 unsigned HostOffloadKinds = 0u;
287 const unsigned OffloadKinds)
288 : HostAction(A), HostToolChain(TC), HostBoundArch(BoundArch),
289 HostOffloadKinds(OffloadKinds){};
300 typedef llvm::function_ref<void(Action *, const ToolChain *, const char *)>
326 void doOnEachDependence(
bool IsHostDependence,
330 bool hasHostDependence()
const;
334 Action *getHostDependence()
const;
339 bool hasSingleDeviceDependence(
bool DoNotConsiderHostActions =
false)
const;
345 getSingleDeviceDependence(
bool DoNotConsiderHostActions =
false)
const;
351 virtual void anchor();
358 return (A->
getKind() >= JobClassFirst &&
364 void anchor()
override;
369 return A->
getKind() == PreprocessJobClass;
374 void anchor()
override;
379 return A->
getKind() == PrecompileJobClass;
384 void anchor()
override;
389 return A->
getKind() == AnalyzeJobClass;
394 void anchor()
override;
399 return A->
getKind() == MigrateJobClass;
404 void anchor()
override;
409 return A->
getKind() == CompileJobClass;
414 void anchor()
override;
419 return A->
getKind() == BackendJobClass;
424 void anchor()
override;
429 return A->
getKind() == AssembleJobClass;
434 void anchor()
override;
439 return A->
getKind() == LinkJobClass;
444 void anchor()
override;
449 return A->
getKind() == LipoJobClass;
454 void anchor()
override;
459 return A->
getKind() == DsymutilJobClass;
464 void anchor()
override;
468 return A->
getKind() == VerifyDebugInfoJobClass ||
469 A->
getKind() == VerifyPCHJobClass;
474 void anchor()
override;
478 return A->
getKind() == VerifyDebugInfoJobClass;
483 void anchor()
override;
487 return A->
getKind() == VerifyPCHJobClass;
492 void anchor()
override;
499 return A->
getKind() == OffloadBundlingJobClass;
504 void anchor()
override;
517 StringRef DependentBoundArch,
519 : DependentToolChain(DependentToolChain),
520 DependentBoundArch(DependentBoundArch),
521 DependentOffloadKind(DependentOffloadKind){};
536 DependentActionInfoArray.push_back({TC, BoundArch, Kind});
541 return DependentActionInfoArray;
545 return A->
getKind() == OffloadUnbundlingJobClass;
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
llvm::iterator_range< input_iterator > input_range
DominatorTree GraphTraits specialization so the DominatorTree can be iterable by generic graph iterat...
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
llvm::function_ref< void(Action *, const ToolChain *, const char *)> OffloadActionWorkTy
void registerDependentActionInfo(const ToolChain *TC, StringRef BoundArch, OffloadKind Kind)
Register information about a dependent action.
StringRef DependentBoundArch
The bound architecture of the dependent action.
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
types::ID getType() const
static bool classof(const Action *A)
ActionList::size_type size_type
bool isDeviceOffloading(OffloadKind OKind) const
OffloadKind getOffloadingDeviceKind() const
static bool classof(const Action *A)
input_iterator input_begin()
SmallVector< const char *, 3 > BoundArchList
input_iterator input_end()
const ToolChainList & getToolChains() const
const char * getBoundArch() const
SmallVector< const ToolChain *, 3 > ToolChainList
static bool classof(const Action *A)
static bool classof(const Action *A)
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.
Action(ActionClass Kind, const ActionList &Inputs, types::ID Type)
Action * getAction() const
llvm::iterator_range< input_const_iterator > input_const_range
SmallVector< OffloadKind, 3 > OffloadKindList
ActionList::const_iterator input_const_iterator
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)