HomePhabricator

[RISCV] Fix evaluation of %pcrel_lo

Authored by rogfer01 on Nov 8 2019, 12:26 AM.

Description

[RISCV] Fix evaluation of %pcrel_lo

The following testcase

function:
.Lpcrel_label1:
	auipc	a0, %pcrel_hi(other_function)
	addi	a1, a0, %pcrel_lo(.Lpcrel_label1)
	.p2align	2          # Causes a new fragment to be emitted

	.type	other_function,@function
other_function:
	ret

exposes an odd behaviour in which only the %pcrel_hi relocation is
evaluated but not the %pcrel_lo.

$ llvm-mc -triple riscv64 -filetype obj t.s | llvm-objdump  -d -r -

<stdin>:	file format ELF64-riscv

Disassembly of section .text:
0000000000000000 function:
       0:	17 05 00 00	auipc	a0, 0
       4:	93 05 05 00	mv	a1, a0
		0000000000000004:  R_RISCV_PCREL_LO12_I	other_function+4

0000000000000008 other_function:
       8:	67 80 00 00	ret

The reason seems to be that in RISCVAsmBackend::shouldForceRelocation we
only consider the fragment but in RISCVMCExpr::evaluatePCRelLo we
consider the section. This usually works but there are cases where the
section may still be the same but the fragment may be another one. In
that case we end forcing a %pcrel_lo relocation without any %pcrel_hi.

This patch makes RISCVAsmBackend::shouldForceRelocation use the section,
if any, to determine if the relocation must be forced or not.

Differential Revision: https://reviews.llvm.org/D60657

Details

Committed
rogfer01Nov 8 2019, 12:37 AM
Differential Revision
D60657: [RISCV] Fix evaluation of %pcrel_lo
Parents
rG0f88caeef8f2: [Analyzer] Checker for Debugging Iterator Checkers
Branches
Unknown
Tags
Unknown