Abstract llvm::BasicBlock usage.

Bug swiftshader:10

Change-Id: Ib45d459aa4f68e572b1deaa03e0aaf83002b7881
Reviewed-on: https://swiftshader-review.googlesource.com/7275
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Reactor/Nucleus.cpp b/src/Reactor/Nucleus.cpp
index ab9a151..b1c1ac6 100644
--- a/src/Reactor/Nucleus.cpp
+++ b/src/Reactor/Nucleus.cpp
@@ -75,9 +75,8 @@
 
 	Optimization optimization[10] = {InstructionCombining, Disabled};
 
-	class Type : public llvm::Type
-	{
-	};
+	class Type : public llvm::Type {};
+	class BasicBlock : public llvm::BasicBlock {};
 
 	inline Type *T(llvm::Type *t)
 	{
@@ -89,6 +88,11 @@
 		return reinterpret_cast<std::vector<llvm::Type*>&>(t);
 	}
 
+	inline BasicBlock *B(llvm::BasicBlock *t)
+	{
+		return reinterpret_cast<BasicBlock*>(t);
+	}
+
 	Nucleus::Nucleus()
 	{
 		codegenMutex.lock();   // Reactor and LLVM are currently not thread safe
@@ -240,7 +244,7 @@
 	Value *Nucleus::allocateStackVariable(Type *type, int arraySize)
 	{
 		// Need to allocate it in the entry block for mem2reg to work
-		BasicBlock &entryBlock = ::function->getEntryBlock();
+		llvm::BasicBlock &entryBlock = ::function->getEntryBlock();
 
 		Instruction *declaration;
 
@@ -260,12 +264,12 @@
 
 	BasicBlock *Nucleus::createBasicBlock()
 	{
-		return BasicBlock::Create(*::context, "", ::function);
+		return B(BasicBlock::Create(*::context, "", ::function));
 	}
 
 	BasicBlock *Nucleus::getInsertBlock()
 	{
-		return ::builder->GetInsertBlock();
+		return B(::builder->GetInsertBlock());
 	}
 
 	void Nucleus::setInsertBlock(BasicBlock *basicBlock)
@@ -276,7 +280,7 @@
 
 	BasicBlock *Nucleus::getPredecessor(BasicBlock *basicBlock)
 	{
-		return *pred_begin(basicBlock);
+		return B(*pred_begin(basicBlock));
 	}
 
 	void Nucleus::createFunction(Type *ReturnType, std::vector<Type*> &Params)
@@ -680,12 +684,12 @@
 		return ::builder->CreateSelect(C, ifTrue, ifFalse);
 	}
 
-	Value *Nucleus::createSwitch(llvm::Value *V, llvm::BasicBlock *Dest, unsigned NumCases)
+	Value *Nucleus::createSwitch(llvm::Value *V, BasicBlock *Dest, unsigned NumCases)
 	{
 		return ::builder->CreateSwitch(V, Dest, NumCases);
 	}
 
-	void Nucleus::addSwitchCase(llvm::Value *Switch, int Case, llvm::BasicBlock *Branch)
+	void Nucleus::addSwitchCase(llvm::Value *Switch, int Case, BasicBlock *Branch)
 	{
 		static_cast<SwitchInst*>(Switch)->addCase(llvm::ConstantInt::get(Type::getInt32Ty(*::context), Case, true), Branch);
 	}