| Index: runtime/vm/assembler_macros_arm.cc
|
| ===================================================================
|
| --- runtime/vm/assembler_macros_arm.cc (revision 19151)
|
| +++ runtime/vm/assembler_macros_arm.cc (working copy)
|
| @@ -7,8 +7,13 @@
|
|
|
| #include "vm/assembler_macros.h"
|
|
|
| +#include "vm/assembler.h"
|
| +
|
| namespace dart {
|
|
|
| +#define __ assembler->
|
| +
|
| +
|
| void AssemblerMacros::TryAllocate(Assembler* assembler,
|
| const Class& cls,
|
| Label* failure,
|
| @@ -20,14 +25,51 @@
|
|
|
| void AssemblerMacros::EnterDartFrame(Assembler* assembler,
|
| intptr_t frame_size) {
|
| - UNIMPLEMENTED();
|
| + const intptr_t offset = assembler->CodeSize();
|
| + // Save PC in frame for fast identification of corresponding code.
|
| + // Note that callee-saved registers can be added to the register list.
|
| + __ EnterFrame((1 << PP) | (1 << FP) | (1 << LR) | (1 << PC), 0);
|
| +
|
| + if (offset != 0) {
|
| + // Adjust saved PC for any intrinsic code that could have been generated
|
| + // before a frame is created. Use PP as temp register.
|
| + __ ldr(PP, Address(FP, 2 * kWordSize));
|
| + __ AddImmediate(PP, PP, -offset);
|
| + __ str(PP, Address(FP, 2 * kWordSize));
|
| + }
|
| +
|
| + // Setup pool pointer for this dart function.
|
| + const intptr_t object_pool_pc_dist =
|
| + Instr::kPCReadOffset - assembler->CodeSize() -
|
| + Instructions::HeaderSize() + Instructions::object_pool_offset();
|
| + __ ldr(PP, Address(PC, object_pool_pc_dist));
|
| +
|
| + // Reserve space for locals.
|
| + __ AddImmediate(SP, -frame_size);
|
| }
|
|
|
|
|
| +void AssemblerMacros::LeaveDartFrame(Assembler* assembler) {
|
| + __ LeaveFrame((1 << PP) | (1 << FP) | (1 << LR));
|
| + // Adjust SP for PC pushed in EnterDartFrame.
|
| + __ AddImmediate(SP, kWordSize);
|
| +}
|
| +
|
| +
|
| void AssemblerMacros::EnterStubFrame(Assembler* assembler) {
|
| - UNIMPLEMENTED();
|
| + // Push 0 as saved PC for stub frames.
|
| + __ mov(IP, ShifterOperand(LR));
|
| + __ mov(LR, ShifterOperand(0));
|
| + __ EnterFrame((1 << FP) | (1 << IP) | (1 << LR), 0);
|
| }
|
|
|
| +
|
| +void AssemblerMacros::LeaveStubFrame(Assembler* assembler) {
|
| + __ LeaveFrame((1 << FP) | (1 << LR));
|
| + // Adjust SP for null PC pushed in EnterStubFrame.
|
| + __ AddImmediate(SP, kWordSize);
|
| +}
|
| +
|
| } // namespace dart
|
|
|
| #endif // defined TARGET_ARCH_ARM
|
|
|