mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[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
This commit is contained in:
parent
3a3339b4bd
commit
17defd68a8
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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.
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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>() {
|
||||
|
@ -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'>";
|
||||
}
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user