# The file testing Nop insertion with R_RISCV_ALIGN for relaxation. # Relaxation enabled: # RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+relax < %s \ # RUN: | llvm-objdump -d -M no-aliases - \ # RUN: | FileCheck -check-prefix=RELAX-INST %s # RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+relax < %s \ # RUN: | llvm-readobj -r - | FileCheck -check-prefix=RELAX-RELOC %s # Relaxation disabled: # RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=-relax < %s \ # RUN: | llvm-objdump -d -M no-aliases - \ # RUN: | FileCheck -check-prefix=NORELAX-INST %s # RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=-relax < %s \ # RUN: | llvm-readobj -r - | FileCheck -check-prefix=NORELAX-RELOC %s # Relaxation enabled with C extension: # RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+c,+relax < %s \ # RUN: | llvm-objdump -d -M no-aliases - \ # RUN: | FileCheck -check-prefix=C-EXT-RELAX-INST %s # RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+c,+relax < %s \ # RUN: | llvm-readobj -r - | FileCheck -check-prefix=C-EXT-RELAX-RELOC %s # Relaxation disabled with C extension: # RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+c,-relax < %s \ # RUN: | llvm-objdump -d -M no-aliases - \ # RUN: | FileCheck -check-prefix=C-EXT-NORELAX-INST %s # RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+c,-relax < %s \ # RUN: | llvm-readobj -r - | FileCheck -check-prefix=C-EXT-NORELAX-RELOC %s # We need to insert N-MinNopSize bytes NOPs and R_RISCV_ALIGN relocation # type for .align N directive when linker relaxation enabled. # Linker could satisfy alignment by removing NOPs after linker relaxation. # The first R_RISCV_ALIGN come from # MCELFStreamer::InitSections() emitCodeAlignment(4). # C-EXT-RELAX-RELOC: R_RISCV_ALIGN - 0x2 # C-EXT-RELAX-INST: c.nop test: .p2align 2 # C-EXT-RELAX-RELOC: R_RISCV_ALIGN - 0x2 # C-EXT-RELAX-INST: c.nop bne zero, a0, .LBB0_2 mv a0, zero .p2align 3 # RELAX-RELOC: R_RISCV_ALIGN - 0x4 # RELAX-INST: addi zero, zero, 0 # C-EXT-RELAX-RELOC: R_RISCV_ALIGN - 0x6 # C-EXT-RELAX-INST: addi zero, zero, 0 # C-EXT-RELAX-INST: c.nop # C-EXT-NORELAX-INST: addi zero, zero, 0 add a0, a0, a1 .align 4 .LBB0_2: # RELAX-RELOC: R_RISCV_ALIGN - 0xC # RELAX-INST: addi zero, zero, 0 # RELAX-INST: addi zero, zero, 0 # RELAX-INST: addi zero, zero, 0 # NORELAX-INST: addi zero, zero, 0 # C-EXT-RELAX-RELOC: R_RISCV_ALIGN - 0xE # C-EXT-RELAX-INST: addi zero, zero, 0 # C-EXT-RELAX-INST: addi zero, zero, 0 # C-EXT-RELAX-INST: addi zero, zero, 0 # C-EXT-RELAX-INST: c.nop # C-EXT-INST: addi zero, zero, 0 # C-EXT-INST: c.nop add a0, a0, a1 .p2align 3 .constant_pool: .long 3126770193 # RELAX-RELOC: R_RISCV_ALIGN - 0x4 # RELAX-INST: addi zero, zero, 0 # NORELAX-INST: addi zero, zero, 0 # C-EXT-RELAX-RELOC: R_RISCV_ALIGN - 0x6 # C-EXT-RELAX-INST: addi zero, zero, 0 # C-EXT-RELAX-INST: c.nop # C-EXT-INST: addi zero, zero, 0 # C-EXT-INST: c.nop add a0, a0, a1 # Alignment directive with specific padding value 0x01. # We will not emit R_RISCV_ALIGN in this case. # The behavior is the same as GNU assembler. .p2align 4, 1 # RELAX-RELOC-NOT: R_RISCV_ALIGN - 0xC # RELAX-INST: 01 01 # RELAX-INST: 01 01 # C-EXT-RELAX-RELOC-NOT: R_RISCV_ALIGN - 0xE # C-EXT-RELAX-INST: 01 01 # C-EXT-INST: 01 01 ret # NORELAX-RELOC-NOT: R_RISCV # C-EXT-NORELAX-RELOC-NOT: R_RISCV # Code alignment of a byte size less than the size of a nop must be treated # as no alignment. This used to trigger a fatal error with relaxation enabled # as the calculation to emit the worst-case sequence of nops would overflow. .p2align 1 add a0, a0, a1 .p2align 0 add a0, a0, a1 # We only need to insert R_RISCV_ALIGN for code section # when the linker relaxation enabled. .data .p2align 3 # RELAX-RELOC-NOT: R_RISCV_ALIGN # C-EXT-RELAX-RELOC-NOT: R_RISCV_ALIGN data1: .word 7 .p2align 4 # RELAX-RELOC-NOT: R_RISCV_ALIGN # C-EXT-RELAX-RELOC-NOT: R_RISCV_ALIGN data2: .word 9