Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(719)

Unified Diff: src/compiler/wasm-compiler.cc

Issue 2708743003: [wasm] Remove remaining occurences of the context in wasm code (Closed)
Patch Set: Remove unused variables Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/runtime/runtime-wasm.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/wasm-compiler.cc
diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc
index 5e6a900ee093cb05236994d19c29bb556890f777..c2c61a0df142e2209b2dde8ae48e7777abd951ff 100644
--- a/src/compiler/wasm-compiler.cc
+++ b/src/compiler/wasm-compiler.cc
@@ -67,10 +67,12 @@ void MergeControlToEnd(JSGraph* jsgraph, Node* node) {
}
}
-Node* BuildCallToRuntime(Runtime::FunctionId f, JSGraph* jsgraph,
- Handle<Context> context, Node** parameters,
- int parameter_count, Node** effect_ptr,
- Node* control) {
+// Do only call this function for code which is not reused across
titzer 2017/02/24 09:06:06 s/Do only/Only/
Clemens Hammacher 2017/02/24 10:00:40 Done.
+// instantiations, as we do not patch the embedded context.
+Node* BuildCallToRuntimeWithContext(Runtime::FunctionId f, JSGraph* jsgraph,
+ Node* context, Node** parameters,
+ int parameter_count, Node** effect_ptr,
+ Node* control) {
const Runtime::Function* fun = Runtime::FunctionForId(f);
CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor(
jsgraph->zone(), f, fun->nargs, Operator::kNoProperties,
@@ -78,7 +80,7 @@ Node* BuildCallToRuntime(Runtime::FunctionId f, JSGraph* jsgraph,
// CEntryStubConstant nodes have to be created and cached in the main
// thread. At the moment this is only done for CEntryStubConstant(1).
DCHECK_EQ(1, fun->result_size);
- // At the moment we only allow 2 parameters. If more parameters are needed,
+ // At the moment we only allow 3 parameters. If more parameters are needed,
// increase this constant accordingly.
static const int kMaxParams = 3;
DCHECK_GE(kMaxParams, parameter_count);
@@ -91,9 +93,7 @@ Node* BuildCallToRuntime(Runtime::FunctionId f, JSGraph* jsgraph,
inputs[count++] = jsgraph->ExternalConstant(
ExternalReference(f, jsgraph->isolate())); // ref
inputs[count++] = jsgraph->Int32Constant(fun->nargs); // arity
- inputs[count++] = context.is_null()
- ? jsgraph->SmiConstant(0)
- : jsgraph->HeapConstant(context); // context
+ inputs[count++] = context; // context
inputs[count++] = *effect_ptr;
inputs[count++] = control;
@@ -103,6 +103,14 @@ Node* BuildCallToRuntime(Runtime::FunctionId f, JSGraph* jsgraph,
return node;
}
+Node* BuildCallToRuntime(Runtime::FunctionId f, JSGraph* jsgraph,
+ Node** parameters, int parameter_count,
+ Node** effect_ptr, Node* control) {
+ return BuildCallToRuntimeWithContext(f, jsgraph, jsgraph->NoContextConstant(),
+ parameters, parameter_count, effect_ptr,
+ control);
+}
+
} // namespace
// TODO(eholk): Support trap handlers on other platforms.
@@ -329,8 +337,7 @@ class WasmTrapHelper : public ZoneObject {
if (module && !module->instance->context.is_null()) {
Node* parameters[] = {trap_reason_smi, // message id
trap_position_smi}; // byte position
- BuildCallToRuntime(Runtime::kThrowWasmError, jsgraph(),
- Handle<Context>::null(), parameters,
+ BuildCallToRuntime(Runtime::kThrowWasmError, jsgraph(), parameters,
arraysize(parameters), effect_ptr, *control_ptr);
}
if (false) {
@@ -501,7 +508,7 @@ void WasmGraphBuilder::StackCheck(wasm::WasmCodePosition position,
CallDescriptor::kNoFlags, Operator::kNoProperties);
Node* stub_code = jsgraph()->HeapConstant(code);
- Node* context = jsgraph()->SmiConstant(0);
+ Node* context = jsgraph()->NoContextConstant();
Node* call = graph()->NewNode(jsgraph()->common()->Call(desc), stub_code,
context, *effect, stack_check.if_false);
@@ -1792,30 +1799,18 @@ Node* WasmGraphBuilder::GrowMemory(Node* input) {
check_input_range.Chain(*control_);
- Runtime::FunctionId function_id = Runtime::kWasmGrowMemory;
- const Runtime::Function* function = Runtime::FunctionForId(function_id);
- CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor(
- jsgraph()->zone(), function_id, function->nargs, Operator::kNoThrow,
- CallDescriptor::kNoFlags);
- wasm::ModuleEnv* module = module_;
- input = BuildChangeUint32ToSmi(input);
- Node* inputs[] = {
- jsgraph()->CEntryStubConstant(function->result_size), input, // C entry
- jsgraph()->ExternalConstant(
- ExternalReference(function_id, jsgraph()->isolate())), // ref
- jsgraph()->Int32Constant(function->nargs), // arity
- jsgraph()->HeapConstant(module->instance->context), // context
- *effect_,
- check_input_range.if_true};
- Node* call = graph()->NewNode(jsgraph()->common()->Call(desc),
- static_cast<int>(arraysize(inputs)), inputs);
+ Node* parameters[] = {BuildChangeUint32ToSmi(input)};
+ Node* old_effect = *effect_;
+ Node* call = BuildCallToRuntime(Runtime::kWasmGrowMemory, jsgraph(),
+ parameters, arraysize(parameters), effect_,
+ check_input_range.if_true);
Node* result = BuildChangeSmiToInt32(call);
result = check_input_range.Phi(MachineRepresentation::kWord32, result,
jsgraph()->Int32Constant(-1));
- *effect_ = graph()->NewNode(jsgraph()->common()->EffectPhi(2), call, *effect_,
- check_input_range.merge);
+ *effect_ = graph()->NewNode(jsgraph()->common()->EffectPhi(2), call,
+ old_effect, check_input_range.merge);
*control_ = check_input_range.merge;
return result;
}
@@ -1838,8 +1833,7 @@ Node* WasmGraphBuilder::Throw(Node* input) {
graph()->NewNode(machine->Word32And(), input, Int32Constant(0xFFFFu)));
Node* parameters[] = {lower, upper}; // thrown value
- return BuildCallToRuntime(Runtime::kWasmThrow, jsgraph(),
- module_->instance->context, parameters,
+ return BuildCallToRuntime(Runtime::kWasmThrow, jsgraph(), parameters,
arraysize(parameters), effect_, *control_);
}
@@ -1849,8 +1843,7 @@ Node* WasmGraphBuilder::Catch(Node* input, wasm::WasmCodePosition position) {
Node* parameters[] = {input}; // caught value
Node* value =
BuildCallToRuntime(Runtime::kWasmGetCaughtExceptionValue, jsgraph(),
- module_->instance->context, parameters,
- arraysize(parameters), effect_, *control_);
+ parameters, arraysize(parameters), effect_, *control_);
Node* is_smi;
Node* is_heap;
@@ -2771,12 +2764,18 @@ void WasmGraphBuilder::BuildJSToWasmWrapper(Handle<Code> wasm_code,
*control_ = start;
*effect_ = start;
+ // Create the context parameter
+ Node* context = graph()->NewNode(
+ jsgraph()->common()->Parameter(
+ Linkage::GetJSCallContextParamIndex(wasm_count + 1), "%context"),
+ graph()->start());
+
if (!HasJSCompatibleSignature(sig_)) {
- // Throw a TypeError. The native context is good enough here because we
- // only throw a TypeError.
- BuildCallToRuntime(Runtime::kWasmThrowTypeError, jsgraph(),
- jsgraph()->isolate()->native_context(), nullptr, 0,
- effect_, *control_);
+ // Throw a TypeError. Use the context of the calling javascript function
+ // (passed as a parameter), such that the generated code is context
+ // independent.
+ BuildCallToRuntimeWithContext(Runtime::kWasmThrowTypeError, jsgraph(),
+ context, nullptr, 0, effect_, *control_);
// Add a dummy call to the wasm function so that the generated wrapper
// contains a reference to the wrapped wasm function. Without this reference
@@ -2795,12 +2794,6 @@ void WasmGraphBuilder::BuildJSToWasmWrapper(Handle<Code> wasm_code,
return;
}
- // Create the context parameter
- Node* context = graph()->NewNode(
- jsgraph()->common()->Parameter(
- Linkage::GetJSCallContextParamIndex(wasm_count + 1), "%context"),
- graph()->start());
-
int pos = 0;
args[pos++] = HeapConstant(wasm_code);
@@ -2851,11 +2844,13 @@ void WasmGraphBuilder::BuildWasmToJSWrapper(Handle<JSReceiver> target,
*control_ = start;
if (!HasJSCompatibleSignature(sig_)) {
- // Throw a TypeError. The native context is good enough here because we
- // only throw a TypeError.
- Return(BuildCallToRuntime(Runtime::kWasmThrowTypeError, jsgraph(),
- jsgraph()->isolate()->native_context(), nullptr,
- 0, effect_, *control_));
+ // Throw a TypeError. Embedding the context is ok here, since this code is
+ // regenerated at instantiation time.
+ Node* context =
+ jsgraph()->HeapConstant(jsgraph()->isolate()->native_context());
+ Return(BuildCallToRuntimeWithContext(Runtime::kWasmThrowTypeError,
+ jsgraph(), context, nullptr, 0,
+ effect_, *control_));
return;
}
@@ -3007,8 +3002,7 @@ void WasmGraphBuilder::BuildWasmInterpreterEntry(
jsgraph()->SmiConstant(function_index), // function index
arg_buffer, // argument buffer
};
- BuildCallToRuntime(Runtime::kWasmRunInterpreter, jsgraph(),
- instance->compiled_module()->native_context(), parameters,
+ BuildCallToRuntime(Runtime::kWasmRunInterpreter, jsgraph(), parameters,
arraysize(parameters), effect_, *control_);
// Read back the return value.
« no previous file with comments | « no previous file | src/runtime/runtime-wasm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698