Index: lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp =================================================================== --- lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp +++ lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp @@ -63,6 +63,16 @@ return STI.getFeatureBits()[RISCV::FeatureRelax]; } + // Override fixupNeedsRelaxationAdvanced to avoid RISCV MC Branch Relaxation + // always promote 16-bit branches to 32-bit form when RISCV linker relaxation + // enabled. + bool fixupNeedsRelaxationAdvanced(const MCFixup &Fixup, bool Resolved, + uint64_t Value, + const MCRelaxableFragment *DF, + const MCAsmLayout &Layout) const override { + return fixupNeedsRelaxation(Fixup, Value, DF, Layout); + } + bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value, const MCRelaxableFragment *DF, const MCAsmLayout &Layout) const override; Index: test/MC/RISCV/relocations.s =================================================================== --- test/MC/RISCV/relocations.s +++ test/MC/RISCV/relocations.s @@ -91,13 +91,11 @@ # FIXUP: fixup A - offset: 0, value: foo, kind: fixup_riscv_branch c.jal foo -# A compressed jump (c.j) to an unresolved symbol will be relaxed to a (jal). -# RELOC: R_RISCV_JAL +# RELOC: R_RISCV_RVC_JUMP # INSTR: c.jal foo # FIXUP: fixup A - offset: 0, value: foo, kind: fixup_riscv_rvc_jump c.bnez a0, foo -# A compressed branch (c.bnez) to an unresolved symbol will be relaxed to a (bnez). -# RELOC: R_RISCV_BRANCH +# RELOC: R_RISCV_RVC_BRANCH # INSTR: c.bnez a0, foo # FIXUP: fixup A - offset: 0, value: foo, kind: fixup_riscv_rvc_branch Index: test/MC/RISCV/rv32-relaxation.s =================================================================== --- test/MC/RISCV/rv32-relaxation.s +++ test/MC/RISCV/rv32-relaxation.s @@ -1,5 +1,9 @@ # RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+c < %s \ # RUN: | llvm-objdump -d - | FileCheck -check-prefix=INSTR %s +# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+c,+relax < %s \ +# RUN: | llvm-objdump -d - | FileCheck -check-prefix=RELAX-INSTR %s +# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+c,+relax < %s \ +# RUN: | llvm-readobj -r | FileCheck -check-prefix=RELAX-RELOC %s FAR_JUMP_NEGATIVE: c.nop @@ -15,55 +19,103 @@ start: c.bnez a0, NEAR #INSTR: c.bnez a0, 72 +#RELAX-INSTR: c.bnez a0, 0 +#RELAX-RELOC: R_RISCV_RVC_BRANCH c.bnez a0, NEAR_NEGATIVE #INSTR: c.bnez a0, -4 +#RELAX-INSTR: c.bnez a0, 0 +#RELAX-RELOC: R_RISCV_RVC_BRANCH c.bnez a0, FAR_BRANCH #INSTR-NEXT: bnez a0, 326 +#RELAX-INSTR-NEXT: bnez a0, 0 +#RELAX-RELOC: R_RISCV_BRANCH c.bnez a0, FAR_BRANCH_NEGATIVE #INSTR-NEXT: bnez a0, -268 +#RELAX-INSTR-NEXT: bnez a0, 0 +#RELAX-RELOC: R_RISCV_BRANCH c.bnez a0, FAR_JUMP #INSTR-NEXT: bnez a0, 2320 +#RELAX-INSTR-NEXT: bnez a0, 0 +#RELAX-RELOC: R_RISCV_BRANCH c.bnez a0, FAR_JUMP_NEGATIVE #INSTR-NEXT: bnez a0, -2278 +#RELAX-INSTR-NEXT: bnez a0, 0 +#RELAX-RELOC: R_RISCV_BRANCH c.beqz a0, NEAR #INSTR-NEXT: c.beqz a0, 52 +#RELAX-INSTR-NEXT: c.beqz a0, 0 +#RELAX-RELOC: R_RISCV_RVC_BRANCH c.beqz a0, NEAR_NEGATIVE #INSTR-NEXT: c.beqz a0, -24 +#RELAX-INSTR-NEXT: c.beqz a0, 0 +#RELAX-RELOC: R_RISCV_RVC_BRANCH c.beqz a0, FAR_BRANCH #INSTR-NEXT: beqz a0, 306 +#RELAX-INSTR-NEXT: beqz a0, 0 +#RELAX-RELOC: R_RISCV_BRANCH c.beqz a0, FAR_BRANCH_NEGATIVE #INSTR-NEXT: beqz a0, -288 +#RELAX-INSTR-NEXT: beqz a0, 0 +#RELAX-RELOC: R_RISCV_BRANCH c.beqz a0, FAR_JUMP #INSTR-NEXT: beqz a0, 2300 +#RELAX-INSTR-NEXT: beqz a0, 0 +#RELAX-RELOC: R_RISCV_BRANCH c.beqz a0, FAR_JUMP_NEGATIVE #INSTR-NEXT: beqz a0, -2298 +#RELAX-INSTR-NEXT: beqz a0, 0 +#RELAX-RELOC: R_RISCV_BRANCH c.j NEAR #INSTR-NEXT: c.j 32 +#RELAX-INSTR-NEXT: c.j 0 +#RELAX-RELOC: R_RISCV_RVC_JUMP c.j NEAR_NEGATIVE #INSTR-NEXT: c.j -44 +#RELAX-INSTR-NEXT: c.j 0 +#RELAX-RELOC: R_RISCV_RVC_JUMP c.j FAR_BRANCH #INSTR-NEXT: c.j 286 +#RELAX-INSTR-NEXT: c.j 0 +#RELAX-RELOC: R_RISCV_RVC_JUMP c.j FAR_BRANCH_NEGATIVE #INSTR-NEXT: c.j -306 +#RELAX-INSTR-NEXT: c.j 0 +#RELAX-RELOC: R_RISCV_RVC_JUMP c.j FAR_JUMP #INSTR-NEXT: j 2284 +#RELAX-INSTR-NEXT: j 0 +#RELAX-RELOC: R_RISCV_JAL c.j FAR_JUMP_NEGATIVE #INSTR-NEXT: j -2314 +#RELAX-INSTR-NEXT: j 0 +#RELAX-RELOC: R_RISCV_JAL c.jal NEAR #INSTR: c.jal 16 +#RELAX-INSTR: c.jal 0 +#RELAX-RELOC: R_RISCV_RVC_JUMP c.jal NEAR_NEGATIVE #INSTR: c.jal -60 +#RELAX-INSTR: c.jal 0 +#RELAX-RELOC: R_RISCV_RVC_JUMP c.jal FAR_BRANCH #INSTR-NEXT: c.jal 270 +#RELAX-INSTR-NEXT: c.jal 0 +#RELAX-RELOC: R_RISCV_RVC_JUMP c.jal FAR_BRANCH_NEGATIVE #INSTR-NEXT: c.jal -322 +#RELAX-INSTR-NEXT: c.jal 0 +#RELAX-RELOC: R_RISCV_RVC_JUMP c.jal FAR_JUMP #INSTR-NEXT: jal 2268 +#RELAX-INSTR-NEXT: jal 0 +#RELAX-RELOC: R_RISCV_JAL c.jal FAR_JUMP_NEGATIVE #INSTR-NEXT: jal -2330 +#RELAX-INSTR-NEXT: jal 0 +#RELAX-RELOC: R_RISCV_JAL NEAR: c.nop Index: test/MC/RISCV/rv64-relaxation.s =================================================================== --- test/MC/RISCV/rv64-relaxation.s +++ test/MC/RISCV/rv64-relaxation.s @@ -1,5 +1,9 @@ # RUN: llvm-mc -filetype=obj -triple riscv64 -mattr=+c < %s \ # RUN: | llvm-objdump -d - | FileCheck -check-prefix=INSTR %s +# RUN: llvm-mc -filetype=obj -triple riscv64 -mattr=+c,+relax < %s \ +# RUN: | llvm-objdump -d - | FileCheck -check-prefix=RELAX-INSTR %s +# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+c,+relax < %s \ +# RUN: | llvm-readobj -r | FileCheck -check-prefix=RELAX-RELOC %s FAR_JUMP_NEGATIVE: c.nop @@ -15,42 +19,78 @@ start: c.bnez a0, NEAR #INSTR: c.bnez a0, 56 +#RELAX-INSTR: c.bnez a0, 0 +#RELAX-RELOC: R_RISCV_RVC_BRANCH c.bnez a0, NEAR_NEGATIVE #INSTR: c.bnez a0, -4 +#RELAX-INSTR: c.bnez a0, 0 +#RELAX-RELOC: R_RISCV_RVC_BRANCH c.bnez a0, FAR_BRANCH #INSTR-NEXT: bnez a0, 310 +#RELAX-INSTR-NEXT: bnez a0, 0 +#RELAX-RELOC: R_RISCV_BRANCH c.bnez a0, FAR_BRANCH_NEGATIVE #INSTR-NEXT: bnez a0, -268 +#RELAX-INSTR-NEXT: bnez a0, 0 +#RELAX-RELOC: R_RISCV_BRANCH c.bnez a0, FAR_JUMP #INSTR-NEXT: bnez a0, 2304 +#RELAX-INSTR-NEXT: bnez a0, 0 +#RELAX-RELOC: R_RISCV_BRANCH c.bnez a0, FAR_JUMP_NEGATIVE #INSTR-NEXT: bnez a0, -2278 +#RELAX-INSTR-NEXT: bnez a0, 0 +#RELAX-RELOC: R_RISCV_BRANCH c.beqz a0, NEAR #INSTR-NEXT: c.beqz a0, 36 +#RELAX-INSTR-NEXT: c.beqz a0, 0 +#RELAX-RELOC: R_RISCV_RVC_BRANCH c.beqz a0, NEAR_NEGATIVE #INSTR-NEXT: c.beqz a0, -24 +#RELAX-INSTR-NEXT: c.beqz a0, 0 +#RELAX-RELOC: R_RISCV_RVC_BRANCH c.beqz a0, FAR_BRANCH #INSTR-NEXT: beqz a0, 290 +#RELAX-INSTR-NEXT: beqz a0, 0 +#RELAX-RELOC: R_RISCV_BRANCH c.beqz a0, FAR_BRANCH_NEGATIVE #INSTR-NEXT: beqz a0, -288 +#RELAX-INSTR-NEXT: beqz a0, 0 +#RELAX-RELOC: R_RISCV_BRANCH c.beqz a0, FAR_JUMP #INSTR-NEXT: beqz a0, 2284 +#RELAX-INSTR-NEXT: beqz a0, 0 +#RELAX-RELOC: R_RISCV_BRANCH c.beqz a0, FAR_JUMP_NEGATIVE #INSTR-NEXT: beqz a0, -2298 +#RELAX-INSTR-NEXT: beqz a0, 0 +#RELAX-RELOC: R_RISCV_BRANCH c.j NEAR #INSTR-NEXT: c.j 16 +#RELAX-INSTR-NEXT: c.j 0 +#RELAX-RELOC: R_RISCV_RVC_JUMP c.j NEAR_NEGATIVE #INSTR-NEXT: c.j -44 +#RELAX-INSTR-NEXT: c.j 0 +#RELAX-RELOC: R_RISCV_RVC_JUMP c.j FAR_BRANCH #INSTR-NEXT: c.j 270 +#RELAX-INSTR-NEXT: c.j 0 +#RELAX-RELOC: R_RISCV_RVC_JUMP c.j FAR_BRANCH_NEGATIVE #INSTR-NEXT: c.j -306 +#RELAX-INSTR-NEXT: c.j 0 +#RELAX-RELOC: R_RISCV_RVC_JUMP c.j FAR_JUMP #INSTR-NEXT: j 2268 +#RELAX-INSTR-NEXT: j 0 +#RELAX-RELOC: R_RISCV_JAL c.j FAR_JUMP_NEGATIVE #INSTR-NEXT: j -2314 +#RELAX-INSTR-NEXT: j 0 +#RELAX-RELOC: R_RISCV_JAL NEAR: c.nop