aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/common/dwarf/cfi_assembler.cc16
-rw-r--r--src/common/dwarf/cfi_assembler.h15
-rw-r--r--src/common/linux/dump_symbols.cc3
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();