| Index: src/x87/assembler-x87.cc
|
| diff --git a/src/x87/assembler-x87.cc b/src/x87/assembler-x87.cc
|
| index 0d0a49435840d99422bf5d1aacd3b4d753a66500..95b65879256890e4399177a1522cba1d10014df8 100644
|
| --- a/src/x87/assembler-x87.cc
|
| +++ b/src/x87/assembler-x87.cc
|
| @@ -102,6 +102,37 @@ bool RelocInfo::IsInConstantPool() {
|
| }
|
|
|
|
|
| +// Patch the code at the current PC with a call to the target address.
|
| +// Additional guard int3 instructions can be added if required.
|
| +void RelocInfo::PatchCodeWithCall(Address target, int guard_bytes) {
|
| + // Call instruction takes up 5 bytes and int3 takes up one byte.
|
| + static const int kCallCodeSize = 5;
|
| + int code_size = kCallCodeSize + guard_bytes;
|
| +
|
| + // Create a code patcher.
|
| + CodePatcher patcher(pc_, code_size);
|
| +
|
| +// Add a label for checking the size of the code used for returning.
|
| +#ifdef DEBUG
|
| + Label check_codesize;
|
| + patcher.masm()->bind(&check_codesize);
|
| +#endif
|
| +
|
| + // Patch the code.
|
| + patcher.masm()->call(target, RelocInfo::NONE32);
|
| +
|
| + // Check that the size of the code generated is as expected.
|
| + DCHECK_EQ(kCallCodeSize,
|
| + patcher.masm()->SizeOfCodeGeneratedSince(&check_codesize));
|
| +
|
| + // Add the requested number of int3 instructions after the call.
|
| + DCHECK_GE(guard_bytes, 0);
|
| + for (int i = 0; i < guard_bytes; i++) {
|
| + patcher.masm()->int3();
|
| + }
|
| +}
|
| +
|
| +
|
| // -----------------------------------------------------------------------------
|
| // Implementation of Operand
|
|
|
|
|