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