1; REQUIRES: aarch64-registered-target 2 3; For convenience, to show what is being serialized. 4; RUN: opt -S -passes="print<stack-safety-local>" -disable-output < %s 2>&1 | FileCheck %s --check-prefixes=SSI 5 6; RUN: opt -module-summary %s -o %t.bc 7; RUN: llvm-bcanalyzer -dump %t.bc | FileCheck %s -check-prefixes=BC 8 9; RUN: llvm-dis -o - %t.bc | FileCheck %s --check-prefix=DIS 10; Round trip it through llvm-as 11; RUN: llvm-dis -o - %t.bc | llvm-as -o - | llvm-dis -o - | FileCheck %s --check-prefix=DIS 12 13; RUN: opt -thinlto-bc %s -o %t.bc 14; RUN: llvm-bcanalyzer -dump %t.bc | FileCheck %s -check-prefixes=BC 15 16; RUN: llvm-dis -o - %t.bc | FileCheck %s --check-prefix=DIS 17; Round trip it through llvm-as 18; RUN: llvm-dis -o - %t.bc | llvm-as -o - | llvm-dis -o - | FileCheck %s --check-prefix=DIS 19 20; DIS: ^0 = module: (path: "{{.*}}", hash: ({{.*}})) 21; ModuleID = 'thinlto-function-summary-paramaccess.ll' 22target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" 23target triple = "aarch64-unknown-linux" 24 25attributes #0 = { noinline sanitize_memtag "target-features"="+mte,+neon" } 26 27; BC-LABEL: <GLOBALVAL_SUMMARY_BLOCK 28; BC-NEXT: <VERSION 29; BC-NEXT: <FLAGS 30 31; DIS-DAG: = gv: (name: "Callee") ; guid = 900789920918863816 32declare void @Callee(i8* %p) 33 34; DIS-DAG: = gv: (name: "Callee2") ; guid = 72710208629861106 35declare void @Callee2(i32 %x, i8* %p) 36 37; BC-NEXT: <PERMODULE 38; DIS-DAG: = gv: (name: "NoParam", summaries: {{.*}} guid = 10287433468618421703 39define void @NoParam() #0 { 40entry: 41 ret void 42} 43 44; SSI-LABEL: function 'IntParam' 45; BC-NEXT: <PERMODULE 46; DIS-DAG: = gv: (name: "IntParam", summaries: {{.*}} guid = 13164714711077064397 47define void @IntParam(i32 %x) #0 { 48entry: 49 ret void 50} 51 52; SSI-LABEL: for function 'WriteNone' 53; SSI: p[]: empty-set 54; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=0 op3=0/> 55; BC-NEXT: <PERMODULE 56; DIS-DAG: = gv: (name: "WriteNone", summaries: {{.*}} params: ((param: 0, offset: [0, -1]))))) ; guid = 15261848357689602442 57define void @WriteNone(i8* %p) #0 { 58entry: 59 ret void 60} 61 62; SSI-LABEL: for function 'Write0' 63; SSI: p[]: [0,1) 64; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=2 op3=0/> 65; BC-NEXT: <PERMODULE 66; DIS-DAG: = gv: (name: "Write0", summaries: {{.*}} params: ((param: 0, offset: [0, 0]))))) ; guid = 5540766144860458461 67define void @Write0(i8* %p) #0 { 68entry: 69 store i8 0, i8* %p 70 ret void 71} 72 73; SSI-LABEL: for function 'WriteOffset' 74; SSI: p[]: [12,16) 75; BC-NEXT: <PARAM_ACCESS op0=0 op1=24 op2=32 op3=0/> 76; BC-NEXT: <PERMODULE 77; DIS-DAG: = gv: (name: "WriteOffset", summaries: {{.*}} params: ((param: 0, offset: [12, 15]))))) ; guid = 1417835201204712148 78define void @WriteOffset(i8* %p) #0 { 79entry: 80 %0 = bitcast i8* %p to i32* 81 %1 = getelementptr i32, i32* %0, i64 3 82 store i32 0, i32* %1 83 ret void 84} 85 86; SSI-LABEL: for function 'WriteNegOffset' 87; SSI: p[]: [-56,-48) 88; BC-NEXT: <PARAM_ACCESS op0=0 op1=113 op2=97 op3=0/> 89; BC-NEXT: <PERMODULE 90; DIS-DAG: = gv: (name: "WriteNegOffset", summaries: {{.*}} params: ((param: 0, offset: [-56, -49]))))) ; guid = 11847411556962310546 91define void @WriteNegOffset(i8* %p) #0 { 92entry: 93 %0 = bitcast i8* %p to i64* 94 %1 = getelementptr i64, i64* %0, i64 -7 95 store i64 0, i64* %1 96 ret void 97} 98 99; SSI-LABEL: for function 'WriteAnyOffset' 100; SSI: p[]: [-9223372036854775808,9223372036854775807) 101; BC-NEXT: <PARAM_ACCESS op0=0 op1=1 op2=-2 op3=0/> 102; BC-NEXT: <PERMODULE 103; DIS-DAG: = gv: (name: "WriteAnyOffset", summaries: {{.*}} params: ((param: 0, offset: [-9223372036854775808, 9223372036854775806]))))) ; guid = 16159595372881907190 104define void @WriteAnyOffset(i8* %p, i64 %i) #0 { 105entry: 106 %0 = bitcast i8* %p to i24* 107 %1 = getelementptr i24, i24* %0, i64 %i 108 store i24 0, i24* %1 109 ret void 110} 111 112; SSI-LABEL: for function 'WritePQ' 113; SSI: p[]: [0,1) 114; SSI: q[]: [0,4) 115; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=2 op3=0 op4=1 op5=0 op6=8 op7=0/> 116; BC-NEXT: <PERMODULE 117; DIS-DAG: = gv: (name: "WritePQ", summaries: {{.*}} params: ((param: 0, offset: [0, 0]), (param: 1, offset: [0, 3]))))) ; guid = 6187077497926519485 118define void @WritePQ(i8* %p, i32* %q) #0 { 119entry: 120 store i8 5, i8* %p 121 store i32 6, i32* %q 122 ret void 123} 124 125; SSI-LABEL: for function 'WriteTwoPIQ' 126; SSI: p[]: [0,1) 127; SSI: q[]: [0,4) 128; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=2 op3=0 op4=2 op5=0 op6=8 op7=0/> 129; BC-NEXT: <PERMODULE 130; DIS-DAG: = gv: (name: "WriteTwoPIQ", summaries: {{.*}} params: ((param: 0, offset: [0, 0]), (param: 2, offset: [0, 3]))))) ; guid = 2949024673554120799 131define void @WriteTwoPIQ(i8* %p, i32 %i, i32* %q) #0 { 132entry: 133 store i8 7, i8* %p 134 store i32 %i, i32* %q 135 ret void 136} 137 138; SSI-LABEL: for function 'Call' 139; SSI: p[]: empty-set, @Callee(arg0, [0,1)) 140; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=0 op3=1 op4=0 op5=[[CALLEE:-?[0-9]+]] op6=0 op7=2/> 141; BC-NEXT: <PERMODULE 142; DIS-DAG: = gv: (name: "Call", summaries: {{.*}} calls: ((callee: ^{{.*}})), params: ((param: 0, offset: [0, -1], calls: ((callee: ^{{.*}}, param: 0, offset: [0, 0]))))))) ; guid = 8411925997558855107 143define void @Call(i8* %p) #0 { 144entry: 145 call void @Callee(i8* %p) 146 ret void 147} 148 149; SSI-LABEL: for function 'CallOffset' 150; SSI: p[]: empty-set, @Callee(arg0, [2,3)) 151; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=0 op3=1 op4=0 op5=[[CALLEE]] op6=4 op7=6/> 152; BC-NEXT: <PERMODULE 153; DIS-DAG: = gv: (name: "CallOffset", summaries: {{.*}} calls: ((callee: ^{{.*}})), params: ((param: 0, offset: [0, -1], calls: ((callee: ^{{.*}}, param: 0, offset: [2, 2]))))))) ; guid = 1075564720951610524 154define void @CallOffset(i8* %p) #0 { 155entry: 156 %p1 = getelementptr i8, i8* %p, i64 2 157 call void @Callee(i8* %p1) 158 ret void 159} 160 161; SSI-LABEL: for function 'CallNegOffset' 162; SSI: p[]: empty-set, @Callee(arg0, [-715,-714)) 163; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=0 op3=1 op4=0 op5=[[CALLEE]] op6=1431 op7=1429/> 164; BC-NEXT: <PERMODULE 165; DIS-DAG: = gv: (name: "CallNegOffset", summaries: {{.*}} calls: ((callee: ^{{.*}})), params: ((param: 0, offset: [0, -1], calls: ((callee: ^{{.*}}, param: 0, offset: [-715, -715]))))))) ; guid = 16532891468562335146 166define void @CallNegOffset(i8* %p) #0 { 167entry: 168 %p1 = getelementptr i8, i8* %p, i64 -715 169 call void @Callee(i8* %p1) 170 ret void 171} 172 173; BC-NEXT: <PERMODULE 174; SSI-LABEL: for function 'CallAnyOffset' 175; SSI: p[]: empty-set, @Callee(arg0, full-set) 176; DIS-DAG: = gv: (name: "CallAnyOffset", summaries: {{.*}} calls: ((callee: ^{{.*}}))))) ; guid = 4179978066780831873 177define void @CallAnyOffset(i8* %p, i64 %i) #0 { 178entry: 179 %p1 = getelementptr i8, i8* %p, i64 %i 180 call void @Callee(i8* %p1) 181 ret void 182} 183 184; SSI-LABEL: for function 'CallMany' 185; SSI: p[]: empty-set, @Callee(arg0, [-715,-714)), @Callee(arg0, [-33,-32)), @Callee(arg0, [124,125)) 186; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=0 op3=3 op4=0 op5=[[CALLEE]] op6=1431 op7=1429 op8=0 op9=[[CALLEE]] op10=67 op11=65 op12=0 op13=[[CALLEE]] op14=248 op15=250/> 187; BC-NEXT: <PERMODULE 188; DIS-DAG: = gv: (name: "CallMany", summaries: {{.*}} calls: ((callee: ^{{.*}})), params: ((param: 0, offset: [0, -1], calls: ((callee: ^{{.*}}, param: 0, offset: [-715, -715]), (callee: ^{{.*}}, param: 0, offset: [-33, -33]), (callee: ^{{.*}}, param: 0, offset: [124, 124]))))))) ; guid = 17150418543861409076 189define void @CallMany(i8* %p) #0 { 190entry: 191 %p0 = getelementptr i8, i8* %p, i64 -715 192 call void @Callee(i8* %p0) 193 194 %p1 = getelementptr i8, i8* %p, i64 -33 195 call void @Callee(i8* %p1) 196 197 %p2 = getelementptr i8, i8* %p, i64 124 198 call void @Callee(i8* %p2) 199 200 ret void 201} 202 203; SSI-LABEL: for function 'CallMany2' 204; SSI: p[]: empty-set, @Callee(arg0, [-715,-714)), @Callee2(arg1, [-33,-32)), @Callee(arg0, [124,125)) 205; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=0 op3=3 op4=0 op5=[[CALLEE]] op6=1431 op7=1429 op8=1 op9=[[CALLEE2:-?[0-9]+]] op10=67 op11=65 op12=0 op13=[[CALLEE]] op14=248 op15=250/> 206; BC-NEXT: <PERMODULE 207; DIS-DAG: = gv: (name: "CallMany2", summaries: {{.*}} calls: ((callee: ^{{.*}}), (callee: ^{{.*}})), params: ((param: 0, offset: [0, -1], calls: ((callee: ^{{.*}}, param: 0, offset: [-715, -715]), (callee: ^{{.*}}, param: 1, offset: [-33, -33]), (callee: ^{{.*}}, param: 0, offset: [124, 124]))))))) ; guid = 16654048340802466690 208define void @CallMany2(i8* %p) #0 { 209entry: 210 %p0 = getelementptr i8, i8* %p, i64 -715 211 call void @Callee(i8* %p0) 212 213 %p1 = getelementptr i8, i8* %p, i64 -33 214 call void @Callee2(i32 6, i8* %p1) 215 216 %p2 = getelementptr i8, i8* %p, i64 124 217 call void @Callee(i8* %p2) 218 219 ret void 220} 221 222; SSI-LABEL: for function 'CallManyUnsafe' 223; SSI: p[]: full-set, @Callee(arg0, [-715,-714)), @Callee(arg0, [-33,-32)), @Callee(arg0, [124,125)) 224; BC-NEXT: <PERMODULE 225; DIS-DAG: = gv: (name: "CallManyUnsafe", summaries: {{.*}} calls: ((callee: ^{{.*}}))))) ; guid = 15696680128757863301 226define void @CallManyUnsafe(i8* %p, i64 %i) #0 { 227entry: 228 %pi = getelementptr i8, i8* %p, i64 %i 229 store i8 5, i8* %pi 230 231 %p0 = getelementptr i8, i8* %p, i64 -715 232 call void @Callee(i8* %p0) 233 234 %p1 = getelementptr i8, i8* %p, i64 -33 235 call void @Callee(i8* %p1) 236 237 %p2 = getelementptr i8, i8* %p, i64 124 238 call void @Callee(i8* %p2) 239 240 ret void 241} 242 243; SSI-LABEL: for function 'Ret' 244; SSI: p[]: full-set 245; BC-NEXT: <PERMODULE 246; DIS-DAG: = gv: (name: "Ret", summaries: {{.*}} ; guid = 6707380319572075172 247define i8* @Ret(i8* %p) #0 { 248entry: 249 ret i8* %p 250} 251 252; BC-NOT: <PERMODULE 253; BC-NOT: <PARAM_ACCESS1 254 255 256