[cuda] Driver changes to compile and stitch together host and device-side CUDA code.
NOTE: reverts r242077 to reinstate r242058, r242065, 242067
and includes fix for OS X test failures.
- Changed driver pipeline to compile host and device side of CUDA
files and incorporate results of device-side compilation into host
object file.
- Added a test for cuda pipeline creation in clang driver.
New clang options:
--cuda-host-only - Do host-side compilation only.
--cuda-device-only - Do device-side compilation only.
--cuda-gpu-arch=<ARCH> - specify GPU architecture for device-side
compilation. E.g. sm_35, sm_30. Default is sm_20. May be used more
than once in which case one device-compilation will be done per
unique specified GPU architecture.
Differential Revision: http://reviews.llvm.org/D9509
llvm-svn: 242085
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
#include "clang/Basic/DiagnosticOptions.h"
|
||||
#include "clang/Driver/Compilation.h"
|
||||
#include "clang/Driver/Driver.h"
|
||||
#include "clang/Driver/Action.h"
|
||||
#include "clang/Driver/Options.h"
|
||||
#include "clang/Driver/Tool.h"
|
||||
#include "clang/Frontend/CompilerInstance.h"
|
||||
@@ -61,9 +62,25 @@ clang::createInvocationFromCommandLine(ArrayRef<const char *> ArgList,
|
||||
}
|
||||
|
||||
// We expect to get back exactly one command job, if we didn't something
|
||||
// failed.
|
||||
// failed. CUDA compilation is an exception as it creates multiple jobs. If
|
||||
// that's the case, we proceed with the first job. If caller needs particular
|
||||
// CUDA job, it should be controlled via --cuda-{host|device}-only option
|
||||
// passed to the driver.
|
||||
const driver::JobList &Jobs = C->getJobs();
|
||||
if (Jobs.size() != 1 || !isa<driver::Command>(*Jobs.begin())) {
|
||||
bool CudaCompilation = false;
|
||||
if (Jobs.size() > 1) {
|
||||
for (auto &A : C->getActions()){
|
||||
// On MacOSX real actions may end up being wrapped in BindArchAction
|
||||
if (isa<driver::BindArchAction>(A))
|
||||
A = *A->begin();
|
||||
if (isa<driver::CudaDeviceAction>(A)) {
|
||||
CudaCompilation = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (Jobs.size() == 0 || !isa<driver::Command>(*Jobs.begin()) ||
|
||||
(Jobs.size() > 1 && !CudaCompilation)) {
|
||||
SmallString<256> Msg;
|
||||
llvm::raw_svector_ostream OS(Msg);
|
||||
Jobs.Print(OS, "; ", true);
|
||||
|
||||
Reference in New Issue
Block a user