| // 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(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), |
| zone_(zone) {} |
| |
| const NativeLocation& Rebase(const NativeLocation& loc) const; |
| |
| Location Rebase(const Location loc) const; |
| |
| private: |
| const Register old_base_; |
| const Register new_base_; |
| const intptr_t stack_delta_in_bytes_; |
| Zone* zone_; |
| }; |
| |
| } // namespace ffi |
| |
| } // namespace compiler |
| |
| } // namespace dart |
| |
| #endif // RUNTIME_VM_COMPILER_FFI_FRAME_REBASE_H_ |