Author: dyung
Date: 2026-02-17T22:47:33Z
New Revision: d4b574266132e08ff585facf2e0e01995082999f

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

LOG: Revert "[clang] Fix some static initialization race-conditions" (#181926)

Reverts llvm/llvm-project#181367

This is causing crashes in tests on a Windows bot
https://lab.llvm.org/buildbot/#/builders/46/builds/30854.

Added: 
    

Modified: 
    clang/lib/AST/Stmt.cpp
    clang/lib/Basic/ParsedAttrInfo.cpp
    clang/lib/CodeGen/CodeGenAction.cpp
    clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/Stmt.cpp b/clang/lib/AST/Stmt.cpp
index 14e6ea8d1d10e..5b745dd3c43f5 100644
--- a/clang/lib/AST/Stmt.cpp
+++ b/clang/lib/AST/Stmt.cpp
@@ -40,7 +40,6 @@
 #include "llvm/Support/MathExtras.h"
 #include "llvm/Support/raw_ostream.h"
 #include <algorithm>
-#include <array>
 #include <cassert>
 #include <cstring>
 #include <optional>
@@ -58,23 +57,25 @@ using namespace clang;
 #define ABSTRACT_STMT(STMT)
 #include "clang/AST/StmtNodes.inc"
 
-struct StmtClassNameTable {
+static struct StmtClassNameTable {
   const char *Name;
   unsigned Counter;
   unsigned Size;
-};
+} StmtClassInfo[Stmt::lastStmtConstant+1];
 
 static StmtClassNameTable &getStmtInfoTableEntry(Stmt::StmtClass E) {
-  static std::array<StmtClassNameTable, Stmt::lastStmtConstant + 1>
-      StmtClassInfo = [] {
-        std::array<StmtClassNameTable, Stmt::lastStmtConstant + 1> Table;
+  static bool Initialized = false;
+  if (Initialized)
+    return StmtClassInfo[E];
+
+  // Initialize the table on the first use.
+  Initialized = true;
 #define ABSTRACT_STMT(STMT)
-#define STMT(CLASS, PARENT)                                                    
\
-  Table[static_cast<unsigned>(Stmt::CLASS##Class)].Name = #CLASS;              
\
-  Table[static_cast<unsigned>(Stmt::CLASS##Class)].Size = sizeof(CLASS);
+#define STMT(CLASS, PARENT) \
+  StmtClassInfo[(unsigned)Stmt::CLASS##Class].Name = #CLASS;    \
+  StmtClassInfo[(unsigned)Stmt::CLASS##Class].Size = sizeof(CLASS);
 #include "clang/AST/StmtNodes.inc"
-        return Table;
-      }();
+
   return StmtClassInfo[E];
 }
 
@@ -84,7 +85,7 @@ void *Stmt::operator new(size_t bytes, const ASTContext& C,
 }
 
 const char *Stmt::getStmtClassName() const {
-  return getStmtInfoTableEntry(static_cast<StmtClass>(StmtBits.sClass)).Name;
+  return getStmtInfoTableEntry((StmtClass) StmtBits.sClass).Name;
 }
 
 // Check that no statement / expression class is polymorphic. LLVM style RTTI
@@ -112,25 +113,19 @@ void Stmt::PrintStats() {
   unsigned sum = 0;
   llvm::errs() << "\n*** Stmt/Expr Stats:\n";
   for (int i = 0; i != Stmt::lastStmtConstant+1; i++) {
-    const StmtClassNameTable &Entry =
-        getStmtInfoTableEntry(static_cast<Stmt::StmtClass>(i));
-    if (Entry.Name == nullptr)
-      continue;
-    sum += Entry.Counter;
+    if (StmtClassInfo[i].Name == nullptr) continue;
+    sum += StmtClassInfo[i].Counter;
   }
   llvm::errs() << "  " << sum << " stmts/exprs total.\n";
   sum = 0;
   for (int i = 0; i != Stmt::lastStmtConstant+1; i++) {
-    const StmtClassNameTable &Entry =
-        getStmtInfoTableEntry(static_cast<Stmt::StmtClass>(i));
-    if (Entry.Name == nullptr)
-      continue;
-    if (Entry.Counter == 0)
-      continue;
-    llvm::errs() << "    " << Entry.Counter << " " << Entry.Name << ", "
-                 << Entry.Size << " each (" << Entry.Counter * Entry.Size
+    if (StmtClassInfo[i].Name == nullptr) continue;
+    if (StmtClassInfo[i].Counter == 0) continue;
+    llvm::errs() << "    " << StmtClassInfo[i].Counter << " "
+                 << StmtClassInfo[i].Name << ", " << StmtClassInfo[i].Size
+                 << " each (" << StmtClassInfo[i].Counter*StmtClassInfo[i].Size
                  << " bytes)\n";
-    sum += Entry.Counter * Entry.Size;
+    sum += StmtClassInfo[i].Counter*StmtClassInfo[i].Size;
   }
 
   llvm::errs() << "Total bytes = " << sum << "\n";

diff  --git a/clang/lib/Basic/ParsedAttrInfo.cpp 
b/clang/lib/Basic/ParsedAttrInfo.cpp
index d5b17b34b6e3a..16fa314b642b9 100644
--- a/clang/lib/Basic/ParsedAttrInfo.cpp
+++ b/clang/lib/Basic/ParsedAttrInfo.cpp
@@ -20,16 +20,13 @@ using namespace clang;
 
 LLVM_INSTANTIATE_REGISTRY(ParsedAttrInfoRegistry)
 
-static std::list<std::unique_ptr<ParsedAttrInfo>> instantiateEntries() {
-  std::list<std::unique_ptr<ParsedAttrInfo>> Instances;
-  for (const auto &It : ParsedAttrInfoRegistry::entries())
-    Instances.emplace_back(It.instantiate());
-  return Instances;
-}
-
 const std::list<std::unique_ptr<ParsedAttrInfo>> &
 clang::getAttributePluginInstances() {
-  static std::list<std::unique_ptr<ParsedAttrInfo>> Instances =
-      instantiateEntries();
-  return Instances;
+  static llvm::ManagedStatic<std::list<std::unique_ptr<ParsedAttrInfo>>>
+      PluginAttrInstances;
+  if (PluginAttrInstances->empty())
+    for (const auto &It : ParsedAttrInfoRegistry::entries())
+      PluginAttrInstances->emplace_back(It.instantiate());
+
+  return *PluginAttrInstances;
 }

diff  --git a/clang/lib/CodeGen/CodeGenAction.cpp 
b/clang/lib/CodeGen/CodeGenAction.cpp
index 29dcabd1b0971..a5ef4ac9d361d 100644
--- a/clang/lib/CodeGen/CodeGenAction.cpp
+++ b/clang/lib/CodeGen/CodeGenAction.cpp
@@ -248,8 +248,6 @@ void BackendConsumer::HandleTranslationUnit(ASTContext &C) {
   LLVMContext &Ctx = getModule()->getContext();
   std::unique_ptr<DiagnosticHandler> OldDiagnosticHandler =
     Ctx.getDiagnosticHandler();
-  llvm::scope_exit RestoreDiagnosticHandler(
-      [&]() { Ctx.setDiagnosticHandler(std::move(OldDiagnosticHandler)); });
   Ctx.setDiagnosticHandler(std::make_unique<ClangDiagnosticHandler>(
       CodeGenOpts, this));
 
@@ -313,6 +311,8 @@ void BackendConsumer::HandleTranslationUnit(ASTContext &C) {
                     C.getTargetInfo().getDataLayoutString(), getModule(),
                     Action, FS, std::move(AsmOutStream), this);
 
+  Ctx.setDiagnosticHandler(std::move(OldDiagnosticHandler));
+
   if (OptRecordFile)
     OptRecordFile->keep();
 }

diff  --git a/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp 
b/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
index f226f80aa441f..e682c4ef80896 100644
--- a/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
@@ -70,12 +70,16 @@ enum FoundationClass {
 
 static FoundationClass findKnownClass(const ObjCInterfaceDecl *ID,
                                       bool IncludeSuperclasses = true) {
-  static const llvm::StringMap<FoundationClass> Classes{
-      {"NSArray", FC_NSArray},           {"NSDictionary", FC_NSDictionary},
-      {"NSEnumerator", FC_NSEnumerator}, {"NSNull", FC_NSNull},
-      {"NSOrderedSet", FC_NSOrderedSet}, {"NSSet", FC_NSSet},
-      {"NSString", FC_NSString},
-  };
+  static llvm::StringMap<FoundationClass> Classes;
+  if (Classes.empty()) {
+    Classes["NSArray"] = FC_NSArray;
+    Classes["NSDictionary"] = FC_NSDictionary;
+    Classes["NSEnumerator"] = FC_NSEnumerator;
+    Classes["NSNull"] = FC_NSNull;
+    Classes["NSOrderedSet"] = FC_NSOrderedSet;
+    Classes["NSSet"] = FC_NSSet;
+    Classes["NSString"] = FC_NSString;
+  }
 
   // FIXME: Should we cache this at all?
   FoundationClass result = Classes.lookup(ID->getIdentifier()->getName());


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to