[lld] [llvm] [Symbolizer] Support for Missing Line Numbers. (PR #82240)
via llvm-commits
llvm-commits at lists.llvm.org
Wed May 1 03:03:14 PDT 2024
================
@@ -1312,32 +1312,52 @@ uint32_t DWARFDebugLine::LineTable::findRowInSeq(
return RowPos - Rows.begin();
}
-uint32_t DWARFDebugLine::LineTable::lookupAddress(
- object::SectionedAddress Address) const {
+std::pair<uint32_t, bool>
+DWARFDebugLine::LineTable::lookupAddress(object::SectionedAddress Address,
+ bool ApproximateLine) const {
// Search for relocatable addresses
- uint32_t Result = lookupAddressImpl(Address);
+ std::pair<uint32_t, bool> Result =
+ lookupAddressImpl(Address, ApproximateLine);
- if (Result != UnknownRowIndex ||
+ if (Result.first != UnknownRowIndex ||
Address.SectionIndex == object::SectionedAddress::UndefSection)
return Result;
// Search for absolute addresses
Address.SectionIndex = object::SectionedAddress::UndefSection;
- return lookupAddressImpl(Address);
+ return lookupAddressImpl(Address, ApproximateLine);
}
-uint32_t DWARFDebugLine::LineTable::lookupAddressImpl(
- object::SectionedAddress Address) const {
+std::pair<uint32_t, bool>
+DWARFDebugLine::LineTable::lookupAddressImpl(object::SectionedAddress Address,
+ bool ApproximateLine) const {
// First, find an instruction sequence containing the given address.
DWARFDebugLine::Sequence Sequence;
Sequence.SectionIndex = Address.SectionIndex;
Sequence.HighPC = Address.Address;
SequenceIter It = llvm::upper_bound(Sequences, Sequence,
DWARFDebugLine::Sequence::orderByHighPC);
if (It == Sequences.end() || It->SectionIndex != Address.SectionIndex)
- return UnknownRowIndex;
- return findRowInSeq(*It, Address);
+ return {UnknownRowIndex, false};
+
+ uint32_t RowIndex = findRowInSeq(*It, Address);
+ bool IsApproximate = false;
+ if (ApproximateLine) {
+ uint32_t ApproxRowIndex = RowIndex;
+ while (ApproxRowIndex >= It->FirstRowIndex) {
+ if (ApproxRowIndex != UnknownRowIndex && Rows[ApproxRowIndex].Line)
+ break;
+ IsApproximate = true;
+ if (ApproxRowIndex != UnknownRowIndex &&
+ (Rows[ApproxRowIndex].BasicBlock | Rows[ApproxRowIndex].PrologueEnd))
----------------
bd1976bris wrote:
Yes. Agreed. What we are trying to achieve is that the output is similar what a debugger or "objdump -d -S" etc.. would show, whilst being as simple for users to understand as possible. Looking at what llvm-objdump shows it does seem to stop at prologue end, however, our internal debugger does not, and I think both are reasonable. Therefore, unless we have a good justification, my vote is for the simplest implementation - which is only taking sequence boundaries into account.
https://github.com/llvm/llvm-project/pull/82240
More information about the llvm-commits
mailing list