[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