Bug 1662366 part 6 - Trace cloned CacheIR stub data. r=iain

Initially the plan was to reuse TraceCacheIRStub but this patch adds the tracing
code for Warp separately because:

* CacheIR stub data in Warp contains nursery indexes. It's nice to keep that out of the IC-tracing code.
* We can use WarpGCPtr similar to other snapshotted GC pointers. It asserts GC things are not moved.

Differential Revision: https://phabricator.services.mozilla.com/D88965
This commit is contained in:
Jan de Mooij 2020-09-02 07:35:15 +00:00
parent 70f4e1f948
commit 287b183550
2 changed files with 71 additions and 4 deletions

View File

@ -226,6 +226,12 @@ struct GCPolicy<jsid> {
return !id.isGCThing() ||
js::gc::IsCellPointerValid(id.toGCCellPtr().asCell());
}
static bool isTenured(jsid id) {
MOZ_ASSERT_IF(id.isGCThing(),
!js::gc::IsInsideNursery(id.toGCCellPtr().asCell()));
return true;
}
};
#ifdef DEBUG

View File

@ -10,6 +10,7 @@
#include <type_traits>
#include "jit/CacheIRCompiler.h"
#include "jit/CacheIRSpewer.h"
#include "vm/GlobalObject.h"
#include "vm/JSContext.h"
@ -195,7 +196,7 @@ void WarpInlinedCall::dumpData(GenericPrinter& out) const {
#endif // JS_JITSPEW
template <typename T>
static void TraceWarpGCPtr(JSTracer* trc, WarpGCPtr<T>& thing,
static void TraceWarpGCPtr(JSTracer* trc, const WarpGCPtr<T>& thing,
const char* name) {
T thingRaw = thing;
TraceManuallyBarrieredEdge(trc, &thingRaw, name);
@ -303,11 +304,71 @@ void WarpBailout::traceData(JSTracer* trc) {
// No GC pointers.
}
template <typename T>
static void TraceWarpStubPtr(JSTracer* trc, uintptr_t word, const char* name) {
T* ptr = reinterpret_cast<T*>(word);
TraceWarpGCPtr(trc, WarpGCPtr<T*>(ptr), name);
}
void WarpCacheIR::traceData(JSTracer* trc) {
TraceWarpGCPtr(trc, stubCode_, "warp-stub-code");
// TODO: trace pointers in stub data. Beware of nursery indexes in the stub
// data. See WarpObjectField.
if (stubData_) {
uint32_t field = 0;
size_t offset = 0;
while (true) {
StubField::Type fieldType = stubInfo_->fieldType(field);
switch (fieldType) {
case StubField::Type::RawWord:
case StubField::Type::RawInt64:
case StubField::Type::DOMExpandoGeneration:
break;
case StubField::Type::Shape: {
uintptr_t word = stubInfo_->getStubRawWord(stubData_, offset);
TraceWarpStubPtr<Shape>(trc, word, "warp-cacheir-shape");
break;
}
case StubField::Type::ObjectGroup: {
uintptr_t word = stubInfo_->getStubRawWord(stubData_, offset);
TraceWarpStubPtr<ObjectGroup>(trc, word, "warp-cacheir-group");
break;
}
case StubField::Type::JSObject: {
uintptr_t word = stubInfo_->getStubRawWord(stubData_, offset);
WarpObjectField field = WarpObjectField::fromData(word);
if (!field.isNurseryIndex()) {
TraceWarpStubPtr<JSObject>(trc, word, "warp-cacheir-object");
}
break;
}
case StubField::Type::Symbol: {
uintptr_t word = stubInfo_->getStubRawWord(stubData_, offset);
TraceWarpStubPtr<JS::Symbol>(trc, word, "warp-cacheir-symbol");
break;
}
case StubField::Type::String: {
uintptr_t word = stubInfo_->getStubRawWord(stubData_, offset);
TraceWarpStubPtr<JSString>(trc, word, "warp-cacheir-string");
break;
}
case StubField::Type::Id: {
uintptr_t word = stubInfo_->getStubRawWord(stubData_, offset);
jsid id = jsid::fromRawBits(word);
TraceWarpGCPtr(trc, WarpGCPtr<jsid>(id), "warp-cacheir-jsid");
break;
}
case StubField::Type::Value: {
uint64_t data = stubInfo_->getStubRawInt64(stubData_, offset);
Value val = Value::fromRawBits(data);
TraceWarpGCPtr(trc, WarpGCPtr<Value>(val), "warp-cacheir-value");
break;
}
case StubField::Type::Limit:
return; // Done.
}
field++;
offset += StubField::sizeInBytes(fieldType);
}
}
}
void WarpInlinedCall::traceData(JSTracer* trc) {