diff options
author | Sterling Augustine <saugustine@google.com> | 2020-06-26 11:24:16 -0700 |
---|---|---|
committer | Sterling Augustine <saugustine@google.com> | 2020-06-26 18:32:51 +0000 |
commit | b6f36dd7757f5cdb460f7b2ccf4f646099a320af (patch) | |
tree | 2044f081ceabc560624471a73ea6eb80d65303e6 /src/common/dwarf | |
parent | Read dwarf5 compilation unit headers. (diff) | |
download | breakpad-b6f36dd7757f5cdb460f7b2ccf4f646099a320af.tar.xz |
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 <mark@chromium.org>
Diffstat (limited to 'src/common/dwarf')
-rw-r--r-- | src/common/dwarf/dwarf2reader.cc | 26 | ||||
-rw-r--r-- | src/common/dwarf/dwarf2reader.h | 21 | ||||
-rw-r--r-- | src/common/dwarf/functioninfo.cc | 3 |
3 files changed, 29 insertions, 21 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<Abbrev>; @@ -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<string, std::pair<const uint8_t *, uint64_t> > 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<std::pair<enum DwarfAttribute, enum DwarfForm> > 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<LineInfo> lireader(new LineInfo(iter->second.first + data, |