Fix relocating the code just once. Bug swiftshader:9 Change-Id: I5968426e6ffd53f65f0699017d35d07ff45bffab Reviewed-on: https://swiftshader-review.googlesource.com/7750 Reviewed-by: Nicolas Capens <capn@google.com> Tested-by: Nicolas Capens <capn@google.com> Reviewed-on: https://swiftshader-review.googlesource.com/8131 Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp index 650fc94..5b2d09c 100644 --- a/src/Reactor/SubzeroReactor.cpp +++ b/src/Reactor/SubzeroReactor.cpp
@@ -302,7 +302,7 @@ ELFMemoryStreamer &operator=(const ELFMemoryStreamer &) = delete; public: - ELFMemoryStreamer() : Routine() + ELFMemoryStreamer() : Routine(), entry(nullptr) { position = 0; buffer.reserve(0x1000); @@ -346,13 +346,19 @@ const void *getEntry() override { - VirtualProtect(&buffer[0], buffer.size(), PAGE_EXECUTE_READWRITE, &oldProtection); - position = std::numeric_limits<std::size_t>::max(); // Can't stream more data after this + if(!entry) + { + VirtualProtect(&buffer[0], buffer.size(), PAGE_EXECUTE_READWRITE, &oldProtection); + position = std::numeric_limits<std::size_t>::max(); // Can't stream more data after this - return loadImage(&buffer[0]); + entry = loadImage(&buffer[0]); + } + + return entry; } private: + void *entry; std::vector<uint8_t, ExecutableAllocator<uint8_t>> buffer; std::size_t position; DWORD oldProtection;