30 if (
index >= filenames_.size()) {
31 THROW(
"filename index out of range");
35 if (expanded_filenames_.size() <=
index) {
36 expanded_filenames_.resize(filenames_.size());
52 void LineInfoReader::Advance(
uint64_t amount) {
53 if (params_.maximum_operations_per_instruction == 1) {
58 DoAdvance(amount, params_.maximum_operations_per_instruction);
63 info_.address += params_.minimum_instruction_length *
68 void LineInfoReader::SpecialOpcodeAdvance(
uint8_t op) {
69 Advance(AdjustedOpcode(
op) / params_.line_range);
73 return op - params_.opcode_base;
80 sizes_.SetAddressSize(address_size);
81 data = sizes_.ReadInitialLength(&
data);
82 sizes_.ReadDWARFVersion(&
data);
87 params_.minimum_instruction_length = ReadFixed<uint8_t>(&
data);
88 if (sizes_.dwarf_version() == 4) {
89 params_.maximum_operations_per_instruction = ReadFixed<uint8_t>(&
data);
91 if (params_.maximum_operations_per_instruction == 0) {
92 THROW(
"DWARF line info had maximum_operations_per_instruction=0");
95 params_.maximum_operations_per_instruction = 1;
97 params_.default_is_stmt = ReadFixed<uint8_t>(&
data);
98 params_.line_base = ReadFixed<int8_t>(&
data);
99 params_.line_range = ReadFixed<uint8_t>(&
data);
100 params_.opcode_base = ReadFixed<uint8_t>(&
data);
101 if (params_.line_range == 0) {
102 THROW(
"line_range of zero will cause divide by zero");
105 standard_opcode_lengths_.resize(params_.opcode_base);
106 for (
size_t i = 1;
i < params_.opcode_base;
i++) {
107 standard_opcode_lengths_[
i] = ReadFixed<uint8_t>(&
data);
111 include_directories_.clear();
121 include_directories_.push_back(dir);
126 expanded_filenames_.clear();
140 THROW(
"directory index out of range");
142 filenames_.push_back(file_name);
150 bool LineInfoReader::ReadLineInfo() {
152 info_.discriminator = 0;
153 info_.basic_block =
false;
154 info_.prologue_end =
false;
155 info_.epilogue_begin =
false;
158 info_.end_sequence =
false;
170 if (
op >= params_.opcode_base) {
171 SpecialOpcodeAdvance(
op);
173 params_.line_base + (AdjustedOpcode(
op) % params_.line_range);
183 switch (extended_op) {
190 info_.end_sequence =
true;
198 info_.address = sizes_.ReadAddress(&
data);
200 shadow_ = (
info_.address == 0);
209 THROW(
"directory index out of range");
211 filenames_.push_back(file_name);
215 info_.discriminator = ReadLEB128<uint32_t>(&
data);
222 "bloaty: warning: unknown DWARF line table extended "
237 Advance(ReadLEB128<uint64_t>(&
data));
240 info_.line += ReadLEB128<int32_t>(&
data);
243 info_.file = ReadLEB128<uint32_t>(&
data);
244 if (
info_.file >= filenames_.size()) {
245 THROW(
"filename index too big");
249 info_.column = ReadLEB128<uint32_t>(&
data);
255 info_.basic_block =
true;
258 SpecialOpcodeAdvance(255);
261 info_.address += ReadFixed<uint16_t>(&
data);
265 info_.prologue_end =
true;
268 info_.epilogue_begin =
true;
278 "bloaty: warning: unknown DWARF line table opcode: %d\n",