#ifndef RepatchBuffer_h
#define RepatchBuffer_h
-#if ENABLE(ASSEMBLER)
+#if ENABLE(JIT)
+#include "CodeBlock.h"
#include <MacroAssembler.h>
#include <wtf/Noncopyable.h>
public:
RepatchBuffer(CodeBlock* codeBlock)
+ : m_codeBlock(codeBlock)
{
- JITCode& code = codeBlock->getJITCode();
- m_start = code.start();
- m_size = code.size();
+#if ENABLE(ASSEMBLER_WX_EXCLUSIVE)
+ RefPtr<JITCode> code = codeBlock->jitCode();
+ m_start = code->start();
+ m_size = code->size();
ExecutableAllocator::makeWritable(m_start, m_size);
+#endif
}
~RepatchBuffer()
{
+#if ENABLE(ASSEMBLER_WX_EXCLUSIVE)
ExecutableAllocator::makeExecutable(m_start, m_size);
+#endif
}
+
+ CodeBlock* codeBlock() const { return m_codeBlock; }
void relink(CodeLocationJump jump, CodeLocationLabel destination)
{
MacroAssembler::repatchInt32(dataLabel32, value);
}
- void repatch(CodeLocationDataLabelPtr dataLabelPtr, void* value)
+ void repatch(CodeLocationDataLabelCompact dataLabelCompact, int32_t value)
{
- MacroAssembler::repatchPointer(dataLabelPtr, value);
+ MacroAssembler::repatchCompact(dataLabelCompact, value);
}
- void repatchLoadPtrToLEA(CodeLocationInstruction instruction)
+ void repatch(CodeLocationDataLabelPtr dataLabelPtr, void* value)
{
- MacroAssembler::repatchLoadPtrToLEA(instruction);
+ MacroAssembler::repatchPointer(dataLabelPtr, value);
}
void relinkCallerToTrampoline(ReturnAddressPtr returnAddress, CodeLocationLabel label)
{
relinkNearCallerToTrampoline(returnAddress, CodeLocationLabel(newCalleeFunction));
}
+
+ void replaceWithLoad(CodeLocationConvertibleLoad label)
+ {
+ MacroAssembler::replaceWithLoad(label);
+ }
+
+ void replaceWithAddressComputation(CodeLocationConvertibleLoad label)
+ {
+ MacroAssembler::replaceWithAddressComputation(label);
+ }
+
+ void setLoadInstructionIsActive(CodeLocationConvertibleLoad label, bool isActive)
+ {
+ if (isActive)
+ replaceWithLoad(label);
+ else
+ replaceWithAddressComputation(label);
+ }
+
+ static CodeLocationLabel startOfBranchPtrWithPatchOnRegister(CodeLocationDataLabelPtr label)
+ {
+ return MacroAssembler::startOfBranchPtrWithPatchOnRegister(label);
+ }
+
+ static CodeLocationLabel startOfPatchableBranchPtrWithPatchOnAddress(CodeLocationDataLabelPtr label)
+ {
+ return MacroAssembler::startOfPatchableBranchPtrWithPatchOnAddress(label);
+ }
+
+ static CodeLocationLabel startOfPatchableBranch32WithPatchOnAddress(CodeLocationDataLabel32 label)
+ {
+ return MacroAssembler::startOfPatchableBranch32WithPatchOnAddress(label);
+ }
+
+ void replaceWithJump(CodeLocationLabel instructionStart, CodeLocationLabel destination)
+ {
+ MacroAssembler::replaceWithJump(instructionStart, destination);
+ }
+
+ // This is a *bit* of a silly API, since we currently always also repatch the
+ // immediate after calling this. But I'm fine with that, since this just feels
+ // less yucky.
+ void revertJumpReplacementToBranchPtrWithPatch(CodeLocationLabel instructionStart, MacroAssembler::RegisterID reg, void* value)
+ {
+ MacroAssembler::revertJumpReplacementToBranchPtrWithPatch(instructionStart, reg, value);
+ }
+
+ void revertJumpReplacementToPatchableBranchPtrWithPatch(CodeLocationLabel instructionStart, MacroAssembler::Address address, void* value)
+ {
+ MacroAssembler::revertJumpReplacementToPatchableBranchPtrWithPatch(instructionStart, address, value);
+ }
+
+ void revertJumpReplacementToPatchableBranch32WithPatch(CodeLocationLabel instructionStart, MacroAssembler::Address address, int32_t value)
+ {
+ MacroAssembler::revertJumpReplacementToPatchableBranch32WithPatch(instructionStart, address, value);
+ }
private:
+ CodeBlock* m_codeBlock;
+#if ENABLE(ASSEMBLER_WX_EXCLUSIVE)
void* m_start;
size_t m_size;
+#endif
};
} // namespace JSC