# 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: