From b6f36dd7757f5cdb460f7b2ccf4f646099a320af Mon Sep 17 00:00:00 2001 From: Sterling Augustine Date: Fri, 26 Jun 2020 11:24:16 -0700 Subject: Move GetSectionByName out of CompilationUnit. For the upcoming Dwarf5 LineInfo changes, we will need to get several additional sections by name, but without a the Compilation Unit. This change prepares for that. Change-Id: I566855abb339a856110a2f7d243d3848fe2b3c18 Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/2268861 Reviewed-by: Mark Mentovai --- src/common/dwarf/dwarf2reader.cc | 26 ++++++++++++++++++++------ src/common/dwarf/dwarf2reader.h | 21 +++++++-------------- src/common/dwarf/functioninfo.cc | 3 ++- src/common/dwarf_cu_to_module.cc | 6 +----- 4 files changed, 30 insertions(+), 26 deletions(-) diff --git a/src/common/dwarf/dwarf2reader.cc b/src/common/dwarf/dwarf2reader.cc index 138f9200..a7eedaa1 100644 --- a/src/common/dwarf/dwarf2reader.cc +++ b/src/common/dwarf/dwarf2reader.cc @@ -53,6 +53,18 @@ namespace dwarf2reader { +const SectionMap::const_iterator GetSectionByName(const SectionMap& + sections, const char *name) { + assert(name[0] == '.'); + auto iter = sections.find(name); + if (iter != sections.end()) + return iter; + std::string macho_name("__"); + macho_name += name + 1; + iter = sections.find(macho_name); + return iter; +} + CompilationUnit::CompilationUnit(const string& path, const SectionMap& sections, uint64_t offset, ByteReader* reader, Dwarf2Handler* handler) @@ -100,7 +112,8 @@ void CompilationUnit::ReadAbbrevs() { return; // First get the debug_abbrev section. - SectionMap::const_iterator iter = GetSectionByName(".debug_abbrev"); + SectionMap::const_iterator iter = + GetSectionByName(sections_, ".debug_abbrev"); assert(iter != sections_.end()); abbrevs_ = new std::vector; @@ -352,7 +365,8 @@ void CompilationUnit::ReadHeader() { uint64_t CompilationUnit::Start() { // First get the debug_info section. - SectionMap::const_iterator iter = GetSectionByName(".debug_info"); + SectionMap::const_iterator iter = + GetSectionByName(sections_, ".debug_info"); assert(iter != sections_.end()); // Set up our buffer @@ -383,28 +397,28 @@ uint64_t CompilationUnit::Start() { ReadAbbrevs(); // Set the string section if we have one. - iter = GetSectionByName(".debug_str"); + iter = GetSectionByName(sections_, ".debug_str"); if (iter != sections_.end()) { string_buffer_ = iter->second.first; string_buffer_length_ = iter->second.second; } // Set the line string section if we have one. - iter = GetSectionByName(".debug_line_str"); + iter = GetSectionByName(sections_, ".debug_line_str"); if (iter != sections_.end()) { line_string_buffer_ = iter->second.first; line_string_buffer_length_ = iter->second.second; } // Set the string offsets section if we have one. - iter = GetSectionByName(".debug_str_offsets"); + iter = GetSectionByName(sections_, ".debug_str_offsets"); if (iter != sections_.end()) { str_offsets_buffer_ = iter->second.first; str_offsets_buffer_length_ = iter->second.second; } // Set the address section if we have one. - iter = GetSectionByName(".debug_addr"); + iter = GetSectionByName(sections_, ".debug_addr"); if (iter != sections_.end()) { addr_buffer_ = iter->second.first; addr_buffer_length_ = iter->second.second; diff --git a/src/common/dwarf/dwarf2reader.h b/src/common/dwarf/dwarf2reader.h index cd91b107..228c867f 100644 --- a/src/common/dwarf/dwarf2reader.h +++ b/src/common/dwarf/dwarf2reader.h @@ -65,6 +65,13 @@ class DwpReader; // This maps from a string naming a section to a pair containing a // the data for the section, and the size of the section. typedef std::map > SectionMap; + +// Abstract away the difference between elf and mach-o section names. +// Elf-names use ".section_name, mach-o uses "__section_name". Pass "name" in +// the elf form, ".section_name". +const SectionMap::const_iterator GetSectionByName(const SectionMap& + sections, const char *name); + typedef std::list > AttributeList; typedef AttributeList::iterator AttributeIterator; @@ -544,20 +551,6 @@ class CompilationUnit { void ReadDebugSectionsFromDwo(ElfReader* elf_reader, SectionMap* sections); - // Abstract away the difference between elf, mach-o, and Mac OS section names. - // Elf-names use ".section_name, others use "__section_name". Pass "name" in - // the elf form, ".section_name". - const SectionMap::const_iterator GetSectionByName(const char *name) { - assert(name[0] == '.'); - auto iter = sections_.find(name); - if (iter != sections_.end()) - return iter; - std::string macho_name("__"); - macho_name += name + 1; - iter = sections_.find(macho_name); - return iter; - } - // Path of the file containing the debug information. const string path_; diff --git a/src/common/dwarf/functioninfo.cc b/src/common/dwarf/functioninfo.cc index 358a6eef..edd1bb70 100644 --- a/src/common/dwarf/functioninfo.cc +++ b/src/common/dwarf/functioninfo.cc @@ -164,7 +164,8 @@ void CUFunctionInfoHandler::ProcessAttributeUnsigned(uint64_t offset, enum DwarfForm form, uint64_t data) { if (attr == DW_AT_stmt_list) { - SectionMap::const_iterator iter = sections_.find("__debug_line"); + SectionMap::const_iterator iter = + GetSectionByName(sections_, ".debug_line"); assert(iter != sections_.end()); scoped_ptr lireader(new LineInfo(iter->second.first + data, diff --git a/src/common/dwarf_cu_to_module.cc b/src/common/dwarf_cu_to_module.cc index 24bbf83b..be044ce3 100644 --- a/src/common/dwarf_cu_to_module.cc +++ b/src/common/dwarf_cu_to_module.cc @@ -935,11 +935,7 @@ void DwarfCUToModule::ReadSourceLines(uint64_t offset) { const dwarf2reader::SectionMap §ion_map = cu_context_->file_context->section_map(); dwarf2reader::SectionMap::const_iterator map_entry - = section_map.find(".debug_line"); - // Mac OS X puts DWARF data in sections whose names begin with "__" - // instead of ".". - if (map_entry == section_map.end()) - map_entry = section_map.find("__debug_line"); + = dwarf2reader::GetSectionByName(section_map, ".debug_line"); if (map_entry == section_map.end()) { cu_context_->reporter->MissingSection(".debug_line"); return; -- cgit v1.2.1