411 lines
14 KiB
Diff
411 lines
14 KiB
Diff
|
From 4f447768a2ff6bf37d462e033c11e20c733129ba Mon Sep 17 00:00:00 2001
|
||
|
From: Jan de Mooij <jdemooij@mozilla.com>
|
||
|
Date: Tue, 16 Dec 2014 22:52:51 +0100
|
||
|
Subject: [PATCH] Bug 1109889 - Share more exception handling code. r=nbp,
|
||
|
a=abillings
|
||
|
|
||
|
---
|
||
|
js/src/jit/Ion.cpp | 11 ++++++++++-
|
||
|
js/src/jit/IonMacroAssembler.cpp | 8 ++++----
|
||
|
js/src/jit/JitCompartment.h | 8 ++++++--
|
||
|
js/src/jit/arm/MacroAssembler-arm.cpp | 11 ++---------
|
||
|
js/src/jit/arm/MacroAssembler-arm.h | 6 ++++--
|
||
|
js/src/jit/arm/Trampoline-arm.cpp | 4 ++--
|
||
|
js/src/jit/mips/MacroAssembler-mips.cpp | 11 ++---------
|
||
|
js/src/jit/mips/MacroAssembler-mips.h | 7 +++++--
|
||
|
js/src/jit/mips/Trampoline-mips.cpp | 4 ++--
|
||
|
js/src/jit/shared/MacroAssembler-x86-shared.h | 3 +++
|
||
|
js/src/jit/x64/MacroAssembler-x64.cpp | 11 ++---------
|
||
|
js/src/jit/x64/MacroAssembler-x64.h | 3 +--
|
||
|
js/src/jit/x64/Trampoline-x64.cpp | 4 ++--
|
||
|
js/src/jit/x86/MacroAssembler-x86.cpp | 11 ++---------
|
||
|
js/src/jit/x86/MacroAssembler-x86.h | 3 +--
|
||
|
js/src/jit/x86/Trampoline-x86.cpp | 4 ++--
|
||
|
16 files changed, 50 insertions(+), 59 deletions(-)
|
||
|
|
||
|
diff --git a/js/src/jit/Ion.cpp b/js/src/jit/Ion.cpp
|
||
|
index 9635742..a77f9b4 100644
|
||
|
--- a/js/src/jit/Ion.cpp
|
||
|
+++ b/js/src/jit/Ion.cpp
|
||
|
@@ -150,6 +150,7 @@ JitRuntime::JitRuntime()
|
||
|
: execAlloc_(nullptr),
|
||
|
ionAlloc_(nullptr),
|
||
|
exceptionTail_(nullptr),
|
||
|
+ exceptionTailParallel_(nullptr),
|
||
|
bailoutTail_(nullptr),
|
||
|
enterJIT_(nullptr),
|
||
|
bailoutHandler_(nullptr),
|
||
|
@@ -198,10 +199,18 @@ JitRuntime::initialize(JSContext *cx)
|
||
|
return false;
|
||
|
|
||
|
IonSpew(IonSpew_Codegen, "# Emitting exception tail stub");
|
||
|
- exceptionTail_ = generateExceptionTailStub(cx);
|
||
|
+
|
||
|
+ void *handler = JS_FUNC_TO_DATA_PTR(void *, jit::HandleException);
|
||
|
+ void *handlerParallel = JS_FUNC_TO_DATA_PTR(void *, jit::HandleParallelFailure);
|
||
|
+
|
||
|
+ exceptionTail_ = generateExceptionTailStub(cx, handler);
|
||
|
if (!exceptionTail_)
|
||
|
return false;
|
||
|
|
||
|
+ exceptionTailParallel_ = generateExceptionTailStub(cx, handlerParallel);
|
||
|
+ if (!exceptionTailParallel_)
|
||
|
+ return false;
|
||
|
+
|
||
|
IonSpew(IonSpew_Codegen, "# Emitting bailout tail stub");
|
||
|
bailoutTail_ = generateBailoutTailStub(cx);
|
||
|
if (!bailoutTail_)
|
||
|
diff --git a/js/src/jit/IonMacroAssembler.cpp b/js/src/jit/IonMacroAssembler.cpp
|
||
|
index 2326fe1..9f7cc8f 100644
|
||
|
--- a/js/src/jit/IonMacroAssembler.cpp
|
||
|
+++ b/js/src/jit/IonMacroAssembler.cpp
|
||
|
@@ -1030,18 +1030,18 @@ MacroAssembler::handleFailure(ExecutionMode executionMode)
|
||
|
sps_->skipNextReenter();
|
||
|
leaveSPSFrame();
|
||
|
|
||
|
- void *handler;
|
||
|
+ JitCode *excTail;
|
||
|
switch (executionMode) {
|
||
|
case SequentialExecution:
|
||
|
- handler = JS_FUNC_TO_DATA_PTR(void *, jit::HandleException);
|
||
|
+ excTail = GetIonContext()->runtime->jitRuntime()->getExceptionTail();
|
||
|
break;
|
||
|
case ParallelExecution:
|
||
|
- handler = JS_FUNC_TO_DATA_PTR(void *, jit::HandleParallelFailure);
|
||
|
+ excTail = GetIonContext()->runtime->jitRuntime()->getExceptionTailParallel();
|
||
|
break;
|
||
|
default:
|
||
|
MOZ_ASSUME_UNREACHABLE("No such execution mode");
|
||
|
}
|
||
|
- MacroAssemblerSpecific::handleFailureWithHandler(handler);
|
||
|
+ jump(excTail);
|
||
|
|
||
|
// Doesn't actually emit code, but balances the leave()
|
||
|
if (sps_)
|
||
|
diff --git a/js/src/jit/JitCompartment.h b/js/src/jit/JitCompartment.h
|
||
|
index 486a29d..475a685 100644
|
||
|
--- a/js/src/jit/JitCompartment.h
|
||
|
+++ b/js/src/jit/JitCompartment.h
|
||
|
@@ -153,8 +153,9 @@ class JitRuntime
|
||
|
// need for explicit interrupt checks.
|
||
|
JSC::ExecutableAllocator *ionAlloc_;
|
||
|
|
||
|
- // Shared post-exception-handler tail
|
||
|
+ // Shared exception-handler tail.
|
||
|
JitCode *exceptionTail_;
|
||
|
+ JitCode *exceptionTailParallel_;
|
||
|
|
||
|
// Shared post-bailout-handler tail.
|
||
|
JitCode *bailoutTail_;
|
||
|
@@ -214,7 +215,7 @@ class JitRuntime
|
||
|
InlineList<PatchableBackedge> backedgeList_;
|
||
|
|
||
|
private:
|
||
|
- JitCode *generateExceptionTailStub(JSContext *cx);
|
||
|
+ JitCode *generateExceptionTailStub(JSContext *cx, void *handler);
|
||
|
JitCode *generateBailoutTailStub(JSContext *cx);
|
||
|
JitCode *generateEnterJIT(JSContext *cx, EnterJitType type);
|
||
|
JitCode *generateArgumentsRectifier(JSContext *cx, ExecutionMode mode, void **returnAddrOut);
|
||
|
@@ -287,6 +288,9 @@ class JitRuntime
|
||
|
JitCode *getExceptionTail() const {
|
||
|
return exceptionTail_;
|
||
|
}
|
||
|
+ JitCode *getExceptionTailParallel() const {
|
||
|
+ return exceptionTailParallel_;
|
||
|
+ }
|
||
|
|
||
|
JitCode *getBailoutTail() const {
|
||
|
return bailoutTail_;
|
||
|
diff --git a/js/src/jit/arm/MacroAssembler-arm.cpp b/js/src/jit/arm/MacroAssembler-arm.cpp
|
||
|
index b34483c..63b3ff2 100644
|
||
|
--- a/js/src/jit/arm/MacroAssembler-arm.cpp
|
||
|
+++ b/js/src/jit/arm/MacroAssembler-arm.cpp
|
||
|
@@ -3984,25 +3984,18 @@ MacroAssemblerARMCompat::callWithABI(const Address &fun, MoveOp::Type result)
|
||
|
}
|
||
|
|
||
|
void
|
||
|
-MacroAssemblerARMCompat::handleFailureWithHandler(void *handler)
|
||
|
+MacroAssemblerARMCompat::handleFailureWithHandlerTail(void *handler)
|
||
|
{
|
||
|
// Reserve space for exception information.
|
||
|
int size = (sizeof(ResumeFromException) + 7) & ~7;
|
||
|
ma_sub(Imm32(size), sp);
|
||
|
ma_mov(sp, r0);
|
||
|
|
||
|
- // Ask for an exception handler.
|
||
|
+ // Call the handler.
|
||
|
setupUnalignedABICall(1, r1);
|
||
|
passABIArg(r0);
|
||
|
callWithABI(handler);
|
||
|
|
||
|
- JitCode *excTail = GetIonContext()->runtime->jitRuntime()->getExceptionTail();
|
||
|
- branch(excTail);
|
||
|
-}
|
||
|
-
|
||
|
-void
|
||
|
-MacroAssemblerARMCompat::handleFailureWithHandlerTail()
|
||
|
-{
|
||
|
Label entryFrame;
|
||
|
Label catch_;
|
||
|
Label finally;
|
||
|
diff --git a/js/src/jit/arm/MacroAssembler-arm.h b/js/src/jit/arm/MacroAssembler-arm.h
|
||
|
index 00e8a03..6ccc0be 100644
|
||
|
--- a/js/src/jit/arm/MacroAssembler-arm.h
|
||
|
+++ b/js/src/jit/arm/MacroAssembler-arm.h
|
||
|
@@ -711,6 +711,9 @@ class MacroAssemblerARMCompat : public MacroAssemblerARM
|
||
|
void jump(Label *label) {
|
||
|
as_b(label);
|
||
|
}
|
||
|
+ void jump(JitCode *code) {
|
||
|
+ branch(code);
|
||
|
+ }
|
||
|
void jump(Register reg) {
|
||
|
ma_bx(reg);
|
||
|
}
|
||
|
@@ -1202,8 +1205,7 @@ class MacroAssemblerARMCompat : public MacroAssemblerARM
|
||
|
|
||
|
void linkExitFrame();
|
||
|
void linkParallelExitFrame(const Register &pt);
|
||
|
- void handleFailureWithHandler(void *handler);
|
||
|
- void handleFailureWithHandlerTail();
|
||
|
+ void handleFailureWithHandlerTail(void *handler);
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////
|
||
|
// Common interface.
|
||
|
diff --git a/js/src/jit/arm/Trampoline-arm.cpp b/js/src/jit/arm/Trampoline-arm.cpp
|
||
|
index e539c00..693dad8 100644
|
||
|
--- a/js/src/jit/arm/Trampoline-arm.cpp
|
||
|
+++ b/js/src/jit/arm/Trampoline-arm.cpp
|
||
|
@@ -928,11 +928,11 @@ JitRuntime::generateDebugTrapHandler(JSContext *cx)
|
||
|
}
|
||
|
|
||
|
JitCode *
|
||
|
-JitRuntime::generateExceptionTailStub(JSContext *cx)
|
||
|
+JitRuntime::generateExceptionTailStub(JSContext *cx, void *handler)
|
||
|
{
|
||
|
MacroAssembler masm;
|
||
|
|
||
|
- masm.handleFailureWithHandlerTail();
|
||
|
+ masm.handleFailureWithHandlerTail(handler);
|
||
|
|
||
|
Linker linker(masm);
|
||
|
AutoFlushICache afc("ExceptionTailStub");
|
||
|
diff --git a/js/src/jit/mips/MacroAssembler-mips.cpp b/js/src/jit/mips/MacroAssembler-mips.cpp
|
||
|
index cee93a5..256434d 100644
|
||
|
--- a/js/src/jit/mips/MacroAssembler-mips.cpp
|
||
|
+++ b/js/src/jit/mips/MacroAssembler-mips.cpp
|
||
|
@@ -3139,25 +3139,18 @@ MacroAssemblerMIPSCompat::callWithABI(const Address &fun, MoveOp::Type result)
|
||
|
}
|
||
|
|
||
|
void
|
||
|
-MacroAssemblerMIPSCompat::handleFailureWithHandler(void *handler)
|
||
|
+MacroAssemblerMIPSCompat::handleFailureWithHandlerTail(void *handler)
|
||
|
{
|
||
|
// Reserve space for exception information.
|
||
|
int size = (sizeof(ResumeFromException) + StackAlignment) & ~(StackAlignment - 1);
|
||
|
ma_subu(StackPointer, StackPointer, Imm32(size));
|
||
|
ma_move(a0, StackPointer); // Use a0 since it is a first function argument
|
||
|
|
||
|
- // Ask for an exception handler.
|
||
|
+ // Call the handler.
|
||
|
setupUnalignedABICall(1, a1);
|
||
|
passABIArg(a0);
|
||
|
callWithABI(handler);
|
||
|
|
||
|
- JitCode *excTail = GetIonContext()->runtime->jitRuntime()->getExceptionTail();
|
||
|
- branch(excTail);
|
||
|
-}
|
||
|
-
|
||
|
-void
|
||
|
-MacroAssemblerMIPSCompat::handleFailureWithHandlerTail()
|
||
|
-{
|
||
|
Label entryFrame;
|
||
|
Label catch_;
|
||
|
Label finally;
|
||
|
diff --git a/js/src/jit/mips/MacroAssembler-mips.h b/js/src/jit/mips/MacroAssembler-mips.h
|
||
|
index ed1f566..899a50e 100644
|
||
|
--- a/js/src/jit/mips/MacroAssembler-mips.h
|
||
|
+++ b/js/src/jit/mips/MacroAssembler-mips.h
|
||
|
@@ -481,6 +481,10 @@ class MacroAssemblerMIPSCompat : public MacroAssemblerMIPS
|
||
|
as_nop();
|
||
|
}
|
||
|
|
||
|
+ void jump(JitCode *code) {
|
||
|
+ branch(code);
|
||
|
+ }
|
||
|
+
|
||
|
void neg32(Register reg) {
|
||
|
ma_negu(reg, reg);
|
||
|
}
|
||
|
@@ -842,8 +846,7 @@ public:
|
||
|
|
||
|
void linkExitFrame();
|
||
|
void linkParallelExitFrame(const Register &pt);
|
||
|
- void handleFailureWithHandler(void *handler);
|
||
|
- void handleFailureWithHandlerTail();
|
||
|
+ void handleFailureWithHandlerTail(void *handler);
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////
|
||
|
// Common interface.
|
||
|
diff --git a/js/src/jit/mips/Trampoline-mips.cpp b/js/src/jit/mips/Trampoline-mips.cpp
|
||
|
index b456845..64c2385 100644
|
||
|
--- a/js/src/jit/mips/Trampoline-mips.cpp
|
||
|
+++ b/js/src/jit/mips/Trampoline-mips.cpp
|
||
|
@@ -960,11 +960,11 @@ JitRuntime::generateDebugTrapHandler(JSContext *cx)
|
||
|
|
||
|
|
||
|
JitCode *
|
||
|
-JitRuntime::generateExceptionTailStub(JSContext *cx)
|
||
|
+JitRuntime::generateExceptionTailStub(JSContext *cx, void *handler)
|
||
|
{
|
||
|
MacroAssembler masm;
|
||
|
|
||
|
- masm.handleFailureWithHandlerTail();
|
||
|
+ masm.handleFailureWithHandlerTail(handler);
|
||
|
|
||
|
Linker linker(masm);
|
||
|
AutoFlushICache afc("ExceptionTailStub");
|
||
|
diff --git a/js/src/jit/shared/MacroAssembler-x86-shared.h b/js/src/jit/shared/MacroAssembler-x86-shared.h
|
||
|
index 01d1a4b..779cf83 100644
|
||
|
--- a/js/src/jit/shared/MacroAssembler-x86-shared.h
|
||
|
+++ b/js/src/jit/shared/MacroAssembler-x86-shared.h
|
||
|
@@ -287,6 +287,9 @@ class MacroAssemblerX86Shared : public Assembler
|
||
|
void jump(Label *label) {
|
||
|
jmp(label);
|
||
|
}
|
||
|
+ void jump(JitCode *code) {
|
||
|
+ jmp(code);
|
||
|
+ }
|
||
|
void jump(RepatchLabel *label) {
|
||
|
jmp(label);
|
||
|
}
|
||
|
diff --git a/js/src/jit/x64/MacroAssembler-x64.cpp b/js/src/jit/x64/MacroAssembler-x64.cpp
|
||
|
index 9a9f995..0db799c 100644
|
||
|
--- a/js/src/jit/x64/MacroAssembler-x64.cpp
|
||
|
+++ b/js/src/jit/x64/MacroAssembler-x64.cpp
|
||
|
@@ -287,24 +287,17 @@ MacroAssemblerX64::callWithABI(Address fun, MoveOp::Type result)
|
||
|
}
|
||
|
|
||
|
void
|
||
|
-MacroAssemblerX64::handleFailureWithHandler(void *handler)
|
||
|
+MacroAssemblerX64::handleFailureWithHandlerTail(void *handler)
|
||
|
{
|
||
|
// Reserve space for exception information.
|
||
|
subq(Imm32(sizeof(ResumeFromException)), rsp);
|
||
|
movq(rsp, rax);
|
||
|
|
||
|
- // Ask for an exception handler.
|
||
|
+ // Call the handler.
|
||
|
setupUnalignedABICall(1, rcx);
|
||
|
passABIArg(rax);
|
||
|
callWithABI(handler);
|
||
|
|
||
|
- JitCode *excTail = GetIonContext()->runtime->jitRuntime()->getExceptionTail();
|
||
|
- jmp(excTail);
|
||
|
-}
|
||
|
-
|
||
|
-void
|
||
|
-MacroAssemblerX64::handleFailureWithHandlerTail()
|
||
|
-{
|
||
|
Label entryFrame;
|
||
|
Label catch_;
|
||
|
Label finally;
|
||
|
diff --git a/js/src/jit/x64/MacroAssembler-x64.h b/js/src/jit/x64/MacroAssembler-x64.h
|
||
|
index 2c11e9a..5010549 100644
|
||
|
--- a/js/src/jit/x64/MacroAssembler-x64.h
|
||
|
+++ b/js/src/jit/x64/MacroAssembler-x64.h
|
||
|
@@ -1288,8 +1288,7 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared
|
||
|
void callWithABI(AsmJSImmPtr imm, MoveOp::Type result = MoveOp::GENERAL);
|
||
|
void callWithABI(Address fun, MoveOp::Type result = MoveOp::GENERAL);
|
||
|
|
||
|
- void handleFailureWithHandler(void *handler);
|
||
|
- void handleFailureWithHandlerTail();
|
||
|
+ void handleFailureWithHandlerTail(void *handler);
|
||
|
|
||
|
void makeFrameDescriptor(Register frameSizeReg, FrameType type) {
|
||
|
shlq(Imm32(FRAMESIZE_SHIFT), frameSizeReg);
|
||
|
diff --git a/js/src/jit/x64/Trampoline-x64.cpp b/js/src/jit/x64/Trampoline-x64.cpp
|
||
|
index 72f4592..3b83850 100644
|
||
|
--- a/js/src/jit/x64/Trampoline-x64.cpp
|
||
|
+++ b/js/src/jit/x64/Trampoline-x64.cpp
|
||
|
@@ -785,11 +785,11 @@ JitRuntime::generateDebugTrapHandler(JSContext *cx)
|
||
|
}
|
||
|
|
||
|
JitCode *
|
||
|
-JitRuntime::generateExceptionTailStub(JSContext *cx)
|
||
|
+JitRuntime::generateExceptionTailStub(JSContext *cx, void *handler)
|
||
|
{
|
||
|
MacroAssembler masm;
|
||
|
|
||
|
- masm.handleFailureWithHandlerTail();
|
||
|
+ masm.handleFailureWithHandlerTail(handler);
|
||
|
|
||
|
Linker linker(masm);
|
||
|
JitCode *code = linker.newCode<NoGC>(cx, JSC::OTHER_CODE);
|
||
|
diff --git a/js/src/jit/x86/MacroAssembler-x86.cpp b/js/src/jit/x86/MacroAssembler-x86.cpp
|
||
|
index d36f4d3..57a0f85 100644
|
||
|
--- a/js/src/jit/x86/MacroAssembler-x86.cpp
|
||
|
+++ b/js/src/jit/x86/MacroAssembler-x86.cpp
|
||
|
@@ -281,24 +281,17 @@ MacroAssemblerX86::callWithABI(const Address &fun, MoveOp::Type result)
|
||
|
}
|
||
|
|
||
|
void
|
||
|
-MacroAssemblerX86::handleFailureWithHandler(void *handler)
|
||
|
+MacroAssemblerX86::handleFailureWithHandlerTail(void *handler)
|
||
|
{
|
||
|
// Reserve space for exception information.
|
||
|
subl(Imm32(sizeof(ResumeFromException)), esp);
|
||
|
movl(esp, eax);
|
||
|
|
||
|
- // Ask for an exception handler.
|
||
|
+ // Call the handler.
|
||
|
setupUnalignedABICall(1, ecx);
|
||
|
passABIArg(eax);
|
||
|
callWithABI(handler);
|
||
|
|
||
|
- JitCode *excTail = GetIonContext()->runtime->jitRuntime()->getExceptionTail();
|
||
|
- jmp(excTail);
|
||
|
-}
|
||
|
-
|
||
|
-void
|
||
|
-MacroAssemblerX86::handleFailureWithHandlerTail()
|
||
|
-{
|
||
|
Label entryFrame;
|
||
|
Label catch_;
|
||
|
Label finally;
|
||
|
diff --git a/js/src/jit/x86/MacroAssembler-x86.h b/js/src/jit/x86/MacroAssembler-x86.h
|
||
|
index 17de7a7..7e578c8 100644
|
||
|
--- a/js/src/jit/x86/MacroAssembler-x86.h
|
||
|
+++ b/js/src/jit/x86/MacroAssembler-x86.h
|
||
|
@@ -1086,8 +1086,7 @@ class MacroAssemblerX86 : public MacroAssemblerX86Shared
|
||
|
void callWithABI(const Address &fun, MoveOp::Type result = MoveOp::GENERAL);
|
||
|
|
||
|
// Used from within an Exit frame to handle a pending exception.
|
||
|
- void handleFailureWithHandler(void *handler);
|
||
|
- void handleFailureWithHandlerTail();
|
||
|
+ void handleFailureWithHandlerTail(void *handler);
|
||
|
|
||
|
void makeFrameDescriptor(Register frameSizeReg, FrameType type) {
|
||
|
shll(Imm32(FRAMESIZE_SHIFT), frameSizeReg);
|
||
|
diff --git a/js/src/jit/x86/Trampoline-x86.cpp b/js/src/jit/x86/Trampoline-x86.cpp
|
||
|
index 0a2f0de..9fd2c00 100644
|
||
|
--- a/js/src/jit/x86/Trampoline-x86.cpp
|
||
|
+++ b/js/src/jit/x86/Trampoline-x86.cpp
|
||
|
@@ -827,11 +827,11 @@ JitRuntime::generateDebugTrapHandler(JSContext *cx)
|
||
|
}
|
||
|
|
||
|
JitCode *
|
||
|
-JitRuntime::generateExceptionTailStub(JSContext *cx)
|
||
|
+JitRuntime::generateExceptionTailStub(JSContext *cx, void *handler)
|
||
|
{
|
||
|
MacroAssembler masm;
|
||
|
|
||
|
- masm.handleFailureWithHandlerTail();
|
||
|
+ masm.handleFailureWithHandlerTail(handler);
|
||
|
|
||
|
Linker linker(masm);
|
||
|
JitCode *code = linker.newCode<NoGC>(cx, JSC::OTHER_CODE);
|
||
|
--
|
||
|
2.1.2
|
||
|
|