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

Unified Diff: runtime/vm/intermediate_language_ia32.cc

Issue 10831261: Build and use stack maps in the SSA compiler. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 4 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
Index: runtime/vm/intermediate_language_ia32.cc
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 13d11e8e95408be61c2bab5fefa43ea0dc6ae267..dd082f4dfe30cfa60cdb13325c27b70fe42ed8b7 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -91,7 +91,8 @@ void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
compiler->GenerateCallRuntime(Isolate::kNoDeoptId,
0,
CatchClauseNode::kInvalidTryIndex,
- kTraceFunctionExitRuntimeEntry);
+ kTraceFunctionExitRuntimeEntry,
+ locs()->stack_bitmap());
Vyacheslav Egorov (Google) 2012/08/13 12:54:46 ReturnInstr is marked as NoCall. This code is susp
Kevin Millikin (Google) 2012/08/13 15:10:37 I know. We really don't want it to be a call beca
__ popl(temp); // Remove argument.
__ popl(result); // Restore result.
}
@@ -216,7 +217,8 @@ void AssertBooleanComp::EmitNativeCode(FlowGraphCompiler* compiler) {
compiler->GenerateCallRuntime(deopt_id(),
token_pos(),
try_index(),
- kConditionTypeErrorRuntimeEntry);
+ kConditionTypeErrorRuntimeEntry,
+ locs()->stack_bitmap());
// We should never return here.
__ int3();
@@ -291,7 +293,8 @@ static void EmitEqualityAsInstanceCall(FlowGraphCompiler* compiler,
operator_name,
kNumberOfArguments,
kNoArgumentNames,
- kNumArgumentsChecked);
+ kNumArgumentsChecked,
+ comp->locs()->stack_bitmap());
ASSERT(comp->locs()->out().reg() == EAX);
if (comp->kind() == Token::kNE) {
Label done, false_label;
@@ -313,7 +316,8 @@ static void EmitEqualityAsPolymorphicCall(FlowGraphCompiler* compiler,
Token::Kind kind,
intptr_t deopt_id,
intptr_t token_pos,
- intptr_t try_index) {
+ intptr_t try_index,
+ BitmapBuilder* stack_bitmap) {
ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
const ICData& ic_data = ICData::Handle(orig_ic_data.AsUnaryClassChecks());
ASSERT(ic_data.NumberOfChecks() > 0);
@@ -368,7 +372,8 @@ static void EmitEqualityAsPolymorphicCall(FlowGraphCompiler* compiler,
try_index,
target,
kNumberOfArguments,
- kNoArgumentNames);
+ kNoArgumentNames,
+ stack_bitmap);
if (branch == NULL) {
if (kind == Token::kNE) {
Label false_label;
@@ -433,7 +438,8 @@ static void EmitGenericEqualityCompare(FlowGraphCompiler* compiler,
__ pushl(left);
__ pushl(right);
EmitEqualityAsPolymorphicCall(compiler, ic_data, locs, branch, kind,
- deopt_id, token_pos, try_index);
+ deopt_id, token_pos, try_index,
+ locs.stack_bitmap());
__ Bind(&done);
}
@@ -594,7 +600,8 @@ void RelationalOpComp::EmitNativeCode(FlowGraphCompiler* compiler) {
NULL, // Fallthrough when done.
deopt_id(),
token_pos(),
- try_index());
+ try_index(),
+ locs()->stack_bitmap());
return;
}
const String& function_name =
@@ -611,7 +618,8 @@ void RelationalOpComp::EmitNativeCode(FlowGraphCompiler* compiler) {
function_name,
kNumArguments,
Array::ZoneHandle(), // No optional arguments.
- kNumArgsChecked);
+ kNumArgsChecked,
+ locs()->stack_bitmap());
ASSERT(locs()->out().reg() == EAX);
}
@@ -653,7 +661,8 @@ void NativeCallComp::EmitNativeCode(FlowGraphCompiler* compiler) {
compiler->GenerateCall(token_pos(),
try_index(),
&StubCode::CallNativeCFunctionLabel(),
- PcDescriptors::kOther);
+ PcDescriptors::kOther,
+ locs()->stack_bitmap());
__ popl(result);
}
@@ -679,7 +688,7 @@ LocationSummary* LoadIndexedComp::MakeLocationSummary() const {
static void EmitLoadIndexedPolymorphic(FlowGraphCompiler* compiler,
- LoadIndexedComp* comp) {
+ LoadIndexedComp* comp) {
Label* deopt = compiler->AddDeoptStub(comp->deopt_id(),
comp->try_index(),
kDeoptLoadIndexedPolymorphic);
@@ -703,7 +712,8 @@ static void EmitLoadIndexedPolymorphic(FlowGraphCompiler* compiler,
NULL, // Fallthrough when done.
comp->deopt_id(),
comp->token_pos(),
- comp->try_index());
+ comp->try_index(),
+ comp->locs()->stack_bitmap());
}
@@ -809,7 +819,8 @@ static void EmitStoreIndexedGeneric(FlowGraphCompiler* compiler,
function_name,
kNumArguments,
Array::ZoneHandle(), // No named arguments.
- kNumArgsChecked);
+ kNumArgsChecked,
+ comp->locs()->stack_bitmap());
}
@@ -838,7 +849,8 @@ static void EmitStoreIndexedPolymorphic(FlowGraphCompiler* compiler,
NULL, // Fallthrough when done.
comp->deopt_id(),
comp->token_pos(),
- comp->try_index());
+ comp->try_index(),
+ comp->locs()->stack_bitmap());
}
@@ -971,7 +983,8 @@ void InstanceOfComp::EmitNativeCode(FlowGraphCompiler* compiler) {
token_pos(),
try_index(),
type(),
- negate_result());
+ negate_result(),
+ locs()->stack_bitmap());
ASSERT(locs()->out().reg() == EAX);
}
@@ -994,7 +1007,8 @@ void CreateArrayComp::EmitNativeCode(FlowGraphCompiler* compiler) {
compiler->GenerateCall(token_pos(),
try_index(),
&StubCode::AllocateArrayLabel(),
- PcDescriptors::kOther);
+ PcDescriptors::kOther,
+ locs()->stack_bitmap());
ASSERT(locs()->out().reg() == EAX);
// Pop the element values from the stack into the array.
@@ -1034,7 +1048,8 @@ void AllocateObjectWithBoundsCheckComp::EmitNativeCode(
compiler->GenerateCallRuntime(deopt_id(),
token_pos(),
try_index(),
- kAllocateObjectWithBoundsCheckRuntimeEntry);
+ kAllocateObjectWithBoundsCheckRuntimeEntry,
+ locs()->stack_bitmap());
// Pop instantiator type arguments, type arguments, and class.
// source location.
__ Drop(3);
@@ -1122,7 +1137,8 @@ void InstantiateTypeArgumentsComp::EmitNativeCode(
compiler->GenerateCallRuntime(deopt_id(),
token_pos(),
try_index(),
- kInstantiateTypeArgumentsRuntimeEntry);
+ kInstantiateTypeArgumentsRuntimeEntry,
+ locs()->stack_bitmap());
__ Drop(2); // Drop instantiator and uninstantiated type arguments.
__ popl(result_reg); // Pop instantiated type arguments.
__ Bind(&type_arguments_instantiated);
@@ -1278,7 +1294,8 @@ void AllocateContextComp::EmitNativeCode(FlowGraphCompiler* compiler) {
compiler->GenerateCall(token_pos(),
try_index(),
&label,
- PcDescriptors::kOther);
+ PcDescriptors::kOther,
+ locs()->stack_bitmap());
}
@@ -1302,7 +1319,8 @@ void CloneContextComp::EmitNativeCode(FlowGraphCompiler* compiler) {
compiler->GenerateCallRuntime(deopt_id(),
token_pos(),
try_index(),
- kCloneContextRuntimeEntry);
+ kCloneContextRuntimeEntry,
+ locs()->stack_bitmap());
__ popl(result); // Remove argument.
__ popl(result); // Get result (cloned context).
}
@@ -1353,7 +1371,8 @@ void CheckStackOverflowComp::EmitNativeCode(FlowGraphCompiler* compiler) {
compiler->GenerateCallRuntime(deopt_id(),
token_pos(),
try_index(),
- kStackOverflowRuntimeEntry);
+ kStackOverflowRuntimeEntry,
+ locs()->stack_bitmap());
__ Bind(&no_stack_overflow);
}
@@ -1539,12 +1558,14 @@ static void EmitSmiBinaryOp(FlowGraphCompiler* compiler, BinaryOpComp* comp) {
const intptr_t kArgumentCount = 2;
__ pushl(temp);
__ pushl(right);
- compiler->GenerateStaticCall(comp->instance_call()->deopt_id(),
- comp->instance_call()->token_pos(),
- comp->instance_call()->try_index(),
- target,
- kArgumentCount,
- Array::Handle()); // No argument names.
+ compiler->GenerateStaticCall(
+ comp->instance_call()->deopt_id(),
+ comp->instance_call()->token_pos(),
+ comp->instance_call()->try_index(),
+ target,
+ kArgumentCount,
+ Array::Handle(), // No argument names.
+ comp->locs()->stack_bitmap());
ASSERT(result == EAX);
}
__ Bind(&done);
@@ -1633,12 +1654,14 @@ static void EmitMintBinaryOp(FlowGraphCompiler* compiler, BinaryOpComp* comp) {
} else {
__ pushl(left);
__ pushl(right);
- compiler->GenerateStaticCall(comp->instance_call()->deopt_id(),
- comp->instance_call()->token_pos(),
- comp->instance_call()->try_index(),
- target,
- comp->instance_call()->ArgumentCount(),
- comp->instance_call()->argument_names());
+ compiler->GenerateStaticCall(
+ comp->instance_call()->deopt_id(),
+ comp->instance_call()->token_pos(),
+ comp->instance_call()->try_index(),
+ target,
+ comp->instance_call()->ArgumentCount(),
+ comp->instance_call()->argument_names(),
+ comp->locs()->stack_bitmap());
ASSERT(result == EAX);
__ jmp(&done);
}
@@ -1653,12 +1676,14 @@ static void EmitMintBinaryOp(FlowGraphCompiler* compiler, BinaryOpComp* comp) {
} else {
__ pushl(left);
__ pushl(right);
- compiler->GenerateStaticCall(comp->instance_call()->deopt_id(),
- comp->instance_call()->token_pos(),
- comp->instance_call()->try_index(),
- target,
- comp->instance_call()->ArgumentCount(),
- comp->instance_call()->argument_names());
+ compiler->GenerateStaticCall(
+ comp->instance_call()->deopt_id(),
+ comp->instance_call()->token_pos(),
+ comp->instance_call()->try_index(),
+ target,
+ comp->instance_call()->ArgumentCount(),
+ comp->instance_call()->argument_names(),
+ comp->locs()->stack_bitmap());
ASSERT(result == EAX);
}
}
@@ -1700,7 +1725,8 @@ void DoubleBinaryOpComp::EmitNativeCode(FlowGraphCompiler* compiler) {
compiler->GenerateCall(instance_call()->token_pos(),
instance_call()->try_index(),
&label,
- PcDescriptors::kOther);
+ PcDescriptors::kOther,
+ locs()->stack_bitmap());
// Newly allocated object is now in the result register (RAX).
ASSERT(result == EAX);
__ popl(right);
@@ -1827,7 +1853,8 @@ void NumberNegateComp::EmitNativeCode(FlowGraphCompiler* compiler) {
compiler->GenerateCall(instance_call()->token_pos(),
instance_call()->try_index(),
&label,
- PcDescriptors::kOther);
+ PcDescriptors::kOther,
+ locs()->stack_bitmap());
// Result is in EAX.
ASSERT(result != temp);
__ movl(result, EAX);
@@ -1891,7 +1918,8 @@ void ToDoubleComp::EmitNativeCode(FlowGraphCompiler* compiler) {
compiler->GenerateCall(instance_call()->token_pos(),
instance_call()->try_index(),
&label,
- PcDescriptors::kOther);
+ PcDescriptors::kOther,
+ locs()->stack_bitmap());
ASSERT(result == EAX);
__ popl(value);
@@ -1937,7 +1965,8 @@ void PolymorphicInstanceCallComp::EmitNativeCode(FlowGraphCompiler* compiler) {
(is_smi_label == &handle_smi) ? &done : NULL,
instance_call()->deopt_id(),
instance_call()->token_pos(),
- instance_call()->try_index());
+ instance_call()->try_index(),
+ locs()->stack_bitmap());
if (is_smi_label == &handle_smi) {
__ Bind(&handle_smi);
ASSERT(ic_data()->GetReceiverClassIdAt(0) == kSmiCid);
@@ -1947,7 +1976,8 @@ void PolymorphicInstanceCallComp::EmitNativeCode(FlowGraphCompiler* compiler) {
instance_call()->try_index(),
target,
instance_call()->ArgumentCount(),
- instance_call()->argument_names());
+ instance_call()->argument_names(),
+ locs()->stack_bitmap());
}
__ Bind(&done);
}
@@ -2049,7 +2079,8 @@ void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
function_name,
kNumArguments,
Array::ZoneHandle(), // No optional arguments.
- kNumArgsChecked);
+ kNumArgsChecked,
+ locs()->stack_bitmap());
ASSERT(locs()->out().reg() == EAX);
__ CompareObject(locs()->out().reg(), compiler->bool_true());
EmitBranchOnCondition(compiler, branch_condition);

Powered by Google App Engine
This is Rietveld 408576698