forked from OSchip/llvm-project
[CodeGen, TargetPassConfig] Remove a race from createRegAllocPass
The createRegAllocPass reads and writes to a global variable 'Registry' via calls to getDefault and setDefault. Run this under a call_once to avoid races. llvm-svn: 274875
This commit is contained in:
parent
44540a3db2
commit
d9d02d8259
|
@ -721,6 +721,7 @@ MachinePassRegistry RegisterRegAlloc::Registry;
|
|||
|
||||
/// A dummy default pass factory indicates whether the register allocator is
|
||||
/// overridden on the command line.
|
||||
LLVM_DEFINE_ONCE_FLAG(InitializeDefaultRegisterAllocatorFlag);
|
||||
static FunctionPass *useDefaultRegisterAllocator() { return nullptr; }
|
||||
static RegisterRegAlloc
|
||||
defaultRegAlloc("default",
|
||||
|
@ -734,6 +735,15 @@ RegAlloc("regalloc",
|
|||
cl::init(&useDefaultRegisterAllocator),
|
||||
cl::desc("Register allocator to use"));
|
||||
|
||||
static void initializeDefaultRegisterAllocatorOnce() {
|
||||
RegisterRegAlloc::FunctionPassCtor Ctor = RegisterRegAlloc::getDefault();
|
||||
|
||||
if (!Ctor) {
|
||||
Ctor = RegAlloc;
|
||||
RegisterRegAlloc::setDefault(RegAlloc);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// Instantiate the default register allocator pass for this target for either
|
||||
/// the optimized or unoptimized allocation path. This will be added to the pass
|
||||
|
@ -760,13 +770,11 @@ FunctionPass *TargetPassConfig::createTargetRegisterAllocator(bool Optimized) {
|
|||
/// FIXME: When MachinePassRegistry register pass IDs instead of function ptrs,
|
||||
/// this can be folded into addPass.
|
||||
FunctionPass *TargetPassConfig::createRegAllocPass(bool Optimized) {
|
||||
RegisterRegAlloc::FunctionPassCtor Ctor = RegisterRegAlloc::getDefault();
|
||||
|
||||
// Initialize the global default.
|
||||
if (!Ctor) {
|
||||
Ctor = RegAlloc;
|
||||
RegisterRegAlloc::setDefault(RegAlloc);
|
||||
}
|
||||
llvm::call_once(InitializeDefaultRegisterAllocatorFlag,
|
||||
initializeDefaultRegisterAllocatorOnce);
|
||||
|
||||
RegisterRegAlloc::FunctionPassCtor Ctor = RegisterRegAlloc::getDefault();
|
||||
if (Ctor != useDefaultRegisterAllocator)
|
||||
return Ctor();
|
||||
|
||||
|
|
Loading…
Reference in New Issue