diff --git a/default.xml b/default.xml index ec1cd045..8e8c6cd5 100644 --- a/default.xml +++ b/default.xml @@ -32,7 +32,7 @@ find(data); if (spec != specifications->end()) { specification_ = &spec->second; - } else { - // The DW_AT_specification is a forward reference. + } else if (data > offset_) { forward_ref_die_offset_ = data; + } else { + cu_context_->reporter->UnknownSpecification(offset_, data); } break; } @@ -544,8 +545,10 @@ void DwarfCUToModule::FuncHandler::ProcessAttributeReference( AbstractOriginByOffset::const_iterator origin = origins.find(data); if (origin != origins.end()) { abstract_origin_ = &(origin->second); - } else { + } else if (data > offset_) { forward_ref_die_offset_ = data; + } else { + cu_context_->reporter->UnknownAbstractOrigin(offset_, data); } break; } @@ -581,9 +584,9 @@ void DwarfCUToModule::FuncHandler::Finish() { // to be processed, and fix up the name of the appropriate Module::Function. // "name_" will have already been fixed up in EndAttributes(). if (!name_.empty()) { - auto Iter = cu_context_->forward_ref_die_to_func.find(offset_); - if (Iter != cu_context_->forward_ref_die_to_func.end()) - Iter->second->name = name_; + auto iter = cu_context_->forward_ref_die_to_func.find(offset_); + if (iter != cu_context_->forward_ref_die_to_func.end()) + iter->second->name = name_; } if (!ranges_) { @@ -638,10 +641,17 @@ void DwarfCUToModule::FuncHandler::Finish() { // If the function address is zero this is a sign that this function // description is just empty debug data and should just be discarded. cu_context_->functions.push_back(func.release()); - if (forward_ref_die_offset_ != 0) - cu_context_->forward_ref_die_to_func[forward_ref_die_offset_] = - cu_context_->functions.back(); - } + if (forward_ref_die_offset_ != 0) { + auto iter = + cu_context_->forward_ref_die_to_func.find(forward_ref_die_offset_); + if (iter == cu_context_->forward_ref_die_to_func.end()) { + cu_context_->reporter->UnknownSpecification(offset_, + forward_ref_die_offset_); + } else { + iter->second = cu_context_->functions.back(); + } + } + } } else if (inline_) { AbstractOrigin origin(name_); cu_context_->file_context->file_private_->origins[offset_] = origin; @@ -695,8 +705,8 @@ void DwarfCUToModule::WarningReporter::UnknownSpecification(uint64 offset, uint64 target) { CUHeading(); fprintf(stderr, "%s: the DIE at offset 0x%llx has a DW_AT_specification" - " attribute referring to the die at offset 0x%llx, which either" - " was not marked as a declaration, or comes later in the file\n", + " attribute referring to the DIE at offset 0x%llx, which was not" + " marked as a declaration\n", filename_.c_str(), offset, target); } @@ -704,8 +714,8 @@ void DwarfCUToModule::WarningReporter::UnknownAbstractOrigin(uint64 offset, uint64 target) { CUHeading(); fprintf(stderr, "%s: the DIE at offset 0x%llx has a DW_AT_abstract_origin" - " attribute referring to the die at offset 0x%llx, which either" - " was not marked as an inline, or comes later in the file\n", + " attribute referring to the DIE at offset 0x%llx, which was not" + " marked as an inline\n", filename_.c_str(), offset, target); }