InputInfo.h revision 263508
1193885Ssam//===--- InputInfo.h - Input Source & Type Information ----------*- C++ -*-===// 2193885Ssam// 3193885Ssam// The LLVM Compiler Infrastructure 4193885Ssam// 5193885Ssam// This file is distributed under the University of Illinois Open Source 6193885Ssam// License. See LICENSE.TXT for details. 7193885Ssam// 8193885Ssam//===----------------------------------------------------------------------===// 9193885Ssam 10193885Ssam#ifndef CLANG_LIB_DRIVER_INPUTINFO_H_ 11193885Ssam#define CLANG_LIB_DRIVER_INPUTINFO_H_ 12193885Ssam 13193885Ssam#include "clang/Driver/Types.h" 14193885Ssam#include "llvm/Option/Arg.h" 15193885Ssam#include <cassert> 16193885Ssam#include <string> 17193885Ssam 18193885Ssamnamespace clang { 19193885Ssamnamespace driver { 20193885Ssam 21193885Ssam/// InputInfo - Wrapper for information about an input source. 22193885Ssamclass InputInfo { 23193885Ssam // FIXME: The distinction between filenames and inputarg here is 24193885Ssam // gross; we should probably drop the idea of a "linker 25193885Ssam // input". Doing so means tweaking pipelining to still create link 26193885Ssam // steps when it sees linker inputs (but not treat them as 27193885Ssam // arguments), and making sure that arguments get rendered 28193885Ssam // correctly. 29193885Ssam enum Class { 30193885Ssam Nothing, 31195618Srpaulo Filename, 32193885Ssam InputArg, 33193885Ssam Pipe 34193885Ssam }; 35193885Ssam 36193885Ssam union { 37193885Ssam const char *Filename; 38193885Ssam const llvm::opt::Arg *InputArg; 39193885Ssam } Data; 40193885Ssam Class Kind; 41193885Ssam types::ID Type; 42193885Ssam const char *BaseInput; 43193885Ssam 44193885Ssampublic: 45193885Ssam InputInfo() {} 46193885Ssam InputInfo(types::ID _Type, const char *_BaseInput) 47193885Ssam : Kind(Nothing), Type(_Type), BaseInput(_BaseInput) { 48193885Ssam } 49193885Ssam InputInfo(const char *_Filename, types::ID _Type, const char *_BaseInput) 50193885Ssam : Kind(Filename), Type(_Type), BaseInput(_BaseInput) { 51193885Ssam Data.Filename = _Filename; 52193885Ssam } 53193885Ssam InputInfo(const llvm::opt::Arg *_InputArg, types::ID _Type, 54193885Ssam const char *_BaseInput) 55193885Ssam : Kind(InputArg), Type(_Type), BaseInput(_BaseInput) { 56193885Ssam Data.InputArg = _InputArg; 57193885Ssam } 58193885Ssam 59193885Ssam bool isNothing() const { return Kind == Nothing; } 60193885Ssam bool isFilename() const { return Kind == Filename; } 61193885Ssam bool isInputArg() const { return Kind == InputArg; } 62193885Ssam types::ID getType() const { return Type; } 63193885Ssam const char *getBaseInput() const { return BaseInput; } 64193885Ssam 65193885Ssam const char *getFilename() const { 66193885Ssam assert(isFilename() && "Invalid accessor."); 67195618Srpaulo return Data.Filename; 68193885Ssam } 69193885Ssam const llvm::opt::Arg &getInputArg() const { 70193885Ssam assert(isInputArg() && "Invalid accessor."); 71193885Ssam return *Data.InputArg; 72193885Ssam } 73193885Ssam 74193885Ssam /// getAsString - Return a string name for this input, for 75193885Ssam /// debugging. 76193885Ssam std::string getAsString() const { 77193885Ssam if (isFilename()) 78193885Ssam return std::string("\"") + getFilename() + '"'; 79193885Ssam else if (isInputArg()) 80193885Ssam return "(input arg)"; 81193885Ssam else 82193885Ssam return "(nothing)"; 83193885Ssam } 84193885Ssam}; 85193885Ssam 86195618Srpaulo} // end namespace driver 87193885Ssam} // end namespace clang 88193885Ssam 89193885Ssam#endif 90193885Ssam