99 QString ret;
100 if (!std::is_signed<T>().value)
101 ret += QLatin1Char('u');
102 if (sizeof(T) == 8)
103 ret += QStringLiteral("int64_t ");
104 else if (sizeof(T) == 4)
105 ret += QStringLiteral("int32_t ");
106 else if (sizeof(T) == 2)
107 ret += QStringLiteral("int16_t ");
108 else if (sizeof(T) == 1)
109 ret += QStringLiteral("int8_t ");
110 ret += name + QLatin1Char(';');
111 return ret;
112}
113
114template <typename T>
115inline QString integerArrayToMetadata(const QString &size, const QString &name)
116{
117 QString ret;
118 if (!std::is_signed<T>().value)
119 ret += QLatin1Char('u');
120 if (sizeof(T) == 8)
121 ret += QStringLiteral("int64_t ");
122 else if (sizeof(T) == 4)
123 ret += QStringLiteral("int32_t ");
124 else if (sizeof(T) == 2)
125 ret += QStringLiteral("int16_t ");
126 else if (sizeof(T) == 1)
127 ret += QStringLiteral("int8_t ");
128 ret += name + QLatin1Char('[') + size + QStringLiteral("];");
129 return ret;
130}
131
132template <typename T>
133inline QString floatToMetadata(const QString &name)
134{
135 QString ret;
136 if (sizeof(T) == 8)
137 ret += QStringLiteral("double ");
138 else if (sizeof(T) == 4)
139 ret += QStringLiteral("float ");
140 ret += name + QLatin1Char(';');
141 return ret;
142}
143
144template <typename T>
145inline QString floatArrayToMetadata(const QString &size, const QString &name)
146{
147 QString ret;
148 if (sizeof(T) == 8)
149 ret += QStringLiteral("double ");
150 else if (sizeof(T) == 4)
151 ret += QStringLiteral("float ");
152 ret += name + QLatin1Char('[') + size + QLatin1Char(']');
153 return ret + QLatin1Char(';');
154}
155
156inline QString pointerToMetadata(const QString &name)
157{
158 QString ret;
159 if (QT_POINTER_SIZE == 8)
160 ret += QStringLiteral("intptr64_t ");
161 else if (QT_POINTER_SIZE == 4)
162 ret += QStringLiteral("intptr32_t ");
163 ret += name + QLatin1Char(';');
164 return ret;
165}
166
167)CPP";
170static void writeTracepoint(QTextStream &stream,
171 const Tracepoint &tracepoint,
const QString &providerName)
173 stream <<
"TRACEPOINT_EVENT(\n"
174 <<
" " << providerName <<
",\n"
175 <<
" " << tracepoint.name <<
",\n";
177 const auto checkUnknownArgs = [](
const Tracepoint &tracepoint) {
178 for (
auto &field : tracepoint.fields) {
179 if (field.backendType == Tracepoint::Field::Unknown)
185 const auto formatType = [](
const QString &type) {
187 if (type.endsWith(QLatin1Char(
'*')) || type.endsWith(QLatin1Char(
'&')))
188 ret = type.left(type.length() - 1).simplified();
189 if (ret.startsWith(QStringLiteral(
"const")))
190 ret = ret.right(ret.length() - 6).simplified();
191 return typeToTypeName(ret);
194 bool variableSize =
false;
195 const bool emptyMetadata = checkUnknownArgs(tracepoint) || tracepoint.args.size() == 0;
196 if (!emptyMetadata) {
197 for (
int i = 0; i < tracepoint.args.size(); i++) {
198 auto &arg = tracepoint.args[i];
199 auto &field = tracepoint.fields[i];
201 stream <<
" + QStringLiteral(\"\\n\\\n \") + ";
202 eventSize += QStringLiteral(
" + ");
204 const bool array = field.arrayLen > 0;
205 switch (field.backendType) {
206 case Tracepoint::Field::Boolean: {
207 stream <<
"QStringLiteral(\"Boolean " << arg.name <<
";\")";
208 eventSize += QStringLiteral(
"sizeof(bool)");
210 case Tracepoint::Field::Integer: {
212 stream <<
"integerArrayToMetadata<" << formatType(arg.type)
213 <<
">(QStringLiteral(\"" << field.arrayLen <<
"\"), QStringLiteral(\""
214 << arg.name <<
"\"))";
216 stream <<
"integerToMetadata<" << formatType(arg.type) <<
">(QStringLiteral(\""
217 << arg.name <<
"\"))";
219 eventSize += QStringLiteral(
"sizeof(") + formatType(arg.type) + QStringLiteral(
")");
221 eventSize += QStringLiteral(
" * ") + QString::number(field.arrayLen);
223 case Tracepoint::Field::Pointer:
224 case Tracepoint::Field::IntegerHex: {
225 stream <<
"pointerToMetadata(QStringLiteral(\"" << formatType(arg.type) <<
"_"
226 << arg.name <<
"\"))";
227 eventSize += QStringLiteral(
"QT_POINTER_SIZE");
229 case Tracepoint::Field::Float: {
231 stream <<
"floatArrayToMetadata<" << formatType(arg.type)
232 <<
">(QStringLiteral(\"" << field.arrayLen <<
"\"), QStringLiteral(\""