[clang] Emitting VTables across multiple TUs. Make them weak. (PR #200942)
Patrick Simmons via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 1 14:51:36 PDT 2026
https://github.com/linuxrocks123 updated https://github.com/llvm/llvm-project/pull/200942
>From b9175405a1103751becac80b1ad38525f237fece Mon Sep 17 00:00:00 2001
From: Patrick Simmons <patrick.simmons at amd.com>
Date: Mon, 1 Jun 2026 16:27:48 -0500
Subject: [PATCH 1/3] Emitting VTables across multiple TUs. Make them weak.
---
clang/lib/CodeGen/CGOpenMPRuntime.cpp | 3 +++
1 file changed, 3 insertions(+)
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index 87e9824e677ba..8f0630fdc3403 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -1849,6 +1849,9 @@ void CGOpenMPRuntime::emitAndRegisterVTable(CodeGenModule &CGM,
CGM.EmitVTable(CXXRecord);
CodeGenVTables VTables = CGM.getVTables();
llvm::GlobalVariable *VTablesAddr = VTables.GetAddrOfVTable(CXXRecord);
+ // Must set VTables to weak since we're emitting them in multiple TUs now
+ if(!VTablesAddr->hasWeakLinkage())
+ VTablesAddr->setLinkage(llvm::GlobalValue::WeakODRLinkage);
assert(VTablesAddr && "Expected non-null VTable address");
CGM.getOpenMPRuntime().registerVTableOffloadEntry(VTablesAddr, VD);
// Emit VTable for all the fields containing dynamic CXXRecord
>From 2ce8df629761931053b54bed9c2ec02cd2a8442f Mon Sep 17 00:00:00 2001
From: Patrick Simmons <patrick.simmons at amd.com>
Date: Mon, 1 Jun 2026 16:30:08 -0500
Subject: [PATCH 2/3] Fix formatting
---
clang/lib/CodeGen/CGOpenMPRuntime.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index 8f0630fdc3403..5d666d205a680 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -1850,7 +1850,7 @@ void CGOpenMPRuntime::emitAndRegisterVTable(CodeGenModule &CGM,
CodeGenVTables VTables = CGM.getVTables();
llvm::GlobalVariable *VTablesAddr = VTables.GetAddrOfVTable(CXXRecord);
// Must set VTables to weak since we're emitting them in multiple TUs now
- if(!VTablesAddr->hasWeakLinkage())
+ if (!VTablesAddr->hasWeakLinkage())
VTablesAddr->setLinkage(llvm::GlobalValue::WeakODRLinkage);
assert(VTablesAddr && "Expected non-null VTable address");
CGM.getOpenMPRuntime().registerVTableOffloadEntry(VTablesAddr, VD);
>From 7496a3d825366102abee8b518ff56121f1de5e9d Mon Sep 17 00:00:00 2001
From: Patrick Simmons <patrick.simmons at amd.com>
Date: Mon, 1 Jun 2026 16:50:55 -0500
Subject: [PATCH 3/3] Restrict linkage reset to vtables with ExternalLinkage
only
---
clang/lib/CodeGen/CGOpenMPRuntime.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index 5d666d205a680..ab36b7b8d0c5b 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -1850,7 +1850,7 @@ void CGOpenMPRuntime::emitAndRegisterVTable(CodeGenModule &CGM,
CodeGenVTables VTables = CGM.getVTables();
llvm::GlobalVariable *VTablesAddr = VTables.GetAddrOfVTable(CXXRecord);
// Must set VTables to weak since we're emitting them in multiple TUs now
- if (!VTablesAddr->hasWeakLinkage())
+ if (VTablesAddr->hasExternalLinkage())
VTablesAddr->setLinkage(llvm::GlobalValue::WeakODRLinkage);
assert(VTablesAddr && "Expected non-null VTable address");
CGM.getOpenMPRuntime().registerVTableOffloadEntry(VTablesAddr, VD);
More information about the cfe-commits
mailing list