blob: 618d33fa4e2b561d7f71fc39eeccb5ed4435c34d [file] [log] [blame]
// Copyright (c) 2020, 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_COMPILER_FFI_FRAME_REBASE_H_
#define RUNTIME_VM_COMPILER_FFI_FRAME_REBASE_H_
#if defined(DART_PRECOMPILED_RUNTIME)
#error "AOT runtime should not use compiler sources (including header files)"
#endif // defined(DART_PRECOMPILED_RUNTIME)
#include "vm/compiler/backend/locations.h"
#include "vm/compiler/ffi/native_location.h"
#include "vm/compiler/ffi/native_type.h"
#include "vm/compiler/runtime_api.h"
#include "vm/thread.h"
namespace dart {
namespace compiler {
namespace ffi {
// Describes a change of stack frame where the stack or base register or stack
// offset may change. This class allows easily rebasing stack locations across
// frame manipulations.
//
// If the stack offset register matches 'old_base', it is changed to 'new_base'
// and 'stack_delta_in_bytes' (# of bytes) is applied.
//
// This class can be used to rebase both Locations and NativeLocations.
class FrameRebase : public ValueObject {
public:
FrameRebase(Zone* zone,
const Register old_base,
const Register new_base,
intptr_t stack_delta_in_bytes)
: zone_(zone),
old_base_(old_base),
new_base_(new_base),
stack_delta_in_bytes_(stack_delta_in_bytes) {}
const NativeLocation& Rebase(const NativeLocation& loc) const;
Location Rebase(const Location loc) const;
private:
Zone* zone_;
const Register old_base_;
const Register new_base_;
const intptr_t stack_delta_in_bytes_;
};
} // namespace ffi
} // namespace compiler
} // namespace dart
#endif // RUNTIME_VM_COMPILER_FFI_FRAME_REBASE_H_