@@ -269,4 +269,136 @@ define i32 @test_tailcall_ib_arg_ind(ptr %arg0, i64 %arg1) #0 {
269
269
ret i32 %tmp1
270
270
}
271
271
272
+ ; Test direct calls
273
+
274
+ define i32 @test_direct_call () #0 {
275
+ ; DARWIN-LABEL: test_direct_call:
276
+ ; DARWIN-NEXT: stp x29, x30, [sp, #-16]!
277
+ ; DARWIN-NEXT: bl _f
278
+ ; DARWIN-NEXT: ldp x29, x30, [sp], #16
279
+ ; DARWIN-NEXT: ret
280
+ ;
281
+ ; ELF-LABEL: test_direct_call:
282
+ ; ELF-NEXT: str x30, [sp, #-16]!
283
+ ; ELF-NEXT: bl f
284
+ ; ELF-NEXT: ldr x30, [sp], #16
285
+ ; ELF-NEXT: ret
286
+ %tmp0 = call i32 ptr auth(ptr @f , i32 0 , i64 42 )() [ "ptrauth" (i32 0 , i64 42 ) ]
287
+ ret i32 %tmp0
288
+ }
289
+
290
+ define i32 @test_direct_tailcall (ptr %arg0 ) #0 {
291
+ ; DARWIN-LABEL: test_direct_tailcall:
292
+ ; DARWIN: b _f
293
+ ;
294
+ ; ELF-LABEL: test_direct_tailcall:
295
+ ; ELF-NEXT: b f
296
+ %tmp0 = tail call i32 ptr auth(ptr @f , i32 0 , i64 42 )() [ "ptrauth" (i32 0 , i64 42 ) ]
297
+ ret i32 %tmp0
298
+ }
299
+
300
+ define i32 @test_direct_call_mismatch () #0 {
301
+ ; DARWIN-LABEL: test_direct_call_mismatch:
302
+ ; DARWIN-NEXT: stp x29, x30, [sp, #-16]!
303
+ ; DARWIN-NEXT: adrp x16, _f@GOTPAGE
304
+ ; DARWIN-NEXT: ldr x16, [x16, _f@GOTPAGEOFF]
305
+ ; DARWIN-NEXT: mov x17, #42
306
+ ; DARWIN-NEXT: pacia x16, x17
307
+ ; DARWIN-NEXT: mov x8, x16
308
+ ; DARWIN-NEXT: mov x17, #42
309
+ ; DARWIN-NEXT: blrab x8, x17
310
+ ; DARWIN-NEXT: ldp x29, x30, [sp], #16
311
+ ; DARWIN-NEXT: ret
312
+ ;
313
+ ; ELF-LABEL: test_direct_call_mismatch:
314
+ ; ELF-NEXT: str x30, [sp, #-16]!
315
+ ; ELF-NEXT: adrp x16, :got:f
316
+ ; ELF-NEXT: ldr x16, [x16, :got_lo12:f]
317
+ ; ELF-NEXT: mov x17, #42
318
+ ; ELF-NEXT: pacia x16, x17
319
+ ; ELF-NEXT: mov x8, x16
320
+ ; ELF-NEXT: mov x17, #42
321
+ ; ELF-NEXT: blrab x8, x17
322
+ ; ELF-NEXT: ldr x30, [sp], #16
323
+ ; ELF-NEXT: ret
324
+ %tmp0 = call i32 ptr auth(ptr @f , i32 0 , i64 42 )() [ "ptrauth" (i32 1 , i64 42 ) ]
325
+ ret i32 %tmp0
326
+ }
327
+
328
+ define i32 @test_direct_call_addr () #0 {
329
+ ; DARWIN-LABEL: test_direct_call_addr:
330
+ ; DARWIN-NEXT: stp x29, x30, [sp, #-16]!
331
+ ; DARWIN-NEXT: bl _f
332
+ ; DARWIN-NEXT: ldp x29, x30, [sp], #16
333
+ ; DARWIN-NEXT: ret
334
+ ;
335
+ ; ELF-LABEL: test_direct_call_addr:
336
+ ; ELF-NEXT: str x30, [sp, #-16]!
337
+ ; ELF-NEXT: bl f
338
+ ; ELF-NEXT: ldr x30, [sp], #16
339
+ ; ELF-NEXT: ret
340
+ %tmp0 = call i32 ptr auth(ptr @f , i32 1 , i64 0 , ptr @f.ref.ib.0.addr )() [ "ptrauth" (i32 1 , i64 ptrtoint (ptr @f.ref.ib.0.addr to i64 )) ]
341
+ ret i32 %tmp0
342
+ }
343
+
344
+ define i32 @test_direct_call_addr_blend () #0 {
345
+ ; DARWIN-LABEL: test_direct_call_addr_blend:
346
+ ; DARWIN-NEXT: stp x29, x30, [sp, #-16]!
347
+ ; DARWIN-NEXT: bl _f
348
+ ; DARWIN-NEXT: ldp x29, x30, [sp], #16
349
+ ; DARWIN-NEXT: ret
350
+ ;
351
+ ; ELF-LABEL: test_direct_call_addr_blend:
352
+ ; ELF-NEXT: str x30, [sp, #-16]!
353
+ ; ELF-NEXT: bl f
354
+ ; ELF-NEXT: ldr x30, [sp], #16
355
+ ; ELF-NEXT: ret
356
+ %tmp0 = call i64 @llvm.ptrauth.blend (i64 ptrtoint (ptr @f.ref.ib.42.addr to i64 ), i64 42 )
357
+ %tmp1 = call i32 ptr auth(ptr @f , i32 1 , i64 42 , ptr @f.ref.ib.42.addr )() [ "ptrauth" (i32 1 , i64 %tmp0 ) ]
358
+ ret i32 %tmp1
359
+ }
360
+
361
+ define i32 @test_direct_call_addr_gep_different_index_types () #0 {
362
+ ; DARWIN-LABEL: test_direct_call_addr_gep_different_index_types:
363
+ ; DARWIN-NEXT: stp x29, x30, [sp, #-16]!
364
+ ; DARWIN-NEXT: bl _f
365
+ ; DARWIN-NEXT: ldp x29, x30, [sp], #16
366
+ ; DARWIN-NEXT: ret
367
+ ;
368
+ ; ELF-LABEL: test_direct_call_addr_gep_different_index_types:
369
+ ; ELF-NEXT: str x30, [sp, #-16]!
370
+ ; ELF-NEXT: bl f
371
+ ; ELF-NEXT: ldr x30, [sp], #16
372
+ ; ELF-NEXT: ret
373
+ %tmp0 = call i32 ptr auth(ptr @f , i32 1 , i64 0 , ptr getelementptr ({ ptr }, ptr @f_struct.ref.ib.0.addr , i64 0 , i32 0 ))() [ "ptrauth" (i32 1 , i64 ptrtoint (ptr getelementptr ({ ptr }, ptr @f_struct.ref.ib.0.addr , i32 0 , i32 0 ) to i64 )) ]
374
+ ret i32 %tmp0
375
+ }
376
+
377
+ define i32 @test_direct_call_addr_blend_gep_different_index_types () #0 {
378
+ ; DARWIN-LABEL: test_direct_call_addr_blend_gep_different_index_types:
379
+ ; DARWIN-NEXT: stp x29, x30, [sp, #-16]!
380
+ ; DARWIN-NEXT: bl _f
381
+ ; DARWIN-NEXT: ldp x29, x30, [sp], #16
382
+ ; DARWIN-NEXT: ret
383
+ ;
384
+ ; ELF-LABEL: test_direct_call_addr_blend_gep_different_index_types:
385
+ ; ELF-NEXT: str x30, [sp, #-16]!
386
+ ; ELF-NEXT: bl f
387
+ ; ELF-NEXT: ldr x30, [sp], #16
388
+ ; ELF-NEXT: ret
389
+ %tmp0 = call i64 @llvm.ptrauth.blend (i64 ptrtoint (ptr getelementptr ({ ptr }, ptr @f_struct.ref.ib.123.addr , i32 0 , i32 0 ) to i64 ), i64 123 )
390
+ %tmp1 = call i32 ptr auth(ptr @f , i32 1 , i64 123 , ptr getelementptr ({ ptr }, ptr @f_struct.ref.ib.123.addr , i64 0 , i32 0 ))() [ "ptrauth" (i32 1 , i64 %tmp0 ) ]
391
+ ret i32 %tmp1
392
+ }
393
+
394
+ @f.ref.ib.42.addr = external global ptr
395
+ @f.ref.ib.0.addr = external global ptr
396
+ @f_struct.ref.ib.0.addr = external global ptr
397
+ @f_struct.ref.ib.123.addr = external global ptr
398
+
399
+ declare void @f ()
400
+
401
+ declare i64 @llvm.ptrauth.auth (i64 , i32 , i64 )
402
+ declare i64 @llvm.ptrauth.blend (i64 , i64 )
403
+
272
404
attributes #0 = { nounwind }
0 commit comments