[clang] Revert "[clang] Revert "Disable Unique Internal Linkage Names for internal global vars." (#219261)" (PR #222486)

via cfe-commits cfe-commits at lists.llvm.org
Wed Sep 9 17:55:05 PDT 2026


https://github.com/SharonXSharon created https://github.com/llvm/llvm-project/pull/222486



This reverts commit 9abbc9183d2231c2e44198100a6cd22ef66e2eb8.

Will reland with a proper fix of the GNU AsmLabelAttr

>From 334063be82bb7ad7b64b4084a6eb0510dc8d796f Mon Sep 17 00:00:00 2001
From: Sharon Xu <sharonxu at fb.com>
Date: Wed, 9 Sep 2026 17:51:14 -0700
Subject: [PATCH] Revert "[clang] Revert "Disable Unique Internal Linkage Names
 for internal global vars." (#219261)"

This reverts commit 9abbc9183d2231c2e44198100a6cd22ef66e2eb8.
---
 clang/docs/ReleaseNotes.md                    |  8 ------
 clang/lib/AST/ItaniumMangle.cpp               | 12 +++++----
 clang/lib/CodeGen/CodeGenModule.cpp           | 11 +++-----
 .../CodeGen/unique-internal-linkage-names.cpp | 27 +++++++------------
 .../unique-internal-linkage-names-dwarf.c     |  6 ++---
 .../unique-internal-linkage-names-dwarf.cpp   | 14 +++++-----
 6 files changed, 30 insertions(+), 48 deletions(-)

diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md
index 92d30d347107d..e42e85deb1f59 100644
--- a/clang/docs/ReleaseNotes.md
+++ b/clang/docs/ReleaseNotes.md
@@ -261,14 +261,6 @@ features cannot lower the translation-unit ABI level;
 
 - All options of the `-fzero-call-used-regs` compiler flag are now allowed on RISC-V.
 
-- `-funique-internal-linkage-names` now gives internal global variables a
-  unique `.__uniq.<module-hash>` suffix, as it already does for functions. This
-  helps profiling tools distinguish static variables with the same name in
-  different source files. LLVM can demangle these suffixes for both functions
-  and data symbols. GNU libiberty can demangle suffixed function symbols, but
-  leaves suffixed data symbols unchanged. The option remains opt-in, and
-  variables with explicit assembly labels keep their original names.
-
 ### Removed Compiler Flags
 
 ### Attribute Changes in Clang
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 298f3efbfa221..3a3cde3448f44 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -726,18 +726,20 @@ bool ItaniumMangleContextImpl::isInternalLinkageDecl(const NamedDecl *ND) {
   return false;
 }
 
-// Check if this Decl needs a unique internal linkage name.
+// Check if this Function Decl needs a unique internal linkage name.
 bool ItaniumMangleContextImpl::isUniqueInternalLinkageDecl(
     const NamedDecl *ND) {
   if (!NeedsUniqueInternalLinkageNames || !ND)
     return false;
 
+  const auto *FD = dyn_cast<FunctionDecl>(ND);
+  if (!FD)
+    return false;
+
   // For C functions without prototypes, return false as their
   // names should not be mangled.
-  if (const auto *FD = dyn_cast<FunctionDecl>(ND)) {
-    if (!FD->getType()->getAs<FunctionProtoType>())
-      return false;
-  }
+  if (!FD->getType()->getAs<FunctionProtoType>())
+    return false;
 
   if (isInternalLinkageDecl(ND))
     return true;
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 8890d2a4b1b7e..b7bd5744bcb09 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -2467,17 +2467,14 @@ static void AppendCPUSpecificCPUDispatchMangling(const CodeGenModule &CGM,
     Out << ".resolver";
 }
 
-// Returns true if GD is a function/var decl with internal linkage and
+// Returns true if GD is a function decl with internal linkage and
 // needs a unique suffix after the mangled name.
 static bool isUniqueInternalLinkageDecl(GlobalDecl GD,
                                         CodeGenModule &CGM) {
   const Decl *D = GD.getDecl();
-  if (CGM.getModuleNameHash().empty() || D->hasAttr<AsmLabelAttr>())
-    return false;
-  return (isa<FunctionDecl>(D) &&
-          CGM.getFunctionLinkage(GD) == llvm::GlobalValue::InternalLinkage) ||
-         (isa<VarDecl>(D) && CGM.getContext().GetGVALinkageForVariable(
-                                 cast<VarDecl>(D)) == GVA_Internal);
+  return !CGM.getModuleNameHash().empty() && isa<FunctionDecl>(D) &&
+         !D->hasAttr<AsmLabelAttr>() &&
+         (CGM.getFunctionLinkage(GD) == llvm::GlobalValue::InternalLinkage);
 }
 
 static std::string getMangledNameImpl(CodeGenModule &CGM, GlobalDecl GD,
diff --git a/clang/test/CodeGen/unique-internal-linkage-names.cpp b/clang/test/CodeGen/unique-internal-linkage-names.cpp
index a65813a6fb338..b5c4824575372 100644
--- a/clang/test/CodeGen/unique-internal-linkage-names.cpp
+++ b/clang/test/CodeGen/unique-internal-linkage-names.cpp
@@ -64,13 +64,8 @@ static int asm_label() asm("custom_label");
 static int asm_label() { return 0; }
 int call_asm_label() { return asm_label(); }
 
-// Likewise for a static variable with an asm label.
-static int asm_label_var asm("custom_var_label");
-int read_asm_label_var() { return asm_label_var; }
-
 // PLAIN: @_ZL4glob = internal global
 // PLAIN: @_ZZ8retAnonMvE5fGlob = internal global
-// PLAIN: @custom_var_label = internal global
 // PLAIN: @_ZN12_GLOBAL__N_16anon_mE = internal global
 // PLAIN: define internal noundef i32 @_ZL3foov()
 // PLAIN: define internal noundef i32 @_ZN12_GLOBAL__N_14getMEv
@@ -81,11 +76,10 @@ int read_asm_label_var() { return asm_label_var; }
 // PLAIN: define internal noundef i32 @_ZL4mverv()
 // PLAIN: define internal noundef i32 @_ZL4mverv.sse4.2()
 // PLAIN-NOT: "sample-profile-suffix-elision-policy"
-// UNIQUE: @_ZL4glob.[[MODHASH:__uniq.[0-9]+]] = internal global
-// UNIQUE: @_ZZ8retAnonMvE5fGlob.[[MODHASH]] = internal global
-// UNIQUE: @custom_var_label = internal global
-// UNIQUE: @_ZN12_GLOBAL__N_16anon_mE.[[MODHASH]] = internal global
-// UNIQUE: define internal noundef i32 @_ZL3foov.[[MODHASH]]() #[[#ATTR:]] {
+// UNIQUE: @_ZL4glob = internal global
+// UNIQUE: @_ZZ8retAnonMvE5fGlob = internal global
+// UNIQUE: @_ZN12_GLOBAL__N_16anon_mE = internal global
+// UNIQUE: define internal noundef i32 @_ZL3foov.[[MODHASH:__uniq.[0-9]+]]() #[[#ATTR:]] {
 // UNIQUE: define internal noundef i32 @_ZN12_GLOBAL__N_14getMEv.[[MODHASH]]
 // UNIQUE: define internal ptr @_ZL4mverv.[[MODHASH]].resolver()
 // UNIQUE: define internal void @_ZN12_GLOBAL__N_11AC1Ev.__uniq.68358509610070717889884130747296293671
@@ -98,10 +92,9 @@ int read_asm_label_var() { return asm_label_var; }
 // Expected module path and unique ID
 // /repro/src/path/unique-internal-linkage-names.cpp => __uniq.5283619504002921413211664429594652319
 
-// UNIQUE-PATH-MAP-LINUX: @_ZL4glob.__uniq.5283619504002921413211664429594652319 = internal global
-// UNIQUE-PATH-MAP-LINUX: @_ZZ8retAnonMvE5fGlob.__uniq.5283619504002921413211664429594652319 = internal global
-// UNIQUE-PATH-MAP-LINUX: @custom_var_label = internal global
-// UNIQUE-PATH-MAP-LINUX: @_ZN12_GLOBAL__N_16anon_mE.__uniq.5283619504002921413211664429594652319 = internal global
+// UNIQUE-PATH-MAP-LINUX: @_ZL4glob = internal global
+// UNIQUE-PATH-MAP-LINUX: @_ZZ8retAnonMvE5fGlob = internal global
+// UNIQUE-PATH-MAP-LINUX: @_ZN12_GLOBAL__N_16anon_mE = internal global
 // UNIQUE-PATH-MAP-LINUX: define internal noundef i32 @_ZL3foov.__uniq.5283619504002921413211664429594652319() #[[#ATTR:]] {
 // UNIQUE-PATH-MAP-LINUX: define internal noundef i32 @_ZN12_GLOBAL__N_14getMEv.__uniq.5283619504002921413211664429594652319
 // UNIQUE-PATH-MAP-LINUX: define internal ptr @_ZL4mverv.__uniq.5283619504002921413211664429594652319.resolver()
@@ -114,11 +107,9 @@ int read_asm_label_var() { return asm_label_var; }
 // Expected module path and unique ID
 // \repro\src\path\unique-internal-linkage-names.cpp => __uniq.68451533753012730514350177221027644473
 
-// Note: 'glob' is not mangled under the MS ABI, so it gets no unique suffix.
 // UNIQUE-PATH-MAP-WINDOWS: @glob = internal global
-// UNIQUE-PATH-MAP-WINDOWS: @"?fGlob@?1??retAnonM@@YAHXZ at 4HA.__uniq.68451533753012730514350177221027644473" = internal global
-// UNIQUE-PATH-MAP-WINDOWS: @custom_var_label = internal global
-// UNIQUE-PATH-MAP-WINDOWS: @"?anon_m@?{{.*}}@@3HA.__uniq.68451533753012730514350177221027644473" = internal global
+// UNIQUE-PATH-MAP-WINDOWS: @"?fGlob@?1??retAnonM@@YAHXZ at 4HA" = internal global
+// UNIQUE-PATH-MAP-WINDOWS: @"?anon_m@?{{.*}}@@3HA" = internal global
 // UNIQUE-PATH-MAP-WINDOWS: ret ptr @"?foo@@YAHXZ.__uniq.68451533753012730514350177221027644473"
 // UNIQUE-PATH-MAP-WINDOWS: define internal noundef i32 @"?foo@@YAHXZ.__uniq.68451533753012730514350177221027644473"
 // UNIQUE-PATH-MAP-WINDOWS: define internal i32 @"?mver@@YAHXZ.__uniq.68451533753012730514350177221027644473.resolver"()
diff --git a/clang/test/DebugInfo/Generic/unique-internal-linkage-names-dwarf.c b/clang/test/DebugInfo/Generic/unique-internal-linkage-names-dwarf.c
index 8f9dc143654c9..5a401182450ab 100644
--- a/clang/test/DebugInfo/Generic/unique-internal-linkage-names-dwarf.c
+++ b/clang/test/DebugInfo/Generic/unique-internal-linkage-names-dwarf.c
@@ -33,9 +33,9 @@ void baz(void) {
 // PLAIN: distinct !DISubprogram(name: "bar"{{.*}})
 // PLAIN-NOT: linkageName:
 //
-// UNIQUE: @_ZL4glob.[[MODHASH:__uniq.[0-9]+]] = internal global i32
-// UNIQUE: define internal i32 @_ZL3foov.[[MODHASH]]()
+// UNIQUE: @glob = internal global i32
+// UNIQUE: define internal i32 @_ZL3foov.[[MODHASH:__uniq.[0-9]+]]()
 // UNIQUE: define internal i32 @_ZL3bari.[[MODHASH]](i32 noundef %a)
-// UNIQUE: distinct !DIGlobalVariable(name: "glob", linkageName: "_ZL4glob.[[MODHASH]]"{{.*}})
+// UNIQUE: distinct !DIGlobalVariable(name: "glob"{{.*}})
 // UNIQUE: distinct !DISubprogram(name: "foo", linkageName: "_ZL3foov.[[MODHASH]]"{{.*}})
 // UNIQUE: distinct !DISubprogram(name: "bar", linkageName: "_ZL3bari.[[MODHASH]]"{{.*}})
diff --git a/clang/test/DebugInfo/Generic/unique-internal-linkage-names-dwarf.cpp b/clang/test/DebugInfo/Generic/unique-internal-linkage-names-dwarf.cpp
index e49fe5736092d..cdd7062a3a009 100644
--- a/clang/test/DebugInfo/Generic/unique-internal-linkage-names-dwarf.cpp
+++ b/clang/test/DebugInfo/Generic/unique-internal-linkage-names-dwarf.cpp
@@ -46,15 +46,15 @@ void baz() {
 // PLAIN-DAG: distinct !DIGlobalVariable(name: "glob_zip", linkageName: "_ZL8glob_zip"{{.*}})
 // PLAIN-DAG: distinct !DISubprogram(name: "zip", linkageName: "_ZL3zipv"{{.*}})
 
-// UNIQUE-DAG: @_ZL8glob_foo.[[MODHASH:__uniq\.[0-9]+]] = internal global i32
-// UNIQUE-DAG: define internal noundef i32 @_ZL3foov.[[MODHASH]]()
-// UNIQUE-DAG: distinct !DIGlobalVariable(name: "glob_foo", linkageName: "_ZL8glob_foo.[[MODHASH]]"{{.*}})
+// UNIQUE-DAG: @_ZL8glob_foo = internal global i32
+// UNIQUE-DAG: define internal noundef i32 @_ZL3foov.[[MODHASH:__uniq\.[0-9]+]]()
+// UNIQUE-DAG: distinct !DIGlobalVariable(name: "glob_foo", linkageName: "_ZL8glob_foo"{{.*}})
 // UNIQUE-DAG: distinct !DISubprogram(name: "foo", linkageName: "_ZL3foov.[[MODHASH]]"{{.*}})
-// UNIQUE-DAG: @_ZN12_GLOBAL__N_18glob_barE.[[MODHASH]] = internal global i32
+// UNIQUE-DAG: @_ZN12_GLOBAL__N_18glob_barE = internal global i32
 // UNIQUE-DAG: define internal noundef i32 @_ZN12_GLOBAL__N_13barEv.[[MODHASH]]()
-// UNIQUE-DAG: distinct !DIGlobalVariable(name: "glob_bar", linkageName: "_ZN12_GLOBAL__N_18glob_barE.[[MODHASH]]"{{.*}})
+// UNIQUE-DAG: distinct !DIGlobalVariable(name: "glob_bar", linkageName: "_ZN12_GLOBAL__N_18glob_barE"{{.*}})
 // UNIQUE-DAG: distinct !DISubprogram(name: "bar", linkageName: "_ZN12_GLOBAL__N_13barEv.[[MODHASH]]"{{.*}})
-// UNIQUE-DAG: @_ZL8glob_zip.[[MODHASH]] = internal global i32
+// UNIQUE-DAG: @_ZL8glob_zip = internal global i32
 // UNIQUE-DAG: define internal noundef i32 @_ZL3zipv.[[MODHASH]]()
-// UNIQUE-DAG: distinct !DIGlobalVariable(name: "glob_zip", linkageName: "_ZL8glob_zip.[[MODHASH]]"{{.*}})
+// UNIQUE-DAG: distinct !DIGlobalVariable(name: "glob_zip", linkageName: "_ZL8glob_zip"{{.*}})
 // UNIQUE-DAG: distinct !DISubprogram(name: "zip", linkageName: "_ZL3zipv.[[MODHASH]]"{{.*}})



More information about the cfe-commits mailing list