| ; RUN: llc -mtriple=x86_64-unknown-linux %s -o - | FileCheck %s --check-prefix=ASM | |
| ; RUN: llc -mtriple=x86_64-unknown-linux %s -o - --filetype=obj | llvm-readelf -s - | FileCheck %s --check-prefix=SYM | |
| ; RUN: llc -mtriple=x86_64-unknown-linux %s -o - --filetype=obj | llvm-objdump -d - | FileCheck %s --check-prefix=OBJ | |
| ;; Check "tail-pad-to-size" fills the ends of functions @a and @b with | |
| ;; "tail-pad-value" value bytes. @c is larger than the "tail-pad-to-size" value | |
| ;; so shouldn't be affected by either attribute. | |
| ;; Check the fill bytes are included in function size (unlike alignment | |
| ;; padding). | |
| ; SYM: Num: Value Size Type Bind Vis Ndx Name | |
| ; SYM: [[#]]: 0000000000000000 5 FUNC GLOBAL HIDDEN [[#]] a | |
| ; SYM: [[#]]: 0000000000000010 5 FUNC GLOBAL HIDDEN [[#]] b | |
| ; SYM: [[#]]: 0000000000000018 6 FUNC GLOBAL HIDDEN [[#]] c | |
| ; ASM: a: # @a | |
| ; ASM: retq | |
| ; ASM-NEXT: .Ltail_pad_start0: | |
| ; ASM-NEXT: .zero (5-(.Ltail_pad_start0-a))&((5-(.Ltail_pad_start0-a))>=0),144 | |
| ; ASM-NEXT: .Lfunc_end0: | |
| ; ASM-NEXT: .size a, .Lfunc_end0-a | |
| ; | |
| ; OBJ: 0000000000000000 <a>: | |
| ; OBJ-NEXT: 0: c3 retq | |
| ;; tail pdading: | |
| ; OBJ-NEXT: 1: 90 nop | |
| ; OBJ-NEXT: 2: 90 nop | |
| ; OBJ-NEXT: 3: 90 nop | |
| ; OBJ-NEXT: 4: 90 nop | |
| ;; alignment padding for @b: | |
| ; OBJ-NEXT: 5: 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) | |
| ; OBJ-NEXT: f: 90 nop | |
| define hidden void @a() #0 { | |
| entry: | |
| ret void | |
| } | |
| ; ASM: b: # @b | |
| ; ASM: movl %edi, %eax | |
| ; ASM-NEXT: retq | |
| ; ASM-NEXT: .Ltail_pad_start1: | |
| ; ASM-NEXT: .zero (5-(.Ltail_pad_start1-b))&((5-(.Ltail_pad_start1-b))>=0),144 | |
| ; ASM-NEXT: .Lfunc_end1: | |
| ; ASM-NEXT: .size b, .Lfunc_end1-b | |
| ; | |
| ; OBJ: 0000000000000010 <b>: | |
| ; OBJ-NEXT: 10: 89 f8 movl %edi, %eax | |
| ; OBJ-NEXT: 12: c3 retq | |
| ;; tail padding: | |
| ; OBJ-NEXT: 13: 90 nop | |
| ; OBJ-NEXT: 14: 90 nop | |
| ;; alignment padding for @c: | |
| ; OBJ-NEXT: 15: 0f 1f 00 nopl (%rax) | |
| define hidden i32 @b(i32 %a) align 16 #0 { | |
| entry: | |
| ret i32 %a | |
| } | |
| ; ASM: c: # @c | |
| ; ASM: movl %edi, %eax | |
| ; ASM-NEXT: imull %esi, %eax | |
| ; ASM-NEXT: retq | |
| ; ASM-NEXT: .Ltail_pad_start2: | |
| ; ASM-NEXT: .zero (5-(.Ltail_pad_start2-c))&((5-(.Ltail_pad_start2-c))>=0),144 | |
| ; ASM-NEXT: .Lfunc_end2: | |
| ; ASM-NEXT: .size c, .Lfunc_end2-c | |
| ; | |
| ; OBJ: 0000000000000018 <c>: | |
| ; OBJ-NEXT: 18: 89 f8 movl %edi, %eax | |
| ; OBJ-NEXT: 1a: 0f af c6 imull %esi, %eax | |
| ; OBJ-NEXT: 1d: c3 retq | |
| ;; No tail or alignment padding follows. | |
| ; OBJ-NOT: nop | |
| define hidden i32 @c(i32 %a, i32 %b) #0 { | |
| entry: | |
| %c = mul i32 %a, %b | |
| ret i32 %c | |
| } | |
| attributes #0 = { "tail-pad-to-size"="5" "tail-pad-value"="144" } |