Split off Routine into its own file.

BUG=15907357

Change-Id: I7a16ab35e8013d8457c482b06220b755a9f79745
Reviewed-on: https://swiftshader-review.googlesource.com/1144
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/GLES2/libGLESv2/libGLESv2.cbp b/src/GLES2/libGLESv2/libGLESv2.cbp
index 0807fe0..65008ed 100644
--- a/src/GLES2/libGLESv2/libGLESv2.cbp
+++ b/src/GLES2/libGLESv2/libGLESv2.cbp
@@ -293,6 +293,8 @@
 		<Unit filename="./../../Main/serialcommon.h" />
 		<Unit filename="./../../Main/serialvalid.cpp" />
 		<Unit filename="./../../Main/serialvalid.h" />
+		<Unit filename="./../../Reactor/Routine.cpp" />
+		<Unit filename="./../../Reactor/Routine.hpp" />
 		<Unit filename="./../../Reactor/RoutineManager.cpp" />
 		<Unit filename="./../../Reactor/RoutineManager.hpp" />
 		<Unit filename="./../../Reactor/Nucleus.cpp" />
diff --git a/src/Reactor/Nucleus.cpp b/src/Reactor/Nucleus.cpp
index 47f637c..4a819cb 100644
--- a/src/Reactor/Nucleus.cpp
+++ b/src/Reactor/Nucleus.cpp
@@ -26,6 +26,7 @@
 #include "llvm/Support/TargetSelect.h"
 #include "../lib/ExecutionEngine/JIT/JIT.h"
 
+#include "Routine.hpp"
 #include "RoutineManager.hpp"
 #include "x86.hpp"
 #include "CPUID.hpp"
@@ -70,83 +71,6 @@
 	{
 	};
 
-	Routine::Routine(int bufferSize) : bufferSize(bufferSize), dynamic(true)
-	{
-		void *memory = allocateExecutable(bufferSize);
-
-		buffer = memory;
-		entry = memory;
-		functionSize = bufferSize;   // Updated by RoutineManager::endFunctionBody
-
-		bindCount = 0;
-	}
-
-	Routine::Routine(void *memory, int bufferSize, int offset) : bufferSize(bufferSize), functionSize(bufferSize), dynamic(false)
-	{
-		buffer = (unsigned char*)memory - offset;
-		entry = memory;
-
-		bindCount = 0;
-	}
-
-	Routine::~Routine()
-	{
-		if(dynamic)
-		{
-			deallocateExecutable(buffer, bufferSize);
-		}
-	}
-
-	void Routine::setFunctionSize(int functionSize)
-	{
-		this->functionSize = functionSize;
-	}
-
-	const void *Routine::getBuffer()
-	{
-		return buffer;
-	}
-
-	const void *Routine::getEntry()
-	{
-		return entry;
-	}
-
-	int Routine::getBufferSize()
-	{
-		return bufferSize;
-	}
-
-	int Routine::getFunctionSize()
-	{
-		return functionSize;
-	}
-
-	int Routine::getCodeSize()
-	{
-		return functionSize - ((uintptr_t)entry - (uintptr_t)buffer);
-	}
-
-	bool Routine::isDynamic()
-	{
-		return dynamic;
-	}
-
-	void Routine::bind()
-	{
-		atomicIncrement(&bindCount);
-	}
-
-	void Routine::unbind()
-	{
-		long count = atomicDecrement(&bindCount);
-
-		if(count == 0)
-		{
-			delete this;
-		}
-	}
-
 	Nucleus::Nucleus()
 	{
 		InitializeNativeTarget();
@@ -243,14 +167,11 @@
 		}
 
 		void *entry = executionEngine->getPointerToFunction(function);
-
-		Routine *routine = routineManager->acquireRoutine();
-		routine->entry = entry;
-		markExecutable(routine->buffer, routine->bufferSize);
+		Routine *routine = routineManager->acquireRoutine(entry);
 
 		if(CodeAnalystLogJITCode)
 		{
-			CodeAnalystLogJITCode(routine->entry, routine->getCodeSize(), name);
+			CodeAnalystLogJITCode(routine->getEntry(), routine->getCodeSize(), name);
 		}
 
 		return routine;
diff --git a/src/Reactor/Nucleus.hpp b/src/Reactor/Nucleus.hpp
index b655d99..da2e0a3 100644
--- a/src/Reactor/Nucleus.hpp
+++ b/src/Reactor/Nucleus.hpp
@@ -61,41 +61,9 @@
 

 	extern Optimization optimization[10];

 

+	class Routine;

 	class RoutineManager;

 	class Builder;

-	class Nucleus;

-

-	class Routine

-	{

-		friend class Nucleus;

-

-	public:

-		Routine(int bufferSize);

-		Routine(void *memory, int bufferSize, int offset);

-

-		~Routine();

-

-		void setFunctionSize(int functionSize);

-

-		const void *getBuffer();

-		const void *getEntry();

-		int getBufferSize();

-		int getFunctionSize();   // Includes constants before the entry point

-		int getCodeSize();       // Executable code only

-		bool isDynamic();

-

-		void bind();

-		void unbind();

-

-	private:

-		void *buffer;

-		const void *entry;

-		int bufferSize;

-		int functionSize;

-

-		volatile int bindCount;

-		const bool dynamic;   // Generated or precompiled

-	};

 

 	class Nucleus

 	{

diff --git a/src/Reactor/Reactor.hpp b/src/Reactor/Reactor.hpp
index 8e37967..0e7538b 100644
--- a/src/Reactor/Reactor.hpp
+++ b/src/Reactor/Reactor.hpp
@@ -10,6 +10,7 @@
 //

 

 #include "Nucleus.hpp"

+#include "Routine.hpp"

 

 namespace sw

 {

diff --git a/src/Reactor/Reactor.vcxproj b/src/Reactor/Reactor.vcxproj
index 4312ba8..be56c44 100644
--- a/src/Reactor/Reactor.vcxproj
+++ b/src/Reactor/Reactor.vcxproj
@@ -262,12 +262,14 @@
   <ItemGroup>

     <ClCompile Include="DLL.cpp" />

     <ClCompile Include="Nucleus.cpp" />

+    <ClCompile Include="Routine.cpp" />

     <ClCompile Include="RoutineManager.cpp" />

   </ItemGroup>

   <ItemGroup>

     <ClInclude Include="DLL.hpp" />

     <ClInclude Include="Nucleus.hpp" />

     <ClInclude Include="Reactor.hpp" />

+    <ClInclude Include="Routine.hpp" />

     <ClInclude Include="RoutineManager.hpp" />

     <ClInclude Include="x86.hpp" />

   </ItemGroup>

diff --git a/src/Reactor/Reactor.vcxproj.filters b/src/Reactor/Reactor.vcxproj.filters
index d4629a8..e2d2f68 100644
--- a/src/Reactor/Reactor.vcxproj.filters
+++ b/src/Reactor/Reactor.vcxproj.filters
@@ -24,6 +24,9 @@
     <ClCompile Include="RoutineManager.cpp">

       <Filter>Source Files</Filter>

     </ClCompile>

+    <ClCompile Include="Routine.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

   </ItemGroup>

   <ItemGroup>

     <ClInclude Include="DLL.hpp">

@@ -41,5 +44,8 @@
     <ClInclude Include="RoutineManager.hpp">

       <Filter>Header Files</Filter>

     </ClInclude>

+    <ClInclude Include="Routine.hpp">

+      <Filter>Header Files</Filter>

+    </ClInclude>

   </ItemGroup>

 </Project>
\ No newline at end of file
diff --git a/src/Reactor/Routine.cpp b/src/Reactor/Routine.cpp
new file mode 100644
index 0000000..1671abe
--- /dev/null
+++ b/src/Reactor/Routine.cpp
@@ -0,0 +1,85 @@
+#include "Routine.hpp"
+
+#include "../Common/Memory.hpp"
+#include "../Common/Thread.hpp"
+#include "../Common/Types.hpp"
+
+namespace sw
+{
+	Routine::Routine(int bufferSize) : bufferSize(bufferSize), dynamic(true)
+	{
+		void *memory = allocateExecutable(bufferSize);
+
+		buffer = memory;
+		entry = memory;
+		functionSize = bufferSize;   // Updated by RoutineManager::endFunctionBody
+
+		bindCount = 0;
+	}
+
+	Routine::Routine(void *memory, int bufferSize, int offset) : bufferSize(bufferSize), functionSize(bufferSize), dynamic(false)
+	{
+		buffer = (unsigned char*)memory - offset;
+		entry = memory;
+
+		bindCount = 0;
+	}
+
+	Routine::~Routine()
+	{
+		if(dynamic)
+		{
+			deallocateExecutable(buffer, bufferSize);
+		}
+	}
+
+	void Routine::setFunctionSize(int functionSize)
+	{
+		this->functionSize = functionSize;
+	}
+
+	const void *Routine::getBuffer()
+	{
+		return buffer;
+	}
+
+	const void *Routine::getEntry()
+	{
+		return entry;
+	}
+
+	int Routine::getBufferSize()
+	{
+		return bufferSize;
+	}
+
+	int Routine::getFunctionSize()
+	{
+		return functionSize;
+	}
+
+	int Routine::getCodeSize()
+	{
+		return functionSize - ((uintptr_t)entry - (uintptr_t)buffer);
+	}
+
+	bool Routine::isDynamic()
+	{
+		return dynamic;
+	}
+
+	void Routine::bind()
+	{
+		atomicIncrement(&bindCount);
+	}
+
+	void Routine::unbind()
+	{
+		long count = atomicDecrement(&bindCount);
+
+		if(count == 0)
+		{
+			delete this;
+		}
+	}
+}
diff --git a/src/Reactor/Routine.hpp b/src/Reactor/Routine.hpp
new file mode 100644
index 0000000..6cdc6bc
--- /dev/null
+++ b/src/Reactor/Routine.hpp
@@ -0,0 +1,41 @@
+#ifndef sw_Routine_hpp

+#define sw_Routine_hpp

+

+namespace sw

+{

+	class RoutineManager;

+

+	class Routine

+	{

+		friend class RoutineManager;

+

+	public:

+		Routine(int bufferSize);

+		Routine(void *memory, int bufferSize, int offset);

+

+		~Routine();

+

+		void setFunctionSize(int functionSize);

+

+		const void *getBuffer();

+		const void *getEntry();

+		int getBufferSize();

+		int getFunctionSize();   // Includes constants before the entry point

+		int getCodeSize();       // Executable code only

+		bool isDynamic();

+

+		void bind();

+		void unbind();

+

+	private:

+		void *buffer;

+		const void *entry;

+		int bufferSize;

+		int functionSize;

+

+		volatile int bindCount;

+		const bool dynamic;   // Generated or precompiled

+	};

+}

+

+#endif   // sw_Routine_hpp

diff --git a/src/Reactor/RoutineManager.cpp b/src/Reactor/RoutineManager.cpp
index b0d5703..441db8d 100644
--- a/src/Reactor/RoutineManager.cpp
+++ b/src/Reactor/RoutineManager.cpp
@@ -11,7 +11,7 @@
 
 #include "RoutineManager.hpp"
 
-#include "Nucleus.hpp"
+#include "Routine.hpp"
 #include "llvm/Function.h"
 #include "../Common/Memory.hpp"
 #include "../Common/Thread.hpp"
@@ -117,16 +117,18 @@
 
 	void RoutineManager::setMemoryExecutable()
 	{
+		markExecutable(routine->buffer, routine->bufferSize);
 	}
 
 	void RoutineManager::setPoisonMemory(bool poison)
 	{
 	}
 
-	Routine *RoutineManager::acquireRoutine()
+	Routine *RoutineManager::acquireRoutine(void *entry)
 	{
-		Routine *result = routine;
+		routine->entry = entry;
 
+		Routine *result = routine;
 		routine = 0;
 
 		return result;
diff --git a/src/Reactor/RoutineManager.hpp b/src/Reactor/RoutineManager.hpp
index 342be7c..3c813b4 100644
--- a/src/Reactor/RoutineManager.hpp
+++ b/src/Reactor/RoutineManager.hpp
@@ -42,7 +42,7 @@
 		virtual void setMemoryExecutable();

 		virtual void setPoisonMemory(bool poison);

 

-		Routine *acquireRoutine();

+		Routine *acquireRoutine(void *entry);

 

 	private:

 		Routine *routine;