Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[RISCV] Insert R_RISCV_ALIGN relocation type and Nops for code alignm…
…ent when linker relaxation enabled Linker relaxation may change code size. We need to fix up the alignment of alignment directive in text section by inserting Nops and R_RISCV_ALIGN relocation type. So then linker could satisfy the alignment by removing Nops. To do this: 1. Add shouldInsertExtraNopBytesForCodeAlign target hook to calculate the Nops we need to insert. 2. Add shouldInsertFixupForCodeAlign target hook to insert R_RISCV_ALIGN fixup type. Differential Revision: https://reviews.llvm.org/D47755 llvm-svn: 352616
- Loading branch information
Showing
7 changed files
with
207 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
# 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 -riscv-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 -riscv-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 -riscv-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 -riscv-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 | ||
# 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 |