15b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// Copyright (c) 2010 Google Inc.
25b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// All rights reserved.
35b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com//
45b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// Redistribution and use in source and binary forms, with or without
55b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// modification, are permitted provided that the following conditions are
65b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// met:
75b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com//
85b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com//     * Redistributions of source code must retain the above copyright
95b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// notice, this list of conditions and the following disclaimer.
105b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com//     * Redistributions in binary form must reproduce the above
115b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// copyright notice, this list of conditions and the following disclaimer
125b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// in the documentation and/or other materials provided with the
135b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// distribution.
145b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com//     * Neither the name of Google Inc. nor the names of its
155b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// contributors may be used to endorse or promote products derived from
165b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// this software without specific prior written permission.
175b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com//
185b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
305b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// source_line_resolver_base_types.h: definition of nested classes/structs in
315b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// SourceLineResolverBase.  It moves the definitions out of
325b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// source_line_resolver_base.cc, so that other classes may have access
335b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// to these private nested types without including source_line_resolver_base.cc
345b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// In addition, Module is defined as a pure abstract class to be implemented by
355b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// each concrete source line resolver class.
365b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com//
375b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// See source_line_resolver_base.h for more documentation.
385b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com//
395b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com// Author: Siyang Xie (lambxsy@google.com)
405b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
415b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com#include <stdio.h>
425b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
435b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com#include <map>
445b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com#include <string>
455b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
46f2e56b1fde88a521971cb6e74d53ce6ac04aa186ted.mielczarek@gmail.com#include "google_breakpad/common/breakpad_types.h"
475b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com#include "google_breakpad/processor/source_line_resolver_base.h"
485b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com#include "google_breakpad/processor/stack_frame.h"
495b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com#include "processor/cfi_frame_info.h"
505b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com#include "processor/windows_frame_info.h"
515b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
525b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com#ifndef PROCESSOR_SOURCE_LINE_RESOLVER_BASE_TYPES_H__
535b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com#define PROCESSOR_SOURCE_LINE_RESOLVER_BASE_TYPES_H__
545b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
555b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.comnamespace google_breakpad {
565b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
575b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.comclass SourceLineResolverBase::AutoFileCloser {
585b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com public:
595b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  explicit AutoFileCloser(FILE *file) : file_(file) {}
605b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  ~AutoFileCloser() {
615b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com    if (file_)
625b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com      fclose(file_);
635b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  }
645b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
655b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com private:
665b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  FILE *file_;
675b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com};
685b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
695b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.comstruct SourceLineResolverBase::Line {
705b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  Line() { }
715b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  Line(MemAddr addr, MemAddr code_size, int file_id, int source_line)
725b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com      : address(addr)
735b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com      , size(code_size)
745b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com      , source_file_id(file_id)
755b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com      , line(source_line) { }
765b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
775b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  MemAddr address;
785b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  MemAddr size;
795b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  int32_t source_file_id;
805b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  int32_t line;
815b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com};
825b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
835b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.comstruct SourceLineResolverBase::Function {
845b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  Function() { }
855b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  Function(const string &function_name,
865b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com           MemAddr function_address,
875b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com           MemAddr code_size,
885b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com           int set_parameter_size)
895b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com      : name(function_name), address(function_address), size(code_size),
905b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com        parameter_size(set_parameter_size) { }
915b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
925b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  string name;
935b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  MemAddr address;
945b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  MemAddr size;
955b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
965b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  // The size of parameters passed to this function on the stack.
975b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  int32_t parameter_size;
985b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com};
995b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
1005b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.comstruct SourceLineResolverBase::PublicSymbol {
1015b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  PublicSymbol() { }
1025b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  PublicSymbol(const string& set_name,
1035b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com               MemAddr set_address,
1045b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com               int set_parameter_size)
1055b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com      : name(set_name),
1065b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com        address(set_address),
1075b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com        parameter_size(set_parameter_size) {}
1085b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
1095b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  string name;
1105b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  MemAddr address;
1115b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
1125b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  // If the public symbol is used as a function entry point, parameter_size
1135b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  // is set to the size of the parameters passed to the funciton on the
1145b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  // stack, if known.
1155b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  int32_t parameter_size;
1165b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com};
1175b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
1185b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.comclass SourceLineResolverBase::Module {
1195b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com public:
1205b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  virtual ~Module() { };
1215b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  // Loads a map from the given buffer in char* type.
1225b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  // Does NOT take ownership of memory_buffer (the caller, source line resolver,
1235b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  // is the owner of memory_buffer).
1242d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com  // The passed in |memory buffer| is of size |memory_buffer_size|.  If it is
1252d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com  // not null terminated, LoadMapFromMemory will null terminate it by modifying
1262d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com  // the passed in buffer.
1272d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com  virtual bool LoadMapFromMemory(char *memory_buffer,
1282d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com                                 size_t memory_buffer_size) = 0;
1292d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com
1302d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com  // Tells whether the loaded symbol data is corrupt.  Return value is
1312d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com  // undefined, if the symbol data hasn't been loaded yet.
1322d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com  virtual bool IsCorrupt() const = 0;
1335b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
1345b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  // Looks up the given relative address, and fills the StackFrame struct
1355b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  // with the result.
1365b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  virtual void LookupAddress(StackFrame *frame) const = 0;
1375b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
1385b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  // If Windows stack walking information is available covering ADDRESS,
1395b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  // return a WindowsFrameInfo structure describing it. If the information
1405b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  // is not available, returns NULL. A NULL return value does not indicate
1415b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  // an error. The caller takes ownership of any returned WindowsFrameInfo
1425b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  // object.
1435b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  virtual WindowsFrameInfo *
1445b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  FindWindowsFrameInfo(const StackFrame *frame) const = 0;
1455b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
1465b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  // If CFI stack walking information is available covering ADDRESS,
1475b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  // return a CFIFrameInfo structure describing it. If the information
1485b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  // is not available, return NULL. The caller takes ownership of any
1495b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  // returned CFIFrameInfo object.
1505b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  virtual CFIFrameInfo *FindCFIFrameInfo(const StackFrame *frame) const = 0;
1515b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com protected:
1525b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com  virtual bool ParseCFIRuleSet(const string &rule_set,
1535b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com                               CFIFrameInfo *frame_info) const;
1545b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com};
1555b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
1565b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com}  // namespace google_breakpad
1575b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com
1585b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com#endif  // PROCESSOR_SOURCE_LINE_RESOLVER_BASE_TYPES_H__
159