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 // ShuffleVector is handled specially. 622 // InsertValue is handled specially. 623 // ExtractValue is handled specially. 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 assert(!instMap.count(inst) && 739 "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 instMap[inst] = 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 instMap[inst] = 807 b.create<AllocaOp>(loc, processType(inst->getType()), 808 processType(allocaInst->getAllocatedType()), size, 809 allocaInst->getAlign().value()); 810 return success(); 811 } 812 case llvm::Instruction::ICmp: { 813 Value lhs = processValue(inst->getOperand(0)); 814 Value rhs = processValue(inst->getOperand(1)); 815 if (!lhs || !rhs) 816 return failure(); 817 instMap[inst] = b.create<ICmpOp>( 818 loc, getICmpPredicate(cast<llvm::ICmpInst>(inst)->getPredicate()), lhs, 819 rhs); 820 return success(); 821 } 822 case llvm::Instruction::FCmp: { 823 Value lhs = processValue(inst->getOperand(0)); 824 Value rhs = processValue(inst->getOperand(1)); 825 if (!lhs || !rhs) 826 return failure(); 827 instMap[inst] = b.create<FCmpOp>( 828 loc, b.getI1Type(), 829 getFCmpPredicate(cast<llvm::FCmpInst>(inst)->getPredicate()), lhs, rhs); 830 return success(); 831 } 832 case llvm::Instruction::Br: { 833 auto *brInst = cast<llvm::BranchInst>(inst); 834 OperationState state(loc, 835 brInst->isConditional() ? "llvm.cond_br" : "llvm.br"); 836 if (brInst->isConditional()) { 837 Value condition = processValue(brInst->getCondition()); 838 if (!condition) 839 return failure(); 840 state.addOperands(condition); 841 } 842 843 std::array<int32_t, 3> operandSegmentSizes = {1, 0, 0}; 844 for (int i : llvm::seq<int>(0, brInst->getNumSuccessors())) { 845 auto *succ = brInst->getSuccessor(i); 846 SmallVector<Value, 4> blockArguments; 847 if (failed(processBranchArgs(brInst, succ, blockArguments))) 848 return failure(); 849 state.addSuccessors(blocks[succ]); 850 state.addOperands(blockArguments); 851 operandSegmentSizes[i + 1] = blockArguments.size(); 852 } 853 854 if (brInst->isConditional()) { 855 state.addAttribute(LLVM::CondBrOp::getOperandSegmentSizeAttr(), 856 b.getI32VectorAttr(operandSegmentSizes)); 857 } 858 859 b.create(state); 860 return success(); 861 } 862 case llvm::Instruction::Switch: { 863 auto *swInst = cast<llvm::SwitchInst>(inst); 864 // Process the condition value. 865 Value condition = processValue(swInst->getCondition()); 866 if (!condition) 867 return failure(); 868 869 SmallVector<Value> defaultBlockArgs; 870 // Process the default case. 871 llvm::BasicBlock *defaultBB = swInst->getDefaultDest(); 872 if (failed(processBranchArgs(swInst, defaultBB, defaultBlockArgs))) 873 return failure(); 874 875 // Process the cases. 876 unsigned numCases = swInst->getNumCases(); 877 SmallVector<SmallVector<Value>> caseOperands(numCases); 878 SmallVector<ValueRange> caseOperandRefs(numCases); 879 SmallVector<int32_t> caseValues(numCases); 880 SmallVector<Block *> caseBlocks(numCases); 881 for (const auto &en : llvm::enumerate(swInst->cases())) { 882 const llvm::SwitchInst::CaseHandle &caseHandle = en.value(); 883 unsigned i = en.index(); 884 llvm::BasicBlock *succBB = caseHandle.getCaseSuccessor(); 885 if (failed(processBranchArgs(swInst, succBB, caseOperands[i]))) 886 return failure(); 887 caseOperandRefs[i] = caseOperands[i]; 888 caseValues[i] = caseHandle.getCaseValue()->getSExtValue(); 889 caseBlocks[i] = blocks[succBB]; 890 } 891 892 b.create<SwitchOp>(loc, condition, blocks[defaultBB], defaultBlockArgs, 893 caseValues, caseBlocks, caseOperandRefs); 894 return success(); 895 } 896 case llvm::Instruction::PHI: { 897 Type type = processType(inst->getType()); 898 if (!type) 899 return failure(); 900 instMap[inst] = b.getInsertionBlock()->addArgument( 901 type, processDebugLoc(inst->getDebugLoc(), inst)); 902 return success(); 903 } 904 case llvm::Instruction::Call: { 905 llvm::CallInst *ci = cast<llvm::CallInst>(inst); 906 SmallVector<Value, 4> ops; 907 ops.reserve(inst->getNumOperands()); 908 for (auto &op : ci->args()) { 909 Value arg = processValue(op.get()); 910 if (!arg) 911 return failure(); 912 ops.push_back(arg); 913 } 914 915 SmallVector<Type, 2> tys; 916 if (!ci->getType()->isVoidTy()) { 917 Type type = processType(inst->getType()); 918 if (!type) 919 return failure(); 920 tys.push_back(type); 921 } 922 Operation *op; 923 if (llvm::Function *callee = ci->getCalledFunction()) { 924 op = b.create<CallOp>( 925 loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops); 926 } else { 927 Value calledValue = processValue(ci->getCalledOperand()); 928 if (!calledValue) 929 return failure(); 930 ops.insert(ops.begin(), calledValue); 931 op = b.create<CallOp>(loc, tys, ops); 932 } 933 if (!ci->getType()->isVoidTy()) 934 instMap[inst] = op->getResult(0); 935 return success(); 936 } 937 case llvm::Instruction::LandingPad: { 938 llvm::LandingPadInst *lpi = cast<llvm::LandingPadInst>(inst); 939 SmallVector<Value, 4> ops; 940 941 for (unsigned i = 0, ie = lpi->getNumClauses(); i < ie; i++) 942 ops.push_back(processConstant(lpi->getClause(i))); 943 944 Type ty = processType(lpi->getType()); 945 if (!ty) 946 return failure(); 947 948 instMap[inst] = b.create<LandingpadOp>(loc, ty, lpi->isCleanup(), ops); 949 return success(); 950 } 951 case llvm::Instruction::Invoke: { 952 llvm::InvokeInst *ii = cast<llvm::InvokeInst>(inst); 953 954 SmallVector<Type, 2> tys; 955 if (!ii->getType()->isVoidTy()) 956 tys.push_back(processType(inst->getType())); 957 958 SmallVector<Value, 4> ops; 959 ops.reserve(inst->getNumOperands() + 1); 960 for (auto &op : ii->args()) 961 ops.push_back(processValue(op.get())); 962 963 SmallVector<Value, 4> normalArgs, unwindArgs; 964 (void)processBranchArgs(ii, ii->getNormalDest(), normalArgs); 965 (void)processBranchArgs(ii, ii->getUnwindDest(), unwindArgs); 966 967 Operation *op; 968 if (llvm::Function *callee = ii->getCalledFunction()) { 969 op = b.create<InvokeOp>( 970 loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops, 971 blocks[ii->getNormalDest()], normalArgs, blocks[ii->getUnwindDest()], 972 unwindArgs); 973 } else { 974 ops.insert(ops.begin(), processValue(ii->getCalledOperand())); 975 op = b.create<InvokeOp>(loc, tys, ops, blocks[ii->getNormalDest()], 976 normalArgs, blocks[ii->getUnwindDest()], 977 unwindArgs); 978 } 979 980 if (!ii->getType()->isVoidTy()) 981 instMap[inst] = op->getResult(0); 982 return success(); 983 } 984 case llvm::Instruction::Fence: { 985 StringRef syncscope; 986 SmallVector<StringRef, 4> ssNs; 987 llvm::LLVMContext &llvmContext = inst->getContext(); 988 llvm::FenceInst *fence = cast<llvm::FenceInst>(inst); 989 llvmContext.getSyncScopeNames(ssNs); 990 int fenceSyncScopeID = fence->getSyncScopeID(); 991 for (unsigned i = 0, e = ssNs.size(); i != e; i++) { 992 if (fenceSyncScopeID == llvmContext.getOrInsertSyncScopeID(ssNs[i])) { 993 syncscope = ssNs[i]; 994 break; 995 } 996 } 997 b.create<FenceOp>(loc, getLLVMAtomicOrdering(fence->getOrdering()), 998 syncscope); 999 return success(); 1000 } 1001 case llvm::Instruction::GetElementPtr: { 1002 // FIXME: Support inbounds GEPs. 1003 llvm::GetElementPtrInst *gep = cast<llvm::GetElementPtrInst>(inst); 1004 Value basePtr = processValue(gep->getOperand(0)); 1005 SmallVector<int32_t> staticIndices; 1006 SmallVector<Value> dynamicIndices; 1007 Type sourceElementType = processType(gep->getSourceElementType()); 1008 SmallVector<unsigned> staticIndexPositions; 1009 GEPOp::findKnownStructIndices(sourceElementType, staticIndexPositions); 1010 1011 for (const auto &en : 1012 llvm::enumerate(llvm::drop_begin(gep->operand_values()))) { 1013 llvm::Value *operand = en.value(); 1014 if (llvm::find(staticIndexPositions, en.index()) == 1015 staticIndexPositions.end()) { 1016 staticIndices.push_back(GEPOp::kDynamicIndex); 1017 dynamicIndices.push_back(processValue(operand)); 1018 if (!dynamicIndices.back()) 1019 return failure(); 1020 } else { 1021 auto *constantInt = cast<llvm::ConstantInt>(operand); 1022 staticIndices.push_back( 1023 static_cast<int32_t>(constantInt->getValue().getZExtValue())); 1024 } 1025 } 1026 1027 Type type = processType(inst->getType()); 1028 if (!type) 1029 return failure(); 1030 instMap[inst] = b.create<GEPOp>(loc, type, sourceElementType, basePtr, 1031 dynamicIndices, staticIndices); 1032 return success(); 1033 } 1034 case llvm::Instruction::InsertValue: { 1035 auto *ivInst = cast<llvm::InsertValueInst>(inst); 1036 Value inserted = processValue(ivInst->getInsertedValueOperand()); 1037 if (!inserted) 1038 return failure(); 1039 Value aggOperand = processValue(ivInst->getAggregateOperand()); 1040 if (!aggOperand) 1041 return failure(); 1042 1043 SmallVector<int32_t> idxValues; 1044 for (unsigned idx : ivInst->getIndices()) 1045 idxValues.push_back(static_cast<int32_t>(idx)); 1046 ArrayAttr indices = b.getI32ArrayAttr(idxValues); 1047 1048 instMap[inst] = b.create<InsertValueOp>(loc, aggOperand, inserted, indices); 1049 return success(); 1050 } 1051 case llvm::Instruction::ExtractValue: { 1052 auto *evInst = cast<llvm::ExtractValueInst>(inst); 1053 Value aggOperand = processValue(evInst->getAggregateOperand()); 1054 if (!aggOperand) 1055 return failure(); 1056 1057 Type type = processType(inst->getType()); 1058 if (!type) 1059 return failure(); 1060 1061 SmallVector<int32_t> idxValues; 1062 for (unsigned idx : evInst->getIndices()) 1063 idxValues.push_back(static_cast<int32_t>(idx)); 1064 ArrayAttr indices = b.getI32ArrayAttr(idxValues); 1065 1066 instMap[inst] = b.create<ExtractValueOp>(loc, type, aggOperand, indices); 1067 return success(); 1068 } 1069 case llvm::Instruction::ShuffleVector: { 1070 auto *svInst = cast<llvm::ShuffleVectorInst>(inst); 1071 Value vec1 = processValue(svInst->getOperand(0)); 1072 if (!vec1) 1073 return failure(); 1074 Value vec2 = processValue(svInst->getOperand(1)); 1075 if (!vec2) 1076 return failure(); 1077 1078 ArrayAttr mask = b.getI32ArrayAttr(svInst->getShuffleMask()); 1079 1080 instMap[inst] = b.create<ShuffleVectorOp>(loc, vec1, vec2, mask); 1081 return success(); 1082 } 1083 } 1084 } 1085 1086 FlatSymbolRefAttr Importer::getPersonalityAsAttr(llvm::Function *f) { 1087 if (!f->hasPersonalityFn()) 1088 return nullptr; 1089 1090 llvm::Constant *pf = f->getPersonalityFn(); 1091 1092 // If it directly has a name, we can use it. 1093 if (pf->hasName()) 1094 return SymbolRefAttr::get(b.getContext(), pf->getName()); 1095 1096 // If it doesn't have a name, currently, only function pointers that are 1097 // bitcast to i8* are parsed. 1098 if (auto *ce = dyn_cast<llvm::ConstantExpr>(pf)) { 1099 if (ce->getOpcode() == llvm::Instruction::BitCast && 1100 ce->getType() == llvm::Type::getInt8PtrTy(f->getContext())) { 1101 if (auto *func = dyn_cast<llvm::Function>(ce->getOperand(0))) 1102 return SymbolRefAttr::get(b.getContext(), func->getName()); 1103 } 1104 } 1105 return FlatSymbolRefAttr(); 1106 } 1107 1108 LogicalResult Importer::processFunction(llvm::Function *f) { 1109 blocks.clear(); 1110 instMap.clear(); 1111 unknownInstMap.clear(); 1112 1113 auto functionType = 1114 processType(f->getFunctionType()).dyn_cast<LLVMFunctionType>(); 1115 if (!functionType) 1116 return failure(); 1117 1118 b.setInsertionPoint(module.getBody(), getFuncInsertPt()); 1119 LLVMFuncOp fop = 1120 b.create<LLVMFuncOp>(UnknownLoc::get(context), f->getName(), functionType, 1121 convertLinkageFromLLVM(f->getLinkage())); 1122 1123 if (FlatSymbolRefAttr personality = getPersonalityAsAttr(f)) 1124 fop->setAttr(b.getStringAttr("personality"), personality); 1125 else if (f->hasPersonalityFn()) 1126 emitWarning(UnknownLoc::get(context), 1127 "could not deduce personality, skipping it"); 1128 1129 if (f->hasGC()) 1130 fop.setGarbageCollectorAttr(b.getStringAttr(f->getGC())); 1131 1132 if (f->isDeclaration()) 1133 return success(); 1134 1135 // Eagerly create all blocks. 1136 SmallVector<Block *, 4> blockList; 1137 for (llvm::BasicBlock &bb : *f) { 1138 blockList.push_back(b.createBlock(&fop.getBody(), fop.getBody().end())); 1139 blocks[&bb] = blockList.back(); 1140 } 1141 currentEntryBlock = blockList[0]; 1142 1143 // Add function arguments to the entry block. 1144 for (const auto &kv : llvm::enumerate(f->args())) { 1145 instMap[&kv.value()] = blockList[0]->addArgument( 1146 functionType.getParamType(kv.index()), fop.getLoc()); 1147 } 1148 1149 for (auto bbs : llvm::zip(*f, blockList)) { 1150 if (failed(processBasicBlock(&std::get<0>(bbs), std::get<1>(bbs)))) 1151 return failure(); 1152 } 1153 1154 // Now that all instructions are guaranteed to have been visited, ensure 1155 // any unknown uses we encountered are remapped. 1156 for (auto &llvmAndUnknown : unknownInstMap) { 1157 assert(instMap.count(llvmAndUnknown.first)); 1158 Value newValue = instMap[llvmAndUnknown.first]; 1159 Value oldValue = llvmAndUnknown.second->getResult(0); 1160 oldValue.replaceAllUsesWith(newValue); 1161 llvmAndUnknown.second->erase(); 1162 } 1163 return success(); 1164 } 1165 1166 LogicalResult Importer::processBasicBlock(llvm::BasicBlock *bb, Block *block) { 1167 b.setInsertionPointToStart(block); 1168 for (llvm::Instruction &inst : *bb) { 1169 if (failed(processInstruction(&inst))) 1170 return failure(); 1171 } 1172 return success(); 1173 } 1174 1175 OwningOpRef<ModuleOp> 1176 mlir::translateLLVMIRToModule(std::unique_ptr<llvm::Module> llvmModule, 1177 MLIRContext *context) { 1178 context->loadDialect<LLVMDialect>(); 1179 context->loadDialect<DLTIDialect>(); 1180 OwningOpRef<ModuleOp> module(ModuleOp::create( 1181 FileLineColLoc::get(context, "", /*line=*/0, /*column=*/0))); 1182 1183 DataLayoutSpecInterface dlSpec = 1184 translateDataLayout(llvmModule->getDataLayout(), context); 1185 if (!dlSpec) { 1186 emitError(UnknownLoc::get(context), "can't translate data layout"); 1187 return {}; 1188 } 1189 1190 module.get()->setAttr(DLTIDialect::kDataLayoutAttrName, dlSpec); 1191 1192 Importer deserializer(context, module.get()); 1193 for (llvm::GlobalVariable &gv : llvmModule->globals()) { 1194 if (!deserializer.processGlobal(&gv)) 1195 return {}; 1196 } 1197 for (llvm::Function &f : llvmModule->functions()) { 1198 if (failed(deserializer.processFunction(&f))) 1199 return {}; 1200 } 1201 1202 return module; 1203 } 1204 1205 // Deserializes the LLVM bitcode stored in `input` into an MLIR module in the 1206 // LLVM dialect. 1207 OwningOpRef<ModuleOp> translateLLVMIRToModule(llvm::SourceMgr &sourceMgr, 1208 MLIRContext *context) { 1209 llvm::SMDiagnostic err; 1210 llvm::LLVMContext llvmContext; 1211 std::unique_ptr<llvm::Module> llvmModule = llvm::parseIR( 1212 *sourceMgr.getMemoryBuffer(sourceMgr.getMainFileID()), err, llvmContext); 1213 if (!llvmModule) { 1214 std::string errStr; 1215 llvm::raw_string_ostream errStream(errStr); 1216 err.print(/*ProgName=*/"", errStream); 1217 emitError(UnknownLoc::get(context)) << errStream.str(); 1218 return {}; 1219 } 1220 return translateLLVMIRToModule(std::move(llvmModule), context); 1221 } 1222 1223 namespace mlir { 1224 void registerFromLLVMIRTranslation() { 1225 TranslateToMLIRRegistration fromLLVM( 1226 "import-llvm", [](llvm::SourceMgr &sourceMgr, MLIRContext *context) { 1227 return ::translateLLVMIRToModule(sourceMgr, context); 1228 }); 1229 } 1230 } // namespace mlir 1231