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