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
|
SemaChecking.cpp
|
||||||
SemaCodeComplete.cpp
|
SemaCodeComplete.cpp
|
||||||
SemaConsumer.cpp
|
SemaConsumer.cpp
|
||||||
|
SemaCUDA.cpp
|
||||||
SemaDecl.cpp
|
SemaDecl.cpp
|
||||||
SemaDeclAttr.cpp
|
SemaDeclAttr.cpp
|
||||||
SemaDeclCXX.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.
|
/// HandleMSProperty - Analyze a __delcspec(property) field of a C++ class.
|
||||||
///
|
///
|
||||||
MSPropertyDecl *Sema::HandleMSProperty(Scope *S, RecordDecl *Record,
|
MSPropertyDecl *Sema::HandleMSProperty(Scope *S, RecordDecl *Record,
|
||||||
|
|
|
@ -4588,23 +4588,6 @@ Sema::ActOnCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
|
||||||
ExecConfig, IsExecConfig);
|
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.
|
/// ActOnAsTypeExpr - create a new asType (bitcast) from the arguments.
|
||||||
///
|
///
|
||||||
/// __builtin_astype( value, dst type )
|
/// __builtin_astype( value, dst type )
|
||||||
|
|
Loading…
Reference in New Issue