mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-19 18:24:00 +00:00
Remove the last improper use of getGlobalContext() from LLVM.
This caused a race condition where a thread calls ~LLVMContextImpl which calls Module::dropAllReferences which calls begin() on an empty ilist that would create the sentinel, which racily accesses the global context. This can not be fixed by locking inside createSentinel because the lock would need to be shared with all users of the global context, including those that reside outside LLVM's own code. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@137546 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -50,17 +50,35 @@ template<> struct ilist_traits<Function>
|
||||
private:
|
||||
mutable ilist_node<Function> Sentinel;
|
||||
};
|
||||
|
||||
template<> struct ilist_traits<GlobalVariable>
|
||||
: public SymbolTableListTraits<GlobalVariable, Module> {
|
||||
// createSentinel is used to create a node that marks the end of the list.
|
||||
static GlobalVariable *createSentinel();
|
||||
static void destroySentinel(GlobalVariable *GV) { delete GV; }
|
||||
GlobalVariable *createSentinel() const {
|
||||
return static_cast<GlobalVariable*>(&Sentinel);
|
||||
}
|
||||
static void destroySentinel(GlobalVariable*) {}
|
||||
|
||||
GlobalVariable *provideInitialHead() const { return createSentinel(); }
|
||||
GlobalVariable *ensureHead(GlobalVariable*) const { return createSentinel(); }
|
||||
static void noteHead(GlobalVariable*, GlobalVariable*) {}
|
||||
private:
|
||||
mutable ilist_node<GlobalVariable> Sentinel;
|
||||
};
|
||||
|
||||
template<> struct ilist_traits<GlobalAlias>
|
||||
: public SymbolTableListTraits<GlobalAlias, Module> {
|
||||
// createSentinel is used to create a node that marks the end of the list.
|
||||
static GlobalAlias *createSentinel();
|
||||
static void destroySentinel(GlobalAlias *GA) { delete GA; }
|
||||
GlobalAlias *createSentinel() const {
|
||||
return static_cast<GlobalAlias*>(&Sentinel);
|
||||
}
|
||||
static void destroySentinel(GlobalAlias*) {}
|
||||
|
||||
GlobalAlias *provideInitialHead() const { return createSentinel(); }
|
||||
GlobalAlias *ensureHead(GlobalAlias*) const { return createSentinel(); }
|
||||
static void noteHead(GlobalAlias*, GlobalAlias*) {}
|
||||
private:
|
||||
mutable ilist_node<GlobalAlias> Sentinel;
|
||||
};
|
||||
|
||||
template<> struct ilist_traits<NamedMDNode>
|
||||
|
Reference in New Issue
Block a user