[lld] [ELF] Add target-specific relocation scanning for AArch64 (PR #181099)
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 12 19:50:46 PST 2026
================
@@ -273,6 +180,201 @@ bool AArch64::usesOnlyLowPageBits(RelType type) const {
}
}
+template <class ELFT, class RelTy>
+void AArch64::scanSectionImpl(InputSectionBase &sec, Relocs<RelTy> rels) {
+ RelocScan rs(ctx, &sec);
+ sec.relocations.reserve(rels.size());
+
+ for (auto it = rels.begin(); it != rels.end(); ++it) {
+ const RelTy &rel = *it;
+ uint32_t symIdx = rel.getSymbol(false);
+ Symbol &sym = sec.getFile<ELFT>()->getSymbol(symIdx);
+ uint64_t offset = rel.r_offset;
+ RelType type = rel.getType(false);
+ if (sym.isUndefined() && symIdx != 0 &&
+ rs.maybeReportUndefined(cast<Undefined>(sym), offset))
+ continue;
+ int64_t addend = rs.getAddend<ELFT>(rel, type);
+ RelExpr expr;
+ switch (type) {
+ case R_AARCH64_NONE:
+ continue;
+
+ // Absolute relocations:
+ case R_AARCH64_ABS16:
+ case R_AARCH64_ABS32:
+ case R_AARCH64_ABS64:
+ case R_AARCH64_FUNCINIT64:
+ case R_AARCH64_ADD_ABS_LO12_NC:
+ case R_AARCH64_LDST128_ABS_LO12_NC:
+ case R_AARCH64_LDST16_ABS_LO12_NC:
+ case R_AARCH64_LDST32_ABS_LO12_NC:
+ case R_AARCH64_LDST64_ABS_LO12_NC:
+ case R_AARCH64_LDST8_ABS_LO12_NC:
+ case R_AARCH64_MOVW_SABS_G0:
+ case R_AARCH64_MOVW_SABS_G1:
+ case R_AARCH64_MOVW_SABS_G2:
+ case R_AARCH64_MOVW_UABS_G0:
+ case R_AARCH64_MOVW_UABS_G0_NC:
+ case R_AARCH64_MOVW_UABS_G1:
+ case R_AARCH64_MOVW_UABS_G1_NC:
+ case R_AARCH64_MOVW_UABS_G2:
+ case R_AARCH64_MOVW_UABS_G2_NC:
+ case R_AARCH64_MOVW_UABS_G3:
+ expr = R_ABS;
+ break;
+
+ case R_AARCH64_AUTH_ABS64:
+ expr = RE_AARCH64_AUTH;
+ break;
+
+ case R_AARCH64_PATCHINST:
+ if (!isAbsolute(sym))
+ Err(ctx) << getErrorLoc(ctx, sec.content().data() + offset)
+ << "R_AARCH64_PATCHINST relocation against non-absolute "
+ "symbol "
+ << &sym;
+ expr = R_ABS;
+ break;
+
+ // PC-relative relocations:
+ case R_AARCH64_PREL16:
+ case R_AARCH64_PREL32:
+ case R_AARCH64_PREL64:
+ case R_AARCH64_ADR_PREL_LO21:
+ case R_AARCH64_LD_PREL_LO19:
+ case R_AARCH64_MOVW_PREL_G0:
+ case R_AARCH64_MOVW_PREL_G0_NC:
+ case R_AARCH64_MOVW_PREL_G1:
+ case R_AARCH64_MOVW_PREL_G1_NC:
+ case R_AARCH64_MOVW_PREL_G2:
+ case R_AARCH64_MOVW_PREL_G2_NC:
+ case R_AARCH64_MOVW_PREL_G3:
+ rs.processR_PC(type, offset, addend, sym);
+ continue;
+
+ // Page-PC relocations:
+ case R_AARCH64_ADR_PREL_PG_HI21:
+ case R_AARCH64_ADR_PREL_PG_HI21_NC:
+ expr = RE_AARCH64_PAGE_PC;
+ break;
+
+ // PLT-generating relocations:
+ case R_AARCH64_CALL26:
+ case R_AARCH64_CONDBR19:
+ case R_AARCH64_JUMP26:
+ case R_AARCH64_TSTBR14:
+ rs.processR_PLT_PC(type, offset, addend, sym);
+ continue;
+ case R_AARCH64_PLT32:
+ sym.thunkAccessed = true;
+ rs.processR_PLT_PC(type, offset, addend, sym);
+ continue;
+
+ // GOT relocations:
+ case R_AARCH64_LD64_GOT_LO12_NC:
+ expr = R_GOT;
+ break;
+ case R_AARCH64_AUTH_LD64_GOT_LO12_NC:
+ case R_AARCH64_AUTH_GOT_ADD_LO12_NC:
+ sym.setFlags(NEEDS_GOT | NEEDS_GOT_AUTH);
+ rs.processAux(R_GOT, type, offset, sym, addend);
+ continue;
+ case R_AARCH64_AUTH_GOT_LD_PREL19:
+ case R_AARCH64_AUTH_GOT_ADR_PREL_LO21:
+ sym.setFlags(NEEDS_GOT | NEEDS_GOT_AUTH);
----------------
MaskRay wrote:
Thanks for the suggestion! The intention is to remove unneeded code for the fast path, so I'll not add this `if ... sym.setFlags(...)`
https://github.com/llvm/llvm-project/pull/181099
More information about the llvm-commits
mailing list