Index: experimental/visual_studio_plugin/src/dwarf_reader/dwarf_parser.cc |
diff --git a/experimental/visual_studio_plugin/src/dwarf_reader/dwarf_parser.cc b/experimental/visual_studio_plugin/src/dwarf_reader/dwarf_parser.cc |
deleted file mode 100644 |
index f016db0b424512d63ddfc8f2a7030ff7138b65e9..0000000000000000000000000000000000000000 |
--- a/experimental/visual_studio_plugin/src/dwarf_reader/dwarf_parser.cc |
+++ /dev/null |
@@ -1,209 +0,0 @@ |
-// Copyright (c) 2011 The Native Client Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include <stdlib.h> |
- |
-#include "common/dwarf/bytereader.h" |
- |
-#include "dwarf_reader/dwarf_frame_info_reader.h" |
-#include "dwarf_reader/dwarf_info_parser.h" |
-#include "dwarf_reader/dwarf_line_parser.h" |
-#include "dwarf_reader/dwarf_parser.h" |
-#include "dwarf_reader/dwarf_reader.h" |
-#include "dwarf_reader/elf_section_reader.h" |
-#include "dwarf_reader/parse_state.h" |
- |
-#include "elf_reader/elf_object.h" |
- |
-namespace { |
- const uint64 kMaxValue = static_cast<uint64>(-1); |
-} |
- |
-namespace dwarf_reader { |
- |
-DwarfParser::DwarfParser() |
- : elf_section_reader_(NULL), |
- file_path_(NULL), |
- is_initialized_(false) { } |
- |
-DwarfParser::~DwarfParser() { |
- delete elf_section_reader_; |
-} |
- |
-bool DwarfParser::Init(elf_reader::ElfObject *elf_object) { |
- if (NULL == elf_object) return false; |
- |
- file_path_ = elf_object->GetPath(); |
- elf_section_reader_ = new ElfSectionReader(); |
- |
- if (NULL == file_path_ || NULL == elf_section_reader_) return false; |
- |
- elf_object->Parse(elf_section_reader_); |
- is_initialized_ = true; |
- |
- return is_initialized_; |
-} |
- |
-void DwarfParser::PopulateReader(IDwarfReader *dwarf_reader) const { |
- if (is_initialized_) { |
- PopulateCompilationUnits(dwarf_reader); |
- PopulateCallFrameInfo(dwarf_reader); |
- PopulateLocationLists(dwarf_reader); |
- PopulateRangeLists(dwarf_reader); |
- } |
-} |
- |
-void DwarfParser::PopulateCallFrameInfo(IDwarfReader *dwarf_reader) const { |
- SectionInfo debug_frame_section = |
- elf_section_reader_->GetSectionInfo(".eh_frame"); |
- SectionInfo text_section = elf_section_reader_->GetSectionInfo(".text"); |
- |
- elf_section_reader_->GetByteReader()->SetTextBase( |
- reinterpret_cast<uint64>(text_section.first)); |
- elf_section_reader_->GetByteReader()->SetCFIDataBase( |
- elf_section_reader_->GetSectionLoadAddress(".eh_frame"), |
- debug_frame_section.first); |
- |
- // Read the call frame information |
- dwarf2reader::CallFrameInfo::Reporter reporter(file_path_); |
- DwarfFrameInfoReader handler(dwarf_reader); |
- dwarf2reader::CallFrameInfo cfi_reader( |
- debug_frame_section.first, |
- debug_frame_section.second, |
- elf_section_reader_->GetByteReader(), |
- &handler, |
- &reporter, |
- true); |
- cfi_reader.Start(); |
-} |
- |
-void DwarfParser::PopulateCompilationUnits(IDwarfReader *dwarf_reader) const { |
- ParseState parse_state; |
- |
- SectionInfo debug_info_section = |
- elf_section_reader_->GetSectionInfo(".debug_info"); |
- SectionInfo debug_line_section = |
- elf_section_reader_->GetSectionInfo(".debug_line"); |
- |
- DwarfInfoParser info_handler(&parse_state, dwarf_reader); |
- DwarfLineParser line_handler(&parse_state, dwarf_reader); |
- |
- uint64 debug_info_length = debug_info_section.second; |
- uint64 debug_line_length = debug_line_section.second; |
- const char *debug_line_ptr = debug_line_section.first; |
- for (uint64 offset = 0; offset < debug_info_length;) { |
- dwarf2reader::CompilationUnit compilation_unit_reader( |
- elf_section_reader_->sections(), |
- offset, |
- elf_section_reader_->GetByteReader(), |
- &info_handler); |
- |
- // Process the entire compilation unit; get the offset of the next. |
- offset += compilation_unit_reader.Start(); |
- |
- // Process the matching line information; get the offset of the next. |
- dwarf2reader::LineInfo lineInfo(debug_line_ptr, |
- debug_line_length, |
- elf_section_reader_->GetByteReader(), |
- &line_handler); |
- |
- debug_line_ptr += lineInfo.Start(); |
- |
- // Pop the end of the compilation unit manually |
- dwarf_reader->EndCompilationUnit(parse_state.GetTopStackContext(), |
- parse_state.GetTopStackAddress()); |
- parse_state.PopStackFrame(); |
- } |
-} |
- |
-void DwarfParser::PopulateLocationLists(IDwarfReader *dwarf_reader) const { |
- SectionInfo debug_loc_section = |
- elf_section_reader_->GetSectionInfo(".debug_loc"); |
- |
- // Read the location list |
- const char* debug_loc_ptr = debug_loc_section.first; |
- const char* current = debug_loc_ptr; |
- uint64 debug_loc_length = debug_loc_section.second; |
- const char* debug_loc_end = debug_loc_ptr + debug_loc_length; |
- dwarf2reader::ByteReader* byte_reader = |
- elf_section_reader_->GetByteReader(); |
- bool is_first = true; |
- while (current < debug_loc_end) { |
- // Layout of the debug_loc block is: |
- // |
- // LowPc - address |
- // HighPc - address |
- // DataLength - ushort (optional) |
- // Data - byte[] (optional) |
- uint64 offset = current - debug_loc_ptr; |
- uint64 low_pc = byte_reader->ReadAddress(current); |
- current += byte_reader->AddressSize(); |
- uint64 high_pc = byte_reader->ReadAddress(current); |
- current += byte_reader->AddressSize(); |
- |
- size_t data_size = 0; |
- const void* data = 0; |
- |
- if (0 == low_pc && 0 == high_pc) { |
- // if low_pc and high_pc are both zero, that signals end of list. |
- is_first = true; |
- continue; |
- } else if (kMaxValue == low_pc) { |
- // the location is an absolute address; its value is in high_pc. |
- data_size = 4; |
- data = &high_pc; |
- } else { |
- data_size = byte_reader->ReadTwoBytes(current); |
- current += 2; |
- data = reinterpret_cast<const void *>(current); |
- current += data_size; |
- } |
- dwarf_reader->AddLocListEntry(offset, |
- is_first, |
- low_pc, |
- high_pc, |
- data, |
- data_size); |
- is_first = false; |
- } |
-} |
- |
-void DwarfParser::PopulateRangeLists(IDwarfReader *dwarf_reader) const { |
- SectionInfo debug_ranges_section = |
- elf_section_reader_->GetSectionInfo(".debug_ranges"); |
- |
- const char *debug_ranges_start = debug_ranges_section.first; |
- const char *current = debug_ranges_section.first; |
- const char *debug_ranges_end = |
- debug_ranges_start + debug_ranges_section.second; |
- |
- dwarf2reader::ByteReader *byte_reader = |
- elf_section_reader_->GetByteReader(); |
- |
- uint64 offset = 0; |
- // When there is no explicit base_address set, we want to populate the range |
- // list entry with max value. By convention, this means that the |
- // compilation unit's base will serve as the base for these entries. |
- uint64 base_address = kMaxValue; |
- |
- while (current < debug_ranges_end) { |
- uint64 low_pc = byte_reader->ReadAddress(current); |
- current += byte_reader->AddressSize(); |
- uint64 high_pc = byte_reader->ReadAddress(current); |
- current += byte_reader->AddressSize(); |
- |
- if (0 == low_pc && 0 == high_pc) { |
- // We are now looking at the start of the next list. |
- offset = current - debug_ranges_start; |
- base_address = kMaxValue; |
- } else if (kMaxValue == low_pc) { |
- // This entry is an base address; its value is in high_pc. |
- base_address = high_pc; |
- } else { |
- dwarf_reader->AddRangeListEntry(offset, base_address, low_pc, high_pc); |
- } |
- } |
-} |
- |
-} // namespace dwarf_parser |