xref: /aosp_15_r20/external/clang/lib/Driver/InputInfo.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===--- InputInfo.h - Input Source & Type Information ----------*- C++ -*-===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li 
10*67e74705SXin Li #ifndef LLVM_CLANG_LIB_DRIVER_INPUTINFO_H
11*67e74705SXin Li #define LLVM_CLANG_LIB_DRIVER_INPUTINFO_H
12*67e74705SXin Li 
13*67e74705SXin Li #include "clang/Driver/Action.h"
14*67e74705SXin Li #include "clang/Driver/Types.h"
15*67e74705SXin Li #include "llvm/Option/Arg.h"
16*67e74705SXin Li #include <cassert>
17*67e74705SXin Li #include <string>
18*67e74705SXin Li 
19*67e74705SXin Li namespace clang {
20*67e74705SXin Li namespace driver {
21*67e74705SXin Li 
22*67e74705SXin Li /// InputInfo - Wrapper for information about an input source.
23*67e74705SXin Li class InputInfo {
24*67e74705SXin Li   // FIXME: The distinction between filenames and inputarg here is
25*67e74705SXin Li   // gross; we should probably drop the idea of a "linker
26*67e74705SXin Li   // input". Doing so means tweaking pipelining to still create link
27*67e74705SXin Li   // steps when it sees linker inputs (but not treat them as
28*67e74705SXin Li   // arguments), and making sure that arguments get rendered
29*67e74705SXin Li   // correctly.
30*67e74705SXin Li   enum Class {
31*67e74705SXin Li     Nothing,
32*67e74705SXin Li     Filename,
33*67e74705SXin Li     InputArg,
34*67e74705SXin Li     Pipe
35*67e74705SXin Li   };
36*67e74705SXin Li 
37*67e74705SXin Li   union {
38*67e74705SXin Li     const char *Filename;
39*67e74705SXin Li     const llvm::opt::Arg *InputArg;
40*67e74705SXin Li   } Data;
41*67e74705SXin Li   Class Kind;
42*67e74705SXin Li   const Action* Act;
43*67e74705SXin Li   types::ID Type;
44*67e74705SXin Li   const char *BaseInput;
45*67e74705SXin Li 
GetActionType(const Action * A)46*67e74705SXin Li   static types::ID GetActionType(const Action *A) {
47*67e74705SXin Li     return A != nullptr ? A->getType() : types::TY_Nothing;
48*67e74705SXin Li   }
49*67e74705SXin Li 
50*67e74705SXin Li public:
InputInfo()51*67e74705SXin Li   InputInfo() : InputInfo(nullptr, nullptr) {}
InputInfo(const Action * A,const char * _BaseInput)52*67e74705SXin Li   InputInfo(const Action *A, const char *_BaseInput)
53*67e74705SXin Li       : Kind(Nothing), Act(A), Type(GetActionType(A)), BaseInput(_BaseInput) {}
54*67e74705SXin Li 
InputInfo(types::ID _Type,const char * _Filename,const char * _BaseInput)55*67e74705SXin Li   InputInfo(types::ID _Type, const char *_Filename, const char *_BaseInput)
56*67e74705SXin Li       : Kind(Filename), Act(nullptr), Type(_Type), BaseInput(_BaseInput) {
57*67e74705SXin Li     Data.Filename = _Filename;
58*67e74705SXin Li   }
InputInfo(const Action * A,const char * _Filename,const char * _BaseInput)59*67e74705SXin Li   InputInfo(const Action *A, const char *_Filename, const char *_BaseInput)
60*67e74705SXin Li       : Kind(Filename), Act(A), Type(GetActionType(A)), BaseInput(_BaseInput) {
61*67e74705SXin Li     Data.Filename = _Filename;
62*67e74705SXin Li   }
63*67e74705SXin Li 
InputInfo(types::ID _Type,const llvm::opt::Arg * _InputArg,const char * _BaseInput)64*67e74705SXin Li   InputInfo(types::ID _Type, const llvm::opt::Arg *_InputArg,
65*67e74705SXin Li             const char *_BaseInput)
66*67e74705SXin Li       : Kind(InputArg), Act(nullptr), Type(_Type), BaseInput(_BaseInput) {
67*67e74705SXin Li     Data.InputArg = _InputArg;
68*67e74705SXin Li   }
InputInfo(const Action * A,const llvm::opt::Arg * _InputArg,const char * _BaseInput)69*67e74705SXin Li   InputInfo(const Action *A, const llvm::opt::Arg *_InputArg,
70*67e74705SXin Li             const char *_BaseInput)
71*67e74705SXin Li       : Kind(InputArg), Act(A), Type(GetActionType(A)), BaseInput(_BaseInput) {
72*67e74705SXin Li     Data.InputArg = _InputArg;
73*67e74705SXin Li   }
74*67e74705SXin Li 
isNothing()75*67e74705SXin Li   bool isNothing() const { return Kind == Nothing; }
isFilename()76*67e74705SXin Li   bool isFilename() const { return Kind == Filename; }
isInputArg()77*67e74705SXin Li   bool isInputArg() const { return Kind == InputArg; }
getType()78*67e74705SXin Li   types::ID getType() const { return Type; }
getBaseInput()79*67e74705SXin Li   const char *getBaseInput() const { return BaseInput; }
80*67e74705SXin Li   /// The action for which this InputInfo was created.  May be null.
getAction()81*67e74705SXin Li   const Action *getAction() const { return Act; }
setAction(const Action * A)82*67e74705SXin Li   void setAction(const Action *A) { Act = A; }
83*67e74705SXin Li 
getFilename()84*67e74705SXin Li   const char *getFilename() const {
85*67e74705SXin Li     assert(isFilename() && "Invalid accessor.");
86*67e74705SXin Li     return Data.Filename;
87*67e74705SXin Li   }
getInputArg()88*67e74705SXin Li   const llvm::opt::Arg &getInputArg() const {
89*67e74705SXin Li     assert(isInputArg() && "Invalid accessor.");
90*67e74705SXin Li     return *Data.InputArg;
91*67e74705SXin Li   }
92*67e74705SXin Li 
93*67e74705SXin Li   /// getAsString - Return a string name for this input, for
94*67e74705SXin Li   /// debugging.
getAsString()95*67e74705SXin Li   std::string getAsString() const {
96*67e74705SXin Li     if (isFilename())
97*67e74705SXin Li       return std::string("\"") + getFilename() + '"';
98*67e74705SXin Li     else if (isInputArg())
99*67e74705SXin Li       return "(input arg)";
100*67e74705SXin Li     else
101*67e74705SXin Li       return "(nothing)";
102*67e74705SXin Li   }
103*67e74705SXin Li };
104*67e74705SXin Li 
105*67e74705SXin Li } // end namespace driver
106*67e74705SXin Li } // end namespace clang
107*67e74705SXin Li 
108*67e74705SXin Li #endif
109