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