| OLD | NEW |
| 1 // Copyright (c) 2010 Google Inc. | 1 // Copyright (c) 2010 Google Inc. |
| 2 // All rights reserved. | 2 // All rights reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
| 6 // met: | 6 // met: |
| 7 // | 7 // |
| 8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
| 9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
| 10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 virtual StackFrame* GetContextFrame(); | 71 virtual StackFrame* GetContextFrame(); |
| 72 virtual StackFrame* GetCallerFrame(const CallStack* stack, | 72 virtual StackFrame* GetCallerFrame(const CallStack* stack, |
| 73 bool stack_scan_allowed); | 73 bool stack_scan_allowed); |
| 74 | 74 |
| 75 // Use cfi_frame_info (derived from STACK CFI records) to construct | 75 // Use cfi_frame_info (derived from STACK CFI records) to construct |
| 76 // the frame that called frames.back(). The caller takes ownership | 76 // the frame that called frames.back(). The caller takes ownership |
| 77 // of the returned frame. Return NULL on failure. | 77 // of the returned frame. Return NULL on failure. |
| 78 StackFrameAMD64* GetCallerByCFIFrameInfo(const vector<StackFrame*> &frames, | 78 StackFrameAMD64* GetCallerByCFIFrameInfo(const vector<StackFrame*> &frames, |
| 79 CFIFrameInfo* cfi_frame_info); | 79 CFIFrameInfo* cfi_frame_info); |
| 80 | 80 |
| 81 // Checks whether end-of-stack is reached. An instruction address of 0 is an |
| 82 // end-of-stack marker. If the stack pointer of the caller is at a lower |
| 83 // address than the stack pointer of the callee, then that's clearly incorrect |
| 84 // and it is treated as end-of-stack to enforce progress and avoid infinite |
| 85 // loops. |
| 86 bool IsEndOfStack(uint64_t caller_rip, uint64_t caller_rsp, |
| 87 uint64_t callee_rsp); |
| 88 |
| 81 // Assumes a traditional frame layout where the frame pointer has not been | 89 // Assumes a traditional frame layout where the frame pointer has not been |
| 82 // omitted. The expectation is that caller's %rbp is pushed to the stack | 90 // omitted. The expectation is that caller's %rbp is pushed to the stack |
| 83 // after the return address of the callee, and that the callee's %rsp can | 91 // after the return address of the callee, and that the callee's %rsp can |
| 84 // be used to find the pushed %rbp. | 92 // be used to find the pushed %rbp. |
| 85 // Caller owns the returned frame object. Returns NULL on failure. | 93 // Caller owns the returned frame object. Returns NULL on failure. |
| 86 StackFrameAMD64* GetCallerByFramePointerRecovery( | 94 StackFrameAMD64* GetCallerByFramePointerRecovery( |
| 87 const vector<StackFrame*>& frames); | 95 const vector<StackFrame*>& frames); |
| 88 | 96 |
| 89 // Scan the stack for plausible return addresses. The caller takes ownership | 97 // Scan the stack for plausible return addresses. The caller takes ownership |
| 90 // of the returned frame. Return NULL on failure. | 98 // of the returned frame. Return NULL on failure. |
| 91 StackFrameAMD64* GetCallerByStackScan(const vector<StackFrame*> &frames); | 99 StackFrameAMD64* GetCallerByStackScan(const vector<StackFrame*> &frames); |
| 92 | 100 |
| 93 // Stores the CPU context corresponding to the innermost stack frame to | 101 // Stores the CPU context corresponding to the innermost stack frame to |
| 94 // be returned by GetContextFrame. | 102 // be returned by GetContextFrame. |
| 95 const MDRawContextAMD64* context_; | 103 const MDRawContextAMD64* context_; |
| 96 | 104 |
| 97 // Our register map, for cfi_walker_. | 105 // Our register map, for cfi_walker_. |
| 98 static const CFIWalker::RegisterSet cfi_register_map_[]; | 106 static const CFIWalker::RegisterSet cfi_register_map_[]; |
| 99 | 107 |
| 100 // Our CFI frame walker. | 108 // Our CFI frame walker. |
| 101 const CFIWalker cfi_walker_; | 109 const CFIWalker cfi_walker_; |
| 102 }; | 110 }; |
| 103 | 111 |
| 104 | 112 |
| 105 } // namespace google_breakpad | 113 } // namespace google_breakpad |
| 106 | 114 |
| 107 | 115 |
| 108 #endif // PROCESSOR_STACKWALKER_AMD64_H__ | 116 #endif // PROCESSOR_STACKWALKER_AMD64_H__ |
| OLD | NEW |