[clang] [OpenMP] Mark critical region lock variables dso_local for static relocation model (PR #201157)
Shivam Gupta via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 8 04:18:33 PDT 2026
https://github.com/xgupta updated https://github.com/llvm/llvm-project/pull/201157
>From 5488aea662b8dfdf227130e83a20f0880daf941f Mon Sep 17 00:00:00 2001
From: Shivam Gupta <shivam98.tkg at gmail.com>
Date: Tue, 2 Jun 2026 22:26:55 +0530
Subject: [PATCH 1/3] [OpenMP] Mark critical region lock variables dso_local
for static relocation model
OpenMP named critical regions use lock variables of the form
`.gomp_critical_user_<name>.var`, which are created through
CGOpenMPRuntime::getCriticalRegionLock().
On X86, accesses to these variables currently use GOT-based relocations
even when compiling with a static relocation model (-fno-pic). This
results in relocations such as R_X86_64_REX_GOTPCRELX being emitted for
OpenMP critical lock variables.
Mark these lock variables as dso_local when the relocation model is
static. This allows LLVM to generate direct accesses to the lock
variable while preserving existing PIC/shared-library behavior.
This matches the GCC behaviour for `gomp_critical_user_*` lock
variables.
Rework of https://github.com/llvm/llvm-project/pull/75564.
---
clang/lib/CodeGen/CGOpenMPRuntime.cpp | 9 ++++++++-
clang/test/OpenMP/critical-dso-local.cpp | 17 +++++++++++++++++
2 files changed, 25 insertions(+), 1 deletion(-)
create mode 100644 clang/test/OpenMP/critical-dso-local.cpp
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index 87e9824e677ba..a844f123df56d 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -2069,7 +2069,14 @@ Address CGOpenMPRuntime::emitThreadIDAddress(CodeGenFunction &CGF,
llvm::Value *CGOpenMPRuntime::getCriticalRegionLock(StringRef CriticalName) {
std::string Prefix = Twine("gomp_critical_user_", CriticalName).str();
std::string Name = getName({Prefix, "var"});
- return OMPBuilder.getOrCreateInternalVariable(KmpCriticalNameTy, Name);
+
+ llvm::GlobalVariable *GV =
+ OMPBuilder.getOrCreateInternalVariable(KmpCriticalNameTy, Name);
+
+ if (CGM.getCodeGenOpts().RelocationModel == llvm::Reloc::Static)
+ GV->setDSOLocal(true);
+
+ return GV;
}
namespace {
diff --git a/clang/test/OpenMP/critical-dso-local.cpp b/clang/test/OpenMP/critical-dso-local.cpp
new file mode 100644
index 0000000000000..ec19a678c489f
--- /dev/null
+++ b/clang/test/OpenMP/critical-dso-local.cpp
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu \
+// RUN: -fopenmp \
+// RUN: -mrelocation-model static \
+// RUN: -emit-llvm %s -o - | FileCheck %s --check-prefix=STATIC
+
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu \
+// RUN: -fopenmp \
+// RUN: -mrelocation-model pic \
+// RUN: -emit-llvm %s -o - | FileCheck %s --check-prefix=PIC
+
+// STATIC: @.gomp_critical_user_foo.var = common dso_local global [8 x i32] zeroinitializer
+// PIC: @.gomp_critical_user_foo.var = common global [8 x i32] zeroinitializer
+
+void f() {
+#pragma omp critical(foo)
+ ;
+}
>From 601a8ba34e38502741ea1b6bf7482ed1c3192185 Mon Sep 17 00:00:00 2001
From: Shivam Gupta <shivam98.tkg at gmail.com>
Date: Wed, 3 Jun 2026 23:51:02 +0530
Subject: [PATCH 2/3] [OpenMP] Apply normal dso_local inference to critical
lock variables
---
clang/lib/CodeGen/CGOpenMPRuntime.cpp | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index a844f123df56d..47a4faa9eef6c 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -2072,9 +2072,7 @@ llvm::Value *CGOpenMPRuntime::getCriticalRegionLock(StringRef CriticalName) {
llvm::GlobalVariable *GV =
OMPBuilder.getOrCreateInternalVariable(KmpCriticalNameTy, Name);
-
- if (CGM.getCodeGenOpts().RelocationModel == llvm::Reloc::Static)
- GV->setDSOLocal(true);
+ CGM.setDSOLocal(GV);
return GV;
}
>From d26cedd2394626ba5536950189ef402b78b5d09b Mon Sep 17 00:00:00 2001
From: Shivam Gupta <Shivam98.tkg at gmail.com>
Date: Mon, 8 Jun 2026 16:47:14 +0530
Subject: [PATCH 3/3] Address review comment and failed test cases
---
clang/lib/CodeGen/CGOpenMPRuntime.cpp | 2 --
clang/test/OpenMP/critical-dso-local.cpp | 8 ++------
clang/test/OpenMP/critical_codegen.cpp | 6 +++---
clang/test/OpenMP/critical_codegen_attr.cpp | 6 +++---
4 files changed, 8 insertions(+), 14 deletions(-)
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index 47a4faa9eef6c..3ac41a3108ff7 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -2069,11 +2069,9 @@ Address CGOpenMPRuntime::emitThreadIDAddress(CodeGenFunction &CGF,
llvm::Value *CGOpenMPRuntime::getCriticalRegionLock(StringRef CriticalName) {
std::string Prefix = Twine("gomp_critical_user_", CriticalName).str();
std::string Name = getName({Prefix, "var"});
-
llvm::GlobalVariable *GV =
OMPBuilder.getOrCreateInternalVariable(KmpCriticalNameTy, Name);
CGM.setDSOLocal(GV);
-
return GV;
}
diff --git a/clang/test/OpenMP/critical-dso-local.cpp b/clang/test/OpenMP/critical-dso-local.cpp
index ec19a678c489f..8895f8f460d6e 100644
--- a/clang/test/OpenMP/critical-dso-local.cpp
+++ b/clang/test/OpenMP/critical-dso-local.cpp
@@ -1,11 +1,7 @@
-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu \
-// RUN: -fopenmp \
-// RUN: -mrelocation-model static \
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fopenmp -mrelocation-model static \
// RUN: -emit-llvm %s -o - | FileCheck %s --check-prefix=STATIC
-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu \
-// RUN: -fopenmp \
-// RUN: -mrelocation-model pic \
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fopenmp -mrelocation-model pic \
// RUN: -emit-llvm %s -o - | FileCheck %s --check-prefix=PIC
// STATIC: @.gomp_critical_user_foo.var = common dso_local global [8 x i32] zeroinitializer
diff --git a/clang/test/OpenMP/critical_codegen.cpp b/clang/test/OpenMP/critical_codegen.cpp
index 9620613dfdb87..c40ed4e632deb 100644
--- a/clang/test/OpenMP/critical_codegen.cpp
+++ b/clang/test/OpenMP/critical_codegen.cpp
@@ -16,9 +16,9 @@
#define HEADER
// ALL: [[IDENT_T_TY:%.+]] = type { i32, i32, i32, i32, ptr }
-// ALL: [[UNNAMED_LOCK:@.+]] = common global [8 x i32] zeroinitializer
-// ALL: [[THE_NAME_LOCK:@.+]] = common global [8 x i32] zeroinitializer
-// ALL: [[THE_NAME_LOCK1:@.+]] = common global [8 x i32] zeroinitializer
+// ALL: [[UNNAMED_LOCK:@.+]] = common {{(dso_local )?}}global [8 x i32] zeroinitializer
+// ALL: [[THE_NAME_LOCK:@.+]] = common {{(dso_local )?}}global [8 x i32] zeroinitializer
+// ALL: [[THE_NAME_LOCK1:@.+]] = common {{(dso_local )?}}global [8 x i32] zeroinitializer
// ALL: define {{.*}}void [[FOO:@.+]]()
diff --git a/clang/test/OpenMP/critical_codegen_attr.cpp b/clang/test/OpenMP/critical_codegen_attr.cpp
index 50b0b04fcfd4a..0014d16b2000f 100644
--- a/clang/test/OpenMP/critical_codegen_attr.cpp
+++ b/clang/test/OpenMP/critical_codegen_attr.cpp
@@ -16,9 +16,9 @@
#define HEADER
// ALL: [[IDENT_T_TY:%.+]] = type { i32, i32, i32, i32, ptr }
-// ALL: [[UNNAMED_LOCK:@.+]] = common global [8 x i32] zeroinitializer
-// ALL: [[THE_NAME_LOCK:@.+]] = common global [8 x i32] zeroinitializer
-// ALL: [[THE_NAME_LOCK1:@.+]] = common global [8 x i32] zeroinitializer
+// ALL: [[UNNAMED_LOCK:@.+]] = common {{(dso_local )?}}global [8 x i32] zeroinitializer
+// ALL: [[THE_NAME_LOCK:@.+]] = common {{(dso_local )?}}global [8 x i32] zeroinitializer
+// ALL: [[THE_NAME_LOCK1:@.+]] = common {{(dso_local )?}}global [8 x i32] zeroinitializer
// ALL: define {{.*}}void [[FOO:@.+]]()
More information about the cfe-commits
mailing list