Skip to content

Commit aa84078

Browse files
committed
Address review comments
1 parent 9761e5d commit aa84078

File tree

2 files changed

+143
-1
lines changed

2 files changed

+143
-1
lines changed

bolt/lib/Passes/NonPacProtectedRetAnalysis.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ static void traceRegMask(const BinaryContext &BC, StringRef Label,
8484
dbgs() << "\n";
8585
}
8686

87-
// This class represents mapping from arbitrary physical registers to
87+
// This class represents mapping from a set of arbitrary physical registers to
8888
// consecutive array indexes.
8989
class TrackedRegisters {
9090
static const uint16_t NoIndex = -1;
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
// REQUIRES: asserts
2+
//
3+
// RUN: %clang %cflags -march=armv8.3-a %s -o %t.exe
4+
// RUN: llvm-bolt-binary-analysis --scanners=pacret -no-threads \
5+
// RUN: -debug-only bolt-nonpacprotectedret %t.exe 2>&1 | FileCheck %s
6+
7+
// Check the debug output generated by PAuth gadget scanner to make sure the
8+
// that output is kept meaningful and to provide an overview of what happens
9+
// inside the scanner.
10+
11+
.globl simple
12+
.type simple,@function
13+
simple:
14+
paciasp
15+
b 1f
16+
1:
17+
autiasp
18+
ret
19+
.size simple, .-simple
20+
21+
// CHECK-LABEL:Analyzing in function simple, AllocatorId 1
22+
// CHECK-NEXT: Binary Function "simple" {
23+
// CHECK-NEXT: Number : 1
24+
// CHECK-NEXT: State : CFG constructed
25+
// ...
26+
// CHECK: BB Layout : [[BB0:[0-9a-zA-Z.]+]], [[BB1:[0-9a-zA-Z.]+]]
27+
// CHECK-NEXT: }
28+
// CHECK-NEXT: [[BB0]] (2 instructions, align : 1)
29+
// CHECK-NEXT: Entry Point
30+
// CHECK-NEXT: 00000000: paciasp
31+
// CHECK-NEXT: 00000004: b [[BB1]]
32+
// CHECK-NEXT: Successors: [[BB1]]
33+
// CHECK-EMPTY:
34+
// CHECK-NEXT: [[BB1]] (2 instructions, align : 1)
35+
// CHECK-NEXT: Predecessors: [[BB0]]
36+
// CHECK-NEXT: 00000008: autiasp
37+
// CHECK-NEXT: 0000000c: ret
38+
// CHECK-EMPTY:
39+
// CHECK-NEXT: DWARF CFI Instructions:
40+
// CHECK-NEXT: <empty>
41+
// CHECK-NEXT: End of Function "simple"
42+
// CHECK-EMPTY:
43+
// CHECK-NEXT: PacRetAnalysis::ComputeNext( hint #25, pacret-state<NonAutClobRegs: , Insts: >)
44+
// CHECK-NEXT: .. result: (pacret-state<NonAutClobRegs: LR W30 W30_HI , Insts: >)
45+
// CHECK-NEXT: PacRetAnalysis::ComputeNext( b [[BB1]], pacret-state<NonAutClobRegs: LR W30 W30_HI , Insts: >)
46+
// CHECK-NEXT: .. result: (pacret-state<NonAutClobRegs: LR W30 W30_HI , Insts: >)
47+
// CHECK-NEXT: PacRetAnalysis::Confluence(
48+
// CHECK-NEXT: State 1: pacret-state<NonAutClobRegs: , Insts: >
49+
// CHECK-NEXT: State 2: pacret-state<NonAutClobRegs: LR W30 W30_HI , Insts: >)
50+
// CHECK-NEXT: merged state: pacret-state<NonAutClobRegs: LR W30 W30_HI , Insts: >
51+
// CHECK-NEXT: PacRetAnalysis::ComputeNext( hint #29, pacret-state<NonAutClobRegs: LR W30 W30_HI , Insts: >)
52+
// CHECK-NEXT: .. result: (pacret-state<NonAutClobRegs: , Insts: >)
53+
// CHECK-NEXT: PacRetAnalysis::ComputeNext( ret x30, pacret-state<NonAutClobRegs: , Insts: >)
54+
// CHECK-NEXT: .. result: (pacret-state<NonAutClobRegs: , Insts: >)
55+
// CHECK-NEXT: PacRetAnalysis::Confluence(
56+
// CHECK-NEXT: State 1: pacret-state<NonAutClobRegs: LR W30 W30_HI , Insts: >
57+
// CHECK-NEXT: State 2: pacret-state<NonAutClobRegs: LR W30 W30_HI , Insts: >)
58+
// CHECK-NEXT: merged state: pacret-state<NonAutClobRegs: LR W30 W30_HI , Insts: >
59+
// CHECK-NEXT: PacRetAnalysis::ComputeNext( hint #29, pacret-state<NonAutClobRegs: LR W30 W30_HI , Insts: >)
60+
// CHECK-NEXT: .. result: (pacret-state<NonAutClobRegs: , Insts: >)
61+
// CHECK-NEXT: PacRetAnalysis::ComputeNext( ret x30, pacret-state<NonAutClobRegs: , Insts: >)
62+
// CHECK-NEXT: .. result: (pacret-state<NonAutClobRegs: , Insts: >)
63+
// CHECK-NEXT: After PacRetAnalysis:
64+
// CHECK-NEXT: Binary Function "simple" {
65+
// CHECK-NEXT: Number : 1
66+
// CHECK-NEXT: State : CFG constructed
67+
// ...
68+
// CHECK: BB Layout : [[BB0]], [[BB1]]
69+
// CHECK-NEXT: }
70+
// CHECK-NEXT: [[BB0]] (2 instructions, align : 1)
71+
// CHECK-NEXT: Entry Point
72+
// CHECK-NEXT: 00000000: paciasp # PacRetAnalysis: pacret-state<NonAutClobRegs: BitVector, Insts: >
73+
// CHECK-NEXT: 00000004: b [[BB1]] # PacRetAnalysis: pacret-state<NonAutClobRegs: BitVector, Insts: >
74+
// CHECK-NEXT: Successors: [[BB1]]
75+
// CHECK-EMPTY:
76+
// CHECK-NEXT: [[BB1]] (2 instructions, align : 1)
77+
// CHECK-NEXT: Predecessors: [[BB0]]
78+
// CHECK-NEXT: 00000008: autiasp # PacRetAnalysis: pacret-state<NonAutClobRegs: BitVector, Insts: >
79+
// CHECK-NEXT: 0000000c: ret # PacRetAnalysis: pacret-state<NonAutClobRegs: BitVector, Insts: >
80+
// CHECK-EMPTY:
81+
// CHECK-NEXT: DWARF CFI Instructions:
82+
// CHECK-NEXT: <empty>
83+
// CHECK-NEXT: End of Function "simple"
84+
// CHECK-EMPTY:
85+
// CHECK-NEXT: Found RET inst: 00000000: ret # PacRetAnalysis: pacret-state<NonAutClobRegs: BitVector, Insts: >
86+
// CHECK-NEXT: RetReg: LR
87+
// CHECK-NEXT: Authenticated reg: (none)
88+
// CHECK-NEXT: NonAutClobRegs at Ret:{{[ \t]*$}}
89+
// CHECK-NEXT: Intersection with RetReg:{{[ \t]*$}}
90+
91+
.globl clobber
92+
.type clobber,@function
93+
clobber:
94+
mov w30, #0
95+
ret
96+
.size clobber, .-clobber
97+
98+
// CHECK-LABEL:Analyzing in function clobber, AllocatorId 1
99+
// ...
100+
// CHECK: PacRetAnalysis::ComputeNext( mov w30, #0x0, pacret-state<NonAutClobRegs: , Insts: >)
101+
// CHECK-NEXT: .. result: (pacret-state<NonAutClobRegs: W30 , Insts: >)
102+
// CHECK-NEXT: PacRetAnalysis::ComputeNext( ret x30, pacret-state<NonAutClobRegs: W30 , Insts: >)
103+
// CHECK-NEXT: .. result: (pacret-state<NonAutClobRegs: W30 , Insts: >)
104+
// CHECK-NEXT: After PacRetAnalysis:
105+
// CHECK-NEXT: Binary Function "clobber" {
106+
// ...
107+
// CHECK: End of Function "clobber"
108+
109+
// The above output was printed after first run of analysis
110+
111+
// CHECK-EMPTY:
112+
// CHECK-NEXT: Found RET inst: 00000000: ret # PacRetAnalysis: pacret-state<NonAutClobRegs: BitVector, Insts: >
113+
// CHECK-NEXT: RetReg: LR
114+
// CHECK-NEXT: Authenticated reg: (none)
115+
// CHECK-NEXT: NonAutClobRegs at Ret: W30
116+
// CHECK-NEXT: Intersection with RetReg: W30
117+
// CHECK-NEXT: PacRetAnalysis::ComputeNext( mov w30, #0x0, pacret-state<NonAutClobRegs: , Insts: [0]()>)
118+
// CHECK-NEXT: .. result: (pacret-state<NonAutClobRegs: W30 , Insts: [0](0x{{[0-9a-f]+}} )>)
119+
// CHECK-NEXT: PacRetAnalysis::ComputeNext( ret x30, pacret-state<NonAutClobRegs: W30 , Insts: [0](0x{{[0-9a-f]+}} )>)
120+
// CHECK-NEXT: .. result: (pacret-state<NonAutClobRegs: W30 , Insts: [0](0x{{[0-9a-f]+}} )>)
121+
// CHECK-NEXT: After PacRetAnalysis:
122+
// CHECK-NEXT: Binary Function "clobber" {
123+
// ...
124+
// CHECK: End of Function "clobber"
125+
126+
// The analysis was re-computed with register tracking, as an issue was found in this function.
127+
// Re-checking the instructions:
128+
129+
// CHECK-EMPTY:
130+
// CHECK-NEXT: Found RET inst: 00000000: ret # PacRetAnalysis: pacret-state<NonAutClobRegs: BitVector, Insts: [0](0x{{[0-9a-f]+}} )>
131+
// CHECK-NEXT: RetReg: LR
132+
// CHECK-NEXT: Authenticated reg: (none)
133+
// CHECK-NEXT: NonAutClobRegs at Ret: W30
134+
// CHECK-NEXT: Intersection with RetReg: W30
135+
136+
137+
// CHECK-LABEL:Analyzing in function main, AllocatorId 1
138+
.globl main
139+
.type main,@function
140+
main:
141+
ret
142+
.size main, .-main

0 commit comments

Comments
 (0)