39 THROW(
"DWARF data contained duplicate abbrev code");
45 abbrev.
tag = ReadLEB128<uint16_t>(&
data);
46 has_child = ReadFixed<uint8_t>(&
data);
56 THROWF(
"DWARF has_child is neither true nor false: $0, code=$1, tag=$2",
57 has_child, abbrev.
code, abbrev.
tag);
62 attr.name = ReadLEB128<uint16_t>(&
data);
63 attr.form = ReadLEB128<uint8_t>(&
data);
65 if (
attr.name == 0 &&
attr.form == 0) {
78 if (
len == 0xffffffff) {
80 len = ReadFixed<uint64_t>(remaining);
86 THROW(
"short DWARF compilation unit");
98 if (
section == Section::kDebugInfo) {
99 data = dwarf_.debug_info;
101 data = dwarf_.debug_types;
109 if (next_unit_.empty())
return false;
114 size_t initial_length_len =
data.data() - entire_unit.
data();
115 entire_unit = entire_unit.
substr(0,
data.size() + initial_length_len);
126 entire_unit_ = entire_unit;
128 unit_sizes_.ReadDWARFVersion(&
data);
130 if (unit_sizes_.dwarf_version() > 5) {
131 THROWF(
"Data is in DWARF $0 format which we don't understand",
132 unit_sizes_.dwarf_version());
137 if (unit_sizes_.dwarf_version() == 5) {
138 unit_type_ = ReadFixed<uint8_t>(&
data);
139 unit_sizes_.SetAddressSize(ReadFixed<uint8_t>(&
data));
140 debug_abbrev_offset = unit_sizes_.ReadDWARFOffset(&
data);
142 switch (unit_type_) {
146 dwo_id_ = ReadFixed<uint64_t>(&
data);
149 unit_type_signature_ = ReadFixed<uint64_t>(&
data);
150 unit_type_offset_ = unit_sizes_.ReadDWARFOffset(&
data);
156 fprintf(
stderr,
"warning: Unknown DWARF Unit Type in user defined range\n");
161 debug_abbrev_offset = unit_sizes_.ReadDWARFOffset(&
data);
162 unit_sizes_.SetAddressSize(ReadFixed<uint8_t>(&
data));
164 if (
section == InfoReader::Section::kDebugTypes) {
165 unit_type_signature_ = ReadFixed<uint64_t>(&
data);
166 unit_type_offset_ = unit_sizes_.ReadDWARFOffset(&
data);
170 unit_abbrev_ = &
reader.abbrev_tables_[debug_abbrev_offset];
174 if (unit_abbrev_->IsEmpty()) {
176 SkipBytes(debug_abbrev_offset, &abbrev_data);
177 unit_abbrev_->ReadAbbrevs(abbrev_data);
189 const auto* abbrev = die_reader.
ReadCode(*
this);
196 if (
value.IsString()) {
197 unit_name_ = std::string(value.GetString(*this));
202 stmt_list = value.GetUint(*this);
207 addr_base_ = value.GetUint(*this);
212 str_offsets_base_ = value.GetUint(*this);
217 range_lists_base_ = value.GetUint(*this);
224 if (unit_name_.empty()) {
225 auto iter =
reader.stmt_list_map_.find(*stmt_list);
227 unit_name_ =
iter->second;
230 (
reader.stmt_list_map_)[*stmt_list] = unit_name_;
235 void DIEReader::SkipNullEntries() {
251 THROW(
"couldn't find abbreviation for code");
253 if (
ret->has_child) {
264 int target_depth =
depth_ - 1;
266 while (
depth_ > target_depth) {
269 abbrev = ReadCode(cu);