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" 76 JobClassFirst = PreprocessJobClass,
77 JobClassLast = OffloadUnbundlingJobClass
109 bool CanBeCollapsedWithNextDependentAction =
true;
119 unsigned ActiveOffloadKindMask = 0u;
125 const char *OffloadingArch =
nullptr;
133 : Kind(Kind), Type(Type), Inputs(Inputs) {}
159 CanBeCollapsedWithNextDependentAction =
false;
164 return CanBeCollapsedWithNextDependentAction;
168 std::string getOffloadingKindPrefix()
const;
175 StringRef NormalizedTriple,
176 bool CreatePrefixForHost =
false);
179 static StringRef GetOffloadKindName(
OffloadKind Kind);
183 void propagateDeviceOffloadInfo(
OffloadKind OKind,
const char *OArch);
187 void propagateHostOffloadInfo(
unsigned OKinds,
const char *OArch);
191 void propagateOffloadInfo(
const Action *A);
194 return ActiveOffloadKindMask;
203 return ActiveOffloadKindMask & OKind;
206 return OffloadingDeviceKind == OKind;
209 return isHostOffloading(OKind) || isDeviceOffloading(OKind);
214 const llvm::opt::Arg &Input;
216 virtual void anchor();
224 return A->
getKind() == InputClass;
229 virtual void anchor();
241 return A->
getKind() == BindArchClass;
249 virtual void anchor();
289 return DeviceOffloadKinds;
303 const char *HostBoundArch =
nullptr;
306 unsigned HostOffloadKinds = 0u;
310 const unsigned OffloadKinds)
311 : HostAction(A), HostToolChain(TC), HostBoundArch(BoundArch),
312 HostOffloadKinds(OffloadKinds) {}
325 llvm::function_ref<void(Action *, const ToolChain *, const char *)>;
350 void doOnEachDependence(
bool IsHostDependence,
354 bool hasHostDependence()
const;
358 Action *getHostDependence()
const;
363 bool hasSingleDeviceDependence(
bool DoNotConsiderHostActions =
false)
const;
369 getSingleDeviceDependence(
bool DoNotConsiderHostActions =
false)
const;
375 virtual void anchor();
383 return (A->
getKind() >= JobClassFirst &&
389 void anchor()
override;
395 return A->
getKind() == PreprocessJobClass;
400 void anchor()
override;
409 return A->
getKind() == PrecompileJobClass ||
410 A->
getKind() == HeaderModulePrecompileJobClass;
415 void anchor()
override;
417 const char *ModuleName;
421 const char *ModuleName);
424 return A->
getKind() == HeaderModulePrecompileJobClass;
428 getInputs().push_back(Input);
435 void anchor()
override;
441 return A->
getKind() == AnalyzeJobClass;
446 void anchor()
override;
452 return A->
getKind() == MigrateJobClass;
457 void anchor()
override;
463 return A->
getKind() == CompileJobClass;
468 void anchor()
override;
474 return A->
getKind() == BackendJobClass;
479 void anchor()
override;
485 return A->
getKind() == AssembleJobClass;
490 void anchor()
override;
496 return A->
getKind() == LinkJobClass;
501 void anchor()
override;
507 return A->
getKind() == LipoJobClass;
512 void anchor()
override;
518 return A->
getKind() == DsymutilJobClass;
523 void anchor()
override;
529 return A->
getKind() == VerifyDebugInfoJobClass ||
530 A->
getKind() == VerifyPCHJobClass;
535 void anchor()
override;
541 return A->
getKind() == VerifyDebugInfoJobClass;
546 void anchor()
override;
552 return A->
getKind() == VerifyPCHJobClass;
557 void anchor()
override;
564 return A->
getKind() == OffloadBundlingJobClass;
569 void anchor()
override;
585 StringRef DependentBoundArch,
587 : DependentToolChain(DependentToolChain),
588 DependentBoundArch(DependentBoundArch),
589 DependentOffloadKind(DependentOffloadKind) {}
604 DependentActionInfoArray.push_back({TC, BoundArch, Kind});
609 return DependentActionInfoArray;
613 return A->
getKind() == OffloadUnbundlingJobClass;
620 #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)