зеркало из https://github.com/microsoft/clang-1.git
255 строки
6.8 KiB
C++
255 строки
6.8 KiB
C++
//===--- Action.h - Abstract compilation steps ------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef CLANG_DRIVER_ACTION_H_
|
|
#define CLANG_DRIVER_ACTION_H_
|
|
|
|
#include "clang/Driver/Types.h"
|
|
#include "clang/Driver/Util.h"
|
|
#include "llvm/ADT/SmallVector.h"
|
|
|
|
namespace clang {
|
|
namespace driver {
|
|
class Arg;
|
|
|
|
/// Action - Represent an abstract compilation step to perform.
|
|
///
|
|
/// An action represents an edge in the compilation graph; typically
|
|
/// it is a job to transform an input using some tool.
|
|
///
|
|
/// The current driver is hard wired to expect actions which produce a
|
|
/// single primary output, at least in terms of controlling the
|
|
/// compilation. Actions can produce auxiliary files, but can only
|
|
/// produce a single output to feed into subsequent actions.
|
|
class Action {
|
|
public:
|
|
typedef ActionList::size_type size_type;
|
|
typedef ActionList::iterator iterator;
|
|
typedef ActionList::const_iterator const_iterator;
|
|
|
|
enum ActionClass {
|
|
InputClass = 0,
|
|
BindArchClass,
|
|
PreprocessJobClass,
|
|
PrecompileJobClass,
|
|
AnalyzeJobClass,
|
|
MigrateJobClass,
|
|
CompileJobClass,
|
|
AssembleJobClass,
|
|
LinkJobClass,
|
|
LipoJobClass,
|
|
DsymutilJobClass,
|
|
VerifyJobClass,
|
|
|
|
JobClassFirst=PreprocessJobClass,
|
|
JobClassLast=VerifyJobClass
|
|
};
|
|
|
|
static const char *getClassName(ActionClass AC);
|
|
|
|
private:
|
|
ActionClass Kind;
|
|
|
|
/// The output type of this action.
|
|
types::ID Type;
|
|
|
|
ActionList Inputs;
|
|
|
|
unsigned OwnsInputs : 1;
|
|
|
|
protected:
|
|
Action(ActionClass _Kind, types::ID _Type)
|
|
: Kind(_Kind), Type(_Type), OwnsInputs(true) {}
|
|
Action(ActionClass _Kind, Action *Input, types::ID _Type)
|
|
: Kind(_Kind), Type(_Type), Inputs(&Input, &Input + 1), OwnsInputs(true) {}
|
|
Action(ActionClass _Kind, const ActionList &_Inputs, types::ID _Type)
|
|
: Kind(_Kind), Type(_Type), Inputs(_Inputs), OwnsInputs(true) {}
|
|
public:
|
|
virtual ~Action();
|
|
|
|
const char *getClassName() const { return Action::getClassName(getKind()); }
|
|
|
|
bool getOwnsInputs() { return OwnsInputs; }
|
|
void setOwnsInputs(bool Value) { OwnsInputs = Value; }
|
|
|
|
ActionClass getKind() const { return Kind; }
|
|
types::ID getType() const { return Type; }
|
|
|
|
ActionList &getInputs() { return Inputs; }
|
|
const ActionList &getInputs() const { return Inputs; }
|
|
|
|
size_type size() const { return Inputs.size(); }
|
|
|
|
iterator begin() { return Inputs.begin(); }
|
|
iterator end() { return Inputs.end(); }
|
|
const_iterator begin() const { return Inputs.begin(); }
|
|
const_iterator end() const { return Inputs.end(); }
|
|
|
|
static bool classof(const Action *) { return true; }
|
|
};
|
|
|
|
class InputAction : public Action {
|
|
virtual void anchor();
|
|
const Arg &Input;
|
|
public:
|
|
InputAction(const Arg &_Input, types::ID _Type);
|
|
|
|
const Arg &getInputArg() const { return Input; }
|
|
|
|
static bool classof(const Action *A) {
|
|
return A->getKind() == InputClass;
|
|
}
|
|
static bool classof(const InputAction *) { return true; }
|
|
};
|
|
|
|
class BindArchAction : public Action {
|
|
virtual void anchor();
|
|
/// The architecture to bind, or 0 if the default architecture
|
|
/// should be bound.
|
|
const char *ArchName;
|
|
|
|
public:
|
|
BindArchAction(Action *Input, const char *_ArchName);
|
|
|
|
const char *getArchName() const { return ArchName; }
|
|
|
|
static bool classof(const Action *A) {
|
|
return A->getKind() == BindArchClass;
|
|
}
|
|
static bool classof(const BindArchAction *) { return true; }
|
|
};
|
|
|
|
class JobAction : public Action {
|
|
virtual void anchor();
|
|
protected:
|
|
JobAction(ActionClass Kind, Action *Input, types::ID Type);
|
|
JobAction(ActionClass Kind, const ActionList &Inputs, types::ID Type);
|
|
|
|
public:
|
|
static bool classof(const Action *A) {
|
|
return (A->getKind() >= JobClassFirst &&
|
|
A->getKind() <= JobClassLast);
|
|
}
|
|
static bool classof(const JobAction *) { return true; }
|
|
};
|
|
|
|
class PreprocessJobAction : public JobAction {
|
|
virtual void anchor();
|
|
public:
|
|
PreprocessJobAction(Action *Input, types::ID OutputType);
|
|
|
|
static bool classof(const Action *A) {
|
|
return A->getKind() == PreprocessJobClass;
|
|
}
|
|
static bool classof(const PreprocessJobAction *) { return true; }
|
|
};
|
|
|
|
class PrecompileJobAction : public JobAction {
|
|
virtual void anchor();
|
|
public:
|
|
PrecompileJobAction(Action *Input, types::ID OutputType);
|
|
|
|
static bool classof(const Action *A) {
|
|
return A->getKind() == PrecompileJobClass;
|
|
}
|
|
static bool classof(const PrecompileJobAction *) { return true; }
|
|
};
|
|
|
|
class AnalyzeJobAction : public JobAction {
|
|
virtual void anchor();
|
|
public:
|
|
AnalyzeJobAction(Action *Input, types::ID OutputType);
|
|
|
|
static bool classof(const Action *A) {
|
|
return A->getKind() == AnalyzeJobClass;
|
|
}
|
|
static bool classof(const AnalyzeJobAction *) { return true; }
|
|
};
|
|
|
|
class MigrateJobAction : public JobAction {
|
|
virtual void anchor();
|
|
public:
|
|
MigrateJobAction(Action *Input, types::ID OutputType);
|
|
|
|
static bool classof(const Action *A) {
|
|
return A->getKind() == MigrateJobClass;
|
|
}
|
|
static bool classof(const MigrateJobAction *) { return true; }
|
|
};
|
|
|
|
class CompileJobAction : public JobAction {
|
|
virtual void anchor();
|
|
public:
|
|
CompileJobAction(Action *Input, types::ID OutputType);
|
|
|
|
static bool classof(const Action *A) {
|
|
return A->getKind() == CompileJobClass;
|
|
}
|
|
static bool classof(const CompileJobAction *) { return true; }
|
|
};
|
|
|
|
class AssembleJobAction : public JobAction {
|
|
virtual void anchor();
|
|
public:
|
|
AssembleJobAction(Action *Input, types::ID OutputType);
|
|
|
|
static bool classof(const Action *A) {
|
|
return A->getKind() == AssembleJobClass;
|
|
}
|
|
static bool classof(const AssembleJobAction *) { return true; }
|
|
};
|
|
|
|
class LinkJobAction : public JobAction {
|
|
virtual void anchor();
|
|
public:
|
|
LinkJobAction(ActionList &Inputs, types::ID Type);
|
|
|
|
static bool classof(const Action *A) {
|
|
return A->getKind() == LinkJobClass;
|
|
}
|
|
static bool classof(const LinkJobAction *) { return true; }
|
|
};
|
|
|
|
class LipoJobAction : public JobAction {
|
|
virtual void anchor();
|
|
public:
|
|
LipoJobAction(ActionList &Inputs, types::ID Type);
|
|
|
|
static bool classof(const Action *A) {
|
|
return A->getKind() == LipoJobClass;
|
|
}
|
|
static bool classof(const LipoJobAction *) { return true; }
|
|
};
|
|
|
|
class DsymutilJobAction : public JobAction {
|
|
virtual void anchor();
|
|
public:
|
|
DsymutilJobAction(ActionList &Inputs, types::ID Type);
|
|
|
|
static bool classof(const Action *A) {
|
|
return A->getKind() == DsymutilJobClass;
|
|
}
|
|
static bool classof(const DsymutilJobAction *) { return true; }
|
|
};
|
|
|
|
class VerifyJobAction : public JobAction {
|
|
virtual void anchor();
|
|
public:
|
|
VerifyJobAction(ActionList &Inputs, types::ID Type);
|
|
static bool classof(const Action *A) {
|
|
return A->getKind() == VerifyJobClass;
|
|
}
|
|
static bool classof(const VerifyJobAction *) { return true; }
|
|
};
|
|
|
|
} // end namespace driver
|
|
} // end namespace clang
|
|
|
|
#endif
|