From 8fe36cd77cb61af4b48b9ccdf8947bb04eba1d15 Mon Sep 17 00:00:00 2001 From: Simon Dardis Date: Mon, 5 Dec 2016 12:55:19 +0000 Subject: [PATCH] [mips][ias] N32/N64 must not sort the relocation table. Doing so changes the evaluation order for relocation composition. Patch By: Daniel Sanders Reviewers: vkalintiris, atanasyan Differential Revision: https://reviews.llvm.org/D26401 llvm-svn: 288666 --- llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp | 7 +++++++ llvm/test/MC/Mips/reloc-directive.s | 12 ++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp b/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp index 0bfd469..b2efd72 100644 --- a/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp @@ -419,6 +419,13 @@ unsigned MipsELFObjectWriter::getRelocType(MCContext &Ctx, /// always match using the expressions from the source. void MipsELFObjectWriter::sortRelocs(const MCAssembler &Asm, std::vector &Relocs) { + + // We do not need to sort the relocation table for RELA relocations which + // N32/N64 uses as the relocation addend contains the value we require, + // rather than it being split across a pair of relocations. + if (hasRelocationAddend()) + return; + if (Relocs.size() < 2) return; diff --git a/llvm/test/MC/Mips/reloc-directive.s b/llvm/test/MC/Mips/reloc-directive.s index fee4c13..b2da7ca 100644 --- a/llvm/test/MC/Mips/reloc-directive.s +++ b/llvm/test/MC/Mips/reloc-directive.s @@ -43,16 +43,24 @@ foo: # OBJ-N32: 0000: 00000000 00000000 00000000 # OBJ-N32-LABEL: } # OBJ-N32-LABEL: Relocations [ -# OBJ-N32: 0x0 R_MIPS_NONE/R_MIPS_NONE/R_MIPS_NONE .text 0x4 + # OBJ-N32: 0x4 R_MIPS_NONE/R_MIPS_NONE/R_MIPS_NONE .text 0x0 +# OBJ-N32: 0x0 R_MIPS_NONE/R_MIPS_NONE/R_MIPS_NONE .text 0x4 # OBJ-N32: 0x8 R_MIPS_32/R_MIPS_NONE/R_MIPS_NONE .text 0x8 # OBJ-N32: 0xC R_MIPS_NONE/R_MIPS_NONE/R_MIPS_NONE - 0x0 +# FIXME:This is the correct output for reference. + +# OBJ-N32-FIXME: 0x4 R_MIPS_NONE .text 0x0 +# OBJ-N32-FIXME: 0x0 R_MIPS_NONE .text 0x4 +# OBJ-N32-FIXME: 0x8 R_MIPS_32 .text 0x8 +# OBJ-N32-FIXME: 0xC R_MIPS_NONE - 0x0 + # OBJ-N64-LABEL: Name: .text # OBJ-N64: 0000: 00000000 00000000 00000000 # OBJ-N64-LABEL: } # OBJ-N64-LABEL: Relocations [ -# OBJ-N64: 0x0 R_MIPS_NONE/R_MIPS_NONE/R_MIPS_NONE .text 0x4 # OBJ-N64: 0x4 R_MIPS_NONE/R_MIPS_NONE/R_MIPS_NONE .text 0x0 +# OBJ-N64: 0x0 R_MIPS_NONE/R_MIPS_NONE/R_MIPS_NONE .text 0x4 # OBJ-N64: 0x8 R_MIPS_32/R_MIPS_NONE/R_MIPS_NONE .text 0x8 # OBJ-N64: 0xC R_MIPS_NONE/R_MIPS_NONE/R_MIPS_NONE - 0x0 -- 2.7.4