1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 01:47:35 +00:00

LibDebug: Port the rest of DWARF parsing to Core::Stream

This commit is contained in:
Tim Schumacher 2023-01-22 00:37:38 +01:00 committed by Andreas Kling
parent e62269650a
commit 91505d8cf3
8 changed files with 144 additions and 163 deletions

View file

@ -7,8 +7,8 @@
#pragma once
#include <AK/DeprecatedFlyString.h>
#include <AK/MemoryStream.h>
#include <AK/Vector.h>
#include <LibCore/Stream.h>
#include <LibDebug/Dwarf/DwarfTypes.h>
namespace Debug::Dwarf {
@ -65,6 +65,18 @@ struct [[gnu::packed]] LineProgramUnitHeader32 {
i8 line_base() const { return (common.version <= 4) ? v4.line_base : v5.line_base; }
u8 line_range() const { return (common.version <= 4) ? v4.line_range : v5.line_range; }
u8 opcode_base() const { return (common.version <= 4) ? v4.opcode_base : v5.opcode_base; }
static ErrorOr<LineProgramUnitHeader32> read_from_stream(Core::Stream::Stream& stream)
{
LineProgramUnitHeader32 header;
TRY(stream.read_entire_buffer(Bytes { &header.common, sizeof(header.common) }));
if (header.common.version <= 4)
TRY(stream.read_entire_buffer(Bytes { &header.v4, sizeof(header.v4) }));
else
TRY(stream.read_entire_buffer(Bytes { &header.v5, sizeof(header.v5) }));
TRY(stream.read_entire_buffer(Bytes { &header.std_opcode_lengths, min(sizeof(header.std_opcode_lengths), (header.opcode_base() - 1) * sizeof(header.std_opcode_lengths[0])) }));
return header;
}
};
enum class ContentType {
@ -92,23 +104,12 @@ enum class PathListType {
Filenames,
};
inline InputStream& operator>>(InputStream& stream, LineProgramUnitHeader32& header)
{
stream.read_or_error(Bytes { &header.common, sizeof(header.common) });
if (header.common.version <= 4)
stream.read_or_error(Bytes { &header.v4, sizeof(header.v4) });
else
stream.read_or_error(Bytes { &header.v5, sizeof(header.v5) });
stream.read_or_error(Bytes { &header.std_opcode_lengths, min(sizeof(header.std_opcode_lengths), (header.opcode_base() - 1) * sizeof(header.std_opcode_lengths[0])) });
return stream;
}
class LineProgram {
AK_MAKE_NONCOPYABLE(LineProgram);
AK_MAKE_NONMOVABLE(LineProgram);
public:
explicit LineProgram(DwarfInfo& dwarf_info, InputMemoryStream& stream);
explicit LineProgram(DwarfInfo& dwarf_info, Core::Stream::SeekableStream& stream);
struct LineInfo {
FlatPtr address { 0 };
@ -173,7 +174,7 @@ private:
static constexpr u16 MAX_DWARF_VERSION = 5;
DwarfInfo& m_dwarf_info;
InputMemoryStream& m_stream;
Core::Stream::SeekableStream& m_stream;
size_t m_unit_offset { 0 };
LineProgramUnitHeader32 m_unit_header {};