Skip to content

Commit 7beed0d

Browse files
authored
[LINE-INFO] Fix construction of nested CallSiteLoc (#8106)
1 parent d0153b2 commit 7beed0d

File tree

1 file changed

+35
-34
lines changed

1 file changed

+35
-34
lines changed

lib/Target/LLVMIR/LLVMDIScope.cpp

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)