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 CLANG_DRIVER_ACTION_H_
     11 #define 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 clang {
     18 namespace driver {
     19   class Arg;
     20 
     21 /// Action - Represent an abstract compilation step to perform.
     22 ///
     23 /// An action represents an edge in the compilation graph; typically
     24 /// it is a job to transform an input using some tool.
     25 ///
     26 /// The current driver is hard wired to expect actions which produce a
     27 /// single primary output, at least in terms of controlling the
     28 /// compilation. Actions can produce auxiliary files, but can only
     29 /// produce a single output to feed into subsequent actions.
     30 class Action {
     31 public:
     32   typedef ActionList::size_type size_type;
     33   typedef ActionList::iterator iterator;
     34   typedef ActionList::const_iterator const_iterator;
     35 
     36   enum ActionClass {
     37     InputClass = 0,
     38     BindArchClass,
     39     PreprocessJobClass,
     40     PrecompileJobClass,
     41     AnalyzeJobClass,
     42     CompileJobClass,
     43     AssembleJobClass,
     44     LinkJobClass,
     45     LipoJobClass,
     46     DsymutilJobClass,
     47     VerifyJobClass,
     48 
     49     JobClassFirst=PreprocessJobClass,
     50     JobClassLast=VerifyJobClass
     51   };
     52 
     53   static const char *getClassName(ActionClass AC);
     54 
     55 private:
     56   ActionClass Kind;
     57 
     58   /// The output type of this action.
     59   types::ID Type;
     60 
     61   ActionList Inputs;
     62 
     63   unsigned OwnsInputs : 1;
     64 
     65 protected:
     66   Action(ActionClass _Kind, types::ID _Type)
     67     : Kind(_Kind), Type(_Type), OwnsInputs(true)  {}
     68   Action(ActionClass _Kind, Action *Input, types::ID _Type)
     69     : Kind(_Kind), Type(_Type), Inputs(&Input, &Input + 1), OwnsInputs(true) {}
     70   Action(ActionClass _Kind, const ActionList &_Inputs, types::ID _Type)
     71     : Kind(_Kind), Type(_Type), Inputs(_Inputs), OwnsInputs(true) {}
     72 public:
     73   virtual ~Action();
     74 
     75   const char *getClassName() const { return Action::getClassName(getKind()); }
     76 
     77   bool getOwnsInputs() { return OwnsInputs; }
     78   void setOwnsInputs(bool Value) { OwnsInputs = Value; }
     79 
     80   ActionClass getKind() const { return Kind; }
     81   types::ID getType() const { return Type; }
     82 
     83   ActionList &getInputs() { return Inputs; }
     84   const ActionList &getInputs() const { return Inputs; }
     85 
     86   size_type size() const { return Inputs.size(); }
     87 
     88   iterator begin() { return Inputs.begin(); }
     89   iterator end() { return Inputs.end(); }
     90   const_iterator begin() const { return Inputs.begin(); }
     91   const_iterator end() const { return Inputs.end(); }
     92 
     93   static bool classof(const Action *) { return true; }
     94 };
     95 
     96 class InputAction : public Action {
     97   const Arg &Input;
     98 public:
     99   InputAction(const Arg &_Input, types::ID _Type);
    100 
    101   const Arg &getInputArg() const { return Input; }
    102 
    103   static bool classof(const Action *A) {
    104     return A->getKind() == InputClass;
    105   }
    106   static bool classof(const InputAction *) { return true; }
    107 };
    108 
    109 class BindArchAction : public Action {
    110   /// The architecture to bind, or 0 if the default architecture
    111   /// should be bound.
    112   const char *ArchName;
    113 
    114 public:
    115   BindArchAction(Action *Input, const char *_ArchName);
    116 
    117   const char *getArchName() const { return ArchName; }
    118 
    119   static bool classof(const Action *A) {
    120     return A->getKind() == BindArchClass;
    121   }
    122   static bool classof(const BindArchAction *) { return true; }
    123 };
    124 
    125 class JobAction : public Action {
    126 protected:
    127   JobAction(ActionClass Kind, Action *Input, types::ID Type);
    128   JobAction(ActionClass Kind, const ActionList &Inputs, types::ID Type);
    129 
    130 public:
    131   static bool classof(const Action *A) {
    132     return (A->getKind() >= JobClassFirst &&
    133             A->getKind() <= JobClassLast);
    134   }
    135   static bool classof(const JobAction *) { return true; }
    136 };
    137 
    138 class PreprocessJobAction : public JobAction {
    139 public:
    140   PreprocessJobAction(Action *Input, types::ID OutputType);
    141 
    142   static bool classof(const Action *A) {
    143     return A->getKind() == PreprocessJobClass;
    144   }
    145   static bool classof(const PreprocessJobAction *) { return true; }
    146 };
    147 
    148 class PrecompileJobAction : public JobAction {
    149 public:
    150   PrecompileJobAction(Action *Input, types::ID OutputType);
    151 
    152   static bool classof(const Action *A) {
    153     return A->getKind() == PrecompileJobClass;
    154   }
    155   static bool classof(const PrecompileJobAction *) { return true; }
    156 };
    157 
    158 class AnalyzeJobAction : public JobAction {
    159 public:
    160   AnalyzeJobAction(Action *Input, types::ID OutputType);
    161 
    162   static bool classof(const Action *A) {
    163     return A->getKind() == AnalyzeJobClass;
    164   }
    165   static bool classof(const AnalyzeJobAction *) { return true; }
    166 };
    167 
    168 class CompileJobAction : public JobAction {
    169 public:
    170   CompileJobAction(Action *Input, types::ID OutputType);
    171 
    172   static bool classof(const Action *A) {
    173     return A->getKind() == CompileJobClass;
    174   }
    175   static bool classof(const CompileJobAction *) { return true; }
    176 };
    177 
    178 class AssembleJobAction : public JobAction {
    179 public:
    180   AssembleJobAction(Action *Input, types::ID OutputType);
    181 
    182   static bool classof(const Action *A) {
    183     return A->getKind() == AssembleJobClass;
    184   }
    185   static bool classof(const AssembleJobAction *) { return true; }
    186 };
    187 
    188 class LinkJobAction : public JobAction {
    189 public:
    190   LinkJobAction(ActionList &Inputs, types::ID Type);
    191 
    192   static bool classof(const Action *A) {
    193     return A->getKind() == LinkJobClass;
    194   }
    195   static bool classof(const LinkJobAction *) { return true; }
    196 };
    197 
    198 class LipoJobAction : public JobAction {
    199 public:
    200   LipoJobAction(ActionList &Inputs, types::ID Type);
    201 
    202   static bool classof(const Action *A) {
    203     return A->getKind() == LipoJobClass;
    204   }
    205   static bool classof(const LipoJobAction *) { return true; }
    206 };
    207 
    208 class DsymutilJobAction : public JobAction {
    209 public:
    210   DsymutilJobAction(ActionList &Inputs, types::ID Type);
    211 
    212   static bool classof(const Action *A) {
    213     return A->getKind() == DsymutilJobClass;
    214   }
    215   static bool classof(const DsymutilJobAction *) { return true; }
    216 };
    217 
    218 class VerifyJobAction : public JobAction {
    219 public:
    220   VerifyJobAction(ActionList &Inputs, types::ID Type);
    221   static bool classof(const Action *A) {
    222     return A->getKind() == VerifyJobClass;
    223   }
    224   static bool classof(const VerifyJobAction *) { return true; }
    225 };
    226 
    227 } // end namespace driver
    228 } // end namespace clang
    229 
    230 #endif
    231