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 auto *type = c->getType(); 351 FloatType floatTy; 352 if (type->isBFloatTy()) 353 floatTy = FloatType::getBF16(context); 354 else 355 floatTy = getDLFloatType(*context, type->getScalarSizeInBits()); 356 assert(floatTy && "unsupported floating point type"); 357 return b.getFloatAttr(floatTy, c->getValueAPF()); 358 } 359 if (auto *f = dyn_cast<llvm::Function>(value)) 360 return SymbolRefAttr::get(b.getContext(), f->getName()); 361 362 // Convert constant data to a dense elements attribute. 363 if (auto *cd = dyn_cast<llvm::ConstantDataSequential>(value)) { 364 Type type = processType(cd->getElementType()); 365 if (!type) 366 return nullptr; 367 368 auto attrType = getStdTypeForAttr(processType(cd->getType())) 369 .dyn_cast_or_null<ShapedType>(); 370 if (!attrType) 371 return nullptr; 372 373 if (type.isa<IntegerType>()) { 374 SmallVector<APInt, 8> values; 375 values.reserve(cd->getNumElements()); 376 for (unsigned i = 0, e = cd->getNumElements(); i < e; ++i) 377 values.push_back(cd->getElementAsAPInt(i)); 378 return DenseElementsAttr::get(attrType, values); 379 } 380 381 if (type.isa<Float32Type, Float64Type>()) { 382 SmallVector<APFloat, 8> values; 383 values.reserve(cd->getNumElements()); 384 for (unsigned i = 0, e = cd->getNumElements(); i < e; ++i) 385 values.push_back(cd->getElementAsAPFloat(i)); 386 return DenseElementsAttr::get(attrType, values); 387 } 388 389 return nullptr; 390 } 391 392 // Unpack constant aggregates to create dense elements attribute whenever 393 // possible. Return nullptr (failure) otherwise. 394 if (isa<llvm::ConstantAggregate>(value)) { 395 auto outerType = getStdTypeForAttr(processType(value->getType())) 396 .dyn_cast_or_null<ShapedType>(); 397 if (!outerType) 398 return nullptr; 399 400 SmallVector<Attribute, 8> values; 401 SmallVector<int64_t, 8> shape; 402 403 for (unsigned i = 0, e = value->getNumOperands(); i < e; ++i) { 404 auto nested = getConstantAsAttr(value->getAggregateElement(i)) 405 .dyn_cast_or_null<DenseElementsAttr>(); 406 if (!nested) 407 return nullptr; 408 409 values.append(nested.value_begin<Attribute>(), 410 nested.value_end<Attribute>()); 411 } 412 413 return DenseElementsAttr::get(outerType, values); 414 } 415 416 return nullptr; 417 } 418 419 GlobalOp Importer::processGlobal(llvm::GlobalVariable *gv) { 420 auto it = globals.find(gv); 421 if (it != globals.end()) 422 return it->second; 423 424 OpBuilder b(module.getBody(), getGlobalInsertPt()); 425 Attribute valueAttr; 426 if (gv->hasInitializer()) 427 valueAttr = getConstantAsAttr(gv->getInitializer()); 428 Type type = processType(gv->getValueType()); 429 if (!type) 430 return nullptr; 431 432 uint64_t alignment = 0; 433 llvm::MaybeAlign maybeAlign = gv->getAlign(); 434 if (maybeAlign.hasValue()) { 435 llvm::Align align = maybeAlign.getValue(); 436 alignment = align.value(); 437 } 438 439 GlobalOp op = b.create<GlobalOp>( 440 UnknownLoc::get(context), type, gv->isConstant(), 441 convertLinkageFromLLVM(gv->getLinkage()), gv->getName(), valueAttr, 442 alignment, /*addr_space=*/gv->getAddressSpace(), 443 /*dso_local=*/gv->isDSOLocal(), /*thread_local=*/gv->isThreadLocal()); 444 445 if (gv->hasInitializer() && !valueAttr) { 446 Region &r = op.getInitializerRegion(); 447 currentEntryBlock = b.createBlock(&r); 448 b.setInsertionPoint(currentEntryBlock, currentEntryBlock->begin()); 449 Value v = processConstant(gv->getInitializer()); 450 if (!v) 451 return nullptr; 452 b.create<ReturnOp>(op.getLoc(), ArrayRef<Value>({v})); 453 } 454 if (gv->hasAtLeastLocalUnnamedAddr()) 455 op.setUnnamedAddrAttr(UnnamedAddrAttr::get( 456 context, convertUnnamedAddrFromLLVM(gv->getUnnamedAddr()))); 457 if (gv->hasSection()) 458 op.setSectionAttr(b.getStringAttr(gv->getSection())); 459 460 return globals[gv] = op; 461 } 462 463 Value Importer::processConstant(llvm::Constant *c) { 464 OpBuilder bEntry(currentEntryBlock, currentEntryBlock->begin()); 465 if (Attribute attr = getConstantAsAttr(c)) { 466 // These constants can be represented as attributes. 467 OpBuilder b(currentEntryBlock, currentEntryBlock->begin()); 468 Type type = processType(c->getType()); 469 if (!type) 470 return nullptr; 471 if (auto symbolRef = attr.dyn_cast<FlatSymbolRefAttr>()) 472 return bEntry.create<AddressOfOp>(unknownLoc, type, symbolRef.getValue()); 473 return bEntry.create<ConstantOp>(unknownLoc, type, attr); 474 } 475 if (auto *cn = dyn_cast<llvm::ConstantPointerNull>(c)) { 476 Type type = processType(cn->getType()); 477 if (!type) 478 return nullptr; 479 return bEntry.create<NullOp>(unknownLoc, type); 480 } 481 if (auto *gv = dyn_cast<llvm::GlobalVariable>(c)) 482 return bEntry.create<AddressOfOp>(UnknownLoc::get(context), 483 processGlobal(gv)); 484 485 if (auto *ce = dyn_cast<llvm::ConstantExpr>(c)) { 486 llvm::Instruction *i = ce->getAsInstruction(); 487 OpBuilder::InsertionGuard guard(b); 488 b.setInsertionPoint(currentEntryBlock, currentEntryBlock->begin()); 489 if (failed(processInstruction(i))) 490 return nullptr; 491 assert(instMap.count(i)); 492 493 // If we don't remove entry of `i` here, it's totally possible that the 494 // next time llvm::ConstantExpr::getAsInstruction is called again, which 495 // always allocates a new Instruction, memory address of the newly 496 // created Instruction might be the same as `i`. Making processInstruction 497 // falsely believe that the new Instruction has been processed before 498 // and raised an assertion error. 499 Value value = instMap[i]; 500 instMap.erase(i); 501 // Remove this zombie LLVM instruction now, leaving us only with the MLIR 502 // op. 503 i->deleteValue(); 504 return value; 505 } 506 if (auto *ue = dyn_cast<llvm::UndefValue>(c)) { 507 Type type = processType(ue->getType()); 508 if (!type) 509 return nullptr; 510 return bEntry.create<UndefOp>(UnknownLoc::get(context), type); 511 } 512 513 if (isa<llvm::ConstantAggregate>(c) || isa<llvm::ConstantAggregateZero>(c)) { 514 unsigned numElements = c->getNumOperands(); 515 std::function<llvm::Constant *(unsigned)> getElement = 516 [&](unsigned index) -> llvm::Constant * { 517 return c->getAggregateElement(index); 518 }; 519 // llvm::ConstantAggregateZero doesn't take any operand 520 // so its getNumOperands is always zero. 521 if (auto *caz = dyn_cast<llvm::ConstantAggregateZero>(c)) { 522 numElements = caz->getElementCount().getFixedValue(); 523 // We want to capture the pointer rather than reference 524 // to the pointer since the latter will become dangling upon 525 // exiting the scope. 526 getElement = [=](unsigned index) -> llvm::Constant * { 527 return caz->getElementValue(index); 528 }; 529 } 530 531 // Generate a llvm.undef as the root value first. 532 Type rootType = processType(c->getType()); 533 if (!rootType) 534 return nullptr; 535 Value root = bEntry.create<UndefOp>(unknownLoc, rootType); 536 for (unsigned i = 0; i < numElements; ++i) { 537 llvm::Constant *element = getElement(i); 538 Value elementValue = processConstant(element); 539 if (!elementValue) 540 return nullptr; 541 ArrayAttr indexAttr = bEntry.getI32ArrayAttr({static_cast<int32_t>(i)}); 542 root = bEntry.create<InsertValueOp>(UnknownLoc::get(context), rootType, 543 root, elementValue, indexAttr); 544 } 545 return root; 546 } 547 548 emitError(unknownLoc) << "unhandled constant: " << diag(*c); 549 return nullptr; 550 } 551 552 Value Importer::processValue(llvm::Value *value) { 553 auto it = instMap.find(value); 554 if (it != instMap.end()) 555 return it->second; 556 557 // We don't expect to see instructions in dominator order. If we haven't seen 558 // this instruction yet, create an unknown op and remap it later. 559 if (isa<llvm::Instruction>(value)) { 560 Type type = processType(value->getType()); 561 if (!type) 562 return nullptr; 563 unknownInstMap[value] = 564 b.create(UnknownLoc::get(context), b.getStringAttr("llvm.unknown"), 565 /*operands=*/{}, type); 566 return unknownInstMap[value]->getResult(0); 567 } 568 569 if (auto *c = dyn_cast<llvm::Constant>(value)) 570 return processConstant(c); 571 572 emitError(unknownLoc) << "unhandled value: " << diag(*value); 573 return nullptr; 574 } 575 576 /// Return the MLIR OperationName for the given LLVM opcode. 577 static StringRef lookupOperationNameFromOpcode(unsigned opcode) { 578 // Maps from LLVM opcode to MLIR OperationName. This is deliberately ordered 579 // as in llvm/IR/Instructions.def to aid comprehension and spot missing 580 // instructions. 581 #define INST(llvm_n, mlir_n) \ 582 { llvm::Instruction::llvm_n, LLVM::mlir_n##Op::getOperationName() } 583 static const DenseMap<unsigned, StringRef> opcMap = { 584 // Ret is handled specially. 585 // Br is handled specially. 586 // Switch is handled specially. 587 // FIXME: indirectbr 588 // FIXME: invoke 589 INST(Resume, Resume), 590 // FIXME: unreachable 591 // FIXME: cleanupret 592 // FIXME: catchret 593 // FIXME: catchswitch 594 // FIXME: callbr 595 // FIXME: fneg 596 INST(Add, Add), INST(FAdd, FAdd), INST(Sub, Sub), INST(FSub, FSub), 597 INST(Mul, Mul), INST(FMul, FMul), INST(UDiv, UDiv), INST(SDiv, SDiv), 598 INST(FDiv, FDiv), INST(URem, URem), INST(SRem, SRem), INST(FRem, FRem), 599 INST(Shl, Shl), INST(LShr, LShr), INST(AShr, AShr), INST(And, And), 600 INST(Or, Or), INST(Xor, XOr), INST(Alloca, Alloca), INST(Load, Load), 601 INST(Store, Store), 602 // Getelementptr is handled specially. 603 INST(Ret, Return), INST(Fence, Fence), 604 // FIXME: atomiccmpxchg 605 // FIXME: atomicrmw 606 INST(Trunc, Trunc), INST(ZExt, ZExt), INST(SExt, SExt), 607 INST(FPToUI, FPToUI), INST(FPToSI, FPToSI), INST(UIToFP, UIToFP), 608 INST(SIToFP, SIToFP), INST(FPTrunc, FPTrunc), INST(FPExt, FPExt), 609 INST(PtrToInt, PtrToInt), INST(IntToPtr, IntToPtr), 610 INST(BitCast, Bitcast), INST(AddrSpaceCast, AddrSpaceCast), 611 // FIXME: cleanuppad 612 // FIXME: catchpad 613 // ICmp is handled specially. 614 // FCmp is handled specially. 615 // PHI is handled specially. 616 INST(Freeze, Freeze), INST(Call, Call), 617 // FIXME: select 618 // FIXME: vaarg 619 // FIXME: extractelement 620 // FIXME: insertelement 621 // FIXME: shufflevector 622 // FIXME: extractvalue 623 // FIXME: insertvalue 624 // FIXME: landingpad 625 }; 626 #undef INST 627 628 return opcMap.lookup(opcode); 629 } 630 631 static ICmpPredicate getICmpPredicate(llvm::CmpInst::Predicate p) { 632 switch (p) { 633 default: 634 llvm_unreachable("incorrect comparison predicate"); 635 case llvm::CmpInst::Predicate::ICMP_EQ: 636 return LLVM::ICmpPredicate::eq; 637 case llvm::CmpInst::Predicate::ICMP_NE: 638 return LLVM::ICmpPredicate::ne; 639 case llvm::CmpInst::Predicate::ICMP_SLT: 640 return LLVM::ICmpPredicate::slt; 641 case llvm::CmpInst::Predicate::ICMP_SLE: 642 return LLVM::ICmpPredicate::sle; 643 case llvm::CmpInst::Predicate::ICMP_SGT: 644 return LLVM::ICmpPredicate::sgt; 645 case llvm::CmpInst::Predicate::ICMP_SGE: 646 return LLVM::ICmpPredicate::sge; 647 case llvm::CmpInst::Predicate::ICMP_ULT: 648 return LLVM::ICmpPredicate::ult; 649 case llvm::CmpInst::Predicate::ICMP_ULE: 650 return LLVM::ICmpPredicate::ule; 651 case llvm::CmpInst::Predicate::ICMP_UGT: 652 return LLVM::ICmpPredicate::ugt; 653 case llvm::CmpInst::Predicate::ICMP_UGE: 654 return LLVM::ICmpPredicate::uge; 655 } 656 llvm_unreachable("incorrect integer comparison predicate"); 657 } 658 659 static FCmpPredicate getFCmpPredicate(llvm::CmpInst::Predicate p) { 660 switch (p) { 661 default: 662 llvm_unreachable("incorrect comparison predicate"); 663 case llvm::CmpInst::Predicate::FCMP_FALSE: 664 return LLVM::FCmpPredicate::_false; 665 case llvm::CmpInst::Predicate::FCMP_TRUE: 666 return LLVM::FCmpPredicate::_true; 667 case llvm::CmpInst::Predicate::FCMP_OEQ: 668 return LLVM::FCmpPredicate::oeq; 669 case llvm::CmpInst::Predicate::FCMP_ONE: 670 return LLVM::FCmpPredicate::one; 671 case llvm::CmpInst::Predicate::FCMP_OLT: 672 return LLVM::FCmpPredicate::olt; 673 case llvm::CmpInst::Predicate::FCMP_OLE: 674 return LLVM::FCmpPredicate::ole; 675 case llvm::CmpInst::Predicate::FCMP_OGT: 676 return LLVM::FCmpPredicate::ogt; 677 case llvm::CmpInst::Predicate::FCMP_OGE: 678 return LLVM::FCmpPredicate::oge; 679 case llvm::CmpInst::Predicate::FCMP_ORD: 680 return LLVM::FCmpPredicate::ord; 681 case llvm::CmpInst::Predicate::FCMP_ULT: 682 return LLVM::FCmpPredicate::ult; 683 case llvm::CmpInst::Predicate::FCMP_ULE: 684 return LLVM::FCmpPredicate::ule; 685 case llvm::CmpInst::Predicate::FCMP_UGT: 686 return LLVM::FCmpPredicate::ugt; 687 case llvm::CmpInst::Predicate::FCMP_UGE: 688 return LLVM::FCmpPredicate::uge; 689 case llvm::CmpInst::Predicate::FCMP_UNO: 690 return LLVM::FCmpPredicate::uno; 691 case llvm::CmpInst::Predicate::FCMP_UEQ: 692 return LLVM::FCmpPredicate::ueq; 693 case llvm::CmpInst::Predicate::FCMP_UNE: 694 return LLVM::FCmpPredicate::une; 695 } 696 llvm_unreachable("incorrect floating point comparison predicate"); 697 } 698 699 static AtomicOrdering getLLVMAtomicOrdering(llvm::AtomicOrdering ordering) { 700 switch (ordering) { 701 case llvm::AtomicOrdering::NotAtomic: 702 return LLVM::AtomicOrdering::not_atomic; 703 case llvm::AtomicOrdering::Unordered: 704 return LLVM::AtomicOrdering::unordered; 705 case llvm::AtomicOrdering::Monotonic: 706 return LLVM::AtomicOrdering::monotonic; 707 case llvm::AtomicOrdering::Acquire: 708 return LLVM::AtomicOrdering::acquire; 709 case llvm::AtomicOrdering::Release: 710 return LLVM::AtomicOrdering::release; 711 case llvm::AtomicOrdering::AcquireRelease: 712 return LLVM::AtomicOrdering::acq_rel; 713 case llvm::AtomicOrdering::SequentiallyConsistent: 714 return LLVM::AtomicOrdering::seq_cst; 715 } 716 llvm_unreachable("incorrect atomic ordering"); 717 } 718 719 // `br` branches to `target`. Return the branch arguments to `br`, in the 720 // same order of the PHIs in `target`. 721 LogicalResult 722 Importer::processBranchArgs(llvm::Instruction *br, llvm::BasicBlock *target, 723 SmallVectorImpl<Value> &blockArguments) { 724 for (auto inst = target->begin(); isa<llvm::PHINode>(inst); ++inst) { 725 auto *pn = cast<llvm::PHINode>(&*inst); 726 Value value = processValue(pn->getIncomingValueForBlock(br->getParent())); 727 if (!value) 728 return failure(); 729 blockArguments.push_back(value); 730 } 731 return success(); 732 } 733 734 LogicalResult Importer::processInstruction(llvm::Instruction *inst) { 735 // FIXME: Support uses of SubtargetData. Currently inbounds GEPs, fast-math 736 // flags and call / operand attributes are not supported. 737 Location loc = processDebugLoc(inst->getDebugLoc(), inst); 738 Value &v = instMap[inst]; 739 assert(!v && "processInstruction must be called only once per instruction!"); 740 switch (inst->getOpcode()) { 741 default: 742 return emitError(loc) << "unknown instruction: " << diag(*inst); 743 case llvm::Instruction::Add: 744 case llvm::Instruction::FAdd: 745 case llvm::Instruction::Sub: 746 case llvm::Instruction::FSub: 747 case llvm::Instruction::Mul: 748 case llvm::Instruction::FMul: 749 case llvm::Instruction::UDiv: 750 case llvm::Instruction::SDiv: 751 case llvm::Instruction::FDiv: 752 case llvm::Instruction::URem: 753 case llvm::Instruction::SRem: 754 case llvm::Instruction::FRem: 755 case llvm::Instruction::Shl: 756 case llvm::Instruction::LShr: 757 case llvm::Instruction::AShr: 758 case llvm::Instruction::And: 759 case llvm::Instruction::Or: 760 case llvm::Instruction::Xor: 761 case llvm::Instruction::Load: 762 case llvm::Instruction::Store: 763 case llvm::Instruction::Ret: 764 case llvm::Instruction::Resume: 765 case llvm::Instruction::Trunc: 766 case llvm::Instruction::ZExt: 767 case llvm::Instruction::SExt: 768 case llvm::Instruction::FPToUI: 769 case llvm::Instruction::FPToSI: 770 case llvm::Instruction::UIToFP: 771 case llvm::Instruction::SIToFP: 772 case llvm::Instruction::FPTrunc: 773 case llvm::Instruction::FPExt: 774 case llvm::Instruction::PtrToInt: 775 case llvm::Instruction::IntToPtr: 776 case llvm::Instruction::AddrSpaceCast: 777 case llvm::Instruction::Freeze: 778 case llvm::Instruction::BitCast: { 779 OperationState state(loc, lookupOperationNameFromOpcode(inst->getOpcode())); 780 SmallVector<Value, 4> ops; 781 ops.reserve(inst->getNumOperands()); 782 for (auto *op : inst->operand_values()) { 783 Value value = processValue(op); 784 if (!value) 785 return failure(); 786 ops.push_back(value); 787 } 788 state.addOperands(ops); 789 if (!inst->getType()->isVoidTy()) { 790 Type type = processType(inst->getType()); 791 if (!type) 792 return failure(); 793 state.addTypes(type); 794 } 795 Operation *op = b.create(state); 796 if (!inst->getType()->isVoidTy()) 797 v = op->getResult(0); 798 return success(); 799 } 800 case llvm::Instruction::Alloca: { 801 Value size = processValue(inst->getOperand(0)); 802 if (!size) 803 return failure(); 804 805 auto *allocaInst = cast<llvm::AllocaInst>(inst); 806 v = b.create<AllocaOp>(loc, processType(inst->getType()), 807 processType(allocaInst->getAllocatedType()), size, 808 allocaInst->getAlign().value()); 809 return success(); 810 } 811 case llvm::Instruction::ICmp: { 812 Value lhs = processValue(inst->getOperand(0)); 813 Value rhs = processValue(inst->getOperand(1)); 814 if (!lhs || !rhs) 815 return failure(); 816 v = b.create<ICmpOp>( 817 loc, getICmpPredicate(cast<llvm::ICmpInst>(inst)->getPredicate()), lhs, 818 rhs); 819 return success(); 820 } 821 case llvm::Instruction::FCmp: { 822 Value lhs = processValue(inst->getOperand(0)); 823 Value rhs = processValue(inst->getOperand(1)); 824 if (!lhs || !rhs) 825 return failure(); 826 instMap[inst] = b.create<FCmpOp>( 827 loc, b.getI1Type(), 828 getFCmpPredicate(cast<llvm::FCmpInst>(inst)->getPredicate()), lhs, rhs); 829 return success(); 830 } 831 case llvm::Instruction::Br: { 832 auto *brInst = cast<llvm::BranchInst>(inst); 833 OperationState state(loc, 834 brInst->isConditional() ? "llvm.cond_br" : "llvm.br"); 835 if (brInst->isConditional()) { 836 Value condition = processValue(brInst->getCondition()); 837 if (!condition) 838 return failure(); 839 state.addOperands(condition); 840 } 841 842 std::array<int32_t, 3> operandSegmentSizes = {1, 0, 0}; 843 for (int i : llvm::seq<int>(0, brInst->getNumSuccessors())) { 844 auto *succ = brInst->getSuccessor(i); 845 SmallVector<Value, 4> blockArguments; 846 if (failed(processBranchArgs(brInst, succ, blockArguments))) 847 return failure(); 848 state.addSuccessors(blocks[succ]); 849 state.addOperands(blockArguments); 850 operandSegmentSizes[i + 1] = blockArguments.size(); 851 } 852 853 if (brInst->isConditional()) { 854 state.addAttribute(LLVM::CondBrOp::getOperandSegmentSizeAttr(), 855 b.getI32VectorAttr(operandSegmentSizes)); 856 } 857 858 b.create(state); 859 return success(); 860 } 861 case llvm::Instruction::Switch: { 862 auto *swInst = cast<llvm::SwitchInst>(inst); 863 // Process the condition value. 864 Value condition = processValue(swInst->getCondition()); 865 if (!condition) 866 return failure(); 867 868 SmallVector<Value> defaultBlockArgs; 869 // Process the default case. 870 llvm::BasicBlock *defaultBB = swInst->getDefaultDest(); 871 if (failed(processBranchArgs(swInst, defaultBB, defaultBlockArgs))) 872 return failure(); 873 874 // Process the cases. 875 unsigned numCases = swInst->getNumCases(); 876 SmallVector<SmallVector<Value>> caseOperands(numCases); 877 SmallVector<ValueRange> caseOperandRefs(numCases); 878 SmallVector<int32_t> caseValues(numCases); 879 SmallVector<Block *> caseBlocks(numCases); 880 for (const auto &en : llvm::enumerate(swInst->cases())) { 881 const llvm::SwitchInst::CaseHandle &caseHandle = en.value(); 882 unsigned i = en.index(); 883 llvm::BasicBlock *succBB = caseHandle.getCaseSuccessor(); 884 if (failed(processBranchArgs(swInst, succBB, caseOperands[i]))) 885 return failure(); 886 caseOperandRefs[i] = caseOperands[i]; 887 caseValues[i] = caseHandle.getCaseValue()->getSExtValue(); 888 caseBlocks[i] = blocks[succBB]; 889 } 890 891 b.create<SwitchOp>(loc, condition, blocks[defaultBB], defaultBlockArgs, 892 caseValues, caseBlocks, caseOperandRefs); 893 return success(); 894 } 895 case llvm::Instruction::PHI: { 896 Type type = processType(inst->getType()); 897 if (!type) 898 return failure(); 899 v = b.getInsertionBlock()->addArgument( 900 type, processDebugLoc(inst->getDebugLoc(), inst)); 901 return success(); 902 } 903 case llvm::Instruction::Call: { 904 llvm::CallInst *ci = cast<llvm::CallInst>(inst); 905 SmallVector<Value, 4> ops; 906 ops.reserve(inst->getNumOperands()); 907 for (auto &op : ci->args()) { 908 Value arg = processValue(op.get()); 909 if (!arg) 910 return failure(); 911 ops.push_back(arg); 912 } 913 914 SmallVector<Type, 2> tys; 915 if (!ci->getType()->isVoidTy()) { 916 Type type = processType(inst->getType()); 917 if (!type) 918 return failure(); 919 tys.push_back(type); 920 } 921 Operation *op; 922 if (llvm::Function *callee = ci->getCalledFunction()) { 923 op = b.create<CallOp>( 924 loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops); 925 } else { 926 Value calledValue = processValue(ci->getCalledOperand()); 927 if (!calledValue) 928 return failure(); 929 ops.insert(ops.begin(), calledValue); 930 op = b.create<CallOp>(loc, tys, ops); 931 } 932 if (!ci->getType()->isVoidTy()) 933 v = op->getResult(0); 934 return success(); 935 } 936 case llvm::Instruction::LandingPad: { 937 llvm::LandingPadInst *lpi = cast<llvm::LandingPadInst>(inst); 938 SmallVector<Value, 4> ops; 939 940 for (unsigned i = 0, ie = lpi->getNumClauses(); i < ie; i++) 941 ops.push_back(processConstant(lpi->getClause(i))); 942 943 Type ty = processType(lpi->getType()); 944 if (!ty) 945 return failure(); 946 947 v = b.create<LandingpadOp>(loc, ty, lpi->isCleanup(), ops); 948 return success(); 949 } 950 case llvm::Instruction::Invoke: { 951 llvm::InvokeInst *ii = cast<llvm::InvokeInst>(inst); 952 953 SmallVector<Type, 2> tys; 954 if (!ii->getType()->isVoidTy()) 955 tys.push_back(processType(inst->getType())); 956 957 SmallVector<Value, 4> ops; 958 ops.reserve(inst->getNumOperands() + 1); 959 for (auto &op : ii->args()) 960 ops.push_back(processValue(op.get())); 961 962 SmallVector<Value, 4> normalArgs, unwindArgs; 963 (void)processBranchArgs(ii, ii->getNormalDest(), normalArgs); 964 (void)processBranchArgs(ii, ii->getUnwindDest(), unwindArgs); 965 966 Operation *op; 967 if (llvm::Function *callee = ii->getCalledFunction()) { 968 op = b.create<InvokeOp>( 969 loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops, 970 blocks[ii->getNormalDest()], normalArgs, blocks[ii->getUnwindDest()], 971 unwindArgs); 972 } else { 973 ops.insert(ops.begin(), processValue(ii->getCalledOperand())); 974 op = b.create<InvokeOp>(loc, tys, ops, blocks[ii->getNormalDest()], 975 normalArgs, blocks[ii->getUnwindDest()], 976 unwindArgs); 977 } 978 979 if (!ii->getType()->isVoidTy()) 980 v = op->getResult(0); 981 return success(); 982 } 983 case llvm::Instruction::Fence: { 984 StringRef syncscope; 985 SmallVector<StringRef, 4> ssNs; 986 llvm::LLVMContext &llvmContext = inst->getContext(); 987 llvm::FenceInst *fence = cast<llvm::FenceInst>(inst); 988 llvmContext.getSyncScopeNames(ssNs); 989 int fenceSyncScopeID = fence->getSyncScopeID(); 990 for (unsigned i = 0, e = ssNs.size(); i != e; i++) { 991 if (fenceSyncScopeID == llvmContext.getOrInsertSyncScopeID(ssNs[i])) { 992 syncscope = ssNs[i]; 993 break; 994 } 995 } 996 b.create<FenceOp>(loc, getLLVMAtomicOrdering(fence->getOrdering()), 997 syncscope); 998 return success(); 999 } 1000 case llvm::Instruction::GetElementPtr: { 1001 // FIXME: Support inbounds GEPs. 1002 llvm::GetElementPtrInst *gep = cast<llvm::GetElementPtrInst>(inst); 1003 Value basePtr = processValue(gep->getOperand(0)); 1004 SmallVector<int32_t> staticIndices; 1005 SmallVector<Value> dynamicIndices; 1006 Type sourceElementType = processType(gep->getSourceElementType()); 1007 SmallVector<unsigned> staticIndexPositions; 1008 GEPOp::findKnownStructIndices(sourceElementType, staticIndexPositions); 1009 1010 for (const auto &en : 1011 llvm::enumerate(llvm::drop_begin(gep->operand_values()))) { 1012 llvm::Value *operand = en.value(); 1013 if (llvm::find(staticIndexPositions, en.index()) == 1014 staticIndexPositions.end()) { 1015 staticIndices.push_back(GEPOp::kDynamicIndex); 1016 dynamicIndices.push_back(processValue(operand)); 1017 if (!dynamicIndices.back()) 1018 return failure(); 1019 } else { 1020 auto *constantInt = cast<llvm::ConstantInt>(operand); 1021 staticIndices.push_back( 1022 static_cast<int32_t>(constantInt->getValue().getZExtValue())); 1023 } 1024 } 1025 1026 Type type = processType(inst->getType()); 1027 if (!type) 1028 return failure(); 1029 v = b.create<GEPOp>(loc, type, sourceElementType, basePtr, dynamicIndices, 1030 staticIndices); 1031 return success(); 1032 } 1033 } 1034 } 1035 1036 FlatSymbolRefAttr Importer::getPersonalityAsAttr(llvm::Function *f) { 1037 if (!f->hasPersonalityFn()) 1038 return nullptr; 1039 1040 llvm::Constant *pf = f->getPersonalityFn(); 1041 1042 // If it directly has a name, we can use it. 1043 if (pf->hasName()) 1044 return SymbolRefAttr::get(b.getContext(), pf->getName()); 1045 1046 // If it doesn't have a name, currently, only function pointers that are 1047 // bitcast to i8* are parsed. 1048 if (auto *ce = dyn_cast<llvm::ConstantExpr>(pf)) { 1049 if (ce->getOpcode() == llvm::Instruction::BitCast && 1050 ce->getType() == llvm::Type::getInt8PtrTy(f->getContext())) { 1051 if (auto *func = dyn_cast<llvm::Function>(ce->getOperand(0))) 1052 return SymbolRefAttr::get(b.getContext(), func->getName()); 1053 } 1054 } 1055 return FlatSymbolRefAttr(); 1056 } 1057 1058 LogicalResult Importer::processFunction(llvm::Function *f) { 1059 blocks.clear(); 1060 instMap.clear(); 1061 unknownInstMap.clear(); 1062 1063 auto functionType = 1064 processType(f->getFunctionType()).dyn_cast<LLVMFunctionType>(); 1065 if (!functionType) 1066 return failure(); 1067 1068 b.setInsertionPoint(module.getBody(), getFuncInsertPt()); 1069 LLVMFuncOp fop = 1070 b.create<LLVMFuncOp>(UnknownLoc::get(context), f->getName(), functionType, 1071 convertLinkageFromLLVM(f->getLinkage())); 1072 1073 if (FlatSymbolRefAttr personality = getPersonalityAsAttr(f)) 1074 fop->setAttr(b.getStringAttr("personality"), personality); 1075 else if (f->hasPersonalityFn()) 1076 emitWarning(UnknownLoc::get(context), 1077 "could not deduce personality, skipping it"); 1078 1079 if (f->hasGC()) 1080 fop.setGarbageCollectorAttr(b.getStringAttr(f->getGC())); 1081 1082 if (f->isDeclaration()) 1083 return success(); 1084 1085 // Eagerly create all blocks. 1086 SmallVector<Block *, 4> blockList; 1087 for (llvm::BasicBlock &bb : *f) { 1088 blockList.push_back(b.createBlock(&fop.getBody(), fop.getBody().end())); 1089 blocks[&bb] = blockList.back(); 1090 } 1091 currentEntryBlock = blockList[0]; 1092 1093 // Add function arguments to the entry block. 1094 for (const auto &kv : llvm::enumerate(f->args())) { 1095 instMap[&kv.value()] = blockList[0]->addArgument( 1096 functionType.getParamType(kv.index()), fop.getLoc()); 1097 } 1098 1099 for (auto bbs : llvm::zip(*f, blockList)) { 1100 if (failed(processBasicBlock(&std::get<0>(bbs), std::get<1>(bbs)))) 1101 return failure(); 1102 } 1103 1104 // Now that all instructions are guaranteed to have been visited, ensure 1105 // any unknown uses we encountered are remapped. 1106 for (auto &llvmAndUnknown : unknownInstMap) { 1107 assert(instMap.count(llvmAndUnknown.first)); 1108 Value newValue = instMap[llvmAndUnknown.first]; 1109 Value oldValue = llvmAndUnknown.second->getResult(0); 1110 oldValue.replaceAllUsesWith(newValue); 1111 llvmAndUnknown.second->erase(); 1112 } 1113 return success(); 1114 } 1115 1116 LogicalResult Importer::processBasicBlock(llvm::BasicBlock *bb, Block *block) { 1117 b.setInsertionPointToStart(block); 1118 for (llvm::Instruction &inst : *bb) { 1119 if (failed(processInstruction(&inst))) 1120 return failure(); 1121 } 1122 return success(); 1123 } 1124 1125 OwningOpRef<ModuleOp> 1126 mlir::translateLLVMIRToModule(std::unique_ptr<llvm::Module> llvmModule, 1127 MLIRContext *context) { 1128 context->loadDialect<LLVMDialect>(); 1129 context->loadDialect<DLTIDialect>(); 1130 OwningOpRef<ModuleOp> module(ModuleOp::create( 1131 FileLineColLoc::get(context, "", /*line=*/0, /*column=*/0))); 1132 1133 DataLayoutSpecInterface dlSpec = 1134 translateDataLayout(llvmModule->getDataLayout(), context); 1135 if (!dlSpec) { 1136 emitError(UnknownLoc::get(context), "can't translate data layout"); 1137 return {}; 1138 } 1139 1140 module.get()->setAttr(DLTIDialect::kDataLayoutAttrName, dlSpec); 1141 1142 Importer deserializer(context, module.get()); 1143 for (llvm::GlobalVariable &gv : llvmModule->globals()) { 1144 if (!deserializer.processGlobal(&gv)) 1145 return {}; 1146 } 1147 for (llvm::Function &f : llvmModule->functions()) { 1148 if (failed(deserializer.processFunction(&f))) 1149 return {}; 1150 } 1151 1152 return module; 1153 } 1154 1155 // Deserializes the LLVM bitcode stored in `input` into an MLIR module in the 1156 // LLVM dialect. 1157 OwningOpRef<ModuleOp> translateLLVMIRToModule(llvm::SourceMgr &sourceMgr, 1158 MLIRContext *context) { 1159 llvm::SMDiagnostic err; 1160 llvm::LLVMContext llvmContext; 1161 std::unique_ptr<llvm::Module> llvmModule = llvm::parseIR( 1162 *sourceMgr.getMemoryBuffer(sourceMgr.getMainFileID()), err, llvmContext); 1163 if (!llvmModule) { 1164 std::string errStr; 1165 llvm::raw_string_ostream errStream(errStr); 1166 err.print(/*ProgName=*/"", errStream); 1167 emitError(UnknownLoc::get(context)) << errStream.str(); 1168 return {}; 1169 } 1170 return translateLLVMIRToModule(std::move(llvmModule), context); 1171 } 1172 1173 namespace mlir { 1174 void registerFromLLVMIRTranslation() { 1175 TranslateToMLIRRegistration fromLLVM( 1176 "import-llvm", [](llvm::SourceMgr &sourceMgr, MLIRContext *context) { 1177 return ::translateLLVMIRToModule(sourceMgr, context); 1178 }); 1179 } 1180 } // namespace mlir 1181