From 784a55a15ddc65b59cc4709e54453238438eae48 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Tue, 9 Oct 2018 14:58:01 +0200 Subject: V4: Collect trace information in the interpreter Collect type information about values used in a function. These include all parameters, and the results of many bytecode instructions. For array loads/stores, it also tracks if the access is in-bounds of a SimpleArrayData. Collection is only enabled when the qml-tracing feature is turned on while configuring. In subsequent patches this is used to generated optimized JITted code. Change-Id: I63985c334c3fdc55fca7fb4addfe3e535989aac5 Reviewed-by: Ulf Hermann --- src/qml/jit/qv4assemblercommon.cpp | 13 +++++++++ src/qml/jit/qv4assemblercommon_p.h | 3 +- src/qml/jit/qv4baselineassembler.cpp | 5 ++++ src/qml/jit/qv4baselineassembler_p.h | 1 + src/qml/jit/qv4baselinejit.cpp | 56 ++++++++++++++++++------------------ src/qml/jit/qv4baselinejit_p.h | 56 ++++++++++++++++++------------------ 6 files changed, 77 insertions(+), 57 deletions(-) (limited to 'src/qml/jit') diff --git a/src/qml/jit/qv4assemblercommon.cpp b/src/qml/jit/qv4assemblercommon.cpp index 35b8f34633..d5d97f8284 100644 --- a/src/qml/jit/qv4assemblercommon.cpp +++ b/src/qml/jit/qv4assemblercommon.cpp @@ -298,6 +298,19 @@ void PlatformAssemblerCommon::passInt32AsArg(int value, int arg) store32(TrustedImm32(value), argStackAddress(arg)); } +void JIT::PlatformAssemblerCommon::passPointerAsArg(void *ptr, int arg) +{ +#ifndef QT_NO_DEBUG + Q_ASSERT(arg < remainingArgcForCall); + --remainingArgcForCall; +#endif + + if (arg < ArgInRegCount) + move(TrustedImmPtr(ptr), registerForArg(arg)); + else + storePtr(TrustedImmPtr(ptr), argStackAddress(arg)); +} + void PlatformAssemblerCommon::callRuntime(const char *functionName, const void *funcPtr) { #ifndef QT_NO_DEBUG diff --git a/src/qml/jit/qv4assemblercommon_p.h b/src/qml/jit/qv4assemblercommon_p.h index c17fdd3a23..8f4d3238c4 100644 --- a/src/qml/jit/qv4assemblercommon_p.h +++ b/src/qml/jit/qv4assemblercommon_p.h @@ -587,7 +587,7 @@ public: Address loadCompilationUnitPtr(RegisterID target) { Address addr = loadFunctionPtr(target); - addr.offset = offsetof(QV4::Function, compilationUnit); + addr.offset = offsetof(QV4::FunctionData, compilationUnit); loadPtr(addr, target); return Address(target); } @@ -699,6 +699,7 @@ public: void passAddressAsArg(Address addr, int arg); void passCppFrameAsArg(int arg); void passInt32AsArg(int value, int arg); + void passPointerAsArg(void *ptr, int arg); void callRuntime(const char *functionName, const void *funcPtr); void callRuntimeUnchecked(const char *functionName, const void *funcPtr); void tailCallRuntime(const char *functionName, const void *funcPtr); diff --git a/src/qml/jit/qv4baselineassembler.cpp b/src/qml/jit/qv4baselineassembler.cpp index 5c08c42977..9663754cbf 100644 --- a/src/qml/jit/qv4baselineassembler.cpp +++ b/src/qml/jit/qv4baselineassembler.cpp @@ -1458,6 +1458,11 @@ void BaselineAssembler::passInt32AsArg(int value, int arg) pasm()->passInt32AsArg(value, arg); } +void BaselineAssembler::passPointerAsArg(void *ptr, int arg) +{ + pasm()->passPointerAsArg(ptr, arg); +} + void BaselineAssembler::callRuntime(const char *functionName, const void *funcPtr, CallResultDestination dest) { pasm()->callRuntime(functionName, funcPtr, dest); diff --git a/src/qml/jit/qv4baselineassembler_p.h b/src/qml/jit/qv4baselineassembler_p.h index 0aa508ae71..dbefa42784 100644 --- a/src/qml/jit/qv4baselineassembler_p.h +++ b/src/qml/jit/qv4baselineassembler_p.h @@ -150,6 +150,7 @@ public: void passJSSlotAsArg(int reg, int arg); void passCppFrameAsArg(int arg); void passInt32AsArg(int value, int arg); + void passPointerAsArg(void *ptr, int arg); void callRuntime(const char *functionName, const void *funcPtr, CallResultDestination dest); void saveAccumulatorInFrame(); void jsTailCall(int func, int thisObject, int argc, int argv); diff --git a/src/qml/jit/qv4baselinejit.cpp b/src/qml/jit/qv4baselinejit.cpp index 098bbfc6c6..ed4cdabd26 100644 --- a/src/qml/jit/qv4baselinejit.cpp +++ b/src/qml/jit/qv4baselinejit.cpp @@ -149,7 +149,7 @@ void BaselineJIT::generate_LoadImport(int index) as->loadImport(index); } -void BaselineJIT::generate_LoadLocal(int index) +void BaselineJIT::generate_LoadLocal(int index, int /*traceSlot*/) { as->loadLocal(index); } @@ -160,7 +160,7 @@ void BaselineJIT::generate_StoreLocal(int index) as->storeLocal(index); } -void BaselineJIT::generate_LoadScopedLocal(int scope, int index) +void BaselineJIT::generate_LoadScopedLocal(int scope, int index, int /*traceSlot*/) { as->loadLocal(index, scope); } @@ -193,7 +193,7 @@ void BaselineJIT::generate_LoadClosure(int value) BASELINEJIT_GENERATE_RUNTIME_CALL(Runtime::method_closure, CallResultDestination::InAccumulator); } -void BaselineJIT::generate_LoadName(int name) +void BaselineJIT::generate_LoadName(int name, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(2); @@ -203,7 +203,7 @@ void BaselineJIT::generate_LoadName(int name) as->checkException(); } -void BaselineJIT::generate_LoadGlobalLookup(int index) +void BaselineJIT::generate_LoadGlobalLookup(int index, int /*traceSlot*/) { as->prepareCallWithArgCount(3); as->passInt32AsArg(index, 2); @@ -237,7 +237,7 @@ void BaselineJIT::generate_StoreNameStrict(int name) as->checkException(); } -void BaselineJIT::generate_LoadElement(int base) +void BaselineJIT::generate_LoadElement(int base, int /*traceSlot*/) { STORE_IP(); STORE_ACC(); @@ -249,7 +249,7 @@ void BaselineJIT::generate_LoadElement(int base) as->checkException(); } -void BaselineJIT::generate_StoreElement(int base, int index) +void BaselineJIT::generate_StoreElement(int base, int index, int /*traceSlot*/) { STORE_IP(); STORE_ACC(); @@ -262,7 +262,7 @@ void BaselineJIT::generate_StoreElement(int base, int index) as->checkException(); } -void BaselineJIT::generate_LoadProperty(int name) +void BaselineJIT::generate_LoadProperty(int name, int /*traceSlot*/) { STORE_IP(); STORE_ACC(); @@ -274,7 +274,7 @@ void BaselineJIT::generate_LoadProperty(int name) as->checkException(); } -void BaselineJIT::generate_GetLookup(int index) +void BaselineJIT::generate_GetLookup(int index, int /*traceSlot*/) { STORE_IP(); STORE_ACC(); @@ -415,7 +415,7 @@ void BaselineJIT::generate_Resume(int) Q_UNREACHABLE(); } -void BaselineJIT::generate_CallValue(int name, int argc, int argv) +void BaselineJIT::generate_CallValue(int name, int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(4); @@ -427,7 +427,7 @@ void BaselineJIT::generate_CallValue(int name, int argc, int argv) as->checkException(); } -void BaselineJIT::generate_CallWithReceiver(int name, int thisObject, int argc, int argv) +void BaselineJIT::generate_CallWithReceiver(int name, int thisObject, int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(5); @@ -440,7 +440,7 @@ void BaselineJIT::generate_CallWithReceiver(int name, int thisObject, int argc, as->checkException(); } -void BaselineJIT::generate_CallProperty(int name, int base, int argc, int argv) +void BaselineJIT::generate_CallProperty(int name, int base, int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(5); @@ -453,7 +453,7 @@ void BaselineJIT::generate_CallProperty(int name, int base, int argc, int argv) as->checkException(); } -void BaselineJIT::generate_CallPropertyLookup(int lookupIndex, int base, int argc, int argv) +void BaselineJIT::generate_CallPropertyLookup(int lookupIndex, int base, int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(5); @@ -466,7 +466,7 @@ void BaselineJIT::generate_CallPropertyLookup(int lookupIndex, int base, int arg as->checkException(); } -void BaselineJIT::generate_CallElement(int base, int index, int argc, int argv) +void BaselineJIT::generate_CallElement(int base, int index, int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(5); @@ -479,7 +479,7 @@ void BaselineJIT::generate_CallElement(int base, int index, int argc, int argv) as->checkException(); } -void BaselineJIT::generate_CallName(int name, int argc, int argv) +void BaselineJIT::generate_CallName(int name, int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(4); @@ -491,7 +491,7 @@ void BaselineJIT::generate_CallName(int name, int argc, int argv) as->checkException(); } -void BaselineJIT::generate_CallPossiblyDirectEval(int argc, int argv) +void BaselineJIT::generate_CallPossiblyDirectEval(int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(3); @@ -502,7 +502,7 @@ void BaselineJIT::generate_CallPossiblyDirectEval(int argc, int argv) as->checkException(); } -void BaselineJIT::generate_CallGlobalLookup(int index, int argc, int argv) +void BaselineJIT::generate_CallGlobalLookup(int index, int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(4); @@ -514,7 +514,7 @@ void BaselineJIT::generate_CallGlobalLookup(int index, int argc, int argv) as->checkException(); } -void BaselineJIT::generate_CallScopeObjectProperty(int propIdx, int base, int argc, int argv) +void BaselineJIT::generate_CallScopeObjectProperty(int propIdx, int base, int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(5); @@ -527,7 +527,7 @@ void BaselineJIT::generate_CallScopeObjectProperty(int propIdx, int base, int ar as->checkException(); } -void BaselineJIT::generate_CallContextObjectProperty(int propIdx, int base, int argc, int argv) +void BaselineJIT::generate_CallContextObjectProperty(int propIdx, int base, int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(5); @@ -541,7 +541,7 @@ void BaselineJIT::generate_CallContextObjectProperty(int propIdx, int base, int } -void BaselineJIT::generate_CallWithSpread(int func, int thisObject, int argc, int argv) +void BaselineJIT::generate_CallWithSpread(int func, int thisObject, int argc, int argv, int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(5); @@ -871,8 +871,8 @@ void BaselineJIT::generate_ToObject() } void BaselineJIT::generate_Jump(int offset) { as->jump(absoluteOffsetForJump(offset)); } -void BaselineJIT::generate_JumpTrue(int offset) { as->jumpTrue(absoluteOffsetForJump(offset)); } -void BaselineJIT::generate_JumpFalse(int offset) { as->jumpFalse(absoluteOffsetForJump(offset)); } +void BaselineJIT::generate_JumpTrue(int /*traceSlot*/, int offset) { as->jumpTrue(absoluteOffsetForJump(offset)); } +void BaselineJIT::generate_JumpFalse(int /*traceSlot*/, int offset) { as->jumpFalse(absoluteOffsetForJump(offset)); } void BaselineJIT::generate_JumpNoException(int offset) { as->jumpNoException(absoluteOffsetForJump(offset)); } void BaselineJIT::generate_JumpNotUndefined(int offset) { as->jumpNotUndefined(absoluteOffsetForJump(offset)); } @@ -913,11 +913,11 @@ void BaselineJIT::generate_CmpInstanceOf(int lhs) void BaselineJIT::generate_UNot() { as->unot(); } void BaselineJIT::generate_UPlus() { as->toNumber(); } -void BaselineJIT::generate_UMinus() { as->uminus(); } +void BaselineJIT::generate_UMinus(int /*traceSlot*/) { as->uminus(); } void BaselineJIT::generate_UCompl() { as->ucompl(); } -void BaselineJIT::generate_Increment() { as->inc(); } -void BaselineJIT::generate_Decrement() { as->dec(); } -void BaselineJIT::generate_Add(int lhs) { as->add(lhs); } +void BaselineJIT::generate_Increment(int /*traceSlot*/) { as->inc(); } +void BaselineJIT::generate_Decrement(int /*traceSlot*/) { as->dec(); } +void BaselineJIT::generate_Add(int lhs, int /*traceSlot*/) { as->add(lhs); } void BaselineJIT::generate_BitAnd(int lhs) { as->bitAnd(lhs); } void BaselineJIT::generate_BitOr(int lhs) { as->bitOr(lhs); } @@ -942,10 +942,10 @@ void BaselineJIT::generate_Exp(int lhs) { BASELINEJIT_GENERATE_RUNTIME_CALL(Helpers::exp, CallResultDestination::InAccumulator); as->checkException(); } -void BaselineJIT::generate_Mul(int lhs) { as->mul(lhs); } +void BaselineJIT::generate_Mul(int lhs, int /*traceSlot*/) { as->mul(lhs); } void BaselineJIT::generate_Div(int lhs) { as->div(lhs); } -void BaselineJIT::generate_Mod(int lhs) { as->mod(lhs); } -void BaselineJIT::generate_Sub(int lhs) { as->sub(lhs); } +void BaselineJIT::generate_Mod(int lhs, int /*traceSlot*/) { as->mod(lhs); } +void BaselineJIT::generate_Sub(int lhs, int /*traceSlot*/) { as->sub(lhs); } //void BaselineJIT::generate_BinopContext(int alu, int lhs) //{ diff --git a/src/qml/jit/qv4baselinejit_p.h b/src/qml/jit/qv4baselinejit_p.h index 98d23f4517..9e7dd8f2ca 100644 --- a/src/qml/jit/qv4baselinejit_p.h +++ b/src/qml/jit/qv4baselinejit_p.h @@ -88,21 +88,21 @@ public: void generate_StoreReg(int reg) override; void generate_MoveReg(int srcReg, int destReg) override; void generate_LoadImport(int index) override; - void generate_LoadLocal(int index) override; + void generate_LoadLocal(int index, int traceSlot) override; void generate_StoreLocal(int index) override; - void generate_LoadScopedLocal(int scope, int index) override; + void generate_LoadScopedLocal(int scope, int index, int traceSlot) override; void generate_StoreScopedLocal(int scope, int index) override; void generate_LoadRuntimeString(int stringId) override; void generate_MoveRegExp(int regExpId, int destReg) override; void generate_LoadClosure(int value) override; - void generate_LoadName(int name) override; - void generate_LoadGlobalLookup(int index) override; + void generate_LoadName(int name, int traceSlot) override; + void generate_LoadGlobalLookup(int index, int traceSlot) override; void generate_StoreNameSloppy(int name) override; void generate_StoreNameStrict(int name) override; - void generate_LoadElement(int base) override; - void generate_StoreElement(int base, int index) override; - void generate_LoadProperty(int name) override; - void generate_GetLookup(int index) override; + void generate_LoadElement(int base, int traceSlot) override; + void generate_StoreElement(int base, int index, int traceSlot) override; + void generate_LoadProperty(int name, int traceSlot) override; + void generate_GetLookup(int index, int traceSlot) override; void generate_StoreProperty(int name, int base) override; void generate_SetLookup(int index, int base) override; void generate_LoadSuperProperty(int property) override; @@ -120,17 +120,17 @@ public: void generate_YieldStar() override; void generate_Resume(int) override; - void generate_CallValue(int name, int argc, int argv) override; - void generate_CallWithReceiver(int name, int thisObject, int argc, int argv) override; - void generate_CallProperty(int name, int base, int argc, int argv) override; - void generate_CallPropertyLookup(int lookupIndex, int base, int argc, int argv) override; - void generate_CallElement(int base, int index, int argc, int argv) override; - void generate_CallName(int name, int argc, int argv) override; - void generate_CallPossiblyDirectEval(int argc, int argv) override; - void generate_CallGlobalLookup(int index, int argc, int argv) override; - void generate_CallScopeObjectProperty(int propIdx, int base, int argc, int argv) override; - void generate_CallContextObjectProperty(int propIdx, int base, int argc, int argv) override; - void generate_CallWithSpread(int func, int thisObject, int argc, int argv) override; + void generate_CallValue(int name, int argc, int argv, int traceSlot) override; + void generate_CallWithReceiver(int name, int thisObject, int argc, int argv, int traceSlot) override; + void generate_CallProperty(int name, int base, int argc, int argv, int traceSlot) override; + void generate_CallPropertyLookup(int lookupIndex, int base, int argc, int argv, int traceSlot) override; + void generate_CallElement(int base, int index, int argc, int argv, int traceSlot) override; + void generate_CallName(int name, int argc, int argv, int traceSlot) override; + void generate_CallPossiblyDirectEval(int argc, int argv, int traceSlot) override; + void generate_CallGlobalLookup(int index, int argc, int argv, int traceSlot) override; + void generate_CallScopeObjectProperty(int propIdx, int base, int argc, int argv, int traceSlot) override; + void generate_CallContextObjectProperty(int propIdx, int base, int argc, int argv, int traceSlot) override; + void generate_CallWithSpread(int func, int thisObject, int argc, int argv, int traceSlot) override; void generate_TailCall(int func, int thisObject, int argc, int argv) override; void generate_Construct(int func, int argc, int argv) override; void generate_ConstructWithSpread(int func, int argc, int argv) override; @@ -169,8 +169,8 @@ public: void generate_LoadSuperConstructor() override; void generate_ToObject() override; void generate_Jump(int offset) override; - void generate_JumpTrue(int offset) override; - void generate_JumpFalse(int offset) override; + void generate_JumpTrue(int traceSlot, int offset) override; + void generate_JumpFalse(int traceSlot, int offset) override; void generate_JumpNoException(int offset) override; void generate_JumpNotUndefined(int offset) override; void generate_CmpEqNull() override; @@ -189,11 +189,11 @@ public: void generate_CmpInstanceOf(int lhs) override; void generate_UNot() override; void generate_UPlus() override; - void generate_UMinus() override; + void generate_UMinus(int traceSlot) override; void generate_UCompl() override; - void generate_Increment() override; - void generate_Decrement() override; - void generate_Add(int lhs) override; + void generate_Increment(int traceSlot) override; + void generate_Decrement(int traceSlot) override; + void generate_Add(int lhs, int traceSlot) override; void generate_BitAnd(int lhs) override; void generate_BitOr(int lhs) override; void generate_BitXor(int lhs) override; @@ -207,10 +207,10 @@ public: void generate_ShrConst(int rhs) override; void generate_ShlConst(int rhs) override; void generate_Exp(int lhs) override; - void generate_Mul(int lhs) override; + void generate_Mul(int lhs, int traceSlot) override; void generate_Div(int lhs) override; - void generate_Mod(int lhs) override; - void generate_Sub(int lhs) override; + void generate_Mod(int lhs, int traceSlot) override; + void generate_Sub(int lhs, int traceSlot) override; void generate_LoadQmlContext(int result) override; void generate_LoadQmlImportedScripts(int result) override; void generate_InitializeBlockDeadTemporalZone(int firstReg, int count) override; -- cgit v1.2.3