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::procid_t, std::pair<uint64_t, uint64_t>>
33 PerThreadMinMaxTSCMap;
34 typedef std::map<uint8_t, std::pair<uint64_t, uint64_t>> PerCPUMinMaxTSCMap;
35 typedef std::vector<std::pair<int32_t, uint64_t>> FunctionStack;
36 typedef std::map<llvm::sys::procid_t, FunctionStack>
37 PerThreadFunctionStackMap;
40 PerThreadFunctionStackMap PerThreadFunctionStack;
41 FunctionLatencyMap FunctionLatencies;
42 PerThreadMinMaxTSCMap PerThreadMinMaxTSC;
43 PerCPUMinMaxTSCMap PerCPUMinMaxTSC;
44 FuncIdConversionHelper &FuncIdHelper;
46 bool DeduceSiblingCalls = false;
47 uint64_t CurrentMaxTSC = 0;
49 void recordLatency(int32_t FuncId, uint64_t Latency) {
50 FunctionLatencies[FuncId].push_back(Latency);
54 explicit LatencyAccountant(FuncIdConversionHelper &FuncIdHelper,
55 bool DeduceSiblingCalls)
56 : FuncIdHelper(FuncIdHelper), DeduceSiblingCalls(DeduceSiblingCalls) {}
58 const FunctionLatencyMap &getFunctionLatencies() const {
59 return FunctionLatencies;
62 const PerThreadMinMaxTSCMap &getPerThreadMinMaxTSC() const {
63 return PerThreadMinMaxTSC;
66 const PerCPUMinMaxTSCMap &getPerCPUMinMaxTSC() const {
67 return PerCPUMinMaxTSC;
70 /// Returns false in case we fail to account the provided record. This happens
71 /// in the following cases:
73 /// - An exit record does not match any entry records for the same function.
74 /// If we've been set to deduce sibling calls, we try walking up the stack
75 /// and recording times for the higher level functions.
76 /// - A record has a TSC that's before the latest TSC that has been
77 /// recorded. We still record the TSC for the min-max.
79 bool accountRecord(const XRayRecord &Record);
81 const FunctionStack *getThreadFunctionStack(llvm::sys::procid_t TId) const {
82 auto I = PerThreadFunctionStack.find(TId);
83 if (I == PerThreadFunctionStack.end())
88 const PerThreadFunctionStackMap &getPerThreadFunctionStack() const {
89 return PerThreadFunctionStack;
95 void exportStatsAsText(raw_ostream &OS, const XRayFileHeader &Header) const;
96 void exportStatsAsCSV(raw_ostream &OS, const XRayFileHeader &Header) const;
99 // Internal helper to implement common parts of the exportStatsAs...
101 template <class F> void exportStats(const XRayFileHeader &Header, F fn) const;
107 #endif // LLVM_TOOLS_LLVM_XRAY_XRAY_ACCOUNT_H