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 18namespace clang { 19namespace driver { 20 21/// InputInfo - Wrapper for information about an input source. 22class 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 44public: 45 InputInfo() {} 46 InputInfo(types::ID _Type, const char *_BaseInput) 47 : Kind(Nothing), Type(_Type), BaseInput(_BaseInput) { 48 } 49 InputInfo(const char *_Filename, types::ID _Type, const char *_BaseInput) 50 : Kind(Filename), Type(_Type), BaseInput(_BaseInput) { 51 Data.Filename = _Filename; 52 } 53 InputInfo(const Arg *_InputArg, types::ID _Type, const char *_BaseInput) 54 : Kind(InputArg), Type(_Type), BaseInput(_BaseInput) { 55 Data.InputArg = _InputArg; 56 } 57 58 bool isNothing() const { return Kind == Nothing; } 59 bool isFilename() const { return Kind == Filename; } 60 bool isInputArg() const { return Kind == InputArg; } 61 types::ID getType() const { return Type; } 62 const char *getBaseInput() const { return BaseInput; } 63 64 const char *getFilename() const { 65 assert(isFilename() && "Invalid accessor."); 66 return Data.Filename; 67 } 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. 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