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
