diff options
-rw-r--r-- | src/common/dwarf/cfi_assembler.cc | 16 | ||||
-rw-r--r-- | src/common/dwarf/cfi_assembler.h | 15 | ||||
-rw-r--r-- | src/common/linux/dump_symbols.cc | 3 |
3 files changed, 24 insertions, 10 deletions
diff --git a/src/common/dwarf/cfi_assembler.cc b/src/common/dwarf/cfi_assembler.cc index 110aa2e7..50e92e5a 100644 --- a/src/common/dwarf/cfi_assembler.cc +++ b/src/common/dwarf/cfi_assembler.cc @@ -52,18 +52,14 @@ CFISection &CFISection::CIEHeader(u_int64_t code_alignment_factor, in_fde_ = false; if (dwarf64) { - D32(0xffffffff); + D32(kDwarf64InitialLengthMarker); D64(entry_length_->length); entry_length_->start = Here(); - // Write the CIE distinguished value. In .debug_frame sections, it's - // ~0; in .eh_frame sections, it's zero. - D64(eh_frame_ ? 0 : ~(u_int64_t)0); + D64(eh_frame_ ? kEHFrame64CIEIdentifier : kDwarf64CIEIdentifier); } else { D32(entry_length_->length); entry_length_->start = Here(); - // Write the CIE distinguished value. In .debug_frame sections, it's - // ~0; in .eh_frame sections, it's zero. - D32(eh_frame_ ? 0 : ~(u_int32_t)0); + D32(eh_frame_ ? kEHFrame32CIEIdentifier : kDwarf32CIEIdentifier); } D8(version); AppendCString(augmentation); @@ -193,4 +189,10 @@ CFISection &CFISection::EncodedPointer(u_int64_t address, return *this; }; +const u_int32_t CFISection::kDwarf64InitialLengthMarker; +const u_int32_t CFISection::kDwarf32CIEIdentifier; +const u_int64_t CFISection::kDwarf64CIEIdentifier; +const u_int32_t CFISection::kEHFrame32CIEIdentifier; +const u_int64_t CFISection::kEHFrame64CIEIdentifier; + } // namespace google_breakpad diff --git a/src/common/dwarf/cfi_assembler.h b/src/common/dwarf/cfi_assembler.h index 4c9f57de..3f305030 100644 --- a/src/common/dwarf/cfi_assembler.h +++ b/src/common/dwarf/cfi_assembler.h @@ -31,7 +31,7 @@ // Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com> -// cfi-assembler.h: Define CFISection, a class for creating properly +// cfi_assembler.h: Define CFISection, a class for creating properly // (and improperly) formatted DWARF CFI data for unit tests. #ifndef PROCESSOR_CFI_ASSEMBLER_H_ @@ -219,6 +219,19 @@ class CFISection: public Section { Label start; }; + // Constants used in CFI/.eh_frame data: + + // If the first four bytes of an "initial length" are this constant, then + // the data uses the 64-bit DWARF format, and the length itself is the + // subsequent eight bytes. + static const u_int32_t kDwarf64InitialLengthMarker = 0xffffffffU; + + // The CIE identifier for 32- and 64-bit DWARF CFI and .eh_frame data. + static const u_int32_t kDwarf32CIEIdentifier = ~(u_int32_t)0; + static const u_int64_t kDwarf64CIEIdentifier = ~(u_int64_t)0; + static const u_int32_t kEHFrame32CIEIdentifier = 0; + static const u_int64_t kEHFrame64CIEIdentifier = 0; + // The size of a machine address for the data in this section. size_t address_size_; diff --git a/src/common/linux/dump_symbols.cc b/src/common/linux/dump_symbols.cc index 900385e1..a9d2cb46 100644 --- a/src/common/linux/dump_symbols.cc +++ b/src/common/linux/dump_symbols.cc @@ -239,8 +239,7 @@ static bool LoadDwarf(const string &dwarf_filename, // success, or false if we don't recognize HEADER's machine // architecture. static bool DwarfCFIRegisterNames(const ElfW(Ehdr) *elf_header, - vector<string> *register_names) -{ + vector<string> *register_names) { switch (elf_header->e_machine) { case EM_386: *register_names = DwarfCFIToModule::RegisterNames::I386(); |