llvm-project/llvm/lib/DebugInfo/BTF/BTFContext.cpp
Zequan Wu 6dbe82f061
[NFC][DebugInfo] Wrap DILineInfo return type with std::optional to handle missing debug info. (#129792)
Currently, `DIContext::getLineInfoForAddress` and
`DIContext::getLineInfoForDataAddress` returns empty DILineInfo when the
debug info is missing for the given address. This is not differentiable
with the case when debug info is found for the given address but the
debug info is default value (filename:linenum is <invalid>:0).

This change wraps the return types of `DIContext::getLineInfoForAddress`
and `DIContext::getLineInfoForDataAddress` with `std::optional`.
2025-03-17 17:01:06 -04:00

74 lines
2.4 KiB
C++

//===- BTFContext.cpp ---------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// Implementation of the BTFContext interface, this is used by
// llvm-objdump tool to print source code alongside disassembly.
// In fact, currently it is a simple wrapper for BTFParser instance.
//
//===----------------------------------------------------------------------===//
#include "llvm/DebugInfo/BTF/BTFContext.h"
#define DEBUG_TYPE "debug-info-btf-context"
using namespace llvm;
using object::ObjectFile;
using object::SectionedAddress;
std::optional<DILineInfo>
BTFContext::getLineInfoForAddress(SectionedAddress Address,
DILineInfoSpecifier Specifier) {
const BTF::BPFLineInfo *LineInfo = BTF.findLineInfo(Address);
DILineInfo Result;
if (!LineInfo)
return std::nullopt;
Result.LineSource = BTF.findString(LineInfo->LineOff);
Result.FileName = BTF.findString(LineInfo->FileNameOff);
Result.Line = LineInfo->getLine();
Result.Column = LineInfo->getCol();
return Result;
}
std::optional<DILineInfo>
BTFContext::getLineInfoForDataAddress(SectionedAddress Address) {
// BTF does not convey such information.
return std::nullopt;
}
DILineInfoTable
BTFContext::getLineInfoForAddressRange(SectionedAddress Address, uint64_t Size,
DILineInfoSpecifier Specifier) {
// This function is used only from llvm-rtdyld utility and a few
// JITEventListener implementations. Ignore it for now.
return {};
}
DIInliningInfo
BTFContext::getInliningInfoForAddress(SectionedAddress Address,
DILineInfoSpecifier Specifier) {
// BTF does not convey such information
return {};
}
std::vector<DILocal> BTFContext::getLocalsForAddress(SectionedAddress Address) {
// BTF does not convey such information
return {};
}
std::unique_ptr<BTFContext>
BTFContext::create(const ObjectFile &Obj,
std::function<void(Error)> ErrorHandler) {
auto Ctx = std::make_unique<BTFContext>();
BTFParser::ParseOptions Opts;
Opts.LoadLines = true;
if (Error E = Ctx->BTF.parse(Obj, Opts))
ErrorHandler(std::move(E));
return Ctx;
}