diff options
author | Dean Michael Berris <dberris@google.com> | 2018-11-01 00:18:52 +0000 |
---|---|---|
committer | Dean Michael Berris <dberris@google.com> | 2018-11-01 00:18:52 +0000 |
commit | 6b67ff03002f39adf773f456aa4fd79bb22f3a04 (patch) | |
tree | 69edb04de2b575e8af2eaae3fae04c9d65fc8797 | |
parent | d4891a1b7add681782e1e2ea8922facbf2c10f4c (diff) | |
download | bcm5719-llvm-6b67ff03002f39adf773f456aa4fd79bb22f3a04.tar.gz bcm5719-llvm-6b67ff03002f39adf773f456aa4fd79bb22f3a04.zip |
[XRay] Add CPU ID in Custom Event FDR Records
Summary:
This change cuts across compiler-rt and llvm, to increment the FDR log
version number to 4, and include the CPU ID in the custom event records.
This is a step towards allowing us to change the `llvm::xray::Trace`
object to start representing both custom and typed events in the stream
of records. Follow-on changes will allow us to change the kinds of
records we're presenting in the stream of traces, to incorporate the
data in custom/typed events.
A follow-on change will handle the typed event case, where it may not
fit within the 15-byte buffer for metadata records.
This work is part of the larger effort to enable writing analysis and
processing tools using a common in-memory representation of the events
found in traces. The work will focus on porting existing tools in LLVM
to use the common representation and informing the design of a
library/framework for expressing trace event analysis as C++ programs.
Reviewers: mboerger, eizan
Subscribers: hiraditya, mgrang, llvm-commits
Differential Revision: https://reviews.llvm.org/D53920
llvm-svn: 345798
-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'>"; } }; |