15static void writeCtfMacro(QTextStream &stream,
const Provider &provider,
const Tracepoint::Field &field)
17 const QString ¶mType = field.paramType;
18 const QString &name = field.name;
19 const QString &seqLen = field.seqLen;
20 const int arrayLen = field.arrayLen;
23 if (paramType == QStringLiteral(
"double") || paramType == QStringLiteral(
"float")) {
24 const char *newline =
nullptr;
25 for (
int i = 0; i < arrayLen; i++) {
27 stream <<
"ctf_float(" <<paramType <<
", " << name <<
"_" << QString::number(i) <<
", "
28 << name <<
"[" << QString::number(i) <<
"]" <<
")";
33 stream <<
"ctf_array(" <<paramType <<
", "
34 << name <<
", " << name <<
", " << arrayLen <<
")";
39 switch (field.backendType) {
40 case Tracepoint::Field::Sequence:
41 stream <<
"ctf_sequence(" << paramType
42 <<
", " << name <<
", " << name
43 <<
", unsigned int, " << seqLen <<
")";
45 case Tracepoint::Field::Boolean:
46 case Tracepoint::Field::Integer:
47 stream <<
"ctf_integer(" << paramType <<
", " << name <<
", " << name <<
")";
49 case Tracepoint::Field::IntegerHex:
50 case Tracepoint::Field::Pointer:
51 stream <<
"ctf_integer_hex(" << paramType <<
", " << name <<
", " << name <<
")";
53 case Tracepoint::Field::Float:
54 stream <<
"ctf_float(" << paramType <<
", " << name <<
", " << name <<
")";
56 case Tracepoint::Field::String:
57 stream <<
"ctf_string(" << name <<
", " << name <<
")";
59 case Tracepoint::Field::QtString:
60 stream <<
"ctf_string(" << name <<
", " << name <<
".toUtf8().constData())";
62 case Tracepoint::Field::QtByteArray:
63 stream <<
"ctf_sequence(const char, " << name <<
", "
64 << name <<
".constData(), unsigned int, " << name <<
".size())";
66 case Tracepoint::Field::QtUrl:
67 stream <<
"ctf_string(" << name <<
", " << name <<
".toString().toUtf8().constData())";
69 case Tracepoint::Field::QtRect:
70 stream <<
"ctf_integer(int, QRect_" << name <<
"_x, " << name <<
".x()) "
71 <<
"ctf_integer(int, QRect_" << name <<
"_y, " << name <<
".y()) "
72 <<
"ctf_integer(int, QRect_" << name <<
"_width, " << name <<
".width()) "
73 <<
"ctf_integer(int, QRect_" << name <<
"_height, " << name <<
".height()) ";
75 case Tracepoint::Field::QtSizeF:
76 stream <<
"ctf_float(double, QSizeF_" << name <<
"_width, " << name <<
".width()) "
77 <<
"ctf_float(double, QSizeF_" << name <<
"_height, " << name <<
".height()) ";
79 case Tracepoint::Field::QtRectF:
80 stream <<
"ctf_float(double, QRectF_" << name <<
"_x, " << name <<
".x()) "
81 <<
"ctf_float(double, QRectF_" << name <<
"_y, " << name <<
".y()) "
82 <<
"ctf_float(double, QRectF_" << name <<
"_width, " << name <<
".width()) "
83 <<
"ctf_float(double, QRectF_" << name <<
"_height, " << name <<
".height()) ";
85 case Tracepoint::Field::QtSize:
86 stream <<
"ctf_integer(int, QSize_" << name <<
"_width, " << name <<
".width()) "
87 <<
"ctf_integer(int, QSize_" << name <<
"_height, " << name <<
".height()) ";
89 case Tracepoint::Field::EnumeratedType:
90 stream <<
"ctf_enum(" << provider.name <<
", " << typeToTypeName(paramType) <<
", int, " << name <<
", " << name <<
") ";
92 case Tracepoint::Field::FlagType:
93 stream <<
"ctf_sequence(const char , " << name <<
", "
94 << name <<
".constData(), unsigned int, " << name <<
".size())";
96 case Tracepoint::Field::Unknown:
102static void writePrologue(QTextStream &stream,
const QString &fileName,
const Provider &provider)
104 writeCommonPrologue(stream);
105 const QString guard = includeGuard(fileName);
107 stream <<
"#undef TRACEPOINT_PROVIDER\n";
108 stream <<
"#define TRACEPOINT_PROVIDER " << provider.name <<
"\n";
112 stream <<
"#if !defined(" << guard <<
")\n";
113 stream << qtHeaders();
115 if (!provider.prefixText.isEmpty())
116 stream << provider.prefixText.join(u'\n') <<
"\n\n";
117 stream <<
"#endif\n\n";
120
121
122 stream <<
"#if !defined(" << guard <<
") || defined(TRACEPOINT_HEADER_MULTI_READ)\n";
124 stream <<
"#define " << guard <<
"\n\n"
125 <<
"#undef TRACEPOINT_INCLUDE\n"
126 <<
"#define TRACEPOINT_INCLUDE \"" << fileName <<
"\"\n\n";
128 stream <<
"#include <lttng/tracepoint.h>\n\n";
130 const QString namespaceGuard = guard + QStringLiteral(
"_USE_NAMESPACE");
131 stream <<
"#if !defined(" << namespaceGuard <<
")\n"
132 <<
"#define " << namespaceGuard <<
"\n"
133 <<
"QT_USE_NAMESPACE\n"
134 <<
"#endif // " << namespaceGuard <<
"\n\n";
146 const Tracepoint &tracepoint,
const Provider &provider)
148 const QString argList = formatFunctionSignature(tracepoint.args);
149 const QString paramList = formatParameterList(provider, tracepoint.args, tracepoint.fields, LTTNG);
150 const QString &name = tracepoint.name;
151 const QString includeGuard = QStringLiteral(
"TP_%1_%2").arg(provider.name).arg(name).toUpper();
154
155
157 <<
"#ifndef " << includeGuard <<
"\n"
158 <<
"#define " << includeGuard <<
"\n"
159 <<
"QT_BEGIN_NAMESPACE\n"
160 <<
"namespace QtPrivate {\n";
162 stream <<
"inline void trace_" << name <<
"(" << argList <<
")\n"
164 <<
" tracepoint(" << provider.name <<
", " << name << paramList <<
");\n"
167 stream <<
"inline void do_trace_" << name <<
"(" << argList <<
")\n"
169 <<
" do_tracepoint(" << provider.name <<
", " << name << paramList <<
");\n"
172 stream <<
"inline bool trace_" << name <<
"_enabled()\n"
174 <<
" return tracepoint_enabled(" << provider.name <<
", " << name <<
");\n"
177 stream <<
"} // namespace QtPrivate\n"
178 <<
"QT_END_NAMESPACE\n"
179 <<
"#endif // " << includeGuard <<
"\n\n";
183 const Tracepoint &tracepoint,
const QString &providerName)
185 stream <<
"TRACEPOINT_EVENT(\n"
186 <<
" " << providerName <<
",\n"
187 <<
" " << tracepoint.name <<
",\n"
190 const char *comma =
nullptr;
192 for (
int i = 0; i < tracepoint.args.size(); i++) {
193 const auto &arg = tracepoint.args[i];
194 const auto &field = tracepoint.fields[i];
195 if (field.backendType == Tracepoint::Field::FlagType)
196 stream << comma <<
"QByteArray, " << arg.name;
198 stream << comma << arg.type <<
", " << arg.name;
205 const char *newline =
nullptr;
207 for (
const Tracepoint::Field &f : tracepoint.fields) {
209 writeCtfMacro(stream, provider, f);
213 stream <<
")\n)\n\n";
216static void writeEnums(QTextStream &stream,
const Provider &provider)
218 for (
const auto &e : provider.enumerations) {
219 stream <<
"TRACEPOINT_ENUM(\n"
220 <<
" " << provider.name <<
",\n"
221 <<
" " << typeToTypeName(e.name) <<
",\n"
222 <<
" TP_ENUM_VALUES(\n";
223 QList<
int> handledValues;
224 for (
const auto &v : e.values) {
226 stream <<
" ctf_enum_range(\"" << v.name <<
"\", " << v.value <<
", " << v.range <<
")\n";
227 }
else if (!handledValues.contains(v.value)) {
228 stream <<
" ctf_enum_value(\"" << aggregateListValues(v.value, e.values) <<
"\", " << v.value <<
")\n";
229 handledValues.append(v.value);
232 stream <<
" )\n)\n\n";
236static void writeFlags(QTextStream &stream,
const Provider &provider)
238 for (
const auto &f : provider.flags) {
239 stream <<
"TRACEPOINT_ENUM(\n"
240 <<
" " << provider.name <<
",\n"
241 <<
" " << typeToTypeName(f.name) <<
",\n"
242 <<
" TP_ENUM_VALUES(\n";
243 QList<
int> handledValues;
244 for (
const auto &v : f.values) {
245 if (!handledValues.contains(v.value)) {
246 stream <<
" ctf_enum_value(\"" << aggregateListValues(v.value, f.values) <<
"\", " << v.value <<
")\n";
247 handledValues.append(v.value);
250 stream <<
" )\n)\n\n";
254 const QString includeGuard = QStringLiteral(
"TP_%1_CONVERTERS").arg(provider.name).toUpper();
256 <<
"#ifndef " << includeGuard <<
"\n"
257 <<
"#define " << includeGuard <<
"\n";
258 stream <<
"QT_BEGIN_NAMESPACE\n";
259 stream <<
"namespace QtPrivate {\n";
260 for (
const auto &f : provider.flags) {
261 stream <<
"inline QByteArray trace_convert_" << typeToTypeName(f.name) <<
"(" << f.name <<
" val)\n";
263 stream <<
" QByteArray ret;\n";
264 stream <<
" if (val == 0) { ret.append((char)0); return ret; }\n";
266 for (
const auto &v : f.values) {
269 stream <<
" if (val & " << (1 << (v.value - 1)) <<
") { ret.append((char)" << v.value <<
"); };\n";
271 stream <<
" return ret;\n";
275 stream <<
"} // namespace QtPrivate\n"
276 <<
"QT_END_NAMESPACE\n\n"
277 <<
"#endif // " << includeGuard <<
"\n\n";
282 for (
const Tracepoint &t : provider.tracepoints) {
283 writeTracepoint(stream, provider, t, provider.name);
284 writeWrapper(stream, t, provider);
292 const QString fileName = QFileInfo(file.fileName()).fileName();
294 writePrologue(stream, fileName, provider);
295 writeEnums(stream, provider);
296 writeFlags(stream, provider);
297 writeTracepoints(stream, provider);
298 writeEpilogue(stream, fileName);