Split nested namespaces declaration in two lines in accordance with C++ Style Guide.
[platform/upstream/v8.git] / src / ia32 / frames-ia32.h
1 // Copyright 2006-2008 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 //     * Redistributions of source code must retain the above copyright
7 //       notice, this list of conditions and the following disclaimer.
8 //     * Redistributions in binary form must reproduce the above
9 //       copyright notice, this list of conditions and the following
10 //       disclaimer in the documentation and/or other materials provided
11 //       with the distribution.
12 //     * Neither the name of Google Inc. nor the names of its
13 //       contributors may be used to endorse or promote products derived
14 //       from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28 #ifndef V8_IA32_FRAMES_IA32_H_
29 #define V8_IA32_FRAMES_IA32_H_
30
31 namespace v8 {
32 namespace internal {
33
34
35 // Register lists
36 // Note that the bit values must match those used in actual instruction encoding
37 static const int kNumRegs = 8;
38
39
40 // Caller-saved registers
41 static const RegList kJSCallerSaved =
42   1 << 0 |  // eax
43   1 << 1 |  // ecx
44   1 << 2 |  // edx
45   1 << 3 |  // ebx - used as a caller-saved register in JavaScript code
46   1 << 7;   // edi - callee function
47
48 static const int kNumJSCallerSaved = 5;
49
50 typedef Object* JSCallerSavedBuffer[kNumJSCallerSaved];
51
52 // ----------------------------------------------------
53
54
55 class StackHandlerConstants : public AllStatic {
56  public:
57   static const int kNextOffset  = 0 * kPointerSize;
58   static const int kPPOffset    = 1 * kPointerSize;
59   static const int kFPOffset    = 2 * kPointerSize;
60
61   // TODO(1233780): Get rid of the code slot in stack handlers.
62   static const int kCodeOffset  = 3 * kPointerSize;
63
64   static const int kStateOffset = 4 * kPointerSize;
65   static const int kPCOffset    = 5 * kPointerSize;
66
67   static const int kAddressDisplacement = -1 * kPointerSize;
68   static const int kSize = kPCOffset + kPointerSize;
69 };
70
71
72 class EntryFrameConstants : public AllStatic {
73  public:
74   static const int kCallerFPOffset      = -6 * kPointerSize;
75
76   static const int kFunctionArgOffset   = +3 * kPointerSize;
77   static const int kReceiverArgOffset   = +4 * kPointerSize;
78   static const int kArgcOffset          = +5 * kPointerSize;
79   static const int kArgvOffset          = +6 * kPointerSize;
80 };
81
82
83 class ExitFrameConstants : public AllStatic {
84  public:
85   static const int kDebugMarkOffset = -2 * kPointerSize;
86   static const int kSPOffset        = -1 * kPointerSize;
87
88   // Let the parameters pointer for exit frames point just below the
89   // frame structure on the stack (frame pointer and return address).
90   static const int kPPDisplacement = +2 * kPointerSize;
91
92   static const int kCallerFPOffset =  0 * kPointerSize;
93   static const int kCallerPCOffset = +1 * kPointerSize;
94 };
95
96
97 class StandardFrameConstants : public AllStatic {
98  public:
99   static const int kExpressionsOffset = -3 * kPointerSize;
100   static const int kMarkerOffset      = -2 * kPointerSize;
101   static const int kContextOffset     = -1 * kPointerSize;
102   static const int kCallerFPOffset    =  0 * kPointerSize;
103   static const int kCallerPCOffset    = +1 * kPointerSize;
104   static const int kCallerSPOffset    = +2 * kPointerSize;
105 };
106
107
108 class JavaScriptFrameConstants : public AllStatic {
109  public:
110   // FP-relative.
111   static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset;
112   static const int kSavedRegistersOffset = +2 * kPointerSize;
113   static const int kFunctionOffset = StandardFrameConstants::kMarkerOffset;
114
115   // CallerSP-relative (aka PP-relative)
116   static const int kParam0Offset   = -2 * kPointerSize;
117   static const int kReceiverOffset = -1 * kPointerSize;
118 };
119
120
121 class ArgumentsAdaptorFrameConstants : public AllStatic {
122  public:
123   static const int kLengthOffset = StandardFrameConstants::kExpressionsOffset;
124 };
125
126
127 class InternalFrameConstants : public AllStatic {
128  public:
129   static const int kCodeOffset = StandardFrameConstants::kExpressionsOffset;
130 };
131
132
133 inline Object* JavaScriptFrame::function_slot_object() const {
134   const int offset = JavaScriptFrameConstants::kFunctionOffset;
135   return Memory::Object_at(fp() + offset);
136 }
137
138
139 // ----------------------------------------------------
140
141
142
143
144   // C Entry frames:
145
146   //    lower    |    Stack    |
147   //  addresses  |      ^      |
148   //             |      |      |
149   //             |             |
150   //             +-------------+
151   //             |  entry_pc   |
152   //             +-------------+ <--+ entry_sp
153   //                    .           |
154   //                    .           |
155   //                    .           |
156   //             +-------------+    |
157   //          -3 |  entry_sp --+----+
158   //      e      +-------------+
159   //      n   -2 | C function  |
160   //      t      +-------------+
161   //      r   -1 |  caller_pp  |
162   //      y      +-------------+ <--- fp (frame pointer, ebp)
163   //           0 |  caller_fp  |
164   //      f      +-------------+
165   //      r    1 |  caller_pc  |
166   //      a      +-------------+ <--- caller_sp (stack pointer, esp)
167   //      m    2 |             |
168   //      e      |  arguments  |
169   //             |             |
170   //             +- - - - - - -+
171   //             |  argument0  |
172   //             +=============+
173   //             |             |
174   //             |   caller    |
175   //   higher    | expressions |
176   //  addresses  |             |
177
178
179   // Proper JS frames:
180
181   //    lower    |    Stack    |
182   //  addresses  |      ^      |
183   //             |      |      |
184   //             |             |
185   // ----------- +=============+ <--- sp (stack pointer, esp)
186   //             |  function   |
187   //             +-------------+
188   //             |             |
189   //             | expressions |
190   //             |             |
191   //             +-------------+
192   //      a      |             |
193   //      c      |   locals    |
194   //      t      |             |
195   //      i      +- - - - - - -+ <---
196   //      v   -4 |   local0    |   ^
197   //      a      +-------------+   |
198   //      t   -3 |    code     |   |
199   //      i      +-------------+   |
200   //      o   -2 |   context   |   | kLocal0Offset
201   //      n      +-------------+   |
202   //          -1 |  caller_pp  |   v
203   //      f      +-------------+ <--- fp (frame pointer, ebp)
204   //      r    0 |  caller_fp  |
205   //      a      +-------------+
206   //      m    1 |  caller_pc  |
207   //      e      +-------------+ <--- caller_sp (incl. parameters)
208   //           2 |             |
209   //             | parameters  |
210   //             |             |
211   //             +- - - - - - -+ <---
212   //          -2 | parameter0  |   ^
213   //             +-------------+   | kParam0Offset
214   //          -1 |  receiver   |   v
215   // ----------- +=============+ <--- pp (parameter pointer, edi)
216   //           0 |  function   |
217   //             +-------------+
218   //             |             |
219   //             |   caller    |
220   //   higher    | expressions |
221   //  addresses  |             |
222
223
224   // JS entry frames: When calling from C to JS, we construct two extra
225   // frames: An entry frame (C) and a trampoline frame (JS). The
226   // following pictures shows the two frames:
227
228   //    lower    |    Stack    |
229   //  addresses  |      ^      |
230   //             |      |      |
231   //             |             |
232   // ----------- +=============+ <--- sp (stack pointer, esp)
233   //             |             |
234   //             | parameters  |
235   //      t      |             |
236   //      r      +- - - - - - -+
237   //      a      | parameter0  |
238   //      m      +-------------+
239   //      p      |  receiver   |
240   //      o      +-------------+ <---
241   //      l      |  function   |   ^
242   //      i      +-------------+   |
243   //      n   -3 |    code     |   | kLocal0Offset
244   //      e      +-------------+
245   //          -2 |    NULL     | context is always NULL
246   //             +-------------+
247   //      f   -1 |    NULL     | caller pp is always NULL for entry frames
248   //      r      +-------------+ <--- fp (frame pointer, ebp)
249   //      a    0 |  caller fp  |
250   //      m      +-------------+
251   //      e    1 |  caller pc  |
252   //             +-------------+ <--- caller_sp (incl. parameters)
253   //             |      0      |
254   // ----------- +=============+ <--- pp (parameter pointer, edi)
255   //             |      0      |
256   //             +-------------+ <---
257   //                    .          ^
258   //                    .          |  try-handler (HandlerOffsets::kSize)
259   //                    .          v
260   //             +-------------+ <---
261   //          -5 | next top pp |
262   //             +-------------+
263   //      e   -4 | next top fp |
264   //      n      +-------------+ <---
265   //      t   -3 |     ebx     |   ^
266   //      r      +-------------+   |
267   //      y   -2 |     esi     |   |  callee-saved registers
268   //             +-------------+   |
269   //          -1 |     edi     |   v
270   //      f      +-------------+ <--- fp
271   //      r    0 |  caller fp  |
272   //      a      +-------------+      pp == NULL (parameter pointer)
273   //      m    1 |  caller pc  |
274   //      e      +-------------+ <--- caller sp
275   //           2 | code  entry |   ^
276   //             +-------------+   |
277   //           3 |  function   |   |
278   //             +-------------+   |  arguments passed from C code
279   //           4 |  receiver   |   |
280   //             +-------------+   |
281   //           5 |    argc     |   |
282   //             +-------------+   |
283   //           6 |    argv     |   v
284   //             +-------------+ <---
285   //             |             |
286   //   higher    |             |
287   //  addresses  |             |
288
289
290 } }  // namespace v8::internal
291
292 #endif  // V8_IA32_FRAMES_IA32_H_