diff --git a/src/Android.mk b/src/Android.mk
index d3efe38..9fffda3 100644
--- a/src/Android.mk
+++ b/src/Android.mk
@@ -38,7 +38,8 @@
 COMMON_SRC_FILES += \
 	Reactor/Nucleus.cpp \
 	Reactor/Routine.cpp \
-	Reactor/RoutineManager.cpp
+	Reactor/LLVMRoutine.cpp \
+	Reactor/LLVMRoutineManager.cpp
 
 COMMON_SRC_FILES += \
 	Renderer/Blitter.cpp \
diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.cbp b/src/OpenGL/libGLES_CM/libGLES_CM.cbp
index e5028ba..1123a3e 100644
--- a/src/OpenGL/libGLES_CM/libGLES_CM.cbp
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.cbp
@@ -178,8 +178,10 @@
 		<Unit filename="../../Reactor/Reactor.hpp" />
 		<Unit filename="../../Reactor/Routine.cpp" />
 		<Unit filename="../../Reactor/Routine.hpp" />
-		<Unit filename="../../Reactor/RoutineManager.cpp" />
-		<Unit filename="../../Reactor/RoutineManager.hpp" />
+		<Unit filename="../../Reactor/LLVMRoutine.cpp" />
+		<Unit filename="../../Reactor/LLVMRoutine.hpp" />
+		<Unit filename="../../Reactor/LLVMRoutineManager.cpp" />
+		<Unit filename="../../Reactor/LLVMRoutineManager.hpp" />
 		<Unit filename="../../Reactor/x86.hpp" />
 		<Unit filename="../../Renderer/Blitter.cpp" />
 		<Unit filename="../../Renderer/Blitter.hpp" />
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cbp b/src/OpenGL/libGLESv2/libGLESv2.cbp
index abd8fe8..7cc601f 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cbp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cbp
@@ -177,8 +177,10 @@
 		<Unit filename="../../Reactor/Reactor.hpp" />
 		<Unit filename="../../Reactor/Routine.cpp" />
 		<Unit filename="../../Reactor/Routine.hpp" />
-		<Unit filename="../../Reactor/RoutineManager.cpp" />
-		<Unit filename="../../Reactor/RoutineManager.hpp" />
+		<Unit filename="../../Reactor/LLVMRoutine.cpp" />
+		<Unit filename="../../Reactor/LLVMRoutine.hpp" />
+		<Unit filename="../../Reactor/LLVMRoutineManager.cpp" />
+		<Unit filename="../../Reactor/LLVMRoutineManager.hpp" />
 		<Unit filename="../../Reactor/x86.hpp" />
 		<Unit filename="../../Renderer/Blitter.cpp" />
 		<Unit filename="../../Renderer/Blitter.hpp" />
diff --git a/src/Reactor/BUILD.gn b/src/Reactor/BUILD.gn
index 0e3e8f4..ee04cbf 100644
--- a/src/Reactor/BUILD.gn
+++ b/src/Reactor/BUILD.gn
@@ -43,7 +43,8 @@
   sources = [
     "Nucleus.cpp",
     "Routine.cpp",
-    "RoutineManager.cpp",
+    "LLVMRoutine.cpp",
+    "LLVMRoutineManager.cpp",
   ]
 
   if (is_win) {
diff --git a/src/Reactor/LLVMRoutine.cpp b/src/Reactor/LLVMRoutine.cpp
new file mode 100644
index 0000000..df12337
--- /dev/null
+++ b/src/Reactor/LLVMRoutine.cpp
@@ -0,0 +1,46 @@
+// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "LLVMRoutine.hpp"
+
+#include "../Common/Memory.hpp"
+#include "../Common/Thread.hpp"
+#include "../Common/Types.hpp"
+
+namespace sw
+{
+	LLVMRoutine::LLVMRoutine(int bufferSize) : bufferSize(bufferSize)
+	{
+		void *memory = allocateExecutable(bufferSize);
+
+		buffer = memory;
+		entry = memory;
+		functionSize = bufferSize;   // Updated by LLVMRoutineManager::endFunctionBody
+	}
+
+	LLVMRoutine::~LLVMRoutine()
+	{
+		deallocateExecutable(buffer, bufferSize);
+	}
+
+	const void *LLVMRoutine::getEntry()
+	{
+		return entry;
+	}
+
+	int LLVMRoutine::getCodeSize()
+	{
+		return functionSize - static_cast<int>((uintptr_t)entry - (uintptr_t)buffer);
+	}
+}
diff --git a/src/Reactor/LLVMRoutine.hpp b/src/Reactor/LLVMRoutine.hpp
new file mode 100644
index 0000000..264990f
--- /dev/null
+++ b/src/Reactor/LLVMRoutine.hpp
@@ -0,0 +1,53 @@
+// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef sw_LLVMRoutine_hpp
+#define sw_LLVMRoutine_hpp
+
+#include "Routine.hpp"
+
+namespace sw
+{
+	class LLVMRoutineManager;
+
+	class LLVMRoutine : public Routine
+	{
+		friend class LLVMRoutineManager;
+
+	public:
+		LLVMRoutine(int bufferSize);
+		//LLVMRoutine(void *memory, int bufferSize, int offset);
+
+		virtual ~LLVMRoutine();
+
+		//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();
+
+	private:
+		void *buffer;
+		const void *entry;
+		int bufferSize;
+		int functionSize;
+
+		//const bool dynamic;   // Generated or precompiled
+	};
+}
+
+#endif   // sw_LLVMRoutine_hpp
diff --git a/src/Reactor/LLVMRoutineManager.cpp b/src/Reactor/LLVMRoutineManager.cpp
new file mode 100644
index 0000000..99a8e9d
--- /dev/null
+++ b/src/Reactor/LLVMRoutineManager.cpp
@@ -0,0 +1,148 @@
+// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "LLVMRoutineManager.hpp"
+
+#include "LLVMRoutine.hpp"
+#include "llvm/Function.h"
+#include "../Common/Memory.hpp"
+#include "../Common/Thread.hpp"
+#include "../Common/Debug.hpp"
+
+namespace sw
+{
+	using namespace llvm;
+
+	volatile int LLVMRoutineManager::averageInstructionSize = 4;
+
+	LLVMRoutineManager::LLVMRoutineManager()
+	{
+		routine = nullptr;
+	}
+
+	LLVMRoutineManager::~LLVMRoutineManager()
+	{
+		delete routine;
+	}
+
+	void LLVMRoutineManager::AllocateGOT()
+	{
+		UNIMPLEMENTED();
+	}
+
+	uint8_t *LLVMRoutineManager::allocateStub(const GlobalValue *function, unsigned stubSize, unsigned alignment)
+	{
+		UNIMPLEMENTED();
+		return nullptr;
+	}
+
+	uint8_t *LLVMRoutineManager::startFunctionBody(const llvm::Function *function, uintptr_t &actualSize)
+	{
+		if(actualSize == 0)   // Estimate size
+		{
+			size_t instructionCount = 0;
+			for(llvm::Function::const_iterator basicBlock = function->begin(); basicBlock != function->end(); basicBlock++)
+			{
+				instructionCount += basicBlock->size();
+			}
+
+			actualSize = instructionCount * averageInstructionSize;
+		}
+		else   // Estimate was too low
+		{
+			sw::atomicIncrement(&averageInstructionSize);
+		}
+
+		// Round up to the next page size
+		size_t pageSize = memoryPageSize();
+		actualSize = (actualSize + pageSize - 1) & ~(pageSize - 1);
+
+		delete routine;
+		routine = new LLVMRoutine(static_cast<int>(actualSize));
+
+		return (uint8_t*)routine->buffer;
+	}
+
+	void LLVMRoutineManager::endFunctionBody(const llvm::Function *function, uint8_t *functionStart, uint8_t *functionEnd)
+	{
+		routine->functionSize = static_cast<int>(static_cast<ptrdiff_t>(functionEnd - functionStart));
+	}
+
+	uint8_t *LLVMRoutineManager::startExceptionTable(const llvm::Function* F, uintptr_t &ActualSize)
+	{
+		UNIMPLEMENTED();
+		return nullptr;
+	}
+
+	void LLVMRoutineManager::endExceptionTable(const llvm::Function *F, uint8_t *TableStart, uint8_t *TableEnd, uint8_t* FrameRegister)
+	{
+		UNIMPLEMENTED();
+	}
+
+	uint8_t *LLVMRoutineManager::getGOTBase() const
+	{
+		ASSERT(!HasGOT);
+		return nullptr;
+	}
+
+	uint8_t *LLVMRoutineManager::allocateSpace(intptr_t Size, unsigned Alignment)
+	{
+		UNIMPLEMENTED();
+		return nullptr;
+	}
+
+	uint8_t *LLVMRoutineManager::allocateGlobal(uintptr_t Size, unsigned Alignment)
+	{
+		UNIMPLEMENTED();
+		return nullptr;
+	}
+
+	void LLVMRoutineManager::deallocateFunctionBody(void *Body)
+	{
+		delete routine;
+		routine = nullptr;
+	}
+
+	void LLVMRoutineManager::deallocateExceptionTable(void *ET)
+	{
+		if(ET)
+		{
+			UNIMPLEMENTED();
+		}
+	}
+
+	void LLVMRoutineManager::setMemoryWritable()
+	{
+	}
+
+	void LLVMRoutineManager::setMemoryExecutable()
+	{
+		markExecutable(routine->buffer, routine->bufferSize);
+	}
+
+	void LLVMRoutineManager::setPoisonMemory(bool poison)
+	{
+		UNIMPLEMENTED();
+	}
+
+	LLVMRoutine *LLVMRoutineManager::acquireRoutine(void *entry)
+	{
+		routine->entry = entry;
+
+		LLVMRoutine *result = routine;
+		routine = nullptr;
+
+		return result;
+	}
+}
diff --git a/src/Reactor/RoutineManager.hpp b/src/Reactor/LLVMRoutineManager.hpp
similarity index 85%
rename from src/Reactor/RoutineManager.hpp
rename to src/Reactor/LLVMRoutineManager.hpp
index fb85fe4..b235923 100644
--- a/src/Reactor/RoutineManager.hpp
+++ b/src/Reactor/LLVMRoutineManager.hpp
@@ -12,22 +12,22 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef sw_RoutineManager_hpp
-#define sw_RoutineManager_hpp
+#ifndef sw_LLVMRoutineManager_hpp
+#define sw_LLVMRoutineManager_hpp
 
 #include "llvm/GlobalValue.h"
 #include "llvm/ExecutionEngine/JITMemoryManager.h"
 
 namespace sw
 {
-	class Routine;
+	class LLVMRoutine;
 
-	class RoutineManager : public llvm::JITMemoryManager
+	class LLVMRoutineManager : public llvm::JITMemoryManager
 	{
 	public:
-		RoutineManager();
+		LLVMRoutineManager();
 
-		virtual ~RoutineManager();
+		virtual ~LLVMRoutineManager();
 
 		virtual void AllocateGOT();
 
@@ -45,13 +45,13 @@
 		virtual void setMemoryExecutable();
 		virtual void setPoisonMemory(bool poison);
 
-		Routine *acquireRoutine(void *entry);
+		LLVMRoutine *acquireRoutine(void *entry);
 
 	private:
-		Routine *routine;
+		LLVMRoutine *routine;
 
 		static volatile int averageInstructionSize;
 	};
 }
 
-#endif   // sw_RoutineManager_hpp
+#endif   // sw_LLVMRoutineManager_hpp
diff --git a/src/Reactor/Nucleus.cpp b/src/Reactor/Nucleus.cpp
index 2b5baaf..67dd392 100644
--- a/src/Reactor/Nucleus.cpp
+++ b/src/Reactor/Nucleus.cpp
@@ -29,8 +29,8 @@
 #include "llvm/Support/TargetSelect.h"
 #include "../lib/ExecutionEngine/JIT/JIT.h"
 
-#include "Routine.hpp"
-#include "RoutineManager.hpp"
+#include "LLVMRoutine.hpp"
+#include "LLVMRoutineManager.hpp"
 #include "x86.hpp"
 #include "CPUID.hpp"
 #include "Thread.hpp"
@@ -60,7 +60,7 @@
 
 namespace
 {
-	sw::RoutineManager *routineManager = nullptr;
+	sw::LLVMRoutineManager *routineManager = nullptr;
 	llvm::ExecutionEngine *executionEngine = nullptr;
 	llvm::IRBuilder<> *builder = nullptr;
 	llvm::LLVMContext *context = nullptr;
@@ -118,7 +118,7 @@
 		}
 
 		::module = new Module("", *::context);
-		::routineManager = new RoutineManager();
+		::routineManager = new LLVMRoutineManager();
 
 		#if defined(__x86_64__)
 			const char *architecture = "x86-64";
@@ -205,7 +205,7 @@
 		}
 
 		void *entry = ::executionEngine->getPointerToFunction(::function);
-		Routine *routine = ::routineManager->acquireRoutine(entry);
+		LLVMRoutine *routine = ::routineManager->acquireRoutine(entry);
 
 		if(CodeAnalystLogJITCode)
 		{
diff --git a/src/Reactor/Nucleus.hpp b/src/Reactor/Nucleus.hpp
index 0c53ca0..27f833f 100644
--- a/src/Reactor/Nucleus.hpp
+++ b/src/Reactor/Nucleus.hpp
@@ -34,6 +34,7 @@
 	class Value;
 	class Constant;
 	class BasicBlock;
+	class Routine;
 
 	enum Optimization
 	{
@@ -53,10 +54,6 @@
 
 	extern Optimization optimization[10];
 
-	class Routine;
-	class RoutineManager;
-	class Builder;
-
 	class Nucleus
 	{
 	public:
diff --git a/src/Reactor/Reactor.vcxproj b/src/Reactor/Reactor.vcxproj
index f9e24b6..0e15e93 100644
--- a/src/Reactor/Reactor.vcxproj
+++ b/src/Reactor/Reactor.vcxproj
@@ -266,15 +266,17 @@
     </ProjectReference>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClCompile Include="LLVMRoutine.cpp" />
+    <ClCompile Include="LLVMRoutineManager.cpp" />
     <ClCompile Include="Nucleus.cpp" />
     <ClCompile Include="Routine.cpp" />
-    <ClCompile Include="RoutineManager.cpp" />
   </ItemGroup>
   <ItemGroup>
+    <ClInclude Include="LLVMRoutine.hpp" />
+    <ClInclude Include="LLVMRoutineManager.hpp" />
     <ClInclude Include="Nucleus.hpp" />
     <ClInclude Include="Reactor.hpp" />
     <ClInclude Include="Routine.hpp" />
-    <ClInclude Include="RoutineManager.hpp" />
     <ClInclude Include="x86.hpp" />
   </ItemGroup>
   <ItemGroup>
diff --git a/src/Reactor/Reactor.vcxproj.filters b/src/Reactor/Reactor.vcxproj.filters
index 2a86f26..27a7fde 100644
--- a/src/Reactor/Reactor.vcxproj.filters
+++ b/src/Reactor/Reactor.vcxproj.filters
@@ -18,10 +18,13 @@
     <ClCompile Include="Nucleus.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="RoutineManager.cpp">
+    <ClCompile Include="Routine.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="Routine.cpp">
+    <ClCompile Include="LLVMRoutineManager.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="LLVMRoutine.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
   </ItemGroup>
@@ -35,10 +38,13 @@
     <ClInclude Include="x86.hpp">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="RoutineManager.hpp">
+    <ClInclude Include="Routine.hpp">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="Routine.hpp">
+    <ClInclude Include="LLVMRoutineManager.hpp">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="LLVMRoutine.hpp">
       <Filter>Header Files</Filter>
     </ClInclude>
   </ItemGroup>
diff --git a/src/Reactor/Routine.cpp b/src/Reactor/Routine.cpp
index 340b21d..df82ab8 100644
--- a/src/Reactor/Routine.cpp
+++ b/src/Reactor/Routine.cpp
@@ -14,74 +14,17 @@
 
 #include "Routine.hpp"
 
-#include "../Common/Memory.hpp"
 #include "../Common/Thread.hpp"
-#include "../Common/Types.hpp"
+
+#include <cassert>
 
 namespace sw
 {
-	Routine::Routine(int bufferSize) : bufferSize(bufferSize), dynamic(true)
+	Routine::Routine()
 	{
-		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 - static_cast<int>((uintptr_t)entry - (uintptr_t)buffer);
-	}
-
-	bool Routine::isDynamic()
-	{
-		return dynamic;
-	}
-
 	void Routine::bind()
 	{
 		atomicIncrement(&bindCount);
@@ -96,4 +39,9 @@
 			delete this;
 		}
 	}
+
+	Routine::~Routine()
+	{
+		assert(bindCount == 0);
+	}
 }
diff --git a/src/Reactor/Routine.hpp b/src/Reactor/Routine.hpp
index 6252a7a..b3ad7f5 100644
--- a/src/Reactor/Routine.hpp
+++ b/src/Reactor/Routine.hpp
@@ -17,38 +17,21 @@
 
 namespace sw
 {
-	class RoutineManager;
-
 	class Routine
 	{
-		friend class RoutineManager;
-
 	public:
-		Routine(int bufferSize);
-		Routine(void *memory, int bufferSize, int offset);
+		Routine();
 
-		~Routine();
+		virtual ~Routine();
 
-		void setFunctionSize(int functionSize);
+		virtual const void *getEntry() = 0;
 
-		const void *getBuffer();
-		const void *getEntry();
-		int getBufferSize();
-		int getFunctionSize();   // Includes constants before the entry point
-		int getCodeSize();       // Executable code only
-		bool isDynamic();
-
+		// Reference counting
 		void bind();
 		void unbind();
 
 	private:
-		void *buffer;
-		const void *entry;
-		int bufferSize;
-		int functionSize;
-
 		volatile int bindCount;
-		const bool dynamic;   // Generated or precompiled
 	};
 }
 
diff --git a/src/Reactor/RoutineManager.cpp b/src/Reactor/RoutineManager.cpp
deleted file mode 100644
index 928bec4..0000000
--- a/src/Reactor/RoutineManager.cpp
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "RoutineManager.hpp"
-
-#include "Routine.hpp"
-#include "llvm/Function.h"
-#include "../Common/Memory.hpp"
-#include "../Common/Thread.hpp"
-#include "../Common/Debug.hpp"
-
-namespace sw
-{
-	using namespace llvm;
-
-	volatile int RoutineManager::averageInstructionSize = 4;
-
-	RoutineManager::RoutineManager()
-	{
-		routine = 0;
-	}
-
-	RoutineManager::~RoutineManager()
-	{
-		delete routine;
-	}
-
-	void RoutineManager::AllocateGOT()
-	{
-		UNIMPLEMENTED();
-	}
-
-	uint8_t *RoutineManager::allocateStub(const GlobalValue *function, unsigned stubSize, unsigned alignment)
-	{
-		UNIMPLEMENTED();
-		return 0;
-	}
-
-	uint8_t *RoutineManager::startFunctionBody(const llvm::Function *function, uintptr_t &actualSize)
-	{
-		if(actualSize == 0)   // Estimate size
-		{
-			size_t instructionCount = 0;
-			for(llvm::Function::const_iterator basicBlock = function->begin(); basicBlock != function->end(); basicBlock++)
-			{
-				instructionCount += basicBlock->size();
-			}
-
-			actualSize = instructionCount * averageInstructionSize;
-		}
-		else   // Estimate was too low
-		{
-			sw::atomicIncrement(&averageInstructionSize);
-		}
-
-		// Round up to the next page size
-		size_t pageSize = memoryPageSize();
-		actualSize = (actualSize + pageSize - 1) & ~(pageSize - 1);
-
-		delete routine;
-		routine = new Routine(static_cast<int>(actualSize));
-
-		return (uint8_t*)routine->getBuffer();
-	}
-
-	void RoutineManager::endFunctionBody(const llvm::Function *function, uint8_t *functionStart, uint8_t *functionEnd)
-	{
-		routine->setFunctionSize(static_cast<int>(static_cast<ptrdiff_t>(functionEnd - functionStart)));
-	}
-
-	uint8_t *RoutineManager::startExceptionTable(const llvm::Function* F, uintptr_t &ActualSize)
-	{
-		UNIMPLEMENTED();
-		return 0;
-	}
-
-	void RoutineManager::endExceptionTable(const llvm::Function *F, uint8_t *TableStart, uint8_t *TableEnd, uint8_t* FrameRegister)
-	{
-		UNIMPLEMENTED();
-	}
-
-	uint8_t *RoutineManager::getGOTBase() const
-	{
-		ASSERT(!HasGOT);
-		return 0;
-	}
-
-	uint8_t *RoutineManager::allocateSpace(intptr_t Size, unsigned Alignment)
-	{
-		UNIMPLEMENTED();
-		return 0;
-	}
-
-	uint8_t *RoutineManager::allocateGlobal(uintptr_t Size, unsigned Alignment)
-	{
-		UNIMPLEMENTED();
-		return 0;
-	}
-
-	void RoutineManager::deallocateFunctionBody(void *Body)
-	{
-		delete routine;
-		routine = 0;
-	}
-
-	void RoutineManager::deallocateExceptionTable(void *ET)
-	{
-		if(ET)
-		{
-			UNIMPLEMENTED();
-		}
-	}
-
-	void RoutineManager::setMemoryWritable()
-	{
-	}
-
-	void RoutineManager::setMemoryExecutable()
-	{
-		markExecutable(routine->buffer, routine->bufferSize);
-	}
-
-	void RoutineManager::setPoisonMemory(bool poison)
-	{
-		UNIMPLEMENTED();
-	}
-
-	Routine *RoutineManager::acquireRoutine(void *entry)
-	{
-		routine->entry = entry;
-
-		Routine *result = routine;
-		routine = 0;
-
-		return result;
-	}
-}
