зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1614622 part 2 - Remove trackedOpts shell function. r=djvj
Differential Revision: https://phabricator.services.mozilla.com/D62426 --HG-- extra : moz-landing-system : lando
This commit is contained in:
Родитель
867af8f744
Коммит
79d45d6fcb
|
@ -7490,274 +7490,6 @@ static void ShutdownBufferStreams() {
|
||||||
state->jobs.clearAndFree();
|
state->jobs.clearAndFree();
|
||||||
}
|
}
|
||||||
|
|
||||||
class SprintOptimizationTypeInfoOp
|
|
||||||
: public JS::ForEachTrackedOptimizationTypeInfoOp {
|
|
||||||
Sprinter* sp;
|
|
||||||
bool startedTypes_;
|
|
||||||
bool hadError_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit SprintOptimizationTypeInfoOp(Sprinter* sp)
|
|
||||||
: sp(sp), startedTypes_(false), hadError_(false) {}
|
|
||||||
|
|
||||||
void readType(const char* keyedBy, const char* name, const char* location,
|
|
||||||
const Maybe<unsigned>& lineno) override {
|
|
||||||
if (hadError_) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
|
||||||
if (!startedTypes_) {
|
|
||||||
startedTypes_ = true;
|
|
||||||
if (!sp->put("{\"typeset\": [")) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sp->jsprintf("{\"keyedBy\":\"%s\"", keyedBy)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name) {
|
|
||||||
if (!sp->jsprintf(",\"name\":\"%s\"", name)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (location) {
|
|
||||||
char buf[512];
|
|
||||||
PutEscapedString(buf, mozilla::ArrayLength(buf), location,
|
|
||||||
strlen(location), '"');
|
|
||||||
if (!sp->jsprintf(",\"location\":%s", buf)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (lineno.isSome()) {
|
|
||||||
if (!sp->jsprintf(",\"line\":%u", *lineno)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!sp->put("},")) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
} while (false);
|
|
||||||
|
|
||||||
hadError_ = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void operator()(JS::TrackedTypeSite site, const char* mirType) override {
|
|
||||||
if (hadError_) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
|
||||||
if (startedTypes_) {
|
|
||||||
// Clear trailing ,
|
|
||||||
if ((*sp)[sp->getOffset() - 1] == ',') {
|
|
||||||
(*sp)[sp->getOffset() - 1] = ' ';
|
|
||||||
}
|
|
||||||
if (!sp->put("],")) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
startedTypes_ = false;
|
|
||||||
} else {
|
|
||||||
if (!sp->put("{")) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sp->jsprintf("\"site\":\"%s\",\"mirType\":\"%s\"},",
|
|
||||||
TrackedTypeSiteString(site), mirType)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
} while (false);
|
|
||||||
|
|
||||||
hadError_ = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool hadError() const { return hadError_; }
|
|
||||||
};
|
|
||||||
|
|
||||||
class SprintOptimizationAttemptsOp
|
|
||||||
: public JS::ForEachTrackedOptimizationAttemptOp {
|
|
||||||
Sprinter* sp;
|
|
||||||
bool hadError_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit SprintOptimizationAttemptsOp(Sprinter* sp)
|
|
||||||
: sp(sp), hadError_(false) {}
|
|
||||||
|
|
||||||
void operator()(JS::TrackedStrategy strategy,
|
|
||||||
JS::TrackedOutcome outcome) override {
|
|
||||||
if (hadError_) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
hadError_ = !sp->jsprintf("{\"strategy\":\"%s\",\"outcome\":\"%s\"},",
|
|
||||||
TrackedStrategyString(strategy),
|
|
||||||
TrackedOutcomeString(outcome));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool hadError() const { return hadError_; }
|
|
||||||
};
|
|
||||||
|
|
||||||
static bool ReflectTrackedOptimizations(JSContext* cx, unsigned argc,
|
|
||||||
Value* vp) {
|
|
||||||
CallArgs args = CallArgsFromVp(argc, vp);
|
|
||||||
RootedObject callee(cx, &args.callee());
|
|
||||||
JSRuntime* rt = cx->runtime();
|
|
||||||
|
|
||||||
if (!rt->hasJitRuntime() ||
|
|
||||||
!rt->jitRuntime()->isOptimizationTrackingEnabled(cx->runtime())) {
|
|
||||||
JS_ReportErrorASCII(cx, "Optimization tracking is off.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.length() != 1) {
|
|
||||||
ReportUsageErrorASCII(cx, callee, "Wrong number of arguments");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!args[0].isObject() || !args[0].toObject().is<JSFunction>()) {
|
|
||||||
ReportUsageErrorASCII(cx, callee, "Argument must be a function");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
RootedFunction fun(cx, &args[0].toObject().as<JSFunction>());
|
|
||||||
if (!fun->hasScript() || !fun->nonLazyScript()->hasIonScript()) {
|
|
||||||
args.rval().setNull();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Suppress GC for the unrooted JitcodeGlobalEntry below.
|
|
||||||
gc::AutoSuppressGC suppress(cx);
|
|
||||||
|
|
||||||
jit::JitcodeGlobalTable* table = rt->jitRuntime()->getJitcodeGlobalTable();
|
|
||||||
jit::IonScript* ion = fun->nonLazyScript()->ionScript();
|
|
||||||
jit::JitcodeGlobalEntry* entry = table->lookup(ion->method()->raw());
|
|
||||||
if (!entry) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!entry->hasTrackedOptimizations()) {
|
|
||||||
JSObject* obj = JS_NewPlainObject(cx);
|
|
||||||
if (!obj) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
args.rval().setObject(*obj);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Sprinter sp(cx);
|
|
||||||
if (!sp.init()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const jit::IonTrackedOptimizationsRegionTable* regions =
|
|
||||||
entry->ionEntry().trackedOptimizationsRegionTable();
|
|
||||||
|
|
||||||
if (!sp.put("{\"regions\": [")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint32_t i = 0; i < regions->numEntries(); i++) {
|
|
||||||
jit::IonTrackedOptimizationsRegion region = regions->entry(i);
|
|
||||||
jit::IonTrackedOptimizationsRegion::RangeIterator iter = region.ranges();
|
|
||||||
while (iter.more()) {
|
|
||||||
uint32_t startOffset, endOffset;
|
|
||||||
uint8_t index;
|
|
||||||
iter.readNext(&startOffset, &endOffset, &index);
|
|
||||||
|
|
||||||
JSScript* script;
|
|
||||||
jsbytecode* pc;
|
|
||||||
// Use endOffset, as startOffset may be associated with a
|
|
||||||
// previous, adjacent region ending exactly at startOffset. That
|
|
||||||
// is, suppose we have two regions [0, startOffset], [startOffset,
|
|
||||||
// endOffset]. Since we are not querying a return address, we want
|
|
||||||
// the second region and not the first.
|
|
||||||
uint8_t* addr = ion->method()->raw() + endOffset;
|
|
||||||
entry->youngestFrameLocationAtAddr(rt, addr, &script, &pc);
|
|
||||||
|
|
||||||
if (!sp.jsprintf("{\"location\":\"%s:%u\",\"offset\":%zu,\"index\":%u}%s",
|
|
||||||
script->filename(), script->lineno(),
|
|
||||||
script->pcToOffset(pc), index, iter.more() ? "," : "")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sp.put("],")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sp.put("\"opts\": [")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint8_t i = 0; i < entry->ionEntry().numOptimizationAttempts(); i++) {
|
|
||||||
if (!sp.jsprintf("%s{\"typeinfo\":[", i == 0 ? "" : ",")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
SprintOptimizationTypeInfoOp top(&sp);
|
|
||||||
jit::IonTrackedOptimizationsTypeInfo::ForEachOpAdapter adapter(top);
|
|
||||||
entry->trackedOptimizationTypeInfo(i).forEach(adapter,
|
|
||||||
entry->allTrackedTypes());
|
|
||||||
if (top.hadError()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clear the trailing ,
|
|
||||||
if (sp[sp.getOffset() - 1] == ',') {
|
|
||||||
sp[sp.getOffset() - 1] = ' ';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sp.put("],\"attempts\":[")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
SprintOptimizationAttemptsOp aop(&sp);
|
|
||||||
entry->trackedOptimizationAttempts(i).forEach(aop);
|
|
||||||
if (aop.hadError()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clear the trailing ,
|
|
||||||
if (sp[sp.getOffset() - 1] == ',') {
|
|
||||||
sp[sp.getOffset() - 1] = ' ';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sp.put("]}")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sp.put("]}")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sp.hadOutOfMemory()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
RootedString str(cx, JS_NewStringCopyZ(cx, sp.string()));
|
|
||||||
if (!str) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
RootedValue jsonVal(cx);
|
|
||||||
if (!JS_ParseJSON(cx, str, &jsonVal)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
args.rval().set(jsonVal);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool DumpScopeChain(JSContext* cx, unsigned argc, Value* vp) {
|
static bool DumpScopeChain(JSContext* cx, unsigned argc, Value* vp) {
|
||||||
CallArgs args = CallArgsFromVp(argc, vp);
|
CallArgs args = CallArgsFromVp(argc, vp);
|
||||||
RootedObject callee(cx, &args.callee());
|
RootedObject callee(cx, &args.callee());
|
||||||
|
@ -9282,12 +9014,6 @@ TestAssertRecoveredOnBailout,
|
||||||
" might be asked for the source code of compilations that |fun|\n"
|
" might be asked for the source code of compilations that |fun|\n"
|
||||||
" performed, and which, presumably, only |hook| knows how to find.\n"),
|
" performed, and which, presumably, only |hook| knows how to find.\n"),
|
||||||
|
|
||||||
JS_FN_HELP("trackedOpts", ReflectTrackedOptimizations, 1, 0,
|
|
||||||
"trackedOpts(fun)",
|
|
||||||
" Returns an object describing the tracked optimizations of |fun|, if\n"
|
|
||||||
" any. If |fun| is not a scripted function or has not been compiled by\n"
|
|
||||||
" Ion, null is returned."),
|
|
||||||
|
|
||||||
JS_FN_HELP("crash", Crash, 0, 0,
|
JS_FN_HELP("crash", Crash, 0, 0,
|
||||||
"crash([message, [{disable_minidump:true}]])",
|
"crash([message, [{disable_minidump:true}]])",
|
||||||
" Crashes the process with a MOZ_CRASH, optionally providing a message.\n"
|
" Crashes the process with a MOZ_CRASH, optionally providing a message.\n"
|
||||||
|
|
Загрузка…
Ссылка в новой задаче