https://github.com/gandhi56 created 
https://github.com/llvm/llvm-project/pull/124989

None

>From 0e2317ae0ef1377bc461e7e461bf3b699d75014d Mon Sep 17 00:00:00 2001
From: Anshil Gandhi <anshil.gan...@amd.com>
Date: Tue, 28 Jan 2025 18:04:44 -0600
Subject: [PATCH 1/3] [CUDA] Precommit test for VTable codegen

---
 .../CodeGenCUDA/increment-index-for-thunks.cu | 33 +++++++++++++++++++
 1 file changed, 33 insertions(+)
 create mode 100644 clang/test/CodeGenCUDA/increment-index-for-thunks.cu

diff --git a/clang/test/CodeGenCUDA/increment-index-for-thunks.cu 
b/clang/test/CodeGenCUDA/increment-index-for-thunks.cu
new file mode 100644
index 00000000000000..65c929ad4ce706
--- /dev/null
+++ b/clang/test/CodeGenCUDA/increment-index-for-thunks.cu
@@ -0,0 +1,33 @@
+// RUN: %clang_cc1 -fcuda-is-device -triple amdgcn-amd-amdhsa -target-cpu 
gfx942 \
+// RUN:   -emit-llvm -xhip %s -o - | FileCheck %s
+
+// CHECK: @_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
+// CHECK: @_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
+// CHECK: @_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
+// CHECK: @__hip_cuid_ = addrspace(1) global i8 0
+// CHECK: @llvm.compiler.used = appending addrspace(1) global [1 x ptr] [ptr 
addrspacecast (ptr addrspace(1) @__hip_cuid_ to ptr)], section "llvm.metadata"
+// CHECK: @__oclc_ABI_version = weak_odr hidden local_unnamed_addr 
addrspace(4) constant i32 500
+
+struct A {
+  __attribute__((device)) A() { }
+  virtual void neither_device_nor_host_f() = 0 ;
+  __attribute__((device)) virtual void f1() = 0;
+ 
+};
+ 
+struct B {
+  __attribute__((device)) B() { }
+  __attribute__((device)) virtual void f2() { };
+};
+ 
+struct C : public B, public A {
+  __attribute__((device)) C() : B(), A() { }
+ 
+   virtual void neither_device_nor_host_f() override { }
+  __attribute__((device)) virtual void f1() override { }
+ 
+};
+ 
+__attribute__((device)) void test() {
+  C obj;
+}

>From 96111e075df61e6e137f0f0c9c6b2aaefb5beca2 Mon Sep 17 00:00:00 2001
From: Anshil Gandhi <anshil.gan...@amd.com>
Date: Wed, 29 Jan 2025 15:06:45 -0600
Subject: [PATCH 2/3] - Test for SPIRV codegen as well

---
 .../CodeGenCUDA/increment-index-for-thunks.cu | 22 +++++++++++++------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/clang/test/CodeGenCUDA/increment-index-for-thunks.cu 
b/clang/test/CodeGenCUDA/increment-index-for-thunks.cu
index 65c929ad4ce706..c4ad064f4d938c 100644
--- a/clang/test/CodeGenCUDA/increment-index-for-thunks.cu
+++ b/clang/test/CodeGenCUDA/increment-index-for-thunks.cu
@@ -1,12 +1,20 @@
 // RUN: %clang_cc1 -fcuda-is-device -triple amdgcn-amd-amdhsa -target-cpu 
gfx942 \
-// RUN:   -emit-llvm -xhip %s -o - | FileCheck %s
+// RUN:   -emit-llvm -xhip %s -o - | FileCheck %s --check-prefix=GCN
+// RUN: %clang_cc1 -fcuda-is-device -triple spirv64-amd-amdhsa \
+// RUN:   -emit-llvm -xhip %s -o - | FileCheck %s --check-prefix=SPIRV
 
-// CHECK: @_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
-// CHECK: @_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
-// CHECK: @_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
-// CHECK: @__hip_cuid_ = addrspace(1) global i8 0
-// CHECK: @llvm.compiler.used = appending addrspace(1) global [1 x ptr] [ptr 
addrspacecast (ptr addrspace(1) @__hip_cuid_ to ptr)], section "llvm.metadata"
-// CHECK: @__oclc_ABI_version = weak_odr hidden local_unnamed_addr 
addrspace(4) constant i32 500
+// 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: @_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
+// GCN: @__hip_cuid_ = addrspace(1) global i8 0
+// GCN: @llvm.compiler.used = appending addrspace(1) global [1 x ptr] [ptr 
addrspacecast (ptr addrspace(1) @__hip_cuid_ to ptr)], section "llvm.metadata"
+// GCN: @__oclc_ABI_version = weak_odr hidden local_unnamed_addr addrspace(4) 
constant i32 500
+
+// 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: @_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
+// SPIRV: @__hip_cuid_ = addrspace(1) global i8 0
+// SPIRV: @llvm.compiler.used = appending addrspace(1) global [1 x ptr 
addrspace(4)] [ptr addrspace(4) addrspacecast (ptr addrspace(1) @__hip_cuid_ to 
ptr addrspace(4))], section "llvm.metadata"
 
 struct A {
   __attribute__((device)) A() { }

>From 5836311ddcc7a7209faed373af05602375876179 Mon Sep 17 00:00:00 2001
From: Anshil Gandhi <anshil.gan...@amd.com>
Date: Wed, 29 Jan 2025 14:40:19 -0600
Subject: [PATCH 3/3] [CUDA] Increment VTable index for device thunks

---
 clang/lib/CodeGen/CGVTables.cpp                     | 13 +++++++++----
 .../test/CodeGenCUDA/increment-index-for-thunks.cu  |  4 ++--
 2 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/clang/lib/CodeGen/CGVTables.cpp b/clang/lib/CodeGen/CGVTables.cpp
index 7f729d359b82b3..c5c4f522de94da 100644
--- a/clang/lib/CodeGen/CGVTables.cpp
+++ b/clang/lib/CodeGen/CGVTables.cpp
@@ -772,6 +772,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
@@ -783,9 +787,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.
     }
 
@@ -831,9 +838,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 c4ad064f4d938c..80631338dbdb8a 100644
--- a/clang/test/CodeGenCUDA/increment-index-for-thunks.cu
+++ b/clang/test/CodeGenCUDA/increment-index-for-thunks.cu
@@ -3,14 +3,14 @@
 // 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
 // GCN: @__hip_cuid_ = addrspace(1) global i8 0
 // GCN: @llvm.compiler.used = appending addrspace(1) global [1 x ptr] [ptr 
addrspacecast (ptr addrspace(1) @__hip_cuid_ to ptr)], section "llvm.metadata"
 // GCN: @__oclc_ABI_version = weak_odr hidden local_unnamed_addr addrspace(4) 
constant i32 500
 
-// 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
 // SPIRV: @__hip_cuid_ = addrspace(1) global i8 0

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

Reply via email to