blob: 032cd114d3cc334a193e82c7396b410800a0f1a9 [file] [edit]
# RUN: llvm-mc -triple x86_64 %s -o - | FileCheck --check-prefix=ASM %s
# RUN: llvm-mc -filetype=obj -triple x86_64 %s -o %t
# RUN: llvm-readelf -SW %t | FileCheck --check-prefix=OBJ %s
# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck --check-prefix=DIS %s
# RUN: llvm-objdump -s -j .text.f1 -j .text.f2 -j .text.f6 %t | FileCheck --check-prefix=HEX %s
## MinAlign >= PrefAlign: the three-way rule is bounded by MinAlign regardless
## of body size, so sh_addralign stays at MinAlign.
# ASM: .section .text.f1
# ASM: .p2align 2
# ASM: .prefalign 1, .Lf1_end, 0
# OBJ: .text.f1 PROGBITS 0000000000000000 {{[0-9a-f]+}} 000003 00 AX 0 0 4
# HEX: Contents of section .text.f1:
# HEX-NEXT: 0000 f8f8f8 ...
.section .text.f1,"ax",@progbits
.p2align 2
.prefalign 1, .Lf1_end, 0
.rept 3
clc
.endr
.Lf1_end:
## Multiple .prefalign on the same end symbol: effective PrefAlign is the maximum.
# ASM: .section .text.f2
# ASM: .prefalign 3, .Lf2_end, 0
# ASM: .prefalign 4, .Lf2_end, 0
# ASM: .prefalign 3, .Lf2_end, 0
# OBJ: .text.f2 PROGBITS 0000000000000000 {{[0-9a-f]+}} 000009 00 AX 0 0 16
# HEX-NEXT: Contents of section .text.f2:
# HEX-NEXT: 0000 f8f8f8f8 f8f8f8f8 f8 .........
.section .text.f2,"ax",@progbits
.p2align 2
.prefalign 3, .Lf2_end, 0
.prefalign 4, .Lf2_end, 1-1
.prefalign 3, .Lf2_end, 0
.rept 9
clc
.endr
.Lf2_end:
## Multiple functions in a section, each with its own .prefalign.
## nop fill; f3b's 5-byte padding is a NOP.
## f3b: ComputedAlign=8, padding=5
## f3c: ComputedAlign=16, padding=0
# ASM: .prefalign 4, .Lf3a_end, nop
# ASM: .prefalign 4, .Lf3b_end, nop
# ASM: .prefalign 4, .Lf3c_end, 204
# OBJ: .text.f3 PROGBITS 0000000000000000 {{[0-9a-f]+}} 000020 00 AX 0 0 16
# DIS: Disassembly of section .text.f3:
# DIS: 0: clc
# DIS-NEXT: 1: clc
# DIS-NEXT: 2: clc
# DIS-NEXT: 3: nopl
# DIS-NEXT: 8: stc
# DIS: f: stc
# DIS-NEXT: 10: clc
# DIS: 1f: clc
# DIS-EMPTY:
.section .text.f3,"ax",@progbits
.p2align 2
.prefalign 4, .Lf3a_end, nop
.rept 3
clc
.endr
.Lf3a_end:
.prefalign 4, .Lf3b_end, nop
.rept 8
stc
.endr
.Lf3b_end:
.prefalign 4, .Lf3c_end, 0xcc
.rept 16
clc
.endr
.Lf3c_end:
## No-op prefalign
.prefalign 4, .Lf3d_end, 0xcc
.Lf3d_end:
.prefalign 4, .Lf3a_end, 0xcb+1
## Two functions in one section where the second function's padding depends on
## the first function's size.
# OBJ: .text.f4 PROGBITS 0000000000000000 {{[0-9a-f]+}} 00001e 00 AX 0 0 16
# DIS: Disassembly of section .text.f4:
# DIS: 0: pushq
# DIS: 7: retq
# DIS-NEXT: 8: nopl
# DIS-NEXT: 10: movl
# DIS: 1d: retq
# DIS-EMPTY:
.section .text.f4,"ax",@progbits
.p2align 2
.prefalign 4, .Lf4a_end, nop
pushq %rbp
movq %rsp, %rbp
xorl %eax, %eax
popq %rbp
retq
.Lf4a_end:
.prefalign 4, .Lf4b_end, nop
movl $0, 0
xorl %eax, %eax
retq
.Lf4b_end:
## sh_addralign stays at 32, not downgraded by .prefalign.
# OBJ: .text.f5 PROGBITS 0000000000000000 {{[0-9a-f]+}} 000003 00 AX 0 0 32
.section .text.f5,"ax",@progbits
.p2align 5
.prefalign 4, .Lf5_end, 0
.rept 3
clc
.endr
.Lf5_end:
## body_size > PrefAlign: ComputedAlign is clamped to PrefAlign.
## body=20, pref=8 => ComputedAlign=8, padding=7 zero bytes.
# OBJ: .text.f6 PROGBITS 0000000000000000 {{[0-9a-f]+}} 00001c 00 AX 0 0 8
# HEX-NEXT: Contents of section .text.f6:
# HEX-NEXT: 0000 01030303 03030303 f8f8f8f8 f8f8f8f8 ................
# HEX-NEXT: 0010 f8f8f8f8 f8f8f8f8 f8f8f8f8 ............
.section .text.f6,"ax",@progbits
.byte 1
.prefalign 3, .Lf6_end, 3
.rept 20
clc
.endr
.Lf6_end:
## .prefalign in a BSS section with zero fill.
# ASM: .bss
# ASM: .prefalign 4, .Lbss_end, 0
# OBJ: .bss NOBITS 0000000000000000 {{[0-9a-f]+}} 000004 00 WA 0 0 4
.bss
.p2align 2
.prefalign 4, .Lbss_end, 0
.space 4
.Lbss_end: