1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- 2 * vim: set ts=8 sts=2 et sw=2 tw=80: 3 * This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "jit/Bailouts.h" 8 #include "jit/JitFrames.h" 9 #include "jit/SafepointIndex.h" 10 #include "jit/ScriptFromCalleeToken.h" 11 12 #include "vm/JSScript-inl.h" 13 14 using namespace js; 15 using namespace js::jit; 16 17 namespace js { 18 namespace jit { 19 20 class BailoutStack { 21 RegisterDump::FPUArray fpregs_; 22 RegisterDump::GPRArray regs_; 23 uintptr_t frameSize_; 24 uintptr_t snapshotOffset_; 25 26 public: machineState()27 MachineState machineState() { 28 return MachineState::FromBailout(regs_, fpregs_); 29 } snapshotOffset() const30 uint32_t snapshotOffset() const { return snapshotOffset_; } frameSize() const31 uint32_t frameSize() const { return frameSize_; } parentStackPointer()32 uint8_t* parentStackPointer() { 33 return (uint8_t*)this + sizeof(BailoutStack); 34 } 35 }; 36 37 } // namespace jit 38 } // namespace js 39 BailoutFrameInfo(const JitActivationIterator & activations,BailoutStack * bailout)40BailoutFrameInfo::BailoutFrameInfo(const JitActivationIterator& activations, 41 BailoutStack* bailout) 42 : machine_(bailout->machineState()) { 43 uint8_t* sp = bailout->parentStackPointer(); 44 framePointer_ = sp + bailout->frameSize(); 45 topFrameSize_ = framePointer_ - sp; 46 47 JSScript* script = 48 ScriptFromCalleeToken(((JitFrameLayout*)framePointer_)->calleeToken()); 49 topIonScript_ = script->ionScript(); 50 51 attachOnJitActivation(activations); 52 snapshotOffset_ = bailout->snapshotOffset(); 53 } 54 BailoutFrameInfo(const JitActivationIterator & activations,InvalidationBailoutStack * bailout)55BailoutFrameInfo::BailoutFrameInfo(const JitActivationIterator& activations, 56 InvalidationBailoutStack* bailout) 57 : machine_(bailout->machine()) { 58 framePointer_ = (uint8_t*)bailout->fp(); 59 topFrameSize_ = framePointer_ - bailout->sp(); 60 topIonScript_ = bailout->ionScript(); 61 attachOnJitActivation(activations); 62 63 uint8_t* returnAddressToFp_ = bailout->osiPointReturnAddress(); 64 const OsiIndex* osiIndex = topIonScript_->getOsiIndex(returnAddressToFp_); 65 snapshotOffset_ = osiIndex->snapshotOffset(); 66 } 67