]> git.saurik.com Git - apple/javascriptcore.git/blame - assembler/CodeLocation.h
JavaScriptCore-621.1.tar.gz
[apple/javascriptcore.git] / assembler / CodeLocation.h
CommitLineData
ba379fdc
A
1/*
2 * Copyright (C) 2009 Apple Inc. 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
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#ifndef CodeLocation_h
27#define CodeLocation_h
28
ba379fdc
A
29
30#include <MacroAssemblerCodeRef.h>
31
32#if ENABLE(ASSEMBLER)
33
34namespace JSC {
35
36class CodeLocationInstruction;
37class CodeLocationLabel;
38class CodeLocationJump;
39class CodeLocationCall;
40class CodeLocationNearCall;
41class CodeLocationDataLabel32;
42class CodeLocationDataLabelPtr;
43
44// The CodeLocation* types are all pretty much do-nothing wrappers around
45// CodePtr (or MacroAssemblerCodePtr, to give it its full name). These
46// classes only exist to provide type-safety when linking and patching code.
47//
48// The one new piece of functionallity introduced by these classes is the
49// ability to create (or put another way, to re-discover) another CodeLocation
50// at an offset from one you already know. When patching code to optimize it
51// we often want to patch a number of instructions that are short, fixed
52// offsets apart. To reduce memory overhead we will only retain a pointer to
53// one of the instructions, and we will use the *AtOffset methods provided by
54// CodeLocationCommon to find the other points in the code to modify.
55class CodeLocationCommon : public MacroAssemblerCodePtr {
56public:
57 CodeLocationInstruction instructionAtOffset(int offset);
58 CodeLocationLabel labelAtOffset(int offset);
59 CodeLocationJump jumpAtOffset(int offset);
60 CodeLocationCall callAtOffset(int offset);
61 CodeLocationNearCall nearCallAtOffset(int offset);
62 CodeLocationDataLabelPtr dataLabelPtrAtOffset(int offset);
63 CodeLocationDataLabel32 dataLabel32AtOffset(int offset);
64
65protected:
66 CodeLocationCommon()
67 {
68 }
69
70 CodeLocationCommon(MacroAssemblerCodePtr location)
71 : MacroAssemblerCodePtr(location)
72 {
73 }
74};
75
76class CodeLocationInstruction : public CodeLocationCommon {
77public:
78 CodeLocationInstruction() {}
79 explicit CodeLocationInstruction(MacroAssemblerCodePtr location)
80 : CodeLocationCommon(location) {}
81 explicit CodeLocationInstruction(void* location)
82 : CodeLocationCommon(MacroAssemblerCodePtr(location)) {}
83};
84
85class CodeLocationLabel : public CodeLocationCommon {
86public:
87 CodeLocationLabel() {}
88 explicit CodeLocationLabel(MacroAssemblerCodePtr location)
89 : CodeLocationCommon(location) {}
90 explicit CodeLocationLabel(void* location)
91 : CodeLocationCommon(MacroAssemblerCodePtr(location)) {}
92};
93
94class CodeLocationJump : public CodeLocationCommon {
95public:
96 CodeLocationJump() {}
97 explicit CodeLocationJump(MacroAssemblerCodePtr location)
98 : CodeLocationCommon(location) {}
99 explicit CodeLocationJump(void* location)
100 : CodeLocationCommon(MacroAssemblerCodePtr(location)) {}
101};
102
103class CodeLocationCall : public CodeLocationCommon {
104public:
105 CodeLocationCall() {}
106 explicit CodeLocationCall(MacroAssemblerCodePtr location)
107 : CodeLocationCommon(location) {}
108 explicit CodeLocationCall(void* location)
109 : CodeLocationCommon(MacroAssemblerCodePtr(location)) {}
110};
111
112class CodeLocationNearCall : public CodeLocationCommon {
113public:
114 CodeLocationNearCall() {}
115 explicit CodeLocationNearCall(MacroAssemblerCodePtr location)
116 : CodeLocationCommon(location) {}
117 explicit CodeLocationNearCall(void* location)
118 : CodeLocationCommon(MacroAssemblerCodePtr(location)) {}
119};
120
121class CodeLocationDataLabel32 : public CodeLocationCommon {
122public:
123 CodeLocationDataLabel32() {}
124 explicit CodeLocationDataLabel32(MacroAssemblerCodePtr location)
125 : CodeLocationCommon(location) {}
126 explicit CodeLocationDataLabel32(void* location)
127 : CodeLocationCommon(MacroAssemblerCodePtr(location)) {}
128};
129
130class CodeLocationDataLabelPtr : public CodeLocationCommon {
131public:
132 CodeLocationDataLabelPtr() {}
133 explicit CodeLocationDataLabelPtr(MacroAssemblerCodePtr location)
134 : CodeLocationCommon(location) {}
135 explicit CodeLocationDataLabelPtr(void* location)
136 : CodeLocationCommon(MacroAssemblerCodePtr(location)) {}
137};
138
139inline CodeLocationInstruction CodeLocationCommon::instructionAtOffset(int offset)
140{
141 ASSERT_VALID_CODE_OFFSET(offset);
142 return CodeLocationInstruction(reinterpret_cast<char*>(dataLocation()) + offset);
143}
144
145inline CodeLocationLabel CodeLocationCommon::labelAtOffset(int offset)
146{
147 ASSERT_VALID_CODE_OFFSET(offset);
148 return CodeLocationLabel(reinterpret_cast<char*>(dataLocation()) + offset);
149}
150
151inline CodeLocationJump CodeLocationCommon::jumpAtOffset(int offset)
152{
153 ASSERT_VALID_CODE_OFFSET(offset);
154 return CodeLocationJump(reinterpret_cast<char*>(dataLocation()) + offset);
155}
156
157inline CodeLocationCall CodeLocationCommon::callAtOffset(int offset)
158{
159 ASSERT_VALID_CODE_OFFSET(offset);
160 return CodeLocationCall(reinterpret_cast<char*>(dataLocation()) + offset);
161}
162
163inline CodeLocationNearCall CodeLocationCommon::nearCallAtOffset(int offset)
164{
165 ASSERT_VALID_CODE_OFFSET(offset);
166 return CodeLocationNearCall(reinterpret_cast<char*>(dataLocation()) + offset);
167}
168
169inline CodeLocationDataLabelPtr CodeLocationCommon::dataLabelPtrAtOffset(int offset)
170{
171 ASSERT_VALID_CODE_OFFSET(offset);
172 return CodeLocationDataLabelPtr(reinterpret_cast<char*>(dataLocation()) + offset);
173}
174
175inline CodeLocationDataLabel32 CodeLocationCommon::dataLabel32AtOffset(int offset)
176{
177 ASSERT_VALID_CODE_OFFSET(offset);
178 return CodeLocationDataLabel32(reinterpret_cast<char*>(dataLocation()) + offset);
179}
180
181} // namespace JSC
182
183#endif // ENABLE(ASSEMBLER)
184
185#endif // CodeLocation_h