@@ -30,8 +30,9 @@ FileLineColLoc extractFileLoc(Location loc) {
3030 return extractFileLoc (opaqueLoc.getFallbackLocation ());
3131 if (auto fusedLoc = dyn_cast<FusedLoc>(loc))
3232 return extractFileLoc (fusedLoc.getLocations ().front ());
33- if (auto callerLoc = dyn_cast<CallSiteLoc>(loc))
34- return extractFileLoc (callerLoc.getCaller ());
33+ // Prefer the innermost callee for callsite locations.
34+ if (auto csLoc = dyn_cast<CallSiteLoc>(loc))
35+ return extractFileLoc (csLoc.getCallee ());
3536 StringAttr unknownFile = mlir::StringAttr::get (loc.getContext (), " <unknown>" );
3637 return mlir::FileLineColLoc::get (unknownFile, 0 , 0 );
3738}
@@ -109,39 +110,39 @@ struct LLVMDIScopePass : public impl::LLVMDIScopeBase<LLVMDIScopePass> {
109110 funcOp->setLoc (FusedLoc::get (context, {loc}, subprogramAttr));
110111 }
111112
112- // Get a nested loc for inlined functions
113- Location getNestedLoc (Operation *op, LLVM::DIScopeAttr scopeAttr,
114- Location calleeLoc) {
115- auto calleeFileName = extractFileLoc (calleeLoc).getFilename ();
116- auto context = op->getContext ();
117- LLVM::DIFileAttr calleeFileAttr = LLVM::DIFileAttr::get (
118- context, llvm::sys::path::filename (calleeFileName),
119- llvm::sys::path::parent_path (calleeFileName));
120- auto lexicalBlockFileAttr = LLVM::DILexicalBlockFileAttr::get (
121- context, scopeAttr, calleeFileAttr, /* discriminator=*/ 0 );
122- Location loc = calleeLoc;
123- if (mlir::isa<CallSiteLoc>(calleeLoc)) {
124- auto nestedLoc = mlir::cast<CallSiteLoc>(calleeLoc).getCallee ();
125- loc = getNestedLoc (op, lexicalBlockFileAttr, nestedLoc);
126- }
127- return FusedLoc::get (context, {loc}, lexicalBlockFileAttr);
128- }
129-
130113 void setLexicalBlockFileAttr (Operation *op) {
131- auto opLoc = op->getLoc ();
132- if (auto callSiteLoc = dyn_cast<CallSiteLoc>(opLoc)) {
133- auto callerLoc = callSiteLoc.getCaller ();
134- auto calleeLoc = callSiteLoc.getCallee ();
135- LLVM::DIScopeAttr scopeAttr;
136- // We assemble the full inline stack so the parent of this loc must be a
137- // function
138- auto funcOp = op->getParentOfType <LLVM::LLVMFuncOp>();
139- auto funcOpLoc = mlir::cast<FusedLoc>(funcOp.getLoc ());
140- scopeAttr = mlir::cast<LLVM::DISubprogramAttr>(funcOpLoc.getMetadata ());
141- auto loc =
142- CallSiteLoc::get (getNestedLoc (op, scopeAttr, calleeLoc), callerLoc);
143- op->setLoc (loc);
144- }
114+ Location opLoc = op->getLoc ();
115+ if (!isa<CallSiteLoc>(opLoc))
116+ return ;
117+
118+ auto funcOp = op->getParentOfType <LLVM::LLVMFuncOp>();
119+ auto funcOpLoc = mlir::cast<FusedLoc>(funcOp.getLoc ());
120+ auto scopeAttr =
121+ mlir::cast<LLVM::DISubprogramAttr>(funcOpLoc.getMetadata ());
122+
123+ MLIRContext *ctx = op->getContext ();
124+ std::function<Location (Location)> makeScoped =
125+ [&](Location loc) -> Location {
126+ if (auto cs = dyn_cast<CallSiteLoc>(loc)) {
127+ Location newCallee = makeScoped (cs.getCallee ());
128+ Location newCaller = makeScoped (cs.getCaller ());
129+ return CallSiteLoc::get (newCallee, newCaller);
130+ }
131+
132+ // Build a DIFile for this leaf location
133+ FileLineColLoc fileLine = extractFileLoc (loc);
134+ StringRef inputFilePath = fileLine.getFilename ().getValue ();
135+ LLVM::DIFileAttr fileAttr =
136+ LLVM::DIFileAttr::get (ctx, llvm::sys::path::filename (inputFilePath),
137+ llvm::sys::path::parent_path (inputFilePath));
138+
139+ auto lexicalBlock =
140+ LLVM::DILexicalBlockFileAttr::get (ctx, scopeAttr, fileAttr,
141+ /* discriminator=*/ 0 );
142+ return FusedLoc::get (ctx, {loc}, lexicalBlock);
143+ };
144+
145+ op->setLoc (makeScoped (opLoc));
145146 }
146147
147148 void runOnOperation () override {
0 commit comments