diff options
-rw-r--r-- | src/corelib/global/qlogging.cpp | 2 | ||||
-rw-r--r-- | src/tools/tracegen/etw.cpp | 25 |
2 files changed, 23 insertions, 4 deletions
diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp index fd38a9d6c4..e562fed336 100644 --- a/src/corelib/global/qlogging.cpp +++ b/src/corelib/global/qlogging.cpp @@ -1682,7 +1682,7 @@ static void win_outputDebugString_helper(QStringView message) } else { wchar_t *messagePart = new wchar_t[maxOutputStringLength + 1]; for (qsizetype i = 0; i < message.length(); i += maxOutputStringLength) { - const qsizetype length = std::min(message.length() - i, maxOutputStringLength); + const qsizetype length = qMin(message.length() - i, maxOutputStringLength); const qsizetype len = message.mid(i, length).toWCharArray(messagePart); Q_ASSERT(len == length); messagePart[len] = 0; diff --git a/src/tools/tracegen/etw.cpp b/src/tools/tracegen/etw.cpp index eac518dbab..b17d54bf52 100644 --- a/src/tools/tracegen/etw.cpp +++ b/src/tools/tracegen/etw.cpp @@ -59,7 +59,8 @@ static void writeEtwMacro(QTextStream &stream, const Tracepoint::Field &field) switch (field.backendType) { case Tracepoint::Field::QtString: stream << "TraceLoggingCountedWideString(reinterpret_cast<LPCWSTR>(" - << name << ".utf16()), " << name << ".size(), \"" << name << "\")"; + << name << ".utf16()), static_cast<ULONG>(" << name << ".size()), \"" + << name << "\")"; return; case Tracepoint::Field::QtByteArray: stream << "TraceLoggingBinary(" << name << ".constData(), " @@ -77,6 +78,13 @@ static void writeEtwMacro(QTextStream &stream, const Tracepoint::Field &field) case Tracepoint::Field::Pointer: stream << "TraceLoggingPointer(" << name << ", \"" << name << "\")"; return; + case Tracepoint::Field::Unknown: + // Write down the previously stringified data (like we do for QString). + // The string is already created in writeWrapper(). + // Variable name is name##Str. + stream << "TraceLoggingCountedWideString(reinterpret_cast<LPCWSTR>(" << name + << "Str.utf16()), static_cast<ULONG>(" << name << "Str.size()), \"" << name << "\")"; + return; default: break; } @@ -181,8 +189,17 @@ static void writeWrapper(QTextStream &stream, const Tracepoint &tracepoint, stream << "\n"; stream << "inline void trace_" << name << "(" << argList << ")\n" - << "{\n" - << " TraceLoggingWrite(" << provider << ", \"" << name << "\""; + << "{\n"; + + // 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 == Tracepoint::Field::Unknown) { + stream << " const QString " << field.name << "Str = QDebug::toString(" << field.name + << ");\n"; + } + } + stream << " TraceLoggingWrite(" << provider << ", \"" << name << "\""; for (const Tracepoint::Field &field : tracepoint.fields) { stream << ",\n"; @@ -213,12 +230,14 @@ static void writeTracepoints(QTextStream &stream, const Provider &provider) stream << "#if !defined(" << includeGuard << ") && !defined(TRACEPOINT_DEFINE)\n" << "#define " << includeGuard << "\n" + << "QT_BEGIN_NAMESPACE\n" << "namespace QtPrivate {\n"; for (const Tracepoint &t : provider.tracepoints) writeWrapper(stream, t, provider.name); stream << "} // namespace QtPrivate\n" + << "QT_END_NAMESPACE\n" << "#endif // " << includeGuard << "\n\n"; } |