[llvm] 9ce0641 - [Kaleidoscope] Fix race condition in order-of-destruction between SectionMemoryManager and its MemoryMapper
Stefan Gränitz via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 5 05:49:11 PDT 2023
Author: Stefan Gränitz
Date: 2023-07-05T14:48:03+02:00
New Revision: 9ce06411994e9bcaa98c219c7dc34c2824353a81
URL: https://github.com/llvm/llvm-project/commit/9ce06411994e9bcaa98c219c7dc34c2824353a81
DIFF: https://github.com/llvm/llvm-project/commit/9ce06411994e9bcaa98c219c7dc34c2824353a81.diff
LOG: [Kaleidoscope] Fix race condition in order-of-destruction between SectionMemoryManager and its MemoryMapper
SectionMemoryManager's default memory mapper used to be a global static
object. If the SectionMemoryManager itself is a global static
object, it might be destroyed after its memory mapper and thus couldn't
use it from the destructor.
The Kaleidoscope tutorial reproduced this situation with MSVC for a long time.
Since 47f5c54f997a59bb2c65 it's triggered with GCC as well. The solution from
this patch was proposed in the existing review https://reviews.llvm.org/D107087
before, but it didn't move forward.
Reviewed By: nikic
Differential Revision: https://reviews.llvm.org/D154338
Added:
Modified:
llvm/include/llvm/ExecutionEngine/SectionMemoryManager.h
llvm/lib/ExecutionEngine/SectionMemoryManager.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/ExecutionEngine/SectionMemoryManager.h b/llvm/include/llvm/ExecutionEngine/SectionMemoryManager.h
index 455efc9f9001fd..fa1b2355528dd0 100644
--- a/llvm/include/llvm/ExecutionEngine/SectionMemoryManager.h
+++ b/llvm/include/llvm/ExecutionEngine/SectionMemoryManager.h
@@ -185,7 +185,8 @@ class SectionMemoryManager : public RTDyldMemoryManager {
MemoryGroup CodeMem;
MemoryGroup RWDataMem;
MemoryGroup RODataMem;
- MemoryMapper &MMapper;
+ MemoryMapper *MMapper;
+ std::unique_ptr<MemoryMapper> OwnedMMapper;
};
} // end namespace llvm
diff --git a/llvm/lib/ExecutionEngine/SectionMemoryManager.cpp b/llvm/lib/ExecutionEngine/SectionMemoryManager.cpp
index b23e33039c354b..436888730bfb24 100644
--- a/llvm/lib/ExecutionEngine/SectionMemoryManager.cpp
+++ b/llvm/lib/ExecutionEngine/SectionMemoryManager.cpp
@@ -101,7 +101,7 @@ uint8_t *SectionMemoryManager::allocateSection(
// FIXME: Initialize the Near member for each memory group to avoid
// interleaving.
std::error_code ec;
- sys::MemoryBlock MB = MMapper.allocateMappedMemory(
+ sys::MemoryBlock MB = MMapper->allocateMappedMemory(
Purpose, RequiredSize, &MemGroup.Near,
sys::Memory::MF_READ | sys::Memory::MF_WRITE, ec);
if (ec) {
@@ -204,7 +204,7 @@ std::error_code
SectionMemoryManager::applyMemoryGroupPermissions(MemoryGroup &MemGroup,
unsigned Permissions) {
for (sys::MemoryBlock &MB : MemGroup.PendingMem)
- if (std::error_code EC = MMapper.protectMappedMemory(MB, Permissions))
+ if (std::error_code EC = MMapper->protectMappedMemory(MB, Permissions))
return EC;
MemGroup.PendingMem.clear();
@@ -234,7 +234,7 @@ void SectionMemoryManager::invalidateInstructionCache() {
SectionMemoryManager::~SectionMemoryManager() {
for (MemoryGroup *Group : {&CodeMem, &RWDataMem, &RODataMem}) {
for (sys::MemoryBlock &Block : Group->AllocatedMem)
- MMapper.releaseMappedMemory(Block);
+ MMapper->releaseMappedMemory(Block);
}
}
@@ -263,11 +263,14 @@ class DefaultMMapper final : public SectionMemoryManager::MemoryMapper {
return sys::Memory::releaseMappedMemory(M);
}
};
-
-DefaultMMapper DefaultMMapperInstance;
} // namespace
-SectionMemoryManager::SectionMemoryManager(MemoryMapper *MM)
- : MMapper(MM ? *MM : DefaultMMapperInstance) {}
+SectionMemoryManager::SectionMemoryManager(MemoryMapper *UnownedMM)
+ : MMapper(UnownedMM), OwnedMMapper(nullptr) {
+ if (!MMapper) {
+ OwnedMMapper = std::make_unique<DefaultMMapper>();
+ MMapper = OwnedMMapper.get();
+ }
+}
} // namespace llvm
More information about the llvm-commits
mailing list