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" 77 JobClassFirst = PreprocessJobClass,
78 JobClassLast = OffloadWrapperJobClass
110 bool CanBeCollapsedWithNextDependentAction =
true;
120 unsigned ActiveOffloadKindMask = 0u;
126 const char *OffloadingArch =
nullptr;
134 : Kind(Kind), Type(Type), Inputs(Inputs) {}
160 CanBeCollapsedWithNextDependentAction =
false;
165 return CanBeCollapsedWithNextDependentAction;
169 std::string getOffloadingKindPrefix()
const;
176 StringRef NormalizedTriple,
177 bool CreatePrefixForHost =
false);
180 static StringRef GetOffloadKindName(
OffloadKind Kind);
184 void propagateDeviceOffloadInfo(
OffloadKind OKind,
const char *OArch);
188 void propagateHostOffloadInfo(
unsigned OKinds,
const char *OArch);
192 void propagateOffloadInfo(
const Action *A);
195 return ActiveOffloadKindMask;
204 return ActiveOffloadKindMask & OKind;
207 return OffloadingDeviceKind == OKind;
210 return isHostOffloading(OKind) || isDeviceOffloading(OKind);
215 const llvm::opt::Arg &Input;
217 virtual void anchor();
225 return A->
getKind() == InputClass;
230 virtual void anchor();
242 return A->
getKind() == BindArchClass;
250 virtual void anchor();
290 return DeviceOffloadKinds;
304 const char *HostBoundArch =
nullptr;
307 unsigned HostOffloadKinds = 0u;
311 const unsigned OffloadKinds)
312 : HostAction(A), HostToolChain(TC), HostBoundArch(BoundArch),
313 HostOffloadKinds(OffloadKinds) {}
326 llvm::function_ref<void(Action *, const ToolChain *, const char *)>;
351 void doOnEachDependence(
bool IsHostDependence,
355 bool hasHostDependence()
const;
359 Action *getHostDependence()
const;
364 bool hasSingleDeviceDependence(
bool DoNotConsiderHostActions =
false)
const;
370 getSingleDeviceDependence(
bool DoNotConsiderHostActions =
false)
const;
376 virtual void anchor();
384 return (A->
getKind() >= JobClassFirst &&
390 void anchor()
override;
396 return A->
getKind() == PreprocessJobClass;
401 void anchor()
override;
410 return A->
getKind() == PrecompileJobClass ||
411 A->
getKind() == HeaderModulePrecompileJobClass;
416 void anchor()
override;
418 const char *ModuleName;
422 const char *ModuleName);
425 return A->
getKind() == HeaderModulePrecompileJobClass;
429 getInputs().push_back(Input);
436 void anchor()
override;
442 return A->
getKind() == AnalyzeJobClass;
447 void anchor()
override;
453 return A->
getKind() == MigrateJobClass;
458 void anchor()
override;
464 return A->
getKind() == CompileJobClass;
469 void anchor()
override;
475 return A->
getKind() == BackendJobClass;
480 void anchor()
override;
486 return A->
getKind() == AssembleJobClass;
491 void anchor()
override;
497 return A->
getKind() == IfsMergeJobClass;
502 void anchor()
override;
508 return A->
getKind() == LinkJobClass;
513 void anchor()
override;
519 return A->
getKind() == LipoJobClass;
524 void anchor()
override;
530 return A->
getKind() == DsymutilJobClass;
535 void anchor()
override;
541 return A->
getKind() == VerifyDebugInfoJobClass ||
542 A->
getKind() == VerifyPCHJobClass;
547 void anchor()
override;
553 return A->
getKind() == VerifyDebugInfoJobClass;
558 void anchor()
override;
564 return A->
getKind() == VerifyPCHJobClass;
569 void anchor()
override;
576 return A->
getKind() == OffloadBundlingJobClass;
581 void anchor()
override;
597 StringRef DependentBoundArch,
599 : DependentToolChain(DependentToolChain),
600 DependentBoundArch(DependentBoundArch),
601 DependentOffloadKind(DependentOffloadKind) {}
616 DependentActionInfoArray.push_back({TC, BoundArch, Kind});
621 return DependentActionInfoArray;
625 return A->
getKind() == OffloadUnbundlingJobClass;
630 void anchor()
override;
636 return A->
getKind() == OffloadWrapperJobClass;
643 #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...
static bool classof(const Action *A)
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)
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)