183e085b7a331c96237cf8e814f97b3ef4c36a70fjimblandy// Copyright (c) 2010 Google Inc. All Rights Reserved. 2cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// 3cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// Redistribution and use in source and binary forms, with or without 4cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// modification, are permitted provided that the following conditions are 5cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// met: 6cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// 7cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// * Redistributions of source code must retain the above copyright 8cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// notice, this list of conditions and the following disclaimer. 9cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// * Redistributions in binary form must reproduce the above 10cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// copyright notice, this list of conditions and the following disclaimer 11cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// in the documentation and/or other materials provided with the 12cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// distribution. 13cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// * Neither the name of Google Inc. nor the names of its 14cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// contributors may be used to endorse or promote products derived from 15cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// this software without specific prior written permission. 16cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// 17cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 29cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// This is a client for the dwarf2reader to extract function and line 30cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// information from the debug info. 31cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 32760d66430e41ea9b817492b2137268e41430035bmmentovai#include <assert.h> 33c0ec51afe09c266c49dfeb2dd079ca6c50f119d2mmentovai#include <limits.h> 34c0ec51afe09c266c49dfeb2dd079ca6c50f119d2mmentovai#include <stdio.h> 35760d66430e41ea9b817492b2137268e41430035bmmentovai 36cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid#include <map> 37cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid#include <queue> 38cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid#include <vector> 39cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 404969cfc6477c56afb2d4f2f6c1733c3120690b6djimblandy@gmail.com#include "common/dwarf/functioninfo.h" 414969cfc6477c56afb2d4f2f6c1733c3120690b6djimblandy@gmail.com#include "common/dwarf/bytereader.h" 42cb3130f08fb41182c8740a2d7c5438efbe4f921dthestig@chromium.org#include "common/scoped_ptr.h" 434e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.com#include "common/using_std_string.h" 44cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 45fcef9a2de6653cd9386cb1333414219fb7715ff6thestig@chromium.orgusing google_breakpad::scoped_ptr; 46fcef9a2de6653cd9386cb1333414219fb7715ff6thestig@chromium.org 47cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsidnamespace dwarf2reader { 48cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 498f4d15f86e8326674b35ca7c9dc310f01be19768mark@chromium.orgCULineInfoHandler::CULineInfoHandler(std::vector<SourceFileInfo>* files, 504e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.com std::vector<string>* dirs, 51cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid LineMap* linemap):linemap_(linemap), 52cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid files_(files), 53cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid dirs_(dirs) { 54cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid // The dirs and files are 1 indexed, so just make sure we put 55cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid // nothing in the 0 vector. 56cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid assert(dirs->size() == 0); 57cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid assert(files->size() == 0); 58cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid dirs->push_back(""); 59cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid SourceFileInfo s; 60cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid s.name = ""; 61cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid s.lowpc = ULLONG_MAX; 62cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid files->push_back(s); 63cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid} 64cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 654e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.comvoid CULineInfoHandler::DefineDir(const string& name, uint32 dir_num) { 66cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid // These should never come out of order, actually 67cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid assert(dir_num == dirs_->size()); 68cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid dirs_->push_back(name); 69cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid} 70cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 714e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.comvoid CULineInfoHandler::DefineFile(const string& name, 72cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid int32 file_num, uint32 dir_num, 73cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid uint64 mod_time, uint64 length) { 74cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid assert(dir_num >= 0); 75cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid assert(dir_num < dirs_->size()); 76cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 77cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid // These should never come out of order, actually. 78cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid if (file_num == (int32)files_->size() || file_num == -1) { 794e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.com string dir = dirs_->at(dir_num); 80cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 81cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid SourceFileInfo s; 82cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid s.lowpc = ULLONG_MAX; 83cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 84cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid if (dir == "") { 85cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid s.name = name; 86cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid } else { 87cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid s.name = dir + "/" + name; 88cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid } 89cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 90cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid files_->push_back(s); 91cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid } else { 92cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid fprintf(stderr, "error in DefineFile"); 93cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid } 94cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid} 95cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 968bfcc2683f6cb4345b56c898eabe45efeb77dc3ejimblandyvoid CULineInfoHandler::AddLine(uint64 address, uint64 length, uint32 file_num, 97cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid uint32 line_num, uint32 column_num) { 98cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid if (file_num < files_->size()) { 998f4d15f86e8326674b35ca7c9dc310f01be19768mark@chromium.org linemap_->insert( 1008f4d15f86e8326674b35ca7c9dc310f01be19768mark@chromium.org std::make_pair(address, 1018f4d15f86e8326674b35ca7c9dc310f01be19768mark@chromium.org std::make_pair(files_->at(file_num).name.c_str(), 1028f4d15f86e8326674b35ca7c9dc310f01be19768mark@chromium.org line_num))); 103cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 104cb3130f08fb41182c8740a2d7c5438efbe4f921dthestig@chromium.org if (address < files_->at(file_num).lowpc) { 105cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid files_->at(file_num).lowpc = address; 106cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid } 107cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid } else { 108cb3130f08fb41182c8740a2d7c5438efbe4f921dthestig@chromium.org fprintf(stderr, "error in AddLine"); 109cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid } 110cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid} 111cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 112cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsidbool CUFunctionInfoHandler::StartCompilationUnit(uint64 offset, 113cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid uint8 address_size, 114cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid uint8 offset_size, 115cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid uint64 cu_length, 116cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid uint8 dwarf_version) { 1173751b053540ab3d51887cd27f1992cc4dee50542ted.mielczarek current_compilation_unit_offset_ = offset; 118cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid return true; 119cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid} 120cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 121cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 122cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// For function info, we only care about subprograms and inlined 123cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// subroutines. For line info, the DW_AT_stmt_list lives in the 124cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// compile unit tag. 125cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 1267c2350868e7f53728866d304bc6a7ce8ba3b5d05mark@chromium.orgbool CUFunctionInfoHandler::StartDIE(uint64 offset, enum DwarfTag tag) { 127cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid switch (tag) { 128cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid case DW_TAG_subprogram: 129cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid case DW_TAG_inlined_subroutine: { 130cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid current_function_info_ = new FunctionInfo; 131cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid current_function_info_->lowpc = current_function_info_->highpc = 0; 132cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid current_function_info_->name = ""; 133cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid current_function_info_->line = 0; 134cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid current_function_info_->file = ""; 1358f4d15f86e8326674b35ca7c9dc310f01be19768mark@chromium.org offset_to_funcinfo_->insert(std::make_pair(offset, 1368f4d15f86e8326674b35ca7c9dc310f01be19768mark@chromium.org current_function_info_)); 137cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid }; 138cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid // FALLTHROUGH 139cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid case DW_TAG_compile_unit: 140cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid return true; 141cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid default: 142cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid return false; 143cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid } 144cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid return false; 145cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid} 146cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 147cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid// Only care about the name attribute for functions 148cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 149cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsidvoid CUFunctionInfoHandler::ProcessAttributeString(uint64 offset, 150cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid enum DwarfAttribute attr, 151cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid enum DwarfForm form, 1524e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.com const string &data) { 153d3441c2c96346611abd752270144d5f71d4f68b3ted.mielczarek if (current_function_info_) { 154d3441c2c96346611abd752270144d5f71d4f68b3ted.mielczarek if (attr == DW_AT_name) 155d3441c2c96346611abd752270144d5f71d4f68b3ted.mielczarek current_function_info_->name = data; 156cb3130f08fb41182c8740a2d7c5438efbe4f921dthestig@chromium.org else if (attr == DW_AT_MIPS_linkage_name) 157d3441c2c96346611abd752270144d5f71d4f68b3ted.mielczarek current_function_info_->mangled_name = data; 158d3441c2c96346611abd752270144d5f71d4f68b3ted.mielczarek } 159cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid} 160cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 161cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsidvoid CUFunctionInfoHandler::ProcessAttributeUnsigned(uint64 offset, 162cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid enum DwarfAttribute attr, 163cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid enum DwarfForm form, 164cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid uint64 data) { 165cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid if (attr == DW_AT_stmt_list) { 166cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid SectionMap::const_iterator iter = sections_.find("__debug_line"); 167cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid assert(iter != sections_.end()); 168cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 169cb3130f08fb41182c8740a2d7c5438efbe4f921dthestig@chromium.org scoped_ptr<LineInfo> lireader(new LineInfo(iter->second.first + data, 170cb3130f08fb41182c8740a2d7c5438efbe4f921dthestig@chromium.org iter->second.second - data, 171cb3130f08fb41182c8740a2d7c5438efbe4f921dthestig@chromium.org reader_, linehandler_)); 172cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid lireader->Start(); 173cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid } else if (current_function_info_) { 174cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid switch (attr) { 175cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid case DW_AT_low_pc: 176cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid current_function_info_->lowpc = data; 177cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid break; 178cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid case DW_AT_high_pc: 179cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid current_function_info_->highpc = data; 180cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid break; 181cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid case DW_AT_decl_line: 182cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid current_function_info_->line = data; 183cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid break; 184cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid case DW_AT_decl_file: 185cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid current_function_info_->file = files_->at(data).name; 186cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid break; 187330ca2f7c71d84a01626b1198ef600540eb320b8jimblandy default: 188330ca2f7c71d84a01626b1198ef600540eb320b8jimblandy break; 189330ca2f7c71d84a01626b1198ef600540eb320b8jimblandy } 190330ca2f7c71d84a01626b1198ef600540eb320b8jimblandy } 191330ca2f7c71d84a01626b1198ef600540eb320b8jimblandy} 192330ca2f7c71d84a01626b1198ef600540eb320b8jimblandy 193330ca2f7c71d84a01626b1198ef600540eb320b8jimblandyvoid CUFunctionInfoHandler::ProcessAttributeReference(uint64 offset, 194330ca2f7c71d84a01626b1198ef600540eb320b8jimblandy enum DwarfAttribute attr, 195330ca2f7c71d84a01626b1198ef600540eb320b8jimblandy enum DwarfForm form, 196330ca2f7c71d84a01626b1198ef600540eb320b8jimblandy uint64 data) { 197330ca2f7c71d84a01626b1198ef600540eb320b8jimblandy if (current_function_info_) { 198330ca2f7c71d84a01626b1198ef600540eb320b8jimblandy switch (attr) { 1993751b053540ab3d51887cd27f1992cc4dee50542ted.mielczarek case DW_AT_specification: { 2003751b053540ab3d51887cd27f1992cc4dee50542ted.mielczarek // Some functions have a "specification" attribute 2013751b053540ab3d51887cd27f1992cc4dee50542ted.mielczarek // which means they were defined elsewhere. The name 2023751b053540ab3d51887cd27f1992cc4dee50542ted.mielczarek // attribute is not repeated, and must be taken from 2033751b053540ab3d51887cd27f1992cc4dee50542ted.mielczarek // the specification DIE. Here we'll assume that 2043751b053540ab3d51887cd27f1992cc4dee50542ted.mielczarek // any DIE referenced in this manner will already have 2053751b053540ab3d51887cd27f1992cc4dee50542ted.mielczarek // been seen, but that's not really required by the spec. 206330ca2f7c71d84a01626b1198ef600540eb320b8jimblandy FunctionMap::iterator iter = offset_to_funcinfo_->find(data); 2073751b053540ab3d51887cd27f1992cc4dee50542ted.mielczarek if (iter != offset_to_funcinfo_->end()) { 2083751b053540ab3d51887cd27f1992cc4dee50542ted.mielczarek current_function_info_->name = iter->second->name; 2093751b053540ab3d51887cd27f1992cc4dee50542ted.mielczarek current_function_info_->mangled_name = iter->second->mangled_name; 2103751b053540ab3d51887cd27f1992cc4dee50542ted.mielczarek } else { 2113751b053540ab3d51887cd27f1992cc4dee50542ted.mielczarek // If you hit this, this code probably needs to be rewritten. 212cb3130f08fb41182c8740a2d7c5438efbe4f921dthestig@chromium.org fprintf(stderr, 213cb3130f08fb41182c8740a2d7c5438efbe4f921dthestig@chromium.org "Error: DW_AT_specification was seen before the referenced " 214cb3130f08fb41182c8740a2d7c5438efbe4f921dthestig@chromium.org "DIE! (Looking for DIE at offset %08llx, in DIE at " 215cb3130f08fb41182c8740a2d7c5438efbe4f921dthestig@chromium.org "offset %08llx)\n", data, offset); 2163751b053540ab3d51887cd27f1992cc4dee50542ted.mielczarek } 2173751b053540ab3d51887cd27f1992cc4dee50542ted.mielczarek break; 2183751b053540ab3d51887cd27f1992cc4dee50542ted.mielczarek } 219cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid default: 220cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid break; 221cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid } 222cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid } 223cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid} 224cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 225cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsidvoid CUFunctionInfoHandler::EndDIE(uint64 offset) { 226cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid if (current_function_info_ && current_function_info_->lowpc) 2278f4d15f86e8326674b35ca7c9dc310f01be19768mark@chromium.org address_to_funcinfo_->insert(std::make_pair(current_function_info_->lowpc, 2288f4d15f86e8326674b35ca7c9dc310f01be19768mark@chromium.org current_function_info_)); 229cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid} 230cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid 231cb4aa6b804d9c4a5d43aa50bfbc46257bc55c001nealsid} // namespace dwarf2reader 232