forked from OSchip/llvm-project
[lld][RISCV] Print error when encountering R_RISCV_ALIGN
Summary: Unlike R_RISCV_RELAX, which is a linker hint, R_RISCV_ALIGN requires the support of the linker even when ignoring all R_RISCV_RELAX relocations. This is because the compiler emits as many NOPs as may be required for the requested alignment, more than may be required pre-relaxation, to allow for the target becoming more unaligned after relaxing earlier sequences. This means that the target is often not initially aligned in the object files, and so the R_RISCV_ALIGN relocations cannot just be ignored. Since we do not support linker relaxation, we must turn these into errors. Reviewers: ruiu, MaskRay, espindola Reviewed By: MaskRay Subscribers: grimar, Jim, emaste, arichardson, asb, rbar, johnrusso, simoncook, sabuasal, niosHD, kito-cheng, shiva0217, zzheng, edward-jones, rogfer01, MartinMosbeck, brucehoult, the_o, rkruppe, PkmX, jocewei, psnobl, benna, lenary, s.egerton, pzheng, sameer.abuasal, apazos, luismarques, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D71820
This commit is contained in:
parent
fa40b41168
commit
d1da63664f
|
@ -236,9 +236,15 @@ RelExpr RISCV::getRelExpr(const RelType type, const Symbol &s,
|
|||
case R_RISCV_TPREL_LO12_S:
|
||||
return R_TLS;
|
||||
case R_RISCV_RELAX:
|
||||
case R_RISCV_ALIGN:
|
||||
case R_RISCV_TPREL_ADD:
|
||||
return R_NONE;
|
||||
case R_RISCV_ALIGN:
|
||||
// Not just a hint; always padded to the worst-case number of NOPs, so may
|
||||
// not currently be aligned, and without linker relaxation support we can't
|
||||
// delete NOPs to realign.
|
||||
errorOrWarn(getErrorLocation(loc) + "relocation R_RISCV_ALIGN requires "
|
||||
"unimplemented linker relaxation; recompile with -mno-relax");
|
||||
return R_NONE;
|
||||
default:
|
||||
error(getErrorLocation(loc) + "unknown relocation (" + Twine(type) +
|
||||
") against symbol " + toString(s));
|
||||
|
@ -431,7 +437,6 @@ void RISCV::relocateOne(uint8_t *loc, const RelType type,
|
|||
write64le(loc, val - dtpOffset);
|
||||
break;
|
||||
|
||||
case R_RISCV_ALIGN:
|
||||
case R_RISCV_RELAX:
|
||||
return; // Ignored (for now)
|
||||
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
# REQUIRES: riscv
|
||||
|
||||
# RUN: llvm-mc -filetype=obj -triple=riscv32 -mattr=+relax %s -o %t.o
|
||||
# RUN: not ld.lld %t.o -o /dev/null 2>&1 | FileCheck %s
|
||||
|
||||
# CHECK: relocation R_RISCV_ALIGN requires unimplemented linker relaxation
|
||||
|
||||
.global _start
|
||||
_start:
|
||||
nop
|
||||
.balign 8
|
||||
nop
|
Loading…
Reference in New Issue