ManagedStatic: remove many straightforward uses in llvm

(Reapply after revert in e9ce1a5880 due to
Fuchsia test failures. Removed changes in lib/ExecutionEngine/ other
than error categories, to be checked in more detail and reapplied
separately.)

Bulk remove many of the more trivial uses of ManagedStatic in the llvm
directory, either by defining a new getter function or, in many cases,
moving the static variable directly into the only function that uses it.

Differential Revision: https://reviews.llvm.org/D129120
This commit is contained in:
Nicolai Hähnle 2022-06-29 14:29:33 +02:00
parent e9ce1a5880
commit ede600377c
31 changed files with 148 additions and 143 deletions

View File

@ -15,7 +15,6 @@
#define LLVM_IR_OPTBISECT_H
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/ManagedStatic.h"
#include <limits>
namespace llvm {
@ -90,7 +89,8 @@ private:
/// Singleton instance of the OptBisect class, so multiple pass managers don't
/// need to coordinate their uses of OptBisect.
extern ManagedStatic<OptBisect> OptBisector;
OptBisect &getOptBisector();
} // end namespace llvm
#endif // LLVM_IR_OPTBISECT_H

View File

@ -18,7 +18,6 @@
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/JSON.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/raw_ostream.h"
@ -49,19 +48,17 @@ using TFStatusPtr = std::unique_ptr<TF_Status, decltype(&TF_DeleteStatus)>;
struct TFInitializer {
TFInitializer() {
assert(!IsInitialized && "TFInitialized should be called only once");
int Argc = 1;
const char *Name = "";
const char **NamePtr = &Name;
TF_InitMain(Name, &Argc, const_cast<char ***>(&NamePtr));
IsInitialized = true;
}
bool IsInitialized = false;
};
llvm::ManagedStatic<TFInitializer> TFLibInitializer;
bool ensureInitTF() { return TFLibInitializer->IsInitialized; }
bool ensureInitTF() {
static TFInitializer TFLibInitializer;
return true;
}
TFGraphPtr createTFGraph() {
return TFGraphPtr(TF_NewGraph(), &TF_DeleteGraph);

View File

@ -69,7 +69,6 @@
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ErrorOr.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/raw_ostream.h"
@ -7446,10 +7445,9 @@ class BitcodeErrorCategoryType : public std::error_category {
} // end anonymous namespace
static ManagedStatic<BitcodeErrorCategoryType> ErrorCategory;
const std::error_category &llvm::BitcodeErrorCategory() {
return *ErrorCategory;
static BitcodeErrorCategoryType ErrorCategory;
return ErrorCategory;
}
static Expected<StringRef> readBlobInRecord(BitstreamCursor &Stream,

View File

@ -60,7 +60,6 @@
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/KnownBits.h"
#include "llvm/Support/MachineValueType.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/Mutex.h"
#include "llvm/Support/raw_ostream.h"
@ -10754,19 +10753,19 @@ namespace {
} // end anonymous namespace
static ManagedStatic<std::set<EVT, EVT::compareRawBits>> EVTs;
static ManagedStatic<EVTArray> SimpleVTArray;
static ManagedStatic<sys::SmartMutex<true>> VTMutex;
/// getValueTypeList - Return a pointer to the specified value type.
///
const EVT *SDNode::getValueTypeList(EVT VT) {
static std::set<EVT, EVT::compareRawBits> EVTs;
static EVTArray SimpleVTArray;
static sys::SmartMutex<true> VTMutex;
if (VT.isExtended()) {
sys::SmartScopedLock<true> Lock(*VTMutex);
return &(*EVTs->insert(VT).first);
sys::SmartScopedLock<true> Lock(VTMutex);
return &(*EVTs.insert(VT).first);
}
assert(VT.getSimpleVT() < MVT::VALUETYPE_SIZE && "Value type out of range!");
return &SimpleVTArray->VTs[VT.getSimpleVT().SimpleTy];
return &SimpleVTArray.VTs[VT.getSimpleVT().SimpleTy];
}
/// hasNUsesOfValue - Return true if there are exactly NUSES uses of the

View File

@ -8,7 +8,6 @@
#include "llvm/DebugInfo/CodeView/CodeViewError.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ManagedStatic.h"
#include <string>
using namespace llvm;
@ -42,9 +41,9 @@ public:
};
} // namespace
static llvm::ManagedStatic<CodeViewErrorCategory> CodeViewErrCategory;
const std::error_category &llvm::codeview::CVErrorCategory() {
return *CodeViewErrCategory;
static CodeViewErrorCategory CodeViewErrCategory;
return CodeViewErrCategory;
}
char CodeViewError::ID;

View File

@ -8,7 +8,6 @@
#include "llvm/DebugInfo/MSF/MSFError.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ManagedStatic.h"
#include <string>
using namespace llvm;
@ -50,7 +49,9 @@ public:
};
} // namespace
static llvm::ManagedStatic<MSFErrorCategory> MSFCategory;
const std::error_category &llvm::msf::MSFErrCategory() { return *MSFCategory; }
const std::error_category &llvm::msf::MSFErrCategory() {
static MSFErrorCategory MSFCategory;
return MSFCategory;
}
char MSFError::ID;

View File

@ -1,6 +1,5 @@
#include "llvm/DebugInfo/PDB/DIA/DIAError.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ManagedStatic.h"
using namespace llvm;
using namespace llvm::pdb;
@ -31,7 +30,9 @@ public:
}
};
static llvm::ManagedStatic<DIAErrorCategory> DIACategory;
const std::error_category &llvm::pdb::DIAErrCategory() { return *DIACategory; }
const std::error_category &llvm::pdb::DIAErrCategory() {
static DIAErrorCategory DIACategory;
return DIACategory;
}
char DIAError::ID;

View File

@ -8,7 +8,6 @@
#include "llvm/DebugInfo/PDB/GenericError.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ManagedStatic.h"
using namespace llvm;
using namespace llvm::pdb;
@ -42,7 +41,9 @@ public:
};
} // namespace
static llvm::ManagedStatic<PDBErrorCategory> PDBCategory;
const std::error_category &llvm::pdb::PDBErrCategory() { return *PDBCategory; }
const std::error_category &llvm::pdb::PDBErrCategory() {
static PDBErrorCategory PDBCategory;
return PDBCategory;
}
char PDBError::ID;

View File

@ -1,6 +1,5 @@
#include "llvm/DebugInfo/PDB/Native/RawError.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ManagedStatic.h"
using namespace llvm;
using namespace llvm::pdb;
@ -47,7 +46,9 @@ public:
};
} // namespace
static llvm::ManagedStatic<RawErrorCategory> RawCategory;
const std::error_category &llvm::pdb::RawErrCategory() { return *RawCategory; }
const std::error_category &llvm::pdb::RawErrCategory() {
static RawErrorCategory RawCategory;
return RawCategory;
}
char RawError::ID;

View File

@ -12,7 +12,6 @@
#include "llvm/ExecutionEngine/JITLink/ELF.h"
#include "llvm/ExecutionEngine/JITLink/MachO.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/raw_ostream.h"
@ -41,8 +40,6 @@ public:
}
};
static ManagedStatic<JITLinkerErrorCategory> JITLinkerErrorCategory;
} // namespace
namespace llvm {
@ -53,7 +50,8 @@ char JITLinkError::ID = 0;
void JITLinkError::log(raw_ostream &OS) const { OS << ErrMsg; }
std::error_code JITLinkError::convertToErrorCode() const {
return std::error_code(GenericJITLinkError, *JITLinkerErrorCategory);
static JITLinkerErrorCategory TheJITLinkerErrorCategory;
return std::error_code(GenericJITLinkError, TheJITLinkerErrorCategory);
}
const char *getGenericEdgeKindName(Edge::Kind K) {

View File

@ -12,7 +12,6 @@
#include "llvm/ExecutionEngine/Orc/Shared/OrcError.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ManagedStatic.h"
#include <type_traits>
@ -70,7 +69,10 @@ public:
}
};
static ManagedStatic<OrcErrorCategory> OrcErrCat;
OrcErrorCategory &getOrcErrCat() {
static OrcErrorCategory OrcErrCat;
return OrcErrCat;
}
} // namespace
namespace llvm {
@ -81,7 +83,7 @@ char JITSymbolNotFound::ID = 0;
std::error_code orcError(OrcErrorCode ErrCode) {
typedef std::underlying_type<OrcErrorCode>::type UT;
return std::error_code(static_cast<UT>(ErrCode), *OrcErrCat);
return std::error_code(static_cast<UT>(ErrCode), getOrcErrCat());
}
DuplicateDefinition::DuplicateDefinition(std::string SymbolName)
@ -105,7 +107,7 @@ JITSymbolNotFound::JITSymbolNotFound(std::string SymbolName)
std::error_code JITSymbolNotFound::convertToErrorCode() const {
typedef std::underlying_type<OrcErrorCode>::type UT;
return std::error_code(static_cast<UT>(OrcErrorCode::JITSymbolNotFound),
*OrcErrCat);
getOrcErrCat());
}
void JITSymbolNotFound::log(raw_ostream &OS) const {

View File

@ -19,7 +19,6 @@
#include "llvm/Object/ELFObjectFile.h"
#include "llvm/Support/Alignment.h"
#include "llvm/Support/MSVCErrorWorkarounds.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/MathExtras.h"
#include <mutex>
@ -51,8 +50,6 @@ public:
}
};
static ManagedStatic<RuntimeDyldErrorCategory> RTDyldErrorCategory;
}
char RuntimeDyldError::ID = 0;
@ -62,7 +59,8 @@ void RuntimeDyldError::log(raw_ostream &OS) const {
}
std::error_code RuntimeDyldError::convertToErrorCode() const {
return std::error_code(GenericRTDyldError, *RTDyldErrorCategory);
static RuntimeDyldErrorCategory RTDyldErrorCategory;
return std::error_code(GenericRTDyldError, RTDyldErrorCategory);
}
// Empty out-of-line virtual destructor as the key function.

View File

@ -74,13 +74,16 @@ void LLVMDisposeMessage(char *Message) {
/*===-- Operations on contexts --------------------------------------------===*/
static ManagedStatic<LLVMContext> GlobalContext;
static LLVMContext &getGlobalContext() {
static LLVMContext GlobalContext;
return GlobalContext;
}
LLVMContextRef LLVMContextCreate() {
return wrap(new LLVMContext());
}
LLVMContextRef LLVMGetGlobalContext() { return wrap(&*GlobalContext); }
LLVMContextRef LLVMGetGlobalContext() { return wrap(&getGlobalContext()); }
void LLVMContextSetDiagnosticHandler(LLVMContextRef C,
LLVMDiagnosticHandler Handler,
@ -251,7 +254,7 @@ LLVMDiagnosticSeverity LLVMGetDiagInfoSeverity(LLVMDiagnosticInfoRef DI) {
/*===-- Operations on modules ---------------------------------------------===*/
LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID) {
return wrap(new Module(ModuleID, *GlobalContext));
return wrap(new Module(ModuleID, getGlobalContext()));
}
LLVMModuleRef LLVMModuleCreateWithNameInContext(const char *ModuleID,

View File

@ -27,7 +27,6 @@
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/TypeSize.h"
#include <cassert>
#include <utility>
@ -241,7 +240,7 @@ void LLVMContextImpl::getSyncScopeNames(
/// singleton OptBisect if not explicitly set.
OptPassGate &LLVMContextImpl::getOptPassGate() const {
if (!OPG)
OPG = &(*OptBisector);
OPG = &getOptBisector();
return *OPG;
}

View File

@ -23,7 +23,7 @@ using namespace llvm;
static cl::opt<int> OptBisectLimit("opt-bisect-limit", cl::Hidden,
cl::init(OptBisect::Disabled), cl::Optional,
cl::cb<void, int>([](int Limit) {
llvm::OptBisector->setLimit(Limit);
llvm::getOptBisector().setLimit(Limit);
}),
cl::desc("Maximum optimization to perform"));
@ -52,4 +52,7 @@ bool OptBisect::checkPass(const StringRef PassName,
const int OptBisect::Disabled;
ManagedStatic<OptBisect> llvm::OptBisector;
OptBisect &llvm::getOptBisector() {
static OptBisect OptBisector;
return OptBisector;
}

View File

@ -15,21 +15,15 @@
#include "llvm/ADT/STLExtras.h"
#include "llvm/Pass.h"
#include "llvm/PassInfo.h"
#include "llvm/Support/ManagedStatic.h"
#include <cassert>
#include <memory>
#include <utility>
using namespace llvm;
// FIXME: We use ManagedStatic to erase the pass registrar on shutdown.
// Unfortunately, passes are registered with static ctors, and having
// llvm_shutdown clear this map prevents successful resurrection after
// llvm_shutdown is run. Ideally we should find a solution so that we don't
// leak the map, AND can still resurrect after shutdown.
static ManagedStatic<PassRegistry> PassRegistryObj;
PassRegistry *PassRegistry::getPassRegistry() {
return &*PassRegistryObj;
static PassRegistry PassRegistryObj;
return &PassRegistryObj;
}
//===----------------------------------------------------------------------===//

View File

@ -13,7 +13,6 @@
#include "llvm/Object/Error.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ManagedStatic.h"
using namespace llvm;
using namespace object;
@ -75,10 +74,9 @@ void GenericBinaryError::log(raw_ostream &OS) const {
OS << Msg;
}
static ManagedStatic<_object_error_category> error_category;
const std::error_category &object::object_category() {
return *error_category;
static _object_error_category error_category;
return error_category;
}
llvm::Error llvm::object::isNotObjectErrorInvalidFileType(llvm::Error Err) {

View File

@ -901,10 +901,11 @@ bool OptNoneInstrumentation::shouldRun(StringRef PassID, Any IR) {
void OptBisectInstrumentation::registerCallbacks(
PassInstrumentationCallbacks &PIC) {
if (!OptBisector->isEnabled())
if (!getOptBisector().isEnabled())
return;
PIC.registerShouldRunOptionalPassCallback([](StringRef PassID, Any IR) {
return isIgnored(PassID) || OptBisector->checkPass(PassID, getIRName(IR));
return isIgnored(PassID) ||
getOptBisector().checkPass(PassID, getIRName(IR));
});
}

View File

@ -25,7 +25,6 @@
#include "llvm/Support/Errc.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
@ -897,10 +896,9 @@ std::string CoverageMapError::message() const {
return getCoverageMapErrString(Err);
}
static ManagedStatic<CoverageMappingErrorCategoryType> ErrorCategory;
const std::error_category &llvm::coverage::coveragemap_category() {
return *ErrorCategory;
static CoverageMappingErrorCategoryType ErrorCategory;
return ErrorCategory;
}
char CoverageMapError::ID = 0;

View File

@ -39,7 +39,6 @@
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/LEB128.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/SwapByteOrder.h"
@ -177,10 +176,9 @@ class InstrProfErrorCategoryType : public std::error_category {
} // end anonymous namespace
static ManagedStatic<InstrProfErrorCategoryType> ErrorCategory;
const std::error_category &llvm::instrprof_category() {
return *ErrorCategory;
static InstrProfErrorCategoryType ErrorCategory;
return ErrorCategory;
}
namespace {

View File

@ -20,7 +20,6 @@
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/raw_ostream.h"
#include <string>
#include <system_error>
@ -98,10 +97,9 @@ class SampleProfErrorCategoryType : public std::error_category {
} // end anonymous namespace
static ManagedStatic<SampleProfErrorCategoryType> ErrorCategory;
const std::error_category &llvm::sampleprof_category() {
return *ErrorCategory;
static SampleProfErrorCategoryType ErrorCategory;
return ErrorCategory;
}
void LineLocation::print(raw_ostream &OS) const {

View File

@ -9,7 +9,6 @@
#include "llvm/Support/Error.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ManagedStatic.h"
#include <system_error>
using namespace llvm;
@ -46,7 +45,10 @@ namespace {
}
static ManagedStatic<ErrorErrorCategory> ErrorErrorCat;
ErrorErrorCategory &getErrorErrorCat() {
static ErrorErrorCategory ErrorErrorCat;
return ErrorErrorCat;
}
namespace llvm {
@ -71,19 +73,19 @@ void logAllUnhandledErrors(Error E, raw_ostream &OS, Twine ErrorBanner) {
std::error_code ErrorList::convertToErrorCode() const {
return std::error_code(static_cast<int>(ErrorErrorCode::MultipleErrors),
*ErrorErrorCat);
getErrorErrorCat());
}
std::error_code inconvertibleErrorCode() {
return std::error_code(static_cast<int>(ErrorErrorCode::InconvertibleError),
*ErrorErrorCat);
getErrorErrorCat());
}
std::error_code FileError::convertToErrorCode() const {
std::error_code NestedEC = Err->convertToErrorCode();
if (NestedEC == inconvertibleErrorCode())
return std::error_code(static_cast<int>(ErrorErrorCode::FileError),
*ErrorErrorCat);
getErrorErrorCat());
return NestedEC;
}

View File

@ -14,7 +14,6 @@
#include "llvm/ADT/Hashing.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Config/config.h"
#include "llvm/Support/ManagedStatic.h"
#include <mutex>
#if HAVE_FCNTL_H
#include <fcntl.h>
@ -327,10 +326,6 @@ extern "C" int del_curterm(struct term *termp);
extern "C" int tigetnum(char *capname);
#endif
#ifdef LLVM_ENABLE_TERMINFO
static ManagedStatic<std::mutex> TermColorMutex;
#endif
bool checkTerminalEnvironmentForColors() {
if (const char *TermStr = std::getenv("TERM")) {
return StringSwitch<bool>(TermStr)
@ -351,7 +346,8 @@ bool checkTerminalEnvironmentForColors() {
static bool terminalHasColors(int fd) {
#ifdef LLVM_ENABLE_TERMINFO
// First, acquire a global lock because these C routines are thread hostile.
std::lock_guard<std::mutex> G(*TermColorMutex);
static std::mutex TermColorMutex;
std::lock_guard<std::mutex> G(TermColorMutex);
struct term *previous_term = set_curterm(nullptr);
int errret = 0;

View File

@ -18,7 +18,6 @@
#include "llvm/IR/InstIterator.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Operator.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/Mutex.h"
#include <algorithm>
#include <cstring>
@ -32,19 +31,27 @@ namespace llvm {
namespace {
typedef std::map<std::string, std::vector<unsigned> > key_val_pair_t;
typedef std::map<const GlobalValue *, key_val_pair_t> global_val_annot_t;
typedef std::map<const Module *, global_val_annot_t> per_module_annot_t;
struct AnnotationCache {
sys::Mutex Lock;
std::map<const Module *, global_val_annot_t> Cache;
};
AnnotationCache &getAnnotationCache() {
static AnnotationCache AC;
return AC;
}
} // anonymous namespace
static ManagedStatic<per_module_annot_t> annotationCache;
static sys::Mutex Lock;
void clearAnnotationCache(const Module *Mod) {
std::lock_guard<sys::Mutex> Guard(Lock);
annotationCache->erase(Mod);
auto &AC = getAnnotationCache();
std::lock_guard<sys::Mutex> Guard(AC.Lock);
AC.Cache.erase(Mod);
}
static void cacheAnnotationFromMD(const MDNode *md, key_val_pair_t &retval) {
std::lock_guard<sys::Mutex> Guard(Lock);
auto &AC = getAnnotationCache();
std::lock_guard<sys::Mutex> Guard(AC.Lock);
assert(md && "Invalid mdnode for annotation");
assert((md->getNumOperands() % 2) == 1 && "Invalid number of operands");
// start index = 1, to skip the global variable key
@ -70,7 +77,8 @@ static void cacheAnnotationFromMD(const MDNode *md, key_val_pair_t &retval) {
}
static void cacheAnnotationFromMD(const Module *m, const GlobalValue *gv) {
std::lock_guard<sys::Mutex> Guard(Lock);
auto &AC = getAnnotationCache();
std::lock_guard<sys::Mutex> Guard(AC.Lock);
NamedMDNode *NMD = m->getNamedMetadata("nvvm.annotations");
if (!NMD)
return;
@ -93,40 +101,42 @@ static void cacheAnnotationFromMD(const Module *m, const GlobalValue *gv) {
if (tmp.empty()) // no annotations for this gv
return;
if ((*annotationCache).find(m) != (*annotationCache).end())
(*annotationCache)[m][gv] = std::move(tmp);
if (AC.Cache.find(m) != AC.Cache.end())
AC.Cache[m][gv] = std::move(tmp);
else {
global_val_annot_t tmp1;
tmp1[gv] = std::move(tmp);
(*annotationCache)[m] = std::move(tmp1);
AC.Cache[m] = std::move(tmp1);
}
}
bool findOneNVVMAnnotation(const GlobalValue *gv, const std::string &prop,
unsigned &retval) {
std::lock_guard<sys::Mutex> Guard(Lock);
auto &AC = getAnnotationCache();
std::lock_guard<sys::Mutex> Guard(AC.Lock);
const Module *m = gv->getParent();
if ((*annotationCache).find(m) == (*annotationCache).end())
if (AC.Cache.find(m) == AC.Cache.end())
cacheAnnotationFromMD(m, gv);
else if ((*annotationCache)[m].find(gv) == (*annotationCache)[m].end())
else if (AC.Cache[m].find(gv) == AC.Cache[m].end())
cacheAnnotationFromMD(m, gv);
if ((*annotationCache)[m][gv].find(prop) == (*annotationCache)[m][gv].end())
if (AC.Cache[m][gv].find(prop) == AC.Cache[m][gv].end())
return false;
retval = (*annotationCache)[m][gv][prop][0];
retval = AC.Cache[m][gv][prop][0];
return true;
}
bool findAllNVVMAnnotation(const GlobalValue *gv, const std::string &prop,
std::vector<unsigned> &retval) {
std::lock_guard<sys::Mutex> Guard(Lock);
auto &AC = getAnnotationCache();
std::lock_guard<sys::Mutex> Guard(AC.Lock);
const Module *m = gv->getParent();
if ((*annotationCache).find(m) == (*annotationCache).end())
if (AC.Cache.find(m) == AC.Cache.end())
cacheAnnotationFromMD(m, gv);
else if ((*annotationCache)[m].find(gv) == (*annotationCache)[m].end())
else if (AC.Cache[m].find(gv) == AC.Cache[m].end())
cacheAnnotationFromMD(m, gv);
if ((*annotationCache)[m][gv].find(prop) == (*annotationCache)[m][gv].end())
if (AC.Cache[m][gv].find(prop) == AC.Cache[m][gv].end())
return false;
retval = (*annotationCache)[m][gv][prop];
retval = AC.Cache[m][gv][prop];
return true;
}

View File

@ -21,7 +21,6 @@
#include "WebAssemblyRuntimeLibcallSignatures.h"
#include "WebAssemblySubtarget.h"
#include "llvm/CodeGen/RuntimeLibcalls.h"
#include "llvm/Support/ManagedStatic.h"
using namespace llvm;
@ -482,10 +481,13 @@ struct RuntimeLibcallSignatureTable {
}
};
ManagedStatic<RuntimeLibcallSignatureTable> RuntimeLibcallSignatures;
RuntimeLibcallSignatureTable &getRuntimeLibcallSignatures() {
static RuntimeLibcallSignatureTable RuntimeLibcallSignatures;
return RuntimeLibcallSignatures;
}
// Maps libcall names to their RTLIB::Libcall number. Builds the map in a
// constructor for use with ManagedStatic
// constructor for use with a static variable
struct StaticLibcallNameMap {
StringMap<RTLIB::Libcall> Map;
StaticLibcallNameMap() {
@ -496,7 +498,8 @@ struct StaticLibcallNameMap {
};
for (const auto &NameLibcall : NameLibcalls) {
if (NameLibcall.first != nullptr &&
RuntimeLibcallSignatures->Table[NameLibcall.second] != unsupported) {
getRuntimeLibcallSignatures().Table[NameLibcall.second] !=
unsupported) {
assert(Map.find(NameLibcall.first) == Map.end() &&
"duplicate libcall names in name map");
Map[NameLibcall.first] = NameLibcall.second;
@ -523,7 +526,7 @@ void llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget,
wasm::ValType PtrTy =
Subtarget.hasAddr64() ? wasm::ValType::I64 : wasm::ValType::I32;
auto &Table = RuntimeLibcallSignatures->Table;
auto &Table = getRuntimeLibcallSignatures().Table;
switch (Table[LC]) {
case func:
break;
@ -885,14 +888,14 @@ void llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget,
}
}
static ManagedStatic<StaticLibcallNameMap> LibcallNameMap;
// TODO: If the RTLIB::Libcall-taking flavor of GetSignature remains unsed
// other than here, just roll its logic into this version.
void llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget,
StringRef Name,
SmallVectorImpl<wasm::ValType> &Rets,
SmallVectorImpl<wasm::ValType> &Params) {
auto &Map = LibcallNameMap->Map;
static StaticLibcallNameMap LibcallNameMap;
auto &Map = LibcallNameMap.Map;
auto Val = Map.find(Name);
#ifndef NDEBUG
if (Val == Map.end()) {

View File

@ -13,6 +13,7 @@
#include "X86InstrRelaxTables.h"
#include "X86InstrInfo.h"
#include "llvm/ADT/STLExtras.h"
#include <atomic>
using namespace llvm;
@ -119,7 +120,7 @@ const X86InstrRelaxTableEntry *llvm::lookupRelaxTable(unsigned ShortOp) {
namespace {
// This class stores the short form tables. It is instantiated as a
// ManagedStatic to lazily init the short form table.
// function scope static variable to lazily init the short form table.
struct X86ShortFormTable {
// Stores relaxation table entries sorted by relaxed form opcode.
SmallVector<X86InstrRelaxTableEntry, 0> Table;
@ -137,10 +138,9 @@ struct X86ShortFormTable {
};
} // namespace
static ManagedStatic<X86ShortFormTable> ShortTable;
const X86InstrRelaxTableEntry *llvm::lookupShortTable(unsigned RelaxOp) {
auto &Table = ShortTable->Table;
static X86ShortFormTable ShortTable;
auto &Table = ShortTable.Table;
auto I = llvm::lower_bound(Table, RelaxOp);
if (I != Table.end() && I->KeyOp == RelaxOp)
return &*I;

View File

@ -31,6 +31,7 @@
#include "llvm/CodeGen/MachineOperand.h"
#include "llvm/MC/MCInstrDesc.h"
#include "llvm/Pass.h"
#include <atomic>
#include <cassert>
#include <cstdint>

View File

@ -13,6 +13,7 @@
#include "X86InstrFoldTables.h"
#include "X86InstrInfo.h"
#include "llvm/ADT/STLExtras.h"
#include <atomic>
#include <vector>
using namespace llvm;
@ -6102,7 +6103,7 @@ llvm::lookupFoldTable(unsigned RegOp, unsigned OpNum) {
namespace {
// This class stores the memory unfolding tables. It is instantiated as a
// ManagedStatic to lazily init the unfolding table.
// function scope static variable to lazily init the unfolding table.
struct X86MemUnfoldTable {
// Stores memory unfolding tables entries sorted by opcode.
std::vector<X86MemoryFoldTableEntry> Table;
@ -6159,11 +6160,10 @@ struct X86MemUnfoldTable {
};
}
static ManagedStatic<X86MemUnfoldTable> MemUnfoldTable;
const X86MemoryFoldTableEntry *
llvm::lookupUnfoldTable(unsigned MemOp) {
auto &Table = MemUnfoldTable->Table;
static X86MemUnfoldTable MemUnfoldTable;
auto &Table = MemUnfoldTable.Table;
auto I = llvm::lower_bound(Table, MemOp);
if (I != Table.end() && I->KeyOp == MemOp)
return &*I;

View File

@ -47,7 +47,6 @@
#include "llvm/Support/FormattedStream.h"
#include "llvm/Support/Host.h"
#include "llvm/Support/InitLLVM.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/PluginLoader.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/TargetSelect.h"
@ -192,7 +191,11 @@ static cl::opt<std::string> RemarksFormat(
cl::value_desc("format"), cl::init("yaml"));
namespace {
static ManagedStatic<std::vector<std::string>> RunPassNames;
std::vector<std::string> &getRunPassNames() {
static std::vector<std::string> RunPassNames;
return RunPassNames;
}
struct RunPassOption {
void operator=(const std::string &Val) const {
@ -201,7 +204,7 @@ struct RunPassOption {
SmallVector<StringRef, 8> PassNames;
StringRef(Val).split(PassNames, ',', -1, false);
for (auto PassName : PassNames)
RunPassNames->push_back(std::string(PassName));
getRunPassNames().push_back(std::string(PassName));
}
};
}
@ -676,7 +679,7 @@ static int compileModule(char **argv, LLVMContext &Context) {
// Construct a custom pass pipeline that starts after instruction
// selection.
if (!RunPassNames->empty()) {
if (!getRunPassNames().empty()) {
if (!MIR) {
WithColor::warning(errs(), argv[0])
<< "run-pass is for .mir file only.\n";
@ -694,7 +697,7 @@ static int compileModule(char **argv, LLVMContext &Context) {
PM.add(&TPC);
PM.add(MMIWP);
TPC.printAndVerify("");
for (const std::string &RunPassName : *RunPassNames) {
for (const std::string &RunPassName : getRunPassNames()) {
if (addPass(PM, argv0, RunPassName, TPC))
return 1;
}

View File

@ -11,7 +11,6 @@
//===----------------------------------------------------------------------===//
#include "xray-registry.h"
#include "llvm/Support/ManagedStatic.h"
#include <unordered_map>
namespace llvm {
@ -19,19 +18,22 @@ namespace xray {
using HandlerType = std::function<Error()>;
ManagedStatic<std::unordered_map<cl::SubCommand *, HandlerType>> Commands;
static std::unordered_map<cl::SubCommand *, HandlerType> &getCommands() {
static std::unordered_map<cl::SubCommand *, HandlerType> Commands;
return Commands;
}
CommandRegistration::CommandRegistration(cl::SubCommand *SC,
HandlerType Command) {
assert(Commands->count(SC) == 0 &&
assert(getCommands().count(SC) == 0 &&
"Attempting to overwrite a command handler");
assert(Command && "Attempting to register an empty std::function<Error()>");
(*Commands)[SC] = Command;
getCommands()[SC] = Command;
}
HandlerType dispatch(cl::SubCommand *SC) {
auto It = Commands->find(SC);
assert(It != Commands->end() &&
auto It = getCommands().find(SC);
assert(It != getCommands().end() &&
"Attempting to dispatch on un-registered SubCommand.");
return It->second;
}

View File

@ -12,7 +12,6 @@
#include "llvm/ADT/Twine.h"
#include "llvm/Support/Errc.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Testing/Support/Error.h"
#include "gtest/gtest-spi.h"
#include "gtest/gtest.h"
@ -1039,8 +1038,10 @@ public:
}
};
static llvm::ManagedStatic<TestErrorCategory> TestErrCategory;
const std::error_category &TErrorCategory() { return *TestErrCategory; }
const std::error_category &TErrorCategory() {
static TestErrorCategory TestErrCategory;
return TestErrCategory;
}
char TestDebugError::ID;