[clang] [llvm] [TimeProfiler][Clang] Add zstd-compressed time-trace output support (PR #228627)

Chandler Carruth via cfe-commits cfe-commits at lists.llvm.org
Sun Oct 18 02:33:47 PDT 2026


================
@@ -425,26 +440,68 @@ void llvm::timeTraceProfilerFinishThread() {
 void llvm::timeTraceProfilerWrite(raw_pwrite_stream &OS) {
   assert(TimeTraceProfilerInstance != nullptr &&
          "Profiler object can't be null");
-  TimeTraceProfilerInstance->write(OS);
+  TimeTraceCompression CompressType =
+      TimeTraceProfilerInstance->TimeTraceCompress;
+  if (CompressType != TimeTraceCompression::Zstd) {
+    TimeTraceProfilerInstance->write(OS);
+    return;
+  }
+
+  compression::Format F = compression::Format::Zstd;
+  if (const char *Reason = compression::getReasonIfUnsupported(F))
+    report_fatal_error(Reason);
+
+  SmallVector<char, 0> Uncompressed;
+  {
+    raw_svector_ostream UncompressedOS(Uncompressed);
+    TimeTraceProfilerInstance->write(UncompressedOS);
+  }
+  SmallVector<uint8_t, 0> Compressed;
+  compression::compress(
+      compression::Params(F),
+      ArrayRef(reinterpret_cast<const uint8_t *>(Uncompressed.data()),
+               Uncompressed.size()),
+      Compressed);
+  OS.write(reinterpret_cast<const char *>(Compressed.data()),
+           Compressed.size());
 }
 
 Error llvm::timeTraceProfilerWrite(StringRef PreferredFileName,
                                    StringRef FallbackFileName) {
   assert(TimeTraceProfilerInstance != nullptr &&
          "Profiler object can't be null");
 
+  TimeTraceCompression CompressType =
+      TimeTraceProfilerInstance->TimeTraceCompress;
   std::string Path = PreferredFileName.str();
   if (Path.empty()) {
     Path = FallbackFileName == "-" ? "out" : FallbackFileName.str();
     Path += TimeTraceFileExtension;
+    if (CompressType == TimeTraceCompression::Zstd)
+      Path += ".zst";
+  } else if (CompressType == TimeTraceCompression::Infer) {
+    CompressType = inferTimeTraceCompressionFromPath(Path);
+  }
+
+  if (CompressType == TimeTraceCompression::Zstd) {
+    if (const char *Reason =
+            compression::getReasonIfUnsupported(compression::Format::Zstd))
+      return createStringError(inconvertibleErrorCode(), Reason);
   }
 
   std::error_code EC;
-  raw_fd_ostream OS(Path, EC, sys::fs::OF_TextWithCRLF);
+  sys::fs::OpenFlags Flags = CompressType == TimeTraceCompression::Zstd
+                                 ? sys::fs::OF_None
+                                 : sys::fs::OF_TextWithCRLF;
+  raw_fd_ostream OS(Path, EC, Flags);
   if (EC)
     return createStringError(EC, "Could not open " + Path);
 
+  TimeTraceCompression SavedCompress =
+      TimeTraceProfilerInstance->TimeTraceCompress;
+  TimeTraceProfilerInstance->TimeTraceCompress = CompressType;
----------------
chandlerc wrote:

Yeah. I'll send a follow-up PR to try and simplify the API here.

https://github.com/llvm/llvm-project/pull/228627


More information about the cfe-commits mailing list