16ab89279SFangrui Song;; Test the function attribute "patchable-function-entry". 2*00dfd4f8SJessica Clarke; RUN: llc -mtriple=riscv32 --riscv-no-aliases < %s | FileCheck %s --check-prefixes=CHECK,RV32,NORVC 3*00dfd4f8SJessica Clarke; RUN: llc -mtriple=riscv64 --riscv-no-aliases < %s | FileCheck %s --check-prefixes=CHECK,RV64,NORVC 4*00dfd4f8SJessica Clarke; RUN: llc -mtriple=riscv32 -mattr=+c --riscv-no-aliases < %s | FileCheck %s --check-prefixes=CHECK,RV32,RVC 5*00dfd4f8SJessica Clarke; RUN: llc -mtriple=riscv64 -mattr=+c --riscv-no-aliases < %s | FileCheck %s --check-prefixes=CHECK,RV64,RVC 66ab89279SFangrui Song 76ab89279SFangrui Songdefine void @f0() "patchable-function-entry"="0" { 86ab89279SFangrui Song; CHECK-LABEL: f0: 96ab89279SFangrui Song; CHECK-NEXT: .Lfunc_begin0: 106ab89279SFangrui Song; CHECK-NOT: {{addi|c.nop}} 116ab89279SFangrui Song; NORVC: jalr zero, 0(ra) 126ab89279SFangrui Song; RVC: c.jr ra 136ab89279SFangrui Song; CHECK-NOT: .section __patchable_function_entries 146ab89279SFangrui Song ret void 156ab89279SFangrui Song} 166ab89279SFangrui Song 176ab89279SFangrui Songdefine void @f1() "patchable-function-entry"="1" { 186ab89279SFangrui Song; CHECK-LABEL: f1: 196ab89279SFangrui Song; CHECK-NEXT: .Lfunc_begin1: 206ab89279SFangrui Song; NORVC: addi zero, zero, 0 216ab89279SFangrui Song; NORVC-NEXT: jalr zero, 0(ra) 226ab89279SFangrui Song; RVC: c.nop 236ab89279SFangrui Song; RVC-NEXT: c.jr ra 246ab89279SFangrui Song; CHECK: .section __patchable_function_entries,"awo",@progbits,f1{{$}} 256ab89279SFangrui Song; 32: .p2align 2 266ab89279SFangrui Song; 32-NEXT: .word .Lfunc_begin1 276ab89279SFangrui Song; 64: .p2align 3 286ab89279SFangrui Song; 64-NEXT: .quad .Lfunc_begin1 296ab89279SFangrui Song ret void 306ab89279SFangrui Song} 316ab89279SFangrui Song 326ab89279SFangrui Song$f5 = comdat any 336ab89279SFangrui Songdefine void @f5() "patchable-function-entry"="5" comdat { 346ab89279SFangrui Song; CHECK-LABEL: f5: 356ab89279SFangrui Song; CHECK-NEXT: .Lfunc_begin2: 366ab89279SFangrui Song; NORVC-COUNT-5: addi zero, zero, 0 376ab89279SFangrui Song; NORVC-NEXT: jalr zero, 0(ra) 386ab89279SFangrui Song; RVC-COUNT-5: c.nop 396ab89279SFangrui Song; RVC-NEXT: c.jr ra 406ab89279SFangrui Song; CHECK: .section __patchable_function_entries,"aGwo",@progbits,f5,comdat,f5{{$}} 416ab89279SFangrui Song; RV32: .p2align 2 426ab89279SFangrui Song; RV32-NEXT: .word .Lfunc_begin2 436ab89279SFangrui Song; RV64: .p2align 3 446ab89279SFangrui Song; RV64-NEXT: .quad .Lfunc_begin2 456ab89279SFangrui Song ret void 466ab89279SFangrui Song} 476ab89279SFangrui Song 486ab89279SFangrui Song;; -fpatchable-function-entry=3,2 496ab89279SFangrui Song;; "patchable-function-prefix" emits data before the function entry label. 506ab89279SFangrui Songdefine void @f3_2() "patchable-function-entry"="1" "patchable-function-prefix"="2" { 516ab89279SFangrui Song; CHECK-LABEL: .type f3_2,@function 526ab89279SFangrui Song; CHECK-NEXT: .Ltmp0: # @f3_2 536ab89279SFangrui Song; NORVC-COUNT-2: addi zero, zero, 0 546ab89279SFangrui Song; RVC-COUNT-2: c.nop 556ab89279SFangrui Song; CHECK-NEXT: f3_2: 566ab89279SFangrui Song; CHECK: # %bb.0: 576ab89279SFangrui Song; NORVC-NEXT: addi zero, zero, 0 586ab89279SFangrui Song; NORVC-NEXT: addi sp, sp, -16 596ab89279SFangrui Song; RVC-NEXT: c.nop 606ab89279SFangrui Song; RVC-NEXT: c.addi sp, -16 616ab89279SFangrui Song;; .size does not include the prefix. 626ab89279SFangrui Song; CHECK: .Lfunc_end3: 636ab89279SFangrui Song; CHECK-NEXT: .size f3_2, .Lfunc_end3-f3_2 646ab89279SFangrui Song; CHECK: .section __patchable_function_entries,"awo",@progbits,f3_2{{$}} 656ab89279SFangrui Song; RV32: .p2align 2 666ab89279SFangrui Song; RV32-NEXT: .word .Ltmp0 676ab89279SFangrui Song; RV64: .p2align 3 686ab89279SFangrui Song; RV64-NEXT: .quad .Ltmp0 696ab89279SFangrui Song %frame = alloca i8, i32 16 706ab89279SFangrui Song ret void 716ab89279SFangrui Song} 72