1f554e272SFangrui Song; RUN: llc -mtriple=i386 %s -o - | FileCheck --check-prefixes=CHECK,32 %s 2f554e272SFangrui Song; RUN: llc -mtriple=x86_64 %s -o - | FileCheck --check-prefixes=CHECK,64 %s 3f554e272SFangrui Song; RUN: llc -mtriple=x86_64 -function-sections %s -o - | FileCheck --check-prefixes=CHECK,64 %s 4a8fbdc57SFangrui Song 5a8fbdc57SFangrui Songdefine void @f0() "patchable-function-entry"="0" { 6a8fbdc57SFangrui Song; CHECK-LABEL: f0: 7a8fbdc57SFangrui Song; CHECK-NEXT: .Lfunc_begin0: 8a8fbdc57SFangrui Song; CHECK-NOT: nop 9a8fbdc57SFangrui Song; CHECK: ret 10d232c215SFangrui Song; CHECK-NOT: .section __patchable_function_entries 11a8fbdc57SFangrui Song ret void 12a8fbdc57SFangrui Song} 13a8fbdc57SFangrui Song 14a8fbdc57SFangrui Songdefine void @f1() "patchable-function-entry"="1" { 15a8fbdc57SFangrui Song; CHECK-LABEL: f1: 16d232c215SFangrui Song; CHECK-NEXT: .Lfunc_begin1: 17a8fbdc57SFangrui Song; CHECK: nop 18a8fbdc57SFangrui Song; CHECK-NEXT: ret 19f554e272SFangrui Song; CHECK: .section __patchable_function_entries,"awo",@progbits,f1{{$}} 20a8fbdc57SFangrui Song; 32: .p2align 2 21a8fbdc57SFangrui Song; 32-NEXT: .long .Lfunc_begin1 22a8fbdc57SFangrui Song; 64: .p2align 3 23a8fbdc57SFangrui Song; 64-NEXT: .quad .Lfunc_begin1 24a8fbdc57SFangrui Song ret void 25a8fbdc57SFangrui Song} 26a8fbdc57SFangrui Song 2701da05b7SFangrui Song;; Without -function-sections, f2 is in the same text section as f1. 2801da05b7SFangrui Song;; They share the __patchable_function_entries section. 2901da05b7SFangrui Song;; With -function-sections, f1 and f2 are in different text sections. 3001da05b7SFangrui Song;; Use separate __patchable_function_entries. 31d232c215SFangrui Songdefine void @f2() "patchable-function-entry"="2" { 32d232c215SFangrui Song; CHECK-LABEL: f2: 3301da05b7SFangrui Song; CHECK-NEXT: .Lfunc_begin2: 34*acb30f68SAlexandre Ganea; 32: xchgw %ax, %ax 35d232c215SFangrui Song; 64: xchgw %ax, %ax 36d232c215SFangrui Song; CHECK-NEXT: ret 37f554e272SFangrui Song; CHECK: .section __patchable_function_entries,"awo",@progbits,f2{{$}} 38d232c215SFangrui Song; 32: .p2align 2 39d232c215SFangrui Song; 32-NEXT: .long .Lfunc_begin2 40d232c215SFangrui Song; 64: .p2align 3 41d232c215SFangrui Song; 64-NEXT: .quad .Lfunc_begin2 42d232c215SFangrui Song ret void 43d232c215SFangrui Song} 44d232c215SFangrui Song 45a8fbdc57SFangrui Song$f3 = comdat any 46a8fbdc57SFangrui Songdefine void @f3() "patchable-function-entry"="3" comdat { 47a8fbdc57SFangrui Song; CHECK-LABEL: f3: 4801da05b7SFangrui Song; CHECK-NEXT: .Lfunc_begin3: 49*acb30f68SAlexandre Ganea; 32: xchgw %ax, %ax 50*acb30f68SAlexandre Ganea; 32-NEXT: nop 51a8fbdc57SFangrui Song; 64: nopl (%rax) 52a8fbdc57SFangrui Song; CHECK: ret 53f554e272SFangrui Song; CHECK: .section __patchable_function_entries,"aGwo",@progbits,f3,comdat,f3{{$}} 54a8fbdc57SFangrui Song; 32: .p2align 2 55d232c215SFangrui Song; 32-NEXT: .long .Lfunc_begin3 56a8fbdc57SFangrui Song; 64: .p2align 3 57d232c215SFangrui Song; 64-NEXT: .quad .Lfunc_begin3 58a8fbdc57SFangrui Song ret void 59a8fbdc57SFangrui Song} 60a8fbdc57SFangrui Song 61a8fbdc57SFangrui Song$f5 = comdat any 62a8fbdc57SFangrui Songdefine void @f5() "patchable-function-entry"="5" comdat { 63a8fbdc57SFangrui Song; CHECK-LABEL: f5: 6401da05b7SFangrui Song; CHECK-NEXT: .Lfunc_begin4: 65*acb30f68SAlexandre Ganea; 32-COUNT-2: xchgw %ax, %ax 66*acb30f68SAlexandre Ganea; 32-NEXT: nop 67a8fbdc57SFangrui Song; 64: nopl 8(%rax,%rax) 68a8fbdc57SFangrui Song; CHECK-NEXT: ret 69f554e272SFangrui Song; CHECK: .section __patchable_function_entries,"aGwo",@progbits,f5,comdat,f5{{$}} 70a8fbdc57SFangrui Song; 32: .p2align 2 71d232c215SFangrui Song; 32-NEXT: .long .Lfunc_begin4 72a8fbdc57SFangrui Song; 64: .p2align 3 73d232c215SFangrui Song; 64-NEXT: .quad .Lfunc_begin4 74a8fbdc57SFangrui Song ret void 75a8fbdc57SFangrui Song} 7601da05b7SFangrui Song 7701da05b7SFangrui Song;; -fpatchable-function-entry=3,2 7801da05b7SFangrui Song;; "patchable-function-prefix" emits data before the function entry label. 7901da05b7SFangrui Song;; We emit 1-byte NOPs before the function entry, so that with a partial patch, 8001da05b7SFangrui Song;; the remaining instructions do not need to be modified. 8101da05b7SFangrui Songdefine void @f3_2() "patchable-function-entry"="1" "patchable-function-prefix"="2" { 8201da05b7SFangrui Song; CHECK-LABEL: .type f3_2,@function 8301da05b7SFangrui Song; CHECK-NEXT: .Ltmp0: # @f3_2 8401da05b7SFangrui Song; CHECK-NEXT: nop 8501da05b7SFangrui Song; CHECK-NEXT: nop 8601da05b7SFangrui Song; CHECK-NEXT: f3_2: 8701da05b7SFangrui Song; CHECK: # %bb.0: 8801da05b7SFangrui Song; CHECK-NEXT: nop 8901da05b7SFangrui Song; CHECK-NEXT: ret 9001da05b7SFangrui Song;; .size does not include the prefix. 9101da05b7SFangrui Song; CHECK: .Lfunc_end5: 9201da05b7SFangrui Song; CHECK-NEXT: .size f3_2, .Lfunc_end5-f3_2 93f554e272SFangrui Song; CHECK: .section __patchable_function_entries,"awo",@progbits,f3_2{{$}} 9401da05b7SFangrui Song; 32: .p2align 2 9501da05b7SFangrui Song; 32-NEXT: .long .Ltmp0 9601da05b7SFangrui Song; 64: .p2align 3 9701da05b7SFangrui Song; 64-NEXT: .quad .Ltmp0 9801da05b7SFangrui Song %frame = alloca i8, i32 16 9901da05b7SFangrui Song ret void 10001da05b7SFangrui Song} 101