// 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 first local.
  int param_end_from_fp;

  // 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;

  // 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_
