1*67e74705SXin Li //===--- InputInfo.h - Input Source & Type Information ----------*- C++ -*-===// 2*67e74705SXin Li // 3*67e74705SXin Li // The LLVM Compiler Infrastructure 4*67e74705SXin Li // 5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source 6*67e74705SXin Li // License. See LICENSE.TXT for details. 7*67e74705SXin Li // 8*67e74705SXin Li //===----------------------------------------------------------------------===// 9*67e74705SXin Li 10*67e74705SXin Li #ifndef LLVM_CLANG_LIB_DRIVER_INPUTINFO_H 11*67e74705SXin Li #define LLVM_CLANG_LIB_DRIVER_INPUTINFO_H 12*67e74705SXin Li 13*67e74705SXin Li #include "clang/Driver/Action.h" 14*67e74705SXin Li #include "clang/Driver/Types.h" 15*67e74705SXin Li #include "llvm/Option/Arg.h" 16*67e74705SXin Li #include <cassert> 17*67e74705SXin Li #include <string> 18*67e74705SXin Li 19*67e74705SXin Li namespace clang { 20*67e74705SXin Li namespace driver { 21*67e74705SXin Li 22*67e74705SXin Li /// InputInfo - Wrapper for information about an input source. 23*67e74705SXin Li class InputInfo { 24*67e74705SXin Li // FIXME: The distinction between filenames and inputarg here is 25*67e74705SXin Li // gross; we should probably drop the idea of a "linker 26*67e74705SXin Li // input". Doing so means tweaking pipelining to still create link 27*67e74705SXin Li // steps when it sees linker inputs (but not treat them as 28*67e74705SXin Li // arguments), and making sure that arguments get rendered 29*67e74705SXin Li // correctly. 30*67e74705SXin Li enum Class { 31*67e74705SXin Li Nothing, 32*67e74705SXin Li Filename, 33*67e74705SXin Li InputArg, 34*67e74705SXin Li Pipe 35*67e74705SXin Li }; 36*67e74705SXin Li 37*67e74705SXin Li union { 38*67e74705SXin Li const char *Filename; 39*67e74705SXin Li const llvm::opt::Arg *InputArg; 40*67e74705SXin Li } Data; 41*67e74705SXin Li Class Kind; 42*67e74705SXin Li const Action* Act; 43*67e74705SXin Li types::ID Type; 44*67e74705SXin Li const char *BaseInput; 45*67e74705SXin Li GetActionType(const Action * A)46*67e74705SXin Li static types::ID GetActionType(const Action *A) { 47*67e74705SXin Li return A != nullptr ? A->getType() : types::TY_Nothing; 48*67e74705SXin Li } 49*67e74705SXin Li 50*67e74705SXin Li public: InputInfo()51*67e74705SXin Li InputInfo() : InputInfo(nullptr, nullptr) {} InputInfo(const Action * A,const char * _BaseInput)52*67e74705SXin Li InputInfo(const Action *A, const char *_BaseInput) 53*67e74705SXin Li : Kind(Nothing), Act(A), Type(GetActionType(A)), BaseInput(_BaseInput) {} 54*67e74705SXin Li InputInfo(types::ID _Type,const char * _Filename,const char * _BaseInput)55*67e74705SXin Li InputInfo(types::ID _Type, const char *_Filename, const char *_BaseInput) 56*67e74705SXin Li : Kind(Filename), Act(nullptr), Type(_Type), BaseInput(_BaseInput) { 57*67e74705SXin Li Data.Filename = _Filename; 58*67e74705SXin Li } InputInfo(const Action * A,const char * _Filename,const char * _BaseInput)59*67e74705SXin Li InputInfo(const Action *A, const char *_Filename, const char *_BaseInput) 60*67e74705SXin Li : Kind(Filename), Act(A), Type(GetActionType(A)), BaseInput(_BaseInput) { 61*67e74705SXin Li Data.Filename = _Filename; 62*67e74705SXin Li } 63*67e74705SXin Li InputInfo(types::ID _Type,const llvm::opt::Arg * _InputArg,const char * _BaseInput)64*67e74705SXin Li InputInfo(types::ID _Type, const llvm::opt::Arg *_InputArg, 65*67e74705SXin Li const char *_BaseInput) 66*67e74705SXin Li : Kind(InputArg), Act(nullptr), Type(_Type), BaseInput(_BaseInput) { 67*67e74705SXin Li Data.InputArg = _InputArg; 68*67e74705SXin Li } InputInfo(const Action * A,const llvm::opt::Arg * _InputArg,const char * _BaseInput)69*67e74705SXin Li InputInfo(const Action *A, const llvm::opt::Arg *_InputArg, 70*67e74705SXin Li const char *_BaseInput) 71*67e74705SXin Li : Kind(InputArg), Act(A), Type(GetActionType(A)), BaseInput(_BaseInput) { 72*67e74705SXin Li Data.InputArg = _InputArg; 73*67e74705SXin Li } 74*67e74705SXin Li isNothing()75*67e74705SXin Li bool isNothing() const { return Kind == Nothing; } isFilename()76*67e74705SXin Li bool isFilename() const { return Kind == Filename; } isInputArg()77*67e74705SXin Li bool isInputArg() const { return Kind == InputArg; } getType()78*67e74705SXin Li types::ID getType() const { return Type; } getBaseInput()79*67e74705SXin Li const char *getBaseInput() const { return BaseInput; } 80*67e74705SXin Li /// The action for which this InputInfo was created. May be null. getAction()81*67e74705SXin Li const Action *getAction() const { return Act; } setAction(const Action * A)82*67e74705SXin Li void setAction(const Action *A) { Act = A; } 83*67e74705SXin Li getFilename()84*67e74705SXin Li const char *getFilename() const { 85*67e74705SXin Li assert(isFilename() && "Invalid accessor."); 86*67e74705SXin Li return Data.Filename; 87*67e74705SXin Li } getInputArg()88*67e74705SXin Li const llvm::opt::Arg &getInputArg() const { 89*67e74705SXin Li assert(isInputArg() && "Invalid accessor."); 90*67e74705SXin Li return *Data.InputArg; 91*67e74705SXin Li } 92*67e74705SXin Li 93*67e74705SXin Li /// getAsString - Return a string name for this input, for 94*67e74705SXin Li /// debugging. getAsString()95*67e74705SXin Li std::string getAsString() const { 96*67e74705SXin Li if (isFilename()) 97*67e74705SXin Li return std::string("\"") + getFilename() + '"'; 98*67e74705SXin Li else if (isInputArg()) 99*67e74705SXin Li return "(input arg)"; 100*67e74705SXin Li else 101*67e74705SXin Li return "(nothing)"; 102*67e74705SXin Li } 103*67e74705SXin Li }; 104*67e74705SXin Li 105*67e74705SXin Li } // end namespace driver 106*67e74705SXin Li } // end namespace clang 107*67e74705SXin Li 108*67e74705SXin Li #endif 109