forked from OSchip/llvm-project
Split off CUDA-specific Sema parts to a new file
In line with SemaOpenMP.cpp, etc. CUDA-specific semantic analysis code goes into a separate file. This is in anticipation of adding extra functionality here in the near future. No change in functionality. Review: http://reviews.llvm.org/D5160 llvm-svn: 217043
This commit is contained in:
parent
c4e0c1075b
commit
7325e56c10
|
@ -21,6 +21,7 @@ add_clang_library(clangSema
|
|||
SemaChecking.cpp
|
||||
SemaCodeComplete.cpp
|
||||
SemaConsumer.cpp
|
||||
SemaCUDA.cpp
|
||||
SemaDecl.cpp
|
||||
SemaDeclAttr.cpp
|
||||
SemaDeclCXX.cpp
|
||||
|
|
|
@ -0,0 +1,76 @@
|
|||
//===--- SemaCUDA.cpp - Semantic Analysis for CUDA constructs -------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// \file
|
||||
/// \brief This file implements semantic analysis for CUDA constructs.
|
||||
///
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "clang/Sema/Sema.h"
|
||||
#include "clang/AST/ASTContext.h"
|
||||
#include "clang/AST/Decl.h"
|
||||
#include "clang/Sema/SemaDiagnostic.h"
|
||||
using namespace clang;
|
||||
|
||||
ExprResult Sema::ActOnCUDAExecConfigExpr(Scope *S, SourceLocation LLLLoc,
|
||||
MultiExprArg ExecConfig,
|
||||
SourceLocation GGGLoc) {
|
||||
FunctionDecl *ConfigDecl = Context.getcudaConfigureCallDecl();
|
||||
if (!ConfigDecl)
|
||||
return ExprError(Diag(LLLLoc, diag::err_undeclared_var_use)
|
||||
<< "cudaConfigureCall");
|
||||
QualType ConfigQTy = ConfigDecl->getType();
|
||||
|
||||
DeclRefExpr *ConfigDR = new (Context)
|
||||
DeclRefExpr(ConfigDecl, false, ConfigQTy, VK_LValue, LLLLoc);
|
||||
MarkFunctionReferenced(LLLLoc, ConfigDecl);
|
||||
|
||||
return ActOnCallExpr(S, ConfigDR, LLLLoc, ExecConfig, GGGLoc, nullptr,
|
||||
/*IsExecConfig=*/true);
|
||||
}
|
||||
|
||||
/// IdentifyCUDATarget - Determine the CUDA compilation target for this function
|
||||
Sema::CUDAFunctionTarget Sema::IdentifyCUDATarget(const FunctionDecl *D) {
|
||||
// Implicitly declared functions (e.g. copy constructors) are
|
||||
// __host__ __device__
|
||||
if (D->isImplicit())
|
||||
return CFT_HostDevice;
|
||||
|
||||
if (D->hasAttr<CUDAGlobalAttr>())
|
||||
return CFT_Global;
|
||||
|
||||
if (D->hasAttr<CUDADeviceAttr>()) {
|
||||
if (D->hasAttr<CUDAHostAttr>())
|
||||
return CFT_HostDevice;
|
||||
return CFT_Device;
|
||||
}
|
||||
|
||||
return CFT_Host;
|
||||
}
|
||||
|
||||
bool Sema::CheckCUDATarget(CUDAFunctionTarget CallerTarget,
|
||||
CUDAFunctionTarget CalleeTarget) {
|
||||
// CUDA B.1.1 "The __device__ qualifier declares a function that is...
|
||||
// Callable from the device only."
|
||||
if (CallerTarget == CFT_Host && CalleeTarget == CFT_Device)
|
||||
return true;
|
||||
|
||||
// CUDA B.1.2 "The __global__ qualifier declares a function that is...
|
||||
// Callable from the host only."
|
||||
// CUDA B.1.3 "The __host__ qualifier declares a function that is...
|
||||
// Callable from the host only."
|
||||
if ((CallerTarget == CFT_Device || CallerTarget == CFT_Global) &&
|
||||
(CalleeTarget == CFT_Host || CalleeTarget == CFT_Global))
|
||||
return true;
|
||||
|
||||
if (CallerTarget == CFT_HostDevice && CalleeTarget != CFT_HostDevice)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
@ -13101,46 +13101,6 @@ Sema::checkExceptionSpecification(ExceptionSpecificationType EST,
|
|||
}
|
||||
}
|
||||
|
||||
/// IdentifyCUDATarget - Determine the CUDA compilation target for this function
|
||||
Sema::CUDAFunctionTarget Sema::IdentifyCUDATarget(const FunctionDecl *D) {
|
||||
// Implicitly declared functions (e.g. copy constructors) are
|
||||
// __host__ __device__
|
||||
if (D->isImplicit())
|
||||
return CFT_HostDevice;
|
||||
|
||||
if (D->hasAttr<CUDAGlobalAttr>())
|
||||
return CFT_Global;
|
||||
|
||||
if (D->hasAttr<CUDADeviceAttr>()) {
|
||||
if (D->hasAttr<CUDAHostAttr>())
|
||||
return CFT_HostDevice;
|
||||
return CFT_Device;
|
||||
}
|
||||
|
||||
return CFT_Host;
|
||||
}
|
||||
|
||||
bool Sema::CheckCUDATarget(CUDAFunctionTarget CallerTarget,
|
||||
CUDAFunctionTarget CalleeTarget) {
|
||||
// CUDA B.1.1 "The __device__ qualifier declares a function that is...
|
||||
// Callable from the device only."
|
||||
if (CallerTarget == CFT_Host && CalleeTarget == CFT_Device)
|
||||
return true;
|
||||
|
||||
// CUDA B.1.2 "The __global__ qualifier declares a function that is...
|
||||
// Callable from the host only."
|
||||
// CUDA B.1.3 "The __host__ qualifier declares a function that is...
|
||||
// Callable from the host only."
|
||||
if ((CallerTarget == CFT_Device || CallerTarget == CFT_Global) &&
|
||||
(CalleeTarget == CFT_Host || CalleeTarget == CFT_Global))
|
||||
return true;
|
||||
|
||||
if (CallerTarget == CFT_HostDevice && CalleeTarget != CFT_HostDevice)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// HandleMSProperty - Analyze a __delcspec(property) field of a C++ class.
|
||||
///
|
||||
MSPropertyDecl *Sema::HandleMSProperty(Scope *S, RecordDecl *Record,
|
||||
|
|
|
@ -4588,23 +4588,6 @@ Sema::ActOnCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
|
|||
ExecConfig, IsExecConfig);
|
||||
}
|
||||
|
||||
ExprResult
|
||||
Sema::ActOnCUDAExecConfigExpr(Scope *S, SourceLocation LLLLoc,
|
||||
MultiExprArg ExecConfig, SourceLocation GGGLoc) {
|
||||
FunctionDecl *ConfigDecl = Context.getcudaConfigureCallDecl();
|
||||
if (!ConfigDecl)
|
||||
return ExprError(Diag(LLLLoc, diag::err_undeclared_var_use)
|
||||
<< "cudaConfigureCall");
|
||||
QualType ConfigQTy = ConfigDecl->getType();
|
||||
|
||||
DeclRefExpr *ConfigDR = new (Context) DeclRefExpr(
|
||||
ConfigDecl, false, ConfigQTy, VK_LValue, LLLLoc);
|
||||
MarkFunctionReferenced(LLLLoc, ConfigDecl);
|
||||
|
||||
return ActOnCallExpr(S, ConfigDR, LLLLoc, ExecConfig, GGGLoc, nullptr,
|
||||
/*IsExecConfig=*/true);
|
||||
}
|
||||
|
||||
/// ActOnAsTypeExpr - create a new asType (bitcast) from the arguments.
|
||||
///
|
||||
/// __builtin_astype( value, dst type )
|
||||
|
|
Loading…
Reference in New Issue