diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess')
5 files changed, 75 insertions, 50 deletions
diff --git a/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp b/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp index caa191cea899..147f915f61d6 100644 --- a/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp +++ b/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp @@ -21,35 +21,30 @@ #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(__ANDROID__)) || defined(_WIN32) @@ -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); } } @@ -264,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( diff --git a/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/OrcRTBootstrap.cpp b/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/OrcRTBootstrap.cpp index 909d47deef59..b38877955282 100644 --- a/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/OrcRTBootstrap.cpp +++ b/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/OrcRTBootstrap.cpp @@ -56,6 +56,27 @@ runAsMainWrapper(const char *ArgData, size_t ArgSize) { .release(); } +static llvm::orc::shared::CWrapperFunctionResult +runAsVoidFunctionWrapper(const char *ArgData, size_t ArgSize) { + return WrapperFunction<rt::SPSRunAsVoidFunctionSignature>::handle( + ArgData, ArgSize, + [](ExecutorAddr MainAddr) -> int32_t { + return runAsVoidFunction(MainAddr.toPtr<int32_t (*)(void)>()); + }) + .release(); +} + +static llvm::orc::shared::CWrapperFunctionResult +runAsIntFunctionWrapper(const char *ArgData, size_t ArgSize) { + return WrapperFunction<rt::SPSRunAsIntFunctionSignature>::handle( + ArgData, ArgSize, + [](ExecutorAddr MainAddr, int32_t Arg) -> int32_t { + return runAsIntFunction(MainAddr.toPtr<int32_t (*)(int32_t)>(), + Arg); + }) + .release(); +} + void addTo(StringMap<ExecutorAddr> &M) { M[rt::MemoryWriteUInt8sWrapperName] = ExecutorAddr::fromPtr( &writeUIntsWrapper<tpctypes::UInt8Write, @@ -76,6 +97,10 @@ void addTo(StringMap<ExecutorAddr> &M) { M[rt::DeregisterEHFrameSectionWrapperName] = ExecutorAddr::fromPtr(&llvm_orc_deregisterEHFrameSectionWrapper); M[rt::RunAsMainWrapperName] = ExecutorAddr::fromPtr(&runAsMainWrapper); + M[rt::RunAsVoidFunctionWrapperName] = + ExecutorAddr::fromPtr(&runAsVoidFunctionWrapper); + M[rt::RunAsIntFunctionWrapperName] = + ExecutorAddr::fromPtr(&runAsIntFunctionWrapper); } } // end namespace rt_bootstrap diff --git a/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.cpp b/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.cpp index 3c9dd21b0832..cb11b68e2719 100644 --- a/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.cpp +++ b/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.cpp @@ -35,24 +35,18 @@ SimpleExecutorDylibManager::open(const std::string &Path, uint64_t Mode) { return make_error<StringError>(std::move(ErrMsg), inconvertibleErrorCode()); std::lock_guard<std::mutex> Lock(M); - Dylibs[NextId] = std::move(DL); - return NextId++; + auto H = ExecutorAddr::fromPtr(DL.getOSSpecificHandle()); + Dylibs.insert(DL.getOSSpecificHandle()); + return H; } Expected<std::vector<ExecutorAddr>> SimpleExecutorDylibManager::lookup(tpctypes::DylibHandle H, const RemoteSymbolLookupSet &L) { std::vector<ExecutorAddr> Result; - - std::lock_guard<std::mutex> Lock(M); - auto I = Dylibs.find(H); - if (I == Dylibs.end()) - return make_error<StringError>("No dylib for handle " + formatv("{0:x}", H), - inconvertibleErrorCode()); - auto &DL = I->second; + auto DL = sys::DynamicLibrary(H.toPtr<void *>()); for (const auto &E : L) { - if (E.Name.empty()) { if (E.Required) return make_error<StringError>("Required address for empty symbol \"\"", @@ -85,10 +79,10 @@ SimpleExecutorDylibManager::lookup(tpctypes::DylibHandle H, Error SimpleExecutorDylibManager::shutdown() { - DylibsMap DM; + DylibSet DS; { std::lock_guard<std::mutex> Lock(M); - std::swap(DM, Dylibs); + std::swap(DS, Dylibs); } // There is no removal of dylibs at the moment, so nothing to do here. diff --git a/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorMemoryManager.cpp b/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorMemoryManager.cpp index c848dd65fa7e..ce94bf1e039a 100644 --- a/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorMemoryManager.cpp +++ b/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorMemoryManager.cpp @@ -132,9 +132,9 @@ Error SimpleExecutorMemoryManager::finalize(tpctypes::FinalizeRequest &FR) { assert(Seg.Size <= std::numeric_limits<size_t>::max()); if (auto EC = sys::Memory::protectMappedMemory( {Mem, static_cast<size_t>(Seg.Size)}, - tpctypes::fromWireProtectionFlags(Seg.Prot))) + toSysMemoryProtectionFlags(Seg.AG.getMemProt()))) return BailOut(errorCodeToError(EC)); - if (Seg.Prot & tpctypes::WPF_Exec) + if ((Seg.AG.getMemProt() & MemProt::Exec) == MemProt::Exec) sys::Memory::InvalidateInstructionCache(Mem, Seg.Size); } diff --git a/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/TargetExecutionUtils.cpp b/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/TargetExecutionUtils.cpp index a8e6c049cf4b..7546b3f8d0fa 100644 --- a/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/TargetExecutionUtils.cpp +++ b/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/TargetExecutionUtils.cpp @@ -14,7 +14,7 @@ namespace llvm { namespace orc { int runAsMain(int (*Main)(int, char *[]), ArrayRef<std::string> Args, - Optional<StringRef> ProgramName) { + std::optional<StringRef> ProgramName) { std::vector<std::unique_ptr<char[]>> ArgVStorage; std::vector<char *> ArgV; @@ -39,5 +39,9 @@ int runAsMain(int (*Main)(int, char *[]), ArrayRef<std::string> Args, return Main(Args.size() + !!ProgramName, ArgV.data()); } +int runAsVoidFunction(int (*Func)(void)) { return Func(); } + +int runAsIntFunction(int (*Func)(int), int Arg) { return Func(Arg); } + } // End namespace orc. } // End namespace llvm. |