Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===--- InputInfo.h - Input Source & Type Information ----------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8.  
  9. #ifndef LLVM_CLANG_DRIVER_INPUTINFO_H
  10. #define LLVM_CLANG_DRIVER_INPUTINFO_H
  11.  
  12. #include "clang/Driver/Action.h"
  13. #include "clang/Driver/Types.h"
  14. #include "llvm/Option/Arg.h"
  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 llvm::opt::Arg *InputArg;
  39.   } Data;
  40.   Class Kind;
  41.   const Action* Act;
  42.   types::ID Type;
  43.   const char *BaseInput;
  44.  
  45.   static types::ID GetActionType(const Action *A) {
  46.     return A != nullptr ? A->getType() : types::TY_Nothing;
  47.   }
  48.  
  49. public:
  50.   InputInfo() : InputInfo(nullptr, nullptr) {}
  51.   InputInfo(const Action *A, const char *_BaseInput)
  52.       : Kind(Nothing), Act(A), Type(GetActionType(A)), BaseInput(_BaseInput) {}
  53.  
  54.   InputInfo(types::ID _Type, const char *_Filename, const char *_BaseInput)
  55.       : Kind(Filename), Act(nullptr), Type(_Type), BaseInput(_BaseInput) {
  56.     Data.Filename = _Filename;
  57.   }
  58.   InputInfo(const Action *A, const char *_Filename, const char *_BaseInput)
  59.       : Kind(Filename), Act(A), Type(GetActionType(A)), BaseInput(_BaseInput) {
  60.     Data.Filename = _Filename;
  61.   }
  62.  
  63.   InputInfo(types::ID _Type, const llvm::opt::Arg *_InputArg,
  64.             const char *_BaseInput)
  65.       : Kind(InputArg), Act(nullptr), Type(_Type), BaseInput(_BaseInput) {
  66.     Data.InputArg = _InputArg;
  67.   }
  68.   InputInfo(const Action *A, const llvm::opt::Arg *_InputArg,
  69.             const char *_BaseInput)
  70.       : Kind(InputArg), Act(A), Type(GetActionType(A)), BaseInput(_BaseInput) {
  71.     Data.InputArg = _InputArg;
  72.   }
  73.  
  74.   bool isNothing() const { return Kind == Nothing; }
  75.   bool isFilename() const { return Kind == Filename; }
  76.   bool isInputArg() const { return Kind == InputArg; }
  77.   types::ID getType() const { return Type; }
  78.   const char *getBaseInput() const { return BaseInput; }
  79.   /// The action for which this InputInfo was created.  May be null.
  80.   const Action *getAction() const { return Act; }
  81.   void setAction(const Action *A) { Act = A; }
  82.  
  83.   const char *getFilename() const {
  84.     assert(isFilename() && "Invalid accessor.");
  85.     return Data.Filename;
  86.   }
  87.   const llvm::opt::Arg &getInputArg() const {
  88.     assert(isInputArg() && "Invalid accessor.");
  89.     return *Data.InputArg;
  90.   }
  91.  
  92.   /// getAsString - Return a string name for this input, for
  93.   /// debugging.
  94.   std::string getAsString() const {
  95.     if (isFilename())
  96.       return std::string("\"") + getFilename() + '"';
  97.     else if (isInputArg())
  98.       return "(input arg)";
  99.     else
  100.       return "(nothing)";
  101.   }
  102. };
  103.  
  104. } // end namespace driver
  105. } // end namespace clang
  106.  
  107. #endif
  108.