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