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