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