Commit d946e0a3 by Nicolas Capens Committed by Nicolas Capens

Split off Routine into its own file.

BUG=15907357 Change-Id: I7a16ab35e8013d8457c482b06220b755a9f79745 Reviewed-on: https://swiftshader-review.googlesource.com/1144Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent db1515d2
...@@ -293,6 +293,8 @@ ...@@ -293,6 +293,8 @@
<Unit filename="./../../Main/serialcommon.h" /> <Unit filename="./../../Main/serialcommon.h" />
<Unit filename="./../../Main/serialvalid.cpp" /> <Unit filename="./../../Main/serialvalid.cpp" />
<Unit filename="./../../Main/serialvalid.h" /> <Unit filename="./../../Main/serialvalid.h" />
<Unit filename="./../../Reactor/Routine.cpp" />
<Unit filename="./../../Reactor/Routine.hpp" />
<Unit filename="./../../Reactor/RoutineManager.cpp" /> <Unit filename="./../../Reactor/RoutineManager.cpp" />
<Unit filename="./../../Reactor/RoutineManager.hpp" /> <Unit filename="./../../Reactor/RoutineManager.hpp" />
<Unit filename="./../../Reactor/Nucleus.cpp" /> <Unit filename="./../../Reactor/Nucleus.cpp" />
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include "llvm/Support/TargetSelect.h" #include "llvm/Support/TargetSelect.h"
#include "../lib/ExecutionEngine/JIT/JIT.h" #include "../lib/ExecutionEngine/JIT/JIT.h"
#include "Routine.hpp"
#include "RoutineManager.hpp" #include "RoutineManager.hpp"
#include "x86.hpp" #include "x86.hpp"
#include "CPUID.hpp" #include "CPUID.hpp"
...@@ -70,83 +71,6 @@ namespace sw ...@@ -70,83 +71,6 @@ 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;
}
}
Nucleus::Nucleus() Nucleus::Nucleus()
{ {
InitializeNativeTarget(); InitializeNativeTarget();
...@@ -243,14 +167,11 @@ namespace sw ...@@ -243,14 +167,11 @@ namespace sw
} }
void *entry = executionEngine->getPointerToFunction(function); void *entry = executionEngine->getPointerToFunction(function);
Routine *routine = routineManager->acquireRoutine(entry);
Routine *routine = routineManager->acquireRoutine();
routine->entry = entry;
markExecutable(routine->buffer, routine->bufferSize);
if(CodeAnalystLogJITCode) if(CodeAnalystLogJITCode)
{ {
CodeAnalystLogJITCode(routine->entry, routine->getCodeSize(), name); CodeAnalystLogJITCode(routine->getEntry(), routine->getCodeSize(), name);
} }
return routine; return routine;
......
...@@ -61,41 +61,9 @@ namespace sw ...@@ -61,41 +61,9 @@ namespace sw
extern Optimization optimization[10]; extern Optimization optimization[10];
class Routine;
class RoutineManager; class RoutineManager;
class Builder; 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 class Nucleus
{ {
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
// //
#include "Nucleus.hpp" #include "Nucleus.hpp"
#include "Routine.hpp"
namespace sw namespace sw
{ {
......
...@@ -262,12 +262,14 @@ ...@@ -262,12 +262,14 @@
<ItemGroup> <ItemGroup>
<ClCompile Include="DLL.cpp" /> <ClCompile Include="DLL.cpp" />
<ClCompile Include="Nucleus.cpp" /> <ClCompile Include="Nucleus.cpp" />
<ClCompile Include="Routine.cpp" />
<ClCompile Include="RoutineManager.cpp" /> <ClCompile Include="RoutineManager.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="DLL.hpp" /> <ClInclude Include="DLL.hpp" />
<ClInclude Include="Nucleus.hpp" /> <ClInclude Include="Nucleus.hpp" />
<ClInclude Include="Reactor.hpp" /> <ClInclude Include="Reactor.hpp" />
<ClInclude Include="Routine.hpp" />
<ClInclude Include="RoutineManager.hpp" /> <ClInclude Include="RoutineManager.hpp" />
<ClInclude Include="x86.hpp" /> <ClInclude Include="x86.hpp" />
</ItemGroup> </ItemGroup>
......
...@@ -24,6 +24,9 @@ ...@@ -24,6 +24,9 @@
<ClCompile Include="RoutineManager.cpp"> <ClCompile Include="RoutineManager.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Routine.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="DLL.hpp"> <ClInclude Include="DLL.hpp">
...@@ -41,5 +44,8 @@ ...@@ -41,5 +44,8 @@
<ClInclude Include="RoutineManager.hpp"> <ClInclude Include="RoutineManager.hpp">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Routine.hpp">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>
\ No newline at end of file
#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;
}
}
}
#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
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
#include "RoutineManager.hpp" #include "RoutineManager.hpp"
#include "Nucleus.hpp" #include "Routine.hpp"
#include "llvm/Function.h" #include "llvm/Function.h"
#include "../Common/Memory.hpp" #include "../Common/Memory.hpp"
#include "../Common/Thread.hpp" #include "../Common/Thread.hpp"
...@@ -117,16 +117,18 @@ namespace sw ...@@ -117,16 +117,18 @@ namespace sw
void RoutineManager::setMemoryExecutable() void RoutineManager::setMemoryExecutable()
{ {
markExecutable(routine->buffer, routine->bufferSize);
} }
void RoutineManager::setPoisonMemory(bool poison) void RoutineManager::setPoisonMemory(bool poison)
{ {
} }
Routine *RoutineManager::acquireRoutine() Routine *RoutineManager::acquireRoutine(void *entry)
{ {
Routine *result = routine; routine->entry = entry;
Routine *result = routine;
routine = 0; routine = 0;
return result; return result;
......
...@@ -42,7 +42,7 @@ namespace sw ...@@ -42,7 +42,7 @@ namespace sw
virtual void setMemoryExecutable(); virtual void setMemoryExecutable();
virtual void setPoisonMemory(bool poison); virtual void setPoisonMemory(bool poison);
Routine *acquireRoutine(); Routine *acquireRoutine(void *entry);
private: private:
Routine *routine; Routine *routine;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment