summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Belevich <tra@google.com>2015-07-20 21:59:31 +0000
committerArtem Belevich <tra@google.com>2015-07-20 21:59:31 +0000
commitdb35a3ee4327bfa5c93a9ff638155001e0c57102 (patch)
tree13fda821b65068c328f301bb23eaac14169f6c5d
parent52fd3bf15ab8b4215aab82ab4d7783bf9c0e8b1f (diff)
downloadbcm5719-llvm-db35a3ee4327bfa5c93a9ff638155001e0c57102.tar.gz
bcm5719-llvm-db35a3ee4327bfa5c93a9ff638155001e0c57102.zip
[CUDA] Moved device-side triple calculation to buildCudaActions().
Differential Revision: http://reviews.llvm.org/D11310 llvm-svn: 242718
-rw-r--r--clang/include/clang/Driver/Action.h4
-rw-r--r--clang/lib/Driver/Action.cpp5
-rw-r--r--clang/lib/Driver/Driver.cpp47
3 files changed, 29 insertions, 27 deletions
diff --git a/clang/include/clang/Driver/Action.h b/clang/include/clang/Driver/Action.h
index ad3c31c1c82..f6d4ad579c5 100644
--- a/clang/include/clang/Driver/Action.h
+++ b/clang/include/clang/Driver/Action.h
@@ -139,15 +139,17 @@ class CudaDeviceAction : public Action {
virtual void anchor();
/// GPU architecture to bind -- e.g 'sm_35'.
const char *GpuArchName;
+ const char *DeviceTriple;
/// True when action results are not consumed by the host action (e.g when
/// -fsyntax-only or --cuda-device-only options are used).
bool AtTopLevel;
public:
CudaDeviceAction(std::unique_ptr<Action> Input, const char *ArchName,
- bool AtTopLevel);
+ const char *DeviceTriple, bool AtTopLevel);
const char *getGpuArchName() const { return GpuArchName; }
+ const char *getDeviceTriple() const { return DeviceTriple; }
bool isAtTopLevel() const { return AtTopLevel; }
static bool classof(const Action *A) {
diff --git a/clang/lib/Driver/Action.cpp b/clang/lib/Driver/Action.cpp
index 49dccd224bf..6fe2a503464 100644
--- a/clang/lib/Driver/Action.cpp
+++ b/clang/lib/Driver/Action.cpp
@@ -58,9 +58,10 @@ BindArchAction::BindArchAction(std::unique_ptr<Action> Input,
void CudaDeviceAction::anchor() {}
CudaDeviceAction::CudaDeviceAction(std::unique_ptr<Action> Input,
- const char *ArchName, bool AtTopLevel)
+ const char *ArchName,
+ const char *DeviceTriple, bool AtTopLevel)
: Action(CudaDeviceClass, std::move(Input)), GpuArchName(ArchName),
- AtTopLevel(AtTopLevel) {}
+ DeviceTriple(DeviceTriple), AtTopLevel(AtTopLevel) {}
void CudaHostAction::anchor() {}
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 499375f55ff..faaeb3951a4 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -1238,11 +1238,8 @@ void Driver::BuildInputs(const ToolChain &TC, DerivedArgList &Args,
// CudaHostAction which combines both host and device side actions.
static std::unique_ptr<Action>
buildCudaActions(const Driver &D, const ToolChain &TC, DerivedArgList &Args,
- const Arg *InputArg, const types::ID InputType,
- std::unique_ptr<Action> Current, ActionList &Actions) {
-
- assert(InputType == types::TY_CUDA &&
- "CUDA Actions only apply to CUDA inputs.");
+ const Arg *InputArg, std::unique_ptr<Action> HostAction,
+ ActionList &Actions) {
// Collect all cuda_gpu_arch parameters, removing duplicates.
SmallVector<const char *, 4> GpuArchList;
@@ -1280,6 +1277,12 @@ buildCudaActions(const Driver &D, const ToolChain &TC, DerivedArgList &Args,
}
}
+ // Figure out which NVPTX triple to use for device-side compilation based on
+ // whether host is 64-bit.
+ const char *DeviceTriple = TC.getTriple().isArch64Bit()
+ ? "nvptx64-nvidia-cuda"
+ : "nvptx-nvidia-cuda";
+
// Figure out what to do with device actions -- pass them as inputs to the
// host action or run each of them independently.
bool DeviceOnlyCompilation = Args.hasArg(options::OPT_cuda_device_only);
@@ -1296,26 +1299,26 @@ buildCudaActions(const Driver &D, const ToolChain &TC, DerivedArgList &Args,
}
for (unsigned I = 0, E = GpuArchList.size(); I != E; ++I)
- Actions.push_back(
- new CudaDeviceAction(std::unique_ptr<Action>(CudaDeviceActions[I]),
- GpuArchList[I], /* AtTopLevel */ true));
+ Actions.push_back(new CudaDeviceAction(
+ std::unique_ptr<Action>(CudaDeviceActions[I]), GpuArchList[I],
+ DeviceTriple, /* AtTopLevel */ true));
// Kill host action in case of device-only compilation.
if (DeviceOnlyCompilation)
- Current.reset(nullptr);
- return Current;
+ HostAction.reset(nullptr);
+ return HostAction;
}
// Outputs of device actions during complete CUDA compilation get created
// with AtTopLevel=false and become inputs for the host action.
ActionList DeviceActions;
for (unsigned I = 0, E = GpuArchList.size(); I != E; ++I)
- DeviceActions.push_back(
- new CudaDeviceAction(std::unique_ptr<Action>(CudaDeviceActions[I]),
- GpuArchList[I], /* AtTopLevel */ false));
+ DeviceActions.push_back(new CudaDeviceAction(
+ std::unique_ptr<Action>(CudaDeviceActions[I]), GpuArchList[I],
+ DeviceTriple, /* AtTopLevel */ false));
// Return a new host action that incorporates original host action and all
// device actions.
return std::unique_ptr<Action>(
- new CudaHostAction(std::move(Current), DeviceActions));
+ new CudaHostAction(std::move(HostAction), DeviceActions));
}
void Driver::BuildActions(const ToolChain &TC, DerivedArgList &Args,
@@ -1461,7 +1464,7 @@ void Driver::BuildActions(const ToolChain &TC, DerivedArgList &Args,
if (InputType == types::TY_CUDA && Phase == CudaInjectionPhase &&
!Args.hasArg(options::OPT_cuda_host_only)) {
- Current = buildCudaActions(*this, TC, Args, InputArg, InputType,
+ Current = buildCudaActions(*this, TC, Args, InputArg,
std::move(Current), Actions);
if (!Current)
break;
@@ -1791,15 +1794,11 @@ void Driver::BuildJobsForAction(Compilation &C, const Action *A,
}
if (const CudaDeviceAction *CDA = dyn_cast<CudaDeviceAction>(A)) {
- // Figure out which NVPTX triple to use for device-side compilation based on
- // whether host is 64-bit.
- llvm::Triple DeviceTriple(TC->getTriple().isArch64Bit()
- ? "nvptx64-nvidia-cuda"
- : "nvptx-nvidia-cuda");
- BuildJobsForAction(C, *CDA->begin(),
- &getToolChain(C.getArgs(), DeviceTriple),
- CDA->getGpuArchName(), CDA->isAtTopLevel(),
- /*MultipleArchs*/ true, LinkingOutput, Result);
+ BuildJobsForAction(
+ C, *CDA->begin(),
+ &getToolChain(C.getArgs(), llvm::Triple(CDA->getDeviceTriple())),
+ CDA->getGpuArchName(), CDA->isAtTopLevel(),
+ /*MultipleArchs*/ true, LinkingOutput, Result);
return;
}
OpenPOWER on IntegriCloud