<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" />
#include "llvm/Support/TargetSelect.h"
#include "../lib/ExecutionEngine/JIT/JIT.h"
+#include "Routine.hpp"
#include "RoutineManager.hpp"
#include "x86.hpp"
#include "CPUID.hpp"
{
};
- 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();
}
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;
\r
extern Optimization optimization[10];\r
\r
+ class Routine;\r
class RoutineManager;\r
class Builder;\r
- class Nucleus;\r
-\r
- class Routine\r
- {\r
- friend class Nucleus;\r
-\r
- public:\r
- Routine(int bufferSize);\r
- Routine(void *memory, int bufferSize, int offset);\r
-\r
- ~Routine();\r
-\r
- void setFunctionSize(int functionSize);\r
-\r
- const void *getBuffer();\r
- const void *getEntry();\r
- int getBufferSize();\r
- int getFunctionSize(); // Includes constants before the entry point\r
- int getCodeSize(); // Executable code only\r
- bool isDynamic();\r
-\r
- void bind();\r
- void unbind();\r
-\r
- private:\r
- void *buffer;\r
- const void *entry;\r
- int bufferSize;\r
- int functionSize;\r
-\r
- volatile int bindCount;\r
- const bool dynamic; // Generated or precompiled\r
- };\r
\r
class Nucleus\r
{\r
//\r
\r
#include "Nucleus.hpp"\r
+#include "Routine.hpp"\r
\r
namespace sw\r
{\r
<ItemGroup>\r
<ClCompile Include="DLL.cpp" />\r
<ClCompile Include="Nucleus.cpp" />\r
+ <ClCompile Include="Routine.cpp" />\r
<ClCompile Include="RoutineManager.cpp" />\r
</ItemGroup>\r
<ItemGroup>\r
<ClInclude Include="DLL.hpp" />\r
<ClInclude Include="Nucleus.hpp" />\r
<ClInclude Include="Reactor.hpp" />\r
+ <ClInclude Include="Routine.hpp" />\r
<ClInclude Include="RoutineManager.hpp" />\r
<ClInclude Include="x86.hpp" />\r
</ItemGroup>\r
<ClCompile Include="RoutineManager.cpp">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
+ <ClCompile Include="Routine.cpp">\r
+ <Filter>Source Files</Filter>\r
+ </ClCompile>\r
</ItemGroup>\r
<ItemGroup>\r
<ClInclude Include="DLL.hpp">\r
<ClInclude Include="RoutineManager.hpp">\r
<Filter>Header Files</Filter>\r
</ClInclude>\r
+ <ClInclude Include="Routine.hpp">\r
+ <Filter>Header Files</Filter>\r
+ </ClInclude>\r
</ItemGroup>\r
</Project>
\ No newline at end of file
--- /dev/null
+#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;
+ }
+ }
+}
--- /dev/null
+#ifndef sw_Routine_hpp\r
+#define sw_Routine_hpp\r
+\r
+namespace sw\r
+{\r
+ class RoutineManager;\r
+\r
+ class Routine\r
+ {\r
+ friend class RoutineManager;\r
+\r
+ public:\r
+ Routine(int bufferSize);\r
+ Routine(void *memory, int bufferSize, int offset);\r
+\r
+ ~Routine();\r
+\r
+ void setFunctionSize(int functionSize);\r
+\r
+ const void *getBuffer();\r
+ const void *getEntry();\r
+ int getBufferSize();\r
+ int getFunctionSize(); // Includes constants before the entry point\r
+ int getCodeSize(); // Executable code only\r
+ bool isDynamic();\r
+\r
+ void bind();\r
+ void unbind();\r
+\r
+ private:\r
+ void *buffer;\r
+ const void *entry;\r
+ int bufferSize;\r
+ int functionSize;\r
+\r
+ volatile int bindCount;\r
+ const bool dynamic; // Generated or precompiled\r
+ };\r
+}\r
+\r
+#endif // sw_Routine_hpp\r
#include "RoutineManager.hpp"
-#include "Nucleus.hpp"
+#include "Routine.hpp"
#include "llvm/Function.h"
#include "../Common/Memory.hpp"
#include "../Common/Thread.hpp"
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;
virtual void setMemoryExecutable();\r
virtual void setPoisonMemory(bool poison);\r
\r
- Routine *acquireRoutine();\r
+ Routine *acquireRoutine(void *entry);\r
\r
private:\r
Routine *routine;\r