1f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===--- Action.h - Abstract compilation steps ------------------*- C++ -*-===// 2f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 3f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// The LLVM Compiler Infrastructure 4f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 5f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// This file is distributed under the University of Illinois Open Source 6f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// License. See LICENSE.TXT for details. 7f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 8f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===// 9f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 10f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#ifndef LLVM_CLANG_DRIVER_ACTION_H 11f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#define LLVM_CLANG_DRIVER_ACTION_H 12f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 13f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/Basic/Cuda.h" 14f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/Driver/Types.h" 15f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/Driver/Util.h" 16f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/STLExtras.h" 17f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/SmallVector.h" 18f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 19f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotnamespace llvm { 20f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 21f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass StringRef; 22f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 23f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotnamespace opt { 24f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class Arg; 25f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 26f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 27f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 28f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotnamespace clang { 29f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotnamespace driver { 30f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 31f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ToolChain; 32f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 33f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Action - Represent an abstract compilation step to perform. 34f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 35f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// An action represents an edge in the compilation graph; typically 36f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// it is a job to transform an input using some tool. 37f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 38f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// The current driver is hard wired to expect actions which produce a 39f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// single primary output, at least in terms of controlling the 40f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// compilation. Actions can produce auxiliary files, but can only 41f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// produce a single output to feed into subsequent actions. 42f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 43f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Actions are usually owned by a Compilation, which creates new 44f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// actions via MakeAction(). 45f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass Action { 46f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 47f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot typedef ActionList::size_type size_type; 48f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot typedef ActionList::iterator input_iterator; 49f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot typedef ActionList::const_iterator input_const_iterator; 50f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot typedef llvm::iterator_range<input_iterator> input_range; 51f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot typedef llvm::iterator_range<input_const_iterator> input_const_range; 52f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 53f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot enum ActionClass { 54f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot InputClass = 0, 55f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot BindArchClass, 56f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OffloadClass, 57f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot PreprocessJobClass, 58f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot PrecompileJobClass, 59f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot AnalyzeJobClass, 60f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MigrateJobClass, 61f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot CompileJobClass, 62f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot BackendJobClass, 63f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot AssembleJobClass, 64f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot LinkJobClass, 65f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot LipoJobClass, 66f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DsymutilJobClass, 67f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot VerifyDebugInfoJobClass, 68f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot VerifyPCHJobClass, 69f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OffloadBundlingJobClass, 70f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OffloadUnbundlingJobClass, 71f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 72f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot JobClassFirst = PreprocessJobClass, 73f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot JobClassLast = OffloadUnbundlingJobClass 74f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 75f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 76f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // The offloading kind determines if this action is binded to a particular 77f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // programming model. Each entry reserves one bit. We also have a special kind 78f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // to designate the host offloading tool chain. 79f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot enum OffloadKind { 80f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OFK_None = 0x00, 81f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // The host offloading tool chain. 82f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OFK_Host = 0x01, 83f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // The device offloading tool chains - one bit for each programming model. 84f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OFK_Cuda = 0x02, 85f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OFK_OpenMP = 0x04, 86f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 87f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 88f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static const char *getClassName(ActionClass AC); 89f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 90f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate: 91f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ActionClass Kind; 92f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 93f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The output type of this action. 94f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot types::ID Type; 95f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 96f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ActionList Inputs; 97f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 98f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Flag that is set to true if this action can be collapsed with others 99f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// actions that depend on it. This is true by default and set to false when 100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the action is used by two different tool chains, which is enabled by the 101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// offloading support implementation. 102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool CanBeCollapsedWithNextDependentAction = true; 103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprotected: 105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Offload information. 107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The host offloading kind - a combination of kinds encoded in a mask. 110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Multiple programming models may be supported simultaneously by the same 111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// host. 112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned ActiveOffloadKindMask = 0u; 113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Offloading kind of the device. 114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OffloadKind OffloadingDeviceKind = OFK_None; 115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The Offloading architecture associated with this action. 116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const char *OffloadingArch = nullptr; 117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Action(ActionClass Kind, types::ID Type) : Action(Kind, ActionList(), Type) {} 119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Action(ActionClass Kind, Action *Input, types::ID Type) 120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : Action(Kind, ActionList({Input}), Type) {} 121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Action(ActionClass Kind, Action *Input) 122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : Action(Kind, ActionList({Input}), Input->getType()) {} 123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Action(ActionClass Kind, const ActionList &Inputs, types::ID Type) 124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : Kind(Kind), Type(Type), Inputs(Inputs) {} 125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot virtual ~Action(); 128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const char *getClassName() const { return Action::getClassName(getKind()); } 130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ActionClass getKind() const { return Kind; } 132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot types::ID getType() const { return Type; } 133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ActionList &getInputs() { return Inputs; } 135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const ActionList &getInputs() const { return Inputs; } 136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot size_type size() const { return Inputs.size(); } 138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot input_iterator input_begin() { return Inputs.begin(); } 140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot input_iterator input_end() { return Inputs.end(); } 141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot input_range inputs() { return input_range(input_begin(), input_end()); } 142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot input_const_iterator input_begin() const { return Inputs.begin(); } 143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot input_const_iterator input_end() const { return Inputs.end(); } 144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot input_const_range inputs() const { 145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return input_const_range(input_begin(), input_end()); 146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Mark this action as not legal to collapse. 149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setCannotBeCollapsedWithNextDependentAction() { 150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot CanBeCollapsedWithNextDependentAction = false; 151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return true if this function can be collapsed with others. 153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isCollapsingWithNextDependentActionLegal() const { 154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return CanBeCollapsedWithNextDependentAction; 155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return a string containing the offload kind of the action. 158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::string getOffloadingKindPrefix() const; 159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return a string that can be used as prefix in order to generate unique 160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// files for each offloading kind. By default, no prefix is used for 161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// non-device kinds, except if \a CreatePrefixForHost is set. 162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static std::string 163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot GetOffloadingFileNamePrefix(OffloadKind Kind, 164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot llvm::StringRef NormalizedTriple, 165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool CreatePrefixForHost = false); 166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return a string containing a offload kind name. 167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static StringRef GetOffloadKindName(OffloadKind Kind); 168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Set the device offload info of this action and propagate it to its 170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// dependences. 171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void propagateDeviceOffloadInfo(OffloadKind OKind, const char *OArch); 172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Append the host offload info of this action and propagate it to its 173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// dependences. 174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void propagateHostOffloadInfo(unsigned OKinds, const char *OArch); 175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Set the offload info of this action to be the same as the provided action, 176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// and propagate it to its dependences. 177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void propagateOffloadInfo(const Action *A); 178f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned getOffloadingHostActiveKinds() const { 180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return ActiveOffloadKindMask; 181f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 182f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OffloadKind getOffloadingDeviceKind() const { return OffloadingDeviceKind; } 183f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const char *getOffloadingArch() const { return OffloadingArch; } 184f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 185f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Check if this action have any offload kinds. Note that host offload kinds 186f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// are only set if the action is a dependence to a host offload action. 187f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isHostOffloading(OffloadKind OKind) const { 188f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return ActiveOffloadKindMask & OKind; 189f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 190f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isDeviceOffloading(OffloadKind OKind) const { 191f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return OffloadingDeviceKind == OKind; 192f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 193f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isOffloading(OffloadKind OKind) const { 194f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return isHostOffloading(OKind) || isDeviceOffloading(OKind); 195f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 196f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 197f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 198f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass InputAction : public Action { 199f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot virtual void anchor(); 200f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const llvm::opt::Arg &Input; 201f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 202f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 203f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot InputAction(const llvm::opt::Arg &Input, types::ID Type); 204f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 205f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const llvm::opt::Arg &getInputArg() const { return Input; } 206f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 207f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Action *A) { 208f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() == InputClass; 209f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 210f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 211f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 212f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass BindArchAction : public Action { 213f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot virtual void anchor(); 214f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The architecture to bind, or 0 if the default architecture 215f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// should be bound. 216f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef ArchName; 217f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 218f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 219f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot BindArchAction(Action *Input, StringRef ArchName); 220f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 221f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef getArchName() const { return ArchName; } 222f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 223f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Action *A) { 224f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() == BindArchClass; 225f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 226f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 227f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 228f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// An offload action combines host or/and device actions according to the 229f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// programming model implementation needs and propagates the offloading kind to 230f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// its dependences. 231f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass OffloadAction final : public Action { 232f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot virtual void anchor(); 233f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 234f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 235f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Type used to communicate device actions. It associates bound architecture, 236f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// toolchain, and offload kind to each action. 237f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class DeviceDependences final { 238f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot public: 239f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot typedef SmallVector<const ToolChain *, 3> ToolChainList; 240f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot typedef SmallVector<const char *, 3> BoundArchList; 241f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot typedef SmallVector<OffloadKind, 3> OffloadKindList; 242f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 243f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot private: 244f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Lists that keep the information for each dependency. All the lists are 245f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // meant to be updated in sync. We are adopting separate lists instead of a 246f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // list of structs, because that simplifies forwarding the actions list to 247f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // initialize the inputs of the base Action class. 248f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 249f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The dependence actions. 250f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ActionList DeviceActions; 251f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The offloading toolchains that should be used with the action. 252f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ToolChainList DeviceToolChains; 253f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The architectures that should be used with this action. 254f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot BoundArchList DeviceBoundArchs; 255f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The offload kind of each dependence. 256f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OffloadKindList DeviceOffloadKinds; 257f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 258f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot public: 259f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Add a action along with the associated toolchain, bound arch, and 260f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// offload kind. 261f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void add(Action &A, const ToolChain &TC, const char *BoundArch, 262f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OffloadKind OKind); 263f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 264f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get each of the individual arrays. 265f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const ActionList &getActions() const { return DeviceActions; }; 266f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const ToolChainList &getToolChains() const { return DeviceToolChains; }; 267f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const BoundArchList &getBoundArchs() const { return DeviceBoundArchs; }; 268f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const OffloadKindList &getOffloadKinds() const { 269f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return DeviceOffloadKinds; 270f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 271f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 272f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 273f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Type used to communicate host actions. It associates bound architecture, 274f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// toolchain, and offload kinds to the host action. 275f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class HostDependence final { 276f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The dependence action. 277f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Action &HostAction; 278f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The offloading toolchain that should be used with the action. 279f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const ToolChain &HostToolChain; 280f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The architectures that should be used with this action. 281f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const char *HostBoundArch = nullptr; 282f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The offload kind of each dependence. 283f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned HostOffloadKinds = 0u; 284f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 285f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot public: 286f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot HostDependence(Action &A, const ToolChain &TC, const char *BoundArch, 287f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const unsigned OffloadKinds) 288f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : HostAction(A), HostToolChain(TC), HostBoundArch(BoundArch), 289f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot HostOffloadKinds(OffloadKinds){}; 290f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Constructor version that obtains the offload kinds from the device 291f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// dependencies. 292f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot HostDependence(Action &A, const ToolChain &TC, const char *BoundArch, 293f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const DeviceDependences &DDeps); 294f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Action *getAction() const { return &HostAction; }; 295f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const ToolChain *getToolChain() const { return &HostToolChain; }; 296f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const char *getBoundArch() const { return HostBoundArch; }; 297f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned getOffloadKinds() const { return HostOffloadKinds; }; 298f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 299f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 300f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot typedef llvm::function_ref<void(Action *, const ToolChain *, const char *)> 301f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OffloadActionWorkTy; 302f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 303f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate: 304f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The host offloading toolchain that should be used with the action. 305f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const ToolChain *HostTC = nullptr; 306f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 307f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The tool chains associated with the list of actions. 308f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DeviceDependences::ToolChainList DevToolChains; 309f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 310f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 311f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OffloadAction(const HostDependence &HDep); 312f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OffloadAction(const DeviceDependences &DDeps, types::ID Ty); 313f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OffloadAction(const HostDependence &HDep, const DeviceDependences &DDeps); 314f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 315f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Execute the work specified in \a Work on the host dependence. 316f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void doOnHostDependence(const OffloadActionWorkTy &Work) const; 317f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 318f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Execute the work specified in \a Work on each device dependence. 319f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void doOnEachDeviceDependence(const OffloadActionWorkTy &Work) const; 320f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 321f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Execute the work specified in \a Work on each dependence. 322f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void doOnEachDependence(const OffloadActionWorkTy &Work) const; 323f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 324f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Execute the work specified in \a Work on each host or device dependence if 325f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \a IsHostDependenceto is true or false, respectively. 326f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void doOnEachDependence(bool IsHostDependence, 327f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const OffloadActionWorkTy &Work) const; 328f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 329f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return true if the action has a host dependence. 330f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool hasHostDependence() const; 331f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 332f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return the host dependence of this action. This function is only expected 333f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// to be called if the host dependence exists. 334f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Action *getHostDependence() const; 335f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 336f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return true if the action has a single device dependence. If \a 337f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// DoNotConsiderHostActions is set, ignore the host dependence, if any, while 338f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// accounting for the number of dependences. 339f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool hasSingleDeviceDependence(bool DoNotConsiderHostActions = false) const; 340f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 341f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return the single device dependence of this action. This function is only 342f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// expected to be called if a single device dependence exists. If \a 343f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// DoNotConsiderHostActions is set, a host dependence is allowed. 344f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Action * 345f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot getSingleDeviceDependence(bool DoNotConsiderHostActions = false) const; 346f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 347f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Action *A) { return A->getKind() == OffloadClass; } 348f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 349f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 350f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass JobAction : public Action { 351f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot virtual void anchor(); 352f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprotected: 353f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot JobAction(ActionClass Kind, Action *Input, types::ID Type); 354f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot JobAction(ActionClass Kind, const ActionList &Inputs, types::ID Type); 355f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 356f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 357f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Action *A) { 358f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return (A->getKind() >= JobClassFirst && 359f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot A->getKind() <= JobClassLast); 360f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 361f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 362f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 363f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass PreprocessJobAction : public JobAction { 364f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void anchor() override; 365f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 366f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot PreprocessJobAction(Action *Input, types::ID OutputType); 367f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 368f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Action *A) { 369f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() == PreprocessJobClass; 370f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 371f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 372f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 373f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass PrecompileJobAction : public JobAction { 374f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void anchor() override; 375f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 376f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot PrecompileJobAction(Action *Input, types::ID OutputType); 377f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 378f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Action *A) { 379f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() == PrecompileJobClass; 380f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 381f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 382f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 383f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AnalyzeJobAction : public JobAction { 384f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void anchor() override; 385f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 386f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot AnalyzeJobAction(Action *Input, types::ID OutputType); 387f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 388f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Action *A) { 389f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() == AnalyzeJobClass; 390f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 391f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 392f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 393f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MigrateJobAction : public JobAction { 394f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void anchor() override; 395f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 396f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MigrateJobAction(Action *Input, types::ID OutputType); 397f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 398f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Action *A) { 399f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() == MigrateJobClass; 400f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 401f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 402f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 403f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CompileJobAction : public JobAction { 404f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void anchor() override; 405f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 406f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot CompileJobAction(Action *Input, types::ID OutputType); 407f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 408f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Action *A) { 409f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() == CompileJobClass; 410f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 411f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 412f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 413f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass BackendJobAction : public JobAction { 414f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void anchor() override; 415f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 416f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot BackendJobAction(Action *Input, types::ID OutputType); 417f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 418f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Action *A) { 419f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() == BackendJobClass; 420f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 421f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 422f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 423f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AssembleJobAction : public JobAction { 424f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void anchor() override; 425f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 426f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot AssembleJobAction(Action *Input, types::ID OutputType); 427f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 428f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Action *A) { 429f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() == AssembleJobClass; 430f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 431f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 432f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 433f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass LinkJobAction : public JobAction { 434f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void anchor() override; 435f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 436f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot LinkJobAction(ActionList &Inputs, types::ID Type); 437f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 438f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Action *A) { 439f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() == LinkJobClass; 440f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 441f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 442f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 443f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass LipoJobAction : public JobAction { 444f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void anchor() override; 445f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 446f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot LipoJobAction(ActionList &Inputs, types::ID Type); 447f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 448f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Action *A) { 449f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() == LipoJobClass; 450f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 451f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 452f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 453f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass DsymutilJobAction : public JobAction { 454f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void anchor() override; 455f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 456f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DsymutilJobAction(ActionList &Inputs, types::ID Type); 457f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 458f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Action *A) { 459f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() == DsymutilJobClass; 460f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 461f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 462f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 463f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass VerifyJobAction : public JobAction { 464f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void anchor() override; 465f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 466f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot VerifyJobAction(ActionClass Kind, Action *Input, types::ID Type); 467f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Action *A) { 468f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() == VerifyDebugInfoJobClass || 469f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot A->getKind() == VerifyPCHJobClass; 470f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 471f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 472f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 473f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass VerifyDebugInfoJobAction : public VerifyJobAction { 474f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void anchor() override; 475f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 476f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot VerifyDebugInfoJobAction(Action *Input, types::ID Type); 477f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Action *A) { 478f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() == VerifyDebugInfoJobClass; 479f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 480f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 481f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 482f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass VerifyPCHJobAction : public VerifyJobAction { 483f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void anchor() override; 484f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 485f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot VerifyPCHJobAction(Action *Input, types::ID Type); 486f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Action *A) { 487f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() == VerifyPCHJobClass; 488f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 489f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 490f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 491f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass OffloadBundlingJobAction : public JobAction { 492f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void anchor() override; 493f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 494f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 495f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Offloading bundling doesn't change the type of output. 496f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OffloadBundlingJobAction(ActionList &Inputs); 497f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 498f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Action *A) { 499f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() == OffloadBundlingJobClass; 500f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 501f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 502f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 503f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass OffloadUnbundlingJobAction final : public JobAction { 504f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void anchor() override; 505f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 506f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 507f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Type that provides information about the actions that depend on this 508f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// unbundling action. 509f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot struct DependentActionInfo final { 510f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief The tool chain of the dependent action. 511f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const ToolChain *DependentToolChain = nullptr; 512f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief The bound architecture of the dependent action. 513f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef DependentBoundArch; 514f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief The offload kind of the dependent action. 515f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const OffloadKind DependentOffloadKind = OFK_None; 516f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DependentActionInfo(const ToolChain *DependentToolChain, 517f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef DependentBoundArch, 518f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const OffloadKind DependentOffloadKind) 519f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : DependentToolChain(DependentToolChain), 520f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DependentBoundArch(DependentBoundArch), 521f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DependentOffloadKind(DependentOffloadKind){}; 522f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 523f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 524f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate: 525f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Container that keeps information about each dependence of this unbundling 526f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// action. 527f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SmallVector<DependentActionInfo, 6> DependentActionInfoArray; 528f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 529f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 530f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Offloading unbundling doesn't change the type of output. 531f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OffloadUnbundlingJobAction(Action *Input); 532f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 533f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Register information about a dependent action. 534f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void registerDependentActionInfo(const ToolChain *TC, StringRef BoundArch, 535f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OffloadKind Kind) { 536f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DependentActionInfoArray.push_back({TC, BoundArch, Kind}); 537f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 538f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 539f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return the information about all depending actions. 540f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ArrayRef<DependentActionInfo> getDependentActionsInfo() const { 541f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return DependentActionInfoArray; 542f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 543f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 544f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool classof(const Action *A) { 545f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return A->getKind() == OffloadUnbundlingJobClass; 546f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 547f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 548f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 549f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} // end namespace driver 550f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} // end namespace clang 551f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 552f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#endif 553