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