1 //===- xray-account.h - XRay Function Call Accounting ---------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines the interface for performing some basic function call
11 // accounting from an XRay trace.
13 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_TOOLS_LLVM_XRAY_XRAY_ACCOUNT_H
15 #define LLVM_TOOLS_LLVM_XRAY_XRAY_ACCOUNT_H
21 #include "func-id-helper.h"
22 #include "llvm/Support/Program.h"
23 #include "llvm/Support/raw_ostream.h"
24 #include "llvm/XRay/XRayRecord.h"
29 class LatencyAccountant
{
31 typedef std::map
<int32_t, std::vector
<uint64_t>> FunctionLatencyMap
;
32 typedef std::map
<llvm::sys::ProcessInfo::ProcessId
,
33 std::pair
<uint64_t, uint64_t>>
34 PerThreadMinMaxTSCMap
;
35 typedef std::map
<uint8_t, std::pair
<uint64_t, uint64_t>> PerCPUMinMaxTSCMap
;
36 typedef std::vector
<std::pair
<int32_t, uint64_t>> FunctionStack
;
37 typedef std::map
<llvm::sys::ProcessInfo::ProcessId
, FunctionStack
>
38 PerThreadFunctionStackMap
;
41 PerThreadFunctionStackMap PerThreadFunctionStack
;
42 FunctionLatencyMap FunctionLatencies
;
43 PerThreadMinMaxTSCMap PerThreadMinMaxTSC
;
44 PerCPUMinMaxTSCMap PerCPUMinMaxTSC
;
45 FuncIdConversionHelper
&FuncIdHelper
;
47 bool DeduceSiblingCalls
= false;
48 uint64_t CurrentMaxTSC
= 0;
50 void recordLatency(int32_t FuncId
, uint64_t Latency
) {
51 FunctionLatencies
[FuncId
].push_back(Latency
);
55 explicit LatencyAccountant(FuncIdConversionHelper
&FuncIdHelper
,
56 bool DeduceSiblingCalls
)
57 : FuncIdHelper(FuncIdHelper
), DeduceSiblingCalls(DeduceSiblingCalls
) {}
59 const FunctionLatencyMap
&getFunctionLatencies() const {
60 return FunctionLatencies
;
63 const PerThreadMinMaxTSCMap
&getPerThreadMinMaxTSC() const {
64 return PerThreadMinMaxTSC
;
67 const PerCPUMinMaxTSCMap
&getPerCPUMinMaxTSC() const {
68 return PerCPUMinMaxTSC
;
71 /// Returns false in case we fail to account the provided record. This happens
72 /// in the following cases:
74 /// - An exit record does not match any entry records for the same function.
75 /// If we've been set to deduce sibling calls, we try walking up the stack
76 /// and recording times for the higher level functions.
77 /// - A record has a TSC that's before the latest TSC that has been
78 /// recorded. We still record the TSC for the min-max.
80 bool accountRecord(const XRayRecord
&Record
);
83 getThreadFunctionStack(llvm::sys::ProcessInfo::ProcessId TId
) const {
84 auto I
= PerThreadFunctionStack
.find(TId
);
85 if (I
== PerThreadFunctionStack
.end())
90 const PerThreadFunctionStackMap
&getPerThreadFunctionStack() const {
91 return PerThreadFunctionStack
;
97 void exportStatsAsText(raw_ostream
&OS
, const XRayFileHeader
&Header
) const;
98 void exportStatsAsCSV(raw_ostream
&OS
, const XRayFileHeader
&Header
) const;
101 // Internal helper to implement common parts of the exportStatsAs...
103 template <class F
> void exportStats(const XRayFileHeader
&Header
, F fn
) const;
109 #endif // LLVM_TOOLS_LLVM_XRAY_XRAY_ACCOUNT_H