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;