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 INST(ExtractElement, ExtractElement), INST(InsertElement, InsertElement), 620 // ShuffleVector is handled specially. 621 // InsertValue is handled specially. 622 // ExtractValue is handled specially. 623 // FIXME: landingpad 624 }; 625 #undef INST 626 627 return opcMap.lookup(opcode); 628 } 629 630 static ICmpPredicate getICmpPredicate(llvm::CmpInst::Predicate p) { 631 switch (p) { 632 default: 633 llvm_unreachable("incorrect comparison predicate"); 634 case llvm::CmpInst::Predicate::ICMP_EQ: 635 return LLVM::ICmpPredicate::eq; 636 case llvm::CmpInst::Predicate::ICMP_NE: 637 return LLVM::ICmpPredicate::ne; 638 case llvm::CmpInst::Predicate::ICMP_SLT: 639 return LLVM::ICmpPredicate::slt; 640 case llvm::CmpInst::Predicate::ICMP_SLE: 641 return LLVM::ICmpPredicate::sle; 642 case llvm::CmpInst::Predicate::ICMP_SGT: 643 return LLVM::ICmpPredicate::sgt; 644 case llvm::CmpInst::Predicate::ICMP_SGE: 645 return LLVM::ICmpPredicate::sge; 646 case llvm::CmpInst::Predicate::ICMP_ULT: 647 return LLVM::ICmpPredicate::ult; 648 case llvm::CmpInst::Predicate::ICMP_ULE: 649 return LLVM::ICmpPredicate::ule; 650 case llvm::CmpInst::Predicate::ICMP_UGT: 651 return LLVM::ICmpPredicate::ugt; 652 case llvm::CmpInst::Predicate::ICMP_UGE: 653 return LLVM::ICmpPredicate::uge; 654 } 655 llvm_unreachable("incorrect integer comparison predicate"); 656 } 657 658 static FCmpPredicate getFCmpPredicate(llvm::CmpInst::Predicate p) { 659 switch (p) { 660 default: 661 llvm_unreachable("incorrect comparison predicate"); 662 case llvm::CmpInst::Predicate::FCMP_FALSE: 663 return LLVM::FCmpPredicate::_false; 664 case llvm::CmpInst::Predicate::FCMP_TRUE: 665 return LLVM::FCmpPredicate::_true; 666 case llvm::CmpInst::Predicate::FCMP_OEQ: 667 return LLVM::FCmpPredicate::oeq; 668 case llvm::CmpInst::Predicate::FCMP_ONE: 669 return LLVM::FCmpPredicate::one; 670 case llvm::CmpInst::Predicate::FCMP_OLT: 671 return LLVM::FCmpPredicate::olt; 672 case llvm::CmpInst::Predicate::FCMP_OLE: 673 return LLVM::FCmpPredicate::ole; 674 case llvm::CmpInst::Predicate::FCMP_OGT: 675 return LLVM::FCmpPredicate::ogt; 676 case llvm::CmpInst::Predicate::FCMP_OGE: 677 return LLVM::FCmpPredicate::oge; 678 case llvm::CmpInst::Predicate::FCMP_ORD: 679 return LLVM::FCmpPredicate::ord; 680 case llvm::CmpInst::Predicate::FCMP_ULT: 681 return LLVM::FCmpPredicate::ult; 682 case llvm::CmpInst::Predicate::FCMP_ULE: 683 return LLVM::FCmpPredicate::ule; 684 case llvm::CmpInst::Predicate::FCMP_UGT: 685 return LLVM::FCmpPredicate::ugt; 686 case llvm::CmpInst::Predicate::FCMP_UGE: 687 return LLVM::FCmpPredicate::uge; 688 case llvm::CmpInst::Predicate::FCMP_UNO: 689 return LLVM::FCmpPredicate::uno; 690 case llvm::CmpInst::Predicate::FCMP_UEQ: 691 return LLVM::FCmpPredicate::ueq; 692 case llvm::CmpInst::Predicate::FCMP_UNE: 693 return LLVM::FCmpPredicate::une; 694 } 695 llvm_unreachable("incorrect floating point comparison predicate"); 696 } 697 698 static AtomicOrdering getLLVMAtomicOrdering(llvm::AtomicOrdering ordering) { 699 switch (ordering) { 700 case llvm::AtomicOrdering::NotAtomic: 701 return LLVM::AtomicOrdering::not_atomic; 702 case llvm::AtomicOrdering::Unordered: 703 return LLVM::AtomicOrdering::unordered; 704 case llvm::AtomicOrdering::Monotonic: 705 return LLVM::AtomicOrdering::monotonic; 706 case llvm::AtomicOrdering::Acquire: 707 return LLVM::AtomicOrdering::acquire; 708 case llvm::AtomicOrdering::Release: 709 return LLVM::AtomicOrdering::release; 710 case llvm::AtomicOrdering::AcquireRelease: 711 return LLVM::AtomicOrdering::acq_rel; 712 case llvm::AtomicOrdering::SequentiallyConsistent: 713 return LLVM::AtomicOrdering::seq_cst; 714 } 715 llvm_unreachable("incorrect atomic ordering"); 716 } 717 718 // `br` branches to `target`. Return the branch arguments to `br`, in the 719 // same order of the PHIs in `target`. 720 LogicalResult 721 Importer::processBranchArgs(llvm::Instruction *br, llvm::BasicBlock *target, 722 SmallVectorImpl<Value> &blockArguments) { 723 for (auto inst = target->begin(); isa<llvm::PHINode>(inst); ++inst) { 724 auto *pn = cast<llvm::PHINode>(&*inst); 725 Value value = processValue(pn->getIncomingValueForBlock(br->getParent())); 726 if (!value) 727 return failure(); 728 blockArguments.push_back(value); 729 } 730 return success(); 731 } 732 733 LogicalResult Importer::processInstruction(llvm::Instruction *inst) { 734 // FIXME: Support uses of SubtargetData. Currently inbounds GEPs, fast-math 735 // flags and call / operand attributes are not supported. 736 Location loc = processDebugLoc(inst->getDebugLoc(), inst); 737 assert(!instMap.count(inst) && 738 "processInstruction must be called only once per instruction!"); 739 switch (inst->getOpcode()) { 740 default: 741 return emitError(loc) << "unknown instruction: " << diag(*inst); 742 case llvm::Instruction::Add: 743 case llvm::Instruction::FAdd: 744 case llvm::Instruction::Sub: 745 case llvm::Instruction::FSub: 746 case llvm::Instruction::Mul: 747 case llvm::Instruction::FMul: 748 case llvm::Instruction::UDiv: 749 case llvm::Instruction::SDiv: 750 case llvm::Instruction::FDiv: 751 case llvm::Instruction::URem: 752 case llvm::Instruction::SRem: 753 case llvm::Instruction::FRem: 754 case llvm::Instruction::Shl: 755 case llvm::Instruction::LShr: 756 case llvm::Instruction::AShr: 757 case llvm::Instruction::And: 758 case llvm::Instruction::Or: 759 case llvm::Instruction::Xor: 760 case llvm::Instruction::Load: 761 case llvm::Instruction::Store: 762 case llvm::Instruction::Ret: 763 case llvm::Instruction::Resume: 764 case llvm::Instruction::Trunc: 765 case llvm::Instruction::ZExt: 766 case llvm::Instruction::SExt: 767 case llvm::Instruction::FPToUI: 768 case llvm::Instruction::FPToSI: 769 case llvm::Instruction::UIToFP: 770 case llvm::Instruction::SIToFP: 771 case llvm::Instruction::FPTrunc: 772 case llvm::Instruction::FPExt: 773 case llvm::Instruction::PtrToInt: 774 case llvm::Instruction::IntToPtr: 775 case llvm::Instruction::AddrSpaceCast: 776 case llvm::Instruction::Freeze: 777 case llvm::Instruction::BitCast: 778 case llvm::Instruction::ExtractElement: 779 case llvm::Instruction::InsertElement: { 780 OperationState state(loc, lookupOperationNameFromOpcode(inst->getOpcode())); 781 SmallVector<Value, 4> ops; 782 ops.reserve(inst->getNumOperands()); 783 for (auto *op : inst->operand_values()) { 784 Value value = processValue(op); 785 if (!value) 786 return failure(); 787 ops.push_back(value); 788 } 789 state.addOperands(ops); 790 if (!inst->getType()->isVoidTy()) { 791 Type type = processType(inst->getType()); 792 if (!type) 793 return failure(); 794 state.addTypes(type); 795 } 796 Operation *op = b.create(state); 797 if (!inst->getType()->isVoidTy()) 798 instMap[inst] = op->getResult(0); 799 return success(); 800 } 801 case llvm::Instruction::Alloca: { 802 Value size = processValue(inst->getOperand(0)); 803 if (!size) 804 return failure(); 805 806 auto *allocaInst = cast<llvm::AllocaInst>(inst); 807 instMap[inst] = 808 b.create<AllocaOp>(loc, processType(inst->getType()), 809 processType(allocaInst->getAllocatedType()), size, 810 allocaInst->getAlign().value()); 811 return success(); 812 } 813 case llvm::Instruction::ICmp: { 814 Value lhs = processValue(inst->getOperand(0)); 815 Value rhs = processValue(inst->getOperand(1)); 816 if (!lhs || !rhs) 817 return failure(); 818 instMap[inst] = b.create<ICmpOp>( 819 loc, getICmpPredicate(cast<llvm::ICmpInst>(inst)->getPredicate()), lhs, 820 rhs); 821 return success(); 822 } 823 case llvm::Instruction::FCmp: { 824 Value lhs = processValue(inst->getOperand(0)); 825 Value rhs = processValue(inst->getOperand(1)); 826 if (!lhs || !rhs) 827 return failure(); 828 instMap[inst] = b.create<FCmpOp>( 829 loc, b.getI1Type(), 830 getFCmpPredicate(cast<llvm::FCmpInst>(inst)->getPredicate()), lhs, rhs); 831 return success(); 832 } 833 case llvm::Instruction::Br: { 834 auto *brInst = cast<llvm::BranchInst>(inst); 835 OperationState state(loc, 836 brInst->isConditional() ? "llvm.cond_br" : "llvm.br"); 837 if (brInst->isConditional()) { 838 Value condition = processValue(brInst->getCondition()); 839 if (!condition) 840 return failure(); 841 state.addOperands(condition); 842 } 843 844 std::array<int32_t, 3> operandSegmentSizes = {1, 0, 0}; 845 for (int i : llvm::seq<int>(0, brInst->getNumSuccessors())) { 846 auto *succ = brInst->getSuccessor(i); 847 SmallVector<Value, 4> blockArguments; 848 if (failed(processBranchArgs(brInst, succ, blockArguments))) 849 return failure(); 850 state.addSuccessors(blocks[succ]); 851 state.addOperands(blockArguments); 852 operandSegmentSizes[i + 1] = blockArguments.size(); 853 } 854 855 if (brInst->isConditional()) { 856 state.addAttribute(LLVM::CondBrOp::getOperandSegmentSizeAttr(), 857 b.getI32VectorAttr(operandSegmentSizes)); 858 } 859 860 b.create(state); 861 return success(); 862 } 863 case llvm::Instruction::Switch: { 864 auto *swInst = cast<llvm::SwitchInst>(inst); 865 // Process the condition value. 866 Value condition = processValue(swInst->getCondition()); 867 if (!condition) 868 return failure(); 869 870 SmallVector<Value> defaultBlockArgs; 871 // Process the default case. 872 llvm::BasicBlock *defaultBB = swInst->getDefaultDest(); 873 if (failed(processBranchArgs(swInst, defaultBB, defaultBlockArgs))) 874 return failure(); 875 876 // Process the cases. 877 unsigned numCases = swInst->getNumCases(); 878 SmallVector<SmallVector<Value>> caseOperands(numCases); 879 SmallVector<ValueRange> caseOperandRefs(numCases); 880 SmallVector<int32_t> caseValues(numCases); 881 SmallVector<Block *> caseBlocks(numCases); 882 for (const auto &en : llvm::enumerate(swInst->cases())) { 883 const llvm::SwitchInst::CaseHandle &caseHandle = en.value(); 884 unsigned i = en.index(); 885 llvm::BasicBlock *succBB = caseHandle.getCaseSuccessor(); 886 if (failed(processBranchArgs(swInst, succBB, caseOperands[i]))) 887 return failure(); 888 caseOperandRefs[i] = caseOperands[i]; 889 caseValues[i] = caseHandle.getCaseValue()->getSExtValue(); 890 caseBlocks[i] = blocks[succBB]; 891 } 892 893 b.create<SwitchOp>(loc, condition, blocks[defaultBB], defaultBlockArgs, 894 caseValues, caseBlocks, caseOperandRefs); 895 return success(); 896 } 897 case llvm::Instruction::PHI: { 898 Type type = processType(inst->getType()); 899 if (!type) 900 return failure(); 901 instMap[inst] = b.getInsertionBlock()->addArgument( 902 type, processDebugLoc(inst->getDebugLoc(), inst)); 903 return success(); 904 } 905 case llvm::Instruction::Call: { 906 llvm::CallInst *ci = cast<llvm::CallInst>(inst); 907 SmallVector<Value, 4> ops; 908 ops.reserve(inst->getNumOperands()); 909 for (auto &op : ci->args()) { 910 Value arg = processValue(op.get()); 911 if (!arg) 912 return failure(); 913 ops.push_back(arg); 914 } 915 916 SmallVector<Type, 2> tys; 917 if (!ci->getType()->isVoidTy()) { 918 Type type = processType(inst->getType()); 919 if (!type) 920 return failure(); 921 tys.push_back(type); 922 } 923 Operation *op; 924 if (llvm::Function *callee = ci->getCalledFunction()) { 925 op = b.create<CallOp>( 926 loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops); 927 } else { 928 Value calledValue = processValue(ci->getCalledOperand()); 929 if (!calledValue) 930 return failure(); 931 ops.insert(ops.begin(), calledValue); 932 op = b.create<CallOp>(loc, tys, ops); 933 } 934 if (!ci->getType()->isVoidTy()) 935 instMap[inst] = op->getResult(0); 936 return success(); 937 } 938 case llvm::Instruction::LandingPad: { 939 llvm::LandingPadInst *lpi = cast<llvm::LandingPadInst>(inst); 940 SmallVector<Value, 4> ops; 941 942 for (unsigned i = 0, ie = lpi->getNumClauses(); i < ie; i++) 943 ops.push_back(processConstant(lpi->getClause(i))); 944 945 Type ty = processType(lpi->getType()); 946 if (!ty) 947 return failure(); 948 949 instMap[inst] = b.create<LandingpadOp>(loc, ty, lpi->isCleanup(), ops); 950 return success(); 951 } 952 case llvm::Instruction::Invoke: { 953 llvm::InvokeInst *ii = cast<llvm::InvokeInst>(inst); 954 955 SmallVector<Type, 2> tys; 956 if (!ii->getType()->isVoidTy()) 957 tys.push_back(processType(inst->getType())); 958 959 SmallVector<Value, 4> ops; 960 ops.reserve(inst->getNumOperands() + 1); 961 for (auto &op : ii->args()) 962 ops.push_back(processValue(op.get())); 963 964 SmallVector<Value, 4> normalArgs, unwindArgs; 965 (void)processBranchArgs(ii, ii->getNormalDest(), normalArgs); 966 (void)processBranchArgs(ii, ii->getUnwindDest(), unwindArgs); 967 968 Operation *op; 969 if (llvm::Function *callee = ii->getCalledFunction()) { 970 op = b.create<InvokeOp>( 971 loc, tys, SymbolRefAttr::get(b.getContext(), callee->getName()), ops, 972 blocks[ii->getNormalDest()], normalArgs, blocks[ii->getUnwindDest()], 973 unwindArgs); 974 } else { 975 ops.insert(ops.begin(), processValue(ii->getCalledOperand())); 976 op = b.create<InvokeOp>(loc, tys, ops, blocks[ii->getNormalDest()], 977 normalArgs, blocks[ii->getUnwindDest()], 978 unwindArgs); 979 } 980 981 if (!ii->getType()->isVoidTy()) 982 instMap[inst] = op->getResult(0); 983 return success(); 984 } 985 case llvm::Instruction::Fence: { 986 StringRef syncscope; 987 SmallVector<StringRef, 4> ssNs; 988 llvm::LLVMContext &llvmContext = inst->getContext(); 989 llvm::FenceInst *fence = cast<llvm::FenceInst>(inst); 990 llvmContext.getSyncScopeNames(ssNs); 991 int fenceSyncScopeID = fence->getSyncScopeID(); 992 for (unsigned i = 0, e = ssNs.size(); i != e; i++) { 993 if (fenceSyncScopeID == llvmContext.getOrInsertSyncScopeID(ssNs[i])) { 994 syncscope = ssNs[i]; 995 break; 996 } 997 } 998 b.create<FenceOp>(loc, getLLVMAtomicOrdering(fence->getOrdering()), 999 syncscope); 1000 return success(); 1001 } 1002 case llvm::Instruction::GetElementPtr: { 1003 // FIXME: Support inbounds GEPs. 1004 llvm::GetElementPtrInst *gep = cast<llvm::GetElementPtrInst>(inst); 1005 Value basePtr = processValue(gep->getOperand(0)); 1006 SmallVector<int32_t> staticIndices; 1007 SmallVector<Value> dynamicIndices; 1008 Type sourceElementType = processType(gep->getSourceElementType()); 1009 SmallVector<unsigned> staticIndexPositions; 1010 GEPOp::findKnownStructIndices(sourceElementType, staticIndexPositions); 1011 1012 for (const auto &en : 1013 llvm::enumerate(llvm::drop_begin(gep->operand_values()))) { 1014 llvm::Value *operand = en.value(); 1015 if (llvm::find(staticIndexPositions, en.index()) == 1016 staticIndexPositions.end()) { 1017 staticIndices.push_back(GEPOp::kDynamicIndex); 1018 dynamicIndices.push_back(processValue(operand)); 1019 if (!dynamicIndices.back()) 1020 return failure(); 1021 } else { 1022 auto *constantInt = cast<llvm::ConstantInt>(operand); 1023 staticIndices.push_back( 1024 static_cast<int32_t>(constantInt->getValue().getZExtValue())); 1025 } 1026 } 1027 1028 Type type = processType(inst->getType()); 1029 if (!type) 1030 return failure(); 1031 instMap[inst] = b.create<GEPOp>(loc, type, sourceElementType, basePtr, 1032 dynamicIndices, staticIndices); 1033 return success(); 1034 } 1035 case llvm::Instruction::InsertValue: { 1036 auto *ivInst = cast<llvm::InsertValueInst>(inst); 1037 Value inserted = processValue(ivInst->getInsertedValueOperand()); 1038 if (!inserted) 1039 return failure(); 1040 Value aggOperand = processValue(ivInst->getAggregateOperand()); 1041 if (!aggOperand) 1042 return failure(); 1043 1044 SmallVector<int32_t> idxValues; 1045 for (unsigned idx : ivInst->getIndices()) 1046 idxValues.push_back(static_cast<int32_t>(idx)); 1047 ArrayAttr indices = b.getI32ArrayAttr(idxValues); 1048 1049 instMap[inst] = b.create<InsertValueOp>(loc, aggOperand, inserted, indices); 1050 return success(); 1051 } 1052 case llvm::Instruction::ExtractValue: { 1053 auto *evInst = cast<llvm::ExtractValueInst>(inst); 1054 Value aggOperand = processValue(evInst->getAggregateOperand()); 1055 if (!aggOperand) 1056 return failure(); 1057 1058 Type type = processType(inst->getType()); 1059 if (!type) 1060 return failure(); 1061 1062 SmallVector<int32_t> idxValues; 1063 for (unsigned idx : evInst->getIndices()) 1064 idxValues.push_back(static_cast<int32_t>(idx)); 1065 ArrayAttr indices = b.getI32ArrayAttr(idxValues); 1066 1067 instMap[inst] = b.create<ExtractValueOp>(loc, type, aggOperand, indices); 1068 return success(); 1069 } 1070 case llvm::Instruction::ShuffleVector: { 1071 auto *svInst = cast<llvm::ShuffleVectorInst>(inst); 1072 Value vec1 = processValue(svInst->getOperand(0)); 1073 if (!vec1) 1074 return failure(); 1075 Value vec2 = processValue(svInst->getOperand(1)); 1076 if (!vec2) 1077 return failure(); 1078 1079 ArrayAttr mask = b.getI32ArrayAttr(svInst->getShuffleMask()); 1080 1081 instMap[inst] = b.create<ShuffleVectorOp>(loc, vec1, vec2, mask); 1082 return success(); 1083 } 1084 } 1085 } 1086 1087 FlatSymbolRefAttr Importer::getPersonalityAsAttr(llvm::Function *f) { 1088 if (!f->hasPersonalityFn()) 1089 return nullptr; 1090 1091 llvm::Constant *pf = f->getPersonalityFn(); 1092 1093 // If it directly has a name, we can use it. 1094 if (pf->hasName()) 1095 return SymbolRefAttr::get(b.getContext(), pf->getName()); 1096 1097 // If it doesn't have a name, currently, only function pointers that are 1098 // bitcast to i8* are parsed. 1099 if (auto *ce = dyn_cast<llvm::ConstantExpr>(pf)) { 1100 if (ce->getOpcode() == llvm::Instruction::BitCast && 1101 ce->getType() == llvm::Type::getInt8PtrTy(f->getContext())) { 1102 if (auto *func = dyn_cast<llvm::Function>(ce->getOperand(0))) 1103 return SymbolRefAttr::get(b.getContext(), func->getName()); 1104 } 1105 } 1106 return FlatSymbolRefAttr(); 1107 } 1108 1109 LogicalResult Importer::processFunction(llvm::Function *f) { 1110 blocks.clear(); 1111 instMap.clear(); 1112 unknownInstMap.clear(); 1113 1114 auto functionType = 1115 processType(f->getFunctionType()).dyn_cast<LLVMFunctionType>(); 1116 if (!functionType) 1117 return failure(); 1118 1119 b.setInsertionPoint(module.getBody(), getFuncInsertPt()); 1120 LLVMFuncOp fop = 1121 b.create<LLVMFuncOp>(UnknownLoc::get(context), f->getName(), functionType, 1122 convertLinkageFromLLVM(f->getLinkage())); 1123 1124 if (FlatSymbolRefAttr personality = getPersonalityAsAttr(f)) 1125 fop->setAttr(b.getStringAttr("personality"), personality); 1126 else if (f->hasPersonalityFn()) 1127 emitWarning(UnknownLoc::get(context), 1128 "could not deduce personality, skipping it"); 1129 1130 if (f->hasGC()) 1131 fop.setGarbageCollectorAttr(b.getStringAttr(f->getGC())); 1132 1133 if (f->isDeclaration()) 1134 return success(); 1135 1136 // Eagerly create all blocks. 1137 SmallVector<Block *, 4> blockList; 1138 for (llvm::BasicBlock &bb : *f) { 1139 blockList.push_back(b.createBlock(&fop.getBody(), fop.getBody().end())); 1140 blocks[&bb] = blockList.back(); 1141 } 1142 currentEntryBlock = blockList[0]; 1143 1144 // Add function arguments to the entry block. 1145 for (const auto &kv : llvm::enumerate(f->args())) { 1146 instMap[&kv.value()] = blockList[0]->addArgument( 1147 functionType.getParamType(kv.index()), fop.getLoc()); 1148 } 1149 1150 for (auto bbs : llvm::zip(*f, blockList)) { 1151 if (failed(processBasicBlock(&std::get<0>(bbs), std::get<1>(bbs)))) 1152 return failure(); 1153 } 1154 1155 // Now that all instructions are guaranteed to have been visited, ensure 1156 // any unknown uses we encountered are remapped. 1157 for (auto &llvmAndUnknown : unknownInstMap) { 1158 assert(instMap.count(llvmAndUnknown.first)); 1159 Value newValue = instMap[llvmAndUnknown.first]; 1160 Value oldValue = llvmAndUnknown.second->getResult(0); 1161 oldValue.replaceAllUsesWith(newValue); 1162 llvmAndUnknown.second->erase(); 1163 } 1164 return success(); 1165 } 1166 1167 LogicalResult Importer::processBasicBlock(llvm::BasicBlock *bb, Block *block) { 1168 b.setInsertionPointToStart(block); 1169 for (llvm::Instruction &inst : *bb) { 1170 if (failed(processInstruction(&inst))) 1171 return failure(); 1172 } 1173 return success(); 1174 } 1175 1176 OwningOpRef<ModuleOp> 1177 mlir::translateLLVMIRToModule(std::unique_ptr<llvm::Module> llvmModule, 1178 MLIRContext *context) { 1179 context->loadDialect<LLVMDialect>(); 1180 context->loadDialect<DLTIDialect>(); 1181 OwningOpRef<ModuleOp> module(ModuleOp::create( 1182 FileLineColLoc::get(context, "", /*line=*/0, /*column=*/0))); 1183 1184 DataLayoutSpecInterface dlSpec = 1185 translateDataLayout(llvmModule->getDataLayout(), context); 1186 if (!dlSpec) { 1187 emitError(UnknownLoc::get(context), "can't translate data layout"); 1188 return {}; 1189 } 1190 1191 module.get()->setAttr(DLTIDialect::kDataLayoutAttrName, dlSpec); 1192 1193 Importer deserializer(context, module.get()); 1194 for (llvm::GlobalVariable &gv : llvmModule->globals()) { 1195 if (!deserializer.processGlobal(&gv)) 1196 return {}; 1197 } 1198 for (llvm::Function &f : llvmModule->functions()) { 1199 if (failed(deserializer.processFunction(&f))) 1200 return {}; 1201 } 1202 1203 return module; 1204 } 1205 1206 // Deserializes the LLVM bitcode stored in `input` into an MLIR module in the 1207 // LLVM dialect. 1208 OwningOpRef<ModuleOp> translateLLVMIRToModule(llvm::SourceMgr &sourceMgr, 1209 MLIRContext *context) { 1210 llvm::SMDiagnostic err; 1211 llvm::LLVMContext llvmContext; 1212 std::unique_ptr<llvm::Module> llvmModule = llvm::parseIR( 1213 *sourceMgr.getMemoryBuffer(sourceMgr.getMainFileID()), err, llvmContext); 1214 if (!llvmModule) { 1215 std::string errStr; 1216 llvm::raw_string_ostream errStream(errStr); 1217 err.print(/*ProgName=*/"", errStream); 1218 emitError(UnknownLoc::get(context)) << errStream.str(); 1219 return {}; 1220 } 1221 return translateLLVMIRToModule(std::move(llvmModule), context); 1222 } 1223 1224 namespace mlir { 1225 void registerFromLLVMIRTranslation() { 1226 TranslateToMLIRRegistration fromLLVM( 1227 "import-llvm", [](llvm::SourceMgr &sourceMgr, MLIRContext *context) { 1228 return ::translateLLVMIRToModule(sourceMgr, context); 1229 }); 1230 } 1231 } // namespace mlir 1232