diff options
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp')
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp | 79 |
1 files changed, 41 insertions, 38 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp index 6c9f099061ae..147f915f61d6 100644 --- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp +++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp @@ -21,38 +21,33 @@ #include <unistd.h> #endif +namespace llvm { +namespace orc { +namespace rt_bootstrap { + #if defined(_WIN32) -static DWORD getWindowsProtectionFlags(unsigned Flags) { - switch (Flags & llvm::sys::Memory::MF_RWE_MASK) { - case llvm::sys::Memory::MF_READ: +static DWORD getWindowsProtectionFlags(MemProt MP) { + if (MP == MemProt::Read) return PAGE_READONLY; - case llvm::sys::Memory::MF_WRITE: + if (MP == MemProt::Write || + MP == (MemProt::Write | MemProt::Read)) { // Note: PAGE_WRITE is not supported by VirtualProtect return PAGE_READWRITE; - case llvm::sys::Memory::MF_READ | llvm::sys::Memory::MF_WRITE: - return PAGE_READWRITE; - case llvm::sys::Memory::MF_READ | llvm::sys::Memory::MF_EXEC: + } + if (MP == (MemProt::Read | MemProt::Exec)) return PAGE_EXECUTE_READ; - case llvm::sys::Memory::MF_READ | llvm::sys::Memory::MF_WRITE | - llvm::sys::Memory::MF_EXEC: + if (MP == (MemProt::Read | MemProt::Write | MemProt::Exec)) return PAGE_EXECUTE_READWRITE; - case llvm::sys::Memory::MF_EXEC: + if (MP == MemProt::Exec) return PAGE_EXECUTE; - default: - llvm_unreachable("Illegal memory protection flag specified!"); - } - // Provide a default return value as required by some compilers. + return PAGE_NOACCESS; } #endif -namespace llvm { -namespace orc { -namespace rt_bootstrap { - Expected<std::pair<ExecutorAddr, std::string>> ExecutorSharedMemoryMapperService::reserve(uint64_t Size) { -#if defined(LLVM_ON_UNIX) || defined(_WIN32) +#if (defined(LLVM_ON_UNIX) && !defined(__ANDROID__)) || defined(_WIN32) #if defined(LLVM_ON_UNIX) @@ -125,7 +120,7 @@ ExecutorSharedMemoryMapperService::reserve(uint64_t Size) { Expected<ExecutorAddr> ExecutorSharedMemoryMapperService::initialize( ExecutorAddr Reservation, tpctypes::SharedMemoryFinalizeRequest &FR) { -#if defined(LLVM_ON_UNIX) || defined(_WIN32) +#if (defined(LLVM_ON_UNIX) && !defined(__ANDROID__)) || defined(_WIN32) ExecutorAddr MinAddr(~0ULL); @@ -137,11 +132,11 @@ Expected<ExecutorAddr> ExecutorSharedMemoryMapperService::initialize( #if defined(LLVM_ON_UNIX) int NativeProt = 0; - if (Segment.Prot & tpctypes::WPF_Read) + if ((Segment.AG.getMemProt() & MemProt::Read) == MemProt::Read) NativeProt |= PROT_READ; - if (Segment.Prot & tpctypes::WPF_Write) + if ((Segment.AG.getMemProt() & MemProt::Write) == MemProt::Write) NativeProt |= PROT_WRITE; - if (Segment.Prot & tpctypes::WPF_Exec) + if ((Segment.AG.getMemProt() & MemProt::Exec) == MemProt::Exec) NativeProt |= PROT_EXEC; if (mprotect(Segment.Addr.toPtr<void *>(), Segment.Size, NativeProt)) @@ -150,7 +145,7 @@ Expected<ExecutorAddr> ExecutorSharedMemoryMapperService::initialize( #elif defined(_WIN32) DWORD NativeProt = - getWindowsProtectionFlags(fromWireProtectionFlags(Segment.Prot)); + getWindowsProtectionFlags(Segment.AG.getMemProt()); if (!VirtualProtect(Segment.Addr.toPtr<void *>(), Segment.Size, NativeProt, &NativeProt)) @@ -158,7 +153,7 @@ Expected<ExecutorAddr> ExecutorSharedMemoryMapperService::initialize( #endif - if (Segment.Prot & tpctypes::WPF_Exec) + if ((Segment.AG.getMemProt() & MemProt::Exec) == MemProt::Exec) sys::Memory::InvalidateInstructionCache(Segment.Addr.toPtr<void *>(), Segment.Size); } @@ -192,12 +187,23 @@ Error ExecutorSharedMemoryMapperService::deinitialize( { std::lock_guard<std::mutex> Lock(Mutex); - for (auto Base : Bases) { + for (auto Base : llvm::reverse(Bases)) { if (Error Err = shared::runDeallocActions( Allocations[Base].DeinitializationActions)) { AllErr = joinErrors(std::move(AllErr), std::move(Err)); } + // Remove the allocation from the allocation list of its reservation + for (auto &Reservation : Reservations) { + auto AllocationIt = + std::find(Reservation.second.Allocations.begin(), + Reservation.second.Allocations.end(), Base); + if (AllocationIt != Reservation.second.Allocations.end()) { + Reservation.second.Allocations.erase(AllocationIt); + break; + } + } + Allocations.erase(Base); } } @@ -207,7 +213,7 @@ Error ExecutorSharedMemoryMapperService::deinitialize( Error ExecutorSharedMemoryMapperService::release( const std::vector<ExecutorAddr> &Bases) { -#if defined(LLVM_ON_UNIX) || defined(_WIN32) +#if (defined(LLVM_ON_UNIX) && !defined(__ANDROID__)) || defined(_WIN32) Error Err = Error::success(); for (auto Base : Bases) { @@ -241,6 +247,7 @@ Error ExecutorSharedMemoryMapperService::release( errno, std::generic_category()))); #elif defined(_WIN32) + (void)Size; if (!UnmapViewOfFile(Base.toPtr<void *>())) Err = joinErrors(std::move(Err), @@ -263,19 +270,15 @@ Error ExecutorSharedMemoryMapperService::release( } Error ExecutorSharedMemoryMapperService::shutdown() { + if (Reservations.empty()) + return Error::success(); + std::vector<ExecutorAddr> ReservationAddrs; - if (!Reservations.empty()) { - std::lock_guard<std::mutex> Lock(Mutex); - { - ReservationAddrs.reserve(Reservations.size()); - for (const auto &R : Reservations) { - ReservationAddrs.push_back(ExecutorAddr::fromPtr(R.getFirst())); - } - } - } - return release(ReservationAddrs); + ReservationAddrs.reserve(Reservations.size()); + for (const auto &R : Reservations) + ReservationAddrs.push_back(ExecutorAddr::fromPtr(R.getFirst())); - return Error::success(); + return release(std::move(ReservationAddrs)); } void ExecutorSharedMemoryMapperService::addBootstrapSymbols( |