diff options
-rw-r--r-- | compiler-rt/lib/xray/xray_fdr_controller.h | 2 | ||||
-rw-r--r-- | compiler-rt/lib/xray/xray_fdr_log_writer.h | 5 | ||||
-rw-r--r-- | compiler-rt/lib/xray/xray_fdr_logging.cc | 3 | ||||
-rw-r--r-- | llvm/include/llvm/XRay/FDRRecords.h | 14 | ||||
-rw-r--r-- | llvm/lib/XRay/FDRTraceWriter.cpp | 7 | ||||
-rw-r--r-- | llvm/lib/XRay/FileHeaderReader.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/XRay/RecordInitializer.cpp | 13 | ||||
-rw-r--r-- | llvm/lib/XRay/RecordPrinter.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/XRay/Trace.cpp | 13 | ||||
-rw-r--r-- | llvm/unittests/XRay/FDRProducerConsumerTest.cpp | 2 | ||||
-rw-r--r-- | llvm/unittests/XRay/FDRRecordPrinterTest.cpp | 4 |
11 files changed, 47 insertions, 24 deletions
diff --git a/compiler-rt/lib/xray/xray_fdr_controller.h b/compiler-rt/lib/xray/xray_fdr_controller.h index d3433080e60..65e19a589ff 100644 --- a/compiler-rt/lib/xray/xray_fdr_controller.h +++ b/compiler-rt/lib/xray/xray_fdr_controller.h @@ -327,7 +327,7 @@ public: LatestTSC = 0; UndoableFunctionEnters = 0; UndoableTailExits = 0; - return W.writeCustomEvent(TSC, Event, EventSize); + return W.writeCustomEvent(TSC, CPU, Event, EventSize); } bool typedEvent(uint64_t TSC, uint16_t CPU, uint16_t EventType, diff --git a/compiler-rt/lib/xray/xray_fdr_log_writer.h b/compiler-rt/lib/xray/xray_fdr_log_writer.h index a703bca1064..b9e438e98dc 100644 --- a/compiler-rt/lib/xray/xray_fdr_log_writer.h +++ b/compiler-rt/lib/xray/xray_fdr_log_writer.h @@ -110,9 +110,10 @@ public: return true; } - bool writeCustomEvent(uint64_t TSC, const void *Event, int32_t EventSize) { + bool writeCustomEvent(uint64_t TSC, uint16_t CPU, const void *Event, + int32_t EventSize) { writeMetadata<MetadataRecord::RecordKinds::CustomEventMarker>(EventSize, - TSC); + TSC, CPU); internal_memcpy(NextRecord, Event, EventSize); NextRecord += EventSize; atomic_fetch_add(&Buffer.Extents, EventSize, memory_order_acq_rel); diff --git a/compiler-rt/lib/xray/xray_fdr_logging.cc b/compiler-rt/lib/xray/xray_fdr_logging.cc index 6e9633843ad..916ee603468 100644 --- a/compiler-rt/lib/xray/xray_fdr_logging.cc +++ b/compiler-rt/lib/xray/xray_fdr_logging.cc @@ -148,7 +148,8 @@ static XRayFileHeader &fdrCommonHeaderInfo() { // Version 2 of the log writes the extents of the buffer, instead of // relying on an end-of-buffer record. // Version 3 includes PID metadata record - H.Version = 3; + // Version 4 includes CPU data in the custom event records + H.Version = 4; H.Type = FileTypes::FDR_LOG; // Test for required CPU features and cache the cycle frequency diff --git a/llvm/include/llvm/XRay/FDRRecords.h b/llvm/include/llvm/XRay/FDRRecords.h index c524dab2a33..2d47ab3cfe5 100644 --- a/llvm/include/llvm/XRay/FDRRecords.h +++ b/llvm/include/llvm/XRay/FDRRecords.h @@ -153,13 +153,14 @@ public: class CustomEventRecord : public MetadataRecord { int32_t Size = 0; uint64_t TSC = 0; + uint16_t CPU = 0; std::string Data{}; friend class RecordInitializer; public: CustomEventRecord() = default; - explicit CustomEventRecord(uint64_t S, uint64_t T, std::string D) - : MetadataRecord(), Size(S), TSC(T), Data(std::move(D)) {} + explicit CustomEventRecord(uint64_t S, uint64_t T, uint16_t C, std::string D) + : MetadataRecord(), Size(S), TSC(T), CPU(C), Data(std::move(D)) {} MetadataType metadataType() const override { return MetadataType::CustomEvent; @@ -167,6 +168,7 @@ public: int32_t size() const { return Size; } uint64_t tsc() const { return TSC; } + uint16_t cpu() const { return CPU; } StringRef data() const { return Data; } Error apply(RecordVisitor &V) override; @@ -272,10 +274,16 @@ public: class RecordInitializer : public RecordVisitor { DataExtractor &E; uint32_t &OffsetPtr; + uint16_t Version; public: + static constexpr uint16_t DefaultVersion = 4u; + + explicit RecordInitializer(DataExtractor &DE, uint32_t &OP, uint16_t V) + : RecordVisitor(), E(DE), OffsetPtr(OP), Version(V) {} + explicit RecordInitializer(DataExtractor &DE, uint32_t &OP) - : RecordVisitor(), E(DE), OffsetPtr(OP) {} + : RecordInitializer(DE, OP, DefaultVersion) {} Error visit(BufferExtents &) override; Error visit(WallclockRecord &) override; diff --git a/llvm/lib/XRay/FDRTraceWriter.cpp b/llvm/lib/XRay/FDRTraceWriter.cpp index d0206e775a8..4f40593cba0 100644 --- a/llvm/lib/XRay/FDRTraceWriter.cpp +++ b/llvm/lib/XRay/FDRTraceWriter.cpp @@ -94,9 +94,10 @@ Error FDRTraceWriter::visit(TSCWrapRecord &R) { } Error FDRTraceWriter::visit(CustomEventRecord &R) { - if (auto E = writeMetadata<5u>(OS, R.size(), R.tsc())) + if (auto E = writeMetadata<5u>(OS, R.size(), R.tsc(), R.cpu())) return E; - ArrayRef<char> Bytes(R.data().data(), R.data().size()); + auto D = R.data(); + ArrayRef<char> Bytes(D.data(), D.size()); OS.write(Bytes); return Error::success(); } @@ -127,7 +128,7 @@ Error FDRTraceWriter::visit(FunctionRecord &R) { OS.write(TypeRecordFuncId); OS.write(R.delta()); return Error::success(); -} // namespace xray +} } // namespace xray } // namespace llvm diff --git a/llvm/lib/XRay/FileHeaderReader.cpp b/llvm/lib/XRay/FileHeaderReader.cpp index 967e85f30d2..9dea217840b 100644 --- a/llvm/lib/XRay/FileHeaderReader.cpp +++ b/llvm/lib/XRay/FileHeaderReader.cpp @@ -63,8 +63,7 @@ Expected<XRayFileHeader> readBinaryFormatHeader(DataExtractor &HeaderExtractor, // Manually advance the offset pointer 16 bytes, after getting a raw memcpy // from the underlying data. OffsetPtr += 16; - if (FileHeader.Version != 1 && FileHeader.Version != 2 && - FileHeader.Version != 3) + if (FileHeader.Version < 1 || FileHeader.Version > 4) return createStringError(std::make_error_code(std::errc::invalid_argument), "Unsupported XRay file version: %d at offset %d", FileHeader.Version, OffsetPtr); diff --git a/llvm/lib/XRay/RecordInitializer.cpp b/llvm/lib/XRay/RecordInitializer.cpp index fe76f7d79fb..2ebaa1cec26 100644 --- a/llvm/lib/XRay/RecordInitializer.cpp +++ b/llvm/lib/XRay/RecordInitializer.cpp @@ -118,6 +118,19 @@ Error RecordInitializer::visit(CustomEventRecord &R) { std::make_error_code(std::errc::invalid_argument), "Cannot read a custom event TSC field at offset %d.", OffsetPtr); + // For version 4 onwards, of the FDR log, we want to also capture the CPU ID + // of the custom event. + if (Version >= 4) { + PreReadOffset = OffsetPtr; + R.CPU = E.getU16(&OffsetPtr); + if (PreReadOffset == OffsetPtr) + return createStringError( + std::make_error_code(std::errc::invalid_argument), + "Missing CPU field at offset %d", OffsetPtr); + } + + assert(OffsetPtr > BeginOffset && + OffsetPtr - BeginOffset <= MetadataRecord::kMetadataBodySize); OffsetPtr += MetadataRecord::kMetadataBodySize - (OffsetPtr - BeginOffset); // Next we read in a fixed chunk of data from the given offset. diff --git a/llvm/lib/XRay/RecordPrinter.cpp b/llvm/lib/XRay/RecordPrinter.cpp index 09b25ddba25..81d77f67cc1 100644 --- a/llvm/lib/XRay/RecordPrinter.cpp +++ b/llvm/lib/XRay/RecordPrinter.cpp @@ -35,8 +35,9 @@ Error RecordPrinter::visit(TSCWrapRecord &R) { } Error RecordPrinter::visit(CustomEventRecord &R) { - OS << formatv("<Custom Event: tsc = {0}, size = {1}, data = '{2}'>", R.tsc(), - R.size(), R.data()) + OS << formatv( + "<Custom Event: tsc = {0}, cpu = {1}, size = {2}, data = '{3}'>", + R.tsc(), R.cpu(), R.size(), R.data()) << Delim; return Error::success(); } diff --git a/llvm/lib/XRay/Trace.cpp b/llvm/lib/XRay/Trace.cpp index 1d7c723864d..e7b878cb83f 100644 --- a/llvm/lib/XRay/Trace.cpp +++ b/llvm/lib/XRay/Trace.cpp @@ -310,12 +310,11 @@ Error loadFDRLog(StringRef Data, bool IsLittleEndian, { for (auto &PTB : Index) { auto &Blocks = PTB.second; - llvm::sort( - Blocks, - [](const BlockIndexer::Block &L, const BlockIndexer::Block &R) { - return (L.WallclockTime->seconds() < R.WallclockTime->seconds() && - L.WallclockTime->nanos() < R.WallclockTime->nanos()); - }); + llvm::sort(Blocks, [](const BlockIndexer::Block &L, + const BlockIndexer::Block &R) { + return (L.WallclockTime->seconds() < R.WallclockTime->seconds() && + L.WallclockTime->nanos() < R.WallclockTime->nanos()); + }); auto Adder = [&](const XRayRecord &R) { Records.push_back(R); }; TraceExpander Expander(Adder, FileHeader.Version); for (auto &B : Blocks) { @@ -435,7 +434,7 @@ Expected<Trace> llvm::xray::loadTrace(const DataExtractor &DE, bool Sort) { } break; case FLIGHT_DATA_RECORDER_FORMAT: - if (Version == 1 || Version == 2 || Version == 3) { + if (Version >= 1 && Version <= 4) { if (auto E = loadFDRLog(DE.getData(), DE.isLittleEndian(), T.FileHeader, T.Records)) return std::move(E); diff --git a/llvm/unittests/XRay/FDRProducerConsumerTest.cpp b/llvm/unittests/XRay/FDRProducerConsumerTest.cpp index 838e6ca9bf1..09ec44db26e 100644 --- a/llvm/unittests/XRay/FDRProducerConsumerTest.cpp +++ b/llvm/unittests/XRay/FDRProducerConsumerTest.cpp @@ -54,7 +54,7 @@ template <> std::unique_ptr<Record> MakeRecord<WallclockRecord>() { } template <> std::unique_ptr<Record> MakeRecord<CustomEventRecord>() { - return make_unique<CustomEventRecord>(4, 1, "data"); + return make_unique<CustomEventRecord>(4, 1, 2, "data"); } template <> std::unique_ptr<Record> MakeRecord<CallArgRecord>() { diff --git a/llvm/unittests/XRay/FDRRecordPrinterTest.cpp b/llvm/unittests/XRay/FDRRecordPrinterTest.cpp index 339d4b0d428..321892e7240 100644 --- a/llvm/unittests/XRay/FDRRecordPrinterTest.cpp +++ b/llvm/unittests/XRay/FDRRecordPrinterTest.cpp @@ -55,11 +55,11 @@ template <> struct Helper<TSCWrapRecord> { template <> struct Helper<CustomEventRecord> { static std::unique_ptr<Record> construct() { - return make_unique<CustomEventRecord>(4, 1, "data"); + return make_unique<CustomEventRecord>(4, 1, 2, "data"); } static const char *expected() { - return "<Custom Event: tsc = 1, size = 4, data = 'data'>"; + return "<Custom Event: tsc = 1, cpu = 2, size = 4, data = 'data'>"; } }; |