Index: src/IceConverter.cpp |
diff --git a/src/IceConverter.cpp b/src/IceConverter.cpp |
index e8ec56d18112f49120c12f10a94a10d321acf8fc..47f8b39aba1c427875b301d555424095760eb287 100644 |
--- a/src/IceConverter.cpp |
+++ b/src/IceConverter.cpp |
@@ -48,6 +48,10 @@ template <typename T> static std::string LLVMObjectAsString(const T *O) { |
} |
// Base class for converting LLVM to ICE. |
+// TODO(stichnot): Redesign Converter, LLVM2ICEConverter, |
+// LLVM2ICEFunctionConverter, and LLVM2ICEGlobalsConverter with |
+// respect to Translator. In particular, the unique_ptr ownership |
+// rules in LLVM2ICEFunctionConverter. |
class LLVM2ICEConverter { |
LLVM2ICEConverter(const LLVM2ICEConverter &) = delete; |
LLVM2ICEConverter &operator=(const LLVM2ICEConverter &) = delete; |
@@ -79,15 +83,16 @@ public: |
LLVM2ICEFunctionConverter(Ice::Converter &Converter) |
: LLVM2ICEConverter(Converter), Func(nullptr) {} |
- // Caller is expected to delete the returned Ice::Cfg object. |
- Ice::Cfg *convertFunction(const Function *F) { |
+ void convertFunction(const Function *F) { |
+ Func = Ice::Cfg::create(Ctx); |
+ Ice::Cfg::setCurrentCfg(Func.get()); |
+ |
VarMap.clear(); |
NodeMap.clear(); |
- Func = Ice::Cfg::create(Ctx); |
Func->setFunctionName(F->getName()); |
Func->setReturnType(convertToIceType(F->getReturnType())); |
Func->setInternal(F->hasInternalLinkage()); |
- Ice::TimerMarker T(Ice::TimerStack::TT_llvmConvert, Func); |
+ Ice::TimerMarker T(Ice::TimerStack::TT_llvmConvert, Func.get()); |
// The initial definition/use of each arg is the entry node. |
for (auto ArgI = F->arg_begin(), ArgE = F->arg_end(); ArgI != ArgE; |
@@ -106,7 +111,8 @@ public: |
Func->setEntryNode(mapBasicBlockToNode(&F->getEntryBlock())); |
Func->computePredecessors(); |
- return Func; |
+ Ice::Cfg::setCurrentCfg(nullptr); |
+ Converter.translateFcn(std::move(Func)); |
} |
// convertConstant() does not use Func or require it to be a valid |
@@ -147,7 +153,7 @@ private: |
if (VarMap.find(V) == VarMap.end()) { |
VarMap[V] = Func->makeVariable(IceTy); |
if (ALLOW_DUMP) |
- VarMap[V]->setName(Func, V->getName()); |
+ VarMap[V]->setName(Func.get(), V->getName()); |
} |
return VarMap[V]; |
} |
@@ -304,13 +310,13 @@ private: |
Ice::Inst *convertLoadInstruction(const LoadInst *Inst) { |
Ice::Operand *Src = convertOperand(Inst, 0); |
Ice::Variable *Dest = mapValueToIceVar(Inst); |
- return Ice::InstLoad::create(Func, Dest, Src); |
+ return Ice::InstLoad::create(Func.get(), Dest, Src); |
} |
Ice::Inst *convertStoreInstruction(const StoreInst *Inst) { |
Ice::Operand *Addr = convertOperand(Inst, 1); |
Ice::Operand *Val = convertOperand(Inst, 0); |
- return Ice::InstStore::create(Func, Val, Addr); |
+ return Ice::InstStore::create(Func.get(), Val, Addr); |
} |
Ice::Inst *convertArithInstruction(const Instruction *Inst, |
@@ -319,13 +325,13 @@ private: |
Ice::Operand *Src0 = convertOperand(Inst, 0); |
Ice::Operand *Src1 = convertOperand(Inst, 1); |
Ice::Variable *Dest = mapValueToIceVar(BinOp); |
- return Ice::InstArithmetic::create(Func, Opcode, Dest, Src0, Src1); |
+ return Ice::InstArithmetic::create(Func.get(), Opcode, Dest, Src0, Src1); |
} |
Ice::Inst *convertPHINodeInstruction(const PHINode *Inst) { |
unsigned NumValues = Inst->getNumIncomingValues(); |
Ice::InstPhi *IcePhi = |
- Ice::InstPhi::create(Func, NumValues, mapValueToIceVar(Inst)); |
+ Ice::InstPhi::create(Func.get(), NumValues, mapValueToIceVar(Inst)); |
for (unsigned N = 0, E = NumValues; N != E; ++N) { |
IcePhi->addArgument(convertOperand(Inst, N), |
mapBasicBlockToNode(Inst->getIncomingBlock(N))); |
@@ -340,31 +346,31 @@ private: |
BasicBlock *BBElse = Inst->getSuccessor(1); |
Ice::CfgNode *NodeThen = mapBasicBlockToNode(BBThen); |
Ice::CfgNode *NodeElse = mapBasicBlockToNode(BBElse); |
- return Ice::InstBr::create(Func, Src, NodeThen, NodeElse); |
+ return Ice::InstBr::create(Func.get(), Src, NodeThen, NodeElse); |
} else { |
BasicBlock *BBSucc = Inst->getSuccessor(0); |
- return Ice::InstBr::create(Func, mapBasicBlockToNode(BBSucc)); |
+ return Ice::InstBr::create(Func.get(), mapBasicBlockToNode(BBSucc)); |
} |
} |
Ice::Inst *convertIntToPtrInstruction(const IntToPtrInst *Inst) { |
Ice::Operand *Src = convertOperand(Inst, 0); |
Ice::Variable *Dest = mapValueToIceVar(Inst, Ice::getPointerType()); |
- return Ice::InstAssign::create(Func, Dest, Src); |
+ return Ice::InstAssign::create(Func.get(), Dest, Src); |
} |
Ice::Inst *convertPtrToIntInstruction(const PtrToIntInst *Inst) { |
Ice::Operand *Src = convertOperand(Inst, 0); |
Ice::Variable *Dest = mapValueToIceVar(Inst); |
- return Ice::InstAssign::create(Func, Dest, Src); |
+ return Ice::InstAssign::create(Func.get(), Dest, Src); |
} |
Ice::Inst *convertRetInstruction(const ReturnInst *Inst) { |
Ice::Operand *RetOperand = convertOperand(Inst, 0); |
if (RetOperand) { |
- return Ice::InstRet::create(Func, RetOperand); |
+ return Ice::InstRet::create(Func.get(), RetOperand); |
} else { |
- return Ice::InstRet::create(Func); |
+ return Ice::InstRet::create(Func.get()); |
} |
} |
@@ -372,7 +378,7 @@ private: |
Ice::InstCast::OpKind CastKind) { |
Ice::Operand *Src = convertOperand(Inst, 0); |
Ice::Variable *Dest = mapValueToIceVar(Inst); |
- return Ice::InstCast::create(Func, CastKind, Dest, Src); |
+ return Ice::InstCast::create(Func.get(), CastKind, Dest, Src); |
} |
Ice::Inst *convertICmpInstruction(const ICmpInst *Inst) { |
@@ -416,7 +422,7 @@ private: |
break; |
} |
- return Ice::InstIcmp::create(Func, Cond, Dest, Src0, Src1); |
+ return Ice::InstIcmp::create(Func.get(), Cond, Dest, Src0, Src1); |
} |
Ice::Inst *convertFCmpInstruction(const FCmpInst *Inst) { |
@@ -480,14 +486,14 @@ private: |
break; |
} |
- return Ice::InstFcmp::create(Func, Cond, Dest, Src0, Src1); |
+ return Ice::InstFcmp::create(Func.get(), Cond, Dest, Src0, Src1); |
} |
Ice::Inst *convertExtractElementInstruction(const ExtractElementInst *Inst) { |
Ice::Variable *Dest = mapValueToIceVar(Inst); |
Ice::Operand *Source1 = convertValue(Inst->getOperand(0)); |
Ice::Operand *Source2 = convertValue(Inst->getOperand(1)); |
- return Ice::InstExtractElement::create(Func, Dest, Source1, Source2); |
+ return Ice::InstExtractElement::create(Func.get(), Dest, Source1, Source2); |
} |
Ice::Inst *convertInsertElementInstruction(const InsertElementInst *Inst) { |
@@ -495,7 +501,7 @@ private: |
Ice::Operand *Source1 = convertValue(Inst->getOperand(0)); |
Ice::Operand *Source2 = convertValue(Inst->getOperand(1)); |
Ice::Operand *Source3 = convertValue(Inst->getOperand(2)); |
- return Ice::InstInsertElement::create(Func, Dest, Source1, Source2, |
+ return Ice::InstInsertElement::create(Func.get(), Dest, Source1, Source2, |
Source3); |
} |
@@ -504,7 +510,7 @@ private: |
Ice::Operand *Cond = convertValue(Inst->getCondition()); |
Ice::Operand *Source1 = convertValue(Inst->getTrueValue()); |
Ice::Operand *Source2 = convertValue(Inst->getFalseValue()); |
- return Ice::InstSelect::create(Func, Dest, Cond, Source1, Source2); |
+ return Ice::InstSelect::create(Func.get(), Dest, Cond, Source1, Source2); |
} |
Ice::Inst *convertSwitchInstruction(const SwitchInst *Inst) { |
@@ -512,7 +518,7 @@ private: |
Ice::CfgNode *LabelDefault = mapBasicBlockToNode(Inst->getDefaultDest()); |
unsigned NumCases = Inst->getNumCases(); |
Ice::InstSwitch *Switch = |
- Ice::InstSwitch::create(Func, NumCases, Source, LabelDefault); |
+ Ice::InstSwitch::create(Func.get(), NumCases, Source, LabelDefault); |
unsigned CurrentCase = 0; |
for (SwitchInst::ConstCaseIt I = Inst->case_begin(), E = Inst->case_end(); |
I != E; ++I, ++CurrentCase) { |
@@ -544,14 +550,14 @@ private: |
report_fatal_error(std::string("Invalid PNaCl intrinsic call: ") + |
LLVMObjectAsString(Inst)); |
} |
- NewInst = Ice::InstIntrinsicCall::create(Func, NumArgs, Dest, |
+ NewInst = Ice::InstIntrinsicCall::create(Func.get(), NumArgs, Dest, |
CallTarget, Info->Info); |
} |
} |
// Not an intrinsic call. |
if (NewInst == nullptr) { |
- NewInst = Ice::InstCall::create(Func, NumArgs, Dest, CallTarget, |
+ NewInst = Ice::InstCall::create(Func.get(), NumArgs, Dest, CallTarget, |
Inst->isTailCall()); |
} |
for (unsigned i = 0; i < NumArgs; ++i) { |
@@ -569,11 +575,11 @@ private: |
uint32_t Align = Inst->getAlignment(); |
Ice::Variable *Dest = mapValueToIceVar(Inst, Ice::getPointerType()); |
- return Ice::InstAlloca::create(Func, ByteCount, Align, Dest); |
+ return Ice::InstAlloca::create(Func.get(), ByteCount, Align, Dest); |
} |
Ice::Inst *convertUnreachableInstruction(const UnreachableInst * /*Inst*/) { |
- return Ice::InstUnreachable::create(Func); |
+ return Ice::InstUnreachable::create(Func.get()); |
} |
Ice::CfgNode *convertBasicBlock(const BasicBlock *BB) { |
@@ -621,7 +627,7 @@ private: |
private: |
// Data |
- Ice::Cfg *Func; |
+ std::unique_ptr<Ice::Cfg> Func; |
std::map<const Value *, Ice::Variable *> VarMap; |
std::map<const BasicBlock *, Ice::CfgNode *> NodeMap; |
}; |
@@ -872,21 +878,21 @@ void Converter::convertGlobals(Module *Mod) { |
} |
void Converter::convertFunctions() { |
- TimerStackIdT StackID = GlobalContext::TSK_Funcs; |
+ const TimerStackIdT StackID = GlobalContext::TSK_Funcs; |
for (const Function &I : *Mod) { |
if (I.empty()) |
continue; |
TimerIdT TimerID = 0; |
- if (ALLOW_DUMP && Ctx->getFlags().TimeEachFunction) { |
+ const bool TimeThisFunction = |
+ ALLOW_DUMP && Ctx->getFlags().TimeEachFunction; |
+ if (TimeThisFunction) { |
TimerID = Ctx->getTimerID(StackID, I.getName()); |
Ctx->pushTimer(TimerID, StackID); |
} |
LLVM2ICEFunctionConverter FunctionConverter(*this); |
- |
- Cfg *Fcn = FunctionConverter.convertFunction(&I); |
- translateFcn(Fcn); |
- if (ALLOW_DUMP && Ctx->getFlags().TimeEachFunction) |
+ FunctionConverter.convertFunction(&I); |
+ if (TimeThisFunction) |
Ctx->popTimer(TimerID, StackID); |
} |
} |