[clang] ce6cc87 - [clang] Minor fix for MarkVarDeclODRUsed
Yaxun Liu via cfe-commits
cfe-commits at lists.llvm.org
Wed May 12 19:33:24 PDT 2021
Author: Yaxun (Sam) Liu
Date: 2021-05-12T22:32:10-04:00
New Revision: ce6cc87ce9e96eaa5e5ef0c1f5dc07b41381996d
URL: https://github.com/llvm/llvm-project/commit/ce6cc87ce9e96eaa5e5ef0c1f5dc07b41381996d
DIFF: https://github.com/llvm/llvm-project/commit/ce6cc87ce9e96eaa5e5ef0c1f5dc07b41381996d.diff
LOG: [clang] Minor fix for MarkVarDeclODRUsed
Merge two if as follow up of https://reviews.llvm.org/D102270
Added:
Modified:
clang/lib/Sema/SemaExpr.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index b8be6732b758..6e20eb5b99dd 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -17126,7 +17126,7 @@ MarkVarDeclODRUsed(VarDecl *Var, SourceLocation Loc, Sema &SemaRef,
CaptureType, DeclRefType,
FunctionScopeIndexToStopAt);
- if (SemaRef.LangOpts.CUDA) {
+ if (SemaRef.LangOpts.CUDA && Var && Var->hasGlobalStorage()) {
auto *FD = dyn_cast_or_null<FunctionDecl>(SemaRef.CurContext);
auto Target = SemaRef.IdentifyCUDATarget(FD);
auto IsEmittedOnDeviceSide = [](VarDecl *Var) {
@@ -17142,28 +17142,26 @@ MarkVarDeclODRUsed(VarDecl *Var, SourceLocation Loc, Sema &SemaRef,
}
return false;
};
- if (Var && Var->hasGlobalStorage()) {
- if (!IsEmittedOnDeviceSide(Var)) {
- // Diagnose ODR-use of host global variables in device functions.
- // Reference of device global variables in host functions is allowed
- // through shadow variables therefore it is not diagnosed.
- if (SemaRef.LangOpts.CUDAIsDevice)
- SemaRef.targetDiag(Loc, diag::err_ref_bad_target)
- << /*host*/ 2 << /*variable*/ 1 << Var << Target;
- } else if ((Target == Sema::CFT_Host || Target == Sema::CFT_HostDevice) &&
- !Var->hasExternalStorage()) {
- // Record a CUDA/HIP device side variable if it is ODR-used
- // by host code. This is done conservatively, when the variable is
- // referenced in any of the following contexts:
- // - a non-function context
- // - a host function
- // - a host device function
- // This makes the ODR-use of the device side variable by host code to
- // be visible in the device compilation for the compiler to be able to
- // emit template variables instantiated by host code only and to
- // externalize the static device side variable ODR-used by host code.
- SemaRef.getASTContext().CUDADeviceVarODRUsedByHost.insert(Var);
- }
+ if (!IsEmittedOnDeviceSide(Var)) {
+ // Diagnose ODR-use of host global variables in device functions.
+ // Reference of device global variables in host functions is allowed
+ // through shadow variables therefore it is not diagnosed.
+ if (SemaRef.LangOpts.CUDAIsDevice)
+ SemaRef.targetDiag(Loc, diag::err_ref_bad_target)
+ << /*host*/ 2 << /*variable*/ 1 << Var << Target;
+ } else if ((Target == Sema::CFT_Host || Target == Sema::CFT_HostDevice) &&
+ !Var->hasExternalStorage()) {
+ // Record a CUDA/HIP device side variable if it is ODR-used
+ // by host code. This is done conservatively, when the variable is
+ // referenced in any of the following contexts:
+ // - a non-function context
+ // - a host function
+ // - a host device function
+ // This makes the ODR-use of the device side variable by host code to
+ // be visible in the device compilation for the compiler to be able to
+ // emit template variables instantiated by host code only and to
+ // externalize the static device side variable ODR-used by host code.
+ SemaRef.getASTContext().CUDADeviceVarODRUsedByHost.insert(Var);
}
}
More information about the cfe-commits
mailing list