90 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===--- InputInfo.h - Input Source & Type Information ----------*- C++ -*-===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #ifndef CLANG_LIB_DRIVER_INPUTINFO_H_
 | |
| #define CLANG_LIB_DRIVER_INPUTINFO_H_
 | |
| 
 | |
| #include "clang/Driver/Types.h"
 | |
| #include "llvm/Option/Arg.h"
 | |
| #include <cassert>
 | |
| #include <string>
 | |
| 
 | |
| namespace clang {
 | |
| namespace driver {
 | |
| 
 | |
| /// InputInfo - Wrapper for information about an input source.
 | |
| class InputInfo {
 | |
|   // FIXME: The distinction between filenames and inputarg here is
 | |
|   // gross; we should probably drop the idea of a "linker
 | |
|   // input". Doing so means tweaking pipelining to still create link
 | |
|   // steps when it sees linker inputs (but not treat them as
 | |
|   // arguments), and making sure that arguments get rendered
 | |
|   // correctly.
 | |
|   enum Class {
 | |
|     Nothing,
 | |
|     Filename,
 | |
|     InputArg,
 | |
|     Pipe
 | |
|   };
 | |
| 
 | |
|   union {
 | |
|     const char *Filename;
 | |
|     const llvm::opt::Arg *InputArg;
 | |
|   } Data;
 | |
|   Class Kind;
 | |
|   types::ID Type;
 | |
|   const char *BaseInput;
 | |
| 
 | |
| public:
 | |
|   InputInfo() {}
 | |
|   InputInfo(types::ID _Type, const char *_BaseInput)
 | |
|     : Kind(Nothing), Type(_Type), BaseInput(_BaseInput) {
 | |
|   }
 | |
|   InputInfo(const char *_Filename, types::ID _Type, const char *_BaseInput)
 | |
|     : Kind(Filename), Type(_Type), BaseInput(_BaseInput) {
 | |
|     Data.Filename = _Filename;
 | |
|   }
 | |
|   InputInfo(const llvm::opt::Arg *_InputArg, types::ID _Type,
 | |
|             const char *_BaseInput)
 | |
|       : Kind(InputArg), Type(_Type), BaseInput(_BaseInput) {
 | |
|     Data.InputArg = _InputArg;
 | |
|   }
 | |
| 
 | |
|   bool isNothing() const { return Kind == Nothing; }
 | |
|   bool isFilename() const { return Kind == Filename; }
 | |
|   bool isInputArg() const { return Kind == InputArg; }
 | |
|   types::ID getType() const { return Type; }
 | |
|   const char *getBaseInput() const { return BaseInput; }
 | |
| 
 | |
|   const char *getFilename() const {
 | |
|     assert(isFilename() && "Invalid accessor.");
 | |
|     return Data.Filename;
 | |
|   }
 | |
|   const llvm::opt::Arg &getInputArg() const {
 | |
|     assert(isInputArg() && "Invalid accessor.");
 | |
|     return *Data.InputArg;
 | |
|   }
 | |
| 
 | |
|   /// getAsString - Return a string name for this input, for
 | |
|   /// debugging.
 | |
|   std::string getAsString() const {
 | |
|     if (isFilename())
 | |
|       return std::string("\"") + getFilename() + '"';
 | |
|     else if (isInputArg())
 | |
|       return "(input arg)";
 | |
|     else
 | |
|       return "(nothing)";
 | |
|   }
 | |
| };
 | |
| 
 | |
| } // end namespace driver
 | |
| } // end namespace clang
 | |
| 
 | |
| #endif
 | 
