| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
|
|
|
|
|
|
|
| |
I added a system that simplifies adding new demanglers and provides a
fast path when demangling symbols
Change-Id: Ie5ca43632b53e41c0a4214772193af09ca4593cc
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
|
|
|
|
|
|
| |
fixes https://github.com/KDAB/hotspot/issues/177
Change-Id: Ifd31af2344214a02550bab9cf8513f88608c60e8
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
|
|
|
|
| |
Change-Id: Id291a3753c5b890a34a83e89d3df3dda5847268e
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
|\
| |
| |
| | |
Change-Id: I8ea621b1f308692591c256e22eeebe070740a3c9
|
| |
| |
| |
| |
| | |
Change-Id: I1d6ba0705275abb851c1dbf0f25d1f94f018e105
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
|
| |\
| | |
| | |
| | | |
Change-Id: I104132dfc29cc7fa74fd2dca7554e65ef770f95c
|
| | |
| | |
| | |
| | |
| | | |
Change-Id: I00ae8d6ac2094a2b5655693d678445296856fb00
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |\ \
| | | |
| | | |
| | | | |
Change-Id: I4855a81ce48a117c6a34e0a4770b0bf5ee49473a
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
`perfdata.h` is included from downstream code, but HAVE_ZSTD is not
propagated downstream. this leads to gcc complaining about ODR
violations
Change-Id: Ib6995d9be4102f4e3262d84b25d0c8129e165ec1
Reviewed-by: Milian Wolff <milian.wolff@kdab.com>
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
Explicitly cast some qsizetype to int.
Explicitly include time.h for time_t, which possibly was included by
Qt headers before, and is needed for libelf.h (ar_date)
Change-Id: I03807cbd2bb7e25e736a7842fd45b919db274488
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| | | |
| | | |
| | | |
| | | |
| | | | |
Change-Id: I65a47203cbf935c71feda007f09e49c8ea8a87b6
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |\ \ \
| | | | |
| | | | |
| | | | | |
Change-Id: I2eb05cdb49e2798b477d1122a135461d91d1e67e
|
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
Change-Id: I3ecb3b2354968f75b416f2561132432dd66726ee
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
|/ / / /
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
This reverts commit f0ad7794a4d03827262ca0a3a952e7e0ccd47cf0.
We actually use those members in a change we forgot to merge from 4.11.
Change-Id: Ibee5fd43f1d5685f5c510338db878a9fbcbea50f
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
|
| |_|/
|/| |
| | |
| | |
| | | |
Change-Id: I7578e582ac7fd3dd2012f783f273080ec2c2b18b
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |/
|/|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
There are some required frames not looked up for LBR unwinding method.
Added traversal the deepest frames for LBR by callchain
to compute then Disassembly events costs within function/method properly.
Added test into perfdata/vector_static_gcc for perf.lbr.data recorded with LBR.
Change-Id: Ie6413415c573e659505a4715978c65fce135d979
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Don't link to librustc_demangle at compile time, just try to find it
at runtime via QLibrary and then use it. This makes it much easier
to enable/disable support for rust demangling for packagers.
Fixes: https://github.com/KDAB/hotspot/issues/269
Change-Id: Ib33e2699780ed6d827bddeea75f82137daeacc9d
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| |
| |
| | |
Use the namespaced Qt:: equivalent instead.
Change-Id: I3b82febee77a8cce55a1a17ac65018999e51fd43
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Previously we only did that when the relAddr fell somewhere into
the symbol. If it matched the symbol start directly, we didn't
do this yet.
Change-Id: I853e6735c83c9deeeec3be47fbdea0a032598ed8
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| |
| | |
Change-Id: If34e761dc6a3b38ca60433adc674332fb5c7721b
Reviewed-by: David Faure <david.faure@kdab.com>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| | |
Actual file path can differ from perf recorded.
Compute and pass it to hotspot through Symbol struct field actualPath.
Change-Id: I556035234cbcffa42497bf02e225d63565e4a0bf
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| |
| |
| | |
It is required to compute proper addresses on ARM.
Change-Id: Ifc93375707507fff0fcc62e164133771e43bd4b5
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
It is equal to symbol start added by offset inside function.
Disassembler can then use them to compute and show events costs locations within function by instructions.
Added stream output.
Change-Id: Iba32e1764633d7ffc3f0f36088525ed7a3d1c9d0
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Added start address and size into Symbol and their stream output.
A disassembler can then use the relative address and size of a symbol
to find the instructions that belong to a function.
Change-Id: I96709ca380d0e58cd5cf5a8cc87116147b2754d6
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Apparently there are situations where the compiler generates entries
in the symbol table with zero size which are still referenced by some
callstacks. After commit d8d56b7e we ended up losing the symbol names
in such cases. This patch fixes it again and restores the symbol names
for such zero-size symbols.
Change-Id: If98f68626ab4251ccfed89d791ebd333f6a6a60a
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
This allows a more detailed report on the GUI side then. Because the
count has a quint64 type, we now use a QVariant to store the task
event payload. To reduce the padding overhead, the struct is slightly
reordered.
Change-Id: I01d16da2ba4d3df9f32d6ae53bcff120355eb2c9
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| | |
Change-Id: Iddaf07e55eb777d53b9ed992b496939ef93af07a
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
For now this just allows off-CPU cost analysis for
data recorded with `perf record -a --switch-events`.
In the future, we could even send the nextPrev{P,T}id
too, which would allow us to draw arrows beetween the
context switch targets.
Change-Id: Ie9b88bb9c54a3238ba8d6addd013b8419c03c42f
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| |
| |
| |
| | |
While we're at it, also consider the ELFUTILS_INSTALL_DIR environment
variable.
Change-Id: Ifeb5cc7df6e29426633d27a840185ba67ed838b6
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| | |
Change-Id: Ic70d22575b9dd38f0df9f04e61c82a0dbc83a01a
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
|\ \ |
|
| |\ \
| | | |
| | | |
| | | | |
Change-Id: I60ee993a753729853b91353a7083347e90cb721c
|
| | | |
| | | |
| | | |
| | | |
| | | | |
Change-Id: If91e36a370d8fed183680ea156f39fde5175b899
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
|
|/ / /
| | |
| | |
| | |
| | | |
Change-Id: I9dc6ab44596244fb342495c5d4a5e719e9b6c26b
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
For samples with frame pointer or LBR call chains, we may not have
the CPU registers or stack information available. Under such
circumstances we would spam the command line with repeated warnings
of the form:
```
<pid> failed to attach state Couldn't find architecture of any ELF
```
Prevent that by checking whether the sample has register and stack
information available and only attach dwfl state then.
Note that symbol resolution and inline-frame resolution is independent
of the dwfl_attach_state call - that really is only required for stack
unwinding.
Based on a patch by vtoropov, thanks!
Fixes: https://github.com/kdab/hotspot/issues/178
Change-Id: I8b88ee5b97d3e9d3ded82a17c4487d01add6d5ca
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| | |
| | |
| | |
| | |
| | | |
Change-Id: Icdb4a0147d74e5349eec7d5bfea7a1b08828601d
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Apparently the symtab isn't necessarily sorted. That means
every call to dwfl_module_addrinfo we do may potentially end
up iterating over many symbol entries to find a match. For
libxul.so, which contains roughly one million symbols, this
can be exceedingly slow.
Now, we instead just iterate over all symbols once and store
them in a sorted array for quick lookups later on. Then when
we lookup a symbol, we just need to demangle it on-demand.
I believe the following numbers speak for themselves. Both
are for a 1.1GB perf.data file profiling firefox with debug
symbols in libxul. A hefty 10x speedup!
Before:
```
592.765,37 msec task-clock:u # 0,999 CPUs utilized
0 context-switches:u # 0,000 K/sec
0 cpu-migrations:u # 0,000 K/sec
587.913 page-faults:u # 0,992 K/sec
2.610.836.174.604 cycles:u # 4,405 GHz (83,33%)
9.249.001.490 stalled-cycles-frontend:u # 0,35% frontend cycles idle (83,33%)
188.323.380.515 stalled-cycles-backend:u # 7,21% backend cycles idle (83,33%)
6.294.821.871.279 instructions:u # 2,41 insn per cycle
# 0,03 stalled cycles per insn (83,33%)
1.593.493.508.805 branches:u # 2688,236 M/sec (83,33%)
1.613.875.121 branch-misses:u # 0,10% of all branches (83,34%)
593,078170383 seconds time elapsed
589,590379000 seconds user
1,591781000 seconds sys
```
After:
```
57.292,74 msec task-clock:u # 0,999 CPUs utilized
0 context-switches:u # 0,000 K/sec
0 cpu-migrations:u # 0,000 K/sec
598.808 page-faults:u # 0,010 M/sec
246.209.111.444 cycles:u # 4,297 GHz (83,34%)
8.990.996.482 stalled-cycles-frontend:u # 3,65% frontend cycles idle (83,33%)
52.443.604.272 stalled-cycles-backend:u # 21,30% backend cycles idle (83,34%)
583.136.689.772 instructions:u # 2,37 insn per cycle
# 0,09 stalled cycles per insn (83,33%)
150.053.278.261 branches:u # 2619,063 M/sec (83,33%)
833.143.959 branch-misses:u # 0,56% of all branches (83,34%)
57,370841100 seconds time elapsed
55,799767000 seconds user
1,291568000 seconds sys
```
Note that this patch also uncovers some broken offset computations.
Checking the offsets manually with addr2line indicates that the new
offsets we report now are better than the old ones. At least for
the cases I compared, e.g.:
```
$ addr2line -C -i -f -e .../fork -a 255800 22c800
0x0000000000255800
__vfwprintf_internal
fork.c:?
0x000000000022c800
__cos_fma
??:?
$ addr2line -C -i -f -e .../fork -a 252585 229585
0x0000000000252585
printf_positional
fork.c:?
0x0000000000229585
main
??:?
$ addr2line -C -i -f -e .../vector_static_gcc_v9.1.0 -a 45d3e0
0x000000000045d3e0
__munmap
crtstuff.c:?
```
Then, we now resolve symbols like binutils, i.e. we pick the first
symbol we find and don't skip weak symbols like eu-addr2line seems
to be doing. I.e. for this:
```
0000000000417a40 w F .text 0000000000000074 hypot
0000000000417a40 w F .text 0000000000000074 hypotf64
0000000000417a40 w F .text 0000000000000074 hypotf32x
0000000000417a40 g F .text 0000000000000074 __hypot
```
We used to get `__hypot`, but now we get `hypot`. I think this is
just as good, and as I said - it's also what you'd get from binutils
with `addr2line`:
```
$ addr2line -C -i -f -e vector_static_gcc_v9.1.0 -a 417a40
0x0000000000418480
hypot
??:?
$ eu-addr2line -C -i -f -e vector_static_gcc_v9.1.0 -a 417a40
0x0000000000418480
__hypot
??:0
```
Initially, I thought about just skipping all weak symbols, but that's
not a feasible approach. There are some symbols that are weak and not
overridden by a non-weak symbol, like this one:
```
$ objdump -C -t .../vector_static_gcc_v9.1.0 | grep 401c70
0000000000401c70 w F .text 0000000000000162 void std::vector<double, std::allocator<double> >::_M_realloc_insert<double>(__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >, double&&)
```
And that one even contains a bunch of inlined frames, so we definitely
want to keep that in. We could potentially pass that information along
and then implement a custom logic to prefer non-weak symbols. Quite
frankly, I don't think that effort is worth it.
Change-Id: Ic91764aaab36e77be1c4df4a32d4ac2b4c28e7e0
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Only works when the diff program is available on the system.
Change-Id: Id4cd5fe96a1a10b03153900600b3fcb43f755100
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Implement an alternative approach to resolving inline frames and
cache subprogram die names.
The problem with dwarf_getscopes and dwarf_getscopes_die is that it
often has to traverse a large part of the DIE tree within a CU DIE
to find its result. For larger DSOs this repeated tree walking can
consume a lot of time.
The idea behind this patch is the following: We find (and cache)
the Dwarf_Die's with DW_TAG_subprogram and then look for inline frames
in that subtree directly.
Additionally, we cache the scope names within a CU DIE more
aggressively. I hope that in the future this area can be improved even
further, as the remaining calls to dwarf_getscopes_die still make up
a large fraction of the overall analysis cost.
The following shows the performance impact of this patch for a
perf.data file with about 6M samples. Many frames in the callstacks
point to a self-compiled libclang.so with debug symbols. That library
alone is roughly 600MB large. This makes finding inline frames quite
slow.
Before:
```
80.159,75 msec task-clock # 0,984 CPUs utilized
4.075 context-switches # 0,051 K/sec
1 cpu-migrations # 0,000 K/sec
152.257 page-faults # 0,002 M/sec
346.071.892.881 cycles # 4,317 GHz (83,33%)
1.940.060.936 stalled-cycles-frontend # 0,56% frontend cycles idle (83,33%)
38.399.679.774 stalled-cycles-backend # 11,10% backend cycles idle (83,34%)
999.298.133.335 instructions # 2,89 insn per cycle
# 0,04 stalled cycles per insn (83,31%)
239.561.868.424 branches # 2988,556 M/sec (83,34%)
1.163.589.915 branch-misses # 0,49% of all branches (83,34%)
81,497496973 seconds time elapsed
79,554970000 seconds user
0,404933000 seconds sys
```
After:
```
15.558,09 msec task-clock # 1,000 CPUs utilized
99 context-switches # 0,006 K/sec
1 cpu-migrations # 0,000 K/sec
151.446 page-faults # 0,010 M/sec
67.961.461.389 cycles # 4,368 GHz (83,32%)
759.299.629 stalled-cycles-frontend # 1,12% frontend cycles idle (83,32%)
7.369.116.441 stalled-cycles-backend # 10,84% backend cycles idle (83,34%)
187.648.727.850 instructions # 2,76 insn per cycle
# 0,04 stalled cycles per insn (83,34%)
45.231.315.052 branches # 2907,254 M/sec (83,34%)
200.377.846 branch-misses # 0,44% of all branches (83,33%)
15,560370834 seconds time elapsed
15,230305000 seconds user
0,285776000 seconds sys
```
Which means we are now roughly 5x faster than before, which is a
pretty significant gain.
Relates-To: https://github.com/KDAB/hotspot/issues/192
Change-Id: I0669cc3aad886b22165eaf1d0836a56e5183898d
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
For perf.data files that span many (small) processes, we held on
to the symbol tables even after a process exited. This wastes
resources and can even lead to potential confusion when a PID is
recycled - we would have reused the symbol table from the last
process then, which could be a completely different one.
Change-Id: I858dce578619191babdd1a8410ad038c0b686ff6
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
A forked process inherits the elfmap of the parent, thus we need to
copy that data when we encounter a fork event. This is complicated by
the fact that the task events and mmap events need to be sorted first.
Thus, we need to find the fork event when we deplete the buffers after
sorting and then initialize the child process elf map with the one
from the parent process.
Furthermore, pass the ppid through the ThreadStart event, to allow
client applications to inherit the comm for the newly created process.
Fixes: https://github.com/KDAB/hotspot/issues/241
Change-Id: I5de13644e12def6704c5f622428a815fd87d2af4
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
When compiled with HAVE_ZSTD=1, transparently decompress perf
records contained in PERF_RECORD_COMPRESSED and parse those then.
This way, we can finally open data files recorded with
`perf record -z`, which are often two orders of magnitude smaller
for the common `--call-graph dwarf` case.
Change-Id: Ic26f049b955b20038b947d03c7ff1c6c5eb22ba3
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
This patch allows us to more easily add new data files that reuse
the same binaries we have already added to our test data, instead
of requiring a single copy per directory.
Change-Id: Ia635f6d5444a4b92e2a4a684d9c44bce61ad017c
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Apparently newer elfutils or demangling contains a fix for the weird
complex symbols encountered in clang-compiled binaries. Now, the
symbol is better readable:
Before: `doublecomplex `
After: `double _Complex`
Update the testdata accordingly, instead of failing. To keep backwards
compatibility, replace the old form to the new form in the actual file
output.
Change-Id: I49bc956f5f2032ae7d71c59e7d6c82bc65d81e81
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
When librustc_demangle.so and rustc_demangle.h are provided
externally, perfparser can now leverage that to demangle rust
symbols.
See also: https://github.com/alexcrichton/rustc-demangle
Relates-To: https://github.com/KDAB/hotspot/issues/237
Change-Id: I0a66598e4ae3aa1dbf2776587934677beadd5968
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Note that this creates a hard dependency on Qt 5.14. If that's not
wanted the uses of Qt::SkipEmptyParts would need to be #ifdef-ed, too.
Task-number: QTCREATORBUG-24098
Change-Id: I9b26fa9ed39c2200bb8329fa228c96613e529efe
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
|
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
The results seem to differ depending on platform.
Change-Id: I18ca22ffb7e2ead988680963fe39ac7ea9068430
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
On MIPS systems, "mips" is a built-in compiler macro. Undefine it to fix
compilation errors:
app/perfregisterinfo.cpp:55:12: error: expected unqualified-id before numeric constant
55 | static int mips[] = { 32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
| ^~~~
Change-Id: I80680337a019629e53828d60fc8a233a7cc819d2
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
|/ /
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Without this fix, the build was failing with:
/usr/bin/ld: perfunwind.o: in function `QDataStream::Version qToLittleEndian<QDataStream::Version>(QDataStream::Version)'
QtCore/qendian.h:207: undefined reference to `QDataStream::Version qbswap<QDataStream::Version>(QDataStream::Version)'
Fix it by explicitly casting QDataStream::Qt_DefaultCompiledVersion to
qint32 before calling qToLittleEndian.
Change-Id: If51ab99ba4825219cbaa74c68ff4605928b1a776
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|
| |
| |
| |
| |
| | |
Change-Id: I9df420d6ad46249ce6f0091b159dc56a563e93b8
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
|