diff options
author | Fangrui Song <i@maskray.me> | 2024-08-23 00:05:20 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-23 00:05:20 -0700 |
commit | 59721f2326988ece58fab183971f79b71f751b83 (patch) | |
tree | b42fc042f50120c2cf01daa699dc9bdbbbbca3a3 /llvm/lib/MC/ELFObjectWriter.cpp | |
parent | 84aa02d3fa1f1f614c4f3c144ec118b2f05ae6b0 (diff) | |
download | llvm-59721f2326988ece58fab183971f79b71f751b83.zip llvm-59721f2326988ece58fab183971f79b71f751b83.tar.gz llvm-59721f2326988ece58fab183971f79b71f751b83.tar.bz2 |
[MIPS] Optimize sortRelocs for o32
The o32 ABI specifies:
> Each relocation type of R_MIPS_HI16 must have an associated R_MIPS_LO16 entry immediately following it in the list of relocations. [...] the addend AHL is computed as (AHI << 16) + (short)ALO
In practice, the high-part and low-part relocations may not be adjacent
in assembly files, requiring the assembler to reorder relocations.
http://reviews.llvm.org/D19718 performed the reordering, but did not
optimize for the common case where a %lo immediately follows its
matching %hi. The quadratic time complexity could make sections with
many relocations very slow to process.
This patch implements the fast path, simplifies the code, and makes the
behavior more similar to GNU assembler (for the .rel.mips_hilo_8b test).
We also remove `OriginalSymbol`, removing overhead for other targets.
Fix #104562
Pull Request: https://github.com/llvm/llvm-project/pull/104723
Diffstat (limited to 'llvm/lib/MC/ELFObjectWriter.cpp')
-rw-r--r-- | llvm/lib/MC/ELFObjectWriter.cpp | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp index 35d0a2e..62a4b53 100644 --- a/llvm/lib/MC/ELFObjectWriter.cpp +++ b/llvm/lib/MC/ELFObjectWriter.cpp @@ -1453,7 +1453,7 @@ void ELFObjectWriter::recordRelocation(MCAssembler &Asm, SecA ? cast<MCSymbolELF>(SecA->getBeginSymbol()) : nullptr; if (SectionSymbol) SectionSymbol->setUsedInReloc(); - ELFRelocationEntry Rec(FixupOffset, SectionSymbol, Type, Addend, SymA); + ELFRelocationEntry Rec(FixupOffset, SectionSymbol, Type, Addend); Relocations[&FixupSection].push_back(Rec); return; } @@ -1468,7 +1468,7 @@ void ELFObjectWriter::recordRelocation(MCAssembler &Asm, else RenamedSymA->setUsedInReloc(); } - ELFRelocationEntry Rec(FixupOffset, RenamedSymA, Type, Addend, SymA); + ELFRelocationEntry Rec(FixupOffset, RenamedSymA, Type, Addend); Relocations[&FixupSection].push_back(Rec); } |