Skip to content

Commit

Permalink
Create a frontend flag to disable CUDA cross-target call checks
Browse files Browse the repository at this point in the history
For CUDA source, Sema checks that the targets of call expressions make sense
(e.g. a host function can't call a device function).

Adding a flag that lets us skip this check. Motivation: for source-to-source
translation tools that have to accept code that's not strictly kosher CUDA but
is still accepted by nvcc. The source-to-source translation tool can then fix
the code and leave calls that are semantically valid for the actual compilation
stage.

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

llvm-svn: 235049
  • Loading branch information
eliben committed Apr 15, 2015
1 parent f17f34e commit 4bdc50e
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 0 deletions.
1 change: 1 addition & 0 deletions clang/include/clang/Basic/LangOptions.def
Expand Up @@ -162,6 +162,7 @@ LANGOPT(CUDA , 1, 0, "CUDA")
LANGOPT(OpenMP , 1, 0, "OpenMP support")
LANGOPT(CUDAIsDevice , 1, 0, "Compiling for CUDA device")
LANGOPT(CUDAAllowHostCallsFromHostDevice, 1, 0, "Allow host device functions to call host functions")
LANGOPT(CUDADisableTargetCallChecks, 1, 0, "Disable checks for call targets (host, device, etc.)")

LANGOPT(AssumeSaneOperatorNew , 1, 1, "implicit __attribute__((malloc)) for C++'s new operators")
LANGOPT(SizedDeallocation , 1, 0, "enable sized deallocation functions")
Expand Down
3 changes: 3 additions & 0 deletions clang/include/clang/Driver/CC1Options.td
Expand Up @@ -610,6 +610,9 @@ def fcuda_is_device : Flag<["-"], "fcuda-is-device">,
def fcuda_allow_host_calls_from_host_device : Flag<["-"],
"fcuda-allow-host-calls-from-host-device">,
HelpText<"Allow host device functions to call host functions">;
def fcuda_disable_target_call_checks : Flag<["-"],
"fcuda-disable-target-call-checks">,
HelpText<"Disable all cross-target (host, device, etc.) call checks in CUDA">;

} // let Flags = [CC1Option]

Expand Down
3 changes: 3 additions & 0 deletions clang/lib/Frontend/CompilerInvocation.cpp
Expand Up @@ -1375,6 +1375,9 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
if (Args.hasArg(OPT_fcuda_allow_host_calls_from_host_device))
Opts.CUDAAllowHostCallsFromHostDevice = 1;

if (Args.hasArg(OPT_fcuda_disable_target_call_checks))
Opts.CUDADisableTargetCallChecks = 1;

if (Opts.ObjC1) {
if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
StringRef value = arg->getValue();
Expand Down
5 changes: 5 additions & 0 deletions clang/lib/Sema/SemaCUDA.cpp
Expand Up @@ -62,6 +62,11 @@ Sema::CUDAFunctionTarget Sema::IdentifyCUDATarget(const FunctionDecl *D) {

bool Sema::CheckCUDATarget(const FunctionDecl *Caller,
const FunctionDecl *Callee) {
// The CUDADisableTargetCallChecks short-circuits this check: we assume all
// cross-target calls are valid.
if (getLangOpts().CUDADisableTargetCallChecks)
return false;

CUDAFunctionTarget CallerTarget = IdentifyCUDATarget(Caller),
CalleeTarget = IdentifyCUDATarget(Callee);

Expand Down
26 changes: 26 additions & 0 deletions clang/test/SemaCUDA/function-target-disabled-check.cu
@@ -0,0 +1,26 @@
// Test that we can disable cross-target call checks in Sema with the
// -fcuda-disable-target-call-checks flag. Without this flag we'd get a bunch
// of errors here, since there are invalid cross-target calls present.

// RUN: %clang_cc1 -fsyntax-only -verify %s -fcuda-disable-target-call-checks
// RUN: %clang_cc1 -fsyntax-only -fcuda-is-device -verify %s -fcuda-disable-target-call-checks

// expected-no-diagnostics

#define __device__ __attribute__((device))
#define __global__ __attribute__((global))
#define __host__ __attribute__((host))

__attribute__((host)) void h1();

__attribute__((device)) void d1() {
h1();
}

__attribute__((host)) void h2() {
d1();
}

__attribute__((global)) void g1() {
h2();
}

0 comments on commit 4bdc50e

Please sign in to comment.