1 //===--- InputInfo.h - Input Source & Type Information ----------*- 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_LIB_DRIVER_INPUTINFO_H_ 11 #define CLANG_LIB_DRIVER_INPUTINFO_H_ 12 13 #include "clang/Driver/Types.h" 14 15 #include <cassert> 16 #include <string> 17 18 namespace clang { 19 namespace driver { 20 21 /// InputInfo - Wrapper for information about an input source. 22 class InputInfo { 23 // FIXME: The distinction between filenames and inputarg here is 24 // gross; we should probably drop the idea of a "linker 25 // input". Doing so means tweaking pipelining to still create link 26 // steps when it sees linker inputs (but not treat them as 27 // arguments), and making sure that arguments get rendered 28 // correctly. 29 enum Class { 30 Nothing, 31 Filename, 32 InputArg, 33 Pipe 34 }; 35 36 union { 37 const char *Filename; 38 const Arg *InputArg; 39 } Data; 40 Class Kind; 41 types::ID Type; 42 const char *BaseInput; 43 44 public: InputInfo()45 InputInfo() {} InputInfo(types::ID _Type,const char * _BaseInput)46 InputInfo(types::ID _Type, const char *_BaseInput) 47 : Kind(Nothing), Type(_Type), BaseInput(_BaseInput) { 48 } InputInfo(const char * _Filename,types::ID _Type,const char * _BaseInput)49 InputInfo(const char *_Filename, types::ID _Type, const char *_BaseInput) 50 : Kind(Filename), Type(_Type), BaseInput(_BaseInput) { 51 Data.Filename = _Filename; 52 } InputInfo(const Arg * _InputArg,types::ID _Type,const char * _BaseInput)53 InputInfo(const Arg *_InputArg, types::ID _Type, const char *_BaseInput) 54 : Kind(InputArg), Type(_Type), BaseInput(_BaseInput) { 55 Data.InputArg = _InputArg; 56 } 57 isNothing()58 bool isNothing() const { return Kind == Nothing; } isFilename()59 bool isFilename() const { return Kind == Filename; } isInputArg()60 bool isInputArg() const { return Kind == InputArg; } getType()61 types::ID getType() const { return Type; } getBaseInput()62 const char *getBaseInput() const { return BaseInput; } 63 getFilename()64 const char *getFilename() const { 65 assert(isFilename() && "Invalid accessor."); 66 return Data.Filename; 67 } getInputArg()68 const Arg &getInputArg() const { 69 assert(isInputArg() && "Invalid accessor."); 70 return *Data.InputArg; 71 } 72 73 /// getAsString - Return a string name for this input, for 74 /// debugging. getAsString()75 std::string getAsString() const { 76 if (isFilename()) 77 return std::string("\"") + getFilename() + '"'; 78 else if (isInputArg()) 79 return "(input arg)"; 80 else 81 return "(nothing)"; 82 } 83 }; 84 85 } // end namespace driver 86 } // end namespace clang 87 88 #endif 89