aboutsummaryrefslogtreecommitdiff
path: root/src/common/dwarf_cu_to_module.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/dwarf_cu_to_module.cc')
-rw-r--r--src/common/dwarf_cu_to_module.cc15
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: