Home | History | Annotate | Download | only in Driver
      1 //===--- Action.h - Abstract compilation steps ------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef LLVM_CLANG_DRIVER_ACTION_H
     11 #define LLVM_CLANG_DRIVER_ACTION_H
     12 
     13 #include "clang/Driver/Types.h"
     14 #include "clang/Driver/Util.h"
     15 #include "llvm/ADT/SmallVector.h"
     16 
     17 namespace llvm {
     18 namespace opt {
     19   class Arg;
     20 }
     21 }
     22 
     23 namespace clang {
     24 namespace driver {
     25 
     26 /// Action - Represent an abstract compilation step to perform.
     27 ///
     28 /// An action represents an edge in the compilation graph; typically
     29 /// it is a job to transform an input using some tool.
     30 ///
     31 /// The current driver is hard wired to expect actions which produce a
     32 /// single primary output, at least in terms of controlling the
     33 /// compilation. Actions can produce auxiliary files, but can only
     34 /// produce a single output to feed into subsequent actions.
     35 class Action {
     36 public:
     37   typedef ActionList::size_type size_type;
     38   typedef ActionList::iterator iterator;
     39   typedef ActionList::const_iterator const_iterator;
     40 
     41   enum ActionClass {
     42     InputClass = 0,
     43     BindArchClass,
     44     CudaDeviceClass,
     45     CudaHostClass,
     46     PreprocessJobClass,
     47     PrecompileJobClass,
     48     AnalyzeJobClass,
     49     MigrateJobClass,
     50     CompileJobClass,
     51     BackendJobClass,
     52     AssembleJobClass,
     53     LinkJobClass,
     54     LipoJobClass,
     55     DsymutilJobClass,
     56     VerifyDebugInfoJobClass,
     57     VerifyPCHJobClass,
     58 
     59     JobClassFirst=PreprocessJobClass,
     60     JobClassLast=VerifyPCHJobClass
     61   };
     62 
     63   static const char *getClassName(ActionClass AC);
     64 
     65 private:
     66   ActionClass Kind;
     67 
     68   /// The output type of this action.
     69   types::ID Type;
     70 
     71   ActionList Inputs;
     72 
     73   unsigned OwnsInputs : 1;
     74 
     75 protected:
     76   Action(ActionClass Kind, types::ID Type)
     77     : Kind(Kind), Type(Type), OwnsInputs(true)  {}
     78   Action(ActionClass Kind, std::unique_ptr<Action> Input, types::ID Type)
     79       : Kind(Kind), Type(Type), Inputs(1, Input.release()), OwnsInputs(true) {
     80   }
     81   Action(ActionClass Kind, std::unique_ptr<Action> Input)
     82       : Kind(Kind), Type(Input->getType()), Inputs(1, Input.release()),
     83         OwnsInputs(true) {}
     84   Action(ActionClass Kind, const ActionList &Inputs, types::ID Type)
     85     : Kind(Kind), Type(Type), Inputs(Inputs), OwnsInputs(true) {}
     86 public:
     87   virtual ~Action();
     88 
     89   const char *getClassName() const { return Action::getClassName(getKind()); }
     90 
     91   bool getOwnsInputs() { return OwnsInputs; }
     92   void setOwnsInputs(bool Value) { OwnsInputs = Value; }
     93 
     94   ActionClass getKind() const { return Kind; }
     95   types::ID getType() const { return Type; }
     96 
     97   ActionList &getInputs() { return Inputs; }
     98   const ActionList &getInputs() const { return Inputs; }
     99 
    100   size_type size() const { return Inputs.size(); }
    101 
    102   iterator begin() { return Inputs.begin(); }
    103   iterator end() { return Inputs.end(); }
    104   const_iterator begin() const { return Inputs.begin(); }
    105   const_iterator end() const { return Inputs.end(); }
    106 };
    107 
    108 class InputAction : public Action {
    109   virtual void anchor();
    110   const llvm::opt::Arg &Input;
    111 
    112 public:
    113   InputAction(const llvm::opt::Arg &Input, types::ID Type);
    114 
    115   const llvm::opt::Arg &getInputArg() const { return Input; }
    116 
    117   static bool classof(const Action *A) {
    118     return A->getKind() == InputClass;
    119   }
    120 };
    121 
    122 class BindArchAction : public Action {
    123   virtual void anchor();
    124   /// The architecture to bind, or 0 if the default architecture
    125   /// should be bound.
    126   const char *ArchName;
    127 
    128 public:
    129   BindArchAction(std::unique_ptr<Action> Input, const char *ArchName);
    130 
    131   const char *getArchName() const { return ArchName; }
    132 
    133   static bool classof(const Action *A) {
    134     return A->getKind() == BindArchClass;
    135   }
    136 };
    137 
    138 class CudaDeviceAction : public Action {
    139   virtual void anchor();
    140   /// GPU architecture to bind -- e.g 'sm_35'.
    141   const char *GpuArchName;
    142   /// True when action results are not consumed by the host action (e.g when
    143   /// -fsyntax-only or --cuda-device-only options are used).
    144   bool AtTopLevel;
    145 
    146 public:
    147   CudaDeviceAction(std::unique_ptr<Action> Input, const char *ArchName,
    148                    bool AtTopLevel);
    149 
    150   const char *getGpuArchName() const { return GpuArchName; }
    151   bool isAtTopLevel() const { return AtTopLevel; }
    152 
    153   static bool classof(const Action *A) {
    154     return A->getKind() == CudaDeviceClass;
    155   }
    156 };
    157 
    158 class CudaHostAction : public Action {
    159   virtual void anchor();
    160   ActionList DeviceActions;
    161 
    162 public:
    163   CudaHostAction(std::unique_ptr<Action> Input,
    164                  const ActionList &DeviceActions);
    165   ~CudaHostAction() override;
    166 
    167   const ActionList &getDeviceActions() const { return DeviceActions; }
    168 
    169   static bool classof(const Action *A) { return A->getKind() == CudaHostClass; }
    170 };
    171 
    172 class JobAction : public Action {
    173   virtual void anchor();
    174 protected:
    175   JobAction(ActionClass Kind, std::unique_ptr<Action> Input, types::ID Type);
    176   JobAction(ActionClass Kind, const ActionList &Inputs, types::ID Type);
    177 
    178 public:
    179   static bool classof(const Action *A) {
    180     return (A->getKind() >= JobClassFirst &&
    181             A->getKind() <= JobClassLast);
    182   }
    183 };
    184 
    185 class PreprocessJobAction : public JobAction {
    186   void anchor() override;
    187 public:
    188   PreprocessJobAction(std::unique_ptr<Action> Input, types::ID OutputType);
    189 
    190   static bool classof(const Action *A) {
    191     return A->getKind() == PreprocessJobClass;
    192   }
    193 };
    194 
    195 class PrecompileJobAction : public JobAction {
    196   void anchor() override;
    197 public:
    198   PrecompileJobAction(std::unique_ptr<Action> Input, types::ID OutputType);
    199 
    200   static bool classof(const Action *A) {
    201     return A->getKind() == PrecompileJobClass;
    202   }
    203 };
    204 
    205 class AnalyzeJobAction : public JobAction {
    206   void anchor() override;
    207 public:
    208   AnalyzeJobAction(std::unique_ptr<Action> Input, types::ID OutputType);
    209 
    210   static bool classof(const Action *A) {
    211     return A->getKind() == AnalyzeJobClass;
    212   }
    213 };
    214 
    215 class MigrateJobAction : public JobAction {
    216   void anchor() override;
    217 public:
    218   MigrateJobAction(std::unique_ptr<Action> Input, types::ID OutputType);
    219 
    220   static bool classof(const Action *A) {
    221     return A->getKind() == MigrateJobClass;
    222   }
    223 };
    224 
    225 class CompileJobAction : public JobAction {
    226   void anchor() override;
    227 public:
    228   CompileJobAction(std::unique_ptr<Action> Input, types::ID OutputType);
    229 
    230   static bool classof(const Action *A) {
    231     return A->getKind() == CompileJobClass;
    232   }
    233 };
    234 
    235 class BackendJobAction : public JobAction {
    236   void anchor() override;
    237 public:
    238   BackendJobAction(std::unique_ptr<Action> Input, types::ID OutputType);
    239 
    240   static bool classof(const Action *A) {
    241     return A->getKind() == BackendJobClass;
    242   }
    243 };
    244 
    245 class AssembleJobAction : public JobAction {
    246   void anchor() override;
    247 public:
    248   AssembleJobAction(std::unique_ptr<Action> Input, types::ID OutputType);
    249 
    250   static bool classof(const Action *A) {
    251     return A->getKind() == AssembleJobClass;
    252   }
    253 };
    254 
    255 class LinkJobAction : public JobAction {
    256   void anchor() override;
    257 public:
    258   LinkJobAction(ActionList &Inputs, types::ID Type);
    259 
    260   static bool classof(const Action *A) {
    261     return A->getKind() == LinkJobClass;
    262   }
    263 };
    264 
    265 class LipoJobAction : public JobAction {
    266   void anchor() override;
    267 public:
    268   LipoJobAction(ActionList &Inputs, types::ID Type);
    269 
    270   static bool classof(const Action *A) {
    271     return A->getKind() == LipoJobClass;
    272   }
    273 };
    274 
    275 class DsymutilJobAction : public JobAction {
    276   void anchor() override;
    277 public:
    278   DsymutilJobAction(ActionList &Inputs, types::ID Type);
    279 
    280   static bool classof(const Action *A) {
    281     return A->getKind() == DsymutilJobClass;
    282   }
    283 };
    284 
    285 class VerifyJobAction : public JobAction {
    286   void anchor() override;
    287 public:
    288   VerifyJobAction(ActionClass Kind, std::unique_ptr<Action> Input,
    289                   types::ID Type);
    290   static bool classof(const Action *A) {
    291     return A->getKind() == VerifyDebugInfoJobClass ||
    292            A->getKind() == VerifyPCHJobClass;
    293   }
    294 };
    295 
    296 class VerifyDebugInfoJobAction : public VerifyJobAction {
    297   void anchor() override;
    298 public:
    299   VerifyDebugInfoJobAction(std::unique_ptr<Action> Input, types::ID Type);
    300   static bool classof(const Action *A) {
    301     return A->getKind() == VerifyDebugInfoJobClass;
    302   }
    303 };
    304 
    305 class VerifyPCHJobAction : public VerifyJobAction {
    306   void anchor() override;
    307 public:
    308   VerifyPCHJobAction(std::unique_ptr<Action> Input, types::ID Type);
    309   static bool classof(const Action *A) {
    310     return A->getKind() == VerifyPCHJobClass;
    311   }
    312 };
    313 
    314 } // end namespace driver
    315 } // end namespace clang
    316 
    317 #endif
    318