9e81e4bfe5
This helper class can be used for building IL in SSA form. It was previously used to build intrinsic IL, but it can also be used to build IL for tests. This move required introducing a constant that describes offset of the last parameter from SP value on entry (kLastParamFrom This CL also changes the meaning of ParameterInstr(index, SPREG) to be [SP + index + kLastParamSlotFromEntrySp], where previously it was something like [SP + (index - 1) + kLastParamSlotFromEntrySp]. Change-Id: Ib75ecb3a94f9cde74d6f91028d3cbea8f5e4bc42 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/98336 Commit-Queue: Vyacheslav Egorov <vegorov@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com>
77 lines
2.4 KiB
C++
77 lines
2.4 KiB
C++
// Copyright (c) 2019, 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_FRAME_LAYOUT_H_
|
|
#define RUNTIME_VM_FRAME_LAYOUT_H_
|
|
|
|
// FrameLayout structure captures configuration specific properties of the
|
|
// frame layout used by the runtime system and compiler.
|
|
//
|
|
// Runtime system uses runtime_frame_layout defined in stack_frame.h.
|
|
// Compiler uses compiler::target::frame_layout defined in runtime_api.h
|
|
|
|
namespace dart {
|
|
|
|
// Forward declarations.
|
|
class LocalVariable;
|
|
|
|
struct FrameLayout {
|
|
// The offset (in words) from FP to the first object.
|
|
int first_object_from_fp;
|
|
|
|
// The offset (in words) from FP to the last fixed object.
|
|
int last_fixed_object_from_fp;
|
|
|
|
// The offset (in words) from FP to the slot past the last parameter.
|
|
int param_end_from_fp;
|
|
|
|
// The offset (in words) from SP on entry (before frame is setup) to
|
|
// the last parameter.
|
|
int last_param_from_entry_sp;
|
|
|
|
// The offset (in words) from FP to the first local.
|
|
int first_local_from_fp;
|
|
|
|
// The fixed size of the frame.
|
|
int dart_fixed_frame_size;
|
|
|
|
// The offset (in words) from FP to the saved pool (if applicable).
|
|
int saved_caller_pp_from_fp;
|
|
|
|
// The offset (in words) from FP to the code object (if applicable).
|
|
int code_from_fp;
|
|
|
|
// Entry and exit frame layout.
|
|
int exit_link_slot_from_entry_fp;
|
|
|
|
// The number of fixed slots below the saved PC.
|
|
int saved_below_pc() const { return -first_local_from_fp; }
|
|
|
|
// Returns the FP-relative index where [variable] can be found (assumes
|
|
// [variable] is not captured), in words.
|
|
int FrameSlotForVariable(const LocalVariable* variable) const;
|
|
|
|
// Returns the FP-relative index where [variable_index] can be found (assumes
|
|
// [variable_index] comes from a [LocalVariable::index()], which is not
|
|
// captured).
|
|
int FrameSlotForVariableIndex(int index) const;
|
|
|
|
// Returns the variable index from a FP-relative index.
|
|
intptr_t VariableIndexForFrameSlot(intptr_t frame_slot) const {
|
|
if (frame_slot <= first_local_from_fp) {
|
|
return frame_slot - first_local_from_fp;
|
|
} else {
|
|
ASSERT(frame_slot > param_end_from_fp);
|
|
return frame_slot - param_end_from_fp;
|
|
}
|
|
}
|
|
|
|
// Called to initialize the stack frame layout during startup.
|
|
static void Init();
|
|
};
|
|
|
|
} // namespace dart
|
|
|
|
#endif // RUNTIME_VM_FRAME_LAYOUT_H_
|