mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-19 16:25:38 +00:00
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:
parent
70f4e1f948
commit
287b183550
@ -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
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user