llvm-toolchain/debian/patches/mips/mips-D101773-reloc.patch
2022-09-20 09:18:56 +02:00

49 lines
2.4 KiB
Diff

From ab40c027f0ce9492919a72ad339de40bdb84b354 Mon Sep 17 00:00:00 2001
From: Dimitry Andric <dimitry@andric.com>
Date: Mon, 3 May 2021 20:08:49 +0200
Subject: [PATCH] [MC][ELF] Work around R_MIPS_LO16 relocation handling problem
This fixes PR49821, and avoids "ld.lld: error: test.o:(.rodata.str1.1):
offset is outside the section" errors when linking MIPS objects with
negative R_MIPS_LO16 implicit addends.
ld.lld handles R_MIPS_HI16/R_MIPS_LO16 separately, not as a whole, so it
doesn't know that an R_MIPS_HI16 with implicit addend 1 and an
R_MIPS_LO16 with implicit addend -32768 represents 32768, which is in
range of a MergeInputSection. We could introduce a new RelExpr member
(like R_RISCV_PC_INDIRECT for R_RISCV_PCREL_HI20 / R_RISCV_PCREL_LO12)
but the complexity is unnecessary given that GNU as keeps the original
symbol for this case as well.
Reviewed By: atanasyan, MaskRay
Differential Revision: https://reviews.llvm.org/D101773
---
llvm/lib/MC/ELFObjectWriter.cpp | 11 +++++++++++
llvm/test/MC/Mips/mips_lo16.s | 22 ++++++++++++++++++++++
2 files changed, 33 insertions(+)
create mode 100644 llvm/test/MC/Mips/mips_lo16.s
Index: llvm-toolchain-snapshot_16~++20220920091612+a7d2409bac7f/llvm/lib/MC/ELFObjectWriter.cpp
===================================================================
--- llvm-toolchain-snapshot_16~++20220920091612+a7d2409bac7f.orig/llvm/lib/MC/ELFObjectWriter.cpp
+++ llvm-toolchain-snapshot_16~++20220920091612+a7d2409bac7f/llvm/lib/MC/ELFObjectWriter.cpp
@@ -1369,6 +1369,17 @@ bool ELFObjectWriter::shouldRelocateWith
if (TargetObjectWriter->getEMachine() == ELF::EM_MIPS &&
!hasRelocationAddend())
return true;
+
+ // ld.lld handles R_MIPS_HI16/R_MIPS_LO16 separately, not as a whole, so
+ // it doesn't know that an R_MIPS_HI16 with implicit addend 1 and an
+ // R_MIPS_LO16 with implicit addend -32768 represents 32768, which is in
+ // range of a MergeInputSection. We could introduce a new RelExpr member
+ // (like R_RISCV_PC_INDIRECT for R_RISCV_PCREL_HI20 / R_RISCV_PCREL_LO12)
+ // but the complexity is unnecessary given that GNU as keeps the original
+ // symbol for this case as well.
+ if (TargetObjectWriter->getEMachine() == ELF::EM_MIPS &&
+ !hasRelocationAddend())
+ return true;
}
// Most TLS relocations use a got, so they need the symbol. Even those that