128 lines · plain
1;; Testcase to check that module with different sign return address can2;; be mixed.3;4; RUN: llvm-as %s -o %t1.bc5; RUN: llvm-as %p/Inputs/foo.ll -o %t2.bc6; RUN: llvm-as %p/Inputs/fiz.ll -o %t3.bc7; RUN: llvm-as %p/Inputs/bar.ll -o %t4.bc8; RUN: llvm-as %p/Inputs/old.ll -o %t5.bc9; RUN: llvm-lto -exported-symbol main \10; RUN: -exported-symbol foo_on \11; RUN: -exported-symbol foo_off \12; RUN: -exported-symbol fiz_on \13; RUN: -exported-symbol fiz_off \14; RUN: -exported-symbol bar \15; RUN: -exported-symbol baz \16; RUN: -exported-symbol old_bti \17; RUN: -exported-symbol old_pac \18; RUN: -exported-symbol old_none \19; RUN: -filetype=obj \20; RUN: %t5.bc %t4.bc %t3.bc %t2.bc %t1.bc \21; RUN: -o %t1.exe 2>&122; RUN: llvm-objdump -d %t1.exe | FileCheck --check-prefix=CHECK-DUMP %s23; RUN: llvm-readelf -n %t1.exe | FileCheck --allow-empty --check-prefix=CHECK-PROP %s24 25target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"26target triple = "aarch64-unknown-linux-gnu"27 28declare i32 @foo_on();29declare i32 @foo_off();30declare i32 @fiz_on();31declare i32 @fiz_off();32declare void @baz();33declare void @bar();34declare i32 @old_bti();35declare i32 @old_pac();36declare i32 @old_none();37 38define i32 @main() #0 {39entry:40 call i32 @foo_on()41 call i32 @foo_off()42 call i32 @fiz_on()43 call i32 @fiz_off()44 call void @bar()45 call void @baz()46 call i32 @old_bti()47 call i32 @old_pac()48 call i32 @old_none()49 ret i32 050}51 52attributes #0 = { noinline nounwind optnone }53 54!llvm.module.flags = !{!0, !1, !2, !3 }55!0 = !{i32 8, !"branch-target-enforcement", i32 0}56!1 = !{i32 8, !"sign-return-address", i32 0}57!2 = !{i32 8, !"sign-return-address-all", i32 0}58!3 = !{i32 8, !"sign-return-address-with-bkey", i32 0}59 60 61; CHECK-DUMP-LABEL: <old_bti>:62; CHECK-DUMP-NEXT: bti c63; CHECK-DUMP-NEXT: mov w0, #0x264; CHECK-DUMP-NEXT: ret65 66; CHECK-DUMP-LABEL: <old_pac>:67; CHECK-DUMP-NEXT: paciasp68; CHECK-DUMP-NEXT: mov w0, #0x269; CHECK-DUMP-NEXT: autiasp70; CHECK-DUMP-NEXT: ret71 72; CHECK-DUMP-LABEL: <old_none>:73; CHECK-DUMP-NEXT: mov w0, #0x374; CHECK-DUMP-NEXT: ret75 76; CHECK-DUMP-LABEL: <bar>:77; CHECK-DUMP-NEXT: ret78 79; CHECK-DUMP-LABEL: <baz>:80; CHECK-DUMP-NEXT: bti c81; CHECK-DUMP-NEXT: ret82 83;; fiz.ll represents a module with the old style of the function attributes.84;; fiz_on shall have PAC with A-key as it requested at module level.85; CHECK-DUMP-LABEL: <fiz_on>:86; CHECK-DUMP-NEXT: paciasp87; CHECK-DUMP-NEXT: str x30, [sp, #-0x10]!88; CHECK-DUMP-NEXT: bl 0x38 <fiz_on+0x8>89; CHECK-DUMP-NEXT: mov w0, #0x2a90; CHECK-DUMP-NEXT: ldr x30, [sp], #0x1091; CHECK-DUMP-NEXT: autiasp92; CHECK-DUMP-NEXT: ret93 94;; fiz_off shall not have BTI or PAC instructions as they are disabled at function scope.95; CHECK-DUMP-LABEL: <fiz_off>:96; CHECK-DUMP-NEXT: mov w0, #0x2b97; CHECK-DUMP-NEXT: ret98 99;; foo.ll represents a module with the old style of the function attributes.100;; foo_on shall have PAC with B-key as it requested at module level.101; CHECK-DUMP-LABEL: <foo_on>:102; CHECK-DUMP-NEXT: pacibsp103; CHECK-DUMP-NEXT: mov w0, #0x2a104; CHECK-DUMP-NEXT: autibsp105; CHECK-DUMP-NEXT: ret106 107;; foo_off shall not have BTI or PAC instructions as they are disabled at function scope.108; CHECK-DUMP-LABEL: <foo_off>:109; CHECK-DUMP-NEXT: mov w0, #0x2b110; CHECK-DUMP-NEXT: ret111 112; CHECK-DUMP-LABEL: <main>:113; CHECK-DUMP-NOT: paciasp114; CHECK-DUMP-NEXT: str x30,115; CHECK-DUMP-NEXT: bl116; CHECK-DUMP-NEXT: bl117; CHECK-DUMP-NEXT: bl118; CHECK-DUMP-NEXT: bl119; CHECK-DUMP-NEXT: bl120; CHECK-DUMP-NEXT: bl121; CHECK-DUMP-NEXT: bl122; CHECK-DUMP-NEXT: bl123; CHECK-DUMP-NEXT: bl124 125;; `main` doesn't support PAC sign-return-address while `foo` does, so in the binary126;; we should not see anything.127; CHECK-PROP-NOT: Properties: aarch64 feature: PAC128