[asm.js] Fix function table call position tracking.

This adds test coverage for the source position tracking of function
table calls in asm.js and fixes the discovered issues. It also fixes
function start positions (used by errors thrown at stack checks).

R=clemensh@chromium.org
TEST=mjsunit/wasm/asm-wasm-stack
BUG=v8:6127,v8:6166

Change-Id: Id6ab6dc72bcedb0d838eed315e2a05fbc59039f4
Reviewed-on: https://chromium-review.googlesource.com/465949
Commit-Queue: Michael Starzinger <mstarzinger@chromium.org>
Reviewed-by: Clemens Hammacher <clemensh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#44348}
This commit is contained in:
Michael Starzinger 2017-04-03 16:46:10 +02:00 committed by Commit Bot
parent 8c2af03791
commit 0cb5ba0ef0
4 changed files with 22 additions and 21 deletions

View File

@ -712,7 +712,6 @@ void AsmJsParser::ValidateFunctionTable() {
// 6.4 ValidateFunction
void AsmJsParser::ValidateFunction() {
int start_position = scanner_.GetPosition();
EXPECT_TOKEN(TOK(function));
if (!scanner_.IsGlobal()) {
FAIL("Expected function name");
@ -741,6 +740,7 @@ void AsmJsParser::ValidateFunction() {
return_type_ = nullptr;
// Record start of the function, used as position for the stack check.
int start_position = static_cast<int>(scanner_.Position());
current_function_builder_->SetAsmFunctionStartPosition(start_position);
std::vector<AsmType*> params;
@ -2037,6 +2037,8 @@ AsmType* AsmJsParser::ValidateCall() {
current_function_builder_->Emit(kExprI32Add);
// We have to use a temporary for the correct order of evaluation.
current_function_builder_->EmitSetLocal(tmp);
// The position of function table calls is after the table lookup.
pos = static_cast<int>(scanner_.Position());
}
std::vector<AsmType*> param_types;
ZoneVector<AsmType*> param_specific_types(zone());
@ -2122,10 +2124,8 @@ AsmType* AsmJsParser::ValidateCall() {
function_info->type = function_type;
if (function_info->kind == VarKind::kTable) {
current_function_builder_->EmitGetLocal(tmp);
// TODO(bradnelson): Figure out the right debug scanner offset and
// re-enable.
// current_function_builder_->AddAsmWasmOffset(scanner_.GetPosition(),
// scanner_.GetPosition());
// TODO(mstarzinger): Fix the {to_number_position} and test it.
current_function_builder_->AddAsmWasmOffset(pos, pos);
current_function_builder_->Emit(kExprCallIndirect);
current_function_builder_->EmitVarUint(signature_index);
current_function_builder_->EmitVarUint(0); // table index
@ -2272,10 +2272,7 @@ AsmType* AsmJsParser::ValidateCall() {
current_function_builder_->EmitVarUint(signature_index);
current_function_builder_->EmitVarUint(0); // table index
} else {
// TODO(bradnelson): Figure out the right debug scanner offset and
// re-enable.
// current_function_builder_->AddAsmWasmOffset(scanner_.GetPosition(),
// scanner_.GetPosition());
current_function_builder_->AddAsmWasmOffset(pos, pos);
current_function_builder_->Emit(kExprCallFunction);
current_function_builder_->EmitDirectCallIndex(function_info->index);
}

View File

@ -8,7 +8,6 @@
['variant != default', {
# Issue 6166.
'debugger/asm-js-breakpoint-during-exec': [PASS, FAIL],
'debugger/asm-js-stack': [PASS, FAIL],
# Issue 6167.
'debugger/eval-scopes': [PASS, FAIL],
'debugger/scope-skip-variables-with-empty-name': [PASS, FAIL],

View File

@ -661,7 +661,9 @@
# need to re-enable these for the "new" validator.
'regress/regress-618608': [SKIP],
'wasm/asm-wasm-exception-in-tonumber': [SKIP],
'wasm/asm-wasm-stack': [SKIP],
# Issue 6127: Currently {StashCode} breaks the source position table.
'wasm/asm-wasm-expr': [SKIP],
}], # variant == asm_wasm
['variant == wasm_traps', {

View File

@ -68,8 +68,10 @@ function generateWasmFromAsmJs(stdlib, foreign) {
case 0: callThrow(); break;
case 1: redirectFun(0); break;
case 2: redirectFun(1); break;
case 3: funTable[i & 0](2); break;
}
}
var funTable = [ redirectFun ];
return redirectFun;
}
@ -88,8 +90,8 @@ function generateWasmFromAsmJs(stdlib, foreign) {
'^ *at throwException \\(' + filename + ':56:9\\)$',
'^ *at callThrow \\(' + filename + ':63:5\\)$',
'^ *at redirectFun \\(' + filename + ':68:15\\)$',
'^ *at PreformattedStackTraceFromJS \\(' + filename + ':81:5\\)$',
'^ *at ' + filename + ':94:3$'
'^ *at PreformattedStackTraceFromJS \\(' + filename + ':83:5\\)$',
'^ *at ' + filename + ':96:3$'
]);
})();
@ -103,7 +105,7 @@ Error.prepareStackTrace = function(error, frames) {
assertTrue(%IsWasmCode(fun));
var e = null;
try {
fun(2);
fun(3);
} catch (ex) {
e = ex;
}
@ -114,8 +116,9 @@ Error.prepareStackTrace = function(error, frames) {
['redirectFun', 68, 15], // --
['redirectFun', 69, 15], // --
['redirectFun', 70, 15], // --
['CallsiteObjectsFromJS', 106, 5], // --
[null, 120, 3]
['redirectFun', 71, 30], // --
['CallsiteObjectsFromJS', 108, 5], // --
[null, 123, 3]
]);
})();
@ -133,15 +136,15 @@ function generateOverflowWasmFromAsmJs() {
assertTrue(%IsWasmCode(fun));
var e = null;
try {
fun(2);
fun(23);
} catch (ex) {
e = ex;
}
assertInstanceof(e, RangeError, 'RangeError should have been thrown');
checkTopFunctionsOnCallsites(e, [
['f', 124, 13], // --
['f', 126, 12], // --
['f', 126, 12], // --
['f', 126, 12] // --
['f', 127, 13], // --
['f', 129, 12], // --
['f', 129, 12], // --
['f', 129, 12] // --
]);
})();