[lld] [RISCV] Disable gp relaxation if part of object unreachable (PR #72655)
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 14 23:17:09 PST 2023
================
@@ -651,6 +651,20 @@ static void relaxHi20Lo12(const InputSection &sec, size_t i, uint64_t loc,
if (!isInt<12>(r.sym->getVA(r.addend) - gp->getVA()))
return;
+ // The symbol may be accessed in multiple pieces. We need to make sure that
+ // all of the possible accesses are relaxed or none are. This prevents
+ // relaxing the hi relocation and being unable to relax one of the low
+ // relocations. The compiler will only access multiple pieces of an object
+ // with low relocations on the memory op if the alignment allows it.
+ // Therefore it should suffice to check that the smaller of the alignment
+ // and size can be reached from GP.
+ uint32_t alignAdjust =
+ r.sym->getOutputSection() ? r.sym->getOutputSection()->addralign : 0;
+ alignAdjust = std::min<uint32_t>(alignAdjust, r.sym->getSize());
----------------
MaskRay wrote:
If `addend < st_size`, it seems that this can be improved to `min(addralign, st_size-addend)`
https://github.com/llvm/llvm-project/pull/72655
More information about the llvm-commits
mailing list