diff options
Diffstat (limited to 'src/tools/tracegen')
-rw-r--r-- | src/tools/tracegen/CMakeLists.txt | 8 | ||||
-rw-r--r-- | src/tools/tracegen/ctf.cpp | 261 | ||||
-rw-r--r-- | src/tools/tracegen/ctf.h | 2 | ||||
-rw-r--r-- | src/tools/tracegen/etw.cpp | 35 | ||||
-rw-r--r-- | src/tools/tracegen/etw.h | 2 | ||||
-rw-r--r-- | src/tools/tracegen/helpers.cpp | 23 | ||||
-rw-r--r-- | src/tools/tracegen/helpers.h | 18 | ||||
-rw-r--r-- | src/tools/tracegen/lttng.cpp | 70 | ||||
-rw-r--r-- | src/tools/tracegen/lttng.h | 2 | ||||
-rw-r--r-- | src/tools/tracegen/panic.cpp | 2 | ||||
-rw-r--r-- | src/tools/tracegen/panic.h | 2 | ||||
-rw-r--r-- | src/tools/tracegen/provider.cpp | 53 | ||||
-rw-r--r-- | src/tools/tracegen/provider.h | 13 | ||||
-rw-r--r-- | src/tools/tracegen/qtheaders.cpp | 2 | ||||
-rw-r--r-- | src/tools/tracegen/qtheaders.h | 2 | ||||
-rw-r--r-- | src/tools/tracegen/tracegen.cpp | 2 |
16 files changed, 329 insertions, 168 deletions
diff --git a/src/tools/tracegen/CMakeLists.txt b/src/tools/tracegen/CMakeLists.txt index 5acf781bf9..f5f6b2e184 100644 --- a/src/tools/tracegen/CMakeLists.txt +++ b/src/tools/tracegen/CMakeLists.txt @@ -1,8 +1,6 @@ # Copyright (C) 2022 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause -# Generated from tracegen.pro. - ##################################################################### ## tracegen Tool: ##################################################################### @@ -11,7 +9,7 @@ qt_get_tool_target_name(target_name tracegen) qt_internal_add_tool(${target_name} CORE_LIBRARY Bootstrap INSTALL_DIR "${INSTALL_LIBEXECDIR}" - TOOLS_TARGET Core # special case + TOOLS_TARGET Core SOURCES etw.cpp etw.h helpers.cpp helpers.h @@ -21,8 +19,6 @@ qt_internal_add_tool(${target_name} provider.cpp provider.h qtheaders.cpp qtheaders.h tracegen.cpp + NO_UNITY_BUILD ) qt_internal_return_unless_building_tools() - -#### Keys ignored in scope 1:.:.:tracegen.pro:<TRUE>: -# _OPTION = "host_build" diff --git a/src/tools/tracegen/ctf.cpp b/src/tools/tracegen/ctf.cpp index 22bff89d47..95ffcf89cc 100644 --- a/src/tools/tracegen/ctf.cpp +++ b/src/tools/tracegen/ctf.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2022 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "ctf.h" #include "provider.h" @@ -15,6 +15,7 @@ static void writePrologue(QTextStream &stream, const QString &fileName, const Provider &provider) { + writeCommonPrologue(stream); const QString guard = includeGuard(fileName); // include prefix text or qt headers only once @@ -88,17 +89,94 @@ static void writeWrapper(QTextStream &stream, << "#endif // " << includeGuard << "\n\n"; } + +static void writeMetadataGenerators(QTextStream &stream) +{ + stream << R"CPP( +template <typename T> +inline QString integerToMetadata(const QString &name) +{ + QString ret; + if (!std::is_signed<T>().value) + ret += QLatin1Char('u'); + if (sizeof(T) == 8) + ret += QStringLiteral("int64_t "); + else if (sizeof(T) == 4) + ret += QStringLiteral("int32_t "); + else if (sizeof(T) == 2) + ret += QStringLiteral("int16_t "); + else if (sizeof(T) == 1) + ret += QStringLiteral("int8_t "); + ret += name + QLatin1Char(';'); + return ret; +} + +template <typename T> +inline QString integerArrayToMetadata(const QString &size, const QString &name) +{ + QString ret; + if (!std::is_signed<T>().value) + ret += QLatin1Char('u'); + if (sizeof(T) == 8) + ret += QStringLiteral("int64_t "); + else if (sizeof(T) == 4) + ret += QStringLiteral("int32_t "); + else if (sizeof(T) == 2) + ret += QStringLiteral("int16_t "); + else if (sizeof(T) == 1) + ret += QStringLiteral("int8_t "); + ret += name + QLatin1Char('[') + size + QStringLiteral("];"); + return ret; +} + +template <typename T> +inline QString floatToMetadata(const QString &name) +{ + QString ret; + if (sizeof(T) == 8) + ret += QStringLiteral("double "); + else if (sizeof(T) == 4) + ret += QStringLiteral("float "); + ret += name + QLatin1Char(';'); + return ret; +} + +template <typename T> +inline QString floatArrayToMetadata(const QString &size, const QString &name) +{ + QString ret; + if (sizeof(T) == 8) + ret += QStringLiteral("double "); + else if (sizeof(T) == 4) + ret += QStringLiteral("float "); + ret += name + QLatin1Char('[') + size + QLatin1Char(']'); + return ret + QLatin1Char(';'); +} + +inline QString pointerToMetadata(const QString &name) +{ + QString ret; + if (QT_POINTER_SIZE == 8) + ret += QStringLiteral("intptr64_t "); + else if (QT_POINTER_SIZE == 4) + ret += QStringLiteral("intptr32_t "); + ret += name + QLatin1Char(';'); + return ret; +} + +)CPP"; +} + static void writeTracepoint(QTextStream &stream, const Tracepoint &tracepoint, const QString &providerName) { stream << "TRACEPOINT_EVENT(\n" << " " << providerName << ",\n" << " " << tracepoint.name << ",\n"; - stream << "\""; const auto checkUnknownArgs = [](const Tracepoint &tracepoint) { for (auto &field : tracepoint.fields) { - if (field.backendType.backendType == Tracepoint::Field::Unknown) + if (field.backendType == Tracepoint::Field::Unknown) return true; } return false; @@ -110,114 +188,117 @@ static void writeTracepoint(QTextStream &stream, ret = type.left(type.length() - 1).simplified(); if (ret.startsWith(QStringLiteral("const"))) ret = ret.right(ret.length() - 6).simplified(); - return typeToName(ret); + return typeToTypeName(ret); }; - int eventSize = 0; + QString eventSize; bool variableSize = false; - if (!checkUnknownArgs(tracepoint)) { + const bool emptyMetadata = checkUnknownArgs(tracepoint) || tracepoint.args.size() == 0; + if (!emptyMetadata) { for (int i = 0; i < tracepoint.args.size(); i++) { auto &arg = tracepoint.args[i]; auto &field = tracepoint.fields[i]; if (i > 0) { - stream << " \\n\\\n"; - stream << " "; + stream << " + QStringLiteral(\"\\n\\\n \") + "; + eventSize += QStringLiteral(" + "); } const bool array = field.arrayLen > 0; - switch (field.backendType.backendType) { + switch (field.backendType) { case Tracepoint::Field::Boolean: { - stream << "Boolean " << arg.name << ";"; - eventSize += 8; + stream << "QStringLiteral(\"Boolean " << arg.name << ";\")"; + eventSize += QStringLiteral("sizeof(bool)"); } break; case Tracepoint::Field::Integer: { - if (!field.backendType.isSigned) - stream << "u"; - stream << "int" << field.backendType.bits << "_t "; + if (array) { + stream << "integerArrayToMetadata<" << formatType(arg.type) + << ">(QStringLiteral(\"" << field.arrayLen << "\"), QStringLiteral(\"" + << arg.name << "\"))"; + } else { + stream << "integerToMetadata<" << formatType(arg.type) << ">(QStringLiteral(\"" + << arg.name << "\"))"; + } + eventSize += QStringLiteral("sizeof(") + formatType(arg.type) + QStringLiteral(")"); if (array) - stream << arg.name << "[" << field.arrayLen << "];"; - else - stream << arg.name << ";"; - eventSize += field.backendType.bits * qMax(1, field.arrayLen); - } break; - case Tracepoint::Field::Pointer: { - if (QT_POINTER_SIZE == 8) - stream << "intptr64_t " << formatType(arg.type) << "_" << arg.name << ";"; - else - stream << "intptr32_t " << formatType(arg.type) << "_" << arg.name << ";"; - eventSize += QT_POINTER_SIZE * 8; + eventSize += QStringLiteral(" * ") + QString::number(field.arrayLen); } break; + case Tracepoint::Field::Pointer: case Tracepoint::Field::IntegerHex: { - if (field.backendType.bits == 64) - stream << "intptr64_t " << formatType(arg.name) << ";"; - else - stream << "intptr32_t " << formatType(arg.name) << ";"; - eventSize += field.backendType.bits; + stream << "pointerToMetadata(QStringLiteral(\"" << formatType(arg.type) << "_" + << arg.name << "\"))"; + eventSize += QStringLiteral("QT_POINTER_SIZE"); } break; case Tracepoint::Field::Float: { - if (field.backendType.bits == 32) - stream << "float " << arg.name; - else - stream << "double " << arg.name; if (array) { - stream << "[" << field.arrayLen << "];"; + stream << "floatArrayToMetadata<" << formatType(arg.type) + << ">(QStringLiteral(\"" << field.arrayLen << "\"), QStringLiteral(\"" + << arg.name << "\"))"; } else { - stream << ";"; + stream << "floatToMetadata<" << formatType(arg.type) << ">(QStringLiteral(\"" + << arg.name << "\"))"; } - eventSize += field.backendType.bits * qMax(1, field.arrayLen); + eventSize += QStringLiteral("sizeof(") + formatType(arg.type) + QStringLiteral(")"); + if (array) + eventSize += QStringLiteral(" * ") + QString::number(field.arrayLen); } break; + case Tracepoint::Field::QtUrl: + case Tracepoint::Field::QtString: case Tracepoint::Field::String: { - stream << "string " << arg.name << ";"; - eventSize += 8; - variableSize = true; - } break; - case Tracepoint::Field::QtString: { - stream << "string " << arg.name << ";"; - eventSize += 8; - variableSize = true; - } break; - case Tracepoint::Field::QtByteArray: - break; - case Tracepoint::Field::QtUrl: { - stream << "string " << arg.name << ";"; - eventSize += 8; + stream << "QStringLiteral(\"string " << arg.name << ";\")"; + eventSize += QStringLiteral("1"); variableSize = true; } break; case Tracepoint::Field::QtRect: { - stream << "int32_t QRect_" << arg.name << "_x;\\n\\\n "; - stream << "int32_t QRect_" << arg.name << "_y;\\n\\\n "; - stream << "int32_t QRect_" << arg.name << "_width;\\n\\\n "; - stream << "int32_t QRect_" << arg.name << "_height;"; - eventSize += 32 * 4; + stream << "QStringLiteral(\"int32_t QRect_" << arg.name << "_x;\\n\\\n \")"; + stream << " + QStringLiteral(\"int32_t QRect_" << arg.name << "_y;\\n\\\n \")"; + stream << " + QStringLiteral(\"int32_t QRect_" << arg.name << "_width;\\n\\\n \")"; + stream << " + QStringLiteral(\"int32_t QRect_" << arg.name << "_height;\\n\\\n \")"; + eventSize += QStringLiteral("16"); } break; case Tracepoint::Field::QtSize: { - stream << "int32_t QSize_" << arg.name << "_width;\\n\\\n "; - stream << "int32_t QSize_" << arg.name << "_height;"; - eventSize += 32 * 2; + stream << "QStringLiteral(\"int32_t QSize_" << arg.name << "_width;\\n\\\n \")"; + stream << " + QStringLiteral(\"int32_t QSize_" << arg.name << "_height;\\n\\\n \")"; + eventSize += QStringLiteral("8"); + } break; + case Tracepoint::Field::QtRectF: { + stream << "QStringLiteral(\"float QRectF_" << arg.name << "_x;\\n\\\n \")"; + stream << " + QStringLiteral(\"float QRectF_" << arg.name << "_y;\\n\\\n \")"; + stream << " + QStringLiteral(\"float QRectF_" << arg.name << "_width;\\n\\\n \")"; + stream << " + QStringLiteral(\"float QRectF_" << arg.name << "_height;\\n\\\n \")"; + eventSize += QStringLiteral("16"); + } break; + case Tracepoint::Field::QtSizeF: { + stream << "QStringLiteral(\"float QSizeF_" << arg.name << "_width;\\n\\\n \")"; + stream << " + QStringLiteral(\"float QSizeF_" << arg.name << "_height;\\n\\\n \")"; + eventSize += QStringLiteral("8"); } break; case Tracepoint::Field::Unknown: break; case Tracepoint::Field::EnumeratedType: { - QString type = arg.type; - type.replace(QStringLiteral("::"), QStringLiteral("_")); - stream << type << " " << arg.name << ";"; - eventSize += field.backendType.bits; + stream << "QStringLiteral(\"" << typeToTypeName(arg.type) << " " << arg.name << ";\")"; + eventSize += QString::number(field.enumValueSize / 8); variableSize = true; } break; case Tracepoint::Field::FlagType: { - QString type = arg.type; - type.replace(QStringLiteral("::"), QStringLiteral("_")); - stream << "uint8_t " << arg.name << "_length;\\n\\\n "; - stream << type << " " << arg.name << "[" << arg.name << "_length];"; - eventSize += 16; + stream << "QStringLiteral(\"uint8_t " << arg.name << "_length;\\n\\\n "; + stream << typeToTypeName(arg.type) << " " << arg.name << "[" << arg.name << "_length];\")"; + eventSize += QStringLiteral("2"); + variableSize = true; } break; + case Tracepoint::Field::QtByteArray: case Tracepoint::Field::Sequence: - panic("Unhandled sequence '%s %s", qPrintable(arg.type), qPrintable(arg.name)); + panic("Unhandled type '%s %s", qPrintable(arg.type), qPrintable(arg.name)); break; } } } - stream << "\",\n"; - stream << eventSize / 8 << ", \n"; + if (emptyMetadata) + stream << "{},\n"; + else + stream << ",\n"; + if (eventSize.length()) + stream << eventSize << ", \n"; + else + stream << "0, \n"; stream << (variableSize ? "true" : "false") << "\n"; stream << ")\n\n"; } @@ -236,14 +317,23 @@ static void writeEnums(QTextStream &stream, const Provider &provider) QString name = e.name; name.replace(QStringLiteral("::"), QStringLiteral("_")); stream << "TRACEPOINT_METADATA(" << provider.name << ", " << name << ", \n"; - stream << "\"typealias enum : integer { size = " << e.valueSize << "; } {\\n\\\n"; - for (const auto &v : e.values) { - if (v.range) + stream << "QStringLiteral(\"typealias enum : integer { size = " << e.valueSize << "; } {\\n\\\n"; + + const auto values = e.values; + QList<int> handledValues; + + for (const auto &v : values) { + if (handledValues.contains(v.value)) + continue; + if (v.range) { stream << v.name << " = " << v.value << " ... " << v.range << ", \\n\\\n"; - else - stream << v.name << " = " << v.value << ", \\n\\\n"; + } else { + const QString names = aggregateListValues(v.value, values); + stream << names << " = " << v.value << ", \\n\\\n"; + handledValues.append(v.value); + } } - stream << "} := " << name << ";\\n\\n\");\n\n"; + stream << "} := " << name << ";\\n\\n\"));\n\n"; } stream << "\n"; } @@ -254,11 +344,19 @@ static void writeFlags(QTextStream &stream, const Provider &provider) QString name = e.name; name.replace(QStringLiteral("::"), QStringLiteral("_")); stream << "TRACEPOINT_METADATA(" << provider.name << ", " << name << ", \n"; - stream << "\"typealias enum : integer { size = 8; } {\\n\\\n"; - for (const auto &v : e.values) { - stream << v.name << " = " << v.value << ", \\n\\\n"; + stream << "QStringLiteral(\"typealias enum : integer { size = 8; } {\\n\\\n"; + + const auto values = e.values; + QList<int> handledValues; + + for (const auto &v : values) { + if (handledValues.contains(v.value)) + continue; + const QString names = aggregateListValues(v.value, values); + stream << names << " = " << v.value << ", \\n\\\n"; + handledValues.append(v.value); } - stream << "} := " << name << ";\\n\\n\");\n\n"; + stream << "} := " << name << ";\\n\\n\"));\n\n"; } stream << "\n"; } @@ -270,6 +368,7 @@ void writeCtf(QFile &file, const Provider &provider) const QString fileName = QFileInfo(file.fileName()).fileName(); writePrologue(stream, fileName, provider); + writeMetadataGenerators(stream); writeEnums(stream, provider); writeFlags(stream, provider); writeTracepoints(stream, provider); diff --git a/src/tools/tracegen/ctf.h b/src/tools/tracegen/ctf.h index 54f5e398c2..113e30919f 100644 --- a/src/tools/tracegen/ctf.h +++ b/src/tools/tracegen/ctf.h @@ -1,5 +1,5 @@ // Copyright (C) 2022 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #ifndef CTF_H #define CTF_H diff --git a/src/tools/tracegen/etw.cpp b/src/tools/tracegen/etw.cpp index 415a0a8dcb..f54a7896ea 100644 --- a/src/tools/tracegen/etw.cpp +++ b/src/tools/tracegen/etw.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Rafael Roquetto <rafael.roquetto@kdab.com> -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "etw.h" #include "provider.h" @@ -31,7 +31,7 @@ static void writeEtwMacro(QTextStream &stream, const Tracepoint::Field &field) return; } - switch (field.backendType.backendType) { + switch (field.backendType) { case Tracepoint::Field::QtString: stream << "TraceLoggingCountedWideString(reinterpret_cast<LPCWSTR>(" << name << ".utf16()), static_cast<ULONG>(" << name << ".size()), \"" @@ -45,12 +45,14 @@ static void writeEtwMacro(QTextStream &stream, const Tracepoint::Field &field) stream << "TraceLoggingValue(" << name << ".toEncoded().constData(), \"" << name << "\")"; return; case Tracepoint::Field::QtRect: + case Tracepoint::Field::QtRectF: stream << "TraceLoggingValue(" << name << ".x(), \"x\"), " << "TraceLoggingValue(" << name << ".y(), \"y\"), " << "TraceLoggingValue(" << name << ".width(), \"width\"), " << "TraceLoggingValue(" << name << ".height(), \"height\")"; return; case Tracepoint::Field::QtSize: + case Tracepoint::Field::QtSizeF: stream << "TraceLoggingValue(" << name << ".width(), \"width\"), " << "TraceLoggingValue(" << name << ".height(), \"height\")"; return; @@ -66,7 +68,7 @@ static void writeEtwMacro(QTextStream &stream, const Tracepoint::Field &field) return; case Tracepoint::Field::EnumeratedType: case Tracepoint::Field::FlagType: - stream << "TraceLoggingString(trace_convert_" << typeToName(field.paramType) << "(" << name << ").toUtf8().constData(), \"" << name << "\")"; + stream << "TraceLoggingString(trace_convert_" << typeToTypeName(field.paramType) << "(" << name << ").toUtf8().constData(), \"" << name << "\")"; return; default: break; @@ -102,6 +104,7 @@ static QString createGuid(const QUuid &uuid) static void writePrologue(QTextStream &stream, const QString &fileName, const Provider &provider) { + writeCommonPrologue(stream); QUuid uuid = QUuid::createUuidV5(QUuid(), provider.name.toLocal8Bit()); const QString providerV = providerVar(provider.name); @@ -177,7 +180,7 @@ static void writeWrapper(QTextStream &stream, const Provider &provider, const Tr // Convert all unknown types to QString's using QDebug. // Note the naming convention: it's field.name##Str for (const Tracepoint::Field &field : tracepoint.fields) { - if (field.backendType.backendType == Tracepoint::Field::Unknown) { + if (field.backendType == Tracepoint::Field::Unknown) { stream << " const QString " << field.name << "Str = QDebug::toString(" << field.name << ");\n"; } @@ -206,7 +209,7 @@ static void writeWrapper(QTextStream &stream, const Provider &provider, const Tr static void writeEnumConverter(QTextStream &stream, const TraceEnum &enumeration) { - stream << "inline QString trace_convert_" << typeToName(enumeration.name) << "(" << enumeration.name << " val)\n"; + stream << "inline QString trace_convert_" << typeToTypeName(enumeration.name) << "(" << enumeration.name << " val)\n"; stream << "{\n"; for (const auto &v : enumeration.values) { if (v.range != 0) { @@ -215,9 +218,14 @@ static void writeEnumConverter(QTextStream &stream, const TraceEnum &enumeration } } stream << "\n QString ret;\n switch (val) {\n"; + + QList<int> handledValues; for (const auto &v : enumeration.values) { - if (v.range == 0) - stream << " case " << v.value << ": ret = QStringLiteral(\"" << v.name << "\"); break;\n"; + if (v.range == 0 && !handledValues.contains(v.value)) { + stream << " case " << v.value << ": ret = QStringLiteral(\"" + << aggregateListValues(v.value, enumeration.values) << "\"); break;\n"; + handledValues.append(v.value); + } } stream << " }\n return ret;\n}\n"; @@ -225,17 +233,22 @@ static void writeEnumConverter(QTextStream &stream, const TraceEnum &enumeration static void writeFlagConverter(QTextStream &stream, const TraceFlags &flag) { - stream << "inline QString trace_convert_" << typeToName(flag.name) << "(" << flag.name << " val)\n"; + stream << "inline QString trace_convert_" << typeToTypeName(flag.name) << "(" << flag.name << " val)\n"; stream << "{\n QString ret;\n"; for (const auto &v : flag.values) { if (v.value == 0) { - stream << " if (val == 0)\n return QStringLiteral(\"" << v.name << "\");\n"; + stream << " if (val == 0)\n return QStringLiteral(\"" + << aggregateListValues(v.value, flag.values) << "\");\n"; break; } } + QList<int> handledValues; for (const auto &v : flag.values) { - if (v.value != 0) - stream << " if (val & " << (1 << (v.value - 1)) << ") { if (ret.length()) ret += QLatin1Char(\'|\'); ret += QStringLiteral(\"" << v.name << "\"); }\n"; + if (v.value != 0 && !handledValues.contains(v.value)) { + stream << " if (val & " << (1 << (v.value - 1)) + << ") { if (ret.length()) ret += QLatin1Char(\'|\'); ret += QStringLiteral(\"" << v.name << "\"); }\n"; + handledValues.append(v.value); + } } stream << " return ret;\n}\n"; } diff --git a/src/tools/tracegen/etw.h b/src/tools/tracegen/etw.h index ad68fe08de..88508e2034 100644 --- a/src/tools/tracegen/etw.h +++ b/src/tools/tracegen/etw.h @@ -1,5 +1,5 @@ // Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Rafael Roquetto <rafael.roquetto@kdab.com> -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #ifndef ETW_H #define ETW_H diff --git a/src/tools/tracegen/helpers.cpp b/src/tools/tracegen/helpers.cpp index ea43d71154..0ea5848493 100644 --- a/src/tools/tracegen/helpers.cpp +++ b/src/tools/tracegen/helpers.cpp @@ -1,12 +1,21 @@ // Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Rafael Roquetto <rafael.roquetto@kdab.com> -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "helpers.h" #include <qdebug.h> using namespace Qt::StringLiterals; -QString typeToName(const QString &name) +void writeCommonPrologue(QTextStream &stream) +{ + stream << R"CPP( +#ifndef Q_TRACEPOINT +#error "Q_TRACEPOINT not set for the module, Q_TRACE not enabled." +#endif +)CPP"; +} + +QString typeToTypeName(const QString &name) { QString ret = name; return ret.replace(QStringLiteral("::"), QStringLiteral("_")); @@ -57,8 +66,8 @@ QString formatParameterList(const Provider &provider, const QList<Tracepoint::Ar for (int i = 0; i < args.size(); i++) { const Tracepoint::Argument &arg = args[i]; const Tracepoint::Field &field = fields[i]; - if (field.backendType.backendType == Tracepoint::Field::FlagType) - ret += ", trace_convert_"_L1 + typeToName(arg.type) + "("_L1 + arg.name + ")"_L1; + if (field.backendType == Tracepoint::Field::FlagType) + ret += ", trace_convert_"_L1 + typeToTypeName(arg.type) + "("_L1 + arg.name + ")"_L1; else ret += ", "_L1 + arg.name; } @@ -81,7 +90,7 @@ QString formatParameterList(const Provider &provider, const QList<Tracepoint::Ar const Tracepoint::Field &field = fields[i]; if (arg.arrayLen > 1) { ret += ", trace::toByteArrayFromArray("_L1 + arg.name + ", "_L1 + QString::number(arg.arrayLen) + ") "_L1; - } else if (field.backendType.backendType == Tracepoint::Field::EnumeratedType) { + } else if (field.backendType == Tracepoint::Field::EnumeratedType) { const TraceEnum &e = findEnumeration(provider.enumerations, arg.type); QString integerType; if (e.valueSize == 8) @@ -91,9 +100,9 @@ QString formatParameterList(const Provider &provider, const QList<Tracepoint::Ar else integerType = QStringLiteral("quint32"); ret += ", trace::toByteArrayFromEnum<"_L1 + integerType + ">("_L1 + arg.name + ")"_L1; - } else if (field.backendType.backendType == Tracepoint::Field::FlagType) { + } else if (field.backendType == Tracepoint::Field::FlagType) { ret += ", trace::toByteArrayFromFlags("_L1 + arg.name + ")"_L1; - } else if (field.backendType.backendType == Tracepoint::Field::String) { + } else if (field.backendType == Tracepoint::Field::String) { ret += ", trace::toByteArrayFromCString("_L1 + arg.name + ")"_L1; } else { ret += ", "_L1 + arg.name; diff --git a/src/tools/tracegen/helpers.h b/src/tools/tracegen/helpers.h index 1dcfc26519..ea6db016a6 100644 --- a/src/tools/tracegen/helpers.h +++ b/src/tools/tracegen/helpers.h @@ -1,5 +1,5 @@ // Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Rafael Roquetto <rafael.roquetto@kdab.com> -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #ifndef HELPERS_H #define HELPERS_H @@ -8,6 +8,7 @@ #include <qlist.h> #include <qstring.h> +#include <qtextstream.h> enum ParamType { LTTNG, @@ -15,9 +16,22 @@ enum ParamType { CTF }; -QString typeToName(const QString &name); +QString typeToTypeName(const QString &type); QString includeGuard(const QString &filename); QString formatFunctionSignature(const QList<Tracepoint::Argument> &args); QString formatParameterList(const Provider &provider, const QList<Tracepoint::Argument> &args, const QList<Tracepoint::Field> &fields, ParamType type); +void writeCommonPrologue(QTextStream &stream); + +template <typename T> +static QString aggregateListValues(int value, const QList<T> &list) +{ + QStringList values; + for (const T &l : list) { + if (l.value == value) + values << l.name; + } + return values.join(QLatin1Char('_')); +} + #endif // HELPERS_H diff --git a/src/tools/tracegen/lttng.cpp b/src/tools/tracegen/lttng.cpp index effe927e4f..9711570874 100644 --- a/src/tools/tracegen/lttng.cpp +++ b/src/tools/tracegen/lttng.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Rafael Roquetto <rafael.roquetto@kdab.com> -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "lttng.h" #include "provider.h" @@ -20,12 +20,23 @@ static void writeCtfMacro(QTextStream &stream, const Provider &provider, const T const int arrayLen = field.arrayLen; if (arrayLen > 0) { - stream << "ctf_array(" <<paramType << ", " - << name << ", " << name << ", " << arrayLen << ")"; + if (paramType == QStringLiteral("double") || paramType == QStringLiteral("float")) { + const char *newline = nullptr; + for (int i = 0; i < arrayLen; i++) { + stream << newline; + stream << "ctf_float(" <<paramType << ", " << name << "_" << QString::number(i) << ", " + << name << "[" << QString::number(i) << "]" << ")"; + newline = "\n "; + } + + } else { + stream << "ctf_array(" <<paramType << ", " + << name << ", " << name << ", " << arrayLen << ")"; + } return; } - switch (field.backendType.backendType) { + switch (field.backendType) { case Tracepoint::Field::Sequence: stream << "ctf_sequence(" << paramType << ", " << name << ", " << name @@ -56,17 +67,27 @@ static void writeCtfMacro(QTextStream &stream, const Provider &provider, const T stream << "ctf_string(" << name << ", " << name << ".toString().toUtf8().constData())"; return; case Tracepoint::Field::QtRect: - stream << "ctf_integer(int, x, " << name << ".x()) " - << "ctf_integer(int, y, " << name << ".y()) " - << "ctf_integer(int, width, " << name << ".width()) " - << "ctf_integer(int, height, " << name << ".height()) "; + stream << "ctf_integer(int, QRect_" << name << "_x, " << name << ".x()) " + << "ctf_integer(int, QRect_" << name << "_y, " << name << ".y()) " + << "ctf_integer(int, QRect_" << name << "_width, " << name << ".width()) " + << "ctf_integer(int, QRect_" << name << "_height, " << name << ".height()) "; + return; + case Tracepoint::Field::QtSizeF: + stream << "ctf_float(double, QSizeF_" << name << "_width, " << name << ".width()) " + << "ctf_float(double, QSizeF_" << name << "_height, " << name << ".height()) "; + return; + case Tracepoint::Field::QtRectF: + stream << "ctf_float(double, QRectF_" << name << "_x, " << name << ".x()) " + << "ctf_float(double, QRectF_" << name << "_y, " << name << ".y()) " + << "ctf_float(double, QRectF_" << name << "_width, " << name << ".width()) " + << "ctf_float(double, QRectF_" << name << "_height, " << name << ".height()) "; return; case Tracepoint::Field::QtSize: - stream << "ctf_integer(int, width, " << name << ".width()) " - << "ctf_integer(int, height, " << name << ".height()) "; + stream << "ctf_integer(int, QSize_" << name << "_width, " << name << ".width()) " + << "ctf_integer(int, QSize_" << name << "_height, " << name << ".height()) "; return; case Tracepoint::Field::EnumeratedType: - stream << "ctf_enum(" << provider.name << ", " << typeToName(paramType) << ", int, " << name << ", " << name << ") "; + stream << "ctf_enum(" << provider.name << ", " << typeToTypeName(paramType) << ", int, " << name << ", " << name << ") "; return; case Tracepoint::Field::FlagType: stream << "ctf_sequence(const char , " << name << ", " @@ -80,6 +101,7 @@ static void writeCtfMacro(QTextStream &stream, const Provider &provider, const T static void writePrologue(QTextStream &stream, const QString &fileName, const Provider &provider) { + writeCommonPrologue(stream); const QString guard = includeGuard(fileName); stream << "#undef TRACEPOINT_PROVIDER\n"; @@ -170,7 +192,7 @@ static void writeTracepoint(QTextStream &stream, const Provider &provider, for (int i = 0; i < tracepoint.args.size(); i++) { const auto &arg = tracepoint.args[i]; const auto &field = tracepoint.fields[i]; - if (field.backendType.backendType == Tracepoint::Field::FlagType) + if (field.backendType == Tracepoint::Field::FlagType) stream << comma << "QByteArray, " << arg.name; else stream << comma << arg.type << ", " << arg.name; @@ -196,13 +218,16 @@ static void writeEnums(QTextStream &stream, const Provider &provider) for (const auto &e : provider.enumerations) { stream << "TRACEPOINT_ENUM(\n" << " " << provider.name << ",\n" - << " " << typeToName(e.name) << ",\n" + << " " << typeToTypeName(e.name) << ",\n" << " TP_ENUM_VALUES(\n"; + QList<int> handledValues; for (const auto &v : e.values) { - if (v.range > 0) + if (v.range > 0) { stream << " ctf_enum_range(\"" << v.name << "\", " << v.value << ", " << v.range << ")\n"; - else - stream << " ctf_enum_value(\"" << v.name << "\", " << v.value << ")\n"; + } else if (!handledValues.contains(v.value)) { + stream << " ctf_enum_value(\"" << aggregateListValues(v.value, e.values) << "\", " << v.value << ")\n"; + handledValues.append(v.value); + } } stream << " )\n)\n\n"; } @@ -213,10 +238,15 @@ static void writeFlags(QTextStream &stream, const Provider &provider) for (const auto &f : provider.flags) { stream << "TRACEPOINT_ENUM(\n" << " " << provider.name << ",\n" - << " " << typeToName(f.name) << ",\n" + << " " << typeToTypeName(f.name) << ",\n" << " TP_ENUM_VALUES(\n"; - for (const auto &v : f.values) - stream << " ctf_enum_value(\"" << v.name << "\", " << v.value << ")\n"; + QList<int> handledValues; + for (const auto &v : f.values) { + if (!handledValues.contains(v.value)) { + stream << " ctf_enum_value(\"" << aggregateListValues(v.value, f.values) << "\", " << v.value << ")\n"; + handledValues.append(v.value); + } + } stream << " )\n)\n\n"; } @@ -228,7 +258,7 @@ static void writeFlags(QTextStream &stream, const Provider &provider) stream << "QT_BEGIN_NAMESPACE\n"; stream << "namespace QtPrivate {\n"; for (const auto &f : provider.flags) { - stream << "inline QByteArray trace_convert_" << typeToName(f.name) << "(" << f.name << " val)\n"; + stream << "inline QByteArray trace_convert_" << typeToTypeName(f.name) << "(" << f.name << " val)\n"; stream << "{\n"; stream << " QByteArray ret;\n"; stream << " if (val == 0) { ret.append((char)0); return ret; }\n"; diff --git a/src/tools/tracegen/lttng.h b/src/tools/tracegen/lttng.h index d8fbd1291e..c36c70a1d4 100644 --- a/src/tools/tracegen/lttng.h +++ b/src/tools/tracegen/lttng.h @@ -1,5 +1,5 @@ // Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Rafael Roquetto <rafael.roquetto@kdab.com> -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #ifndef LTTNG_H #define LTTNG_H diff --git a/src/tools/tracegen/panic.cpp b/src/tools/tracegen/panic.cpp index 5258b5ba9d..fa4e6b3ee3 100644 --- a/src/tools/tracegen/panic.cpp +++ b/src/tools/tracegen/panic.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Rafael Roquetto <rafael.roquetto@kdab.com> -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "panic.h" diff --git a/src/tools/tracegen/panic.h b/src/tools/tracegen/panic.h index 51cd96fba6..ee635a8aeb 100644 --- a/src/tools/tracegen/panic.h +++ b/src/tools/tracegen/panic.h @@ -1,5 +1,5 @@ // Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Rafael Roquetto <rafael.roquetto@kdab.com> -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #ifndef PANIC_H #define PANIC_H diff --git a/src/tools/tracegen/provider.cpp b/src/tools/tracegen/provider.cpp index 741da3b099..bdd669c9cd 100644 --- a/src/tools/tracegen/provider.cpp +++ b/src/tools/tracegen/provider.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Rafael Roquetto <rafael.roquetto@kdab.com> -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "provider.h" #include "panic.h" @@ -97,17 +97,14 @@ static QString removeBraces(QString type) } #define TYPEDATA_ENTRY(type, backendType) \ -{ QT_STRINGIFY(type), backendType, sizeof(type) * 8, std::is_signed<type>::value } +{ QT_STRINGIFY(type), backendType } -static Tracepoint::Field::BackendType backendType(QString rawType) +static Tracepoint::Field::Type backendType(QString rawType) { static const struct TypeData { const char *type; Tracepoint::Field::Type backendType; - int bits; - bool isSigned; } typeTable[] = { -#ifdef UNDERSCORE_TYPES_DEFINED TYPEDATA_ENTRY(short_int, Tracepoint::Field::Integer), TYPEDATA_ENTRY(signed_short, Tracepoint::Field::Integer), TYPEDATA_ENTRY(signed_short_int, Tracepoint::Field::Integer), @@ -125,7 +122,6 @@ static Tracepoint::Field::BackendType backendType(QString rawType) TYPEDATA_ENTRY(signed_long_long, Tracepoint::Field::Integer), TYPEDATA_ENTRY(signed_long_long_int, Tracepoint::Field::Integer), TYPEDATA_ENTRY(unsigned_long_long, Tracepoint::Field::Integer), -#endif TYPEDATA_ENTRY(bool, Tracepoint::Field::Boolean), TYPEDATA_ENTRY(int, Tracepoint::Field::Integer), TYPEDATA_ENTRY(signed, Tracepoint::Field::Integer), @@ -140,11 +136,13 @@ static Tracepoint::Field::BackendType backendType(QString rawType) TYPEDATA_ENTRY(float, Tracepoint::Field::Float), TYPEDATA_ENTRY(double, Tracepoint::Field::Float), TYPEDATA_ENTRY(long double, Tracepoint::Field::Float), - { "QString", Tracepoint::Field::QtString , 0, false}, - { "QByteArray", Tracepoint::Field::QtByteArray , 0, false}, - { "QUrl", Tracepoint::Field::QtUrl , 0, false}, - { "QRect", Tracepoint::Field::QtRect , 0, false}, - { "QSize", Tracepoint::Field::QtSize , 0, false} + TYPEDATA_ENTRY(QString, Tracepoint::Field::QtString), + TYPEDATA_ENTRY(QByteArray, Tracepoint::Field::QtByteArray), + TYPEDATA_ENTRY(QUrl, Tracepoint::Field::QtUrl), + TYPEDATA_ENTRY(QRect, Tracepoint::Field::QtRect), + TYPEDATA_ENTRY(QSize, Tracepoint::Field::QtSize), + TYPEDATA_ENTRY(QRectF, Tracepoint::Field::QtRectF), + TYPEDATA_ENTRY(QSizeF, Tracepoint::Field::QtSizeF) }; auto backendType = [](const QString &rawType) { @@ -155,7 +153,7 @@ static Tracepoint::Field::BackendType backendType(QString rawType) return typeTable[i]; } - TypeData unknown = { nullptr, Tracepoint::Field::Unknown, 0, false }; + TypeData unknown = { nullptr, Tracepoint::Field::Unknown }; return unknown; }; @@ -164,7 +162,7 @@ static Tracepoint::Field::BackendType backendType(QString rawType) rawType = removeBraces(rawType); if (!sequenceLength(rawType).isNull()) - return { Tracepoint::Field::Sequence, 0, false }; + return Tracepoint::Field::Sequence; static const QRegularExpression constMatch(QStringLiteral("\\bconst\\b")); rawType.remove(constMatch); @@ -176,13 +174,13 @@ static Tracepoint::Field::BackendType backendType(QString rawType) rawType.replace(QStringLiteral(" "), QStringLiteral("_")); if (rawType == "char_ptr"_L1) - return { Tracepoint::Field::String, 0, false }; + return Tracepoint::Field::String; if (rawType.endsWith("_ptr"_L1)) - return {Tracepoint::Field::Pointer, QT_POINTER_SIZE, false }; + return Tracepoint::Field::Pointer; TypeData d = backendType(rawType); - return { d.backendType, d.bits, d.isSigned }; + return d.backendType; } static Tracepoint parseTracepoint(const Provider &provider, const QString &name, const QStringList &args, @@ -246,9 +244,10 @@ static Tracepoint parseTracepoint(const Provider &provider, const QString &name, const TraceEnum &e = findEnumeration(provider.enumerations, type); const TraceFlags &f = findFlags(provider.flags, type); if (!e.name.isEmpty()) { - field.backendType = { Tracepoint::Field::EnumeratedType, e.valueSize, false }; + field.backendType = Tracepoint::Field::EnumeratedType; + field.enumValueSize = e.valueSize; } else if (!f.name.isEmpty()) { - field.backendType = { Tracepoint::Field::FlagType, 0, false }; + field.backendType = Tracepoint::Field::FlagType; } else { field.backendType = backendType(type); } @@ -301,7 +300,7 @@ Provider parseProvider(const QString &filename) static const QRegularExpression tracedef(QStringLiteral("^([A-Za-z][A-Za-z0-9_]*)\\((.*)\\)$")); static const QRegularExpression enumenddef(QStringLiteral("^} ?([A-Za-z][A-Za-z0-9_:]*);")); - static const QRegularExpression enumdef(QStringLiteral("^([A-Za-z][A-Za-z0-9_]*)( ?= ?([0-9]*))?")); + static const QRegularExpression enumdef(QStringLiteral("^([A-Za-z][A-Za-z0-9_]*)( *= *([xabcdef0-9]*))?")); static const QRegularExpression rangedef(QStringLiteral("^RANGE\\(([A-Za-z][A-Za-z0-9_]*) ?, ?([0-9]*) ?... ?([0-9]*) ?\\)")); Provider provider; @@ -373,7 +372,7 @@ Provider parseProvider(const QString &filename) value.name = m.captured(1); value.value = m.captured(2).toInt(); value.range = m.captured(3).toInt(); - currentEnumValue = value.range; + currentEnumValue = value.range + 1; currentEnum.values.push_back(value); maxEnumValue = qMax(maxEnumValue, value.range); minEnumValue = qMin(minEnumValue, value.value); @@ -385,22 +384,26 @@ Provider parseProvider(const QString &filename) value.name = m.captured(1); value.value = m.captured(3).toInt(); value.range = 0; - currentEnumValue = value.value; + currentEnumValue = value.value + 1; currentEnum.values.push_back(value); maxEnumValue = qMax(maxEnumValue, value.value); minEnumValue = qMin(minEnumValue, value.value); } else { TraceFlags::FlagValue value; value.name = m.captured(1); - value.value = m.captured(3).toInt(); + if (m.captured(3).startsWith(QStringLiteral("0x"))) + value.value = m.captured(3).toInt(nullptr, 16); + else + value.value = m.captured(3).toInt(); if (!isPow2OrZero(value.value)) { printf("Warning: '%s' line %d:\n" " '%s' flag value is not power of two.\n", qPrintable(filename), lineNumber, qPrintable(line)); + } else { + value.value = pow2Log2(value.value); + currentFlags.values.push_back(value); } - value.value = pow2Log2(value.value); - currentFlags.values.push_back(value); } } else { maxEnumValue = qMax(maxEnumValue, currentEnumValue); diff --git a/src/tools/tracegen/provider.h b/src/tools/tracegen/provider.h index 7209659033..e5e99b868e 100644 --- a/src/tools/tracegen/provider.h +++ b/src/tools/tracegen/provider.h @@ -1,5 +1,5 @@ // Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Rafael Roquetto <rafael.roquetto@kdab.com> -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #ifndef PROVIDER_H #define PROVIDER_H @@ -33,19 +33,17 @@ struct Tracepoint QtUrl, QtRect, QtSize, + QtRectF, + QtSizeF, EnumeratedType, FlagType, Unknown }; - struct BackendType { - Type backendType; - int bits; - bool isSigned; - }; - BackendType backendType; + Type backendType; QString paramType; QString name; int arrayLen; + int enumValueSize; QString seqLen; }; @@ -77,7 +75,6 @@ struct TraceFlags { Q_DECLARE_TYPEINFO(TraceEnum, Q_RELOCATABLE_TYPE); Q_DECLARE_TYPEINFO(TraceFlags, Q_RELOCATABLE_TYPE); Q_DECLARE_TYPEINFO(Tracepoint::Argument, Q_RELOCATABLE_TYPE); -Q_DECLARE_TYPEINFO(Tracepoint::Field::BackendType, Q_RELOCATABLE_TYPE); Q_DECLARE_TYPEINFO(Tracepoint::Field, Q_RELOCATABLE_TYPE); Q_DECLARE_TYPEINFO(Tracepoint, Q_RELOCATABLE_TYPE); diff --git a/src/tools/tracegen/qtheaders.cpp b/src/tools/tracegen/qtheaders.cpp index a65ece5c5b..237c22b237 100644 --- a/src/tools/tracegen/qtheaders.cpp +++ b/src/tools/tracegen/qtheaders.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Rafael Roquetto <rafael.roquetto@kdab.com> -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "qtheaders.h" diff --git a/src/tools/tracegen/qtheaders.h b/src/tools/tracegen/qtheaders.h index 6be4d15f4a..86405c9479 100644 --- a/src/tools/tracegen/qtheaders.h +++ b/src/tools/tracegen/qtheaders.h @@ -1,5 +1,5 @@ // Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Rafael Roquetto <rafael.roquetto@kdab.com> -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #ifndef QTHEADERS_H #define QTHEADERS_H diff --git a/src/tools/tracegen/tracegen.cpp b/src/tools/tracegen/tracegen.cpp index 46b354c520..776d81675d 100644 --- a/src/tools/tracegen/tracegen.cpp +++ b/src/tools/tracegen/tracegen.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Rafael Roquetto <rafael.roquetto@kdab.com> -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "provider.h" #include "ctf.h" |