Add an Action* member to InputInfo.

Summary:
The CUDA toolchain needs to know which Actions created which InputInfos,
because it needs to attach GPU archs to the various InputInfos.

Reviewers: echristo

Subscribers: jfb, dschuff, jhen, tra, cfe-commits

Differential Revision: http://reviews.llvm.org/D16078

llvm-svn: 257411
diff --git a/clang/lib/Driver/InputInfo.h b/clang/lib/Driver/InputInfo.h
index b23ba57..0c36e81 100644
--- a/clang/lib/Driver/InputInfo.h
+++ b/clang/lib/Driver/InputInfo.h
@@ -10,6 +10,7 @@
 #ifndef LLVM_CLANG_LIB_DRIVER_INPUTINFO_H
 #define LLVM_CLANG_LIB_DRIVER_INPUTINFO_H
 
+#include "clang/Driver/Action.h"
 #include "clang/Driver/Types.h"
 #include "llvm/Option/Arg.h"
 #include <cassert>
@@ -38,21 +39,36 @@
     const llvm::opt::Arg *InputArg;
   } Data;
   Class Kind;
+  const Action* Act;
   types::ID Type;
   const char *BaseInput;
 
-public:
-  InputInfo() {}
-  InputInfo(types::ID _Type, const char *_BaseInput)
-    : Kind(Nothing), Type(_Type), BaseInput(_BaseInput) {
+  static types::ID GetActionType(const Action *A) {
+    return A != nullptr ? A->getType() : types::TY_Nothing;
   }
-  InputInfo(const char *_Filename, types::ID _Type, const char *_BaseInput)
-    : Kind(Filename), Type(_Type), BaseInput(_BaseInput) {
+
+public:
+  InputInfo() : InputInfo(nullptr, nullptr) {}
+  InputInfo(const Action *A, const char *_BaseInput)
+      : Kind(Nothing), Act(A), Type(GetActionType(A)), BaseInput(_BaseInput) {}
+
+  InputInfo(types::ID _Type, const char *_Filename, const char *_BaseInput)
+      : Kind(Filename), Act(nullptr), Type(_Type), BaseInput(_BaseInput) {
     Data.Filename = _Filename;
   }
-  InputInfo(const llvm::opt::Arg *_InputArg, types::ID _Type,
+  InputInfo(const Action *A, const char *_Filename, const char *_BaseInput)
+      : Kind(Filename), Act(A), Type(GetActionType(A)), BaseInput(_BaseInput) {
+    Data.Filename = _Filename;
+  }
+
+  InputInfo(types::ID _Type, const llvm::opt::Arg *_InputArg,
             const char *_BaseInput)
-      : Kind(InputArg), Type(_Type), BaseInput(_BaseInput) {
+      : Kind(InputArg), Act(nullptr), Type(_Type), BaseInput(_BaseInput) {
+    Data.InputArg = _InputArg;
+  }
+  InputInfo(const Action *A, const llvm::opt::Arg *_InputArg,
+            const char *_BaseInput)
+      : Kind(InputArg), Act(A), Type(GetActionType(A)), BaseInput(_BaseInput) {
     Data.InputArg = _InputArg;
   }
 
@@ -61,6 +77,9 @@
   bool isInputArg() const { return Kind == InputArg; }
   types::ID getType() const { return Type; }
   const char *getBaseInput() const { return BaseInput; }
+  /// The action for which this InputInfo was created.  May be null.
+  const Action *getAction() const { return Act; }
+  void setAction(const Action *A) { Act = A; }
 
   const char *getFilename() const {
     assert(isFilename() && "Invalid accessor.");