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 // source_line_resolver_base_types.h: definition of nested classes/structs in
31 // SourceLineResolverBase.  It moves the definitions out of
32 // source_line_resolver_base.cc, so that other classes may have access
33 // to these private nested types without including source_line_resolver_base.cc
34 // In addition, Module is defined as a pure abstract class to be implemented by
35 // each concrete source line resolver class.
36 //
37 // See source_line_resolver_base.h for more documentation.
38 //
39 // Author: Siyang Xie (lambxsy@google.com)
40 
41 #include <stdio.h>
42 
43 #include <map>
44 #include <string>
45 
46 #include "google_breakpad/common/breakpad_types.h"
47 #include "google_breakpad/processor/source_line_resolver_base.h"
48 #include "google_breakpad/processor/stack_frame.h"
49 #include "processor/cfi_frame_info.h"
50 #include "processor/windows_frame_info.h"
51 
52 #ifndef PROCESSOR_SOURCE_LINE_RESOLVER_BASE_TYPES_H__
53 #define PROCESSOR_SOURCE_LINE_RESOLVER_BASE_TYPES_H__
54 
55 namespace google_breakpad {
56 
57 class SourceLineResolverBase::AutoFileCloser {
58  public:
AutoFileCloser(FILE * file)59   explicit AutoFileCloser(FILE *file) : file_(file) {}
~AutoFileCloser()60   ~AutoFileCloser() {
61     if (file_)
62       fclose(file_);
63   }
64 
65  private:
66   FILE *file_;
67 };
68 
69 struct SourceLineResolverBase::Line {
LineLine70   Line() { }
LineLine71   Line(MemAddr addr, MemAddr code_size, int file_id, int source_line)
72       : address(addr)
73       , size(code_size)
74       , source_file_id(file_id)
75       , line(source_line) { }
76 
77   MemAddr address;
78   MemAddr size;
79   int32_t source_file_id;
80   int32_t line;
81 };
82 
83 struct SourceLineResolverBase::Function {
FunctionFunction84   Function() { }
FunctionFunction85   Function(const string &function_name,
86            MemAddr function_address,
87            MemAddr code_size,
88            int set_parameter_size)
89       : name(function_name), address(function_address), size(code_size),
90         parameter_size(set_parameter_size) { }
91 
92   string name;
93   MemAddr address;
94   MemAddr size;
95 
96   // The size of parameters passed to this function on the stack.
97   int32_t parameter_size;
98 };
99 
100 struct SourceLineResolverBase::PublicSymbol {
PublicSymbolPublicSymbol101   PublicSymbol() { }
PublicSymbolPublicSymbol102   PublicSymbol(const string& set_name,
103                MemAddr set_address,
104                int set_parameter_size)
105       : name(set_name),
106         address(set_address),
107         parameter_size(set_parameter_size) {}
108 
109   string name;
110   MemAddr address;
111 
112   // If the public symbol is used as a function entry point, parameter_size
113   // is set to the size of the parameters passed to the funciton on the
114   // stack, if known.
115   int32_t parameter_size;
116 };
117 
118 class SourceLineResolverBase::Module {
119  public:
~Module()120   virtual ~Module() { };
121   // Loads a map from the given buffer in char* type.
122   // Does NOT take ownership of memory_buffer (the caller, source line resolver,
123   // is the owner of memory_buffer).
124   // The passed in |memory buffer| is of size |memory_buffer_size|.  If it is
125   // not null terminated, LoadMapFromMemory will null terminate it by modifying
126   // the passed in buffer.
127   virtual bool LoadMapFromMemory(char *memory_buffer,
128                                  size_t memory_buffer_size) = 0;
129 
130   // Tells whether the loaded symbol data is corrupt.  Return value is
131   // undefined, if the symbol data hasn't been loaded yet.
132   virtual bool IsCorrupt() const = 0;
133 
134   // Looks up the given relative address, and fills the StackFrame struct
135   // with the result.
136   virtual void LookupAddress(StackFrame *frame) const = 0;
137 
138   // If Windows stack walking information is available covering ADDRESS,
139   // return a WindowsFrameInfo structure describing it. If the information
140   // is not available, returns NULL. A NULL return value does not indicate
141   // an error. The caller takes ownership of any returned WindowsFrameInfo
142   // object.
143   virtual WindowsFrameInfo *
144   FindWindowsFrameInfo(const StackFrame *frame) const = 0;
145 
146   // If CFI stack walking information is available covering ADDRESS,
147   // return a CFIFrameInfo structure describing it. If the information
148   // is not available, return NULL. The caller takes ownership of any
149   // returned CFIFrameInfo object.
150   virtual CFIFrameInfo *FindCFIFrameInfo(const StackFrame *frame) const = 0;
151  protected:
152   virtual bool ParseCFIRuleSet(const string &rule_set,
153                                CFIFrameInfo *frame_info) const;
154 };
155 
156 }  // namespace google_breakpad
157 
158 #endif  // PROCESSOR_SOURCE_LINE_RESOLVER_BASE_TYPES_H__
159