[clang] cedcf18 - [Clang][Sema] Change `ExtnameUndeclaredIdentifiers` to MapVector. (#193924)

via cfe-commits cfe-commits at lists.llvm.org
Fri Apr 24 04:00:25 PDT 2026


Author: divVerent
Date: 2026-04-24T11:00:20Z
New Revision: cedcf1876cb15455a92b539007e122107e66518a

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

LOG: [Clang][Sema] Change `ExtnameUndeclaredIdentifiers` to MapVector. (#193924)

Iteration order of this map does not matter for compilation, except that
since 475f71e8fa15ee71f99e450a0e1c90d3961005f9, this data is dumped into
precompiled header files and thus affects content of those files.

To make precompiled header file contents deterministic, changing its
type to one that has deterministic iteration order, matching the nearby
`WeakUndeclaredIdentifiers`.

Fixes #193923

Added: 
    

Modified: 
    clang/include/clang/Sema/Sema.h
    clang/lib/Sema/SemaDecl.cpp
    clang/test/PCH/pragma-redefine-extname.c
    clang/test/PCH/pragma-redefine-extname.h

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index a5e9348c4c88c..f9bf3e4de0a5e 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -3599,7 +3599,8 @@ class Sema final : public SemaBase {
   /// \#pragma redefine_extname before declared.  Used in Solaris system headers
   /// to define functions that occur in multiple standards to call the version
   /// in the currently selected standard.
-  llvm::DenseMap<IdentifierInfo *, AsmLabelAttr *> ExtnameUndeclaredIdentifiers;
+  llvm::MapVector<IdentifierInfo *, AsmLabelAttr *>
+      ExtnameUndeclaredIdentifiers;
 
   /// Set containing all typedefs that are likely unused.
   llvm::SmallSetVector<const TypedefNameDecl *, 4>

diff  --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 6afdd73328eba..36538e18f297c 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -8254,7 +8254,7 @@ NamedDecl *Sema::ActOnVariableDeclarator(
     // Insert the asm attribute.
     NewVD->addAttr(AsmLabelAttr::Create(Context, Label, SE->getStrTokenLoc(0)));
   } else if (!ExtnameUndeclaredIdentifiers.empty()) {
-    llvm::DenseMap<IdentifierInfo *, AsmLabelAttr *>::iterator I =
+    llvm::MapVector<IdentifierInfo *, AsmLabelAttr *>::iterator I =
         ExtnameUndeclaredIdentifiers.find(NewVD->getIdentifier());
     if (I != ExtnameUndeclaredIdentifiers.end()) {
       if (isDeclExternC(NewVD)) {
@@ -10564,8 +10564,8 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
     NewFD->addAttr(
         AsmLabelAttr::Create(Context, SE->getString(), SE->getStrTokenLoc(0)));
   } else if (!ExtnameUndeclaredIdentifiers.empty()) {
-    llvm::DenseMap<IdentifierInfo*,AsmLabelAttr*>::iterator I =
-      ExtnameUndeclaredIdentifiers.find(NewFD->getIdentifier());
+    llvm::MapVector<IdentifierInfo *, AsmLabelAttr *>::iterator I =
+        ExtnameUndeclaredIdentifiers.find(NewFD->getIdentifier());
     if (I != ExtnameUndeclaredIdentifiers.end()) {
       if (isDeclExternC(NewFD)) {
         NewFD->addAttr(I->second);

diff  --git a/clang/test/PCH/pragma-redefine-extname.c b/clang/test/PCH/pragma-redefine-extname.c
index 5404cc69ec948..70f03444388a7 100644
--- a/clang/test/PCH/pragma-redefine-extname.c
+++ b/clang/test/PCH/pragma-redefine-extname.c
@@ -5,6 +5,16 @@
 // RUN: %clang_cc1 -triple=x86_64-unknown-linux -x c-header -emit-pch -o %t %S/pragma-redefine-extname.h
 // RUN: %clang_cc1 -triple=x86_64-unknown-linux -include-pch %t %s -verify -emit-llvm -o - | FileCheck %s
 
+/// Compile it a few times to check that the PCH file is deterministic.
+// RUN: %clang_cc1 -triple=x86_64-unknown-linux -x c-header -emit-pch -o %t.cmp %S/pragma-redefine-extname.h
+// RUN: 
diff  %t %t.cmp >/dev/null
+// RUN: %clang_cc1 -triple=x86_64-unknown-linux -x c-header -emit-pch -o %t.cmp %S/pragma-redefine-extname.h
+// RUN: 
diff  %t %t.cmp >/dev/null
+// RUN: %clang_cc1 -triple=x86_64-unknown-linux -x c-header -emit-pch -o %t.cmp %S/pragma-redefine-extname.h
+// RUN: 
diff  %t %t.cmp >/dev/null
+// RUN: %clang_cc1 -triple=x86_64-unknown-linux -x c-header -emit-pch -o %t.cmp %S/pragma-redefine-extname.h
+// RUN: 
diff  %t %t.cmp >/dev/null
+
 // CHECK: define dso_local void @redeffunc2_ext
 // CHECK: call void @redeffunc1_ext
 

diff  --git a/clang/test/PCH/pragma-redefine-extname.h b/clang/test/PCH/pragma-redefine-extname.h
index 426baad7f363e..6983d42773acb 100644
--- a/clang/test/PCH/pragma-redefine-extname.h
+++ b/clang/test/PCH/pragma-redefine-extname.h
@@ -3,3 +3,105 @@
 #pragma redefine_extname undecfunc1 redeffunc1_ext
 #pragma redefine_extname undecfunc2 redeffunc2_ext
 #pragma redefine_extname undecfunc3 redeffunc3_ext
+
+// Some extra entries to ensure determinism can be checked.
+#pragma redefine_extname undeffunc1 undeffunc1_ext
+#pragma redefine_extname undeffunc2 undeffunc2_ext
+#pragma redefine_extname undeffunc3 undeffunc3_ext
+#pragma redefine_extname undeffunc4 undeffunc4_ext
+#pragma redefine_extname undeffunc5 undeffunc5_ext
+#pragma redefine_extname undeffunc6 undeffunc6_ext
+#pragma redefine_extname undeffunc7 undeffunc7_ext
+#pragma redefine_extname undeffunc8 undeffunc8_ext
+#pragma redefine_extname undeffunc9 undeffunc9_ext
+#pragma redefine_extname undeffunc10 undeffunc10_ext
+#pragma redefine_extname undeffunc11 undeffunc11_ext
+#pragma redefine_extname undeffunc12 undeffunc12_ext
+#pragma redefine_extname undeffunc13 undeffunc13_ext
+#pragma redefine_extname undeffunc14 undeffunc14_ext
+#pragma redefine_extname undeffunc15 undeffunc15_ext
+#pragma redefine_extname undeffunc16 undeffunc16_ext
+#pragma redefine_extname undeffunc17 undeffunc17_ext
+#pragma redefine_extname undeffunc18 undeffunc18_ext
+#pragma redefine_extname undeffunc19 undeffunc19_ext
+#pragma redefine_extname undeffunc20 undeffunc20_ext
+#pragma redefine_extname undeffunc21 undeffunc21_ext
+#pragma redefine_extname undeffunc22 undeffunc22_ext
+#pragma redefine_extname undeffunc23 undeffunc23_ext
+#pragma redefine_extname undeffunc24 undeffunc24_ext
+#pragma redefine_extname undeffunc25 undeffunc25_ext
+#pragma redefine_extname undeffunc26 undeffunc26_ext
+#pragma redefine_extname undeffunc27 undeffunc27_ext
+#pragma redefine_extname undeffunc28 undeffunc28_ext
+#pragma redefine_extname undeffunc29 undeffunc29_ext
+#pragma redefine_extname undeffunc30 undeffunc30_ext
+#pragma redefine_extname undeffunc31 undeffunc31_ext
+#pragma redefine_extname undeffunc32 undeffunc32_ext
+#pragma redefine_extname undeffunc33 undeffunc33_ext
+#pragma redefine_extname undeffunc34 undeffunc34_ext
+#pragma redefine_extname undeffunc35 undeffunc35_ext
+#pragma redefine_extname undeffunc36 undeffunc36_ext
+#pragma redefine_extname undeffunc37 undeffunc37_ext
+#pragma redefine_extname undeffunc38 undeffunc38_ext
+#pragma redefine_extname undeffunc39 undeffunc39_ext
+#pragma redefine_extname undeffunc40 undeffunc40_ext
+#pragma redefine_extname undeffunc41 undeffunc41_ext
+#pragma redefine_extname undeffunc42 undeffunc42_ext
+#pragma redefine_extname undeffunc43 undeffunc43_ext
+#pragma redefine_extname undeffunc44 undeffunc44_ext
+#pragma redefine_extname undeffunc45 undeffunc45_ext
+#pragma redefine_extname undeffunc46 undeffunc46_ext
+#pragma redefine_extname undeffunc47 undeffunc47_ext
+#pragma redefine_extname undeffunc48 undeffunc48_ext
+#pragma redefine_extname undeffunc49 undeffunc49_ext
+#pragma redefine_extname undeffunc50 undeffunc50_ext
+#pragma redefine_extname undeffunc51 undeffunc51_ext
+#pragma redefine_extname undeffunc52 undeffunc52_ext
+#pragma redefine_extname undeffunc53 undeffunc53_ext
+#pragma redefine_extname undeffunc54 undeffunc54_ext
+#pragma redefine_extname undeffunc55 undeffunc55_ext
+#pragma redefine_extname undeffunc56 undeffunc56_ext
+#pragma redefine_extname undeffunc57 undeffunc57_ext
+#pragma redefine_extname undeffunc58 undeffunc58_ext
+#pragma redefine_extname undeffunc59 undeffunc59_ext
+#pragma redefine_extname undeffunc60 undeffunc60_ext
+#pragma redefine_extname undeffunc61 undeffunc61_ext
+#pragma redefine_extname undeffunc62 undeffunc62_ext
+#pragma redefine_extname undeffunc63 undeffunc63_ext
+#pragma redefine_extname undeffunc64 undeffunc64_ext
+#pragma redefine_extname undeffunc65 undeffunc65_ext
+#pragma redefine_extname undeffunc66 undeffunc66_ext
+#pragma redefine_extname undeffunc67 undeffunc67_ext
+#pragma redefine_extname undeffunc68 undeffunc68_ext
+#pragma redefine_extname undeffunc69 undeffunc69_ext
+#pragma redefine_extname undeffunc70 undeffunc70_ext
+#pragma redefine_extname undeffunc71 undeffunc71_ext
+#pragma redefine_extname undeffunc72 undeffunc72_ext
+#pragma redefine_extname undeffunc73 undeffunc73_ext
+#pragma redefine_extname undeffunc74 undeffunc74_ext
+#pragma redefine_extname undeffunc75 undeffunc75_ext
+#pragma redefine_extname undeffunc76 undeffunc76_ext
+#pragma redefine_extname undeffunc77 undeffunc77_ext
+#pragma redefine_extname undeffunc78 undeffunc78_ext
+#pragma redefine_extname undeffunc79 undeffunc79_ext
+#pragma redefine_extname undeffunc80 undeffunc80_ext
+#pragma redefine_extname undeffunc81 undeffunc81_ext
+#pragma redefine_extname undeffunc82 undeffunc82_ext
+#pragma redefine_extname undeffunc83 undeffunc83_ext
+#pragma redefine_extname undeffunc84 undeffunc84_ext
+#pragma redefine_extname undeffunc85 undeffunc85_ext
+#pragma redefine_extname undeffunc86 undeffunc86_ext
+#pragma redefine_extname undeffunc87 undeffunc87_ext
+#pragma redefine_extname undeffunc88 undeffunc88_ext
+#pragma redefine_extname undeffunc89 undeffunc89_ext
+#pragma redefine_extname undeffunc90 undeffunc90_ext
+#pragma redefine_extname undeffunc91 undeffunc91_ext
+#pragma redefine_extname undeffunc92 undeffunc92_ext
+#pragma redefine_extname undeffunc93 undeffunc93_ext
+#pragma redefine_extname undeffunc94 undeffunc94_ext
+#pragma redefine_extname undeffunc95 undeffunc95_ext
+#pragma redefine_extname undeffunc96 undeffunc96_ext
+#pragma redefine_extname undeffunc97 undeffunc97_ext
+#pragma redefine_extname undeffunc98 undeffunc98_ext
+#pragma redefine_extname undeffunc99 undeffunc99_ext
+#pragma redefine_extname undeffunc100 undeffunc100_ext


        


More information about the cfe-commits mailing list