14#ifndef MLIR_TARGET_LLVMIR_MODULETRANSLATION_H
15#define MLIR_TARGET_LLVMIR_MODULETRANSLATION_H
28#include "llvm/ADT/SetVector.h"
29#include "llvm/IR/FPEnv.h"
30#include "llvm/IR/Module.h"
31#include "llvm/Support/VirtualFileSystemFwd.h"
36class CanonicalLoopInfo;
57class AliasScopeDomainAttr;
60class ComdatSelectorOp;
67class ModuleTranslation {
68 friend std::unique_ptr<llvm::Module>
70 bool, llvm::vfs::FileSystem *);
75 auto result = functionMapping.try_emplace(name,
func);
78 "attempting to map a function that is already mapped");
83 return functionMapping.lookup(name);
92 llvm::Value *&
llvm = valueMapping[value];
93 assert(
llvm ==
nullptr &&
94 "attempting to map a value that is already mapped");
100 return valueMapping.lookup(value);
115 assert(
result.second &&
"attempting to map a block that is already mapped");
120 return blockMapping.lookup(block);
125 llvm::CanonicalLoopInfo *
result = loopMapping.lookup(
mlir);
126 assert(
result &&
"attempt to get non-existing loop");
146 assert(
llvm &&
"argument must be non-null");
147 llvm::CanonicalLoopInfo *&cur = loopMapping[
mlir];
148 assert(cur ==
nullptr &&
"attempting to map a loop that is already mapped");
164 "attempting to map a branch that is already mapped");
170 return branchMapping.lookup(op);
178 assert(
result.second &&
"attempting to map a call that is already mapped");
184 return callMapping.lookup(op);
190 auto result = unresolvedBlockAddressMapping.try_emplace(op, cst);
193 "attempting to map a blockaddress operation that is already mapped");
198 auto result = blockAddressToLLVMMapping.try_emplace(attr, block);
201 "attempting to map a blockaddress attribute that is already mapped");
206 return blockAddressToLLVMMapping.lookup(attr);
228 llvm::Instruction *inst);
232 llvm::Instruction *inst);
235 void setTBAAMetadata(AliasAnalysisOpInterface op, llvm::Instruction *inst);
240 llvm::Instruction *inst);
267 return globalsMapping.lookup(op);
272 return globalsByNameMapping.lookup(name);
278 return aliasesMapping.lookup(op);
284 return ifuncMapping.lookup(op);
305 llvm::DIGlobalVariableExpression *
315 llvm::fp::ExceptionBehavior
326 llvm::IRBuilderBase &builder) {
327 return convertBlockImpl(bb, ignoreArguments, builder,
335 return convertOperationImpl(op, builder,
false);
346 llvm::CallBase *call,
356 FailureOr<llvm::Metadata *>
365 template <
typename T,
typename... Args>
367 stack.stackPush<T>(std::forward<Args>(args)...);
375 template <
typename T>
377 return stack.stackWalk(callback);
381 template <
typename T>
388 static std::optional<llvm::Attribute>
convertNoBuiltin(llvm::LLVMContext &ctx,
391 static std::optional<llvm::Attribute>
398 template <
typename AttrsTy,
typename Operation,
typename Converter>
400 const Converter &conv) {
403 for (
auto elt : attrs) {
414 llvm::vfs::FileSystem *fs =
nullptr);
419 llvm::IRBuilderBase &builder,
420 bool recordInsertions =
false);
421 LogicalResult convertFunctionSignatures();
422 LogicalResult convertFunctionMetadata();
423 LogicalResult convertFunctions();
424 LogicalResult convertIFuncs();
425 LogicalResult convertComdats();
427 LogicalResult convertUnresolvedBlockAddress();
436 LogicalResult convertGlobalsAndAliases();
441 LogicalResult convertGlobalMetadata();
443 FailureOr<llvm::Metadata *>
446 LogicalResult convertOneFunction(LLVMFuncOp
func);
447 LogicalResult convertBlockImpl(
Block &bb,
bool ignoreArguments,
448 llvm::IRBuilderBase &builder,
449 bool recordInsertions);
453 llvm::MDNode *getTBAANode(TBAATagAttr tbaaAttr)
const;
457 LogicalResult createTBAAMetadata();
460 LogicalResult createIdentMetadata();
463 LogicalResult createCommandlineMetadata();
466 LogicalResult createDependentLibrariesMetadata();
475 FailureOr<llvm::AttrBuilder> convertParameterAttrs(
mlir::Location loc,
476 DictionaryAttr paramAttrs);
480 FailureOr<llvm::AttrBuilder>
481 convertParameterAttrs(LLVMFuncOp
func,
int argIdx, DictionaryAttr paramAttrs);
485 std::unique_ptr<llvm::Module> llvmModule;
487 std::unique_ptr<detail::DebugTranslation> debugTranslation;
490 std::unique_ptr<detail::LoopAnnotationTranslation> loopAnnotationTranslation;
493 std::unique_ptr<llvm::OpenMPIRBuilder> ompBuilder;
497 llvm::vfs::FileSystem *fileSystem =
nullptr;
506 llvm::StringMap<llvm::GlobalValue *> globalsByNameMapping;
524 llvm::StringMap<llvm::Function *> functionMapping;
590 const ModuleTranslation &moduleTranslation);
594 llvm::Intrinsic::ID intrinsic,
596 ArrayRef<llvm::Type *> tys = {});
603 llvm::Intrinsic::ID intrinsic,
605 ArrayRef<llvm::Value *> args);
611 llvm::IRBuilderBase &builder, ModuleTranslation &moduleTranslation,
612 Operation *intrOp, llvm::Intrinsic::ID intrinsic,
unsigned numResults,
613 ArrayRef<unsigned> overloadedResults, ArrayRef<unsigned> overloadedOperands,
614 ArrayRef<unsigned> immArgPositions,
615 ArrayRef<StringLiteral> immArgAttrNames);
static LogicalResult convertOperationImpl(Operation &opInst, llvm::IRBuilderBase &builder, LLVM::ModuleTranslation &moduleTranslation)
Attributes are known-constant values of operations.
Block represents an ordered list of Operations.
A symbol reference with a reference path containing a single element.
This class represents a diagnostic that is inflight and set to be reported.
Interface collection for translation to LLVM IR, dispatches to a concrete interface implementation ba...
This class represents the base attribute for all debug info attributes.
Implementation class for module translation.
void mapUnresolvedBlockAddress(BlockAddressOp op, llvm::Value *cst)
Maps a blockaddress operation to its corresponding placeholder LLVM value.
llvm::fp::ExceptionBehavior translateFPExceptionBehavior(LLVM::FPExceptionBehavior exceptionBehavior)
Translates the given LLVM FP exception behavior metadata.
llvm::CallInst * lookupCall(Operation *op) const
Finds an LLVM call instruction that corresponds to the given MLIR call operation.
void mapCall(Operation *mlir, llvm::CallInst *llvm)
Stores a mapping between an MLIR call operation and a corresponding LLVM call instruction.
llvm::BasicBlock * lookupBlock(Block *block) const
Finds an LLVM IR basic block that corresponds to the given MLIR block.
llvm::DIGlobalVariableExpression * translateGlobalVariableExpression(LLVM::DIGlobalVariableExpressionAttr attr)
Translates the given LLVM global variable expression metadata.
llvm::Attribute convertAllocsizeAttr(DenseI32ArrayAttr allocsizeAttr)
MLIRContext & getContext()
Returns the MLIR context of the module being translated.
WalkResult stackWalk(llvm::function_ref< WalkResult(T &)> callback)
Calls callback for every ModuleTranslation stack frame of type T starting from the top of the stack.
void stackPush(Args &&...args)
Creates a stack frame of type T on ModuleTranslation stack.
llvm::NamedMDNode * getOrInsertNamedModuleMetadata(StringRef name)
Gets the named metadata in the LLVM IR module being constructed, creating it if it does not exist.
LogicalResult convertBlock(Block &bb, bool ignoreArguments, llvm::IRBuilderBase &builder)
Translates the contents of the given block to LLVM IR using this translator.
void mapBranch(Operation *mlir, llvm::Instruction *llvm)
Stores the mapping between an MLIR operation with successors and a corresponding LLVM IR instruction.
void mapOmpLoop(Value mlir, llvm::CanonicalLoopInfo *llvm)
Map an MLIR OpenMP dialect CanonicalLoopInfo to its lowered LLVM-IR OpenMPIRBuilder CanonicalLoopInfo...
SmallVector< llvm::Value * > lookupValues(ValueRange values)
Looks up remapped a list of remapped values.
void mapFunction(StringRef name, llvm::Function *func)
Stores the mapping between a function name and its LLVM IR representation.
void convertFunctionAttrCollection(AttrsTy attrs, Operation *op, const Converter &conv)
A template that takes a collection-like attribute, and converts it via a user provided callback,...
llvm::DILocation * translateLoc(Location loc, llvm::DILocalScope *scope)
Translates the given location.
void setDereferenceableMetadata(DereferenceableOpInterface op, llvm::Instruction *inst)
Sets LLVM dereferenceable metadata for operations that have dereferenceable attributes.
void setBranchWeightsMetadata(WeightedBranchOpInterface op)
Sets LLVM profiling metadata for operations that have branch weights.
llvm::Instruction * lookupBranch(Operation *op) const
Finds an LLVM IR instruction that corresponds to the given MLIR operation with successors.
llvm::Value * lookupValue(Value value) const
Finds an LLVM IR value corresponding to the given MLIR value.
void invalidateOmpLoop(omp::NewCliOp mlir)
Mark an OpenMP loop as having been consumed.
LogicalResult convertArgAndResultAttrs(ArgAndResultAttrsOpInterface attrsOp, llvm::CallBase *call, ArrayRef< unsigned > immArgPositions={})
Converts argument and result attributes from attrsOp to LLVM IR attributes on the call instruction.
static std::optional< llvm::Attribute > convertNoBuiltin(llvm::LLVMContext &ctx, mlir::Attribute a)
SymbolTableCollection & symbolTable()
llvm::Type * convertType(Type type)
Converts the type from MLIR LLVM dialect to LLVM.
llvm::Value *& mapValue(Value value)
Provides write-once access to store the LLVM IR value corresponding to the given MLIR value.
void invalidateOmpLoop(Value mlir)
Mark an OpenMP loop as having been consumed.
llvm::RoundingMode translateRoundingMode(LLVM::RoundingMode rounding)
Translates the given LLVM rounding mode metadata.
void setTBAAMetadata(AliasAnalysisOpInterface op, llvm::Instruction *inst)
Sets LLVM TBAA metadata for memory operations that have TBAA attributes.
llvm::DIExpression * translateExpression(LLVM::DIExpressionAttr attr)
Translates the given LLVM DWARF expression metadata.
llvm::OpenMPIRBuilder * getOpenMPBuilder()
Returns the OpenMP IR builder associated with the LLVM IR module being constructed.
llvm::vfs::FileSystem & getFileSystem()
Returns the virtual filesystem to use for file operations.
void mapOmpLoop(omp::NewCliOp mlir, llvm::CanonicalLoopInfo *llvm)
Map an MLIR OpenMP dialect CanonicalLoopInfo to its lowered LLVM-IR OpenMPIRBuilder CanonicalLoopInfo...
llvm::GlobalValue * lookupGlobal(Operation *op)
Finds an LLVM IR global value that corresponds to the given MLIR operation defining a global value.
llvm::GlobalValue * lookupGlobal(StringRef name) const
Finds an LLVM IR global value by the mlir.global symbol name.
void forgetMapping(Value value)
Removes the mapping for the given value.
FailureOr< llvm::Metadata * > convertMetadataAttr(Attribute attr, function_ref< InFlightDiagnostic()> emitError)
Converts an LLVM dialect metadata attribute to LLVM IR metadata.
SaveStateStack< T, ModuleTranslation > SaveStack
RAII object calling stackPush/stackPop on construction/destruction.
llvm::BasicBlock * lookupBlockAddress(BlockAddressAttr attr) const
Finds the LLVM basic block that corresponds to the given BlockAddressAttr.
void remapAllValuesWith(llvm::Value *oldValue, llvm::Value *newValue)
Remap old value with new value in the MLIR-to-LLVM value map so later translations use the replacemen...
llvm::GlobalValue * lookupIFunc(Operation *op)
Finds an LLVM IR global value that corresponds to the given MLIR operation defining an IFunc.
llvm::Metadata * translateDebugInfo(LLVM::DINodeAttr attr)
Translates the given LLVM debug info metadata.
void setDisjointFlag(Operation *op, llvm::Value *value)
Sets the disjoint flag attribute for the exported instruction value given the original operation op.
llvm::GlobalValue * lookupAlias(Operation *op)
Finds an LLVM IR global value that corresponds to the given MLIR operation defining a global alias va...
LogicalResult convertOperation(Operation &op, llvm::IRBuilderBase &builder)
Converts the given MLIR operation into LLVM IR using this translator.
llvm::Function * lookupFunction(StringRef name) const
Finds an LLVM IR function by its name.
llvm::MDNode * getOrCreateAliasScopes(ArrayRef< AliasScopeAttr > aliasScopeAttrs)
Returns the LLVM metadata corresponding to an array of mlir LLVM dialect alias scope attributes.
void mapBlock(Block *mlir, llvm::BasicBlock *llvm)
Stores the mapping between an MLIR block and LLVM IR basic block.
llvm::MDNode * getOrCreateAliasScope(AliasScopeAttr aliasScopeAttr)
Returns the LLVM metadata corresponding to a mlir LLVM dialect alias scope attribute.
llvm::Module * getLLVMModule()
Returns the LLVM module in which the IR is being constructed.
static std::optional< llvm::Attribute > convertDefaultFuncAttr(llvm::LLVMContext &ctx, mlir::NamedAttribute namedAttr)
llvm::CanonicalLoopInfo * lookupOMPLoop(Value mlir) const
Find the LLVM-IR loop that represents an MLIR loop.
void stackPop()
Pops the last element from the ModuleTranslation stack.
void forgetMapping(Region ®ion)
Removes the mapping for blocks contained in the region and values defined in these blocks.
void setAliasScopeMetadata(AliasAnalysisOpInterface op, llvm::Instruction *inst)
void setAccessGroupsMetadata(AccessGroupOpInterface op, llvm::Instruction *inst)
void mapValue(Value mlir, llvm::Value *llvm)
Stores the mapping between an MLIR value and its LLVM IR counterpart.
llvm::CanonicalLoopInfo * lookupOMPLoop(omp::NewCliOp mlir) const
Find the LLVM-IR loop that represents an MLIR loop.
llvm::LLVMContext & getLLVMContext() const
Returns the LLVM context in which the IR is being constructed.
void mapBlockAddress(BlockAddressAttr attr, llvm::BasicBlock *block)
Maps a BlockAddressAttr to its corresponding LLVM basic block.
void setLoopMetadata(Operation *op, llvm::Instruction *inst)
Sets LLVM loop metadata for branch operations that have a loop annotation attribute.
Utility class to translate MLIR LLVM dialect types to LLVM IR.
A helper class that converts LoopAnnotationAttrs and AccessGroupAttrs into corresponding llvm::MDNode...
This class defines the main interface for locations in MLIR and acts as a non-nullable wrapper around...
MLIRContext is the top-level object for a collection of MLIR operations.
NamedAttribute represents a combination of a name and an Attribute value.
Operation is the basic unit of execution within MLIR.
This class contains a list of basic blocks and a link to the parent operation it is attached to.
This class represents a collection of SymbolTables.
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
This class provides an abstraction over the different types of ranges over Values.
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
A utility result that is used to signal how to proceed with an ongoing walk:
The OpAsmOpInterface, see OpAsmInterface.td for more details.
void connectPHINodes(Region ®ion, const ModuleTranslation &state)
For all blocks in the region that were converted to LLVM IR using the given ModuleTranslation,...
llvm::CallInst * createIntrinsicCall(llvm::IRBuilderBase &builder, llvm::Intrinsic::ID intrinsic, ArrayRef< llvm::Value * > args={}, ArrayRef< llvm::Type * > tys={})
Creates a call to an LLVM IR intrinsic function with the given arguments.
llvm::Constant * getLLVMConstant(llvm::Type *llvmType, Attribute attr, Location loc, const ModuleTranslation &moduleTranslation)
Create an LLVM IR constant of llvmType from the MLIR attribute attr.
Include the generated interface declarations.
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.
detail::DenseArrayAttrImpl< int32_t > DenseI32ArrayAttr
std::unique_ptr< llvm::Module > translateModuleToLLVMIR(Operation *module, llvm::LLVMContext &llvmContext, llvm::StringRef name="LLVMDialectModule", bool disableVerification=false, llvm::vfs::FileSystem *fs=nullptr)
Translates a given LLVM dialect module into an LLVM IR module living in the given context.
llvm::DenseMap< KeyT, ValueT, KeyInfoT, BucketT > DenseMap
llvm::function_ref< Fn > function_ref
RAII object calling stackPush/stackPop on construction/destruction.