1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 12:12:47 +01:00
llvm-mirror/test/tools/llvm-xray/X86/stack-multithread.yaml
Keith Wyss c7e2e6d999 [XRay][tools] Function call stack based analysis tooling for XRay traces
Second try after fixing a code san problem with iterator reference types.

This change introduces a subcommand to the llvm-xray tool called
"stacks" which allows for analysing XRay traces provided as inputs and
accounting time to stacks instead of just individual functions. This
gives us a more precise view of where in a program the latency is
actually attributed.

The tool uses a trie data structure to keep track of the caller-callee
relationships as we process the XRay traces. In particular, we keep
track of the function call stack as we enter functions. While we're
doing this we're adding nodes in a trie and indicating a "calls"
relatinship between the caller (current top of the stack) and the callee
(the new top of the stack). When we push function ids onto the stack, we
keep track of the timestamp (TSC) for the enter event.

When exiting functions, we are able to account the duration by getting
the difference between the timestamp of the exit event and the
corresponding entry event in the stack. This works even if we somehow
miss the exit events for intermediary functions (i.e. if the exit event
is not cleanly associated with the enter event at the top of the stack).

The output of the tool currently provides just the top N leaf functions
that contribute the most latency, and the top N stacks that have the
most frequency. In the future we can provide more sophisticated query
mechanisms and potentially an export to database feature to make offline
analysis of the stack traces possible with existing tools.

Differential revision: D34863

llvm-svn: 312733
2017-09-07 18:07:48 +00:00

84 lines
4.0 KiB
YAML

#RUN: llvm-xray stack -per-thread-stacks %s | FileCheck %s --check-prefix PER-THREAD
#RUN: llvm-xray stack -aggregate-threads %s | FileCheck %s --check-prefix AGGREGATE
---
header:
version: 1
type: 0
constant-tsc: true
nonstop-tsc: true
cycle-frequency: 2601000000
records:
- { type: 0, func-id: 1, cpu: 1, thread: 111, kind: function-enter, tsc: 10001 }
- { type: 0, func-id: 1, cpu: 1, thread: 111, kind: function-enter, tsc: 10100 }
- { type: 1, func-id: 1, cpu: 1, thread: 111, kind: function-exit, tsc: 10101 }
- { type: 1, func-id: 1, cpu: 1, thread: 111, kind: function-exit, tsc: 10301 }
- { type: 0, func-id: 1, cpu: 1, thread: 111, kind: function-enter, tsc: 10401 }
- { type: 0, func-id: 2, cpu: 1, thread: 111, kind: function-enter, tsc: 10501 }
- { type: 0, func-id: 3, cpu: 1, thread: 111, kind: function-enter, tsc: 10601 }
- { type: 1, func-id: 3, cpu: 1, thread: 111, kind: function-exit, tsc: 10701 }
- { type: 1, func-id: 2, cpu: 1, thread: 111, kind: function-exit, tsc: 10751 }
- { type: 1, func-id: 1, cpu: 1, thread: 111, kind: function-exit, tsc: 10775 }
- { type: 0, func-id: 1, cpu: 1, thread: 123, kind: function-enter, tsc: 10401 }
- { type: 0, func-id: 2, cpu: 1, thread: 123, kind: function-enter, tsc: 10501 }
- { type: 0, func-id: 3, cpu: 1, thread: 123, kind: function-enter, tsc: 10701 }
- { type: 1, func-id: 3, cpu: 1, thread: 123, kind: function-exit, tsc: 10801 }
- { type: 1, func-id: 2, cpu: 1, thread: 123, kind: function-exit, tsc: 10951 }
- { type: 1, func-id: 1, cpu: 1, thread: 123, kind: function-exit, tsc: 11075 }
- { type: 0, func-id: 2, cpu: 1, thread: 200, kind: function-enter, tsc: 0 }
- { type: 0, func-id: 3, cpu: 1, thread: 200, kind: function-enter, tsc: 10 }
- { type: 1, func-id: 3, cpu: 1, thread: 200, kind: function-exit, tsc: 20 }
- { type: 1, func-id: 2, cpu: 1, thread: 200, kind: function-exit, tsc: 30 }
...
# PER-THREAD: Thread 123
# PER-THREAD: Unique Stacks: 1
# PER-THREAD: Top 10 Stacks by leaf sum:
# PER-THREAD: Sum: 100
# PER-THREAD: lvl function{{[[:space:]]+}}count{{[[:space:]]+}}sum
# PER-THREAD: #0 #1{{[[:space:]]+}}1{{[[:space:]]+}}674
# PER-THREAD: #1 #2{{[[:space:]]+}}1{{[[:space:]]+}}450
# PER-THREAD: #2 #3{{[[:space:]]+}}1{{[[:space:]]+}}100
# PER-THREAD: Top 10 Stacks by leaf count:
# PER-THREAD: #0 #1{{[[:space:]]+}}1{{[[:space:]]+}}674
# PER-THREAD: #1 #2{{[[:space:]]+}}1{{[[:space:]]+}}450
# PER-THREAD: #2 #3{{[[:space:]]+}}1{{[[:space:]]+}}100
# PER-THREAD: lvl function{{[[:space:]]+}}count{{[[:space:]]+}}sum
# AGGREGATE: Unique Stacks: 3
# AGGREGATE: Top 10 Stacks by leaf sum:
# AGGREGATE: Sum: 200
# AGGREGATE: lvl function{{[[:space:]]+}}count{{[[:space:]]+}}sum
# AGGREGATE: #0 #1{{[[:space:]]+}}3{{[[:space:]]+}}1348
# AGGREGATE: #1 #2{{[[:space:]]+}}2{{[[:space:]]+}}700
# AGGREGATE: #2 #3{{[[:space:]]+}}2{{[[:space:]]+}}200
# AGGREGATE: Sum: 10
# AGGREGATE: lvl function{{[[:space:]]+}}count{{[[:space:]]+}}sum
# AGGREGATE: #0 #2{{[[:space:]]+}}1{{[[:space:]]+}}30
# AGGREGATE: #1 #3{{[[:space:]]+}}1{{[[:space:]]+}}10
# AGGREGATE: Sum: 1
# AGGREGATE: lvl function{{[[:space:]]+}}count{{[[:space:]]+}}sum
# AGGREGATE: #0 #1{{[[:space:]]+}}2{{[[:space:]]+}}674
# AGGREGATE: #1 #1{{[[:space:]]+}}1{{[[:space:]]+}}1
# AGGREGATE: Top 10 Stacks by leaf count:
# AGGREGATE: Count: 2
# AGGREGATE: lvl function{{[[:space:]]+}}count{{[[:space:]]+}}sum
# AGGREGATE: #0 #1{{[[:space:]]+}}3{{[[:space:]]+}}1348
# AGGREGATE: #1 #2{{[[:space:]]+}}2{{[[:space:]]+}}700
# AGGREGATE: #2 #3{{[[:space:]]+}}2{{[[:space:]]+}}200
# AGGREGATE: Count: 1
# AGGREGATE: lvl function{{[[:space:]]+}}count{{[[:space:]]+}}sum
# AGGREGATE: #0 #2{{[[:space:]]+}}1{{[[:space:]]+}}30
# AGGREGATE: #1 #3{{[[:space:]]+}}1{{[[:space:]]+}}10
# AGGREGATE: Count: 1
# AGGREGATE: lvl function{{[[:space:]]+}}count{{[[:space:]]+}}sum
# AGGREGATE: #0 #1{{[[:space:]]+}}2{{[[:space:]]+}}674
# AGGREGATE: #1 #1{{[[:space:]]+}}1{{[[:space:]]+}}1