The data contained in this repository can be downloaded to your computer using one of several clients.
Please see the documentation of your version control software client for more information.

Please select the desired protocol below to get the URL.

This URL has Read-Only access.

Statistics
| Branch: | Revision:

main_repo / deps / v8 / src / arm / frames-arm.h @ f230a1cf

History | View | Annotate | Download (6.06 KB)

1
// Copyright 2012 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_ARM_FRAMES_ARM_H_
29
#define V8_ARM_FRAMES_ARM_H_
30

    
31
namespace v8 {
32
namespace internal {
33

    
34

    
35
// The ARM ABI does not specify the usage of register r9, which may be reserved
36
// as the static base or thread register on some platforms, in which case we
37
// leave it alone. Adjust the value of kR9Available accordingly:
38
const int kR9Available = 1;  // 1 if available to us, 0 if reserved
39

    
40

    
41
// Register list in load/store instructions
42
// Note that the bit values must match those used in actual instruction encoding
43
const int kNumRegs = 16;
44

    
45

    
46
// Caller-saved/arguments registers
47
const RegList kJSCallerSaved =
48
  1 << 0 |  // r0 a1
49
  1 << 1 |  // r1 a2
50
  1 << 2 |  // r2 a3
51
  1 << 3;   // r3 a4
52

    
53
const int kNumJSCallerSaved = 4;
54

    
55
typedef Object* JSCallerSavedBuffer[kNumJSCallerSaved];
56

    
57
// Return the code of the n-th caller-saved register available to JavaScript
58
// e.g. JSCallerSavedReg(0) returns r0.code() == 0
59
int JSCallerSavedCode(int n);
60

    
61

    
62
// Callee-saved registers preserved when switching from C to JavaScript
63
const RegList kCalleeSaved =
64
  1 <<  4 |  //  r4 v1
65
  1 <<  5 |  //  r5 v2
66
  1 <<  6 |  //  r6 v3
67
  1 <<  7 |  //  r7 v4 (pp in JavaScript code)
68
  1 <<  8 |  //  r8 v5 (cp in JavaScript code)
69
  kR9Available <<  9 |  //  r9 v6
70
  1 << 10 |  // r10 v7
71
  1 << 11;   // r11 v8 (fp in JavaScript code)
72

    
73
// When calling into C++ (only for C++ calls that can't cause a GC).
74
// The call code will take care of lr, fp, etc.
75
const RegList kCallerSaved =
76
  1 <<  0 |  // r0
77
  1 <<  1 |  // r1
78
  1 <<  2 |  // r2
79
  1 <<  3 |  // r3
80
  1 <<  9;   // r9
81

    
82

    
83
const int kNumCalleeSaved = 7 + kR9Available;
84

    
85
// Double registers d8 to d15 are callee-saved.
86
const int kNumDoubleCalleeSaved = 8;
87

    
88

    
89
// Number of registers for which space is reserved in safepoints. Must be a
90
// multiple of 8.
91
// TODO(regis): Only 8 registers may actually be sufficient. Revisit.
92
const int kNumSafepointRegisters = 16;
93

    
94
// Define the list of registers actually saved at safepoints.
95
// Note that the number of saved registers may be smaller than the reserved
96
// space, i.e. kNumSafepointSavedRegisters <= kNumSafepointRegisters.
97
const RegList kSafepointSavedRegisters = kJSCallerSaved | kCalleeSaved;
98
const int kNumSafepointSavedRegisters = kNumJSCallerSaved + kNumCalleeSaved;
99

    
100
// ----------------------------------------------------
101

    
102

    
103
class EntryFrameConstants : public AllStatic {
104
 public:
105
  static const int kCallerFPOffset      = -3 * kPointerSize;
106
};
107

    
108

    
109
class ExitFrameConstants : public AllStatic {
110
 public:
111
  static const int kCodeOffset = -2 * kPointerSize;
112
  static const int kSPOffset = -1 * kPointerSize;
113

    
114
  // The caller fields are below the frame pointer on the stack.
115
  static const int kCallerFPOffset = 0 * kPointerSize;
116
  // The calling JS function is below FP.
117
  static const int kCallerPCOffset = 1 * kPointerSize;
118

    
119
  // FP-relative displacement of the caller's SP.  It points just
120
  // below the saved PC.
121
  static const int kCallerSPDisplacement = 2 * kPointerSize;
122
};
123

    
124

    
125
class JavaScriptFrameConstants : public AllStatic {
126
 public:
127
  // FP-relative.
128
  static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset;
129
  static const int kLastParameterOffset = +2 * kPointerSize;
130
  static const int kFunctionOffset = StandardFrameConstants::kMarkerOffset;
131

    
132
  // Caller SP-relative.
133
  static const int kParam0Offset   = -2 * kPointerSize;
134
  static const int kReceiverOffset = -1 * kPointerSize;
135
};
136

    
137

    
138
class ArgumentsAdaptorFrameConstants : public AllStatic {
139
 public:
140
  // FP-relative.
141
  static const int kLengthOffset = StandardFrameConstants::kExpressionsOffset;
142

    
143
  static const int kFrameSize =
144
      StandardFrameConstants::kFixedFrameSize + kPointerSize;
145
};
146

    
147

    
148
class ConstructFrameConstants : public AllStatic {
149
 public:
150
  // FP-relative.
151
  static const int kImplicitReceiverOffset = -6 * kPointerSize;
152
  static const int kConstructorOffset      = -5 * kPointerSize;
153
  static const int kLengthOffset           = -4 * kPointerSize;
154
  static const int kCodeOffset = StandardFrameConstants::kExpressionsOffset;
155

    
156
  static const int kFrameSize =
157
      StandardFrameConstants::kFixedFrameSize + 4 * kPointerSize;
158
};
159

    
160

    
161
class InternalFrameConstants : public AllStatic {
162
 public:
163
  // FP-relative.
164
  static const int kCodeOffset = StandardFrameConstants::kExpressionsOffset;
165
};
166

    
167

    
168
inline Object* JavaScriptFrame::function_slot_object() const {
169
  const int offset = JavaScriptFrameConstants::kFunctionOffset;
170
  return Memory::Object_at(fp() + offset);
171
}
172

    
173

    
174
inline void StackHandler::SetFp(Address slot, Address fp) {
175
  Memory::Address_at(slot) = fp;
176
}
177

    
178

    
179
} }  // namespace v8::internal
180

    
181
#endif  // V8_ARM_FRAMES_ARM_H_