2
* Copyright (C) 2009 Apple Inc. All rights reserved.
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions
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.
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.
26
#ifndef CodeLocation_h
27
#define CodeLocation_h
29
#include <wtf/Platform.h>
31
#include <MacroAssemblerCodeRef.h>
37
class CodeLocationInstruction;
38
class CodeLocationLabel;
39
class CodeLocationJump;
40
class CodeLocationCall;
41
class CodeLocationNearCall;
42
class CodeLocationDataLabel32;
43
class CodeLocationDataLabelPtr;
45
// The CodeLocation* types are all pretty much do-nothing wrappers around
46
// CodePtr (or MacroAssemblerCodePtr, to give it its full name). These
47
// classes only exist to provide type-safety when linking and patching code.
49
// The one new piece of functionallity introduced by these classes is the
50
// ability to create (or put another way, to re-discover) another CodeLocation
51
// at an offset from one you already know. When patching code to optimize it
52
// we often want to patch a number of instructions that are short, fixed
53
// offsets apart. To reduce memory overhead we will only retain a pointer to
54
// one of the instructions, and we will use the *AtOffset methods provided by
55
// CodeLocationCommon to find the other points in the code to modify.
56
class CodeLocationCommon : public MacroAssemblerCodePtr {
58
CodeLocationInstruction instructionAtOffset(int offset);
59
CodeLocationLabel labelAtOffset(int offset);
60
CodeLocationJump jumpAtOffset(int offset);
61
CodeLocationCall callAtOffset(int offset);
62
CodeLocationNearCall nearCallAtOffset(int offset);
63
CodeLocationDataLabelPtr dataLabelPtrAtOffset(int offset);
64
CodeLocationDataLabel32 dataLabel32AtOffset(int offset);
71
CodeLocationCommon(MacroAssemblerCodePtr location)
72
: MacroAssemblerCodePtr(location)
77
class CodeLocationInstruction : public CodeLocationCommon {
79
CodeLocationInstruction() {}
80
explicit CodeLocationInstruction(MacroAssemblerCodePtr location)
81
: CodeLocationCommon(location) {}
82
explicit CodeLocationInstruction(void* location)
83
: CodeLocationCommon(MacroAssemblerCodePtr(location)) {}
86
class CodeLocationLabel : public CodeLocationCommon {
88
CodeLocationLabel() {}
89
explicit CodeLocationLabel(MacroAssemblerCodePtr location)
90
: CodeLocationCommon(location) {}
91
explicit CodeLocationLabel(void* location)
92
: CodeLocationCommon(MacroAssemblerCodePtr(location)) {}
95
class CodeLocationJump : public CodeLocationCommon {
98
explicit CodeLocationJump(MacroAssemblerCodePtr location)
99
: CodeLocationCommon(location) {}
100
explicit CodeLocationJump(void* location)
101
: CodeLocationCommon(MacroAssemblerCodePtr(location)) {}
104
class CodeLocationCall : public CodeLocationCommon {
106
CodeLocationCall() {}
107
explicit CodeLocationCall(MacroAssemblerCodePtr location)
108
: CodeLocationCommon(location) {}
109
explicit CodeLocationCall(void* location)
110
: CodeLocationCommon(MacroAssemblerCodePtr(location)) {}
113
class CodeLocationNearCall : public CodeLocationCommon {
115
CodeLocationNearCall() {}
116
explicit CodeLocationNearCall(MacroAssemblerCodePtr location)
117
: CodeLocationCommon(location) {}
118
explicit CodeLocationNearCall(void* location)
119
: CodeLocationCommon(MacroAssemblerCodePtr(location)) {}
122
class CodeLocationDataLabel32 : public CodeLocationCommon {
124
CodeLocationDataLabel32() {}
125
explicit CodeLocationDataLabel32(MacroAssemblerCodePtr location)
126
: CodeLocationCommon(location) {}
127
explicit CodeLocationDataLabel32(void* location)
128
: CodeLocationCommon(MacroAssemblerCodePtr(location)) {}
131
class CodeLocationDataLabelPtr : public CodeLocationCommon {
133
CodeLocationDataLabelPtr() {}
134
explicit CodeLocationDataLabelPtr(MacroAssemblerCodePtr location)
135
: CodeLocationCommon(location) {}
136
explicit CodeLocationDataLabelPtr(void* location)
137
: CodeLocationCommon(MacroAssemblerCodePtr(location)) {}
140
inline CodeLocationInstruction CodeLocationCommon::instructionAtOffset(int offset)
142
ASSERT_VALID_CODE_OFFSET(offset);
143
return CodeLocationInstruction(reinterpret_cast<char*>(dataLocation()) + offset);
146
inline CodeLocationLabel CodeLocationCommon::labelAtOffset(int offset)
148
ASSERT_VALID_CODE_OFFSET(offset);
149
return CodeLocationLabel(reinterpret_cast<char*>(dataLocation()) + offset);
152
inline CodeLocationJump CodeLocationCommon::jumpAtOffset(int offset)
154
ASSERT_VALID_CODE_OFFSET(offset);
155
return CodeLocationJump(reinterpret_cast<char*>(dataLocation()) + offset);
158
inline CodeLocationCall CodeLocationCommon::callAtOffset(int offset)
160
ASSERT_VALID_CODE_OFFSET(offset);
161
return CodeLocationCall(reinterpret_cast<char*>(dataLocation()) + offset);
164
inline CodeLocationNearCall CodeLocationCommon::nearCallAtOffset(int offset)
166
ASSERT_VALID_CODE_OFFSET(offset);
167
return CodeLocationNearCall(reinterpret_cast<char*>(dataLocation()) + offset);
170
inline CodeLocationDataLabelPtr CodeLocationCommon::dataLabelPtrAtOffset(int offset)
172
ASSERT_VALID_CODE_OFFSET(offset);
173
return CodeLocationDataLabelPtr(reinterpret_cast<char*>(dataLocation()) + offset);
176
inline CodeLocationDataLabel32 CodeLocationCommon::dataLabel32AtOffset(int offset)
178
ASSERT_VALID_CODE_OFFSET(offset);
179
return CodeLocationDataLabel32(reinterpret_cast<char*>(dataLocation()) + offset);
184
#endif // ENABLE(ASSEMBLER)
186
#endif // CodeLocation_h