| Index: experimental/visual_studio_plugin/third_party/breakpad/common/dwarf/functioninfo.cc
|
| diff --git a/experimental/visual_studio_plugin/third_party/breakpad/common/dwarf/functioninfo.cc b/experimental/visual_studio_plugin/third_party/breakpad/common/dwarf/functioninfo.cc
|
| deleted file mode 100644
|
| index d8ab7da9d1cc6e009d152691008f02bc4237fd2f..0000000000000000000000000000000000000000
|
| --- a/experimental/visual_studio_plugin/third_party/breakpad/common/dwarf/functioninfo.cc
|
| +++ /dev/null
|
| @@ -1,226 +0,0 @@
|
| -// Copyright (c) 2010 Google Inc. All Rights Reserved.
|
| -//
|
| -// Redistribution and use in source and binary forms, with or without
|
| -// modification, are permitted provided that the following conditions are
|
| -// met:
|
| -//
|
| -// * Redistributions of source code must retain the above copyright
|
| -// notice, this list of conditions and the following disclaimer.
|
| -// * Redistributions in binary form must reproduce the above
|
| -// copyright notice, this list of conditions and the following disclaimer
|
| -// in the documentation and/or other materials provided with the
|
| -// distribution.
|
| -// * Neither the name of Google Inc. nor the names of its
|
| -// contributors may be used to endorse or promote products derived from
|
| -// this software without specific prior written permission.
|
| -//
|
| -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| -
|
| -// This is a client for the dwarf2reader to extract function and line
|
| -// information from the debug info.
|
| -
|
| -#include <assert.h>
|
| -#include <limits.h>
|
| -#include <stdio.h>
|
| -
|
| -#include <map>
|
| -#include <queue>
|
| -#include <vector>
|
| -#include <memory>
|
| -
|
| -#include "common/dwarf/functioninfo.h"
|
| -
|
| -#include "common/dwarf/bytereader.h"
|
| -
|
| -
|
| -namespace dwarf2reader {
|
| -
|
| -CULineInfoHandler::CULineInfoHandler(vector<SourceFileInfo>* files,
|
| - vector<string>* dirs,
|
| - LineMap* linemap):linemap_(linemap),
|
| - files_(files),
|
| - dirs_(dirs) {
|
| - // The dirs and files are 1 indexed, so just make sure we put
|
| - // nothing in the 0 vector.
|
| - assert(dirs->size() == 0);
|
| - assert(files->size() == 0);
|
| - dirs->push_back("");
|
| - SourceFileInfo s;
|
| - s.name = "";
|
| - s.lowpc = ULLONG_MAX;
|
| - files->push_back(s);
|
| -}
|
| -
|
| -void CULineInfoHandler::DefineDir(const string& name, uint32 dir_num) {
|
| - // These should never come out of order, actually
|
| - assert(dir_num == dirs_->size());
|
| - dirs_->push_back(name);
|
| -}
|
| -
|
| -void CULineInfoHandler::DefineFile(const string& name,
|
| - int32 file_num, uint32 dir_num,
|
| - uint64 mod_time, uint64 length) {
|
| - assert(dir_num >= 0);
|
| - assert(dir_num < dirs_->size());
|
| -
|
| - // These should never come out of order, actually.
|
| - if (file_num == (int32)files_->size() || file_num == -1) {
|
| - string dir = dirs_->at(dir_num);
|
| -
|
| - SourceFileInfo s;
|
| - s.lowpc = ULLONG_MAX;
|
| -
|
| - if (dir == "") {
|
| - s.name = name;
|
| - } else {
|
| - s.name = dir + "/" + name;
|
| - }
|
| -
|
| - files_->push_back(s);
|
| - } else {
|
| - fprintf(stderr, "error in DefineFile");
|
| - }
|
| -}
|
| -
|
| -void CULineInfoHandler::AddLine(uint64 address, uint64 length, uint32 file_num,
|
| - uint32 line_num, uint32 column_num) {
|
| - if (file_num < files_->size()) {
|
| - linemap_->insert(make_pair(address, make_pair(files_->at(file_num).name.c_str(),
|
| - line_num)));
|
| -
|
| - if(address < files_->at(file_num).lowpc) {
|
| - files_->at(file_num).lowpc = address;
|
| - }
|
| - } else {
|
| - fprintf(stderr,"error in AddLine");
|
| - }
|
| -}
|
| -
|
| -bool CUFunctionInfoHandler::StartCompilationUnit(uint64 offset,
|
| - uint8 address_size,
|
| - uint8 offset_size,
|
| - uint64 cu_length,
|
| - uint8 dwarf_version) {
|
| - current_compilation_unit_offset_ = offset;
|
| - return true;
|
| -}
|
| -
|
| -
|
| -// For function info, we only care about subprograms and inlined
|
| -// subroutines. For line info, the DW_AT_stmt_list lives in the
|
| -// compile unit tag.
|
| -
|
| -bool CUFunctionInfoHandler::StartDIE(uint64 offset, enum DwarfTag tag,
|
| - const AttributeList& attrs) {
|
| - switch (tag) {
|
| - case DW_TAG_subprogram:
|
| - case DW_TAG_inlined_subroutine: {
|
| - current_function_info_ = new FunctionInfo;
|
| - current_function_info_->lowpc = current_function_info_->highpc = 0;
|
| - current_function_info_->name = "";
|
| - current_function_info_->line = 0;
|
| - current_function_info_->file = "";
|
| - offset_to_funcinfo_->insert(make_pair(offset, current_function_info_));
|
| - };
|
| - // FALLTHROUGH
|
| - case DW_TAG_compile_unit:
|
| - return true;
|
| - default:
|
| - return false;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -// Only care about the name attribute for functions
|
| -
|
| -void CUFunctionInfoHandler::ProcessAttributeString(uint64 offset,
|
| - enum DwarfAttribute attr,
|
| - enum DwarfForm form,
|
| - const string &data) {
|
| - if (current_function_info_) {
|
| - if (attr == DW_AT_name)
|
| - current_function_info_->name = data;
|
| - else if(attr == DW_AT_MIPS_linkage_name)
|
| - current_function_info_->mangled_name = data;
|
| - }
|
| -}
|
| -
|
| -void CUFunctionInfoHandler::ProcessAttributeUnsigned(uint64 offset,
|
| - enum DwarfAttribute attr,
|
| - enum DwarfForm form,
|
| - uint64 data) {
|
| - if (attr == DW_AT_stmt_list) {
|
| - SectionMap::const_iterator iter = sections_.find("__debug_line");
|
| - assert(iter != sections_.end());
|
| -
|
| - // this should be a scoped_ptr but we dont' use boost :-(
|
| - auto_ptr<LineInfo> lireader(new LineInfo(iter->second.first + data,
|
| - iter->second.second - data,
|
| - reader_, linehandler_));
|
| - lireader->Start();
|
| - } else if (current_function_info_) {
|
| - switch (attr) {
|
| - case DW_AT_low_pc:
|
| - current_function_info_->lowpc = data;
|
| - break;
|
| - case DW_AT_high_pc:
|
| - current_function_info_->highpc = data;
|
| - break;
|
| - case DW_AT_decl_line:
|
| - current_function_info_->line = data;
|
| - break;
|
| - case DW_AT_decl_file:
|
| - current_function_info_->file = files_->at(data).name;
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| - }
|
| -}
|
| -
|
| -void CUFunctionInfoHandler::ProcessAttributeReference(uint64 offset,
|
| - enum DwarfAttribute attr,
|
| - enum DwarfForm form,
|
| - uint64 data) {
|
| - if (current_function_info_) {
|
| - switch (attr) {
|
| - case DW_AT_specification: {
|
| - // Some functions have a "specification" attribute
|
| - // which means they were defined elsewhere. The name
|
| - // attribute is not repeated, and must be taken from
|
| - // the specification DIE. Here we'll assume that
|
| - // any DIE referenced in this manner will already have
|
| - // been seen, but that's not really required by the spec.
|
| - FunctionMap::iterator iter = offset_to_funcinfo_->find(data);
|
| - if (iter != offset_to_funcinfo_->end()) {
|
| - current_function_info_->name = iter->second->name;
|
| - current_function_info_->mangled_name = iter->second->mangled_name;
|
| - } else {
|
| - // If you hit this, this code probably needs to be rewritten.
|
| - fprintf(stderr, "Error: DW_AT_specification was seen before the referenced DIE! (Looking for DIE at offset %08llx, in DIE at offset %08llx)\n", data, offset);
|
| - }
|
| - break;
|
| - }
|
| - default:
|
| - break;
|
| - }
|
| - }
|
| -}
|
| -
|
| -void CUFunctionInfoHandler::EndDIE(uint64 offset) {
|
| - if (current_function_info_ && current_function_info_->lowpc)
|
| - address_to_funcinfo_->insert(make_pair(current_function_info_->lowpc,
|
| - current_function_info_));
|
| -}
|
| -
|
| -} // namespace dwarf2reader
|
|
|