1cf55ca5b5cb673677a8493aff1424e1b83211c1ajimblandy// -*- mode: C++ -*- 2cf55ca5b5cb673677a8493aff1424e1b83211c1ajimblandy 383e085b7a331c96237cf8e814f97b3ef4c36a70fjimblandy// Copyright (c) 2010 Google Inc. 47daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// All rights reserved. 5cb91a2f879250f2ef5f74321b5d08807247d41a7bryner// 67daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// Redistribution and use in source and binary forms, with or without 77daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// modification, are permitted provided that the following conditions are 87daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// met: 9cb91a2f879250f2ef5f74321b5d08807247d41a7bryner// 107daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// * Redistributions of source code must retain the above copyright 117daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// notice, this list of conditions and the following disclaimer. 127daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// * Redistributions in binary form must reproduce the above 137daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// copyright notice, this list of conditions and the following disclaimer 147daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// in the documentation and/or other materials provided with the 157daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// distribution. 167daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// * Neither the name of Google Inc. nor the names of its 177daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// contributors may be used to endorse or promote products derived from 187daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// this software without specific prior written permission. 19cb91a2f879250f2ef5f74321b5d08807247d41a7bryner// 207daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 217daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 227daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 237daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 247daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 257daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 267daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 277daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 287daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 297daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 307daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 32fd38d48e6d5e56cb66b0fa0f7e25f840a83dac5cbryner// Abstract interface to return function/file/line info for a memory address. 33cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 34e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#ifndef GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_INTERFACE_H__ 35e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#define GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_INTERFACE_H__ 36cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 37cb91a2f879250f2ef5f74321b5d08807247d41a7bryner#include <string> 384e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.com 394e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.com#include "common/using_std_string.h" 40e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/common/breakpad_types.h" 41b223627d81c083a64f2ccecf2651a18111421280ted.mielczarek#include "google_breakpad/processor/code_module.h" 42cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 43e5dc60822e5938fea2ae892ccddb906641ba174emmentovainamespace google_breakpad { 44cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 45fc1c78e60e9b305386f4c3fc811463f3b24cf6d4mmentovaistruct StackFrame; 46b64d76a3b8a692f431d440f6a4416e7c70aad4efjimblandystruct WindowsFrameInfo; 47921da5eb5412bc45368066966875ccc28d3b81d1benchan@chromium.orgclass CFIFrameInfo; 4839716226cf6ffcfaa37c991f82c3f2b19354413fbryner 49fd38d48e6d5e56cb66b0fa0f7e25f840a83dac5cbrynerclass SourceLineResolverInterface { 50cb91a2f879250f2ef5f74321b5d08807247d41a7bryner public: 516162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com typedef uint64_t MemAddr; 52cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 53fd38d48e6d5e56cb66b0fa0f7e25f840a83dac5cbryner virtual ~SourceLineResolverInterface() {} 54cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 55cb91a2f879250f2ef5f74321b5d08807247d41a7bryner // Adds a module to this resolver, returning true on success. 56cb91a2f879250f2ef5f74321b5d08807247d41a7bryner // 57b223627d81c083a64f2ccecf2651a18111421280ted.mielczarek // module should have at least the code_file, debug_file, 58b223627d81c083a64f2ccecf2651a18111421280ted.mielczarek // and debug_identifier members populated. 59cb91a2f879250f2ef5f74321b5d08807247d41a7bryner // 60cb91a2f879250f2ef5f74321b5d08807247d41a7bryner // map_file should contain line/address mappings for this module. 61b223627d81c083a64f2ccecf2651a18111421280ted.mielczarek virtual bool LoadModule(const CodeModule *module, 62fd38d48e6d5e56cb66b0fa0f7e25f840a83dac5cbryner const string &map_file) = 0; 630fd2f1ae2152782f2127c56fb5302002c95502d3nealsid // Same as above, but takes the contents of a pre-read map buffer 64b223627d81c083a64f2ccecf2651a18111421280ted.mielczarek virtual bool LoadModuleUsingMapBuffer(const CodeModule *module, 650fd2f1ae2152782f2127c56fb5302002c95502d3nealsid const string &map_buffer) = 0; 66cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 672d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com // Add an interface to load symbol using C-String data instead of string. 685b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com // This is useful in the optimization design for avoiding unnecessary copying 695b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com // of symbol data, in order to improve memory efficiency. 70a8c1c466a16ad4c85bfd1ca20ab8fc056d669abeSiyangXie@gmail.com // LoadModuleUsingMemoryBuffer() does NOT take ownership of memory_buffer. 712d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com // LoadModuleUsingMemoryBuffer() null terminates the passed in buffer, if 722d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com // the last character is not a null terminator. 735b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com virtual bool LoadModuleUsingMemoryBuffer(const CodeModule *module, 742d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com char *memory_buffer, 752d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com size_t memory_buffer_size) = 0; 765b117cf53af46f357d28761ced3a1d94aeb5df91SiyangXie@gmail.com 77a8c1c466a16ad4c85bfd1ca20ab8fc056d669abeSiyangXie@gmail.com // Return true if the memory buffer should be deleted immediately after 78a8c1c466a16ad4c85bfd1ca20ab8fc056d669abeSiyangXie@gmail.com // LoadModuleUsingMemoryBuffer(). Return false if the memory buffer has to be 79a8c1c466a16ad4c85bfd1ca20ab8fc056d669abeSiyangXie@gmail.com // alive during the lifetime of the corresponding Module. 80a8c1c466a16ad4c85bfd1ca20ab8fc056d669abeSiyangXie@gmail.com virtual bool ShouldDeleteMemoryBufferAfterLoadModule() = 0; 81a8c1c466a16ad4c85bfd1ca20ab8fc056d669abeSiyangXie@gmail.com 82b223627d81c083a64f2ccecf2651a18111421280ted.mielczarek // Request that the specified module be unloaded from this resolver. 83b223627d81c083a64f2ccecf2651a18111421280ted.mielczarek // A resolver may choose to ignore such a request. 84b223627d81c083a64f2ccecf2651a18111421280ted.mielczarek virtual void UnloadModule(const CodeModule *module) = 0; 85b223627d81c083a64f2ccecf2651a18111421280ted.mielczarek 86b223627d81c083a64f2ccecf2651a18111421280ted.mielczarek // Returns true if the module has been loaded. 87b223627d81c083a64f2ccecf2651a18111421280ted.mielczarek virtual bool HasModule(const CodeModule *module) = 0; 88181f307ffe521026d7344ed58d1545321d352ca6bryner 892d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com // Returns true if the module has been loaded and it is corrupt. 902d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com virtual bool IsModuleCorrupt(const CodeModule *module) = 0; 912d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com 9239716226cf6ffcfaa37c991f82c3f2b19354413fbryner // Fills in the function_base, function_name, source_file_name, 9339716226cf6ffcfaa37c991f82c3f2b19354413fbryner // and source_line fields of the StackFrame. The instruction and 94a8c1c466a16ad4c85bfd1ca20ab8fc056d669abeSiyangXie@gmail.com // module_name fields must already be filled in. 95b223627d81c083a64f2ccecf2651a18111421280ted.mielczarek virtual void FillSourceLineInfo(StackFrame *frame) = 0; 96e9faf5482802cb508401881f15b2712eb2f828f2jimblandy 97e9faf5482802cb508401881f15b2712eb2f828f2jimblandy // If Windows stack walking information is available covering 98e9faf5482802cb508401881f15b2712eb2f828f2jimblandy // FRAME's instruction address, return a WindowsFrameInfo structure 99e9faf5482802cb508401881f15b2712eb2f828f2jimblandy // describing it. If the information is not available, returns NULL. 100e9faf5482802cb508401881f15b2712eb2f828f2jimblandy // A NULL return value does not indicate an error. The caller takes 101e9faf5482802cb508401881f15b2712eb2f828f2jimblandy // ownership of any returned WindowsFrameInfo object. 102a8c1c466a16ad4c85bfd1ca20ab8fc056d669abeSiyangXie@gmail.com virtual WindowsFrameInfo *FindWindowsFrameInfo(const StackFrame *frame) = 0; 103cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 1046d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy // If CFI stack walking information is available covering ADDRESS, 1056d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy // return a CFIFrameInfo structure describing it. If the information 1066d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy // is not available, return NULL. The caller takes ownership of any 1076d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy // returned CFIFrameInfo object. 108b223627d81c083a64f2ccecf2651a18111421280ted.mielczarek virtual CFIFrameInfo *FindCFIFrameInfo(const StackFrame *frame) = 0; 1096d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy 110fd38d48e6d5e56cb66b0fa0f7e25f840a83dac5cbryner protected: 111fd38d48e6d5e56cb66b0fa0f7e25f840a83dac5cbryner // SourceLineResolverInterface cannot be instantiated except by subclasses 112fd38d48e6d5e56cb66b0fa0f7e25f840a83dac5cbryner SourceLineResolverInterface() {} 113cb91a2f879250f2ef5f74321b5d08807247d41a7bryner}; 114cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 115e5dc60822e5938fea2ae892ccddb906641ba174emmentovai} // namespace google_breakpad 116cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 117e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#endif // GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_INTERFACE_H__ 118