diff options
Diffstat (limited to 'src/qml/jit')
-rw-r--r-- | src/qml/jit/qv4assemblercommon.cpp | 66 | ||||
-rw-r--r-- | src/qml/jit/qv4assemblercommon_p.h | 6 | ||||
-rw-r--r-- | src/qml/jit/qv4baselineassembler.cpp | 26 | ||||
-rw-r--r-- | src/qml/jit/qv4baselineassembler_p.h | 15 | ||||
-rw-r--r-- | src/qml/jit/qv4baselinejit.cpp | 92 | ||||
-rw-r--r-- | src/qml/jit/qv4baselinejit_p.h | 65 |
6 files changed, 144 insertions, 126 deletions
diff --git a/src/qml/jit/qv4assemblercommon.cpp b/src/qml/jit/qv4assemblercommon.cpp index 831496a628..dd810d9d70 100644 --- a/src/qml/jit/qv4assemblercommon.cpp +++ b/src/qml/jit/qv4assemblercommon.cpp @@ -39,10 +39,12 @@ #include <QBuffer> #include <QFile> +#include <QLoggingCategory> #include "qv4engine_p.h" #include "qv4assemblercommon_p.h" #include <private/qv4function_p.h> +#include <private/qv4functiontable_p.h> #include <private/qv4runtime_p.h> #include <assembler/MacroAssemblerCodeRef.h> @@ -57,6 +59,8 @@ QT_BEGIN_NAMESPACE namespace QV4 { namespace JIT { +Q_LOGGING_CATEGORY(lcAsm, "qt.v4.asm") + namespace { class QIODevicePrintStream: public FilePrintStream { @@ -109,18 +113,9 @@ static void printDisassembledOutputWithCalls(QByteArray processedOutput, } } - qDebug("%s", processedOutput.constData()); -} - -static QByteArray functionName(Function *function) -{ - QByteArray name = function->name()->toQString().toUtf8(); - if (name.isEmpty()) { - name = QByteArray::number(reinterpret_cast<quintptr>(function), 16); - name.prepend("QV4::Function(0x"); - name.append(')'); - } - return name; + auto lines = processedOutput.split('\n'); + for (const auto &line : lines) + qCDebug(lcAsm, "%s", line.constData()); } JIT::PlatformAssemblerCommon::~PlatformAssemblerCommon() @@ -141,13 +136,15 @@ void PlatformAssemblerCommon::link(Function *function, const char *jitKind) JSC::MacroAssemblerCodeRef codeRef; - static const bool showCode = qEnvironmentVariableIsSet("QV4_SHOW_ASM"); + static const bool showCode = lcAsm().isDebugEnabled(); if (showCode) { QBuffer buf; buf.open(QIODevice::WriteOnly); WTF::setDataFile(new QIODevicePrintStream(&buf)); - QByteArray name = functionName(function); + // We use debugAddress here because it's actually for debugging and hidden behind an + // environment variable. + const QByteArray name = Function::prettyName(function, linkBuffer.debugAddress()).toUtf8(); codeRef = linkBuffer.finalizeCodeWithDisassembly(jitKind, "function %s", name.constData()); WTF::setDataFile(stderr); @@ -159,31 +156,9 @@ void PlatformAssemblerCommon::link(Function *function, const char *jitKind) function->codeRef = new JSC::MacroAssemblerCodeRef(codeRef); function->jittedCode = reinterpret_cast<Function::JittedCode>(function->codeRef->code().executableAddress()); - // This implements writing of JIT'd addresses so that perf can find the - // symbol names. - // - // Perf expects the mapping to be in a certain place and have certain - // content, for more information, see: - // https://github.com/torvalds/linux/blob/master/tools/perf/Documentation/jit-interface.txt - static bool doProfile = !qEnvironmentVariableIsEmpty("QV4_PROFILE_WRITE_PERF_MAP"); - if (Q_UNLIKELY(doProfile)) { - static QFile perfMapFile(QString::fromLatin1("/tmp/perf-%1.map") - .arg(QCoreApplication::applicationPid())); - static const bool isOpen = perfMapFile.open(QIODevice::WriteOnly); - if (!isOpen) { - qWarning("QV4::JIT::Assembler: Cannot write perf map file."); - doProfile = false; - } else { - perfMapFile.write(QByteArray::number(reinterpret_cast<quintptr>( - codeRef.code().executableAddress()), 16)); - perfMapFile.putChar(' '); - perfMapFile.write(QByteArray::number(static_cast<qsizetype>(codeRef.size()), 16)); - perfMapFile.putChar(' '); - perfMapFile.write(functionName(function)); - perfMapFile.putChar('\n'); - perfMapFile.flush(); - } - } + generateFunctionTable(function, &codeRef); + + linkBuffer.makeExecutable(); } void PlatformAssemblerCommon::prepareCallWithArgCount(int argc) @@ -316,6 +291,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 729d0fc53d..d3d7eedae2 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); } @@ -670,7 +670,8 @@ public: void addLabelForOffset(int offset) { - labelForOffset.insert(offset, label()); + if (!labelForOffset.contains(offset)) + labelForOffset.insert(offset, label()); } void addJumpToOffset(const Jump &jump, int offset) @@ -699,6 +700,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 b13f646360..25c74e74e8 100644 --- a/src/qml/jit/qv4baselineassembler.cpp +++ b/src/qml/jit/qv4baselineassembler.cpp @@ -1382,28 +1382,31 @@ void BaselineAssembler::cmpStrictNotEqual(int lhs) pasm()->setAccumulatorTag(QV4::Value::ValueTypeInternal::Boolean); } -void BaselineAssembler::jump(int offset) +int BaselineAssembler::jump(int offset) { pasm()->addJumpToOffset(pasm()->jump(), offset); + return offset; } -void BaselineAssembler::jumpTrue(int offset) +int BaselineAssembler::jumpTrue(int offset) { pasm()->toBoolean([this, offset](PlatformAssembler::RegisterID resultReg) { auto jump = pasm()->branch32(PlatformAssembler::NotEqual, TrustedImm32(0), resultReg); pasm()->addJumpToOffset(jump, offset); }); + return offset; } -void BaselineAssembler::jumpFalse(int offset) +int BaselineAssembler::jumpFalse(int offset) { pasm()->toBoolean([this, offset](PlatformAssembler::RegisterID resultReg) { auto jump = pasm()->branch32(PlatformAssembler::Equal, TrustedImm32(0), resultReg); pasm()->addJumpToOffset(jump, offset); }); + return offset; } -void BaselineAssembler::jumpNoException(int offset) +int BaselineAssembler::jumpNoException(int offset) { auto jump = pasm()->branch32( PlatformAssembler::Equal, @@ -1411,11 +1414,13 @@ void BaselineAssembler::jumpNoException(int offset) offsetof(EngineBase, hasException)), TrustedImm32(0)); pasm()->addJumpToOffset(jump, offset); + return offset; } -void BaselineAssembler::jumpNotUndefined(int offset) +int BaselineAssembler::jumpNotUndefined(int offset) { pasm()->jumpNotUndefined(offset); + return offset; } void BaselineAssembler::prepareCallWithArgCount(int argc) @@ -1458,6 +1463,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); @@ -1534,10 +1544,11 @@ void BaselineAssembler::setException() noException.link(pasm()); } -void BaselineAssembler::setUnwindHandler(int offset) +int BaselineAssembler::setUnwindHandler(int offset) { auto l = pasm()->storePtrWithPatch(TrustedImmPtr(nullptr), pasm()->exceptionHandlerAddress()); pasm()->addEHTarget(l, offset); + return offset; } @@ -1563,12 +1574,13 @@ void JIT::BaselineAssembler::unwindDispatch() noUnwind.link(pasm()); } -void JIT::BaselineAssembler::unwindToLabel(int level, int offset) +int JIT::BaselineAssembler::unwindToLabel(int level, int offset) { auto l = pasm()->storePtrWithPatch(TrustedImmPtr(nullptr), Address(PlatformAssembler::CppStackFrameRegister, offsetof(CppStackFrame, unwindLabel))); pasm()->addEHTarget(l, offset); pasm()->store32(TrustedImm32(level), Address(PlatformAssembler::CppStackFrameRegister, offsetof(CppStackFrame, unwindLevel))); gotoCatchException(); + return offset; } void BaselineAssembler::pushCatchContext(int index, int name) diff --git a/src/qml/jit/qv4baselineassembler_p.h b/src/qml/jit/qv4baselineassembler_p.h index 0aa508ae71..c39d002bf9 100644 --- a/src/qml/jit/qv4baselineassembler_p.h +++ b/src/qml/jit/qv4baselineassembler_p.h @@ -135,11 +135,11 @@ public: void cmpStrictNotEqual(int lhs); // jumps - void jump(int offset); - void jumpTrue(int offset); - void jumpFalse(int offset); - void jumpNoException(int offset); - void jumpNotUndefined(int offset); + Q_REQUIRED_RESULT int jump(int offset); + Q_REQUIRED_RESULT int jumpTrue(int offset); + Q_REQUIRED_RESULT int jumpFalse(int offset); + Q_REQUIRED_RESULT int jumpNoException(int offset); + Q_REQUIRED_RESULT int jumpNotUndefined(int offset); // stuff for runtime calls void prepareCallWithArgCount(int argc); @@ -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); @@ -159,10 +160,10 @@ public: void gotoCatchException(); void getException(); void setException(); - void setUnwindHandler(int offset); + Q_REQUIRED_RESULT int setUnwindHandler(int offset); void clearUnwindHandler(); void unwindDispatch(); - void unwindToLabel(int level, int offset); + Q_REQUIRED_RESULT int unwindToLabel(int level, int offset); void pushCatchContext(int index, int name); void popContext(); void deadTemporalZoneCheck(int offsetForSavedIP, int variableName); diff --git a/src/qml/jit/qv4baselinejit.cpp b/src/qml/jit/qv4baselinejit.cpp index 1e4288e3c9..e518fc5a0e 100644 --- a/src/qml/jit/qv4baselinejit.cpp +++ b/src/qml/jit/qv4baselinejit.cpp @@ -63,7 +63,9 @@ void BaselineJIT::generate() // qDebug()<<"jitting" << function->name()->toQString(); const char *code = function->codeData; uint len = function->compiledFunction->codeSize; - labels = collectLabelsInBytecode(code, len); + + for (unsigned i = 0, ei = function->compiledFunction->nLabelInfos; i != ei; ++i) + labels.insert(int(function->compiledFunction->labelInfoTable()[i])); as->generatePrologue(); decode(code, len); @@ -149,7 +151,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 +162,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 +195,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 +205,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); @@ -213,7 +215,7 @@ void BaselineJIT::generate_LoadGlobalLookup(int index) as->checkException(); } -void BaselineJIT::generate_LoadQmlContextPropertyLookup(int index) +void BaselineJIT::generate_LoadQmlContextPropertyLookup(int index, int /*traceSlot*/) { as->prepareCallWithArgCount(3); as->passInt32AsArg(index, 2); @@ -247,7 +249,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(); @@ -259,7 +261,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(); @@ -272,7 +274,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(); @@ -284,7 +286,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(); @@ -365,7 +367,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); @@ -377,7 +379,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); @@ -390,7 +392,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); @@ -403,7 +405,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); @@ -416,7 +418,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); @@ -429,7 +431,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); @@ -441,7 +443,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); @@ -452,7 +454,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); @@ -464,7 +466,8 @@ void BaselineJIT::generate_CallGlobalLookup(int index, int argc, int argv) as->checkException(); } -void BaselineJIT::generate_CallQmlContextPropertyLookup(int index, int argc, int argv) +void BaselineJIT::generate_CallQmlContextPropertyLookup(int index, int argc, int argv, + int /*traceSlot*/) { STORE_IP(); as->prepareCallWithArgCount(4); @@ -476,7 +479,7 @@ void BaselineJIT::generate_CallQmlContextPropertyLookup(int index, int argc, int as->checkException(); } -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); @@ -526,7 +529,7 @@ void BaselineJIT::generate_ConstructWithSpread(int func, int argc, int argv) void BaselineJIT::generate_SetUnwindHandler(int offset) { if (offset) - as->setUnwindHandler(absoluteOffsetForJump(offset)); + labels.insert(as->setUnwindHandler(absoluteOffset(offset))); else as->clearUnwindHandler(); } @@ -538,7 +541,7 @@ void BaselineJIT::generate_UnwindDispatch() void BaselineJIT::generate_UnwindToLabel(int level, int offset) { - as->unwindToLabel(level, absoluteOffsetForJump(offset)); + labels.insert(as->unwindToLabel(level, absoluteOffset(offset))); } void BaselineJIT::generate_DeadTemporalZoneCheck(int name) @@ -805,11 +808,30 @@ 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_JumpNoException(int offset) { as->jumpNoException(absoluteOffsetForJump(offset)); } -void BaselineJIT::generate_JumpNotUndefined(int offset) { as->jumpNotUndefined(absoluteOffsetForJump(offset)); } +void BaselineJIT::generate_Jump(int offset) +{ + labels.insert(as->jump(absoluteOffset(offset))); +} + +void BaselineJIT::generate_JumpTrue(int /*traceSlot*/, int offset) +{ + labels.insert(as->jumpTrue(absoluteOffset(offset))); +} + +void BaselineJIT::generate_JumpFalse(int /*traceSlot*/, int offset) +{ + labels.insert(as->jumpFalse(absoluteOffset(offset))); +} + +void BaselineJIT::generate_JumpNoException(int offset) +{ + labels.insert(as->jumpNoException(absoluteOffset(offset))); +} + +void BaselineJIT::generate_JumpNotUndefined(int offset) +{ + labels.insert(as->jumpNotUndefined(absoluteOffset(offset))); +} void BaselineJIT::generate_CmpEqNull() { as->cmpeqNull(); } void BaselineJIT::generate_CmpNeNull() { as->cmpneNull(); } @@ -848,11 +870,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); } @@ -877,10 +899,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) //{ @@ -923,7 +945,7 @@ void BaselineJIT::generate_GetTemplateObject(int index) void BaselineJIT::startInstruction(Instr::Type /*instr*/) { - if (hasLabel()) + if (labels.contains(currentInstructionOffset())) as->addLabel(currentInstructionOffset()); } diff --git a/src/qml/jit/qv4baselinejit_p.h b/src/qml/jit/qv4baselinejit_p.h index 6646eb713e..10c89bc74b 100644 --- a/src/qml/jit/qv4baselinejit_p.h +++ b/src/qml/jit/qv4baselinejit_p.h @@ -88,22 +88,22 @@ 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_LoadQmlContextPropertyLookup(int index) override; + void generate_LoadName(int name, int traceSlot) override; + void generate_LoadGlobalLookup(int index, int traceSlot) override; + void generate_LoadQmlContextPropertyLookup(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; @@ -112,16 +112,16 @@ 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_CallQmlContextPropertyLookup(int index, 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_CallQmlContextPropertyLookup(int index, 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; @@ -160,8 +160,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; @@ -180,11 +180,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; @@ -198,10 +198,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_InitializeBlockDeadTemporalZone(int firstReg, int count) override; void generate_ThrowOnNullOrUndefined() override; void generate_GetTemplateObject(int index) override; @@ -209,17 +209,10 @@ public: void startInstruction(Moth::Instr::Type instr) override; void endInstruction(Moth::Instr::Type instr) override; -protected: - bool hasLabel() const - { return std::find(labels.cbegin(), labels.cend(), currentInstructionOffset()) != labels.cend(); } - - int absoluteOffsetForJump(int relativeOffset) const - { return nextInstructionOffset() + relativeOffset; } - private: QV4::Function *function; QScopedPointer<BaselineAssembler> as; - std::vector<int> labels; + QSet<int> labels; }; #endif // V4_ENABLE_JIT |