PPC/s390: [wasm] Do not use setjmp/longjmp in cctests.

Port 79570f87a1

Original Commit Message:

    The use of setjmp/longjmp makes the cctests in test-run-wasm and
    test-run-wasm-64 flaky on Windows, and I think that it is better not
    to use it. With this CL I replace it as follows:

    Similar to the setjmp/longjmp implementation we still call a C
    function when a trap happens. However, instead of calling longjmp in
    this C function we just set a flag which indicates that a trap
    happened and then return. After we return from the C function we leave
    the frame of the current wasm function and return with a RET
    instruction. At the end of a test the wasm test runner checks the flag
    to see if a trap happened.

    Please take a special look at the LeaveFrame function on arm64.

R=ahaas@chromium.org, joransiu@ca.ibm.com, jyan@ca.ibm.com, michael_dawson@ca.ibm.com
BUG=
LOG=N

Review-Url: https://codereview.chromium.org/2685303003
Cr-Commit-Position: refs/heads/master@{#43110}
This commit is contained in:
bjaideep 2017-02-10 07:36:45 -08:00 committed by Commit bot
parent 218e3ed09f
commit 13042c9a19
2 changed files with 18 additions and 14 deletions

View File

@ -2038,9 +2038,6 @@ void CodeGenerator::AssembleArchTrap(Instruction* instr,
if (frame_elided_) {
__ set_has_frame(old_has_frame);
}
if (FLAG_debug_code) {
__ stop(GetBailoutReason(kUnexpectedReturnFromWasmTrap));
}
}
private:
@ -2054,15 +2051,20 @@ void CodeGenerator::AssembleArchTrap(Instruction* instr,
__ CallCFunction(
ExternalReference::wasm_call_trap_callback_for_testing(isolate()),
0);
__ LeaveFrame(StackFrame::WASM_COMPILED);
__ Ret();
} else {
__ Move(cp, Smi::kZero);
gen_->AssembleSourcePosition(instr_);
__ CallRuntime(trap_id);
ReferenceMap* reference_map =
new (gen_->zone()) ReferenceMap(gen_->zone());
gen_->RecordSafepoint(reference_map, Safepoint::kSimple, 0,
Safepoint::kNoLazyDeopt);
if (FLAG_debug_code) {
__ stop(GetBailoutReason(kUnexpectedReturnFromWasmTrap));
}
}
ReferenceMap* reference_map =
new (gen_->zone()) ReferenceMap(gen_->zone());
gen_->RecordSafepoint(reference_map, Safepoint::kSimple, 0,
Safepoint::kNoLazyDeopt);
}
bool frame_elided_;

View File

@ -2281,9 +2281,6 @@ void CodeGenerator::AssembleArchTrap(Instruction* instr,
if (frame_elided_) {
__ set_has_frame(old_has_frame);
}
if (FLAG_debug_code) {
__ stop(GetBailoutReason(kUnexpectedReturnFromWasmTrap));
}
}
private:
@ -2297,15 +2294,20 @@ void CodeGenerator::AssembleArchTrap(Instruction* instr,
__ CallCFunction(
ExternalReference::wasm_call_trap_callback_for_testing(isolate()),
0);
__ LeaveFrame(StackFrame::WASM_COMPILED);
__ Ret();
} else {
__ Move(cp, Smi::kZero);
gen_->AssembleSourcePosition(instr_);
__ CallRuntime(trap_id);
ReferenceMap* reference_map =
new (gen_->zone()) ReferenceMap(gen_->zone());
gen_->RecordSafepoint(reference_map, Safepoint::kSimple, 0,
Safepoint::kNoLazyDeopt);
if (FLAG_debug_code) {
__ stop(GetBailoutReason(kUnexpectedReturnFromWasmTrap));
}
}
ReferenceMap* reference_map =
new (gen_->zone()) ReferenceMap(gen_->zone());
gen_->RecordSafepoint(reference_map, Safepoint::kSimple, 0,
Safepoint::kNoLazyDeopt);
}
bool frame_elided_;