f205292227
This is the final CL which adds a new --use-bare-instructions flag to
the VM.
If this flag is set during AOT compilation, we will:
* Build one global object pool (abbr: GOP) which all code objects
share. This gop will be stored in the object store. The PP register
is populated in the enter dart stub and it is restored when
returning from native calls.
* Gets rid of the CODE_REG/PP slots from the dart frames. Instead the
compiled code uses the global object pool, which is always in PP.
* Starts emitting pc-relative calls for calls between two dart
functions or when invoking a stub.
Limitation: We only emit pc-relative calls between two code objects
in the same isolate (this is because the image writer is writing
instruction objects for vm-isolate/main-isolate seperately)
* We do compile-time relocation of those static calls after the
precompiler has finished its work, but before writing the snapshot.
This patches all the instruction objects with pc-relative calls to
have the right .text distance.
* We emit a sorted list of code objects in ObjectStore::reverse_code_table,
which will be used by the AOT runtime to go back from PC to Code
objects (where all metadata, e.g. stack maps, catch entry moves, pc
descriptors are available).
Issue https://github.com/dart-lang/sdk/issues/33274
Change-Id: I6c5dd2b1571e3a889b27e804a24c2986c71e03b6
Reviewed-on: https://dart-review.googlesource.com/c/85769
Commit-Queue: Martin Kustermann <kustermann@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
54 lines
2.0 KiB
C++
54 lines
2.0 KiB
C++
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
#ifndef RUNTIME_VM_STACK_FRAME_ARM64_H_
|
|
#define RUNTIME_VM_STACK_FRAME_ARM64_H_
|
|
|
|
namespace dart {
|
|
|
|
/* ARM64 Dart Frame Layout
|
|
| | <- TOS
|
|
Callee frame | ... |
|
|
| saved PP |
|
|
| code object |
|
|
| saved FP | (FP of current frame)
|
|
| saved PC | (PC of current frame)
|
|
+--------------------+
|
|
Current frame | ... T| <- SP of current frame
|
|
| first local T|
|
|
| caller's PP T|
|
|
| code object T| (current frame's code object)
|
|
| caller's FP | <- FP of current frame
|
|
| caller's LR | (PC of caller frame)
|
|
+--------------------+
|
|
Caller frame | last parameter | <- SP of caller frame
|
|
| ... |
|
|
|
|
T against a slot indicates it needs to be traversed during GC.
|
|
*/
|
|
|
|
static const int kDartFrameFixedSize = 4; // PP, FP, LR, PC marker.
|
|
static const int kSavedPcSlotFromSp = -1;
|
|
|
|
static const int kFirstObjectSlotFromFp = -1; // Used by GC to traverse stack.
|
|
static const int kLastFixedObjectSlotFromFp = -2;
|
|
|
|
static const int kFirstLocalSlotFromFp = -3;
|
|
static const int kSavedCallerPpSlotFromFp = -2;
|
|
static const int kPcMarkerSlotFromFp = -1;
|
|
static const int kSavedCallerFpSlotFromFp = 0;
|
|
static const int kSavedCallerPcSlotFromFp = 1;
|
|
|
|
static const int kParamEndSlotFromFp = 1; // One slot past last parameter.
|
|
static const int kCallerSpSlotFromFp = 2;
|
|
|
|
// Entry and exit frame layout.
|
|
static const int kExitLinkSlotFromEntryFp = -22;
|
|
COMPILE_ASSERT(kAbiPreservedCpuRegCount == 10);
|
|
COMPILE_ASSERT(kAbiPreservedFpuRegCount == 8);
|
|
|
|
} // namespace dart
|
|
|
|
#endif // RUNTIME_VM_STACK_FRAME_ARM64_H_
|