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;