10 #ifndef LLVM_CLANG_DRIVER_ACTION_H 11 #define LLVM_CLANG_DRIVER_ACTION_H 16 #include "llvm/ADT/ArrayRef.h" 17 #include "llvm/ADT/STLExtras.h" 18 #include "llvm/ADT/SmallVector.h" 19 #include "llvm/ADT/StringRef.h" 20 #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;
405 return A->
getKind() == PrecompileJobClass;
410 void anchor()
override;
416 return A->
getKind() == AnalyzeJobClass;
421 void anchor()
override;
427 return A->
getKind() == MigrateJobClass;
432 void anchor()
override;
438 return A->
getKind() == CompileJobClass;
443 void anchor()
override;
449 return A->
getKind() == BackendJobClass;
454 void anchor()
override;
460 return A->
getKind() == AssembleJobClass;
465 void anchor()
override;
471 return A->
getKind() == LinkJobClass;
476 void anchor()
override;
482 return A->
getKind() == LipoJobClass;
487 void anchor()
override;
493 return A->
getKind() == DsymutilJobClass;
498 void anchor()
override;
504 return A->
getKind() == VerifyDebugInfoJobClass ||
505 A->
getKind() == VerifyPCHJobClass;
510 void anchor()
override;
516 return A->
getKind() == VerifyDebugInfoJobClass;
521 void anchor()
override;
527 return A->
getKind() == VerifyPCHJobClass;
532 void anchor()
override;
539 return A->
getKind() == OffloadBundlingJobClass;
544 void anchor()
override;
560 StringRef DependentBoundArch,
562 : DependentToolChain(DependentToolChain),
563 DependentBoundArch(DependentBoundArch),
564 DependentOffloadKind(DependentOffloadKind) {}
579 DependentActionInfoArray.push_back({TC, BoundArch, Kind});
584 return DependentActionInfoArray;
588 return A->
getKind() == OffloadUnbundlingJobClass;
595 #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
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
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)