Bug 1028418 - Part 3: Take a bit on each of interpreter, baseline, and rematerialized frames for marking whether there is a js::SavedFrame for the given frame in the js::SavedStacks cache; r=shu

This commit is contained in:
Nick Fitzgerald 2015-07-27 16:33:34 -07:00
Родитель 35403e6c00
Коммит 2aa99a0d31
8 изменённых файлов: 92 добавлений и 7 удалений

Просмотреть файл

@ -1701,6 +1701,9 @@ CopyFromRematerializedFrame(JSContext* cx, JitActivation* act, uint8_t* fp, size
for (size_t i = 0; i < frame->script()->nfixed(); i++)
*frame->valueSlot(i) = rematFrame->locals()[i];
if (rematFrame->hasCachedSavedFrame())
frame->setHasCachedSavedFrame();
JitSpew(JitSpew_BaselineBailouts,
" Copied from rematerialized frame at (%p,%u)",
fp, inlineDepth);

Просмотреть файл

@ -77,7 +77,12 @@ class BaselineFrame
// If set, we're handling an exception for this frame. This is set for
// debug mode OSR sanity checking when it handles corner cases which
// only arise during exception handling.
HANDLING_EXCEPTION = 1 << 12
HANDLING_EXCEPTION = 1 << 12,
// If set, this frame has been on the stack when
// |js::SavedStacks::saveCurrentStack| was called, and so there is a
// |js::SavedFrame| object cached for this frame.
HAS_CACHED_SAVED_FRAME = 1 << 13
};
protected: // Silence Clang warning about unused private fields.
@ -323,6 +328,13 @@ class BaselineFrame
flags_ &= ~HANDLING_EXCEPTION;
}
bool hasCachedSavedFrame() const {
return flags_ & HAS_CACHED_SAVED_FRAME;
}
void setHasCachedSavedFrame() {
flags_ |= HAS_CACHED_SAVED_FRAME;
}
JSScript* evalScript() const {
MOZ_ASSERT(isEvalFrame());
return evalScript_;

Просмотреть файл

@ -181,9 +181,10 @@ class OsiIndex
// .. locals ..
// The descriptor is organized into three sections:
// [ frame size | constructing bit | frame type ]
// [ frame size | has cached saved frame bit | frame type ]
// < highest - - - - - - - - - - - - - - lowest >
static const uintptr_t FRAMESIZE_SHIFT = 4;
static const uintptr_t FRAMESIZE_SHIFT = 5;
static const uintptr_t HASCACHEDSAVEDFRAME_BIT = 1 << 4;
static const uintptr_t FRAMETYPE_BITS = 4;
// Ion frames have a few important numbers associated with them:
@ -282,7 +283,7 @@ void UpdateJitActivationsForMinorGC(JSRuntime* rt, JSTracer* trc);
static inline uint32_t
MakeFrameDescriptor(uint32_t frameSize, FrameType type)
{
return (frameSize << FRAMESIZE_SHIFT) | type;
return 0 | (frameSize << FRAMESIZE_SHIFT) | type;
}
// Returns the JSScript associated with the topmost JIT frame.
@ -343,7 +344,13 @@ class CommonFrameLayout
return descriptor_ >> FRAMESIZE_SHIFT;
}
void setFrameDescriptor(size_t size, FrameType type) {
descriptor_ = (size << FRAMESIZE_SHIFT) | type;
descriptor_ = 0 | (size << FRAMESIZE_SHIFT) | type;
}
bool hasCachedSavedFrame() const {
return descriptor_ & HASCACHEDSAVEDFRAME_BIT;
}
void setHasCachedSavedFrame() {
descriptor_ |= HASCACHEDSAVEDFRAME_BIT;
}
uint8_t* returnAddress() const {
return returnAddress_;

Просмотреть файл

@ -36,6 +36,7 @@ RematerializedFrame::RematerializedFrame(JSContext* cx, uint8_t* top, unsigned n
: prevUpToDate_(false),
isDebuggee_(iter.script()->isDebuggee()),
isConstructing_(iter.isConstructing()),
hasCachedSavedFrame_(false),
top_(top),
pc_(iter.pc()),
frameNo_(iter.frameNo()),

Просмотреть файл

@ -35,6 +35,11 @@ class RematerializedFrame
// Is this frame constructing?
bool isConstructing_;
// If true, this frame has been on the stack when
// |js::SavedStacks::saveCurrentStack| was called, and so there is a
// |js::SavedFrame| object cached for this frame.
bool hasCachedSavedFrame_;
// The fp of the top frame associated with this possibly inlined frame.
uint8_t* top_;
@ -169,6 +174,14 @@ class RematerializedFrame
return isConstructing_;
}
bool hasCachedSavedFrame() const {
return hasCachedSavedFrame_;
}
void setHasCachedSavedFrame() {
hasCachedSavedFrame_ = true;
}
unsigned numFormalArgs() const {
return maybeFun() ? fun()->nargs() : 0;
}

Просмотреть файл

@ -606,6 +606,27 @@ AbstractFramePtr::isDebuggerEvalFrame() const
return false;
}
inline bool
AbstractFramePtr::hasCachedSavedFrame() const
{
if (isInterpreterFrame())
return asInterpreterFrame()->hasCachedSavedFrame();
if (isBaselineFrame())
return asBaselineFrame()->hasCachedSavedFrame();
return asRematerializedFrame()->hasCachedSavedFrame();
}
inline void
AbstractFramePtr::setHasCachedSavedFrame()
{
if (isInterpreterFrame())
asInterpreterFrame()->setHasCachedSavedFrame();
else if (isBaselineFrame())
asBaselineFrame()->setHasCachedSavedFrame();
else
asRematerializedFrame()->setHasCachedSavedFrame();
}
inline bool
AbstractFramePtr::isDebuggee() const
{

Просмотреть файл

@ -471,6 +471,15 @@ InterpreterStack::pushExecuteFrame(JSContext* cx, HandleScript script, const Val
/*****************************************************************************/
bool
FrameIter::hasCachedSavedFrame(JSContext* cx, bool* hasCachedSavedFramep)
{
if (isIon() && !ensureHasRematerializedFrame(cx))
return false;
*hasCachedSavedFramep = abstractFramePtr().hasCachedSavedFrame();
return true;
}
void
FrameIter::popActivation()
{

Просмотреть файл

@ -196,6 +196,8 @@ class AbstractFramePtr
inline bool isGlobalFrame() const;
inline bool isEvalFrame() const;
inline bool isDebuggerEvalFrame() const;
inline bool hasCachedSavedFrame() const;
inline void setHasCachedSavedFrame();
inline JSScript* script() const;
inline JSFunction* fun() const;
@ -328,14 +330,22 @@ class InterpreterFrame
/* Used in tracking calls and profiling (see vm/SPSProfiler.cpp) */
HAS_PUSHED_SPS_FRAME = 0x10000, /* SPS was notified of enty */
/*
* If set, we entered one of the JITs and ScriptFrameIter should skip
* this frame.
*/
RUNNING_IN_JIT = 0x20000,
RUNNING_IN_JIT = 0x20000,
/* Miscellaneous state. */
CREATE_SINGLETON = 0x40000 /* Constructed |this| object should be singleton. */
CREATE_SINGLETON = 0x40000, /* Constructed |this| object should be singleton. */
/*
* If set, this frame has been on the stack when
* |js::SavedStacks::saveCurrentStack| was called, and so there is a
* |js::SavedFrame| object cached for this frame.
*/
HAS_CACHED_SAVED_FRAME = 0x80000,
};
private:
@ -898,6 +908,13 @@ class InterpreterFrame
inline void unsetIsDebuggee();
bool hasCachedSavedFrame() const {
return flags_ & HAS_CACHED_SAVED_FRAME;
}
void setHasCachedSavedFrame() {
flags_ |= HAS_CACHED_SAVED_FRAME;
}
public:
void mark(JSTracer* trc);
void markValues(JSTracer* trc, unsigned start, unsigned end);
@ -1720,6 +1737,8 @@ class FrameIter
bool isNonEvalFunctionFrame() const;
bool hasArgs() const { return isNonEvalFunctionFrame(); }
bool hasCachedSavedFrame(JSContext* cx, bool* hasCachedSavedFramep);
ScriptSource* scriptSource() const;
const char* scriptFilename() const;
const char16_t* scriptDisplayURL() const;