aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/compiler/qv4instr_moth_p.h
Commit message (Collapse)AuthorAgeFilesLines
* Fix lookup of enums declared in QML singletonsSimon Hausmann2018-03-161-4/+2
| | | | | | | | | | | | | | | | | | | | | Given the following expression var x = MySingleton.MyEnumValue where MySingleton is a QML (composite) singleton and MyEnumValue comes from a QML declared enum, we had code in place up to (and including) 5.10 to attempt to optimize that expression to a enum constant at compile time. In 5.10 that optimization does not exist anymore. In <= 5.10 we would also skip the optimization under certain circumstances (too many statementes, etc.). The fallback that is in place for handling this at run-time tried to be smart by avoiding the QQmlContextWrapper::get lookup and return straight a reference to the singleton as QObject. That works for regular property lookups, but it fails when trying to look up something like an enum, that isn't a meta-object property. Change-Id: I1819b9d8ae06a3f595e067bf5b018c4065be76bb Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Correctly set this object when calling scope/context functionsErik Verbruggen2018-02-201-0/+4
| | | | | | | | | | | | | When a function is called that is in a QML scope or a QML context, set the 'this' object to the QML scope. This is done by introducing two new interpreter instructions, which get the context passed in. Note: this patch is 5.11 specific. 5.9 had a similair issue, but the implementation is quite different, so that was fixed separately. Task-number: QTBUG-66432 Change-Id: Ie43150cdd26360025895df28d31264985abf1c15 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* Fix build without QML debuggingUlf Hermann2018-01-161-7/+0
| | | | | Change-Id: Ie1b18dd00705b1913572b87c6968a63438e7a90c Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Drop the qml-interpreter featureUlf Hermann2018-01-101-4/+0
| | | | | | | We cannot build QML without interpreter anymore. Change-Id: Ibc51240caa956132eef8753fa6c75939026930d5 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Prospective fix for big endian and AOTSimon Hausmann2018-01-071-1/+3
| | | | | | | | Ensure that the integer arguments for widely encoded instructions are always encoded as little endian. Change-Id: Iccd45aefb20b20d76fe1618d6706435142b202b9 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Fix decoding of bytecode instructions on ARM generated on x86-64Simon Hausmann2018-01-051-8/+8
| | | | | | | | | | | | | | | | | | | | | | | Due to the difference of sign of the char type, byte code is encoded differently on x86-64 than if it was on ARM and it also is decoded differently. The problem at hand here was that negative jumps were encoded as two-byte instructions (opcode and negative offset as byte) on x86-64 when qmlcachegen is run. At run-time the negative offset was read into a char type and consequently interpreted as a positive jump, leading to crashes. The explicit use of qint8 as signed byte type in encoding/decoding sensitive parts avoids the decoding issue and should also result in consistent encoding. The added auto-test is (among other configurations) run in the CI under qemu, which means the x86-64 host-built qmlcachegen will generate byte code and the tst_qmlcachegen ARM binary will run under qemu and reproduce this scenario. Task-number: QTBUG-65521 Change-Id: I615628f53475dad38a41095c6e7ffea0c34d58ac Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* V4: Do not use computed goto's with iccErik Verbruggen2017-12-081-1/+4
| | | | | | | | | | Otherwise we get: Internal error: assertion failed at: "shared/cfe/edgcpfe/il.c", line 9371 Task-number: QTBUG-64981 Change-Id: I9a4bd81eb9d1ffee23c22f818583c06f9e74433b Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* V4: Change CallValue to have the value on the stackErik Verbruggen2017-11-231-1/+1
| | | | | | | | | | | | | | | We used to store the value-to-be-called in the accumulator. So the generated bytecode looked like: LoadReg r1 CallValue() The first thing done in CallValue is to store the accumulator. So by not loading the accumulator, we can actually remove the subsequent store, which results in less interpreter instructions and one less store in CallValue. Change-Id: Icc7c8a5449bf369b9226d66bc6055cb705ef660e Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* V4: Collapse LoadRegExp+StoreReg into MoveRegExpErik Verbruggen2017-11-231-2/+2
| | | | | | | | LoadRegExp is nearly always followed by a store of the accumulator, so change LoadRegExp to be MoveRegExp. This saves an instruction. Change-Id: I5d47c5bf6ffd7f28247c328410872c3b229ca23c Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Merge remote-tracking branch 'origin/wip/new-backend' into devSimon Hausmann2017-11-211-809/+417
|\ | | | | | | | | | | | | | | | | | | | | Conflicts: src/qml/compiler/qv4isel_moth.cpp src/qml/compiler/qv4jsir_p.h src/qml/jsruntime/qv4engine_p.h src/qml/jsruntime/qv4vme_moth.cpp tests/auto/qml/qml.pro Change-Id: Ia7b6ec24c7fcbcbb1786d9e798d2df294020ae37
| * Refactor Call/Construct instructionsLars Knoll2017-11-071-8/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Give them a pointer to argc and argv instead of a pointer to a full callData. Like this we can construct the callData at the end of the JS stack and avoid the need to create an additional copy in VME::exec(). This also opens up the option of completely avoiding all copies for calls into runtime methods. Also make sure that the calldata we pass into other functions is always at the top of the JS stack. Change-Id: I3d0eb49f7bfd7adb9ddabb213422087c66e5a520 Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
| * Remove Binop/BinopContext instructions and implement missing binopsErik Verbruggen2017-10-231-6/+12
| | | | | | | | | | Change-Id: Ibefac50246045066c90c4c2dbc36d2776c5dab0e Reviewed-by: Lars Knoll <lars.knoll@qt.io>
| * Work around different GCC versions' idea of uninitializedErik Verbruggen2017-09-131-0/+1
| | | | | | | | | | | | | | | | Also disable -Wmaybe-uninitialized after disabling -Wuninitialized, because the logic for this warning differs per GCC version. Change-Id: I52e26cfd735e437d3ad59c2be22df6c67a1245b1 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Fix wide instruction dispatchErik Verbruggen2017-09-131-5/+4
| | | | | | | | | | | | | | ... by actually doing a dispatch. Change-Id: I80ccbda6f52fcc9da27977f7c0a5bc526926181b Reviewed-by: Lars Knoll <lars.knoll@qt.io>
| * Fix building for QNX with buggy GCCErik Verbruggen2017-09-131-3/+5
| | | | | | | | | | | | | | | | The complaint from GCC was that a static array InstrInfo::argumentCount) cannot be in a union. Change-Id: Ibd8dad478dc95853004fb2a871d5883d4dc73dcc Reviewed-by: Lars Knoll <lars.knoll@qt.io>
| * Make msvc2015 happyErik Verbruggen2017-09-131-3/+6
| | | | | | | | | | | | | | | | | | | | | | - safely truncate a size_t to an int - __VA_ARGS__ expansion is slightly different on msvc, so massage some usages - use unused labels Change-Id: I0a90bd15f9ddf7e0faea1ae8bb0e51cb9574a205 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
| * Fix invalid condition inversion for conditional jumpsErik Verbruggen2017-09-011-28/+28
| | | | | | | | | | | | | | | | | | We now have separate instructions for comparissons, which put the result in the accumulator. Then a JumpTrue/JumpFalse is generated to do the actual jump. Change-Id: I50a9d5899a6e071f4997931de6e8eb62596723cd Reviewed-by: Lars Knoll <lars.knoll@qt.io>
| * Move CallContext construction into a interpreter instructionLars Knoll2017-09-011-0/+2
| | | | | | | | | | | | | | | | | | | | This will allow us to further cut down on function call overhead. To make this work, introduce a proper distinction between EvalCode and GlobalCode and use the correct compilation mode in all places. Change-Id: I070621142159b7416026347c9239200c5ed7a56b Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Unify JSStackFrame and CallDataLars Knoll2017-09-011-30/+0
| | | | | | | | | | Change-Id: I4494dae8166026074c9efc74bac62de9d3fa2342 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Add dumping of the raw hex values to the bytecode dumperLars Knoll2017-09-011-0/+15
| | | | | | | | | | Change-Id: I1ddc179fb19983d079872bd59a48e83de7af8494 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Fix stack-buffer-overflow reported by ASANErik Verbruggen2017-08-291-1/+1
| | | | | | | | | | | | | | sizeof(Ret) is 1, but the Size was rounded up to 4. Change-Id: I5022e369937458ccaa3efed066f62d2c2d36c3a0 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
| * Fix line number mapping to work with non increasing line numbersLars Knoll2017-08-291-2/+9
| | | | | | | | | | | | | | | | | | The old map assumed that line numbers are always increasing, something that isn't always true. So move to a format where we map blocks of bytecode to a line number instead. Change-Id: I1cd9dd1329d415122cd3d560294ef53007f879f8 Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
| * Fix compilation failures on Ubuntu 16.10 (gcc 6.2.0)Erik Verbruggen2017-08-291-2/+2
| | | | | | | | | | Change-Id: Ia70727deb008021cbef6e546816b33ff0ce64afa Reviewed-by: Lars Knoll <lars.knoll@qt.io>
| * Remove unused UnwindException instructionLars Knoll2017-08-281-2/+0
| | | | | | | | | | Change-Id: I8b93270b5aebd39df8f88166e183814f6391c0f5 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Add a load/storeLocal instructionLars Knoll2017-08-281-0/+4
| | | | | | | | | | Change-Id: I084979a6fef7cce9a825cae9ce57234583ceb3ce Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Remove the distinction between wide and xwide instructionsLars Knoll2017-08-281-34/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Only keep 1 byte and 4 byte wide instructions. As this gives less than 256 distinct instructions, those can now again be encoded in 1 byte, dropping the Wide and XWide prefix instructions. This gives us 95% of the size savings that we had before, by being able to encode the full instruction in one byte, while bringing back pretty much all of the speed lost through the compression. Change-Id: I9ec978d43314ed304ca0ee5546035d2b581b6dc3 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Simplify handling of compilers without computed gotoLars Knoll2017-08-281-26/+54
| | | | | | | | | | | | | | | | | | Fix the code for compilers not supporting computed goto and unify the code paths with the ones supporting it as much as possible. Change-Id: I32ca8402ee11893e158d055bb962bac829dd2a91 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Some cleanups to instruction decodingLars Knoll2017-08-281-33/+29
| | | | | | | | | | | | | | | | Clang does apparently manage to create somewhat better code with these changes. Change-Id: Ifbb9893b3b511c90abaf778ca3b8e795e21cc8b7 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Compress all non jump instructionsLars Knoll2017-08-281-0/+7
| | | | | | | | | | Change-Id: I90daee5388f5aba5a5c1cd643379adc9a8e05039 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Introduce the wide/xwide instruction prefixesLars Knoll2017-08-281-0/+41
| | | | | | | | | | | | | | | | | | | | | | And add proper decoding for the prefixed instructions to the VME and bytecode dumper. We still only generate XWide instructions, that will get fixed in the next change. Change-Id: I6d2dc6a0a4f706044038274ca79e019a6c9bb7d9 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Start compressing the byte codeLars Knoll2017-08-281-10/+6
| | | | | | | | | | | | | | As a first step, use only one byte for the instruction type. Change-Id: I762a05233c277a7144472793bc71e41d9e8e82cb Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Make the offset the last part of any jump instructionLars Knoll2017-08-281-12/+13
| | | | | | | | | | Change-Id: I9aec7ab939082c902a32d4cfd00b5e00ad3683bc Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Rename the Common instruction to NopLars Knoll2017-08-281-5/+9
| | | | | | | | | | | | | | | | And add Wide and XWide instructions that will get used as prefixes later on. Change-Id: I993865395ee2ac7d30eba2e41e7b437bfdb54391 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Decode instructions into registersLars Knoll2017-08-281-1/+33
| | | | | | | | | | | | | | | | Don't use the old instruction structures in the VME anymore, instead directly decode into scoped registers. Change-Id: Ie03ebad98050ebfd9eb9cc7e9273e5db92884a89 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Define instructions through a new formatLars Knoll2017-08-281-567/+157
| | | | | | | | | | | | | | This will simplify moving over to a compressed bytecode format. Change-Id: Iba88723fe69149d798552582025867b19c881d00 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Unify instruction namingLars Knoll2017-08-281-333/+333
| | | | | | | | | | | | | | | | Simplify the naming conventions, so that both the instruction struct and enum start with upper case letters. Change-Id: I60c5a95d729e0b68b5a40f7db0e8f90be5938032 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Change offsets to be integer basedLars Knoll2017-08-281-18/+18
| | | | | | | | | | | | | | | | | | This is big enough for generated bytecode, and gives more uniform sizing in our instructions (everything's an int), that will simplify moving over to a compressed instruction stream. Change-Id: Ieb13c5db84348f11c3297c08dca640bb9ec5f224 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Move line number information into a side tableLars Knoll2017-08-251-10/+3
| | | | | | | | | | | | | | | | | | Don't emit any Line instructions anymore, and instead store the info in a side table in the compiled data, where it can be looked up on demand. Change-Id: Idcaf3bf4ee4129fd62f9e717bf1277dc6a34fe19 Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
| * Specialize possible direct calls to evalLars Knoll2017-08-251-0/+6
| | | | | | | | | | | | | | To avoid additional overhead on most function calls Change-Id: I2477b91fda6216b508c8331884a02b601f65590c Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
| * Cleanup object construction instructionsLars Knoll2017-08-251-37/+3
| | | | | | | | | | | | | | | | Remove the unused Create/Construct instructions, and rename the single remaining one to 'Construct'. Change-Id: I10163a15681156f37e34d21a05d195d3c22adcff Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
| * Add optimized branch instructions for comparisons with intsLars Knoll2017-08-251-0/+14
| | | | | | | | | | Change-Id: Ib5d5dc3b0e4a67b950ca9804edd3b6434fcdf9d1 Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
| * Add optimized JmpCmpEq/NeNull instructionsLars Knoll2017-08-251-0/+12
| | | | | | | | | | | | | | for comparisons with null or undefined. Change-Id: I4a70d12ace501e4c4735b2ccfd6de19aeb9fef22 Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
| * Add a LoadZero instructionLars Knoll2017-08-181-0/+5
| | | | | | | | | | | | | | as 0 is used quite often. Change-Id: I2c952ef077590f6e6cfe9aad50807f5e0f8686e4 Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
| * Remove the Load/StoreScopedArgument instructionsLars Knoll2017-08-181-17/+3
| | | | | | | | | | | | | | They are not used anymore. Change-Id: I0cb3754899a30d5f88279ff31296fd73edf90a9a Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
| * Remove the now unused LoadThis instructionLars Knoll2017-08-181-5/+0
| | | | | | | | | | Change-Id: I2770ec4ef173cfa51c5ebd6600788de79684b953 Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
| * Optimize byte codes for loading true/falseLars Knoll2017-08-181-0/+10
| | | | | | | | | | Change-Id: Ib726d55a32d868a4a547b0530b8b6dc6cd99a3cf Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
| * Add specialized instructions for loading undefined, null and intsLars Knoll2017-08-181-0/+16
| | | | | | | | | | Change-Id: Iab0b77328f5756972ef6eff82c0041b184290a32 Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
| * Don't use a return value register for regular functionsErik Verbruggen2017-08-181-1/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | don't use the return value register for normal functions anymore. It's still needed for eval code and qml bindings that have an implicit return value, as the accumulator gets clobbered too easily in those cases. Also get rid of the exit block we used to generate. Adjust the control flow handlers to correctly unwind. This required adding some jump instructions that left the accumulator untouched (as it now holds the return value) and using those in handlers. Change-Id: I2ca1afaf7234cb632e5d26ba5b10ec3f11f50c93 Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
| * More consistent naming of instructions and runtime methodsLars Knoll2017-08-101-57/+57
| | | | | | | | | | Change-Id: Ib8af10a48749b16c48d75c91ad215396b201a9d5 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Split StoreName into StoreNameStrict and StoreNameSloppyLars Knoll2017-08-101-3/+9
| | | | | | | | | | | | | | And adjust the name of the corresponding runtime functions. Change-Id: I4adf7b0e069d9b0dff9162cd1271dafc60be854b Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>