14 #ifndef MLIR_TARGET_LLVMIR_MODULEIMPORT_H
15 #define MLIR_TARGET_LLVMIR_MODULEIMPORT_H
26 class DbgVariableIntrinsic;
36 class DataLayoutImporter;
38 class LoopAnnotationImporter;
49 ModuleImport(ModuleOp mlirModule, std::unique_ptr<llvm::Module> llvmModule,
50 bool emitExpensiveWarnings,
bool importEmptyDICompositeTypes,
51 bool preferUnregisteredIntrinsics);
89 assert(
mlir ==
nullptr &&
90 "attempting to map a value that is already mapped");
110 assert(inst->getType()->isVoidTy() &&
111 "attempting to map an operation that returns a result");
112 assert(
mlir ==
nullptr &&
113 "attempting to map an operation that is already mapped");
122 return value.getDefiningOp();
123 return noResultOpMapping.lookup(inst);
128 auto result = blockMapping.try_emplace(
llvm,
mlir);
130 assert(result.second &&
"attempting to map a block that is already mapped");
135 return blockMapping.lookup(block);
175 FailureOr<SmallVector<AliasScopeAttr>>
245 return tbaaMapping.lookup(node);
251 FailureOr<SmallVector<AccessGroupAttr>>
263 FailureOr<DereferenceableAttr>
269 FailureOr<SmallVector<AliasScopeAttr>>
284 bool requiresOpBundles,
298 return preferUnregisteredIntrinsics;
303 void clearRegionState() {
304 valueMapping.clear();
305 noResultOpMapping.clear();
306 blockMapping.clear();
307 debugIntrinsics.clear();
310 void setConstantInsertionPointToStart(
Block *block) {
311 constantInsertionBlock = block;
312 constantInsertionOp =
nullptr;
317 LogicalResult convertGlobal(llvm::GlobalVariable *globalVar);
319 LogicalResult convertGlobalCtorsAndDtors(llvm::GlobalVariable *globalVar);
322 LogicalResult convertAlias(llvm::GlobalAlias *alias);
324 FlatSymbolRefAttr getPersonalityAsAttr(llvm::Function *func);
326 LogicalResult processBasicBlock(llvm::BasicBlock *bb, Block *block);
329 LogicalResult processDebugIntrinsics();
331 LogicalResult processDebugIntrinsic(llvm::DbgVariableIntrinsic *dbgIntr,
332 DominanceInfo &domInfo);
335 LogicalResult convertIntrinsic(llvm::CallInst *inst);
338 LogicalResult convertInstruction(llvm::Instruction *inst);
343 void setNonDebugMetadataAttrs(llvm::Instruction *inst, Operation *op);
347 LogicalResult processInstruction(llvm::Instruction *inst);
352 LogicalResult convertBranchArgs(llvm::Instruction *branch,
353 llvm::BasicBlock *target,
354 SmallVectorImpl<Value> &blockArguments);
360 FailureOr<SmallVector<Value>>
361 convertCallOperands(llvm::CallBase *callInst,
bool allowInlineAsm =
false);
367 FailureOr<LLVMFunctionType> convertFunctionType(llvm::CallBase *callInst);
369 FlatSymbolRefAttr convertCalleeName(llvm::CallBase *callInst);
376 DictionaryAttr convertParameterAttribute(llvm::AttributeSet llvmParamAttrs,
384 LogicalResult convertCallAttributes(llvm::CallInst *inst, CallOp op);
386 LogicalResult convertInvokeAttributes(llvm::InvokeInst *inst, InvokeOp op);
390 Type getBuiltinTypeForAttr(Type type);
394 Attribute getConstantAsAttr(llvm::Constant *constant);
397 SetVector<llvm::Constant *> getConstantsToConvert(llvm::Constant *constant);
402 FailureOr<Value> convertConstant(llvm::Constant *constant);
408 FailureOr<Value> convertConstantExpr(llvm::Constant *constant);
412 ComdatOp getGlobalComdatOp();
418 LogicalResult processTBAAMetadata(
const llvm::MDNode *node);
423 LogicalResult processAccessGroupMetadata(
const llvm::MDNode *node);
428 LogicalResult processAliasScopeMetadata(
const llvm::MDNode *node);
432 void processComdat(
const llvm::Comdat *comdat);
436 getOrCreateNamelessSymbolName(llvm::GlobalVariable *globalVar);
440 OpBuilder::InsertionGuard setGlobalInsertionPoint();
445 Block *constantInsertionBlock =
nullptr;
447 Operation *constantInsertionOp =
nullptr;
449 Operation *globalInsertionOp =
nullptr;
451 ComdatOp globalComdatOp =
nullptr;
453 MLIRContext *context;
457 std::unique_ptr<llvm::Module> llvmModule;
459 DenseMap<llvm::GlobalVariable *, FlatSymbolRefAttr> namelessGlobals;
461 unsigned namelessGlobalId = 0;
465 LLVMImportInterface iface;
468 DenseMap<llvm::BasicBlock *, Block *> blockMapping;
470 DenseMap<llvm::Value *, Value> valueMapping;
474 DenseMap<llvm::Instruction *, Operation *> noResultOpMapping;
477 SetVector<llvm::Instruction *> debugIntrinsics;
480 DenseMap<const llvm::MDNode *, Attribute> aliasScopeMapping;
483 DenseMap<const llvm::MDNode *, Attribute> tbaaMapping;
486 DenseMap<const llvm::Comdat *, SymbolRefAttr> comdatMapping;
488 LLVM::TypeFromLLVMIRTranslator typeTranslator;
490 std::unique_ptr<detail::DebugImporter> debugImporter;
492 std::unique_ptr<detail::LoopAnnotationImporter> loopAnnotationImporter;
497 bool emitExpensiveWarnings;
501 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 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.
void convertParameterAttributes(llvm::CallBase *call, ArrayAttr &argsAttr, ArrayAttr &resAttr, OpBuilder &builder)
Converts the parameter and result attributes in argsAttr and resAttr and add them to the callOp.
ModuleImport(ModuleOp mlirModule, std::unique_ptr< llvm::Module > llvmModule, bool emitExpensiveWarnings, bool importEmptyDICompositeTypes, bool preferUnregisteredIntrinsics)
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 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.
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.
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...
This class helps build Operations.
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.