Skip to content

Commit d76efd8

Browse files
committed
[Symbolize] Add DIContext APIs to return std::optional<DILineInfo> to indicate if debug info is present or not for a given address.
1 parent 1b15a89 commit d76efd8

File tree

7 files changed

+70
-6
lines changed

7 files changed

+70
-6
lines changed

llvm/include/llvm/DebugInfo/BTF/BTFContext.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ class BTFContext final : public DIContext {
4848
std::vector<DILocal>
4949
getLocalsForAddress(object::SectionedAddress Address) override;
5050

51+
std::optional<DILineInfo> getOptionalLineInfoForAddress(
52+
object::SectionedAddress Address,
53+
DILineInfoSpecifier Specifier = DILineInfoSpecifier()) override;
54+
std::optional<DILineInfo>
55+
getOptionalLineInfoForDataAddress(object::SectionedAddress Address) override;
56+
5157
static std::unique_ptr<BTFContext> create(
5258
const object::ObjectFile &Obj,
5359
std::function<void(Error)> ErrorHandler = WithColor::defaultErrorHandler);

llvm/include/llvm/DebugInfo/DIContext.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,12 @@ class DIContext {
267267
virtual std::vector<DILocal>
268268
getLocalsForAddress(object::SectionedAddress Address) = 0;
269269

270+
virtual std::optional<DILineInfo> getOptionalLineInfoForAddress(
271+
object::SectionedAddress Address,
272+
DILineInfoSpecifier Specifier = DILineInfoSpecifier()) = 0;
273+
virtual std::optional<DILineInfo>
274+
getOptionalLineInfoForDataAddress(object::SectionedAddress Address) = 0;
275+
270276
private:
271277
const DIContextKind Kind;
272278
};

llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,12 @@ class DWARFContext : public DIContext {
401401
std::vector<DILocal>
402402
getLocalsForAddress(object::SectionedAddress Address) override;
403403

404+
std::optional<DILineInfo> getOptionalLineInfoForAddress(
405+
object::SectionedAddress Address,
406+
DILineInfoSpecifier Specifier = DILineInfoSpecifier()) override;
407+
std::optional<DILineInfo>
408+
getOptionalLineInfoForDataAddress(object::SectionedAddress Address) override;
409+
404410
bool isLittleEndian() const { return DObj->isLittleEndian(); }
405411
static unsigned getMaxSupportedVersion() { return 5; }
406412
static bool isSupportedVersion(unsigned version) {

llvm/include/llvm/DebugInfo/PDB/PDBContext.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ namespace pdb {
5757
std::vector<DILocal>
5858
getLocalsForAddress(object::SectionedAddress Address) override;
5959

60+
std::optional<DILineInfo> getOptionalLineInfoForAddress(
61+
object::SectionedAddress Address,
62+
DILineInfoSpecifier Specifier = DILineInfoSpecifier()) override;
63+
std::optional<DILineInfo> getOptionalLineInfoForDataAddress(
64+
object::SectionedAddress Address) override;
65+
6066
private:
6167
std::string getFunctionName(uint64_t Address, DINameKind NameKind) const;
6268
std::unique_ptr<IPDBSession> Session;

llvm/lib/DebugInfo/BTF/BTFContext.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,17 @@ using namespace llvm;
2020
using object::ObjectFile;
2121
using object::SectionedAddress;
2222

23+
std::optional<DILineInfo>
24+
BTFContext::getOptionalLineInfoForAddress(object::SectionedAddress Address,
25+
DILineInfoSpecifier Specifier) {
26+
return getLineInfoForAddress(Address, Specifier);
27+
}
28+
29+
std::optional<DILineInfo> BTFContext::getOptionalLineInfoForDataAddress(
30+
object::SectionedAddress Address) {
31+
return getLineInfoForDataAddress(Address);
32+
}
33+
2334
DILineInfo BTFContext::getLineInfoForAddress(SectionedAddress Address,
2435
DILineInfoSpecifier Specifier) {
2536
const BTF::BPFLineInfo *LineInfo = BTF.findLineInfo(Address);

llvm/lib/DebugInfo/DWARF/DWARFContext.cpp

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1732,11 +1732,21 @@ DWARFContext::getLocalsForAddress(object::SectionedAddress Address) {
17321732

17331733
DILineInfo DWARFContext::getLineInfoForAddress(object::SectionedAddress Address,
17341734
DILineInfoSpecifier Spec) {
1735-
DILineInfo Result;
1735+
std::optional<DILineInfo> Result =
1736+
getOptionalLineInfoForAddress(Address, Spec);
1737+
if (Result)
1738+
return *Result;
1739+
return DILineInfo();
1740+
}
1741+
1742+
std::optional<DILineInfo>
1743+
DWARFContext::getOptionalLineInfoForAddress(object::SectionedAddress Address,
1744+
DILineInfoSpecifier Spec) {
17361745
DWARFCompileUnit *CU = getCompileUnitForCodeAddress(Address.Address);
17371746
if (!CU)
1738-
return Result;
1747+
return std::nullopt;
17391748

1749+
DILineInfo Result;
17401750
getFunctionNameAndStartLineForAddress(
17411751
CU, Address.Address, Spec.FNKind, Spec.FLIKind, Result.FunctionName,
17421752
Result.StartFileName, Result.StartLine, Result.StartAddress);
@@ -1753,17 +1763,25 @@ DILineInfo DWARFContext::getLineInfoForAddress(object::SectionedAddress Address,
17531763

17541764
DILineInfo
17551765
DWARFContext::getLineInfoForDataAddress(object::SectionedAddress Address) {
1756-
DILineInfo Result;
1766+
std::optional<DILineInfo> Result = getOptionalLineInfoForDataAddress(Address);
1767+
if (Result)
1768+
return *Result;
1769+
return DILineInfo();
1770+
}
1771+
1772+
std::optional<DILineInfo> DWARFContext::getOptionalLineInfoForDataAddress(
1773+
object::SectionedAddress Address) {
17571774
DWARFCompileUnit *CU = getCompileUnitForDataAddress(Address.Address);
17581775
if (!CU)
1759-
return Result;
1776+
return std::nullopt;
17601777

17611778
if (DWARFDie Die = CU->getVariableForAddress(Address.Address)) {
1779+
DILineInfo Result;
17621780
Result.FileName = Die.getDeclFile(FileLineInfoKind::AbsoluteFilePath);
17631781
Result.Line = Die.getDeclLine();
1782+
return Result;
17641783
}
1765-
1766-
return Result;
1784+
return std::nullopt;
17671785
}
17681786

17691787
DILineInfoTable DWARFContext::getLineInfoForAddressRange(

llvm/lib/DebugInfo/PDB/PDBContext.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,17 @@ PDBContext::PDBContext(const COFFObjectFile &Object,
3232

3333
void PDBContext::dump(raw_ostream &OS, DIDumpOptions DumpOpts){}
3434

35+
std::optional<DILineInfo>
36+
PDBContext::getOptionalLineInfoForAddress(object::SectionedAddress Address,
37+
DILineInfoSpecifier Specifier) {
38+
return getLineInfoForAddress(Address, Specifier);
39+
}
40+
41+
std::optional<DILineInfo> PDBContext::getOptionalLineInfoForDataAddress(
42+
object::SectionedAddress Address) {
43+
return getLineInfoForDataAddress(Address);
44+
}
45+
3546
DILineInfo PDBContext::getLineInfoForAddress(object::SectionedAddress Address,
3647
DILineInfoSpecifier Specifier) {
3748
DILineInfo Result;

0 commit comments

Comments
 (0)