Author: Anshil Gandhi
Date: 2025-02-19T23:47:22-05:00
New Revision: 95000fdb9e98a88b923fa7aa4bdeffbc618a323c

URL: 
https://github.com/llvm/llvm-project/commit/95000fdb9e98a88b923fa7aa4bdeffbc618a323c
DIFF: 
https://github.com/llvm/llvm-project/commit/95000fdb9e98a88b923fa7aa4bdeffbc618a323c.diff

LOG: [CUDA] Increment VTable index for device thunks (#124989)

Currently, the clang frontend incorrectly emits the callee instead of
the thunk for the callee in the VTable. This is the case because the
thunk index is not incremented when their callees cannot be emitted.
This patch fixes the bug.

Added: 
    

Modified: 
    clang/lib/CodeGen/CGVTables.cpp
    clang/test/CodeGenCUDA/increment-index-for-thunks.cu

Removed: 
    


################################################################################
diff  --git a/clang/lib/CodeGen/CGVTables.cpp b/clang/lib/CodeGen/CGVTables.cpp
index 7faf6821a6cdc..c9108938bca50 100644
--- a/clang/lib/CodeGen/CGVTables.cpp
+++ b/clang/lib/CodeGen/CGVTables.cpp
@@ -771,6 +771,10 @@ void 
CodeGenVTables::addVTableComponent(ConstantArrayBuilder &builder,
   case VTableComponent::CK_DeletingDtorPointer: {
     GlobalDecl GD = component.getGlobalDecl();
 
+    const bool IsThunk =
+        nextVTableThunkIndex < layout.vtable_thunks().size() &&
+        layout.vtable_thunks()[nextVTableThunkIndex].first == componentIndex;
+
     if (CGM.getLangOpts().CUDA) {
       // Emit NULL for methods we can't codegen on this
       // side. Otherwise we'd end up with vtable with unresolved
@@ -782,9 +786,12 @@ void 
CodeGenVTables::addVTableComponent(ConstantArrayBuilder &builder,
           CGM.getLangOpts().CUDAIsDevice
               ? MD->hasAttr<CUDADeviceAttr>()
               : (MD->hasAttr<CUDAHostAttr>() || 
!MD->hasAttr<CUDADeviceAttr>());
-      if (!CanEmitMethod)
+      if (!CanEmitMethod) {
+        if (IsThunk)
+          nextVTableThunkIndex++;
         return builder.add(
             llvm::ConstantExpr::getNullValue(CGM.GlobalsInt8PtrTy));
+      }
       // Method is acceptable, continue processing as usual.
     }
 
@@ -830,9 +837,7 @@ void 
CodeGenVTables::addVTableComponent(ConstantArrayBuilder &builder,
       fnPtr = DeletedVirtualFn;
 
     // Thunks.
-    } else if (nextVTableThunkIndex < layout.vtable_thunks().size() &&
-               layout.vtable_thunks()[nextVTableThunkIndex].first ==
-                   componentIndex) {
+    } else if (IsThunk) {
       auto &thunkInfo = layout.vtable_thunks()[nextVTableThunkIndex].second;
 
       nextVTableThunkIndex++;

diff  --git a/clang/test/CodeGenCUDA/increment-index-for-thunks.cu 
b/clang/test/CodeGenCUDA/increment-index-for-thunks.cu
index af764198f5ea7..48dbf6ef82b7d 100644
--- a/clang/test/CodeGenCUDA/increment-index-for-thunks.cu
+++ b/clang/test/CodeGenCUDA/increment-index-for-thunks.cu
@@ -3,10 +3,10 @@
 // RUN: %clang_cc1 -fcuda-is-device -triple spirv64-amd-amdhsa \
 // RUN:   -emit-llvm -xhip %s -o - | FileCheck %s --check-prefix=SPIRV
 
-// GCN: @_ZTV1C = linkonce_odr unnamed_addr addrspace(1) constant { [5 x ptr 
addrspace(1)], [4 x ptr addrspace(1)] } { [5 x ptr addrspace(1)] [ptr 
addrspace(1) null, ptr addrspace(1) null, ptr addrspace(1) addrspacecast (ptr 
@_ZN1B2f2Ev to ptr addrspace(1)), ptr addrspace(1) null, ptr addrspace(1) 
addrspacecast (ptr @_ZN1C2f1Ev to ptr addrspace(1))], [4 x ptr addrspace(1)] 
[ptr addrspace(1) inttoptr (i64 -8 to ptr addrspace(1)), ptr addrspace(1) null, 
ptr addrspace(1) null, ptr addrspace(1) addrspacecast (ptr @_ZN1C2f1Ev to ptr 
addrspace(1))] }, comdat, align 8
+// GCN: @_ZTV1C = linkonce_odr unnamed_addr addrspace(1) constant { [5 x ptr 
addrspace(1)], [4 x ptr addrspace(1)] } { [5 x ptr addrspace(1)] [ptr 
addrspace(1) null, ptr addrspace(1) null, ptr addrspace(1) addrspacecast (ptr 
@_ZN1B2f2Ev to ptr addrspace(1)), ptr addrspace(1) null, ptr addrspace(1) 
addrspacecast (ptr @_ZN1C2f1Ev to ptr addrspace(1))], [4 x ptr addrspace(1)] 
[ptr addrspace(1) inttoptr (i64 -8 to ptr addrspace(1)), ptr addrspace(1) null, 
ptr addrspace(1) null, ptr addrspace(1) addrspacecast (ptr @_ZThn8_N1C2f1Ev to 
ptr addrspace(1))] }, comdat, align 8
 // GCN: @_ZTV1B = linkonce_odr unnamed_addr addrspace(1) constant { [3 x ptr 
addrspace(1)] } { [3 x ptr addrspace(1)] [ptr addrspace(1) null, ptr 
addrspace(1) null, ptr addrspace(1) addrspacecast (ptr @_ZN1B2f2Ev to ptr 
addrspace(1))] }, comdat, align 8
 // GCN: @_ZTV1A = linkonce_odr unnamed_addr addrspace(1) constant { [4 x ptr 
addrspace(1)] } { [4 x ptr addrspace(1)] [ptr addrspace(1) null, ptr 
addrspace(1) null, ptr addrspace(1) null, ptr addrspace(1) addrspacecast (ptr 
@__cxa_pure_virtual to ptr addrspace(1))] }, comdat, align 8
-// SPIRV: @_ZTV1C = linkonce_odr unnamed_addr addrspace(1) constant { [5 x ptr 
addrspace(1)], [4 x ptr addrspace(1)] } { [5 x ptr addrspace(1)] [ptr 
addrspace(1) null, ptr addrspace(1) null, ptr addrspace(1) addrspacecast (ptr 
addrspace(4) @_ZN1B2f2Ev to ptr addrspace(1)), ptr addrspace(1) null, ptr 
addrspace(1) addrspacecast (ptr addrspace(4) @_ZN1C2f1Ev to ptr addrspace(1))], 
[4 x ptr addrspace(1)] [ptr addrspace(1) inttoptr (i64 -8 to ptr addrspace(1)), 
ptr addrspace(1) null, ptr addrspace(1) null, ptr addrspace(1) addrspacecast 
(ptr addrspace(4) @_ZN1C2f1Ev to ptr addrspace(1))] }, comdat, align 8
+// SPIRV: @_ZTV1C = linkonce_odr unnamed_addr addrspace(1) constant { [5 x ptr 
addrspace(1)], [4 x ptr addrspace(1)] } { [5 x ptr addrspace(1)] [ptr 
addrspace(1) null, ptr addrspace(1) null, ptr addrspace(1) addrspacecast (ptr 
addrspace(4) @_ZN1B2f2Ev to ptr addrspace(1)), ptr addrspace(1) null, ptr 
addrspace(1) addrspacecast (ptr addrspace(4) @_ZN1C2f1Ev to ptr addrspace(1))], 
[4 x ptr addrspace(1)] [ptr addrspace(1) inttoptr (i64 -8 to ptr addrspace(1)), 
ptr addrspace(1) null, ptr addrspace(1) null, ptr addrspace(1) addrspacecast 
(ptr addrspace(4) @_ZThn8_N1C2f1Ev to ptr addrspace(1))] }, comdat, align 8
 // SPIRV: @_ZTV1B = linkonce_odr unnamed_addr addrspace(1) constant { [3 x ptr 
addrspace(1)] } { [3 x ptr addrspace(1)] [ptr addrspace(1) null, ptr 
addrspace(1) null, ptr addrspace(1) addrspacecast (ptr addrspace(4) @_ZN1B2f2Ev 
to ptr addrspace(1))] }, comdat, align 8
 // SPIRV: @_ZTV1A = linkonce_odr unnamed_addr addrspace(1) constant { [4 x ptr 
addrspace(1)] } { [4 x ptr addrspace(1)] [ptr addrspace(1) null, ptr 
addrspace(1) null, ptr addrspace(1) null, ptr addrspace(1) addrspacecast (ptr 
addrspace(4) @__cxa_pure_virtual to ptr addrspace(1))] }, comdat, align 8
 


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to