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