1 //===- subzero/src/IceConverter.cpp - Converts LLVM to Ice ---------------===// 2 // 3 // The Subzero Code Generator 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 /// 10 /// \file 11 /// \brief Implements the LLVM to ICE converter. 12 /// 13 //===----------------------------------------------------------------------===// 14 15 #include "IceConverter.h" 16 17 #include "IceCfg.h" 18 #include "IceCfgNode.h" 19 #include "IceClFlags.h" 20 #include "IceDefs.h" 21 #include "IceGlobalContext.h" 22 #include "IceGlobalInits.h" 23 #include "IceInst.h" 24 #include "IceMangling.h" 25 #include "IceOperand.h" 26 #include "IceTargetLowering.h" 27 #include "IceTypes.h" 28 #include "IceTypeConverter.h" 29 30 #ifdef __clang__ 31 #pragma clang diagnostic push 32 #pragma clang diagnostic ignored "-Wunused-parameter" 33 #endif // __clang__ 34 35 #include "llvm/IR/Constant.h" 36 #include "llvm/IR/Constants.h" 37 #include "llvm/IR/DataLayout.h" 38 #include "llvm/IR/Instruction.h" 39 #include "llvm/IR/Instructions.h" 40 #include "llvm/IR/LLVMContext.h" 41 #include "llvm/IR/Module.h" 42 43 #ifdef __clang__ 44 #pragma clang diagnostic pop 45 #endif // __clang__ 46 47 // TODO(kschimpf): Remove two namespaces being visible at once. 48 using namespace llvm; 49 50 namespace { 51 52 // Debugging helper 53 template <typename T> static std::string LLVMObjectAsString(const T *O) { 54 std::string Dump; 55 raw_string_ostream Stream(Dump); 56 O->print(Stream); 57 return Stream.str(); 58 } 59 60 // Base class for converting LLVM to ICE. 61 // TODO(stichnot): Redesign Converter, LLVM2ICEConverter, 62 // LLVM2ICEFunctionConverter, and LLVM2ICEGlobalsConverter with respect to 63 // Translator. In particular, the unique_ptr ownership rules in 64 // LLVM2ICEFunctionConverter. 65 class LLVM2ICEConverter { 66 LLVM2ICEConverter() = delete; 67 LLVM2ICEConverter(const LLVM2ICEConverter &) = delete; 68 LLVM2ICEConverter &operator=(const LLVM2ICEConverter &) = delete; 69 70 public: 71 explicit LLVM2ICEConverter(Ice::Converter &Converter) 72 : Converter(Converter), Ctx(Converter.getContext()), 73 TypeConverter(Converter.getModule()->getContext()) {} 74 75 Ice::Converter &getConverter() const { return Converter; } 76 77 protected: 78 Ice::Converter &Converter; 79 Ice::GlobalContext *Ctx; 80 const Ice::TypeConverter TypeConverter; 81 }; 82 83 // Converter from LLVM functions to ICE. The entry point is the convertFunction 84 // method. 85 // 86 // Note: this currently assumes that the given IR was verified to be valid 87 // PNaCl bitcode. Otherwise, the behavior is undefined. 88 class LLVM2ICEFunctionConverter : LLVM2ICEConverter { 89 LLVM2ICEFunctionConverter() = delete; 90 LLVM2ICEFunctionConverter(const LLVM2ICEFunctionConverter &) = delete; 91 LLVM2ICEFunctionConverter & 92 operator=(const LLVM2ICEFunctionConverter &) = delete; 93 94 public: 95 explicit LLVM2ICEFunctionConverter(Ice::Converter &Converter) 96 : LLVM2ICEConverter(Converter), Func(nullptr) {} 97 98 void convertFunction(const Function *F) { 99 Func = Ice::Cfg::create(Ctx, Converter.getNextSequenceNumber()); 100 { 101 Ice::CfgLocalAllocatorScope _(Func.get()); 102 103 VarMap.clear(); 104 NodeMap.clear(); 105 Func->setFunctionName( 106 Ctx->getGlobalString(Ice::mangleName(F->getName()))); 107 Func->setReturnType(convertToIceType(F->getReturnType())); 108 Func->setInternal(F->hasInternalLinkage()); 109 Ice::TimerMarker T(Ice::TimerStack::TT_llvmConvert, Func.get()); 110 111 // The initial definition/use of each arg is the entry node. 112 for (auto ArgI = F->arg_begin(), ArgE = F->arg_end(); ArgI != ArgE; 113 ++ArgI) { 114 Func->addArg(mapValueToIceVar(&*ArgI)); 115 } 116 117 // Make an initial pass through the block list just to resolve the blocks 118 // in the original linearized order. Otherwise the ICE linearized order 119 // will be affected by branch targets in terminator instructions. 120 for (const BasicBlock &BBI : *F) 121 mapBasicBlockToNode(&BBI); 122 for (const BasicBlock &BBI : *F) 123 convertBasicBlock(&BBI); 124 Func->setEntryNode(mapBasicBlockToNode(&F->getEntryBlock())); 125 Func->computeInOutEdges(); 126 } 127 Converter.translateFcn(std::move(Func)); 128 } 129 130 // convertConstant() does not use Func or require it to be a valid Ice::Cfg 131 // pointer. As such, it's suitable for e.g. constructing global initializers. 132 Ice::Constant *convertConstant(const Constant *Const) { 133 if (const auto GV = dyn_cast<GlobalValue>(Const)) { 134 Ice::GlobalDeclaration *Decl = getConverter().getGlobalDeclaration(GV); 135 bool IsUndefined = false; 136 if (const auto *Func = llvm::dyn_cast<Ice::FunctionDeclaration>(Decl)) 137 IsUndefined = Func->isProto(); 138 else if (const auto *Var = llvm::dyn_cast<Ice::VariableDeclaration>(Decl)) 139 IsUndefined = !Var->hasInitializer(); 140 else 141 report_fatal_error("Unhandled GlobalDeclaration type"); 142 if (IsUndefined) 143 return Ctx->getConstantExternSym(Decl->getName()); 144 else { 145 const Ice::RelocOffsetT Offset = 0; 146 return Ctx->getConstantSym( 147 Offset, Ctx->getGlobalString(Decl->getName().toString())); 148 } 149 } else if (const auto CI = dyn_cast<ConstantInt>(Const)) { 150 Ice::Type Ty = convertToIceType(CI->getType()); 151 return Ctx->getConstantInt(Ty, CI->getSExtValue()); 152 } else if (const auto CFP = dyn_cast<ConstantFP>(Const)) { 153 Ice::Type Type = convertToIceType(CFP->getType()); 154 if (Type == Ice::IceType_f32) 155 return Ctx->getConstantFloat(CFP->getValueAPF().convertToFloat()); 156 else if (Type == Ice::IceType_f64) 157 return Ctx->getConstantDouble(CFP->getValueAPF().convertToDouble()); 158 llvm_unreachable("Unexpected floating point type"); 159 return nullptr; 160 } else if (const auto CU = dyn_cast<UndefValue>(Const)) { 161 return Ctx->getConstantUndef(convertToIceType(CU->getType())); 162 } else { 163 llvm_unreachable("Unhandled constant type"); 164 return nullptr; 165 } 166 } 167 168 private: 169 // LLVM values (instructions, etc.) are mapped directly to ICE variables. 170 // mapValueToIceVar has a version that forces an ICE type on the variable, 171 // and a version that just uses convertToIceType on V. 172 Ice::Variable *mapValueToIceVar(const Value *V, Ice::Type IceTy) { 173 if (IceTy == Ice::IceType_void) 174 return nullptr; 175 if (VarMap.find(V) == VarMap.end()) { 176 VarMap[V] = Func->makeVariable(IceTy); 177 if (Ice::BuildDefs::dump()) 178 VarMap[V]->setName(Func.get(), V->getName()); 179 } 180 return VarMap[V]; 181 } 182 183 Ice::Variable *mapValueToIceVar(const Value *V) { 184 return mapValueToIceVar(V, convertToIceType(V->getType())); 185 } 186 187 Ice::CfgNode *mapBasicBlockToNode(const BasicBlock *BB) { 188 if (NodeMap.find(BB) == NodeMap.end()) { 189 NodeMap[BB] = Func->makeNode(); 190 if (Ice::BuildDefs::dump()) 191 NodeMap[BB]->setName(BB->getName()); 192 } 193 return NodeMap[BB]; 194 } 195 196 Ice::Type convertToIceType(Type *LLVMTy) const { 197 Ice::Type IceTy = TypeConverter.convertToIceType(LLVMTy); 198 if (IceTy == Ice::IceType_NUM) 199 report_fatal_error(std::string("Invalid PNaCl type ") + 200 LLVMObjectAsString(LLVMTy)); 201 return IceTy; 202 } 203 204 // Given an LLVM instruction and an operand number, produce the Ice::Operand 205 // this refers to. If there's no such operand, return nullptr. 206 Ice::Operand *convertOperand(const Instruction *Instr, unsigned OpNum) { 207 if (OpNum >= Instr->getNumOperands()) { 208 return nullptr; 209 } 210 const Value *Op = Instr->getOperand(OpNum); 211 return convertValue(Op); 212 } 213 214 Ice::Operand *convertValue(const Value *Op) { 215 if (const auto Const = dyn_cast<Constant>(Op)) { 216 return convertConstant(Const); 217 } else { 218 return mapValueToIceVar(Op); 219 } 220 } 221 222 // Note: this currently assumes a 1x1 mapping between LLVM IR and Ice 223 // instructions. 224 Ice::Inst *convertInstruction(const Instruction *Instr) { 225 switch (Instr->getOpcode()) { 226 case Instruction::PHI: 227 return convertPHINodeInstruction(cast<PHINode>(Instr)); 228 case Instruction::Br: 229 return convertBrInstruction(cast<BranchInst>(Instr)); 230 case Instruction::Ret: 231 return convertRetInstruction(cast<ReturnInst>(Instr)); 232 case Instruction::IntToPtr: 233 return convertIntToPtrInstruction(cast<IntToPtrInst>(Instr)); 234 case Instruction::PtrToInt: 235 return convertPtrToIntInstruction(cast<PtrToIntInst>(Instr)); 236 case Instruction::ICmp: 237 return convertICmpInstruction(cast<ICmpInst>(Instr)); 238 case Instruction::FCmp: 239 return convertFCmpInstruction(cast<FCmpInst>(Instr)); 240 case Instruction::Select: 241 return convertSelectInstruction(cast<SelectInst>(Instr)); 242 case Instruction::Switch: 243 return convertSwitchInstruction(cast<SwitchInst>(Instr)); 244 case Instruction::Load: 245 return convertLoadInstruction(cast<LoadInst>(Instr)); 246 case Instruction::Store: 247 return convertStoreInstruction(cast<StoreInst>(Instr)); 248 case Instruction::ZExt: 249 return convertCastInstruction(cast<ZExtInst>(Instr), Ice::InstCast::Zext); 250 case Instruction::SExt: 251 return convertCastInstruction(cast<SExtInst>(Instr), Ice::InstCast::Sext); 252 case Instruction::Trunc: 253 return convertCastInstruction(cast<TruncInst>(Instr), 254 Ice::InstCast::Trunc); 255 case Instruction::FPTrunc: 256 return convertCastInstruction(cast<FPTruncInst>(Instr), 257 Ice::InstCast::Fptrunc); 258 case Instruction::FPExt: 259 return convertCastInstruction(cast<FPExtInst>(Instr), 260 Ice::InstCast::Fpext); 261 case Instruction::FPToSI: 262 return convertCastInstruction(cast<FPToSIInst>(Instr), 263 Ice::InstCast::Fptosi); 264 case Instruction::FPToUI: 265 return convertCastInstruction(cast<FPToUIInst>(Instr), 266 Ice::InstCast::Fptoui); 267 case Instruction::SIToFP: 268 return convertCastInstruction(cast<SIToFPInst>(Instr), 269 Ice::InstCast::Sitofp); 270 case Instruction::UIToFP: 271 return convertCastInstruction(cast<UIToFPInst>(Instr), 272 Ice::InstCast::Uitofp); 273 case Instruction::BitCast: 274 return convertCastInstruction(cast<BitCastInst>(Instr), 275 Ice::InstCast::Bitcast); 276 case Instruction::Add: 277 return convertArithInstruction(Instr, Ice::InstArithmetic::Add); 278 case Instruction::Sub: 279 return convertArithInstruction(Instr, Ice::InstArithmetic::Sub); 280 case Instruction::Mul: 281 return convertArithInstruction(Instr, Ice::InstArithmetic::Mul); 282 case Instruction::UDiv: 283 return convertArithInstruction(Instr, Ice::InstArithmetic::Udiv); 284 case Instruction::SDiv: 285 return convertArithInstruction(Instr, Ice::InstArithmetic::Sdiv); 286 case Instruction::URem: 287 return convertArithInstruction(Instr, Ice::InstArithmetic::Urem); 288 case Instruction::SRem: 289 return convertArithInstruction(Instr, Ice::InstArithmetic::Srem); 290 case Instruction::Shl: 291 return convertArithInstruction(Instr, Ice::InstArithmetic::Shl); 292 case Instruction::LShr: 293 return convertArithInstruction(Instr, Ice::InstArithmetic::Lshr); 294 case Instruction::AShr: 295 return convertArithInstruction(Instr, Ice::InstArithmetic::Ashr); 296 case Instruction::FAdd: 297 return convertArithInstruction(Instr, Ice::InstArithmetic::Fadd); 298 case Instruction::FSub: 299 return convertArithInstruction(Instr, Ice::InstArithmetic::Fsub); 300 case Instruction::FMul: 301 return convertArithInstruction(Instr, Ice::InstArithmetic::Fmul); 302 case Instruction::FDiv: 303 return convertArithInstruction(Instr, Ice::InstArithmetic::Fdiv); 304 case Instruction::FRem: 305 return convertArithInstruction(Instr, Ice::InstArithmetic::Frem); 306 case Instruction::And: 307 return convertArithInstruction(Instr, Ice::InstArithmetic::And); 308 case Instruction::Or: 309 return convertArithInstruction(Instr, Ice::InstArithmetic::Or); 310 case Instruction::Xor: 311 return convertArithInstruction(Instr, Ice::InstArithmetic::Xor); 312 case Instruction::ExtractElement: 313 return convertExtractElementInstruction(cast<ExtractElementInst>(Instr)); 314 case Instruction::InsertElement: 315 return convertInsertElementInstruction(cast<InsertElementInst>(Instr)); 316 case Instruction::Call: 317 return convertCallInstruction(cast<CallInst>(Instr)); 318 case Instruction::Alloca: 319 return convertAllocaInstruction(cast<AllocaInst>(Instr)); 320 case Instruction::Unreachable: 321 return convertUnreachableInstruction(cast<UnreachableInst>(Instr)); 322 default: 323 report_fatal_error(std::string("Invalid PNaCl instruction: ") + 324 LLVMObjectAsString(Instr)); 325 } 326 327 llvm_unreachable("convertInstruction"); 328 return nullptr; 329 } 330 331 Ice::Inst *convertLoadInstruction(const LoadInst *Instr) { 332 Ice::Operand *Src = convertOperand(Instr, 0); 333 Ice::Variable *Dest = mapValueToIceVar(Instr); 334 return Ice::InstLoad::create(Func.get(), Dest, Src); 335 } 336 337 Ice::Inst *convertStoreInstruction(const StoreInst *Instr) { 338 Ice::Operand *Addr = convertOperand(Instr, 1); 339 Ice::Operand *Val = convertOperand(Instr, 0); 340 return Ice::InstStore::create(Func.get(), Val, Addr); 341 } 342 343 Ice::Inst *convertArithInstruction(const Instruction *Instr, 344 Ice::InstArithmetic::OpKind Opcode) { 345 const auto BinOp = cast<BinaryOperator>(Instr); 346 Ice::Operand *Src0 = convertOperand(Instr, 0); 347 Ice::Operand *Src1 = convertOperand(Instr, 1); 348 Ice::Variable *Dest = mapValueToIceVar(BinOp); 349 return Ice::InstArithmetic::create(Func.get(), Opcode, Dest, Src0, Src1); 350 } 351 352 Ice::Inst *convertPHINodeInstruction(const PHINode *Instr) { 353 unsigned NumValues = Instr->getNumIncomingValues(); 354 Ice::InstPhi *IcePhi = 355 Ice::InstPhi::create(Func.get(), NumValues, mapValueToIceVar(Instr)); 356 for (unsigned N = 0, E = NumValues; N != E; ++N) { 357 IcePhi->addArgument(convertOperand(Instr, N), 358 mapBasicBlockToNode(Instr->getIncomingBlock(N))); 359 } 360 return IcePhi; 361 } 362 363 Ice::Inst *convertBrInstruction(const BranchInst *Instr) { 364 if (Instr->isConditional()) { 365 Ice::Operand *Src = convertOperand(Instr, 0); 366 BasicBlock *BBThen = Instr->getSuccessor(0); 367 BasicBlock *BBElse = Instr->getSuccessor(1); 368 Ice::CfgNode *NodeThen = mapBasicBlockToNode(BBThen); 369 Ice::CfgNode *NodeElse = mapBasicBlockToNode(BBElse); 370 return Ice::InstBr::create(Func.get(), Src, NodeThen, NodeElse); 371 } else { 372 BasicBlock *BBSucc = Instr->getSuccessor(0); 373 return Ice::InstBr::create(Func.get(), mapBasicBlockToNode(BBSucc)); 374 } 375 } 376 377 Ice::Inst *convertIntToPtrInstruction(const IntToPtrInst *Instr) { 378 Ice::Operand *Src = convertOperand(Instr, 0); 379 Ice::Variable *Dest = mapValueToIceVar(Instr, Ice::getPointerType()); 380 return Ice::InstAssign::create(Func.get(), Dest, Src); 381 } 382 383 Ice::Inst *convertPtrToIntInstruction(const PtrToIntInst *Instr) { 384 Ice::Operand *Src = convertOperand(Instr, 0); 385 Ice::Variable *Dest = mapValueToIceVar(Instr); 386 return Ice::InstAssign::create(Func.get(), Dest, Src); 387 } 388 389 Ice::Inst *convertRetInstruction(const ReturnInst *Instr) { 390 Ice::Operand *RetOperand = convertOperand(Instr, 0); 391 if (RetOperand) { 392 return Ice::InstRet::create(Func.get(), RetOperand); 393 } else { 394 return Ice::InstRet::create(Func.get()); 395 } 396 } 397 398 Ice::Inst *convertCastInstruction(const Instruction *Instr, 399 Ice::InstCast::OpKind CastKind) { 400 Ice::Operand *Src = convertOperand(Instr, 0); 401 Ice::Variable *Dest = mapValueToIceVar(Instr); 402 return Ice::InstCast::create(Func.get(), CastKind, Dest, Src); 403 } 404 405 Ice::Inst *convertICmpInstruction(const ICmpInst *Instr) { 406 Ice::Operand *Src0 = convertOperand(Instr, 0); 407 Ice::Operand *Src1 = convertOperand(Instr, 1); 408 Ice::Variable *Dest = mapValueToIceVar(Instr); 409 410 Ice::InstIcmp::ICond Cond; 411 switch (Instr->getPredicate()) { 412 default: 413 llvm_unreachable("ICmpInst predicate"); 414 case CmpInst::ICMP_EQ: 415 Cond = Ice::InstIcmp::Eq; 416 break; 417 case CmpInst::ICMP_NE: 418 Cond = Ice::InstIcmp::Ne; 419 break; 420 case CmpInst::ICMP_UGT: 421 Cond = Ice::InstIcmp::Ugt; 422 break; 423 case CmpInst::ICMP_UGE: 424 Cond = Ice::InstIcmp::Uge; 425 break; 426 case CmpInst::ICMP_ULT: 427 Cond = Ice::InstIcmp::Ult; 428 break; 429 case CmpInst::ICMP_ULE: 430 Cond = Ice::InstIcmp::Ule; 431 break; 432 case CmpInst::ICMP_SGT: 433 Cond = Ice::InstIcmp::Sgt; 434 break; 435 case CmpInst::ICMP_SGE: 436 Cond = Ice::InstIcmp::Sge; 437 break; 438 case CmpInst::ICMP_SLT: 439 Cond = Ice::InstIcmp::Slt; 440 break; 441 case CmpInst::ICMP_SLE: 442 Cond = Ice::InstIcmp::Sle; 443 break; 444 } 445 446 return Ice::InstIcmp::create(Func.get(), Cond, Dest, Src0, Src1); 447 } 448 449 Ice::Inst *convertFCmpInstruction(const FCmpInst *Instr) { 450 Ice::Operand *Src0 = convertOperand(Instr, 0); 451 Ice::Operand *Src1 = convertOperand(Instr, 1); 452 Ice::Variable *Dest = mapValueToIceVar(Instr); 453 454 Ice::InstFcmp::FCond Cond; 455 switch (Instr->getPredicate()) { 456 457 default: 458 llvm_unreachable("FCmpInst predicate"); 459 460 case CmpInst::FCMP_FALSE: 461 Cond = Ice::InstFcmp::False; 462 break; 463 case CmpInst::FCMP_OEQ: 464 Cond = Ice::InstFcmp::Oeq; 465 break; 466 case CmpInst::FCMP_OGT: 467 Cond = Ice::InstFcmp::Ogt; 468 break; 469 case CmpInst::FCMP_OGE: 470 Cond = Ice::InstFcmp::Oge; 471 break; 472 case CmpInst::FCMP_OLT: 473 Cond = Ice::InstFcmp::Olt; 474 break; 475 case CmpInst::FCMP_OLE: 476 Cond = Ice::InstFcmp::Ole; 477 break; 478 case CmpInst::FCMP_ONE: 479 Cond = Ice::InstFcmp::One; 480 break; 481 case CmpInst::FCMP_ORD: 482 Cond = Ice::InstFcmp::Ord; 483 break; 484 case CmpInst::FCMP_UEQ: 485 Cond = Ice::InstFcmp::Ueq; 486 break; 487 case CmpInst::FCMP_UGT: 488 Cond = Ice::InstFcmp::Ugt; 489 break; 490 case CmpInst::FCMP_UGE: 491 Cond = Ice::InstFcmp::Uge; 492 break; 493 case CmpInst::FCMP_ULT: 494 Cond = Ice::InstFcmp::Ult; 495 break; 496 case CmpInst::FCMP_ULE: 497 Cond = Ice::InstFcmp::Ule; 498 break; 499 case CmpInst::FCMP_UNE: 500 Cond = Ice::InstFcmp::Une; 501 break; 502 case CmpInst::FCMP_UNO: 503 Cond = Ice::InstFcmp::Uno; 504 break; 505 case CmpInst::FCMP_TRUE: 506 Cond = Ice::InstFcmp::True; 507 break; 508 } 509 510 return Ice::InstFcmp::create(Func.get(), Cond, Dest, Src0, Src1); 511 } 512 513 Ice::Inst *convertExtractElementInstruction(const ExtractElementInst *Instr) { 514 Ice::Variable *Dest = mapValueToIceVar(Instr); 515 Ice::Operand *Source1 = convertValue(Instr->getOperand(0)); 516 Ice::Operand *Source2 = convertValue(Instr->getOperand(1)); 517 return Ice::InstExtractElement::create(Func.get(), Dest, Source1, Source2); 518 } 519 520 Ice::Inst *convertInsertElementInstruction(const InsertElementInst *Instr) { 521 Ice::Variable *Dest = mapValueToIceVar(Instr); 522 Ice::Operand *Source1 = convertValue(Instr->getOperand(0)); 523 Ice::Operand *Source2 = convertValue(Instr->getOperand(1)); 524 Ice::Operand *Source3 = convertValue(Instr->getOperand(2)); 525 return Ice::InstInsertElement::create(Func.get(), Dest, Source1, Source2, 526 Source3); 527 } 528 529 Ice::Inst *convertSelectInstruction(const SelectInst *Instr) { 530 Ice::Variable *Dest = mapValueToIceVar(Instr); 531 Ice::Operand *Cond = convertValue(Instr->getCondition()); 532 Ice::Operand *Source1 = convertValue(Instr->getTrueValue()); 533 Ice::Operand *Source2 = convertValue(Instr->getFalseValue()); 534 return Ice::InstSelect::create(Func.get(), Dest, Cond, Source1, Source2); 535 } 536 537 Ice::Inst *convertSwitchInstruction(const SwitchInst *Instr) { 538 Ice::Operand *Source = convertValue(Instr->getCondition()); 539 Ice::CfgNode *LabelDefault = mapBasicBlockToNode(Instr->getDefaultDest()); 540 unsigned NumCases = Instr->getNumCases(); 541 Ice::InstSwitch *Switch = 542 Ice::InstSwitch::create(Func.get(), NumCases, Source, LabelDefault); 543 unsigned CurrentCase = 0; 544 for (SwitchInst::ConstCaseIt I = Instr->case_begin(), E = Instr->case_end(); 545 I != E; ++I, ++CurrentCase) { 546 uint64_t CaseValue = I.getCaseValue()->getSExtValue(); 547 Ice::CfgNode *CaseSuccessor = mapBasicBlockToNode(I.getCaseSuccessor()); 548 Switch->addBranch(CurrentCase, CaseValue, CaseSuccessor); 549 } 550 return Switch; 551 } 552 553 Ice::Inst *convertCallInstruction(const CallInst *Instr) { 554 Ice::Variable *Dest = mapValueToIceVar(Instr); 555 Ice::Operand *CallTarget = convertValue(Instr->getCalledValue()); 556 unsigned NumArgs = Instr->getNumArgOperands(); 557 // Note: Subzero doesn't (yet) do anything special with the Tail flag in 558 // the bitcode, i.e. CallInst::isTailCall(). 559 Ice::InstCall *NewInst = nullptr; 560 const Ice::Intrinsics::FullIntrinsicInfo *Info = nullptr; 561 562 if (const auto Target = dyn_cast<Ice::ConstantRelocatable>(CallTarget)) { 563 // Check if this direct call is to an Intrinsic (starts with "llvm.") 564 bool BadIntrinsic; 565 Info = Ctx->getIntrinsicsInfo().find(Target->getName(), BadIntrinsic); 566 if (BadIntrinsic) { 567 report_fatal_error(std::string("Invalid PNaCl intrinsic call: ") + 568 LLVMObjectAsString(Instr)); 569 } 570 if (Info) 571 NewInst = Ice::InstIntrinsicCall::create(Func.get(), NumArgs, Dest, 572 CallTarget, Info->Info); 573 } 574 575 // Not an intrinsic call. 576 if (NewInst == nullptr) { 577 NewInst = Ice::InstCall::create(Func.get(), NumArgs, Dest, CallTarget, 578 Instr->isTailCall()); 579 } 580 for (unsigned i = 0; i < NumArgs; ++i) { 581 NewInst->addArg(convertOperand(Instr, i)); 582 } 583 if (Info) { 584 validateIntrinsicCall(NewInst, Info); 585 } 586 return NewInst; 587 } 588 589 Ice::Inst *convertAllocaInstruction(const AllocaInst *Instr) { 590 // PNaCl bitcode only contains allocas of byte-granular objects. 591 Ice::Operand *ByteCount = convertValue(Instr->getArraySize()); 592 uint32_t Align = Instr->getAlignment(); 593 Ice::Variable *Dest = mapValueToIceVar(Instr, Ice::getPointerType()); 594 595 return Ice::InstAlloca::create(Func.get(), Dest, ByteCount, Align); 596 } 597 598 Ice::Inst *convertUnreachableInstruction(const UnreachableInst * /*Instr*/) { 599 return Ice::InstUnreachable::create(Func.get()); 600 } 601 602 Ice::CfgNode *convertBasicBlock(const BasicBlock *BB) { 603 Ice::CfgNode *Node = mapBasicBlockToNode(BB); 604 for (const Instruction &II : *BB) { 605 Ice::Inst *Instr = convertInstruction(&II); 606 Node->appendInst(Instr); 607 } 608 return Node; 609 } 610 611 void validateIntrinsicCall(const Ice::InstCall *Call, 612 const Ice::Intrinsics::FullIntrinsicInfo *I) { 613 Ice::SizeT ArgIndex = 0; 614 switch (I->validateCall(Call, ArgIndex)) { 615 case Ice::Intrinsics::IsValidCall: 616 break; 617 case Ice::Intrinsics::BadReturnType: { 618 std::string Buffer; 619 raw_string_ostream StrBuf(Buffer); 620 StrBuf << "Intrinsic call expects return type " << I->getReturnType() 621 << ". Found: " << Call->getReturnType(); 622 report_fatal_error(StrBuf.str()); 623 break; 624 } 625 case Ice::Intrinsics::WrongNumOfArgs: { 626 std::string Buffer; 627 raw_string_ostream StrBuf(Buffer); 628 StrBuf << "Intrinsic call expects " << I->getNumArgs() 629 << ". Found: " << Call->getNumArgs(); 630 report_fatal_error(StrBuf.str()); 631 break; 632 } 633 case Ice::Intrinsics::WrongCallArgType: { 634 std::string Buffer; 635 raw_string_ostream StrBuf(Buffer); 636 StrBuf << "Intrinsic call argument " << ArgIndex << " expects type " 637 << I->getArgType(ArgIndex) 638 << ". Found: " << Call->getArg(ArgIndex)->getType(); 639 report_fatal_error(StrBuf.str()); 640 break; 641 } 642 } 643 } 644 645 private: 646 // Data 647 std::unique_ptr<Ice::Cfg> Func; 648 std::map<const Value *, Ice::Variable *> VarMap; 649 std::map<const BasicBlock *, Ice::CfgNode *> NodeMap; 650 }; 651 652 // Converter from LLVM global variables to ICE. The entry point is the 653 // convertGlobalsToIce method. 654 // 655 // Note: this currently assumes that the given IR was verified to be valid 656 // PNaCl bitcode. Otherwise, the behavior is undefined. 657 class LLVM2ICEGlobalsConverter : public LLVM2ICEConverter { 658 LLVM2ICEGlobalsConverter() = delete; 659 LLVM2ICEGlobalsConverter(const LLVM2ICEGlobalsConverter &) = delete; 660 LLVM2ICEGlobalsConverter & 661 operator=(const LLVM2ICEGlobalsConverter &) = delete; 662 663 public: 664 explicit LLVM2ICEGlobalsConverter(Ice::Converter &Converter, 665 Ice::VariableDeclarationList *G) 666 : LLVM2ICEConverter(Converter), GlobalPool(G) {} 667 668 /// Converts global variables, and their initializers into ICE global variable 669 /// declarations, for module Mod. Returns the set of converted declarations. 670 void convertGlobalsToIce(Module *Mod); 671 672 private: 673 // Adds the Initializer to the list of initializers for the Global variable 674 // declaration. 675 void addGlobalInitializer(Ice::VariableDeclaration &Global, 676 const Constant *Initializer) { 677 constexpr bool HasOffset = false; 678 constexpr Ice::RelocOffsetT Offset = 0; 679 addGlobalInitializer(Global, Initializer, HasOffset, Offset); 680 } 681 682 // Adds Initializer to the list of initializers for Global variable 683 // declaration. HasOffset is true only if Initializer is a relocation 684 // initializer and Offset should be added to the relocation. 685 void addGlobalInitializer(Ice::VariableDeclaration &Global, 686 const Constant *Initializer, bool HasOffset, 687 Ice::RelocOffsetT Offset); 688 689 // Converts the given constant C to the corresponding integer literal it 690 // contains. 691 Ice::RelocOffsetT getIntegerLiteralConstant(const Value *C) { 692 const auto CI = dyn_cast<ConstantInt>(C); 693 if (CI && CI->getType()->isIntegerTy(32)) 694 return CI->getSExtValue(); 695 696 std::string Buffer; 697 raw_string_ostream StrBuf(Buffer); 698 StrBuf << "Constant not i32 literal: " << *C; 699 report_fatal_error(StrBuf.str()); 700 return 0; 701 } 702 703 Ice::VariableDeclarationList *GlobalPool; 704 }; 705 706 void LLVM2ICEGlobalsConverter::convertGlobalsToIce(Module *Mod) { 707 for (Module::const_global_iterator I = Mod->global_begin(), 708 E = Mod->global_end(); 709 I != E; ++I) { 710 711 const GlobalVariable *GV = &*I; 712 713 Ice::GlobalDeclaration *Var = getConverter().getGlobalDeclaration(GV); 714 auto *VarDecl = cast<Ice::VariableDeclaration>(Var); 715 GlobalPool->push_back(VarDecl); 716 717 if (!GV->hasInternalLinkage() && GV->hasInitializer()) { 718 std::string Buffer; 719 raw_string_ostream StrBuf(Buffer); 720 StrBuf << "Can't define external global declaration: " << GV->getName(); 721 report_fatal_error(StrBuf.str()); 722 } 723 724 if (!GV->hasInitializer()) { 725 if (Ice::getFlags().getAllowUninitializedGlobals()) 726 continue; 727 else { 728 std::string Buffer; 729 raw_string_ostream StrBuf(Buffer); 730 StrBuf << "Global declaration missing initializer: " << GV->getName(); 731 report_fatal_error(StrBuf.str()); 732 } 733 } 734 735 const Constant *Initializer = GV->getInitializer(); 736 if (const auto CompoundInit = dyn_cast<ConstantStruct>(Initializer)) { 737 for (ConstantStruct::const_op_iterator I = CompoundInit->op_begin(), 738 E = CompoundInit->op_end(); 739 I != E; ++I) { 740 if (const auto Init = dyn_cast<Constant>(I)) { 741 addGlobalInitializer(*VarDecl, Init); 742 } 743 } 744 } else { 745 addGlobalInitializer(*VarDecl, Initializer); 746 } 747 } 748 } 749 750 void LLVM2ICEGlobalsConverter::addGlobalInitializer( 751 Ice::VariableDeclaration &Global, const Constant *Initializer, 752 bool HasOffset, Ice::RelocOffsetT Offset) { 753 (void)HasOffset; 754 assert(HasOffset || Offset == 0); 755 756 if (const auto CDA = dyn_cast<ConstantDataArray>(Initializer)) { 757 assert(!HasOffset && isa<IntegerType>(CDA->getElementType()) && 758 (cast<IntegerType>(CDA->getElementType())->getBitWidth() == 8)); 759 Global.addInitializer(Ice::VariableDeclaration::DataInitializer::create( 760 GlobalPool, CDA->getRawDataValues().data(), CDA->getNumElements())); 761 return; 762 } 763 764 if (isa<ConstantAggregateZero>(Initializer)) { 765 if (const auto AT = dyn_cast<ArrayType>(Initializer->getType())) { 766 assert(!HasOffset && isa<IntegerType>(AT->getElementType()) && 767 (cast<IntegerType>(AT->getElementType())->getBitWidth() == 8)); 768 Global.addInitializer(Ice::VariableDeclaration::ZeroInitializer::create( 769 GlobalPool, AT->getNumElements())); 770 } else { 771 llvm_unreachable("Unhandled constant aggregate zero type"); 772 } 773 return; 774 } 775 776 if (const auto Exp = dyn_cast<ConstantExpr>(Initializer)) { 777 switch (Exp->getOpcode()) { 778 case Instruction::Add: 779 assert(!HasOffset); 780 addGlobalInitializer(Global, Exp->getOperand(0), true, 781 getIntegerLiteralConstant(Exp->getOperand(1))); 782 return; 783 case Instruction::PtrToInt: { 784 assert(TypeConverter.convertToIceType(Exp->getType()) == 785 Ice::getPointerType()); 786 const auto GV = dyn_cast<GlobalValue>(Exp->getOperand(0)); 787 assert(GV); 788 const Ice::GlobalDeclaration *Addr = 789 getConverter().getGlobalDeclaration(GV); 790 Global.addInitializer(Ice::VariableDeclaration::RelocInitializer::create( 791 GlobalPool, Addr, {Ice::RelocOffset::create(Ctx, Offset)})); 792 return; 793 } 794 default: 795 break; 796 } 797 } 798 799 std::string Buffer; 800 raw_string_ostream StrBuf(Buffer); 801 StrBuf << "Unhandled global initializer: " << Initializer; 802 report_fatal_error(StrBuf.str()); 803 } 804 805 } // end of anonymous namespace 806 807 namespace Ice { 808 809 void Converter::nameUnnamedGlobalVariables(Module *Mod) { 810 const std::string GlobalPrefix = getFlags().getDefaultGlobalPrefix(); 811 if (GlobalPrefix.empty()) 812 return; 813 uint32_t NameIndex = 0; 814 for (auto V = Mod->global_begin(), E = Mod->global_end(); V != E; ++V) { 815 if (!V->hasName()) { 816 V->setName(createUnnamedName(GlobalPrefix, NameIndex)); 817 ++NameIndex; 818 } else { 819 checkIfUnnamedNameSafe(V->getName(), "global", GlobalPrefix); 820 } 821 } 822 } 823 824 void Converter::nameUnnamedFunctions(Module *Mod) { 825 const std::string FunctionPrefix = getFlags().getDefaultFunctionPrefix(); 826 if (FunctionPrefix.empty()) 827 return; 828 uint32_t NameIndex = 0; 829 for (Function &F : *Mod) { 830 if (!F.hasName()) { 831 F.setName(createUnnamedName(FunctionPrefix, NameIndex)); 832 ++NameIndex; 833 } else { 834 checkIfUnnamedNameSafe(F.getName(), "function", FunctionPrefix); 835 } 836 } 837 } 838 839 void Converter::convertToIce() { 840 TimerMarker T(TimerStack::TT_convertToIce, Ctx); 841 nameUnnamedGlobalVariables(Mod); 842 nameUnnamedFunctions(Mod); 843 installGlobalDeclarations(Mod); 844 convertGlobals(Mod); 845 convertFunctions(); 846 } 847 848 GlobalDeclaration *Converter::getGlobalDeclaration(const GlobalValue *V) { 849 GlobalDeclarationMapType::const_iterator Pos = GlobalDeclarationMap.find(V); 850 if (Pos == GlobalDeclarationMap.end()) { 851 std::string Buffer; 852 raw_string_ostream StrBuf(Buffer); 853 StrBuf << "Can't find global declaration for: " << V->getName(); 854 report_fatal_error(StrBuf.str()); 855 } 856 return Pos->second; 857 } 858 859 void Converter::installGlobalDeclarations(Module *Mod) { 860 const TypeConverter Converter(Mod->getContext()); 861 // Install function declarations. 862 for (const Function &Func : *Mod) { 863 FuncSigType Signature; 864 FunctionType *FuncType = Func.getFunctionType(); 865 Signature.setReturnType( 866 Converter.convertToIceType(FuncType->getReturnType())); 867 for (size_t I = 0; I < FuncType->getNumParams(); ++I) { 868 Signature.appendArgType( 869 Converter.convertToIceType(FuncType->getParamType(I))); 870 } 871 auto *IceFunc = FunctionDeclaration::create( 872 Ctx, Signature, Func.getCallingConv(), Func.getLinkage(), Func.empty()); 873 IceFunc->setName(Ctx, Func.getName()); 874 if (!IceFunc->verifyLinkageCorrect(Ctx)) { 875 std::string Buffer; 876 raw_string_ostream StrBuf(Buffer); 877 StrBuf << "Function " << IceFunc->getName() 878 << " has incorrect linkage: " << IceFunc->getLinkageName(); 879 if (IceFunc->isExternal()) 880 StrBuf << "\n Use flag -allow-externally-defined-symbols to override"; 881 report_fatal_error(StrBuf.str()); 882 } 883 if (!IceFunc->validateTypeSignature(Ctx)) 884 report_fatal_error(IceFunc->getTypeSignatureError(Ctx)); 885 GlobalDeclarationMap[&Func] = IceFunc; 886 } 887 // Install global variable declarations. 888 for (Module::const_global_iterator I = Mod->global_begin(), 889 E = Mod->global_end(); 890 I != E; ++I) { 891 const GlobalVariable *GV = &*I; 892 constexpr bool NoSuppressMangling = false; 893 auto *Var = VariableDeclaration::create( 894 GlobalDeclarationsPool.get(), NoSuppressMangling, GV->getLinkage()); 895 Var->setAlignment(GV->getAlignment()); 896 Var->setIsConstant(GV->isConstant()); 897 Var->setName(Ctx, GV->getName()); 898 if (!Var->verifyLinkageCorrect()) { 899 std::string Buffer; 900 raw_string_ostream StrBuf(Buffer); 901 StrBuf << "Global " << Var->getName() 902 << " has incorrect linkage: " << Var->getLinkageName(); 903 if (Var->isExternal()) 904 StrBuf << "\n Use flag -allow-externally-defined-symbols to override"; 905 report_fatal_error(StrBuf.str()); 906 } 907 GlobalDeclarationMap[GV] = Var; 908 } 909 } 910 911 void Converter::convertGlobals(Module *Mod) { 912 LLVM2ICEGlobalsConverter(*this, GlobalDeclarationsPool.get()) 913 .convertGlobalsToIce(Mod); 914 lowerGlobals(std::move(GlobalDeclarationsPool)); 915 } 916 917 void Converter::convertFunctions() { 918 for (const Function &I : *Mod) { 919 if (I.empty()) 920 continue; 921 TimerMarker _(Ctx, I.getName()); 922 LLVM2ICEFunctionConverter FunctionConverter(*this); 923 FunctionConverter.convertFunction(&I); 924 } 925 } 926 927 } // end of namespace Ice 928