[lld] [RISCV] Disable gp relaxation if part of object unreachable (PR #72655)
Nemanja Ivanovic via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 27 07:31:04 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());
+
+ if (!isInt<12>(r.sym->getVA() + alignAdjust - gp->getVA()))
----------------
nemanjai wrote:
I actually opted to just check the range of +/- adjustment since any LO12 relocations that depend on this are only allowed to access this range.
https://github.com/llvm/llvm-project/pull/72655
More information about the llvm-commits
mailing list