
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`.
74 lines
2.4 KiB
C++
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;
|
|
}
|