Merge "Save and re-bind previously bounded texture when using cairo_gl_surface_set_bi...
[framework/web/webkit-efl.git] / Source / JavaScriptCore / assembler / RepatchBuffer.h
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 RepatchBuffer_h
27 #define RepatchBuffer_h
28
29 #if ENABLE(JIT)
30
31 #include "CodeBlock.h"
32 #include <MacroAssembler.h>
33 #include <wtf/Noncopyable.h>
34
35 namespace JSC {
36
37 // RepatchBuffer:
38 //
39 // This class is used to modify code after code generation has been completed,
40 // and after the code has potentially already been executed.  This mechanism is
41 // used to apply optimizations to the code.
42 //
43 class RepatchBuffer {
44     typedef MacroAssemblerCodePtr CodePtr;
45
46 public:
47     RepatchBuffer(CodeBlock* codeBlock)
48     {
49         JITCode& code = codeBlock->getJITCode();
50         m_start = code.start();
51         m_size = code.size();
52
53         ExecutableAllocator::makeWritable(m_start, m_size);
54     }
55
56     ~RepatchBuffer()
57     {
58         ExecutableAllocator::makeExecutable(m_start, m_size);
59     }
60
61     void relink(CodeLocationJump jump, CodeLocationLabel destination)
62     {
63         MacroAssembler::repatchJump(jump, destination);
64     }
65
66     void relink(CodeLocationCall call, CodeLocationLabel destination)
67     {
68         MacroAssembler::repatchCall(call, destination);
69     }
70
71     void relink(CodeLocationCall call, FunctionPtr destination)
72     {
73         MacroAssembler::repatchCall(call, destination);
74     }
75
76     void relink(CodeLocationNearCall nearCall, CodePtr destination)
77     {
78         MacroAssembler::repatchNearCall(nearCall, CodeLocationLabel(destination));
79     }
80
81     void relink(CodeLocationNearCall nearCall, CodeLocationLabel destination)
82     {
83         MacroAssembler::repatchNearCall(nearCall, destination);
84     }
85
86     void repatch(CodeLocationDataLabel32 dataLabel32, int32_t value)
87     {
88         MacroAssembler::repatchInt32(dataLabel32, value);
89     }
90
91     void repatch(CodeLocationDataLabelCompact dataLabelCompact, int32_t value)
92     {
93         MacroAssembler::repatchCompact(dataLabelCompact, value);
94     }
95
96     void repatch(CodeLocationDataLabelPtr dataLabelPtr, void* value)
97     {
98         MacroAssembler::repatchPointer(dataLabelPtr, value);
99     }
100
101     void relinkCallerToTrampoline(ReturnAddressPtr returnAddress, CodeLocationLabel label)
102     {
103         relink(CodeLocationCall(CodePtr(returnAddress)), label);
104     }
105     
106     void relinkCallerToTrampoline(ReturnAddressPtr returnAddress, CodePtr newCalleeFunction)
107     {
108         relinkCallerToTrampoline(returnAddress, CodeLocationLabel(newCalleeFunction));
109     }
110
111     void relinkCallerToFunction(ReturnAddressPtr returnAddress, FunctionPtr function)
112     {
113         relink(CodeLocationCall(CodePtr(returnAddress)), function);
114     }
115     
116     void relinkNearCallerToTrampoline(ReturnAddressPtr returnAddress, CodeLocationLabel label)
117     {
118         relink(CodeLocationNearCall(CodePtr(returnAddress)), label);
119     }
120     
121     void relinkNearCallerToTrampoline(ReturnAddressPtr returnAddress, CodePtr newCalleeFunction)
122     {
123         relinkNearCallerToTrampoline(returnAddress, CodeLocationLabel(newCalleeFunction));
124     }
125     
126     void replaceWithLoad(CodeLocationConvertibleLoad label)
127     {
128         MacroAssembler::replaceWithLoad(label);
129     }
130     
131     void replaceWithAddressComputation(CodeLocationConvertibleLoad label)
132     {
133         MacroAssembler::replaceWithAddressComputation(label);
134     }
135     
136     void setLoadInstructionIsActive(CodeLocationConvertibleLoad label, bool isActive)
137     {
138         if (isActive)
139             replaceWithLoad(label);
140         else
141             replaceWithAddressComputation(label);
142     }
143
144 private:
145     void* m_start;
146     size_t m_size;
147 };
148
149 } // namespace JSC
150
151 #endif // ENABLE(ASSEMBLER)
152
153 #endif // RepatchBuffer_h