blob: 0a49cf5f6057479e767af1f576f60451dc7eb09a [file] [edit]
; 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" }