12 #include "llvm/BinaryFormat/Dwarf.h"
13 #include "llvm/Support/Path.h"
17 #define GEN_PASS_DEF_DISCOPEFORLLVMFUNCOPPASS
18 #include "mlir/Dialect/LLVMIR/Transforms/Passes.h.inc"
26 if (
auto fileLoc = dyn_cast<FileLineColLoc>(loc))
28 if (
auto nameLoc = dyn_cast<NameLoc>(loc))
30 if (
auto opaqueLoc = dyn_cast<OpaqueLoc>(loc))
32 if (
auto fusedLoc = dyn_cast<FusedLoc>(loc)) {
33 for (
auto loc : fusedLoc.getLocations()) {
38 if (
auto callerLoc = dyn_cast<CallSiteLoc>(loc))
47 LLVM::DICompileUnitAttr compileUnitAttr) {
56 LLVM::DIFileAttr fileAttr;
59 line = fileLoc.getLine();
60 StringRef inputFilePath = fileLoc.getFilename().getValue();
63 llvm::sys::path::parent_path(inputFilePath));
65 fileAttr = compileUnitAttr
66 ? compileUnitAttr.getFile()
69 auto subroutineTypeAttr =
77 auto subprogramFlags = LLVM::DISubprogramFlags::Optimized;
78 if (!llvmFunc.isExternal()) {
80 subprogramFlags = subprogramFlags | LLVM::DISubprogramFlags::Definition;
84 auto funcNameAttr = llvmFunc.getNameAttr();
86 context,
id, compileUnitAttr, fileAttr, funcNameAttr, funcNameAttr,
88 line, line, subprogramFlags, subroutineTypeAttr,
90 llvmFunc->setLoc(
FusedLoc::get(context, {loc}, subprogramAttr));
98 LLVM::DIFileAttr calleeFileAttr =
100 llvm::sys::path::parent_path(calleeFileName));
102 context, scopeAttr, calleeFileAttr, 0);
105 if (
auto callSiteLoc = dyn_cast<CallSiteLoc>(calleeLoc)) {
106 auto nestedLoc = callSiteLoc.getCallee();
107 loc =
getNestedLoc(op, lexicalBlockFileAttr, nestedLoc);
113 if (
auto callSiteLoc = dyn_cast<CallSiteLoc>(op->
getLoc())) {
114 auto callerLoc = callSiteLoc.getCaller();
115 auto calleeLoc = callSiteLoc.getCallee();
116 LLVM::DIScopeAttr scopeAttr;
120 if (
auto funcOpLoc = llvm::dyn_cast_if_present<FusedLoc>(funcOp.getLoc())) {
121 scopeAttr = cast<LLVM::DISubprogramAttr>(funcOpLoc.getMetadata());
130 struct DIScopeForLLVMFuncOpPass
131 :
public LLVM::impl::DIScopeForLLVMFuncOpPassBase<
132 DIScopeForLLVMFuncOpPass> {
135 void runOnOperation()
override {
136 ModuleOp module = getOperation();
141 emitError(loc,
"LLVM dialect is not loaded.");
142 return signalPassFailure();
147 LLVM::DICompileUnitAttr compileUnitAttr;
148 if (
auto fusedCompileUnitAttr =
151 compileUnitAttr = fusedCompileUnitAttr.getMetadata();
153 LLVM::DIFileAttr fileAttr;
155 StringRef inputFilePath = fileLoc.getFilename().getValue();
157 context, llvm::sys::path::filename(inputFilePath),
158 llvm::sys::path::parent_path(inputFilePath));
170 if (
auto funcOp = dyn_cast<LLVM::LLVMFuncOp>(op)) {
static Location getNestedLoc(Operation *op, LLVM::DIScopeAttr scopeAttr, Location calleeLoc)
static void addScopeToFunction(LLVM::LLVMFuncOp llvmFunc, LLVM::DICompileUnitAttr compileUnitAttr)
Creates a DISubprogramAttr with the provided compile unit and attaches it to the function.
static FileLineColLoc extractFileLoc(Location loc)
Attempt to extract a filename for the given loc.
static void setLexicalBlockFileAttr(Operation *op)
static MLIRContext * getContext(OpFoldResult val)
An attribute that associates a referenced attribute with a unique identifier.
static DistinctAttr create(Attribute referencedAttr)
Creates a distinct attribute that associates a referenced attribute with a unique identifier.
An instance of this location represents a tuple of file, line number, and column number.
StringAttr getFilename() const
This class represents a fused location whose metadata is known to be an instance of the given type.
T findInstanceOf()
Return an instance of the given location type if one is nested under the current location.
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.
Dialect * getLoadedDialect(StringRef name)
Get a registered IR dialect with the given namespace.
Operation is the basic unit of execution within MLIR.
void setLoc(Location loc)
Set the source location the operation was defined or derived from.
MLIRContext * getContext()
Return the context this operation is associated with.
Location getLoc()
The source location the operation was defined or derived from.
OpTy getParentOfType()
Return the closest surrounding parent operation that is of type 'OpTy'.
Include the generated interface declarations.
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.
auto get(MLIRContext *context, Ts &&...params)
Helper method that injects context only if needed, this helps unify some of the attribute constructio...