Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[XRay] Use FDR Records+Visitors for Trace Loading
Summary: In this change, we overhaul the implementation for loading `llvm::xray::Trace` objects from files by using the combination of specific FDR Record types and visitors breaking up the logic to reconstitute an execution trace from flight-data recorder mode traces. This change allows us to handle out-of-temporal order blocks as written in files, and more consistently recreate an execution trace spanning multiple blocks and threads. To do this, we use the `WallclockRecord` associated with each block to maintain temporal order of blocks, before attempting to recreate an execution trace. The new addition in this change is the `TraceExpander` type which can be thought of as a decompression/decoding routine. This allows us to maintain the state of an execution environment (thread+process) and create `XRayRecord` instances that fit nicely into the `Trace` container. We don't have a specific unit test for the TraceExpander type, since the end-to-end tests for the `llvm-xray convert` tools already cover precisely this codepath. This change completes the refactoring started with D50441. Depends on D51911. Reviewers: mboerger, eizan Subscribers: mgorny, hiraditya, mgrang, llvm-commits Differential Revision: https://reviews.llvm.org/D51912 llvm-svn: 341906
- Loading branch information
1 parent
d2c5040
commit 985c2b9
Showing
6 changed files
with
230 additions
and
546 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
//===- FDRTraceExpander.h - XRay FDR Mode Log Expander --------------------===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// We define an FDR record visitor which can re-constitute XRayRecord instances | ||
// from a sequence of FDR mode records in arrival order into a collection. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
#ifndef INCLUDE_LLVM_XRAY_FDRTRACEEXPANDER_H_ | ||
#define INCLUDE_LLVM_XRAY_FDRTRACEEXPANDER_H_ | ||
|
||
#include "llvm/ADT/STLExtras.h" | ||
#include "llvm/XRay/FDRRecords.h" | ||
#include "llvm/XRay/XRayRecord.h" | ||
|
||
namespace llvm { | ||
namespace xray { | ||
|
||
class TraceExpander : public RecordVisitor { | ||
// Type-erased callback for handling individual XRayRecord instances. | ||
function_ref<void(const XRayRecord &)> C; | ||
int32_t PID = 0; | ||
int32_t TID = 0; | ||
uint64_t BaseTSC = 0; | ||
XRayRecord CurrentRecord{}; | ||
uint16_t CPUId = 0; | ||
uint16_t LogVersion = 0; | ||
bool BuildingFunction = false; | ||
bool IgnoringRecords = false; | ||
|
||
void resetCurrentRecord(); | ||
|
||
public: | ||
explicit TraceExpander(function_ref<void(const XRayRecord &)> F, uint16_t L) | ||
: RecordVisitor(), C(std::move(F)), LogVersion(L) {} | ||
|
||
Error visit(BufferExtents &) override; | ||
Error visit(WallclockRecord &) override; | ||
Error visit(NewCPUIDRecord &) override; | ||
Error visit(TSCWrapRecord &) override; | ||
Error visit(CustomEventRecord &) override; | ||
Error visit(CallArgRecord &) override; | ||
Error visit(PIDRecord &) override; | ||
Error visit(NewBufferRecord &) override; | ||
Error visit(EndBufferRecord &) override; | ||
Error visit(FunctionRecord &) override; | ||
|
||
// Must be called after all the records have been processed, to handle the | ||
// most recent record generated. | ||
Error flush(); | ||
}; | ||
|
||
} // namespace xray | ||
} // namespace llvm | ||
|
||
#endif // INCLUDE_LLVM_XRAY_FDRTRACEEXPANDER_H_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
//===- FDRTraceExpander.cpp -----------------------------------------------===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
#include "llvm/XRay/FDRTraceExpander.h" | ||
|
||
namespace llvm { | ||
namespace xray { | ||
|
||
void TraceExpander::resetCurrentRecord() { | ||
if (BuildingFunction) | ||
C(CurrentRecord); | ||
BuildingFunction = false; | ||
CurrentRecord.CallArgs.clear(); | ||
} | ||
|
||
Error TraceExpander::visit(BufferExtents &) { | ||
resetCurrentRecord(); | ||
return Error::success(); | ||
} | ||
|
||
Error TraceExpander::visit(WallclockRecord &) { return Error::success(); } | ||
|
||
Error TraceExpander::visit(NewCPUIDRecord &R) { | ||
CPUId = R.cpuid(); | ||
BaseTSC = R.tsc(); | ||
return Error::success(); | ||
} | ||
|
||
Error TraceExpander::visit(TSCWrapRecord &R) { | ||
BaseTSC = R.tsc(); | ||
return Error::success(); | ||
} | ||
|
||
Error TraceExpander::visit(CustomEventRecord &) { | ||
// TODO: Support custom event records in the future. | ||
resetCurrentRecord(); | ||
return Error::success(); | ||
} | ||
|
||
Error TraceExpander::visit(CallArgRecord &R) { | ||
CurrentRecord.CallArgs.push_back(R.arg()); | ||
CurrentRecord.Type = RecordTypes::ENTER_ARG; | ||
return Error::success(); | ||
} | ||
|
||
Error TraceExpander::visit(PIDRecord &R) { | ||
PID = R.pid(); | ||
return Error::success(); | ||
} | ||
|
||
Error TraceExpander::visit(NewBufferRecord &R) { | ||
if (IgnoringRecords) | ||
IgnoringRecords = false; | ||
TID = R.tid(); | ||
if (LogVersion == 2) | ||
PID = R.tid(); | ||
return Error::success(); | ||
} | ||
|
||
Error TraceExpander::visit(EndBufferRecord &) { | ||
IgnoringRecords = true; | ||
resetCurrentRecord(); | ||
return Error::success(); | ||
} | ||
|
||
Error TraceExpander::visit(FunctionRecord &R) { | ||
resetCurrentRecord(); | ||
if (!IgnoringRecords) { | ||
BaseTSC += R.delta(); | ||
CurrentRecord.Type = R.recordType(); | ||
CurrentRecord.FuncId = R.functionId(); | ||
CurrentRecord.TSC = BaseTSC; | ||
CurrentRecord.PId = PID; | ||
CurrentRecord.TId = TID; | ||
CurrentRecord.CPU = CPUId; | ||
BuildingFunction = true; | ||
} | ||
return Error::success(); | ||
} | ||
|
||
Error TraceExpander::flush() { | ||
resetCurrentRecord(); | ||
return Error::success(); | ||
} | ||
|
||
} // namespace xray | ||
} // namespace llvm |
Oops, something went wrong.