Skip to content

Commit bfcb2c1

Browse files
committed
[llvm-profgen] Decouple artificial branch from LBR parser and fix external address related issues
This patch is fixing two issues for both CS and non-CS. 1) For external-call-internal, the head samples of the the internal function should be recorded. 2) avoid ignoring LBR after meeting the interrupt branch for CS profile LBR parser is shared between CS and non-CS, we found it's error-prone while dealing with artificial branch inside LBR parser. Since artificial branch is mainly used for CS profile unwinding, this patch tries to simplify LBR parser by decoupling artificial branch code from it, the concept of artificial branch is removed and split into two transitional branches(internal-to-external, external-to-internal). Then we leave all the processing of external branch to unwinder. Specifically for unwinder, remembering that we introduce external frame in https://reviews.llvm.org/D115550. We can just take external address as a regular address and reuse current unwind function(unwindCall, unwindReturn). For a normal case, the external frame will match an external LBR, and it will be filtered out by `unwindLinear` without losing any context. The data also shows that the interrupt or standalone LBR pattern(unpaired case) does exist, we choose to handle it by clearing the call stack and keeping unwinding. Here we leverage checking in `unwindLinear`, because a standalone LBR, no matter its type, since it doesn’t have other part to pair, it will eventually cause a wrong linear range, like [external, internal], [internal, external]. Then set the state to invalid there. Reviewed By: hoy, wenlei Differential Revision: https://reviews.llvm.org/D118177
1 parent 02c2b47 commit bfcb2c1

File tree

9 files changed

+231
-205
lines changed

9 files changed

+231
-205
lines changed

llvm/test/tools/llvm-profgen/Inputs/cs-interrupt.perfscript

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ PERF_RECORD_MMAP2 2854748/2854748: [0x400000(0x1000) @ 0 00:1d 123291722 526021]
44
400634
55
400684
66
7f68c5788793
7-
0x4005c8/0x4005dc/P/-/-/0 0x40062f/0x4005b0/P/-/-/0 0x400645/0x4005ff/P/-/-/0 0x400637/0x400645/P/-/-/0 0x4005e9/0x400634/P/-/-/0 0x4005d7/0x4005e5/P/-/-/0 0x40062f/0x4005b0/P/-/-/0 0x400645/0x4005ff/P/-/-/0 0x400637/0x400645/P/-/-/0 0x4005e9/0x400634/P/-/-/0 0x4005d7/0x4005e5/P/-/-/0 0x40062f/0x4005b0/P/-/-/0 0x400645/0x4005ff/P/-/-/0 0x400637/0x400645/P/-/-/0 0xffffffff81c009d0/0x400634/P/-/-/0 0x40048a/0x40048e/P/-/-/0
7+
0x4005c8/0x4005dc/P/-/-/0 0x40062f/0x4005b0/P/-/-/0 0x400645/0x4005ff/P/-/-/0 0x400637/0x400645/P/-/-/0 0x4005e9/0x400634/P/-/-/0 0x4005d7/0x4005e5/P/-/-/0 0x40062f/0x4005b0/P/-/-/0 0x400645/0x4005ff/P/-/-/0 0x400637/0x400645/P/-/-/0 0x4005e9/0x400634/P/-/-/0 0x4005d7/0x4005e5/P/-/-/0 0xffffffff81c009d0/0x4005c3/P/-/-/0 0x40062f/0x4005b0/P/-/-/0 0x400645/0x4005ff/P/-/-/0 0x400637/0x400645/P/-/-/0
88

99

1010
4005dc
1111
400634
1212
400684
1313
7f68c5788793
14-
0x4005c8/0x4005dc/P/-/-/0 0x40062f/0x4005b0/P/-/-/0 0x400645/0x4005ff/P/-/-/0 0x400637/0x400645/P/-/-/0 0x4005e9/0x400634/P/-/-/0 0x4005d7/0x4005e5/P/-/-/0 0x40062f/0x4005b0/P/-/-/0 0x400645/0x4005ff/P/-/-/0 0x400637/0x400645/P/-/-/0 0x4005e9/0x400634/P/-/-/0 0x4005d7/0x4005e5/P/-/-/0 0x400634/0xffffffff81c009d0/P/-/-/0 0x40062f/0x4005b0/P/-/-/0 0x400645/0x4005ff/P/-/-/0 0x400637/0x400645/P/-/-/0 0x40048a/0x40048e/P/-/-/0
14+
0x4005c8/0x4005dc/P/-/-/0 0x40062f/0x4005b0/P/-/-/0 0x400645/0x4005ff/P/-/-/0 0x400637/0x400645/P/-/-/0 0x4005e9/0x400634/P/-/-/0 0x4005d7/0x4005e5/P/-/-/0 0x40062f/0x4005b0/P/-/-/0 0x400645/0x4005ff/P/-/-/0 0x400637/0x400645/P/-/-/0 0x4005e9/0x400634/P/-/-/0 0x4005d7/0x4005e5/P/-/-/0 0x4005c3/0xffffffff81c009d0/P/-/-/0 0x40062f/0x4005b0/P/-/-/0 0x400645/0x4005ff/P/-/-/0 0x400637/0x400645/P/-/-/0
1515

1616
// Transition 0xffffffff81c009d0/0x400634 is due to interrupt. Records after it, i.e, 0x40048a/0x40048e, should be ignored to avoid bogus instruction ranges.

llvm/test/tools/llvm-profgen/callback-external-addr.test

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/callback-external-addr.perfscript --binary=%S/Inputs/callback-external-addr.perfbin --output=%t --skip-symbolization
22
; RUN: FileCheck %s --input-file %t --check-prefix=CHECK-UNWINDER
33

4+
; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/callback-external-addr.perfscript --binary=%S/Inputs/callback-external-addr.perfbin --output=%t --profile-summary-cold-count=0 --csspgo-preinliner=0 --gen-cs-nested-profile=0
5+
; RUN: FileCheck %s --input-file %t
6+
47
; Test if call stack is correctly truncated.
58
; CHECK-UNWINDER-NOT: main:3 @ bar
69
; CHECK-UNWINDER-NOT: main:3 @ foo
@@ -18,9 +21,18 @@
1821
; [foo:2 @ qux:2 @ callBeforeReturn] and [foo:2 @ qux:4 @ callAfterReturn] should exist
1922
; which means the callback return won't interrupt the previous call stack
2023

24+
25+
; CHECK-UNWINDER: []
26+
; CHECK-UNWINDER: 0
27+
; CHECK-UNWINDER: 5
28+
; CHECK-UNWINDER: ffffffffffc00001->690:13
29+
; CHECK-UNWINDER: ffffffffffc00001->6a0:7
30+
; CHECK-UNWINDER: ffffffffffc00001->715:7
31+
; CHECK-UNWINDER: ffffffffffc00001->730:5
32+
; CHECK-UNWINDER: ffffffffffc00001->7b0:5
2133
; CHECK-UNWINDER: [bar]
2234
; CHECK-UNWINDER: 1
23-
; CHECK-UNWINDER: 690-69e:12
35+
; CHECK-UNWINDER: 690-69e:13
2436
; CHECK-UNWINDER: 0
2537
; CHECK-UNWINDER: [baz]
2638
; CHECK-UNWINDER: 1
@@ -59,6 +71,34 @@
5971
; CHECK-UNWINDER: 1
6072
; CHECK-UNWINDER: 7bf->77d:5
6173

74+
; CHECK: [foo:2 @ qux]:132:5
75+
; CHECK: 0: 5
76+
; CHECK: 1: 5
77+
; CHECK: 2: 6 callBeforeReturn:6
78+
; CHECK: 3: 7
79+
; CHECK: 4: 7 callAfterReturn:7
80+
; CHECK: 5: 6
81+
; CHECK: [bar]:91:13
82+
; CHECK: 0: 13
83+
; CHECK: 1: 13
84+
; CHECK: [main]:65:0
85+
; CHECK: 2.1: 5
86+
; CHECK: 2.2: 5
87+
; CHECK: 3: 5
88+
; CHECK: [foo]:60:5
89+
; CHECK: 0: 5
90+
; CHECK: 1: 5
91+
; CHECK: 2: 5 qux:5
92+
; CHECK: [baz]:49:7
93+
; CHECK: 0: 7
94+
; CHECK: 1: 7
95+
; CHECK: [foo:2 @ qux:4 @ callAfterReturn]:49:7
96+
; CHECK: 0: 7
97+
; CHECK: 1: 7
98+
; CHECK: [foo:2 @ qux:2 @ callBeforeReturn]:42:6
99+
; CHECK: 0: 6
100+
; CHECK: 1: 6
101+
62102
; libcallback.c
63103
; clang -shared -fPIC -o libcallback.so libcallback.c
64104

llvm/test/tools/llvm-profgen/cs-interrupt.test

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,35 +5,57 @@
55
; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/cs-interrupt.perfscript --binary=%S/Inputs/noinline-cs-noprobe.perfbin --output=%t --profile-summary-cold-count=0 --csspgo-preinliner=0 --gen-cs-nested-profile=0
66
; RUN: FileCheck %s --input-file %t
77

8-
; CHECK:[main:1 @ foo]:88:0
9-
; CHECK: 2: 5
10-
; CHECK: 3: 5 bar:5
11-
; CHECK:[main:1 @ foo:3 @ bar]:74:5
12-
; CHECK: 0: 5
13-
; CHECK: 1: 5
14-
; CHECK: 2: 3
15-
; CHECK: 5: 4
8+
; CHECK: [main:1 @ foo]:72:0
9+
; CHECK: 2: 4
10+
; CHECK: 3: 4 bar:4
11+
; CHECK: [main:1 @ foo:3 @ bar]:67:4
12+
; CHECK: 0: 4
13+
; CHECK: 1: 5
14+
; CHECK: 2: 3
15+
; CHECK: 5: 4
16+
; CHECK: [foo]:32:0
17+
; CHECK: 2: 2
18+
; CHECK: 3: 2 bar:2
19+
; CHECK: [bar]:8:2
20+
; CHECK: 0: 1
21+
; CHECK: 1: 1
1622

17-
; CHECK-UNWINDER: [main:1 @ foo]
23+
; CHECK-UNWINDER: []
24+
; CHECK-UNWINDER-NEXT: 0
25+
; CHECK-UNWINDER-NEXT: 1
26+
; CHECK-UNWINDER-NEXT: ffffffffffc00001->5c3:1
27+
; CHECK-UNWINDER-NEXT: [bar]
28+
; CHECK-UNWINDER-NEXT: 1
29+
; CHECK-UNWINDER-NEXT: 5b0-5c3:1
30+
; CHECK-UNWINDER-NEXT: 0
31+
; CHECK-UNWINDER-NEXT: [foo]
32+
; CHECK-UNWINDER-NEXT: 2
33+
; CHECK-UNWINDER-NEXT: 5ff-62f:2
34+
; CHECK-UNWINDER-NEXT: 645-645:2
1835
; CHECK-UNWINDER-NEXT: 3
19-
; CHECK-UNWINDER-NEXT: 5ff-62f:5
36+
; CHECK-UNWINDER-NEXT: 62f->5b0:2
37+
; CHECK-UNWINDER-NEXT: 637->645:2
38+
; CHECK-UNWINDER-NEXT: 645->5ff:2
39+
; CHECK-UNWINDER-NEXT: [main:1 @ foo]
40+
; CHECK-UNWINDER-NEXT: 3
41+
; CHECK-UNWINDER-NEXT: 5ff-62f:4
2042
; CHECK-UNWINDER-NEXT: 634-637:4
21-
; CHECK-UNWINDER-NEXT: 645-645:5
43+
; CHECK-UNWINDER-NEXT: 645-645:4
2244
; CHECK-UNWINDER-NEXT: 3
23-
; CHECK-UNWINDER-NEXT: 62f->5b0:5
24-
; CHECK-UNWINDER-NEXT: 637->645:5
25-
; CHECK-UNWINDER-NEXT: 645->5ff:5
45+
; CHECK-UNWINDER-NEXT: 62f->5b0:4
46+
; CHECK-UNWINDER-NEXT: 637->645:4
47+
; CHECK-UNWINDER-NEXT: 645->5ff:4
2648
; CHECK-UNWINDER-NEXT: [main:1 @ foo:3 @ bar]
27-
; CHECK-UNWINDER-NEXT: 3
49+
; CHECK-UNWINDER-NEXT: 4
2850
; CHECK-UNWINDER-NEXT: 5b0-5c8:2
29-
; CHECK-UNWINDER-NEXT: 5b0-5d7:3
51+
; CHECK-UNWINDER-NEXT: 5b0-5d7:2
52+
; CHECK-UNWINDER-NEXT: 5c3-5d7:1
3053
; CHECK-UNWINDER-NEXT: 5e5-5e9:4
3154
; CHECK-UNWINDER-NEXT: 3
3255
; CHECK-UNWINDER-NEXT: 5c8->5dc:2
3356
; CHECK-UNWINDER-NEXT: 5d7->5e5:4
3457
; CHECK-UNWINDER-NEXT: 5e9->634:4
3558

36-
3759
; original code:
3860
; clang -O0 -g test.c -o a.out
3961
#include <stdio.h>

llvm/test/tools/llvm-profgen/inline-noprobe2.test

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/artificial-branch.perfscript --binary=%S/Inputs/inline-noprobe2.perfbin --output=%t --skip-symbolization --use-offset=0
2-
; RUN: FileCheck %s --input-file %t --check-prefix=CHECK-ARTIFICIAL-BRANCH
2+
; RUN: FileCheck %s --input-file %t --check-prefix=CHECK-EXT-ADDR
33
; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-noprobe2.perfscript --binary=%S/Inputs/inline-noprobe2.perfbin --output=%t --skip-symbolization --use-offset=0
44
; RUN: FileCheck %s --input-file %t --check-prefix=CHECK-RAW-PROFILE
55
; RUN: llvm-profgen --format=text --unsymbolized-profile=%t --binary=%S/Inputs/inline-noprobe2.perfbin --output=%t1 --use-offset=0
@@ -8,11 +8,13 @@
88
; RUN: llvm-profgen --format=extbinary --perfscript=%S/Inputs/inline-noprobe2.perfscript --binary=%S/Inputs/inline-noprobe2.perfbin --output=%t --populate-profile-symbol-list=1
99
; RUN: llvm-profdata show -show-prof-sym-list -sample %t | FileCheck %s --check-prefix=CHECK-SYM-LIST
1010

11-
; CHECK-ARTIFICIAL-BRANCH: 2
12-
; CHECK-ARTIFICIAL-BRANCH: 400870-400870:2
13-
; CHECK-ARTIFICIAL-BRANCH: 400875-4008bf:1
14-
; CHECK-ARTIFICIAL-BRANCH: 1
15-
; CHECK-ARTIFICIAL-BRANCH: 4008bf->400870:2
11+
; CHECK-EXT-ADDR: 2
12+
; CHECK-EXT-ADDR-NEXT: 400870-400870:2
13+
; CHECK-EXT-ADDR-NEXT: 400875-4008bf:1
14+
; CHECK-EXT-ADDR-NEXT: 2
15+
; CHECK-EXT-ADDR-NEXT: 4008bf->400870:2
16+
; Value 1 is external address
17+
; CHECK-EXT-ADDR-NEXT: 1->400875:1
1618

1719
; CHECK-SYM-LIST: Dump profile symbol list
1820
; CHECK-SYM-LIST: main
@@ -46,6 +48,22 @@
4648
;CHECK: 1: 6
4749
;CHECK: 2: 6
4850
;CHECK: 3: 6
51+
;CHECK: main:1362:0
52+
;CHECK: 0: 0
53+
;CHECK: 3: 0
54+
;CHECK: 4.1: 0
55+
;CHECK: 4.3: 0
56+
;CHECK: 5.1: 17
57+
;CHECK: 5.3: 17
58+
;CHECK: 6: 17
59+
;CHECK: 6.1: 17
60+
;CHECK: 6.3: 17
61+
;CHECK: 7: 0
62+
;CHECK: 8: 0 quick_sort:1
63+
;CHECK: 9: 0
64+
;CHECK: 11: 0
65+
;CHECK: 14: 0
66+
;CHECK: 65499: 0
4967
;CHECK: partition_pivot_last:1210:7
5068
;CHECK: 1: 6
5169
;CHECK: 2: 6
@@ -76,22 +94,6 @@
7694
;CHECK: 1: 5
7795
;CHECK: 2: 5
7896
;CHECK: 3: 5
79-
;CHECK: main:906:0
80-
;CHECK: 0: 0
81-
;CHECK: 3: 0
82-
;CHECK: 4.1: 0
83-
;CHECK: 4.3: 0
84-
;CHECK: 5.1: 11
85-
;CHECK: 5.3: 11
86-
;CHECK: 6: 11
87-
;CHECK: 6.1: 14
88-
;CHECK: 6.3: 11
89-
;CHECK: 7: 0
90-
;CHECK: 8: 0 quick_sort:1
91-
;CHECK: 9: 0
92-
;CHECK: 11: 0
93-
;CHECK: 14: 0
94-
;CHECK: 65499: 0
9597
;CHECK: quick_sort:903:25
9698
;CHECK: 1: 24
9799
;CHECK: 2: 12 partition_pivot_last:7 partition_pivot_first:5

0 commit comments

Comments
 (0)