blob: a129188f2cf473d9bf43c8a2657a9095b408a775 [file]
/*
* Copyright 2010-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the LICENSE file.
*/
#include "ShadowStack.hpp"
using namespace kotlin;
mm::ShadowStack::Iterator& mm::ShadowStack::Iterator::operator++() noexcept {
++object_;
Init();
return *this;
}
void mm::ShadowStack::Iterator::Init() noexcept {
while (frame_) {
if (object_ < end_) return;
frame_ = frame_->previous;
object_ = begin();
end_ = end();
}
}
void mm::ShadowStack::EnterFrame(ObjHeader** start, int parameters, int count) noexcept {
FrameOverlay* frame = reinterpret_cast<FrameOverlay*>(start);
frame->previous = currentFrame_;
currentFrame_ = frame;
// TODO: maybe compress in single value somehow.
frame->parameters = parameters;
frame->count = count;
}
void mm::ShadowStack::LeaveFrame(ObjHeader** start, int parameters, int count) noexcept {
FrameOverlay* frame = reinterpret_cast<FrameOverlay*>(start);
RuntimeAssert(currentFrame_ == frame, "Frame to leave is expected to be %p, but current frame is %p", frame, currentFrame_);
currentFrame_ = frame->previous;
}
void mm::ShadowStack::SetCurrentFrame(ObjHeader** start) noexcept {
currentFrame_ = reinterpret_cast<FrameOverlay*>(start);
}
FrameOverlay* mm::ShadowStack::getCurrentFrame() noexcept {
return currentFrame_;
}
ALWAYS_INLINE void mm::ShadowStack::checkCurrentFrame(FrameOverlay* frame) noexcept {
RuntimeAssert(currentFrame_ == frame, "Frame is expected to be %p, but current frame is %p", frame, currentFrame_);
}