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;