From c298307ae69038d81f326834407ac922d95a7f3f Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 31 Mar 2014 19:00:23 +0000 Subject: [PATCH] Don't relocate with sections if there might be a paired relocation. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205240 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/ELF.h | 3 +++ lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp | 20 ++++++++++++++++++-- test/MC/Mips/xgot.s | 2 +- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/include/llvm/Support/ELF.h b/include/llvm/Support/ELF.h index 2ac42591436..7b10ebd23f2 100644 --- a/include/llvm/Support/ELF.h +++ b/include/llvm/Support/ELF.h @@ -880,6 +880,9 @@ enum { R_MIPS_TLS_TPREL_HI16 = 49, R_MIPS_TLS_TPREL_LO16 = 50, R_MIPS_GLOB_DAT = 51, + R_MIPS16_GOT16 = 102, + R_MIPS16_HI16 = 104, + R_MIPS16_LO16 = 105, R_MIPS_COPY = 126, R_MIPS_JUMP_SLOT = 127, R_MICROMIPS_26_S1 = 133, diff --git a/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp b/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp index f933962d664..794978b30bf 100644 --- a/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp +++ b/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp @@ -206,9 +206,25 @@ MipsELFObjectWriter::needsRelocateWithSymbol(unsigned Type) const { default: return true; - case ELF::R_MIPS_26: - case ELF::R_MIPS_LO16: + case ELF::R_MIPS_GOT16: + case ELF::R_MIPS16_GOT16: + case ELF::R_MICROMIPS_GOT16: + llvm_unreachable("Should have been handled already"); + + // These relocations might be paired with another relocation. The pairing is + // done by the static linker by matching the symbol. Since we only see one + // relocation at a time, we have to force them to relocate with a symbol to + // avoid ending up with a pair where one points to a section and another + // points to a symbol. case ELF::R_MIPS_HI16: + case ELF::R_MIPS16_HI16: + case ELF::R_MICROMIPS_HI16: + case ELF::R_MIPS_LO16: + case ELF::R_MIPS16_LO16: + case ELF::R_MICROMIPS_LO16: + return true; + + case ELF::R_MIPS_26: case ELF::R_MIPS_32: case ELF::R_MIPS_64: case ELF::R_MIPS_GPREL16: diff --git a/test/MC/Mips/xgot.s b/test/MC/Mips/xgot.s index 13e1b7e733e..30848066ce3 100644 --- a/test/MC/Mips/xgot.s +++ b/test/MC/Mips/xgot.s @@ -11,7 +11,7 @@ // CHECK: 0x24 R_MIPS_CALL_HI16 printf // CHECK: 0x2C R_MIPS_GOT16 $.str // CHECK: 0x30 R_MIPS_CALL_LO16 printf -// CHECK: 0x38 R_MIPS_LO16 .rodata.str1.1 +// CHECK: 0x38 R_MIPS_LO16 $.str // CHECK: ] .text -- 2.11.0