Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/qtdeclarative/src/qtdeclarative/src/qml/jsruntime/qv4profiling_p.h |
Switch to Source code | Preprocessed file |
Line | Source | Count | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | - | |||||||||||||||||||
2 | - | |||||||||||||||||||
3 | - | |||||||||||||||||||
4 | - | |||||||||||||||||||
5 | namespace QV4 { | - | ||||||||||||||||||
6 | - | |||||||||||||||||||
7 | namespace Profiling { | - | ||||||||||||||||||
8 | - | |||||||||||||||||||
9 | enum Features { | - | ||||||||||||||||||
10 | FeatureFunctionCall, | - | ||||||||||||||||||
11 | FeatureMemoryAllocation | - | ||||||||||||||||||
12 | }; | - | ||||||||||||||||||
13 | - | |||||||||||||||||||
14 | enum MemoryType { | - | ||||||||||||||||||
15 | HeapPage, | - | ||||||||||||||||||
16 | LargeItem, | - | ||||||||||||||||||
17 | SmallItem | - | ||||||||||||||||||
18 | }; | - | ||||||||||||||||||
19 | - | |||||||||||||||||||
20 | struct FunctionCallProperties { | - | ||||||||||||||||||
21 | qint64 start; | - | ||||||||||||||||||
22 | qint64 end; | - | ||||||||||||||||||
23 | quintptr id; | - | ||||||||||||||||||
24 | }; | - | ||||||||||||||||||
25 | - | |||||||||||||||||||
26 | struct FunctionLocation { | - | ||||||||||||||||||
27 | FunctionLocation(const QString &name = QString(), const QString &file = QString(), | - | ||||||||||||||||||
28 | int line = -1, int column = -1) : | - | ||||||||||||||||||
29 | name(name), file(file), line(line), column(column) | - | ||||||||||||||||||
30 | {} executed 16 times by 1 test: end of block Executed by:
| 16 | ||||||||||||||||||
31 | - | |||||||||||||||||||
32 | bool isValid() | - | ||||||||||||||||||
33 | { | - | ||||||||||||||||||
34 | return executed 8 times by 1 test: !name.isEmpty();return !name.isEmpty(); Executed by:
executed 8 times by 1 test: return !name.isEmpty(); Executed by:
| 8 | ||||||||||||||||||
35 | } | - | ||||||||||||||||||
36 | - | |||||||||||||||||||
37 | QString name; | - | ||||||||||||||||||
38 | QString file; | - | ||||||||||||||||||
39 | int line; | - | ||||||||||||||||||
40 | int column; | - | ||||||||||||||||||
41 | }; | - | ||||||||||||||||||
42 | - | |||||||||||||||||||
43 | typedef QHash<quintptr, QV4::Profiling::FunctionLocation> FunctionLocationHash; | - | ||||||||||||||||||
44 | - | |||||||||||||||||||
45 | struct MemoryAllocationProperties { | - | ||||||||||||||||||
46 | qint64 timestamp; | - | ||||||||||||||||||
47 | qint64 size; | - | ||||||||||||||||||
48 | MemoryType type; | - | ||||||||||||||||||
49 | }; | - | ||||||||||||||||||
50 | - | |||||||||||||||||||
51 | class FunctionCall { | - | ||||||||||||||||||
52 | public: | - | ||||||||||||||||||
53 | - | |||||||||||||||||||
54 | FunctionCall() : m_function(nullptr), m_start(0), m_end(0) | - | ||||||||||||||||||
55 | { ((false) ? static_cast<void>(0) : qt_assert_x(__PRETTY_FUNCTION__, "Cannot construct a function call without function", __FILE__, 143)); } never executed: end of block | 0 | ||||||||||||||||||
56 | - | |||||||||||||||||||
57 | FunctionCall(Function *function, qint64 start, qint64 end) : | - | ||||||||||||||||||
58 | m_function(function), m_start(start), m_end(end) | - | ||||||||||||||||||
59 | { m_function->compilationUnit->addref(); } executed 14 times by 1 test: end of block Executed by:
| 14 | ||||||||||||||||||
60 | - | |||||||||||||||||||
61 | FunctionCall(const FunctionCall &other) : | - | ||||||||||||||||||
62 | m_function(other.m_function), m_start(other.m_start), m_end(other.m_end) | - | ||||||||||||||||||
63 | { m_function->compilationUnit->addref(); } executed 22 times by 1 test: end of block Executed by:
| 22 | ||||||||||||||||||
64 | - | |||||||||||||||||||
65 | ~FunctionCall() | - | ||||||||||||||||||
66 | { m_function->compilationUnit->release(); } executed 36 times by 1 test: end of block Executed by:
| 36 | ||||||||||||||||||
67 | - | |||||||||||||||||||
68 | FunctionCall &operator=(const FunctionCall &other) { | - | ||||||||||||||||||
69 | if (&other != this
| 0-28 | ||||||||||||||||||
70 | other.m_function->compilationUnit->addref(); | - | ||||||||||||||||||
71 | m_function->compilationUnit->release(); | - | ||||||||||||||||||
72 | m_function = other.m_function; | - | ||||||||||||||||||
73 | m_start = other.m_start; | - | ||||||||||||||||||
74 | m_end = other.m_end; | - | ||||||||||||||||||
75 | } executed 28 times by 1 test: end of block Executed by:
| 28 | ||||||||||||||||||
76 | return executed 28 times by 1 test: *this;return *this; Executed by:
executed 28 times by 1 test: return *this; Executed by:
| 28 | ||||||||||||||||||
77 | } | - | ||||||||||||||||||
78 | - | |||||||||||||||||||
79 | Function *function() const | - | ||||||||||||||||||
80 | { | - | ||||||||||||||||||
81 | return executed 14 times by 1 test: m_function;return m_function; Executed by:
executed 14 times by 1 test: return m_function; Executed by:
| 14 | ||||||||||||||||||
82 | } | - | ||||||||||||||||||
83 | - | |||||||||||||||||||
84 | FunctionLocation resolveLocation() const; | - | ||||||||||||||||||
85 | FunctionCallProperties properties() const; | - | ||||||||||||||||||
86 | - | |||||||||||||||||||
87 | private: | - | ||||||||||||||||||
88 | friend bool operator<(const FunctionCall &call1, const FunctionCall &call2); | - | ||||||||||||||||||
89 | - | |||||||||||||||||||
90 | Function *m_function; | - | ||||||||||||||||||
91 | qint64 m_start; | - | ||||||||||||||||||
92 | qint64 m_end; | - | ||||||||||||||||||
93 | }; | - | ||||||||||||||||||
94 | - | |||||||||||||||||||
95 | class __attribute__((visibility("default"))) Profiler : public QObject { | - | ||||||||||||||||||
96 | public: | - | ||||||||||||||||||
97 | #pragma GCC diagnostic push | - | ||||||||||||||||||
98 | - | |||||||||||||||||||
99 | #pragma GCC diagnostic ignored "-Wsuggest-override" | - | ||||||||||||||||||
100 | static const QMetaObject staticMetaObject; virtual const QMetaObject *metaObject() const; virtual void *qt_metacast(const char *); virtual int qt_metacall(QMetaObject::Call, int, void **); static inline QString tr(const char *s, const char *c = nullptr, int n = -1) { return staticMetaObject.tr(s, c, n); } __attribute__ ((__deprecated__)) static inline QString trUtf8(const char *s, const char *c = nullptr, int n = -1) { return staticMetaObject.tr(s, c, n); } private: | - | ||||||||||||||||||
101 | #pragma GCC diagnostic ignored "-Wattributes" | - | ||||||||||||||||||
102 | __attribute__((visibility("hidden"))) static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); | - | ||||||||||||||||||
103 | #pragma GCC diagnostic pop | - | ||||||||||||||||||
104 | struct QPrivateSignal {}; | - | ||||||||||||||||||
105 | public: | - | ||||||||||||||||||
106 | struct SentMarker { | - | ||||||||||||||||||
107 | SentMarker() : m_function(nullptr) {} executed 8 times by 1 test: end of block Executed by:
| 8 | ||||||||||||||||||
108 | - | |||||||||||||||||||
109 | SentMarker(const SentMarker &other) : m_function(other.m_function) | - | ||||||||||||||||||
110 | { | - | ||||||||||||||||||
111 | if (m_function
| 0-8 | ||||||||||||||||||
112 | m_function->compilationUnit->addref(); never executed: m_function->compilationUnit->addref(); | 0 | ||||||||||||||||||
113 | } executed 8 times by 1 test: end of block Executed by:
| 8 | ||||||||||||||||||
114 | - | |||||||||||||||||||
115 | ~SentMarker() | - | ||||||||||||||||||
116 | { | - | ||||||||||||||||||
117 | if (m_function
| 8 | ||||||||||||||||||
118 | m_function->compilationUnit->release(); executed 8 times by 1 test: m_function->compilationUnit->release(); Executed by:
| 8 | ||||||||||||||||||
119 | } executed 16 times by 1 test: end of block Executed by:
| 16 | ||||||||||||||||||
120 | - | |||||||||||||||||||
121 | SentMarker &operator=(const SentMarker &other) | - | ||||||||||||||||||
122 | { | - | ||||||||||||||||||
123 | if (&other != this
| 0 | ||||||||||||||||||
124 | if (m_function
| 0 | ||||||||||||||||||
125 | m_function->compilationUnit->release(); never executed: m_function->compilationUnit->release(); | 0 | ||||||||||||||||||
126 | m_function = other.m_function; | - | ||||||||||||||||||
127 | m_function->compilationUnit->addref(); | - | ||||||||||||||||||
128 | } never executed: end of block | 0 | ||||||||||||||||||
129 | return never executed: *this;return *this; never executed: return *this; | 0 | ||||||||||||||||||
130 | } | - | ||||||||||||||||||
131 | - | |||||||||||||||||||
132 | void setFunction(Function *function) | - | ||||||||||||||||||
133 | { | - | ||||||||||||||||||
134 | ((m_function == nullptr) ? static_cast<void>(0) : qt_assert("m_function == nullptr", __FILE__, 214)); | - | ||||||||||||||||||
135 | m_function = function; | - | ||||||||||||||||||
136 | m_function->compilationUnit->addref(); | - | ||||||||||||||||||
137 | } executed 8 times by 1 test: end of block Executed by:
| 8 | ||||||||||||||||||
138 | - | |||||||||||||||||||
139 | bool isValid() const | - | ||||||||||||||||||
140 | { return executed 14 times by 1 test: m_function != nullptr;return m_function != nullptr; Executed by:
executed 14 times by 1 test: }return m_function != nullptr; Executed by:
| 14 | ||||||||||||||||||
141 | - | |||||||||||||||||||
142 | private: | - | ||||||||||||||||||
143 | Function *m_function; | - | ||||||||||||||||||
144 | }; | - | ||||||||||||||||||
145 | - | |||||||||||||||||||
146 | Profiler(QV4::ExecutionEngine *engine); | - | ||||||||||||||||||
147 | - | |||||||||||||||||||
148 | bool trackAlloc(size_t size, MemoryType type) | - | ||||||||||||||||||
149 | { | - | ||||||||||||||||||
150 | if (size
| 0-152 | ||||||||||||||||||
151 | MemoryAllocationProperties allocation = {m_timer.nsecsElapsed(), (qint64)size, type}; | - | ||||||||||||||||||
152 | m_memory_data.append(allocation); | - | ||||||||||||||||||
153 | return executed 152 times by 1 test: true;return true; Executed by:
executed 152 times by 1 test: return true; Executed by:
| 152 | ||||||||||||||||||
154 | } else { | - | ||||||||||||||||||
155 | return never executed: false;return false; never executed: return false; | 0 | ||||||||||||||||||
156 | } | - | ||||||||||||||||||
157 | } | - | ||||||||||||||||||
158 | - | |||||||||||||||||||
159 | bool trackDealloc(size_t size, MemoryType type) | - | ||||||||||||||||||
160 | { | - | ||||||||||||||||||
161 | if (size
| 0 | ||||||||||||||||||
162 | MemoryAllocationProperties allocation = {m_timer.nsecsElapsed(), -(qint64)size, type}; | - | ||||||||||||||||||
163 | m_memory_data.append(allocation); | - | ||||||||||||||||||
164 | return never executed: true;return true; never executed: return true; | 0 | ||||||||||||||||||
165 | } else { | - | ||||||||||||||||||
166 | return never executed: false;return false; never executed: return false; | 0 | ||||||||||||||||||
167 | } | - | ||||||||||||||||||
168 | } | - | ||||||||||||||||||
169 | - | |||||||||||||||||||
170 | quint64 featuresEnabled; | - | ||||||||||||||||||
171 | - | |||||||||||||||||||
172 | void stopProfiling(); | - | ||||||||||||||||||
173 | void startProfiling(quint64 features); | - | ||||||||||||||||||
174 | void reportData(); | - | ||||||||||||||||||
175 | void setTimer(const QElapsedTimer &timer) { m_timer = timer; } executed 32 times by 3 tests: end of block Executed by:
| 32 | ||||||||||||||||||
176 | - | |||||||||||||||||||
177 | public : | - | ||||||||||||||||||
178 | void dataReady(const QV4::Profiling::FunctionLocationHash &, | - | ||||||||||||||||||
179 | const QVector<QV4::Profiling::FunctionCallProperties> &, | - | ||||||||||||||||||
180 | const QVector<QV4::Profiling::MemoryAllocationProperties> &); | - | ||||||||||||||||||
181 | - | |||||||||||||||||||
182 | private: | - | ||||||||||||||||||
183 | QV4::ExecutionEngine *m_engine; | - | ||||||||||||||||||
184 | QElapsedTimer m_timer; | - | ||||||||||||||||||
185 | QVector<FunctionCall> m_data; | - | ||||||||||||||||||
186 | QVector<MemoryAllocationProperties> m_memory_data; | - | ||||||||||||||||||
187 | QHash<quintptr, SentMarker> m_sentLocations; | - | ||||||||||||||||||
188 | - | |||||||||||||||||||
189 | friend class FunctionCallProfiler; | - | ||||||||||||||||||
190 | }; | - | ||||||||||||||||||
191 | - | |||||||||||||||||||
192 | class FunctionCallProfiler { | - | ||||||||||||||||||
193 | FunctionCallProfiler(const FunctionCallProfiler &) = delete; FunctionCallProfiler &operator=(const FunctionCallProfiler &) = delete; | - | ||||||||||||||||||
194 | public: | - | ||||||||||||||||||
195 | - | |||||||||||||||||||
196 | - | |||||||||||||||||||
197 | - | |||||||||||||||||||
198 | FunctionCallProfiler(ExecutionEngine *engine, Function *f) | - | ||||||||||||||||||
199 | : profiler(nullptr) | - | ||||||||||||||||||
200 | { | - | ||||||||||||||||||
201 | Profiler *p = engine->profiler(); | - | ||||||||||||||||||
202 | if (__builtin_expect(!!(p), false)
| 14-17699042 | ||||||||||||||||||
203 | profiler = p; | - | ||||||||||||||||||
204 | function = f; | - | ||||||||||||||||||
205 | startTime = profiler->m_timer.nsecsElapsed(); | - | ||||||||||||||||||
206 | } executed 14 times by 1 test: end of block Executed by:
| 14 | ||||||||||||||||||
207 | } executed 17704945 times by 134 tests: end of block Executed by:
| 17704945 | ||||||||||||||||||
208 | - | |||||||||||||||||||
209 | ~FunctionCallProfiler() | - | ||||||||||||||||||
210 | { | - | ||||||||||||||||||
211 | if (profiler
| 14-17678129 | ||||||||||||||||||
212 | profiler->m_data.append(FunctionCall(function, startTime, profiler->m_timer.nsecsElapsed())); executed 14 times by 1 test: profiler->m_data.append(FunctionCall(function, startTime, profiler->m_timer.nsecsElapsed())); Executed by:
| 14 | ||||||||||||||||||
213 | } executed 17696998 times by 134 tests: end of block Executed by:
| 17696998 | ||||||||||||||||||
214 | - | |||||||||||||||||||
215 | Profiler *profiler; | - | ||||||||||||||||||
216 | Function *function; | - | ||||||||||||||||||
217 | qint64 startTime; | - | ||||||||||||||||||
218 | }; | - | ||||||||||||||||||
219 | - | |||||||||||||||||||
220 | - | |||||||||||||||||||
221 | } | - | ||||||||||||||||||
222 | } | - | ||||||||||||||||||
223 | - | |||||||||||||||||||
224 | template<> class QTypeInfo<QV4::Profiling::MemoryAllocationProperties > { public: enum { isSpecialized = true, isComplex = (((Q_MOVABLE_TYPE) & Q_PRIMITIVE_TYPE) == 0), isStatic = (((Q_MOVABLE_TYPE) & (Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE)) == 0), isRelocatable = !isStatic || ((Q_MOVABLE_TYPE) & Q_RELOCATABLE_TYPE), isLarge = (sizeof(QV4::Profiling::MemoryAllocationProperties)>sizeof(void*)), isPointer = false, isIntegral = std::is_integral< QV4::Profiling::MemoryAllocationProperties >::value, isDummy = (((Q_MOVABLE_TYPE) & Q_DUMMY_TYPE) != 0), sizeOf = sizeof(QV4::Profiling::MemoryAllocationProperties) }; static inline const char *name() { return never executed: "QV4::Profiling::MemoryAllocationProperties";return "QV4::Profiling::MemoryAllocationProperties"; never executed: } };return "QV4::Profiling::MemoryAllocationProperties"; | 0 | ||||||||||||||||||
225 | template<> class QTypeInfo<QV4::Profiling::FunctionCallProperties > { public: enum { isSpecialized = true, isComplex = (((Q_MOVABLE_TYPE) & Q_PRIMITIVE_TYPE) == 0), isStatic = (((Q_MOVABLE_TYPE) & (Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE)) == 0), isRelocatable = !isStatic || ((Q_MOVABLE_TYPE) & Q_RELOCATABLE_TYPE), isLarge = (sizeof(QV4::Profiling::FunctionCallProperties)>sizeof(void*)), isPointer = false, isIntegral = std::is_integral< QV4::Profiling::FunctionCallProperties >::value, isDummy = (((Q_MOVABLE_TYPE) & Q_DUMMY_TYPE) != 0), sizeOf = sizeof(QV4::Profiling::FunctionCallProperties) }; static inline const char *name() { return never executed: "QV4::Profiling::FunctionCallProperties";return "QV4::Profiling::FunctionCallProperties"; never executed: } };return "QV4::Profiling::FunctionCallProperties"; | 0 | ||||||||||||||||||
226 | template<> class QTypeInfo<QV4::Profiling::FunctionCall > { public: enum { isSpecialized = true, isComplex = (((Q_MOVABLE_TYPE) & Q_PRIMITIVE_TYPE) == 0), isStatic = (((Q_MOVABLE_TYPE) & (Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE)) == 0), isRelocatable = !isStatic || ((Q_MOVABLE_TYPE) & Q_RELOCATABLE_TYPE), isLarge = (sizeof(QV4::Profiling::FunctionCall)>sizeof(void*)), isPointer = false, isIntegral = std::is_integral< QV4::Profiling::FunctionCall >::value, isDummy = (((Q_MOVABLE_TYPE) & Q_DUMMY_TYPE) != 0), sizeOf = sizeof(QV4::Profiling::FunctionCall) }; static inline const char *name() { return never executed: "QV4::Profiling::FunctionCall";return "QV4::Profiling::FunctionCall"; never executed: } };return "QV4::Profiling::FunctionCall"; | 0 | ||||||||||||||||||
227 | template<> class QTypeInfo<QV4::Profiling::FunctionLocation > { public: enum { isSpecialized = true, isComplex = (((Q_MOVABLE_TYPE) & Q_PRIMITIVE_TYPE) == 0), isStatic = (((Q_MOVABLE_TYPE) & (Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE)) == 0), isRelocatable = !isStatic || ((Q_MOVABLE_TYPE) & Q_RELOCATABLE_TYPE), isLarge = (sizeof(QV4::Profiling::FunctionLocation)>sizeof(void*)), isPointer = false, isIntegral = std::is_integral< QV4::Profiling::FunctionLocation >::value, isDummy = (((Q_MOVABLE_TYPE) & Q_DUMMY_TYPE) != 0), sizeOf = sizeof(QV4::Profiling::FunctionLocation) }; static inline const char *name() { return never executed: "QV4::Profiling::FunctionLocation";return "QV4::Profiling::FunctionLocation"; never executed: } };return "QV4::Profiling::FunctionLocation"; | 0 | ||||||||||||||||||
228 | template<> class QTypeInfo<QV4::Profiling::Profiler::SentMarker > { public: enum { isSpecialized = true, isComplex = (((Q_MOVABLE_TYPE) & Q_PRIMITIVE_TYPE) == 0), isStatic = (((Q_MOVABLE_TYPE) & (Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE)) == 0), isRelocatable = !isStatic || ((Q_MOVABLE_TYPE) & Q_RELOCATABLE_TYPE), isLarge = (sizeof(QV4::Profiling::Profiler::SentMarker)>sizeof(void*)), isPointer = false, isIntegral = std::is_integral< QV4::Profiling::Profiler::SentMarker >::value, isDummy = (((Q_MOVABLE_TYPE) & Q_DUMMY_TYPE) != 0), sizeOf = sizeof(QV4::Profiling::Profiler::SentMarker) }; static inline const char *name() { return never executed: "QV4::Profiling::Profiler::SentMarker";return "QV4::Profiling::Profiler::SentMarker"; never executed: } };return "QV4::Profiling::Profiler::SentMarker"; | 0 | ||||||||||||||||||
229 | - | |||||||||||||||||||
230 | - | |||||||||||||||||||
231 | template <> struct QMetaTypeId< QV4::Profiling::FunctionLocationHash > { enum { Defined = 1 }; static int qt_metatype_id() { static QBasicAtomicInt metatype_id = { 0 }; if (const
never executed: id;return id; never executed: const int newId = qRegisterMetaType< QV4::Profiling::FunctionLocationHash >("QV4::Profiling::FunctionLocationHash", reinterpret_cast< QV4::Profiling::FunctionLocationHash *>(quintptr(-1))); metatype_id.storeRelease(newId); returnreturn id; never executed: newId;return newId; never executed: } };return newId; | 0 | ||||||||||||||||||
232 | template <> struct QMetaTypeId< QVector<QV4::Profiling::FunctionCallProperties> > { enum { Defined = 1 }; static int qt_metatype_id() { static QBasicAtomicInt metatype_id = { 0 }; if (const
never executed: id;return id; never executed: const int newId = qRegisterMetaType< QVector<QV4::Profiling::FunctionCallProperties> >("QVector<QV4::Profiling::FunctionCallProperties>", reinterpret_cast< QVector<QV4::Profiling::FunctionCallProperties> *>(quintptr(-1))); metatype_id.storeRelease(newId); returnreturn id; never executed: newId;return newId; never executed: } };return newId; | 0 | ||||||||||||||||||
233 | template <> struct QMetaTypeId< QVector<QV4::Profiling::MemoryAllocationProperties> > { enum { Defined = 1 }; static int qt_metatype_id() { static QBasicAtomicInt metatype_id = { 0 }; if (const
never executed: id;return id; never executed: const int newId = qRegisterMetaType< QVector<QV4::Profiling::MemoryAllocationProperties> >("QVector<QV4::Profiling::MemoryAllocationProperties>", reinterpret_cast< QVector<QV4::Profiling::MemoryAllocationProperties> *>(quintptr(-1))); metatype_id.storeRelease(newId); returnreturn id; never executed: newId;return newId; never executed: } };return newId; | 0 | ||||||||||||||||||
Switch to Source code | Preprocessed file |