diff options
Diffstat (limited to 'src/common/dwarf_cu_to_module.cc')
-rw-r--r-- | src/common/dwarf_cu_to_module.cc | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/common/dwarf_cu_to_module.cc b/src/common/dwarf_cu_to_module.cc index a5bc7d6c..589f8bb2 100644 --- a/src/common/dwarf_cu_to_module.cc +++ b/src/common/dwarf_cu_to_module.cc @@ -134,6 +134,7 @@ DwarfCUToModule::FileContext::FileContext(const string& filename, : filename_(filename), module_(module), handle_inter_cu_refs_(handle_inter_cu_refs), + range_list_reader_(nullptr, 0, nullptr), file_private_(new FilePrivate()) { } @@ -193,7 +194,7 @@ struct DwarfCUToModule::CUContext { // For printing error messages. WarningReporter* reporter; - // For reading ranges from the .debug_ranges section + // For handling ranges, however they may be specified. RangesHandler* ranges_handler; // The source language of this compilation unit. @@ -206,6 +207,9 @@ struct DwarfCUToModule::CUContext { uint64_t high_pc; uint64_t ranges; + // For reading dwarf4 ranges. + scoped_ptr<dwarf2reader::RangeListReader> range_list_reader_; + // The functions defined in this compilation unit. We accumulate // them here during parsing. Then, in DwarfCUToModule::Finish, we // assign them lines and add them to file_context->module. @@ -512,6 +516,15 @@ void DwarfCUToModule::FuncHandler::ProcessAttributeUnsigned( break; case dwarf2reader::DW_AT_ranges: ranges_ = data; + if (cu_context_->ranges_handler) { + cu_context_->ranges_handler->SetRangesReader( + &cu_context_->file_context->range_list_reader_); + } else { + cu_context_->reporter->MissingRanges(); + // The rest of the code will fall back to low-pc, which is better than + // nothing. + ranges_ = 0; + } break; default: |