14 #ifndef MLIR_TARGET_LLVMIR_MODULEIMPORT_H
15 #define MLIR_TARGET_LLVMIR_MODULEIMPORT_H
22 #include "llvm/IR/Module.h"
27 class DbgVariableIntrinsic;
37 class DataLayoutImporter;
39 class LoopAnnotationImporter;
50 ModuleImport(ModuleOp mlirModule, std::unique_ptr<llvm::Module> llvmModule,
51 bool emitExpensiveWarnings,
bool importEmptyDICompositeTypes,
52 bool preferUnregisteredIntrinsics,
bool importStructsAsLiterals);
97 assert(
mlir ==
nullptr &&
98 "attempting to map a value that is already mapped");
118 assert(inst->getType()->isVoidTy() &&
119 "attempting to map an operation that returns a result");
120 assert(
mlir ==
nullptr &&
121 "attempting to map an operation that is already mapped");
130 return value.getDefiningOp();
131 return noResultOpMapping.lookup(inst);
136 auto result = blockMapping.try_emplace(
llvm,
mlir);
138 assert(result.second &&
"attempting to map a block that is already mapped");
143 return blockMapping.lookup(block);
183 FailureOr<SmallVector<AliasScopeAttr>>
253 return tbaaMapping.lookup(node);
259 FailureOr<SmallVector<AccessGroupAttr>>
271 FailureOr<DereferenceableAttr>
277 FailureOr<SmallVector<AliasScopeAttr>>
292 bool requiresOpBundles,
302 ArgAndResultAttrsOpInterface attrsOp,
308 return preferUnregisteredIntrinsics;
313 void clearRegionState() {
314 valueMapping.clear();
315 noResultOpMapping.clear();
316 blockMapping.clear();
317 debugIntrinsics.clear();
320 void setConstantInsertionPointToStart(
Block *block) {
321 constantInsertionBlock = block;
322 constantInsertionOp =
nullptr;
327 LogicalResult convertGlobal(llvm::GlobalVariable *globalVar);
329 LogicalResult convertGlobalCtorsAndDtors(llvm::GlobalVariable *globalVar);
332 LogicalResult convertAlias(llvm::GlobalAlias *alias);
334 LogicalResult convertIFunc(llvm::GlobalIFunc *ifunc);
336 FlatSymbolRefAttr getPersonalityAsAttr(llvm::Function *func);
338 LogicalResult processBasicBlock(llvm::BasicBlock *bb, Block *block);
341 LogicalResult processDebugIntrinsics();
343 LogicalResult processDebugIntrinsic(llvm::DbgVariableIntrinsic *dbgIntr,
344 DominanceInfo &domInfo);
347 ArrayAttr convertAsmInlineOperandAttrs(
const llvm::CallBase &llvmCall);
350 LogicalResult convertIntrinsic(llvm::CallInst *inst);
353 LogicalResult convertInstruction(llvm::Instruction *inst);
358 void setNonDebugMetadataAttrs(llvm::Instruction *inst, Operation *op);
362 LogicalResult processInstruction(llvm::Instruction *inst);
367 LogicalResult convertBranchArgs(llvm::Instruction *branch,
368 llvm::BasicBlock *target,
369 SmallVectorImpl<Value> &blockArguments);
375 FailureOr<SmallVector<Value>>
376 convertCallOperands(llvm::CallBase *callInst,
bool allowInlineAsm =
false);
383 FailureOr<LLVMFunctionType> convertFunctionType(llvm::CallBase *callInst,
384 bool &isIncompatibleCall);
386 FlatSymbolRefAttr convertCalleeName(llvm::CallBase *callInst);
392 DictionaryAttr convertArgOrResultAttrSet(llvm::AttributeSet llvmAttrSet);
394 LogicalResult convertCallAttributes(llvm::CallInst *inst, CallOp op);
396 LogicalResult convertInvokeAttributes(llvm::InvokeInst *inst, InvokeOp op);
400 Type getBuiltinTypeForAttr(Type type);
404 Attribute getConstantAsAttr(llvm::Constant *constant);
407 SetVector<llvm::Constant *> getConstantsToConvert(llvm::Constant *constant);
412 FailureOr<Value> convertConstant(llvm::Constant *constant);
418 FailureOr<Value> convertConstantExpr(llvm::Constant *constant);
422 ComdatOp getGlobalComdatOp();
428 LogicalResult processTBAAMetadata(
const llvm::MDNode *node);
433 LogicalResult processAccessGroupMetadata(
const llvm::MDNode *node);
438 LogicalResult processAliasScopeMetadata(
const llvm::MDNode *node);
442 void processComdat(
const llvm::Comdat *comdat);
446 getOrCreateNamelessSymbolName(llvm::GlobalVariable *globalVar);
450 OpBuilder::InsertionGuard setGlobalInsertionPoint();
455 Block *constantInsertionBlock =
nullptr;
457 Operation *constantInsertionOp =
nullptr;
459 Operation *globalInsertionOp =
nullptr;
461 ComdatOp globalComdatOp =
nullptr;
463 MLIRContext *context;
467 std::unique_ptr<llvm::Module> llvmModule;
469 DenseMap<llvm::GlobalVariable *, FlatSymbolRefAttr> namelessGlobals;
471 unsigned namelessGlobalId = 0;
475 LLVMImportInterface iface;
478 DenseMap<llvm::BasicBlock *, Block *> blockMapping;
480 DenseMap<llvm::Value *, Value> valueMapping;
484 DenseMap<llvm::Instruction *, Operation *> noResultOpMapping;
487 SetVector<llvm::Instruction *> debugIntrinsics;
490 DenseMap<const llvm::MDNode *, Attribute> aliasScopeMapping;
493 DenseMap<const llvm::MDNode *, Attribute> tbaaMapping;
496 DenseMap<const llvm::Comdat *, SymbolRefAttr> comdatMapping;
498 LLVM::TypeFromLLVMIRTranslator typeTranslator;
500 std::unique_ptr<detail::DebugImporter> debugImporter;
502 std::unique_ptr<detail::LoopAnnotationImporter> loopAnnotationImporter;
507 bool emitExpensiveWarnings;
511 bool preferUnregisteredIntrinsics;
Attributes are known-constant values of operations.
Block represents an ordered list of Operations.
LogicalResult initializeImport(llvm::LLVMContext &llvmContext)
Queries all registered dialect interfaces for the supported LLVM IR intrinsic and metadata kinds and ...
Module import implementation class that provides methods to import globals and functions from an LLVM...
LogicalResult convertIFuncs()
Converts all ifuncs of the LLVM module to MLIR variables.
LogicalResult convertIntrinsicArguments(ArrayRef< llvm::Value * > values, ArrayRef< llvm::OperandBundleUse > opBundles, bool requiresOpBundles, ArrayRef< unsigned > immArgPositions, ArrayRef< StringLiteral > immArgAttrNames, SmallVectorImpl< Value > &valuesOut, SmallVectorImpl< NamedAttribute > &attrsOut)
Converts the LLVM values for an intrinsic to mixed MLIR values and attributes for LLVM_IntrOpBase.
Location translateLoc(llvm::DILocation *loc)
Translates the debug location.
LogicalResult convertComdats()
Converts all comdat selectors of the LLVM module to MLIR comdat operations.
LogicalResult convertAliases()
Converts all aliases of the LLVM module to MLIR variables.
LogicalResult convertFunctions()
Converts all functions of the LLVM module to MLIR functions.
FailureOr< SmallVector< Value > > convertValues(ArrayRef< llvm::Value * > values)
Converts a range of LLVM values to a range of MLIR values using the convertValue method,...
Attribute lookupTBAAAttr(const llvm::MDNode *node) const
Returns the MLIR attribute mapped to the given LLVM TBAA metadata node.
bool useUnregisteredIntrinsicsOnly() const
Whether the importer should try to convert all intrinsics to llvm.call_intrinsic instead of dialect s...
DILocalVariableAttr matchLocalVariableAttr(llvm::Value *value)
Converts value to a local variable attribute.
LogicalResult convertLinkerOptionsMetadata()
Converts !llvm.linker.options metadata to the llvm.linker.options LLVM dialect operation.
void mapBlock(llvm::BasicBlock *llvm, Block *mlir)
Stores the mapping between an LLVM block and its MLIR counterpart.
void processFunctionAttributes(llvm::Function *func, LLVMFuncOp funcOp)
Converts function attributes of LLVM Function func into LLVM dialect attributes of LLVMFuncOp funcOp.
LogicalResult convertMetadata()
Converts all LLVM metadata nodes that translate to attributes such as alias analysis or access group ...
Value & mapValue(llvm::Value *value)
Provides write-once access to store the MLIR value corresponding to the given LLVM value.
FailureOr< Value > convertValue(llvm::Value *value)
Converts an LLVM value to an MLIR value, or returns failure if the conversion fails.
LogicalResult initializeImportInterface()
Calls the LLVMImportInterface initialization that queries the registered dialect interfaces for the s...
void addDebugIntrinsic(llvm::CallInst *intrinsic)
Adds a debug intrinsics to the list of intrinsics that should be converted after the function convers...
LogicalResult convertIdentMetadata()
Converts !llvm.ident metadata to the llvm.ident LLVM ModuleOp attribute.
Block * lookupBlock(llvm::BasicBlock *block) const
Returns the MLIR block mapped to the given LLVM block.
FailureOr< Value > convertMetadataValue(llvm::Value *value)
Converts an LLVM metadata value to an MLIR value, or returns failure if the conversion fails.
FailureOr< SmallVector< AliasScopeAttr > > lookupAliasScopeAttrs(const llvm::MDNode *node) const
Returns the alias scope attributes that map to the alias scope nodes starting from the metadata node.
void setDisjointFlag(llvm::Instruction *inst, Operation *op) const
Sets the disjoint flag attribute for the imported operation op given the original instruction inst.
void mapNoResultOp(llvm::Instruction *llvm, Operation *mlir)
Stores a mapping between an LLVM instruction and the imported MLIR operation if the operation returns...
void convertModuleLevelAsm()
Converts the module level asm of the LLVM module to an MLIR module level asm specification.
void setExactFlag(llvm::Instruction *inst, Operation *op) const
Sets the exact flag attribute for the imported operation op given the original instruction inst.
Type convertType(llvm::Type *type)
Converts the type from LLVM to MLIR LLVM dialect.
Operation * lookupOperation(llvm::Instruction *inst)
Returns the MLIR operation mapped to the given LLVM instruction.
ModuleImport(ModuleOp mlirModule, std::unique_ptr< llvm::Module > llvmModule, bool emitExpensiveWarnings, bool importEmptyDICompositeTypes, bool preferUnregisteredIntrinsics, bool importStructsAsLiterals)
DILabelAttr matchLabelAttr(llvm::Value *value)
Converts value to a label attribute. Asserts if the matching fails.
FloatAttr matchFloatAttr(llvm::Value *value)
Converts value to a float attribute. Asserts if the matching fails.
LoopAnnotationAttr translateLoopAnnotationAttr(const llvm::MDNode *node, Location loc) const
Returns the loop annotation attribute that corresponds to the given LLVM loop metadata node.
void setFastmathFlagsAttr(llvm::Instruction *inst, Operation *op) const
Sets the fastmath flags attribute for the imported operation op given the original instruction inst.
FailureOr< SmallVector< AliasScopeAttr > > matchAliasScopeAttrs(llvm::Value *value)
Converts value to an array of alias scopes or returns failure if the conversion fails.
Value lookupValue(llvm::Value *value)
Returns the MLIR value mapped to the given LLVM value.
LogicalResult processFunction(llvm::Function *func)
Imports func into the current module.
LogicalResult convertDependentLibrariesMetadata()
Converts !llvm.dependent-libraries metadata to llvm.dependent_libraries LLVM ModuleOp attribute.
RoundingModeAttr matchRoundingModeAttr(llvm::Value *value)
Converts value to a rounding mode attribute.
void convertTargetTriple()
Converts target triple of the LLVM module to an MLIR target triple specification.
void convertArgAndResultAttrs(llvm::CallBase *call, ArgAndResultAttrsOpInterface attrsOp, ArrayRef< unsigned > immArgPositions={})
Converts the argument and result attributes attached to call and adds them to attrsOp.
Operation *& mapNoResultOp(llvm::Instruction *inst)
Provides write-once access to store the MLIR operation corresponding to the given LLVM instruction if...
LogicalResult convertModuleFlagsMetadata()
Converts !llvm.module.flags metadata.
void mapValue(llvm::Value *llvm, Value mlir)
Stores the mapping between an LLVM value and its MLIR counterpart.
FailureOr< SmallVector< AccessGroupAttr > > lookupAccessGroupAttrs(const llvm::MDNode *node) const
Returns the access group attributes that map to the access group nodes starting from the access group...
LogicalResult convertGlobals()
Converts all global variables of the LLVM module to MLIR global variables.
void setIntegerOverflowFlags(llvm::Instruction *inst, Operation *op) const
Sets the integer overflow flags (nsw/nuw) attribute for the imported operation op given the original ...
LogicalResult convertCommandlineMetadata()
Converts !llvm.commandline metadata to the llvm.commandline LLVM ModuleOp attribute.
FPExceptionBehaviorAttr matchFPExceptionBehaviorAttr(llvm::Value *value)
Converts value to a FP exception behavior attribute.
void setNonNegFlag(llvm::Instruction *inst, Operation *op) const
Sets the nneg flag attribute for the imported operation op given the original instruction inst.
FailureOr< DereferenceableAttr > translateDereferenceableAttr(const llvm::MDNode *node, unsigned kindID)
Returns the dereferenceable attribute that corresponds to the given LLVM dereferenceable or dereferen...
LogicalResult convertDataLayout()
Converts the data layout of the LLVM module to an MLIR data layout specification.
IntegerAttr matchIntegerAttr(llvm::Value *value)
Converts value to an integer attribute. Asserts if the matching fails.
Type translateType(llvm::Type *type)
Translates the given LLVM IR type to the MLIR LLVM dialect.
This class defines the main interface for locations in MLIR and acts as a non-nullable wrapper around...
Operation is the basic unit of execution within MLIR.
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
The OpAsmOpInterface, see OpAsmInterface.td for more details.
Include the generated interface declarations.