16d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy// -*- mode: c++ -*-
26d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy
383e085b7a331c96237cf8e814f97b3ef4c36a70fjimblandy// Copyright (c) 2010 Google Inc.
4246f4068280b5b191303ff13671e43a0522987demmentovai// All rights reserved.
5246f4068280b5b191303ff13671e43a0522987demmentovai//
6246f4068280b5b191303ff13671e43a0522987demmentovai// Redistribution and use in source and binary forms, with or without
7246f4068280b5b191303ff13671e43a0522987demmentovai// modification, are permitted provided that the following conditions are
8246f4068280b5b191303ff13671e43a0522987demmentovai// met:
9246f4068280b5b191303ff13671e43a0522987demmentovai//
10246f4068280b5b191303ff13671e43a0522987demmentovai//     * Redistributions of source code must retain the above copyright
11246f4068280b5b191303ff13671e43a0522987demmentovai// notice, this list of conditions and the following disclaimer.
12246f4068280b5b191303ff13671e43a0522987demmentovai//     * Redistributions in binary form must reproduce the above
13246f4068280b5b191303ff13671e43a0522987demmentovai// copyright notice, this list of conditions and the following disclaimer
14246f4068280b5b191303ff13671e43a0522987demmentovai// in the documentation and/or other materials provided with the
15246f4068280b5b191303ff13671e43a0522987demmentovai// distribution.
16246f4068280b5b191303ff13671e43a0522987demmentovai//     * Neither the name of Google Inc. nor the names of its
17246f4068280b5b191303ff13671e43a0522987demmentovai// contributors may be used to endorse or promote products derived from
18246f4068280b5b191303ff13671e43a0522987demmentovai// this software without specific prior written permission.
19246f4068280b5b191303ff13671e43a0522987demmentovai//
20246f4068280b5b191303ff13671e43a0522987demmentovai// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21246f4068280b5b191303ff13671e43a0522987demmentovai// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22246f4068280b5b191303ff13671e43a0522987demmentovai// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23246f4068280b5b191303ff13671e43a0522987demmentovai// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24246f4068280b5b191303ff13671e43a0522987demmentovai// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25246f4068280b5b191303ff13671e43a0522987demmentovai// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26246f4068280b5b191303ff13671e43a0522987demmentovai// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27246f4068280b5b191303ff13671e43a0522987demmentovai// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28246f4068280b5b191303ff13671e43a0522987demmentovai// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29246f4068280b5b191303ff13671e43a0522987demmentovai// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30246f4068280b5b191303ff13671e43a0522987demmentovai// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31246f4068280b5b191303ff13671e43a0522987demmentovai
32246f4068280b5b191303ff13671e43a0522987demmentovai// stack_frame_cpu.h: CPU-specific StackFrame extensions.
33246f4068280b5b191303ff13671e43a0522987demmentovai//
34246f4068280b5b191303ff13671e43a0522987demmentovai// These types extend the StackFrame structure to carry CPU-specific register
35246f4068280b5b191303ff13671e43a0522987demmentovai// state.  They are defined in this header instead of stack_frame.h to
36246f4068280b5b191303ff13671e43a0522987demmentovai// avoid the need to include minidump_format.h when only the generic
37246f4068280b5b191303ff13671e43a0522987demmentovai// StackFrame type is needed.
38246f4068280b5b191303ff13671e43a0522987demmentovai//
39246f4068280b5b191303ff13671e43a0522987demmentovai// Author: Mark Mentovai
40246f4068280b5b191303ff13671e43a0522987demmentovai
41e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#ifndef GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_CPU_H__
42e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#define GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_CPU_H__
43246f4068280b5b191303ff13671e43a0522987demmentovai
44e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/common/minidump_format.h"
45e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/stack_frame.h"
46246f4068280b5b191303ff13671e43a0522987demmentovai
47e5dc60822e5938fea2ae892ccddb906641ba174emmentovainamespace google_breakpad {
48246f4068280b5b191303ff13671e43a0522987demmentovai
492684b4dc196ca2da9466aa5391f5c0090739d2f6jimblandystruct WindowsFrameInfo;
50921da5eb5412bc45368066966875ccc28d3b81d1benchan@chromium.orgclass CFIFrameInfo;
512684b4dc196ca2da9466aa5391f5c0090739d2f6jimblandy
52246f4068280b5b191303ff13671e43a0522987demmentovaistruct StackFrameX86 : public StackFrame {
536d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy  // ContextValidity has one entry for each relevant hardware pointer
546d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy  // register (%eip and %esp) and one entry for each general-purpose
556d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy  // register. It's worthwhile having validity flags for caller-saves
566d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy  // registers: they are valid in the youngest frame, and such a frame
576d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy  // might save a callee-saves register in a caller-saves register, but
586d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy  // SimpleCFIWalker won't touch registers unless they're marked as valid.
59246f4068280b5b191303ff13671e43a0522987demmentovai  enum ContextValidity {
60246f4068280b5b191303ff13671e43a0522987demmentovai    CONTEXT_VALID_NONE = 0,
61246f4068280b5b191303ff13671e43a0522987demmentovai    CONTEXT_VALID_EIP  = 1 << 0,
62246f4068280b5b191303ff13671e43a0522987demmentovai    CONTEXT_VALID_ESP  = 1 << 1,
63246f4068280b5b191303ff13671e43a0522987demmentovai    CONTEXT_VALID_EBP  = 1 << 2,
646d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy    CONTEXT_VALID_EAX  = 1 << 3,
656d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy    CONTEXT_VALID_EBX  = 1 << 4,
666d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy    CONTEXT_VALID_ECX  = 1 << 5,
676d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy    CONTEXT_VALID_EDX  = 1 << 6,
686d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy    CONTEXT_VALID_ESI  = 1 << 7,
696d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy    CONTEXT_VALID_EDI  = 1 << 8,
70246f4068280b5b191303ff13671e43a0522987demmentovai    CONTEXT_VALID_ALL  = -1
71246f4068280b5b191303ff13671e43a0522987demmentovai  };
72246f4068280b5b191303ff13671e43a0522987demmentovai
739753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com  StackFrameX86()
748d70618ffc6f87bfd3d7bfd05c87c35ec3179a7ated.mielczarek     : context(),
758d70618ffc6f87bfd3d7bfd05c87c35ec3179a7ated.mielczarek       context_validity(CONTEXT_VALID_NONE),
766d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy       windows_frame_info(NULL),
776d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy       cfi_frame_info(NULL) {}
782684b4dc196ca2da9466aa5391f5c0090739d2f6jimblandy  ~StackFrameX86();
79246f4068280b5b191303ff13671e43a0522987demmentovai
8092ea4edf7cef867798850de66c2701d9f97c0790jimblandy  // Overriden to return the return address as saved on the stack.
816162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  virtual uint64_t ReturnAddress() const;
8292ea4edf7cef867798850de66c2701d9f97c0790jimblandy
83246f4068280b5b191303ff13671e43a0522987demmentovai  // Register state.  This is only fully valid for the topmost frame in a
84246f4068280b5b191303ff13671e43a0522987demmentovai  // stack.  In other frames, the values of nonvolatile registers may be
85246f4068280b5b191303ff13671e43a0522987demmentovai  // present, given sufficient debugging information.  Refer to
86246f4068280b5b191303ff13671e43a0522987demmentovai  // context_validity.
87246f4068280b5b191303ff13671e43a0522987demmentovai  MDRawContextX86 context;
88246f4068280b5b191303ff13671e43a0522987demmentovai
89246f4068280b5b191303ff13671e43a0522987demmentovai  // context_validity is actually ContextValidity, but int is used because
90246f4068280b5b191303ff13671e43a0522987demmentovai  // the OR operator doesn't work well with enumerated types.  This indicates
91246f4068280b5b191303ff13671e43a0522987demmentovai  // which fields in context are valid.
92246f4068280b5b191303ff13671e43a0522987demmentovai  int context_validity;
932684b4dc196ca2da9466aa5391f5c0090739d2f6jimblandy
946d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy  // Any stack walking information we found describing this.instruction.
956d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy  // These may be NULL if there is no such information for that address.
962684b4dc196ca2da9466aa5391f5c0090739d2f6jimblandy  WindowsFrameInfo *windows_frame_info;
976d3a825dbf5b924c2e754309b3008e462af1d8d2jimblandy  CFIFrameInfo *cfi_frame_info;
98246f4068280b5b191303ff13671e43a0522987demmentovai};
99246f4068280b5b191303ff13671e43a0522987demmentovai
100246f4068280b5b191303ff13671e43a0522987demmentovaistruct StackFramePPC : public StackFrame {
101246f4068280b5b191303ff13671e43a0522987demmentovai  // ContextValidity should eventually contain entries for the validity of
102246f4068280b5b191303ff13671e43a0522987demmentovai  // other nonvolatile (callee-save) registers as in
103246f4068280b5b191303ff13671e43a0522987demmentovai  // StackFrameX86::ContextValidity, but the ppc stackwalker doesn't currently
104246f4068280b5b191303ff13671e43a0522987demmentovai  // locate registers other than the ones listed here.
105246f4068280b5b191303ff13671e43a0522987demmentovai  enum ContextValidity {
106246f4068280b5b191303ff13671e43a0522987demmentovai    CONTEXT_VALID_NONE = 0,
107246f4068280b5b191303ff13671e43a0522987demmentovai    CONTEXT_VALID_SRR0 = 1 << 0,
108246f4068280b5b191303ff13671e43a0522987demmentovai    CONTEXT_VALID_GPR1 = 1 << 1,
109246f4068280b5b191303ff13671e43a0522987demmentovai    CONTEXT_VALID_ALL  = -1
110246f4068280b5b191303ff13671e43a0522987demmentovai  };
111246f4068280b5b191303ff13671e43a0522987demmentovai
112246f4068280b5b191303ff13671e43a0522987demmentovai  StackFramePPC() : context(), context_validity(CONTEXT_VALID_NONE) {}
113246f4068280b5b191303ff13671e43a0522987demmentovai
114246f4068280b5b191303ff13671e43a0522987demmentovai  // Register state.  This is only fully valid for the topmost frame in a
115246f4068280b5b191303ff13671e43a0522987demmentovai  // stack.  In other frames, the values of nonvolatile registers may be
116246f4068280b5b191303ff13671e43a0522987demmentovai  // present, given sufficient debugging information.  Refer to
117246f4068280b5b191303ff13671e43a0522987demmentovai  // context_validity.
118246f4068280b5b191303ff13671e43a0522987demmentovai  MDRawContextPPC context;
119246f4068280b5b191303ff13671e43a0522987demmentovai
120246f4068280b5b191303ff13671e43a0522987demmentovai  // context_validity is actually ContextValidity, but int is used because
121246f4068280b5b191303ff13671e43a0522987demmentovai  // the OR operator doesn't work well with enumerated types.  This indicates
1228eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek  // which fields in context are valid.
1238eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek  int context_validity;
1248eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek};
1258eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek
126cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.orgstruct StackFramePPC64 : public StackFrame {
127cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org  // ContextValidity should eventually contain entries for the validity of
128cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org  // other nonvolatile (callee-save) registers as in
129cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org  // StackFrameX86::ContextValidity, but the ppc stackwalker doesn't currently
130cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org  // locate registers other than the ones listed here.
131cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org  enum ContextValidity {
132cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org    CONTEXT_VALID_NONE = 0,
133cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org    CONTEXT_VALID_SRR0 = 1 << 0,
134cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org    CONTEXT_VALID_GPR1 = 1 << 1,
135cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org    CONTEXT_VALID_ALL  = -1
136cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org  };
137cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org
138cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org  StackFramePPC64() : context(), context_validity(CONTEXT_VALID_NONE) {}
139cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org
140cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org  // Register state.  This is only fully valid for the topmost frame in a
141cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org  // stack.  In other frames, the values of nonvolatile registers may be
142cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org  // present, given sufficient debugging information.  Refer to
143cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org  // context_validity.
144cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org  MDRawContextPPC64 context;
145cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org
146cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org  // context_validity is actually ContextValidity, but int is used because
147cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org  // the OR operator doesn't work well with enumerated types.  This indicates
148cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org  // which fields in context are valid.
149cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org  int context_validity;
150cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org};
151cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org
1528eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarekstruct StackFrameAMD64 : public StackFrame {
153e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy  // ContextValidity has one entry for each register that we might be able
154e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy  // to recover.
1558eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek  enum ContextValidity {
156e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy    CONTEXT_VALID_NONE  = 0,
157e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy    CONTEXT_VALID_RAX   = 1 << 0,
158e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy    CONTEXT_VALID_RDX   = 1 << 1,
159e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy    CONTEXT_VALID_RCX   = 1 << 2,
160e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy    CONTEXT_VALID_RBX   = 1 << 3,
161e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy    CONTEXT_VALID_RSI   = 1 << 4,
162e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy    CONTEXT_VALID_RDI   = 1 << 5,
163e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy    CONTEXT_VALID_RBP   = 1 << 6,
164e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy    CONTEXT_VALID_RSP   = 1 << 7,
165e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy    CONTEXT_VALID_R8    = 1 << 8,
166e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy    CONTEXT_VALID_R9    = 1 << 9,
167e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy    CONTEXT_VALID_R10   = 1 << 10,
168e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy    CONTEXT_VALID_R11   = 1 << 11,
169e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy    CONTEXT_VALID_R12   = 1 << 12,
170e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy    CONTEXT_VALID_R13   = 1 << 13,
171e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy    CONTEXT_VALID_R14   = 1 << 14,
172e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy    CONTEXT_VALID_R15   = 1 << 15,
173e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy    CONTEXT_VALID_RIP   = 1 << 16,
1748eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek    CONTEXT_VALID_ALL  = -1
1758eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek  };
1768eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek
1778eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek  StackFrameAMD64() : context(), context_validity(CONTEXT_VALID_NONE) {}
1788eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek
17992ea4edf7cef867798850de66c2701d9f97c0790jimblandy  // Overriden to return the return address as saved on the stack.
1806162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  virtual uint64_t ReturnAddress() const;
18192ea4edf7cef867798850de66c2701d9f97c0790jimblandy
182e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy  // Register state. This is only fully valid for the topmost frame in a
183e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy  // stack. In other frames, which registers are present depends on what
184e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy  // debugging information we had available. Refer to context_validity.
1858eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek  MDRawContextAMD64 context;
1868eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek
187e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy  // For each register in context whose value has been recovered, we set
188e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy  // the corresponding CONTEXT_VALID_ bit in context_validity.
189e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy  //
190e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy  // context_validity's type should actually be ContextValidity, but
191e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy  // we use int instead because the bitwise inclusive or operator
192e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy  // yields an int when applied to enum values, and C++ doesn't
193e7e1e1ebf58a306af1e3199f6e493106e463cf91jimblandy  // silently convert from ints to enums.
194246f4068280b5b191303ff13671e43a0522987demmentovai  int context_validity;
195246f4068280b5b191303ff13671e43a0522987demmentovai};
196246f4068280b5b191303ff13671e43a0522987demmentovai
197ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovaistruct StackFrameSPARC : public StackFrame {
198ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai  // to be confirmed
199ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai  enum ContextValidity {
200ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai    CONTEXT_VALID_NONE = 0,
201dd2ff4a21c57672170eb14ccc5142efd7d92f3f1ted.mielczarek    CONTEXT_VALID_PC   = 1 << 0,
202dd2ff4a21c57672170eb14ccc5142efd7d92f3f1ted.mielczarek    CONTEXT_VALID_SP   = 1 << 1,
203dd2ff4a21c57672170eb14ccc5142efd7d92f3f1ted.mielczarek    CONTEXT_VALID_FP   = 1 << 2,
204ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai    CONTEXT_VALID_ALL  = -1
205ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai  };
206ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai
207ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai  StackFrameSPARC() : context(), context_validity(CONTEXT_VALID_NONE) {}
208ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai
209ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai  // Register state.  This is only fully valid for the topmost frame in a
210ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai  // stack.  In other frames, the values of nonvolatile registers may be
211ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai  // present, given sufficient debugging information.  Refer to
212ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai  // context_validity.
213ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai  MDRawContextSPARC context;
214ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai
215ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai  // context_validity is actually ContextValidity, but int is used because
216ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai  // the OR operator doesn't work well with enumerated types.  This indicates
217ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai  // which fields in context are valid.
218ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai  int context_validity;
219ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai};
220ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai
2219276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarekstruct StackFrameARM : public StackFrame {
222c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy  // A flag for each register we might know.
2239276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek  enum ContextValidity {
2249276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek    CONTEXT_VALID_NONE = 0,
225c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_R0   = 1 << 0,
226c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_R1   = 1 << 1,
227c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_R2   = 1 << 2,
228c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_R3   = 1 << 3,
229c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_R4   = 1 << 4,
230c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_R5   = 1 << 5,
231c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_R6   = 1 << 6,
232c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_R7   = 1 << 7,
233c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_R8   = 1 << 8,
234c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_R9   = 1 << 9,
235c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_R10  = 1 << 10,
236c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_R11  = 1 << 11,
237c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_R12  = 1 << 12,
238c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_R13  = 1 << 13,
239c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_R14  = 1 << 14,
240c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_R15  = 1 << 15,
241c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_ALL  = ~CONTEXT_VALID_NONE,
242c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy
243c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    // Aliases for registers with dedicated or conventional roles.
244c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_FP   = CONTEXT_VALID_R11,
245c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_SP   = CONTEXT_VALID_R13,
246c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_LR   = CONTEXT_VALID_R14,
247c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    CONTEXT_VALID_PC   = CONTEXT_VALID_R15
2489276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek  };
2499276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek
2509276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek  StackFrameARM() : context(), context_validity(CONTEXT_VALID_NONE) {}
2519276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek
252c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy  // Return the ContextValidity flag for register rN.
253c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy  static ContextValidity RegisterValidFlag(int n) {
254c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy    return ContextValidity(1 << n);
2559753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com  }
256c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy
2579276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek  // Register state.  This is only fully valid for the topmost frame in a
2589276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek  // stack.  In other frames, the values of nonvolatile registers may be
2599276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek  // present, given sufficient debugging information.  Refer to
2609276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek  // context_validity.
2619276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek  MDRawContextARM context;
2629276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek
263c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy  // For each register in context whose value has been recovered, we set
264c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy  // the corresponding CONTEXT_VALID_ bit in context_validity.
265c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy  //
266c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy  // context_validity's type should actually be ContextValidity, but
267c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy  // we use int instead because the bitwise inclusive or operator
268c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy  // yields an int when applied to enum values, and C++ doesn't
269c609f474a955e1f617802ff1185efaa5ef9659f9jimblandy  // silently convert from ints to enums.
2709276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek  int context_validity;
2719276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek};
2729276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek
27339d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.orgstruct StackFrameARM64 : public StackFrame {
27439d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  // A flag for each register we might know. Note that we can't use an enum
27539d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  // here as there are 33 values to represent.
27639d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_NONE = 0;
27739d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X0   = 1ULL << 0;
27839d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X1   = 1ULL << 1;
27939d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X2   = 1ULL << 2;
28039d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X3   = 1ULL << 3;
28139d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X4   = 1ULL << 4;
28239d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X5   = 1ULL << 5;
28339d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X6   = 1ULL << 6;
28439d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X7   = 1ULL << 7;
28539d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X8   = 1ULL << 8;
28639d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X9   = 1ULL << 9;
28739d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X10  = 1ULL << 10;
28839d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X11  = 1ULL << 11;
28939d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X12  = 1ULL << 12;
29039d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X13  = 1ULL << 13;
29139d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X14  = 1ULL << 14;
29239d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X15  = 1ULL << 15;
29339d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X16  = 1ULL << 16;
29439d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X17  = 1ULL << 17;
29539d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X18  = 1ULL << 18;
29639d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X19  = 1ULL << 19;
29739d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X20  = 1ULL << 20;
29839d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X21  = 1ULL << 21;
29939d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X22  = 1ULL << 22;
30039d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X23  = 1ULL << 23;
30139d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X24  = 1ULL << 24;
30239d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X25  = 1ULL << 25;
30339d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X26  = 1ULL << 26;
30439d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X27  = 1ULL << 27;
30539d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X28  = 1ULL << 28;
30639d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X29  = 1ULL << 29;
30739d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X30  = 1ULL << 30;
30839d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X31  = 1ULL << 31;
30939d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_X32  = 1ULL << 32;
31039d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_ALL  = ~CONTEXT_VALID_NONE;
31139d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org
31239d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  // Aliases for registers with dedicated or conventional roles.
31339d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_FP   = CONTEXT_VALID_X29;
31439d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_LR   = CONTEXT_VALID_X30;
31539d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_SP   = CONTEXT_VALID_X31;
31639d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static const uint64_t CONTEXT_VALID_PC   = CONTEXT_VALID_X32;
31739d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org
31839d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  StackFrameARM64() : context(),
31939d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org                      context_validity(CONTEXT_VALID_NONE) {}
32039d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org
32139d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  // Return the validity flag for register xN.
32239d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  static uint64_t RegisterValidFlag(int n) {
32339d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org    return 1ULL << n;
32439d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  }
32539d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org
32639d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  // Register state.  This is only fully valid for the topmost frame in a
32739d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  // stack.  In other frames, the values of nonvolatile registers may be
32839d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  // present, given sufficient debugging information.  Refer to
32939d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  // context_validity.
33039d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  MDRawContextARM64 context;
33139d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org
33239d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  // For each register in context whose value has been recovered, we set
33339d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  // the corresponding CONTEXT_VALID_ bit in context_validity.
33439d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org  uint64_t context_validity;
33539d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org};
33639d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org
3375f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.comstruct StackFrameMIPS : public StackFrame {
3385f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  // MIPS callee save registers for o32 ABI (32bit registers) are:
3395f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  // 1. $s0-$s7,
3405f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  // 2. $sp, $fp
3415f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  // 3. $f20-$f31
3425f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  //
3435f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  // The register structure is available at
3445f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  // http://en.wikipedia.org/wiki/MIPS_architecture#Compiler_register_usage
3455f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
3465f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com#define INDEX_MIPS_REG_S0 MD_CONTEXT_MIPS_REG_S0  // 16
3475f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com#define INDEX_MIPS_REG_S7 MD_CONTEXT_MIPS_REG_S7  // 23
3485f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com#define INDEX_MIPS_REG_GP MD_CONTEXT_MIPS_REG_GP  // 28
3495f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com#define INDEX_MIPS_REG_RA MD_CONTEXT_MIPS_REG_RA  // 31
3505f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com#define INDEX_MIPS_REG_PC 34
3515f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com#define SHIFT_MIPS_REG_S0 0
3525f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com#define SHIFT_MIPS_REG_GP 8
3535f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com#define SHIFT_MIPS_REG_PC 12
3545f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
3555f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  enum ContextValidity {
3565f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    CONTEXT_VALID_NONE = 0,
3575f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    CONTEXT_VALID_S0 = 1 << 0,  // $16
3585f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    CONTEXT_VALID_S1 = 1 << 1,  // $17
3595f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    CONTEXT_VALID_S2 = 1 << 2,  // $18
3605f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    CONTEXT_VALID_S3 = 1 << 3,  // $19
3615f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    CONTEXT_VALID_S4 = 1 << 4,  // $20
3625f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    CONTEXT_VALID_S5 = 1 << 5,  // $21
3635f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    CONTEXT_VALID_S6 = 1 << 6,  // $22
3645f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    CONTEXT_VALID_S7 = 1 << 7,  // $23
3655f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    // GP is not calee-save for o32 abi.
3665f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    CONTEXT_VALID_GP = 1 << 8,  // $28
3675f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    CONTEXT_VALID_SP = 1 << 9,  // $29
3685f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    CONTEXT_VALID_FP = 1 << 10,  // $30
3695f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    CONTEXT_VALID_RA = 1 << 11,  // $31
3705f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    CONTEXT_VALID_PC = 1 << 12,  // $34
3715f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    CONTEXT_VALID_ALL = ~CONTEXT_VALID_NONE
3725f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  };
3735f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
3745f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  // Return the ContextValidity flag for register rN.
3755f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  static ContextValidity RegisterValidFlag(int n) {
3765f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    if (n >= INDEX_MIPS_REG_S0 && n <= INDEX_MIPS_REG_S7)
3775f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com      return ContextValidity(1 << (n - INDEX_MIPS_REG_S0 + SHIFT_MIPS_REG_S0));
3785f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    else if (n >= INDEX_MIPS_REG_GP && n <= INDEX_MIPS_REG_RA)
3795f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com      return ContextValidity(1 << (n - INDEX_MIPS_REG_GP + SHIFT_MIPS_REG_GP));
3805f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    else if (n == INDEX_MIPS_REG_PC)
3815f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com      return ContextValidity(1 << SHIFT_MIPS_REG_PC);
3825f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
3835f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com    return CONTEXT_VALID_NONE;
3845f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  }
3855f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
3865f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  StackFrameMIPS() : context(), context_validity(CONTEXT_VALID_NONE) {}
3875f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
3885f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  // Register state. This is only fully valid for the topmost frame in a
3895f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  // stack. In other frames, which registers are present depends on what
3905f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  // debugging information were available. Refer to 'context_validity' below.
3915f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  MDRawContextMIPS context;
3925f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
3935f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  // For each register in context whose value has been recovered,
3945f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  // the corresponding CONTEXT_VALID_ bit in 'context_validity' is set.
3955f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  //
3965f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  // context_validity's type should actually be ContextValidity, but
3975f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  // type int is used instead because the bitwise inclusive or operator
3985f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  // yields an int when applied to enum values, and C++ doesn't
3995f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  // silently convert from ints to enums.
4005f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com  int context_validity;
4015f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com};
4025f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com
403e5dc60822e5938fea2ae892ccddb906641ba174emmentovai}  // namespace google_breakpad
404246f4068280b5b191303ff13671e43a0522987demmentovai
405e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#endif  // GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_CPU_H__
406