PageRenderTime 68ms CodeModel.GetById 31ms app.highlight 10ms RepoModel.GetById 24ms app.codeStats 0ms

/thirdparty/breakpad/common/dwarf_line_to_module.cc

http://github.com/tomahawk-player/tomahawk
C++ | 135 lines | 71 code | 17 blank | 47 comment | 26 complexity | 58eca34febcf1ba2b10475eac1014591 MD5 | raw file
  1// Copyright (c) 2010 Google Inc.
  2// All rights reserved.
  3//
  4// Redistribution and use in source and binary forms, with or without
  5// modification, are permitted provided that the following conditions are
  6// met:
  7//
  8//     * Redistributions of source code must retain the above copyright
  9// notice, this list of conditions and the following disclaimer.
 10//     * Redistributions in binary form must reproduce the above
 11// copyright notice, this list of conditions and the following disclaimer
 12// in the documentation and/or other materials provided with the
 13// distribution.
 14//     * Neither the name of Google Inc. nor the names of its
 15// contributors may be used to endorse or promote products derived from
 16// this software without specific prior written permission.
 17//
 18// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 19// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 20// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 22// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 23// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 24// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 25// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 26// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 27// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 28// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 29
 30// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
 31
 32// dwarf_line_to_module.cc: Implementation of DwarfLineToModule class.
 33// See dwarf_line_to_module.h for details. 
 34
 35#include "common/dwarf_line_to_module.h"
 36
 37#include <stdio.h>
 38
 39// Trying to support Windows paths in a reasonable way adds a lot of
 40// variations to test; it would be better to just put off dealing with
 41// it until we actually have to deal with DWARF on Windows.
 42
 43// Return true if PATH is an absolute path, false if it is relative.
 44static bool PathIsAbsolute(const std::string &path) {
 45  return (path.size() >= 1 && path[0] == '/');
 46}
 47
 48// If PATH is an absolute path, return PATH.  If PATH is a relative path,
 49// treat it as relative to BASE and return the combined path.
 50static std::string ExpandPath(const std::string &path,
 51                              const std::string &base) {
 52  if (PathIsAbsolute(path))
 53    return path;
 54  return base + "/" + path;
 55}
 56
 57namespace google_breakpad {
 58
 59void DwarfLineToModule::DefineDir(const std::string &name, uint32 dir_num) {
 60  // Directory number zero is reserved to mean the compilation
 61  // directory. Silently ignore attempts to redefine it.
 62  if (dir_num != 0)
 63    directories_[dir_num] = name;
 64}
 65
 66void DwarfLineToModule::DefineFile(const std::string &name, int32 file_num,
 67                                   uint32 dir_num, uint64 mod_time,
 68                                   uint64 length) {
 69  if (file_num == -1)
 70    file_num = ++highest_file_number_;
 71  else if (file_num > highest_file_number_)
 72    highest_file_number_ = file_num;
 73
 74  std::string full_name;
 75  if (dir_num != 0) {
 76    DirectoryTable::const_iterator directory_it = directories_.find(dir_num);
 77    if (directory_it != directories_.end()) {
 78      full_name = ExpandPath(name, directory_it->second);
 79    } else {
 80      if (!warned_bad_directory_number_) {
 81        fprintf(stderr, "warning: DWARF line number data refers to undefined"
 82                " directory numbers\n");
 83        warned_bad_directory_number_ = true;
 84      }
 85      full_name = name; // just treat name as relative
 86    }
 87  } else {
 88    // Directory number zero is the compilation directory; we just report
 89    // relative paths in that case.
 90    full_name = name;
 91  }
 92
 93  // Find a Module::File object of the given name, and add it to the
 94  // file table.
 95  files_[file_num] = module_->FindFile(full_name);
 96}
 97
 98void DwarfLineToModule::AddLine(uint64 address, uint64 length,
 99                                uint32 file_num, uint32 line_num,
100                                uint32 column_num) {
101  if (length == 0)
102    return;
103
104  // Clip lines not to extend beyond the end of the address space.
105  if (address + length < address)
106    length = -address;
107
108  // Should we omit this line? (See the comments for omitted_line_end_.)
109  if (address == 0 || address == omitted_line_end_) {
110    omitted_line_end_ = address + length;
111    return;
112  } else {
113    omitted_line_end_ = 0;
114  }
115
116  // Find the source file being referred to.
117  Module::File *file = files_[file_num];
118  if (!file) {
119    if (!warned_bad_file_number_) {
120      fprintf(stderr, "warning: DWARF line number data refers to "
121              "undefined file numbers\n");
122      warned_bad_file_number_ = true;
123    }
124    return;
125  }
126  Module::Line line;
127  line.address = address;
128  // We set the size when we get the next line or the EndSequence call.
129  line.size = length;
130  line.file = file;
131  line.number = line_num;
132  lines_->push_back(line);
133}
134
135} // namespace google_breakpad