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 bEntry.create<AddressOfOp>(unknownLoc, type, symbolRef.getValue()); 469 return bEntry.create<ConstantOp>(unknownLoc, type, attr); 470 } 471 if (auto *cn = dyn_cast<llvm::ConstantPointerNull>(c)) { 472 Type type = processType(cn->getType()); 473 if (!type) 474 return nullptr; 475 return bEntry.create<NullOp>(unknownLoc, type); 476 } 477 if (auto *gv = dyn_cast<llvm::GlobalVariable>(c)) 478 return bEntry.create<AddressOfOp>(UnknownLoc::get(context), 479 processGlobal(gv)); 480 481 if (auto *ce = dyn_cast<llvm::ConstantExpr>(c)) { 482 llvm::Instruction *i = ce->getAsInstruction(); 483 OpBuilder::InsertionGuard guard(b); 484 b.setInsertionPoint(currentEntryBlock, currentEntryBlock->begin()); 485 if (failed(processInstruction(i))) 486 return nullptr; 487 assert(instMap.count(i)); 488 489 // If we don't remove entry of `i` here, it's totally possible that the 490 // next time llvm::ConstantExpr::getAsInstruction is called again, which 491 // always allocates a new Instruction, memory address of the newly 492 // created Instruction might be the same as `i`. Making processInstruction 493 // falsely believe that the new Instruction has been processed before 494 // and raised an assertion error. 495 Value value = instMap[i]; 496 instMap.erase(i); 497 // Remove this zombie LLVM instruction now, leaving us only with the MLIR 498 // op. 499 i->deleteValue(); 500 return value; 501 } 502 if (auto *ue = dyn_cast<llvm::UndefValue>(c)) { 503 Type type = processType(ue->getType()); 504 if (!type) 505 return nullptr; 506 return bEntry.create<UndefOp>(UnknownLoc::get(context), type); 507 } 508 509 if (isa<llvm::ConstantAggregate>(c) || isa<llvm::ConstantAggregateZero>(c)) { 510 unsigned numElements = c->getNumOperands(); 511 std::function<llvm::Constant *(unsigned)> getElement = 512 [&](unsigned index) -> llvm::Constant * { 513 return c->getAggregateElement(index); 514 }; 515 // llvm::ConstantAggregateZero doesn't take any operand 516 // so its getNumOperands is always zero. 517 if (auto *caz = dyn_cast<llvm::ConstantAggregateZero>(c)) { 518 numElements = caz->getElementCount().getFixedValue(); 519 // We want to capture the pointer rather than reference 520 // to the pointer since the latter will become dangling upon 521 // exiting the scope. 522 getElement = [=](unsigned index) -> llvm::Constant * { 523 return caz->getElementValue(index); 524 }; 525 } 526 527 // Generate a llvm.undef as the root value first. 528 Type rootType = processType(c->getType()); 529 if (!rootType) 530 return nullptr; 531 Value root = bEntry.create<UndefOp>(unknownLoc, rootType); 532 for (unsigned i = 0; i < numElements; ++i) { 533 llvm::Constant *element = getElement(i); 534 Value elementValue = processConstant(element); 535 if (!elementValue) 536 return nullptr; 537 ArrayAttr indexAttr = bEntry.getI32ArrayAttr({static_cast<int32_t>(i)}); 538 root = bEntry.create<InsertValueOp>(UnknownLoc::get(context), rootType, 539 root, elementValue, indexAttr); 540 } 541 return root; 542 } 543 544 emitError(unknownLoc) << "unhandled constant: " << diag(*c); 545 return nullptr; 546 } 547 548 Value Importer::processValue(llvm::Value *value) { 549 auto it = instMap.find(value); 550 if (it != instMap.end()) 551 return it->second; 552 553 // We don't expect to see instructions in dominator order. If we haven't seen 554 // this instruction yet, create an unknown op and remap it later. 555 if (isa<llvm::Instruction>(value)) { 556 Type type = processType(value->getType()); 557 if (!type) 558 return nullptr; 559 unknownInstMap[value] = 560 b.create(UnknownLoc::get(context), b.getStringAttr("llvm.unknown"), 561 /*operands=*/{}, type); 562 return unknownInstMap[value]->getResult(0); 563 } 564 565 if (auto *c = dyn_cast<llvm::Constant>(value)) 566 return processConstant(c); 567 568 emitError(unknownLoc) << "unhandled value: " << diag(*value); 569 return nullptr; 570 } 571 572 /// Return the MLIR OperationName for the given LLVM opcode. 573 static StringRef lookupOperationNameFromOpcode(unsigned opcode) { 574 // Maps from LLVM opcode to MLIR OperationName. This is deliberately ordered 575 // as in llvm/IR/Instructions.def to aid comprehension and spot missing 576 // instructions. 577 #define INST(llvm_n, mlir_n) \ 578 { llvm::Instruction::llvm_n, LLVM::mlir_n##Op::getOperationName() } 579 static const DenseMap<unsigned, StringRef> opcMap = { 580 // Ret is handled specially. 581 // Br is handled specially. 582 // FIXME: switch 583 // FIXME: indirectbr 584 // FIXME: invoke 585 INST(Resume, Resume), 586 // FIXME: unreachable 587 // FIXME: cleanupret 588 // FIXME: catchret 589 // FIXME: catchswitch 590 // FIXME: callbr 591 // FIXME: fneg 592 INST(Add, Add), INST(FAdd, FAdd), INST(Sub, Sub), INST(FSub, FSub), 593 INST(Mul, Mul), INST(FMul, FMul), INST(UDiv, UDiv), INST(SDiv, SDiv), 594 INST(FDiv, FDiv), INST(URem, URem), INST(SRem, SRem), INST(FRem, FRem), 595 INST(Shl, Shl), INST(LShr, LShr), INST(AShr, AShr), INST(And, And), 596 INST(Or, Or), INST(Xor, XOr), INST(Alloca, Alloca), INST(Load, Load), 597 INST(Store, Store), 598 // Getelementptr is handled specially. 599 INST(Ret, Return), INST(Fence, Fence), 600 // FIXME: atomiccmpxchg 601 // FIXME: atomicrmw 602 INST(Trunc, Trunc), INST(ZExt, ZExt), INST(SExt, SExt), 603 INST(FPToUI, FPToUI), INST(FPToSI, FPToSI), INST(UIToFP, UIToFP), 604 INST(SIToFP, SIToFP), INST(FPTrunc, FPTrunc), INST(FPExt, FPExt), 605 INST(PtrToInt, PtrToInt), INST(IntToPtr, IntToPtr), 606 INST(BitCast, Bitcast), INST(AddrSpaceCast, AddrSpaceCast), 607 // FIXME: cleanuppad 608 // FIXME: catchpad 609 // ICmp is handled specially. 610 // FIXME: fcmp 611 // PHI is handled specially. 612 INST(Freeze, Freeze), INST(Call, Call), 613 // FIXME: select 614 // FIXME: vaarg 615 // FIXME: extractelement 616 // FIXME: insertelement 617 // FIXME: shufflevector 618 // FIXME: extractvalue 619 // FIXME: insertvalue 620 // FIXME: landingpad 621 }; 622 #undef INST 623 624 return opcMap.lookup(opcode); 625 } 626 627 static ICmpPredicate getICmpPredicate(llvm::CmpInst::Predicate p) { 628 switch (p) { 629 default: 630 llvm_unreachable("incorrect comparison predicate"); 631 case llvm::CmpInst::Predicate::ICMP_EQ: 632 return LLVM::ICmpPredicate::eq; 633 case llvm::CmpInst::Predicate::ICMP_NE: 634 return LLVM::ICmpPredicate::ne; 635 case llvm::CmpInst::Predicate::ICMP_SLT: 636 return LLVM::ICmpPredicate::slt; 637 case llvm::CmpInst::Predicate::ICMP_SLE: 638 return LLVM::ICmpPredicate::sle; 639 case llvm::CmpInst::Predicate::ICMP_SGT: 640 return LLVM::ICmpPredicate::sgt; 641 case llvm::CmpInst::Predicate::ICMP_SGE: 642 return LLVM::ICmpPredicate::sge; 643 case llvm::CmpInst::Predicate::ICMP_ULT: 644 return LLVM::ICmpPredicate::ult; 645 case llvm::CmpInst::Predicate::ICMP_ULE: 646 return LLVM::ICmpPredicate::ule; 647 case llvm::CmpInst::Predicate::ICMP_UGT: 648 return LLVM::ICmpPredicate::ugt; 649 case llvm::CmpInst::Predicate::ICMP_UGE: 650 return LLVM::ICmpPredicate::uge; 651 } 652 llvm_unreachable("incorrect comparison predicate"); 653 } 654 655 static AtomicOrdering getLLVMAtomicOrdering(llvm::AtomicOrdering ordering) { 656 switch (ordering) { 657 case llvm::AtomicOrdering::NotAtomic: 658 return LLVM::AtomicOrdering::not_atomic; 659 case llvm::AtomicOrdering::Unordered: 660 return LLVM::AtomicOrdering::unordered; 661 case llvm::AtomicOrdering::Monotonic: 662 return LLVM::AtomicOrdering::monotonic; 663 case llvm::AtomicOrdering::Acquire: 664 return LLVM::AtomicOrdering::acquire; 665 case llvm::AtomicOrdering::Release: 666 return LLVM::AtomicOrdering::release; 667 case llvm::AtomicOrdering::AcquireRelease: 668 return LLVM::AtomicOrdering::acq_rel; 669 case llvm::AtomicOrdering::SequentiallyConsistent: 670 return LLVM::AtomicOrdering::seq_cst; 671 } 672 llvm_unreachable("incorrect atomic ordering"); 673 } 674 675 // `br` branches to `target`. Return the branch arguments to `br`, in the 676 // same order of the PHIs in `target`. 677 LogicalResult 678 Importer::processBranchArgs(llvm::Instruction *br, llvm::BasicBlock *target, 679 SmallVectorImpl<Value> &blockArguments) { 680 for (auto inst = target->begin(); isa<llvm::PHINode>(inst); ++inst) { 681 auto *pn = cast<llvm::PHINode>(&*inst); 682 Value value = processValue(pn->getIncomingValueForBlock(br->getParent())); 683 if (!value) 684 return failure(); 685 blockArguments.push_back(value); 686 } 687 return success(); 688 } 689 690 LogicalResult Importer::processInstruction(llvm::Instruction *inst) { 691 // FIXME: Support uses of SubtargetData. Currently inbounds GEPs, fast-math 692 // flags and call / operand attributes are not supported. 693 Location loc = processDebugLoc(inst->getDebugLoc(), inst); 694 Value &v = instMap[inst]; 695 assert(!v && "processInstruction must be called only once per instruction!"); 696 switch (inst->getOpcode()) { 697 default: 698 return emitError(loc) << "unknown instruction: " << diag(*inst); 699 case llvm::Instruction::Add: 700 case llvm::Instruction::FAdd: 701 case llvm::Instruction::Sub: 702 case llvm::Instruction::FSub: 703 case llvm::Instruction::Mul: 704 case llvm::Instruction::FMul: 705 case llvm::Instruction::UDiv: 706 case llvm::Instruction::SDiv: 707 case llvm::Instruction::FDiv: 708 case llvm::Instruction::URem: 709 case llvm::Instruction::SRem: 710 case llvm::Instruction::FRem: 711 case llvm::Instruction::Shl: 712 case llvm::Instruction::LShr: 713 case llvm::Instruction::AShr: 714 case llvm::Instruction::And: 715 case llvm::Instruction::Or: 716 case llvm::Instruction::Xor: 717 case llvm::Instruction::Load: 718 case llvm::Instruction::Store: 719 case llvm::Instruction::Ret: 720 case llvm::Instruction::Resume: 721 case llvm::Instruction::Trunc: 722 case llvm::Instruction::ZExt: 723 case llvm::Instruction::SExt: 724 case llvm::Instruction::FPToUI: 725 case llvm::Instruction::FPToSI: 726 case llvm::Instruction::UIToFP: 727 case llvm::Instruction::SIToFP: 728 case llvm::Instruction::FPTrunc: 729 case llvm::Instruction::FPExt: 730 case llvm::Instruction::PtrToInt: 731 case llvm::Instruction::IntToPtr: 732 case llvm::Instruction::AddrSpaceCast: 733 case llvm::Instruction::Freeze: 734 case llvm::Instruction::BitCast: { 735 OperationState state(loc, lookupOperationNameFromOpcode(inst->getOpcode())); 736 SmallVector<Value, 4> ops; 737 ops.reserve(inst->getNumOperands()); 738 for (auto *op : inst->operand_values()) { 739 Value value = processValue(op); 740 if (!value) 741 return failure(); 742 ops.push_back(value); 743 } 744 state.addOperands(ops); 745 if (!inst->getType()->isVoidTy()) { 746 Type type = processType(inst->getType()); 747 if (!type) 748 return failure(); 749 state.addTypes(type); 750 } 751 Operation *op = b.create(state); 752 if (!inst->getType()->isVoidTy()) 753 v = op->getResult(0); 754 return success(); 755 } 756 case llvm::Instruction::Alloca: { 757 Value size = processValue(inst->getOperand(0)); 758 if (!size) 759 return failure(); 760 761 auto *allocaInst = cast<llvm::AllocaInst>(inst); 762 v = b.create<AllocaOp>(loc, processType(inst->getType()), 763 processType(allocaInst->getAllocatedType()), size, 764 allocaInst->getAlign().value()); 765 return success(); 766 } 767 case llvm::Instruction::ICmp: { 768 Value lhs = processValue(inst->getOperand(0)); 769 Value rhs = processValue(inst->getOperand(1)); 770 if (!lhs || !rhs) 771 return failure(); 772 v = b.create<ICmpOp>( 773 loc, getICmpPredicate(cast<llvm::ICmpInst>(inst)->getPredicate()), lhs, 774 rhs); 775 return success(); 776 } 777 case llvm::Instruction::Br: { 778 auto *brInst = cast<llvm::BranchInst>(inst); 779 OperationState state(loc, 780 brInst->isConditional() ? "llvm.cond_br" : "llvm.br"); 781 if (brInst->isConditional()) { 782 Value condition = processValue(brInst->getCondition()); 783 if (!condition) 784 return failure(); 785 state.addOperands(condition); 786 } 787 788 std::array<int32_t, 3> operandSegmentSizes = {1, 0, 0}; 789 for (int i : llvm::seq<int>(0, brInst->getNumSuccessors())) { 790 auto *succ = brInst->getSuccessor(i); 791 SmallVector<Value, 4> blockArguments; 792 if (failed(processBranchArgs(brInst, succ, blockArguments))) 793 return failure(); 794 state.addSuccessors(blocks[succ]); 795 state.addOperands(blockArguments); 796 operandSegmentSizes[i + 1] = blockArguments.size(); 797 } 798 799 if (brInst->isConditional()) { 800 state.addAttribute(LLVM::CondBrOp::getOperandSegmentSizeAttr(), 801 b.getI32VectorAttr(operandSegmentSizes)); 802 } 803 804 b.create(state); 805 return success(); 806 } 807 case llvm::Instruction::PHI: { 808 Type type = processType(inst->getType()); 809 if (!type) 810 return failure(); 811 v = b.getInsertionBlock()->addArgument( 812 type, processDebugLoc(inst->getDebugLoc(), inst)); 813 return success(); 814 } 815 case llvm::Instruction::Call: { 816 llvm::CallInst *ci = cast<llvm::CallInst>(inst); 817 SmallVector<Value, 4> ops; 818 ops.reserve(inst->getNumOperands()); 819 for (auto &op : ci->args()) { 820 Value arg = processValue(op.get()); 821 if (!arg) 822 return failure(); 823 ops.push_back(arg); 824 } 825 826 SmallVector<Type, 2> tys; 827 if (!ci->getType()->isVoidTy()) { 828 Type type = processType(inst->getType()); 829 if (!type) 830 return failure(); 831 tys.push_back(type); 832 } 833 Operation *op; 834 if (llvm::Function *callee = ci->getCalledFunction()) { 835 op = b.create<CallOp>( 836 loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops); 837 } else { 838 Value calledValue = processValue(ci->getCalledOperand()); 839 if (!calledValue) 840 return failure(); 841 ops.insert(ops.begin(), calledValue); 842 op = b.create<CallOp>(loc, tys, ops); 843 } 844 if (!ci->getType()->isVoidTy()) 845 v = op->getResult(0); 846 return success(); 847 } 848 case llvm::Instruction::LandingPad: { 849 llvm::LandingPadInst *lpi = cast<llvm::LandingPadInst>(inst); 850 SmallVector<Value, 4> ops; 851 852 for (unsigned i = 0, ie = lpi->getNumClauses(); i < ie; i++) 853 ops.push_back(processConstant(lpi->getClause(i))); 854 855 Type ty = processType(lpi->getType()); 856 if (!ty) 857 return failure(); 858 859 v = b.create<LandingpadOp>(loc, ty, lpi->isCleanup(), ops); 860 return success(); 861 } 862 case llvm::Instruction::Invoke: { 863 llvm::InvokeInst *ii = cast<llvm::InvokeInst>(inst); 864 865 SmallVector<Type, 2> tys; 866 if (!ii->getType()->isVoidTy()) 867 tys.push_back(processType(inst->getType())); 868 869 SmallVector<Value, 4> ops; 870 ops.reserve(inst->getNumOperands() + 1); 871 for (auto &op : ii->args()) 872 ops.push_back(processValue(op.get())); 873 874 SmallVector<Value, 4> normalArgs, unwindArgs; 875 (void)processBranchArgs(ii, ii->getNormalDest(), normalArgs); 876 (void)processBranchArgs(ii, ii->getUnwindDest(), unwindArgs); 877 878 Operation *op; 879 if (llvm::Function *callee = ii->getCalledFunction()) { 880 op = b.create<InvokeOp>( 881 loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops, 882 blocks[ii->getNormalDest()], normalArgs, blocks[ii->getUnwindDest()], 883 unwindArgs); 884 } else { 885 ops.insert(ops.begin(), processValue(ii->getCalledOperand())); 886 op = b.create<InvokeOp>(loc, tys, ops, blocks[ii->getNormalDest()], 887 normalArgs, blocks[ii->getUnwindDest()], 888 unwindArgs); 889 } 890 891 if (!ii->getType()->isVoidTy()) 892 v = op->getResult(0); 893 return success(); 894 } 895 case llvm::Instruction::Fence: { 896 StringRef syncscope; 897 SmallVector<StringRef, 4> ssNs; 898 llvm::LLVMContext &llvmContext = inst->getContext(); 899 llvm::FenceInst *fence = cast<llvm::FenceInst>(inst); 900 llvmContext.getSyncScopeNames(ssNs); 901 int fenceSyncScopeID = fence->getSyncScopeID(); 902 for (unsigned i = 0, e = ssNs.size(); i != e; i++) { 903 if (fenceSyncScopeID == llvmContext.getOrInsertSyncScopeID(ssNs[i])) { 904 syncscope = ssNs[i]; 905 break; 906 } 907 } 908 b.create<FenceOp>(loc, getLLVMAtomicOrdering(fence->getOrdering()), 909 syncscope); 910 return success(); 911 } 912 case llvm::Instruction::GetElementPtr: { 913 // FIXME: Support inbounds GEPs. 914 llvm::GetElementPtrInst *gep = cast<llvm::GetElementPtrInst>(inst); 915 Value basePtr = processValue(gep->getOperand(0)); 916 SmallVector<int32_t> staticIndices; 917 SmallVector<Value> dynamicIndices; 918 Type sourceElementType = processType(gep->getSourceElementType()); 919 SmallVector<unsigned> staticIndexPositions; 920 GEPOp::findKnownStructIndices(sourceElementType, staticIndexPositions); 921 922 for (const auto &en : 923 llvm::enumerate(llvm::drop_begin(gep->operand_values()))) { 924 llvm::Value *operand = en.value(); 925 if (llvm::find(staticIndexPositions, en.index()) == 926 staticIndexPositions.end()) { 927 staticIndices.push_back(GEPOp::kDynamicIndex); 928 dynamicIndices.push_back(processValue(operand)); 929 if (!dynamicIndices.back()) 930 return failure(); 931 } else { 932 auto *constantInt = cast<llvm::ConstantInt>(operand); 933 staticIndices.push_back( 934 static_cast<int32_t>(constantInt->getValue().getZExtValue())); 935 } 936 } 937 938 Type type = processType(inst->getType()); 939 if (!type) 940 return failure(); 941 v = b.create<GEPOp>(loc, type, sourceElementType, basePtr, dynamicIndices, 942 staticIndices); 943 return success(); 944 } 945 } 946 } 947 948 FlatSymbolRefAttr Importer::getPersonalityAsAttr(llvm::Function *f) { 949 if (!f->hasPersonalityFn()) 950 return nullptr; 951 952 llvm::Constant *pf = f->getPersonalityFn(); 953 954 // If it directly has a name, we can use it. 955 if (pf->hasName()) 956 return SymbolRefAttr::get(b.getContext(), pf->getName()); 957 958 // If it doesn't have a name, currently, only function pointers that are 959 // bitcast to i8* are parsed. 960 if (auto *ce = dyn_cast<llvm::ConstantExpr>(pf)) { 961 if (ce->getOpcode() == llvm::Instruction::BitCast && 962 ce->getType() == llvm::Type::getInt8PtrTy(f->getContext())) { 963 if (auto *func = dyn_cast<llvm::Function>(ce->getOperand(0))) 964 return SymbolRefAttr::get(b.getContext(), func->getName()); 965 } 966 } 967 return FlatSymbolRefAttr(); 968 } 969 970 LogicalResult Importer::processFunction(llvm::Function *f) { 971 blocks.clear(); 972 instMap.clear(); 973 unknownInstMap.clear(); 974 975 auto functionType = 976 processType(f->getFunctionType()).dyn_cast<LLVMFunctionType>(); 977 if (!functionType) 978 return failure(); 979 980 b.setInsertionPoint(module.getBody(), getFuncInsertPt()); 981 LLVMFuncOp fop = 982 b.create<LLVMFuncOp>(UnknownLoc::get(context), f->getName(), functionType, 983 convertLinkageFromLLVM(f->getLinkage())); 984 985 if (FlatSymbolRefAttr personality = getPersonalityAsAttr(f)) 986 fop->setAttr(b.getStringAttr("personality"), personality); 987 else if (f->hasPersonalityFn()) 988 emitWarning(UnknownLoc::get(context), 989 "could not deduce personality, skipping it"); 990 991 if (f->hasGC()) 992 fop.setGarbageCollectorAttr(b.getStringAttr(f->getGC())); 993 994 if (f->isDeclaration()) 995 return success(); 996 997 // Eagerly create all blocks. 998 SmallVector<Block *, 4> blockList; 999 for (llvm::BasicBlock &bb : *f) { 1000 blockList.push_back(b.createBlock(&fop.getBody(), fop.getBody().end())); 1001 blocks[&bb] = blockList.back(); 1002 } 1003 currentEntryBlock = blockList[0]; 1004 1005 // Add function arguments to the entry block. 1006 for (const auto &kv : llvm::enumerate(f->args())) { 1007 instMap[&kv.value()] = blockList[0]->addArgument( 1008 functionType.getParamType(kv.index()), fop.getLoc()); 1009 } 1010 1011 for (auto bbs : llvm::zip(*f, blockList)) { 1012 if (failed(processBasicBlock(&std::get<0>(bbs), std::get<1>(bbs)))) 1013 return failure(); 1014 } 1015 1016 // Now that all instructions are guaranteed to have been visited, ensure 1017 // any unknown uses we encountered are remapped. 1018 for (auto &llvmAndUnknown : unknownInstMap) { 1019 assert(instMap.count(llvmAndUnknown.first)); 1020 Value newValue = instMap[llvmAndUnknown.first]; 1021 Value oldValue = llvmAndUnknown.second->getResult(0); 1022 oldValue.replaceAllUsesWith(newValue); 1023 llvmAndUnknown.second->erase(); 1024 } 1025 return success(); 1026 } 1027 1028 LogicalResult Importer::processBasicBlock(llvm::BasicBlock *bb, Block *block) { 1029 b.setInsertionPointToStart(block); 1030 for (llvm::Instruction &inst : *bb) { 1031 if (failed(processInstruction(&inst))) 1032 return failure(); 1033 } 1034 return success(); 1035 } 1036 1037 OwningOpRef<ModuleOp> 1038 mlir::translateLLVMIRToModule(std::unique_ptr<llvm::Module> llvmModule, 1039 MLIRContext *context) { 1040 context->loadDialect<LLVMDialect>(); 1041 context->loadDialect<DLTIDialect>(); 1042 OwningOpRef<ModuleOp> module(ModuleOp::create( 1043 FileLineColLoc::get(context, "", /*line=*/0, /*column=*/0))); 1044 1045 DataLayoutSpecInterface dlSpec = 1046 translateDataLayout(llvmModule->getDataLayout(), context); 1047 if (!dlSpec) { 1048 emitError(UnknownLoc::get(context), "can't translate data layout"); 1049 return {}; 1050 } 1051 1052 module.get()->setAttr(DLTIDialect::kDataLayoutAttrName, dlSpec); 1053 1054 Importer deserializer(context, module.get()); 1055 for (llvm::GlobalVariable &gv : llvmModule->globals()) { 1056 if (!deserializer.processGlobal(&gv)) 1057 return {}; 1058 } 1059 for (llvm::Function &f : llvmModule->functions()) { 1060 if (failed(deserializer.processFunction(&f))) 1061 return {}; 1062 } 1063 1064 return module; 1065 } 1066 1067 // Deserializes the LLVM bitcode stored in `input` into an MLIR module in the 1068 // LLVM dialect. 1069 OwningOpRef<ModuleOp> translateLLVMIRToModule(llvm::SourceMgr &sourceMgr, 1070 MLIRContext *context) { 1071 llvm::SMDiagnostic err; 1072 llvm::LLVMContext llvmContext; 1073 std::unique_ptr<llvm::Module> llvmModule = llvm::parseIR( 1074 *sourceMgr.getMemoryBuffer(sourceMgr.getMainFileID()), err, llvmContext); 1075 if (!llvmModule) { 1076 std::string errStr; 1077 llvm::raw_string_ostream errStream(errStr); 1078 err.print(/*ProgName=*/"", errStream); 1079 emitError(UnknownLoc::get(context)) << errStream.str(); 1080 return {}; 1081 } 1082 return translateLLVMIRToModule(std::move(llvmModule), context); 1083 } 1084 1085 namespace mlir { 1086 void registerFromLLVMIRTranslation() { 1087 TranslateToMLIRRegistration fromLLVM( 1088 "import-llvm", [](llvm::SourceMgr &sourceMgr, MLIRContext *context) { 1089 return ::translateLLVMIRToModule(sourceMgr, context); 1090 }); 1091 } 1092 } // namespace mlir 1093