From 98575708da9544ccab8939fece9c3d638a32f09f Mon Sep 17 00:00:00 2001 From: "Yaxun (Sam) Liu" Date: Tue, 11 May 2021 10:09:38 -0400 Subject: [CUDA][HIP] Fix device template variables Currently clang does not emit device template variables instantiated only in host functions, however, nvcc is able to do that: https://godbolt.org/z/fneEfferY This patch fixes this issue by refactoring and extending the existing mechanism for emitting static device var ODR-used by host only. Basically clang records device variables ODR-used by host code and force them to be emitted in device compilation. The existing mechanism makes sure these device variables ODR-used by host code are added to llvm.compiler-used, therefore they are guaranteed not to be deleted. It also fixes non-ODR-use of static device variable by host code causing static device variable to be emitted and registered, which should not. Reviewed by: Artem Belevich Differential Revision: https://reviews.llvm.org/D102237 --- clang/lib/CodeGen/CodeGenModule.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'clang/lib/CodeGen/CodeGenModule.cpp') diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index c61da1c980a2..e3c843c8e9d3 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -2362,8 +2362,8 @@ void CodeGenModule::EmitDeferred() { } // Emit CUDA/HIP static device variables referenced by host code only. - if (getLangOpts().CUDA) - for (auto V : getContext().CUDAStaticDeviceVarReferencedByHost) + if (getLangOpts().CUDA && getLangOpts().CUDAIsDevice) + for (const auto *V : getContext().CUDADeviceVarODRUsedByHost) DeferredDeclsToEmit.push_back(V); // Stop if we're out of both deferred vtables and deferred declarations. -- cgit v1.2.3