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 #if defined(_WIN32)
18 # pragma pack(push, 1)
19 #endif
20
21 namespace js {
22 namespace jit {
23
24 class BailoutStack {
25 RegisterDump::FPUArray fpregs_;
26 RegisterDump::GPRArray regs_;
27 uintptr_t frameSize_;
28 uintptr_t snapshotOffset_;
29
30 public:
machineState()31 MachineState machineState() {
32 return MachineState::FromBailout(regs_, fpregs_);
33 }
snapshotOffset() const34 uint32_t snapshotOffset() const { return snapshotOffset_; }
frameSize() const35 uint32_t frameSize() const { return frameSize_; }
parentStackPointer()36 uint8_t* parentStackPointer() {
37 return (uint8_t*)this + sizeof(BailoutStack);
38 }
39 };
40
41 } // namespace jit
42 } // namespace js
43
44 #if defined(_WIN32)
45 # pragma pack(pop)
46 #endif
47
BailoutFrameInfo(const JitActivationIterator & activations,BailoutStack * bailout)48 BailoutFrameInfo::BailoutFrameInfo(const JitActivationIterator& activations,
49 BailoutStack* bailout)
50 : machine_(bailout->machineState()), activation_(nullptr) {
51 uint8_t* sp = bailout->parentStackPointer();
52 framePointer_ = sp + bailout->frameSize();
53 topFrameSize_ = framePointer_ - sp;
54
55 JSScript* script =
56 ScriptFromCalleeToken(((JitFrameLayout*)framePointer_)->calleeToken());
57 topIonScript_ = script->ionScript();
58
59 attachOnJitActivation(activations);
60 snapshotOffset_ = bailout->snapshotOffset();
61 }
62
BailoutFrameInfo(const JitActivationIterator & activations,InvalidationBailoutStack * bailout)63 BailoutFrameInfo::BailoutFrameInfo(const JitActivationIterator& activations,
64 InvalidationBailoutStack* bailout)
65 : machine_(bailout->machine()), activation_(nullptr) {
66 framePointer_ = (uint8_t*)bailout->fp();
67 topFrameSize_ = framePointer_ - bailout->sp();
68 topIonScript_ = bailout->ionScript();
69 attachOnJitActivation(activations);
70
71 uint8_t* returnAddressToFp_ = bailout->osiPointReturnAddress();
72 const OsiIndex* osiIndex = topIonScript_->getOsiIndex(returnAddressToFp_);
73 snapshotOffset_ = osiIndex->snapshotOffset();
74 }
75