1 //===- ConvertFromLLVMIR.cpp - MLIR to LLVM IR conversion -----------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file implements a translation between LLVM IR and the MLIR LLVM dialect. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "mlir/Target/LLVMIR/Import.h" 14 15 #include "mlir/Dialect/DLTI/DLTI.h" 16 #include "mlir/Dialect/LLVMIR/LLVMDialect.h" 17 #include "mlir/IR/Builders.h" 18 #include "mlir/IR/BuiltinOps.h" 19 #include "mlir/IR/BuiltinTypes.h" 20 #include "mlir/IR/MLIRContext.h" 21 #include "mlir/Interfaces/DataLayoutInterfaces.h" 22 #include "mlir/Target/LLVMIR/TypeFromLLVM.h" 23 #include "mlir/Tools/mlir-translate/Translation.h" 24 25 #include "llvm/ADT/StringSet.h" 26 #include "llvm/ADT/TypeSwitch.h" 27 #include "llvm/IR/Attributes.h" 28 #include "llvm/IR/Constants.h" 29 #include "llvm/IR/DerivedTypes.h" 30 #include "llvm/IR/Function.h" 31 #include "llvm/IR/InlineAsm.h" 32 #include "llvm/IR/Instructions.h" 33 #include "llvm/IR/Type.h" 34 #include "llvm/IRReader/IRReader.h" 35 #include "llvm/Support/Error.h" 36 #include "llvm/Support/SourceMgr.h" 37 38 using namespace mlir; 39 using namespace mlir::LLVM; 40 41 #include "mlir/Dialect/LLVMIR/LLVMConversionEnumsFromLLVM.inc" 42 43 // Utility to print an LLVM value as a string for passing to emitError(). 44 // FIXME: Diagnostic should be able to natively handle types that have 45 // operator << (raw_ostream&) defined. 46 static std::string diag(llvm::Value &v) { 47 std::string s; 48 llvm::raw_string_ostream os(s); 49 os << v; 50 return os.str(); 51 } 52 53 /// Creates an attribute containing ABI and preferred alignment numbers parsed 54 /// a string. The string may be either "abi:preferred" or just "abi". In the 55 /// latter case, the prefrred alignment is considered equal to ABI alignment. 56 static DenseIntElementsAttr parseDataLayoutAlignment(MLIRContext &ctx, 57 StringRef spec) { 58 auto i32 = IntegerType::get(&ctx, 32); 59 60 StringRef abiString, preferredString; 61 std::tie(abiString, preferredString) = spec.split(':'); 62 int abi, preferred; 63 if (abiString.getAsInteger(/*Radix=*/10, abi)) 64 return nullptr; 65 66 if (preferredString.empty()) 67 preferred = abi; 68 else if (preferredString.getAsInteger(/*Radix=*/10, preferred)) 69 return nullptr; 70 71 return DenseIntElementsAttr::get(VectorType::get({2}, i32), {abi, preferred}); 72 } 73 74 /// Returns a supported MLIR floating point type of the given bit width or null 75 /// if the bit width is not supported. 76 static FloatType getDLFloatType(MLIRContext &ctx, int32_t bitwidth) { 77 switch (bitwidth) { 78 case 16: 79 return FloatType::getF16(&ctx); 80 case 32: 81 return FloatType::getF32(&ctx); 82 case 64: 83 return FloatType::getF64(&ctx); 84 case 80: 85 return FloatType::getF80(&ctx); 86 case 128: 87 return FloatType::getF128(&ctx); 88 default: 89 return nullptr; 90 } 91 } 92 93 DataLayoutSpecInterface 94 mlir::translateDataLayout(const llvm::DataLayout &dataLayout, 95 MLIRContext *context) { 96 assert(context && "expected MLIR context"); 97 std::string layoutstr = dataLayout.getStringRepresentation(); 98 99 // Remaining unhandled default layout defaults 100 // e (little endian if not set) 101 // p[n]:64:64:64 (non zero address spaces have 64-bit properties) 102 std::string append = 103 "p:64:64:64-S0-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f16:16:16-f64:" 104 "64:64-f128:128:128-v64:64:64-v128:128:128-a:0:64"; 105 if (layoutstr.empty()) 106 layoutstr = append; 107 else 108 layoutstr = layoutstr + "-" + append; 109 110 StringRef layout(layoutstr); 111 112 SmallVector<DataLayoutEntryInterface> entries; 113 StringSet<> seen; 114 while (!layout.empty()) { 115 // Split at '-'. 116 std::pair<StringRef, StringRef> split = layout.split('-'); 117 StringRef current; 118 std::tie(current, layout) = split; 119 120 // Split at ':'. 121 StringRef kind, spec; 122 std::tie(kind, spec) = current.split(':'); 123 if (seen.contains(kind)) 124 continue; 125 seen.insert(kind); 126 127 char symbol = kind.front(); 128 StringRef parameter = kind.substr(1); 129 130 if (symbol == 'i' || symbol == 'f') { 131 unsigned bitwidth; 132 if (parameter.getAsInteger(/*Radix=*/10, bitwidth)) 133 return nullptr; 134 DenseIntElementsAttr params = parseDataLayoutAlignment(*context, spec); 135 if (!params) 136 return nullptr; 137 auto entry = DataLayoutEntryAttr::get( 138 symbol == 'i' ? static_cast<Type>(IntegerType::get(context, bitwidth)) 139 : getDLFloatType(*context, bitwidth), 140 params); 141 entries.emplace_back(entry); 142 } else if (symbol == 'e' || symbol == 'E') { 143 auto value = StringAttr::get( 144 context, symbol == 'e' ? DLTIDialect::kDataLayoutEndiannessLittle 145 : DLTIDialect::kDataLayoutEndiannessBig); 146 auto entry = DataLayoutEntryAttr::get( 147 StringAttr::get(context, DLTIDialect::kDataLayoutEndiannessKey), 148 value); 149 entries.emplace_back(entry); 150 } 151 } 152 153 return DataLayoutSpecAttr::get(context, entries); 154 } 155 156 // Handles importing globals and functions from an LLVM module. 157 namespace { 158 class Importer { 159 public: 160 Importer(MLIRContext *context, ModuleOp module) 161 : b(context), context(context), module(module), 162 unknownLoc(FileLineColLoc::get(context, "imported-bitcode", 0, 0)), 163 typeTranslator(*context) { 164 b.setInsertionPointToStart(module.getBody()); 165 } 166 167 /// Imports `f` into the current module. 168 LogicalResult processFunction(llvm::Function *f); 169 170 /// Imports GV as a GlobalOp, creating it if it doesn't exist. 171 GlobalOp processGlobal(llvm::GlobalVariable *gv); 172 173 private: 174 /// Returns personality of `f` as a FlatSymbolRefAttr. 175 FlatSymbolRefAttr getPersonalityAsAttr(llvm::Function *f); 176 /// Imports `bb` into `block`, which must be initially empty. 177 LogicalResult processBasicBlock(llvm::BasicBlock *bb, Block *block); 178 /// Imports `inst` and populates instMap[inst] with the imported Value. 179 LogicalResult processInstruction(llvm::Instruction *inst); 180 /// Creates an LLVM-compatible MLIR type for `type`. 181 Type processType(llvm::Type *type); 182 /// `value` is an SSA-use. Return the remapped version of `value` or a 183 /// placeholder that will be remapped later if this is an instruction that 184 /// has not yet been visited. 185 Value processValue(llvm::Value *value); 186 /// Create the most accurate Location possible using a llvm::DebugLoc and 187 /// possibly an llvm::Instruction to narrow the Location if debug information 188 /// is unavailable. 189 Location processDebugLoc(const llvm::DebugLoc &loc, 190 llvm::Instruction *inst = nullptr); 191 /// `br` branches to `target`. Append the block arguments to attach to the 192 /// generated branch op to `blockArguments`. These should be in the same order 193 /// as the PHIs in `target`. 194 LogicalResult processBranchArgs(llvm::Instruction *br, 195 llvm::BasicBlock *target, 196 SmallVectorImpl<Value> &blockArguments); 197 /// Returns the builtin type equivalent to be used in attributes for the given 198 /// LLVM IR dialect type. 199 Type getStdTypeForAttr(Type type); 200 /// Return `value` as an attribute to attach to a GlobalOp. 201 Attribute getConstantAsAttr(llvm::Constant *value); 202 /// Return `c` as an MLIR Value. This could either be a ConstantOp, or 203 /// an expanded sequence of ops in the current function's entry block (for 204 /// ConstantExprs or ConstantGEPs). 205 Value processConstant(llvm::Constant *c); 206 207 /// The current builder, pointing at where the next Instruction should be 208 /// generated. 209 OpBuilder b; 210 /// The current context. 211 MLIRContext *context; 212 /// The current module being created. 213 ModuleOp module; 214 /// The entry block of the current function being processed. 215 Block *currentEntryBlock = nullptr; 216 217 /// Globals are inserted before the first function, if any. 218 Block::iterator getGlobalInsertPt() { 219 auto it = module.getBody()->begin(); 220 auto endIt = module.getBody()->end(); 221 while (it != endIt && !isa<LLVMFuncOp>(it)) 222 ++it; 223 return it; 224 } 225 226 /// Functions are always inserted before the module terminator. 227 Block::iterator getFuncInsertPt() { 228 return std::prev(module.getBody()->end()); 229 } 230 231 /// Remapped blocks, for the current function. 232 DenseMap<llvm::BasicBlock *, Block *> blocks; 233 /// Remapped values. These are function-local. 234 DenseMap<llvm::Value *, Value> instMap; 235 /// Instructions that had not been defined when first encountered as a use. 236 /// Maps to the dummy Operation that was created in processValue(). 237 DenseMap<llvm::Value *, Operation *> unknownInstMap; 238 /// Uniquing map of GlobalVariables. 239 DenseMap<llvm::GlobalVariable *, GlobalOp> globals; 240 /// Cached FileLineColLoc::get("imported-bitcode", 0, 0). 241 Location unknownLoc; 242 /// The stateful type translator (contains named structs). 243 LLVM::TypeFromLLVMIRTranslator typeTranslator; 244 }; 245 } // namespace 246 247 Location Importer::processDebugLoc(const llvm::DebugLoc &loc, 248 llvm::Instruction *inst) { 249 if (!loc && inst) { 250 std::string s; 251 llvm::raw_string_ostream os(s); 252 os << "llvm-imported-inst-%"; 253 inst->printAsOperand(os, /*PrintType=*/false); 254 return FileLineColLoc::get(context, os.str(), 0, 0); 255 } 256 if (!loc) { 257 return unknownLoc; 258 } 259 // FIXME: Obtain the filename from DILocationInfo. 260 return FileLineColLoc::get(context, "imported-bitcode", loc.getLine(), 261 loc.getCol()); 262 } 263 264 Type Importer::processType(llvm::Type *type) { 265 if (Type result = typeTranslator.translateType(type)) 266 return result; 267 268 // FIXME: Diagnostic should be able to natively handle types that have 269 // operator<<(raw_ostream&) defined. 270 std::string s; 271 llvm::raw_string_ostream os(s); 272 os << *type; 273 emitError(unknownLoc) << "unhandled type: " << os.str(); 274 return nullptr; 275 } 276 277 // We only need integers, floats, doubles, and vectors and tensors thereof for 278 // attributes. Scalar and vector types are converted to the standard 279 // equivalents. Array types are converted to ranked tensors; nested array types 280 // are converted to multi-dimensional tensors or vectors, depending on the 281 // innermost type being a scalar or a vector. 282 Type Importer::getStdTypeForAttr(Type type) { 283 if (!type) 284 return nullptr; 285 286 if (type.isa<IntegerType, FloatType>()) 287 return type; 288 289 // LLVM vectors can only contain scalars. 290 if (LLVM::isCompatibleVectorType(type)) { 291 auto numElements = LLVM::getVectorNumElements(type); 292 if (numElements.isScalable()) { 293 emitError(unknownLoc) << "scalable vectors not supported"; 294 return nullptr; 295 } 296 Type elementType = getStdTypeForAttr(LLVM::getVectorElementType(type)); 297 if (!elementType) 298 return nullptr; 299 return VectorType::get(numElements.getKnownMinValue(), elementType); 300 } 301 302 // LLVM arrays can contain other arrays or vectors. 303 if (auto arrayType = type.dyn_cast<LLVMArrayType>()) { 304 // Recover the nested array shape. 305 SmallVector<int64_t, 4> shape; 306 shape.push_back(arrayType.getNumElements()); 307 while (arrayType.getElementType().isa<LLVMArrayType>()) { 308 arrayType = arrayType.getElementType().cast<LLVMArrayType>(); 309 shape.push_back(arrayType.getNumElements()); 310 } 311 312 // If the innermost type is a vector, use the multi-dimensional vector as 313 // attribute type. 314 if (LLVM::isCompatibleVectorType(arrayType.getElementType())) { 315 auto numElements = LLVM::getVectorNumElements(arrayType.getElementType()); 316 if (numElements.isScalable()) { 317 emitError(unknownLoc) << "scalable vectors not supported"; 318 return nullptr; 319 } 320 shape.push_back(numElements.getKnownMinValue()); 321 322 Type elementType = getStdTypeForAttr( 323 LLVM::getVectorElementType(arrayType.getElementType())); 324 if (!elementType) 325 return nullptr; 326 return VectorType::get(shape, elementType); 327 } 328 329 // Otherwise use a tensor. 330 Type elementType = getStdTypeForAttr(arrayType.getElementType()); 331 if (!elementType) 332 return nullptr; 333 return RankedTensorType::get(shape, elementType); 334 } 335 336 return nullptr; 337 } 338 339 // Get the given constant as an attribute. Not all constants can be represented 340 // as attributes. 341 Attribute Importer::getConstantAsAttr(llvm::Constant *value) { 342 if (auto *ci = dyn_cast<llvm::ConstantInt>(value)) 343 return b.getIntegerAttr( 344 IntegerType::get(context, ci->getType()->getBitWidth()), 345 ci->getValue()); 346 if (auto *c = dyn_cast<llvm::ConstantDataArray>(value)) 347 if (c->isString()) 348 return b.getStringAttr(c->getAsString()); 349 if (auto *c = dyn_cast<llvm::ConstantFP>(value)) { 350 if (c->getType()->isDoubleTy()) 351 return b.getFloatAttr(FloatType::getF64(context), c->getValueAPF()); 352 if (c->getType()->isFloatingPointTy()) 353 return b.getFloatAttr(FloatType::getF32(context), c->getValueAPF()); 354 } 355 if (auto *f = dyn_cast<llvm::Function>(value)) 356 return SymbolRefAttr::get(b.getContext(), f->getName()); 357 358 // Convert constant data to a dense elements attribute. 359 if (auto *cd = dyn_cast<llvm::ConstantDataSequential>(value)) { 360 Type type = processType(cd->getElementType()); 361 if (!type) 362 return nullptr; 363 364 auto attrType = getStdTypeForAttr(processType(cd->getType())) 365 .dyn_cast_or_null<ShapedType>(); 366 if (!attrType) 367 return nullptr; 368 369 if (type.isa<IntegerType>()) { 370 SmallVector<APInt, 8> values; 371 values.reserve(cd->getNumElements()); 372 for (unsigned i = 0, e = cd->getNumElements(); i < e; ++i) 373 values.push_back(cd->getElementAsAPInt(i)); 374 return DenseElementsAttr::get(attrType, values); 375 } 376 377 if (type.isa<Float32Type, Float64Type>()) { 378 SmallVector<APFloat, 8> values; 379 values.reserve(cd->getNumElements()); 380 for (unsigned i = 0, e = cd->getNumElements(); i < e; ++i) 381 values.push_back(cd->getElementAsAPFloat(i)); 382 return DenseElementsAttr::get(attrType, values); 383 } 384 385 return nullptr; 386 } 387 388 // Unpack constant aggregates to create dense elements attribute whenever 389 // possible. Return nullptr (failure) otherwise. 390 if (isa<llvm::ConstantAggregate>(value)) { 391 auto outerType = getStdTypeForAttr(processType(value->getType())) 392 .dyn_cast_or_null<ShapedType>(); 393 if (!outerType) 394 return nullptr; 395 396 SmallVector<Attribute, 8> values; 397 SmallVector<int64_t, 8> shape; 398 399 for (unsigned i = 0, e = value->getNumOperands(); i < e; ++i) { 400 auto nested = getConstantAsAttr(value->getAggregateElement(i)) 401 .dyn_cast_or_null<DenseElementsAttr>(); 402 if (!nested) 403 return nullptr; 404 405 values.append(nested.value_begin<Attribute>(), 406 nested.value_end<Attribute>()); 407 } 408 409 return DenseElementsAttr::get(outerType, values); 410 } 411 412 return nullptr; 413 } 414 415 GlobalOp Importer::processGlobal(llvm::GlobalVariable *gv) { 416 auto it = globals.find(gv); 417 if (it != globals.end()) 418 return it->second; 419 420 OpBuilder b(module.getBody(), getGlobalInsertPt()); 421 Attribute valueAttr; 422 if (gv->hasInitializer()) 423 valueAttr = getConstantAsAttr(gv->getInitializer()); 424 Type type = processType(gv->getValueType()); 425 if (!type) 426 return nullptr; 427 428 uint64_t alignment = 0; 429 llvm::MaybeAlign maybeAlign = gv->getAlign(); 430 if (maybeAlign.hasValue()) { 431 llvm::Align align = maybeAlign.getValue(); 432 alignment = align.value(); 433 } 434 435 GlobalOp op = b.create<GlobalOp>( 436 UnknownLoc::get(context), type, gv->isConstant(), 437 convertLinkageFromLLVM(gv->getLinkage()), gv->getName(), valueAttr, 438 alignment, /*addr_space=*/gv->getAddressSpace(), 439 /*dso_local=*/gv->isDSOLocal(), /*thread_local=*/gv->isThreadLocal()); 440 441 if (gv->hasInitializer() && !valueAttr) { 442 Region &r = op.getInitializerRegion(); 443 currentEntryBlock = b.createBlock(&r); 444 b.setInsertionPoint(currentEntryBlock, currentEntryBlock->begin()); 445 Value v = processConstant(gv->getInitializer()); 446 if (!v) 447 return nullptr; 448 b.create<ReturnOp>(op.getLoc(), ArrayRef<Value>({v})); 449 } 450 if (gv->hasAtLeastLocalUnnamedAddr()) 451 op.setUnnamedAddrAttr(UnnamedAddrAttr::get( 452 context, convertUnnamedAddrFromLLVM(gv->getUnnamedAddr()))); 453 if (gv->hasSection()) 454 op.setSectionAttr(b.getStringAttr(gv->getSection())); 455 456 return globals[gv] = op; 457 } 458 459 Value Importer::processConstant(llvm::Constant *c) { 460 OpBuilder bEntry(currentEntryBlock, currentEntryBlock->begin()); 461 if (Attribute attr = getConstantAsAttr(c)) { 462 // These constants can be represented as attributes. 463 OpBuilder b(currentEntryBlock, currentEntryBlock->begin()); 464 Type type = processType(c->getType()); 465 if (!type) 466 return nullptr; 467 if (auto symbolRef = attr.dyn_cast<FlatSymbolRefAttr>()) 468 return instMap[c] = bEntry.create<AddressOfOp>(unknownLoc, type, 469 symbolRef.getValue()); 470 return instMap[c] = bEntry.create<ConstantOp>(unknownLoc, type, attr); 471 } 472 if (auto *cn = dyn_cast<llvm::ConstantPointerNull>(c)) { 473 Type type = processType(cn->getType()); 474 if (!type) 475 return nullptr; 476 return instMap[c] = bEntry.create<NullOp>(unknownLoc, type); 477 } 478 if (auto *gv = dyn_cast<llvm::GlobalVariable>(c)) 479 return bEntry.create<AddressOfOp>(UnknownLoc::get(context), 480 processGlobal(gv)); 481 482 if (auto *ce = dyn_cast<llvm::ConstantExpr>(c)) { 483 llvm::Instruction *i = ce->getAsInstruction(); 484 OpBuilder::InsertionGuard guard(b); 485 b.setInsertionPoint(currentEntryBlock, currentEntryBlock->begin()); 486 if (failed(processInstruction(i))) 487 return nullptr; 488 assert(instMap.count(i)); 489 490 // Remove this zombie LLVM instruction now, leaving us only with the MLIR 491 // op. 492 i->deleteValue(); 493 return instMap[c] = instMap[i]; 494 } 495 if (auto *ue = dyn_cast<llvm::UndefValue>(c)) { 496 Type type = processType(ue->getType()); 497 if (!type) 498 return nullptr; 499 return instMap[c] = bEntry.create<UndefOp>(UnknownLoc::get(context), type); 500 } 501 emitError(unknownLoc) << "unhandled constant: " << diag(*c); 502 return nullptr; 503 } 504 505 Value Importer::processValue(llvm::Value *value) { 506 auto it = instMap.find(value); 507 if (it != instMap.end()) 508 return it->second; 509 510 // We don't expect to see instructions in dominator order. If we haven't seen 511 // this instruction yet, create an unknown op and remap it later. 512 if (isa<llvm::Instruction>(value)) { 513 Type type = processType(value->getType()); 514 if (!type) 515 return nullptr; 516 unknownInstMap[value] = 517 b.create(UnknownLoc::get(context), b.getStringAttr("llvm.unknown"), 518 /*operands=*/{}, type); 519 return unknownInstMap[value]->getResult(0); 520 } 521 522 if (auto *c = dyn_cast<llvm::Constant>(value)) 523 return processConstant(c); 524 525 emitError(unknownLoc) << "unhandled value: " << diag(*value); 526 return nullptr; 527 } 528 529 /// Return the MLIR OperationName for the given LLVM opcode. 530 static StringRef lookupOperationNameFromOpcode(unsigned opcode) { 531 // Maps from LLVM opcode to MLIR OperationName. This is deliberately ordered 532 // as in llvm/IR/Instructions.def to aid comprehension and spot missing 533 // instructions. 534 #define INST(llvm_n, mlir_n) \ 535 { llvm::Instruction::llvm_n, LLVM::mlir_n##Op::getOperationName() } 536 static const DenseMap<unsigned, StringRef> opcMap = { 537 // Ret is handled specially. 538 // Br is handled specially. 539 // FIXME: switch 540 // FIXME: indirectbr 541 // FIXME: invoke 542 INST(Resume, Resume), 543 // FIXME: unreachable 544 // FIXME: cleanupret 545 // FIXME: catchret 546 // FIXME: catchswitch 547 // FIXME: callbr 548 // FIXME: fneg 549 INST(Add, Add), INST(FAdd, FAdd), INST(Sub, Sub), INST(FSub, FSub), 550 INST(Mul, Mul), INST(FMul, FMul), INST(UDiv, UDiv), INST(SDiv, SDiv), 551 INST(FDiv, FDiv), INST(URem, URem), INST(SRem, SRem), INST(FRem, FRem), 552 INST(Shl, Shl), INST(LShr, LShr), INST(AShr, AShr), INST(And, And), 553 INST(Or, Or), INST(Xor, XOr), INST(Alloca, Alloca), INST(Load, Load), 554 INST(Store, Store), 555 // Getelementptr is handled specially. 556 INST(Ret, Return), INST(Fence, Fence), 557 // FIXME: atomiccmpxchg 558 // FIXME: atomicrmw 559 INST(Trunc, Trunc), INST(ZExt, ZExt), INST(SExt, SExt), 560 INST(FPToUI, FPToUI), INST(FPToSI, FPToSI), INST(UIToFP, UIToFP), 561 INST(SIToFP, SIToFP), INST(FPTrunc, FPTrunc), INST(FPExt, FPExt), 562 INST(PtrToInt, PtrToInt), INST(IntToPtr, IntToPtr), 563 INST(BitCast, Bitcast), INST(AddrSpaceCast, AddrSpaceCast), 564 // FIXME: cleanuppad 565 // FIXME: catchpad 566 // ICmp is handled specially. 567 // FIXME: fcmp 568 // PHI is handled specially. 569 INST(Freeze, Freeze), INST(Call, Call), 570 // FIXME: select 571 // FIXME: vaarg 572 // FIXME: extractelement 573 // FIXME: insertelement 574 // FIXME: shufflevector 575 // FIXME: extractvalue 576 // FIXME: insertvalue 577 // FIXME: landingpad 578 }; 579 #undef INST 580 581 return opcMap.lookup(opcode); 582 } 583 584 static ICmpPredicate getICmpPredicate(llvm::CmpInst::Predicate p) { 585 switch (p) { 586 default: 587 llvm_unreachable("incorrect comparison predicate"); 588 case llvm::CmpInst::Predicate::ICMP_EQ: 589 return LLVM::ICmpPredicate::eq; 590 case llvm::CmpInst::Predicate::ICMP_NE: 591 return LLVM::ICmpPredicate::ne; 592 case llvm::CmpInst::Predicate::ICMP_SLT: 593 return LLVM::ICmpPredicate::slt; 594 case llvm::CmpInst::Predicate::ICMP_SLE: 595 return LLVM::ICmpPredicate::sle; 596 case llvm::CmpInst::Predicate::ICMP_SGT: 597 return LLVM::ICmpPredicate::sgt; 598 case llvm::CmpInst::Predicate::ICMP_SGE: 599 return LLVM::ICmpPredicate::sge; 600 case llvm::CmpInst::Predicate::ICMP_ULT: 601 return LLVM::ICmpPredicate::ult; 602 case llvm::CmpInst::Predicate::ICMP_ULE: 603 return LLVM::ICmpPredicate::ule; 604 case llvm::CmpInst::Predicate::ICMP_UGT: 605 return LLVM::ICmpPredicate::ugt; 606 case llvm::CmpInst::Predicate::ICMP_UGE: 607 return LLVM::ICmpPredicate::uge; 608 } 609 llvm_unreachable("incorrect comparison predicate"); 610 } 611 612 static AtomicOrdering getLLVMAtomicOrdering(llvm::AtomicOrdering ordering) { 613 switch (ordering) { 614 case llvm::AtomicOrdering::NotAtomic: 615 return LLVM::AtomicOrdering::not_atomic; 616 case llvm::AtomicOrdering::Unordered: 617 return LLVM::AtomicOrdering::unordered; 618 case llvm::AtomicOrdering::Monotonic: 619 return LLVM::AtomicOrdering::monotonic; 620 case llvm::AtomicOrdering::Acquire: 621 return LLVM::AtomicOrdering::acquire; 622 case llvm::AtomicOrdering::Release: 623 return LLVM::AtomicOrdering::release; 624 case llvm::AtomicOrdering::AcquireRelease: 625 return LLVM::AtomicOrdering::acq_rel; 626 case llvm::AtomicOrdering::SequentiallyConsistent: 627 return LLVM::AtomicOrdering::seq_cst; 628 } 629 llvm_unreachable("incorrect atomic ordering"); 630 } 631 632 // `br` branches to `target`. Return the branch arguments to `br`, in the 633 // same order of the PHIs in `target`. 634 LogicalResult 635 Importer::processBranchArgs(llvm::Instruction *br, llvm::BasicBlock *target, 636 SmallVectorImpl<Value> &blockArguments) { 637 for (auto inst = target->begin(); isa<llvm::PHINode>(inst); ++inst) { 638 auto *pn = cast<llvm::PHINode>(&*inst); 639 Value value = processValue(pn->getIncomingValueForBlock(br->getParent())); 640 if (!value) 641 return failure(); 642 blockArguments.push_back(value); 643 } 644 return success(); 645 } 646 647 LogicalResult Importer::processInstruction(llvm::Instruction *inst) { 648 // FIXME: Support uses of SubtargetData. Currently inbounds GEPs, fast-math 649 // flags and call / operand attributes are not supported. 650 Location loc = processDebugLoc(inst->getDebugLoc(), inst); 651 Value &v = instMap[inst]; 652 assert(!v && "processInstruction must be called only once per instruction!"); 653 switch (inst->getOpcode()) { 654 default: 655 return emitError(loc) << "unknown instruction: " << diag(*inst); 656 case llvm::Instruction::Add: 657 case llvm::Instruction::FAdd: 658 case llvm::Instruction::Sub: 659 case llvm::Instruction::FSub: 660 case llvm::Instruction::Mul: 661 case llvm::Instruction::FMul: 662 case llvm::Instruction::UDiv: 663 case llvm::Instruction::SDiv: 664 case llvm::Instruction::FDiv: 665 case llvm::Instruction::URem: 666 case llvm::Instruction::SRem: 667 case llvm::Instruction::FRem: 668 case llvm::Instruction::Shl: 669 case llvm::Instruction::LShr: 670 case llvm::Instruction::AShr: 671 case llvm::Instruction::And: 672 case llvm::Instruction::Or: 673 case llvm::Instruction::Xor: 674 case llvm::Instruction::Load: 675 case llvm::Instruction::Store: 676 case llvm::Instruction::Ret: 677 case llvm::Instruction::Resume: 678 case llvm::Instruction::Trunc: 679 case llvm::Instruction::ZExt: 680 case llvm::Instruction::SExt: 681 case llvm::Instruction::FPToUI: 682 case llvm::Instruction::FPToSI: 683 case llvm::Instruction::UIToFP: 684 case llvm::Instruction::SIToFP: 685 case llvm::Instruction::FPTrunc: 686 case llvm::Instruction::FPExt: 687 case llvm::Instruction::PtrToInt: 688 case llvm::Instruction::IntToPtr: 689 case llvm::Instruction::AddrSpaceCast: 690 case llvm::Instruction::Freeze: 691 case llvm::Instruction::BitCast: { 692 OperationState state(loc, lookupOperationNameFromOpcode(inst->getOpcode())); 693 SmallVector<Value, 4> ops; 694 ops.reserve(inst->getNumOperands()); 695 for (auto *op : inst->operand_values()) { 696 Value value = processValue(op); 697 if (!value) 698 return failure(); 699 ops.push_back(value); 700 } 701 state.addOperands(ops); 702 if (!inst->getType()->isVoidTy()) { 703 Type type = processType(inst->getType()); 704 if (!type) 705 return failure(); 706 state.addTypes(type); 707 } 708 Operation *op = b.create(state); 709 if (!inst->getType()->isVoidTy()) 710 v = op->getResult(0); 711 return success(); 712 } 713 case llvm::Instruction::Alloca: { 714 Value size = processValue(inst->getOperand(0)); 715 if (!size) 716 return failure(); 717 718 auto *allocaInst = cast<llvm::AllocaInst>(inst); 719 v = b.create<AllocaOp>(loc, processType(inst->getType()), 720 processType(allocaInst->getAllocatedType()), size, 721 allocaInst->getAlign().value()); 722 return success(); 723 } 724 case llvm::Instruction::ICmp: { 725 Value lhs = processValue(inst->getOperand(0)); 726 Value rhs = processValue(inst->getOperand(1)); 727 if (!lhs || !rhs) 728 return failure(); 729 v = b.create<ICmpOp>( 730 loc, getICmpPredicate(cast<llvm::ICmpInst>(inst)->getPredicate()), lhs, 731 rhs); 732 return success(); 733 } 734 case llvm::Instruction::Br: { 735 auto *brInst = cast<llvm::BranchInst>(inst); 736 OperationState state(loc, 737 brInst->isConditional() ? "llvm.cond_br" : "llvm.br"); 738 if (brInst->isConditional()) { 739 Value condition = processValue(brInst->getCondition()); 740 if (!condition) 741 return failure(); 742 state.addOperands(condition); 743 } 744 745 std::array<int32_t, 3> operandSegmentSizes = {1, 0, 0}; 746 for (int i : llvm::seq<int>(0, brInst->getNumSuccessors())) { 747 auto *succ = brInst->getSuccessor(i); 748 SmallVector<Value, 4> blockArguments; 749 if (failed(processBranchArgs(brInst, succ, blockArguments))) 750 return failure(); 751 state.addSuccessors(blocks[succ]); 752 state.addOperands(blockArguments); 753 operandSegmentSizes[i + 1] = blockArguments.size(); 754 } 755 756 if (brInst->isConditional()) { 757 state.addAttribute(LLVM::CondBrOp::getOperandSegmentSizeAttr(), 758 b.getI32VectorAttr(operandSegmentSizes)); 759 } 760 761 b.create(state); 762 return success(); 763 } 764 case llvm::Instruction::PHI: { 765 Type type = processType(inst->getType()); 766 if (!type) 767 return failure(); 768 v = b.getInsertionBlock()->addArgument( 769 type, processDebugLoc(inst->getDebugLoc(), inst)); 770 return success(); 771 } 772 case llvm::Instruction::Call: { 773 llvm::CallInst *ci = cast<llvm::CallInst>(inst); 774 SmallVector<Value, 4> ops; 775 ops.reserve(inst->getNumOperands()); 776 for (auto &op : ci->args()) { 777 Value arg = processValue(op.get()); 778 if (!arg) 779 return failure(); 780 ops.push_back(arg); 781 } 782 783 SmallVector<Type, 2> tys; 784 if (!ci->getType()->isVoidTy()) { 785 Type type = processType(inst->getType()); 786 if (!type) 787 return failure(); 788 tys.push_back(type); 789 } 790 Operation *op; 791 if (llvm::Function *callee = ci->getCalledFunction()) { 792 op = b.create<CallOp>( 793 loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops); 794 } else { 795 Value calledValue = processValue(ci->getCalledOperand()); 796 if (!calledValue) 797 return failure(); 798 ops.insert(ops.begin(), calledValue); 799 op = b.create<CallOp>(loc, tys, ops); 800 } 801 if (!ci->getType()->isVoidTy()) 802 v = op->getResult(0); 803 return success(); 804 } 805 case llvm::Instruction::LandingPad: { 806 llvm::LandingPadInst *lpi = cast<llvm::LandingPadInst>(inst); 807 SmallVector<Value, 4> ops; 808 809 for (unsigned i = 0, ie = lpi->getNumClauses(); i < ie; i++) 810 ops.push_back(processConstant(lpi->getClause(i))); 811 812 Type ty = processType(lpi->getType()); 813 if (!ty) 814 return failure(); 815 816 v = b.create<LandingpadOp>(loc, ty, lpi->isCleanup(), ops); 817 return success(); 818 } 819 case llvm::Instruction::Invoke: { 820 llvm::InvokeInst *ii = cast<llvm::InvokeInst>(inst); 821 822 SmallVector<Type, 2> tys; 823 if (!ii->getType()->isVoidTy()) 824 tys.push_back(processType(inst->getType())); 825 826 SmallVector<Value, 4> ops; 827 ops.reserve(inst->getNumOperands() + 1); 828 for (auto &op : ii->args()) 829 ops.push_back(processValue(op.get())); 830 831 SmallVector<Value, 4> normalArgs, unwindArgs; 832 (void)processBranchArgs(ii, ii->getNormalDest(), normalArgs); 833 (void)processBranchArgs(ii, ii->getUnwindDest(), unwindArgs); 834 835 Operation *op; 836 if (llvm::Function *callee = ii->getCalledFunction()) { 837 op = b.create<InvokeOp>( 838 loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops, 839 blocks[ii->getNormalDest()], normalArgs, blocks[ii->getUnwindDest()], 840 unwindArgs); 841 } else { 842 ops.insert(ops.begin(), processValue(ii->getCalledOperand())); 843 op = b.create<InvokeOp>(loc, tys, ops, blocks[ii->getNormalDest()], 844 normalArgs, blocks[ii->getUnwindDest()], 845 unwindArgs); 846 } 847 848 if (!ii->getType()->isVoidTy()) 849 v = op->getResult(0); 850 return success(); 851 } 852 case llvm::Instruction::Fence: { 853 StringRef syncscope; 854 SmallVector<StringRef, 4> ssNs; 855 llvm::LLVMContext &llvmContext = inst->getContext(); 856 llvm::FenceInst *fence = cast<llvm::FenceInst>(inst); 857 llvmContext.getSyncScopeNames(ssNs); 858 int fenceSyncScopeID = fence->getSyncScopeID(); 859 for (unsigned i = 0, e = ssNs.size(); i != e; i++) { 860 if (fenceSyncScopeID == llvmContext.getOrInsertSyncScopeID(ssNs[i])) { 861 syncscope = ssNs[i]; 862 break; 863 } 864 } 865 b.create<FenceOp>(loc, getLLVMAtomicOrdering(fence->getOrdering()), 866 syncscope); 867 return success(); 868 } 869 case llvm::Instruction::GetElementPtr: { 870 // FIXME: Support inbounds GEPs. 871 llvm::GetElementPtrInst *gep = cast<llvm::GetElementPtrInst>(inst); 872 Value basePtr = processValue(gep->getOperand(0)); 873 SmallVector<int32_t> staticIndices; 874 SmallVector<Value> dynamicIndices; 875 Type sourceElementType = processType(gep->getSourceElementType()); 876 SmallVector<unsigned> staticIndexPositions; 877 GEPOp::findKnownStructIndices(sourceElementType, staticIndexPositions); 878 879 for (const auto &en : 880 llvm::enumerate(llvm::drop_begin(gep->operand_values()))) { 881 llvm::Value *operand = en.value(); 882 if (llvm::find(staticIndexPositions, en.index()) == 883 staticIndexPositions.end()) { 884 staticIndices.push_back(GEPOp::kDynamicIndex); 885 dynamicIndices.push_back(processValue(operand)); 886 if (!dynamicIndices.back()) 887 return failure(); 888 } else { 889 auto *constantInt = cast<llvm::ConstantInt>(operand); 890 staticIndices.push_back( 891 static_cast<int32_t>(constantInt->getValue().getZExtValue())); 892 } 893 } 894 895 Type type = processType(inst->getType()); 896 if (!type) 897 return failure(); 898 v = b.create<GEPOp>(loc, type, sourceElementType, basePtr, dynamicIndices, 899 staticIndices); 900 return success(); 901 } 902 } 903 } 904 905 FlatSymbolRefAttr Importer::getPersonalityAsAttr(llvm::Function *f) { 906 if (!f->hasPersonalityFn()) 907 return nullptr; 908 909 llvm::Constant *pf = f->getPersonalityFn(); 910 911 // If it directly has a name, we can use it. 912 if (pf->hasName()) 913 return SymbolRefAttr::get(b.getContext(), pf->getName()); 914 915 // If it doesn't have a name, currently, only function pointers that are 916 // bitcast to i8* are parsed. 917 if (auto *ce = dyn_cast<llvm::ConstantExpr>(pf)) { 918 if (ce->getOpcode() == llvm::Instruction::BitCast && 919 ce->getType() == llvm::Type::getInt8PtrTy(f->getContext())) { 920 if (auto *func = dyn_cast<llvm::Function>(ce->getOperand(0))) 921 return SymbolRefAttr::get(b.getContext(), func->getName()); 922 } 923 } 924 return FlatSymbolRefAttr(); 925 } 926 927 LogicalResult Importer::processFunction(llvm::Function *f) { 928 blocks.clear(); 929 instMap.clear(); 930 unknownInstMap.clear(); 931 932 auto functionType = 933 processType(f->getFunctionType()).dyn_cast<LLVMFunctionType>(); 934 if (!functionType) 935 return failure(); 936 937 b.setInsertionPoint(module.getBody(), getFuncInsertPt()); 938 LLVMFuncOp fop = 939 b.create<LLVMFuncOp>(UnknownLoc::get(context), f->getName(), functionType, 940 convertLinkageFromLLVM(f->getLinkage())); 941 942 if (FlatSymbolRefAttr personality = getPersonalityAsAttr(f)) 943 fop->setAttr(b.getStringAttr("personality"), personality); 944 else if (f->hasPersonalityFn()) 945 emitWarning(UnknownLoc::get(context), 946 "could not deduce personality, skipping it"); 947 948 if (f->hasGC()) 949 fop.setGarbageCollectorAttr(b.getStringAttr(f->getGC())); 950 951 if (f->isDeclaration()) 952 return success(); 953 954 // Eagerly create all blocks. 955 SmallVector<Block *, 4> blockList; 956 for (llvm::BasicBlock &bb : *f) { 957 blockList.push_back(b.createBlock(&fop.getBody(), fop.getBody().end())); 958 blocks[&bb] = blockList.back(); 959 } 960 currentEntryBlock = blockList[0]; 961 962 // Add function arguments to the entry block. 963 for (const auto &kv : llvm::enumerate(f->args())) { 964 instMap[&kv.value()] = blockList[0]->addArgument( 965 functionType.getParamType(kv.index()), fop.getLoc()); 966 } 967 968 for (auto bbs : llvm::zip(*f, blockList)) { 969 if (failed(processBasicBlock(&std::get<0>(bbs), std::get<1>(bbs)))) 970 return failure(); 971 } 972 973 // Now that all instructions are guaranteed to have been visited, ensure 974 // any unknown uses we encountered are remapped. 975 for (auto &llvmAndUnknown : unknownInstMap) { 976 assert(instMap.count(llvmAndUnknown.first)); 977 Value newValue = instMap[llvmAndUnknown.first]; 978 Value oldValue = llvmAndUnknown.second->getResult(0); 979 oldValue.replaceAllUsesWith(newValue); 980 llvmAndUnknown.second->erase(); 981 } 982 return success(); 983 } 984 985 LogicalResult Importer::processBasicBlock(llvm::BasicBlock *bb, Block *block) { 986 b.setInsertionPointToStart(block); 987 for (llvm::Instruction &inst : *bb) { 988 if (failed(processInstruction(&inst))) 989 return failure(); 990 } 991 return success(); 992 } 993 994 OwningOpRef<ModuleOp> 995 mlir::translateLLVMIRToModule(std::unique_ptr<llvm::Module> llvmModule, 996 MLIRContext *context) { 997 context->loadDialect<LLVMDialect>(); 998 context->loadDialect<DLTIDialect>(); 999 OwningOpRef<ModuleOp> module(ModuleOp::create( 1000 FileLineColLoc::get(context, "", /*line=*/0, /*column=*/0))); 1001 1002 DataLayoutSpecInterface dlSpec = 1003 translateDataLayout(llvmModule->getDataLayout(), context); 1004 if (!dlSpec) { 1005 emitError(UnknownLoc::get(context), "can't translate data layout"); 1006 return {}; 1007 } 1008 1009 module.get()->setAttr(DLTIDialect::kDataLayoutAttrName, dlSpec); 1010 1011 Importer deserializer(context, module.get()); 1012 for (llvm::GlobalVariable &gv : llvmModule->globals()) { 1013 if (!deserializer.processGlobal(&gv)) 1014 return {}; 1015 } 1016 for (llvm::Function &f : llvmModule->functions()) { 1017 if (failed(deserializer.processFunction(&f))) 1018 return {}; 1019 } 1020 1021 return module; 1022 } 1023 1024 // Deserializes the LLVM bitcode stored in `input` into an MLIR module in the 1025 // LLVM dialect. 1026 OwningOpRef<ModuleOp> translateLLVMIRToModule(llvm::SourceMgr &sourceMgr, 1027 MLIRContext *context) { 1028 llvm::SMDiagnostic err; 1029 llvm::LLVMContext llvmContext; 1030 std::unique_ptr<llvm::Module> llvmModule = llvm::parseIR( 1031 *sourceMgr.getMemoryBuffer(sourceMgr.getMainFileID()), err, llvmContext); 1032 if (!llvmModule) { 1033 std::string errStr; 1034 llvm::raw_string_ostream errStream(errStr); 1035 err.print(/*ProgName=*/"", errStream); 1036 emitError(UnknownLoc::get(context)) << errStream.str(); 1037 return {}; 1038 } 1039 return translateLLVMIRToModule(std::move(llvmModule), context); 1040 } 1041 1042 namespace mlir { 1043 void registerFromLLVMIRTranslation() { 1044 TranslateToMLIRRegistration fromLLVM( 1045 "import-llvm", [](llvm::SourceMgr &sourceMgr, MLIRContext *context) { 1046 return ::translateLLVMIRToModule(sourceMgr, context); 1047 }); 1048 } 1049 } // namespace mlir 1050