Chromium Code Reviews| Index: runtime/vm/intermediate_language_x64.cc |
| diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc |
| index cd36da8685b9597227d7194b611f993b59d15489..668c460b3c947e122905f6e675744a36814df039 100644 |
| --- a/runtime/vm/intermediate_language_x64.cc |
| +++ b/runtime/vm/intermediate_language_x64.cc |
| @@ -91,7 +91,8 @@ void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| compiler->GenerateCallRuntime(Isolate::kNoDeoptId, |
| 0, |
| CatchClauseNode::kInvalidTryIndex, |
| - kTraceFunctionExitRuntimeEntry); |
| + kTraceFunctionExitRuntimeEntry, |
| + NULL); |
|
Vyacheslav Egorov (Google)
2012/08/13 12:54:46
ReturnInstr is marked as NoCall. This code is susp
|
| __ popq(temp); // Remove argument. |
| __ popq(result); // Restore result. |
| } |
| @@ -224,7 +225,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(); |
| @@ -299,7 +301,8 @@ static void EmitEqualityAsInstanceCall(FlowGraphCompiler* compiler, |
| operator_name, |
| kNumberOfArguments, |
| kNoArgumentNames, |
| - kNumArgumentsChecked); |
| + kNumArgumentsChecked, |
| + comp->locs()->stack_bitmap()); |
| ASSERT(comp->locs()->out().reg() == RAX); |
| if (comp->kind() == Token::kNE) { |
| Label done, false_label; |
| @@ -321,7 +324,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); |
| @@ -376,7 +380,8 @@ static void EmitEqualityAsPolymorphicCall(FlowGraphCompiler* compiler, |
| try_index, |
| target, |
| kNumberOfArguments, |
| - kNoArgumentNames); |
| + kNoArgumentNames, |
| + stack_bitmap); |
| if (branch == NULL) { |
| if (kind == Token::kNE) { |
| Label false_label; |
| @@ -441,7 +446,8 @@ static void EmitGenericEqualityCompare(FlowGraphCompiler* compiler, |
| __ pushq(left); |
| __ pushq(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); |
| } |
| @@ -602,7 +608,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 = |
| @@ -619,7 +626,8 @@ void RelationalOpComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
| function_name, |
| kNumArguments, |
| Array::ZoneHandle(), // No optional arguments. |
| - kNumArgsChecked); |
| + kNumArgsChecked, |
| + locs()->stack_bitmap()); |
| ASSERT(locs()->out().reg() == RAX); |
| } |
| @@ -661,7 +669,8 @@ void NativeCallComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
| compiler->GenerateCall(token_pos(), |
| try_index(), |
| &StubCode::CallNativeCFunctionLabel(), |
| - PcDescriptors::kOther); |
| + PcDescriptors::kOther, |
| + locs()->stack_bitmap()); |
| __ popq(result); |
| } |
| @@ -690,7 +699,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); |
| @@ -714,7 +723,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()); |
| } |
| @@ -822,7 +832,8 @@ static void EmitStoreIndexedGeneric(FlowGraphCompiler* compiler, |
| function_name, |
| kNumArguments, |
| Array::ZoneHandle(), // No named arguments. |
| - kNumArgsChecked); |
| + kNumArgsChecked, |
| + comp->locs()->stack_bitmap()); |
| } |
| @@ -851,7 +862,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()); |
| } |
| @@ -984,7 +996,8 @@ void InstanceOfComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
| token_pos(), |
| try_index(), |
| type(), |
| - negate_result()); |
| + negate_result(), |
| + locs()->stack_bitmap()); |
| ASSERT(locs()->out().reg() == RAX); |
| } |
| @@ -1007,7 +1020,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() == RAX); |
| // Pop the element values from the stack into the array. |
| @@ -1047,7 +1061,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. |
| __ Drop(3); |
| __ popq(result); // Pop new instance. |
| @@ -1132,7 +1147,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. |
| __ popq(result_reg); // Pop instantiated type arguments. |
| __ Bind(&type_arguments_instantiated); |
| @@ -1284,7 +1300,8 @@ void AllocateContextComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
| compiler->GenerateCall(token_pos(), |
| try_index(), |
| &label, |
| - PcDescriptors::kOther); |
| + PcDescriptors::kOther, |
| + locs()->stack_bitmap()); |
| } |
| @@ -1308,7 +1325,8 @@ void CloneContextComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
| compiler->GenerateCallRuntime(deopt_id(), |
| token_pos(), |
| try_index(), |
| - kCloneContextRuntimeEntry); |
| + kCloneContextRuntimeEntry, |
| + locs()->stack_bitmap()); |
| __ popq(result); // Remove argument. |
| __ popq(result); // Get result (cloned context). |
| } |
| @@ -1364,7 +1382,8 @@ void CheckStackOverflowComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
| compiler->GenerateCallRuntime(deopt_id(), |
| token_pos(), |
| try_index(), |
| - kStackOverflowRuntimeEntry); |
| + kStackOverflowRuntimeEntry, |
| + locs()->stack_bitmap()); |
| __ Bind(&no_stack_overflow); |
| } |
| @@ -1549,12 +1568,14 @@ static void EmitSmiBinaryOp(FlowGraphCompiler* compiler, BinaryOpComp* comp) { |
| const intptr_t kArgumentCount = 2; |
| __ pushq(temp); |
| __ pushq(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 == RAX); |
| } |
| __ Bind(&done); |
| @@ -1642,12 +1663,14 @@ static void EmitMintBinaryOp(FlowGraphCompiler* compiler, BinaryOpComp* comp) { |
| } else { |
| __ pushq(left); |
| __ pushq(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 == RAX); |
| __ jmp(&done); |
| } |
| @@ -1662,12 +1685,14 @@ static void EmitMintBinaryOp(FlowGraphCompiler* compiler, BinaryOpComp* comp) { |
| } else { |
| __ pushq(left); |
| __ pushq(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 == RAX); |
| } |
| } |
| @@ -1709,7 +1734,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 == RAX); |
| __ popq(right); |
| @@ -1836,7 +1862,8 @@ void NumberNegateComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
| compiler->GenerateCall(instance_call()->token_pos(), |
| instance_call()->try_index(), |
| &label, |
| - PcDescriptors::kOther); |
| + PcDescriptors::kOther, |
| + instance_call()->locs()->stack_bitmap()); |
| // Result is in RAX. |
| ASSERT(result != temp); |
| __ movq(result, RAX); |
| @@ -1897,7 +1924,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 == RAX); |
| __ popq(value); |
| @@ -1943,7 +1971,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); |
| @@ -1953,7 +1982,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); |
| } |
| @@ -2055,7 +2085,8 @@ void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| function_name, |
| kNumArguments, |
| Array::ZoneHandle(), // No optional arguments. |
| - kNumArgsChecked); |
| + kNumArgsChecked, |
| + locs()->stack_bitmap()); |
| ASSERT(locs()->out().reg() == RAX); |
| __ CompareObject(locs()->out().reg(), compiler->bool_true()); |
| EmitBranchOnCondition(compiler, branch_condition); |