From: Rafael Espindola Date: Mon, 6 Jul 2015 12:18:44 +0000 (+0000) Subject: Fix handling of ELF::R_MIPS_32 on Mips64. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=a25ee390b55582d4e8a66466d52a237ce8c6ac5f;p=oota-llvm.git Fix handling of ELF::R_MIPS_32 on Mips64. Thanks to Aboud, Amjad for reporting the regression and providing the testcase. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241440 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Object/RelocVisitor.h b/include/llvm/Object/RelocVisitor.h index 950e2ed0e33..d5e4258cb0a 100644 --- a/include/llvm/Object/RelocVisitor.h +++ b/include/llvm/Object/RelocVisitor.h @@ -100,9 +100,9 @@ private: case Triple::mips64: switch (RelocType) { case llvm::ELF::R_MIPS_32: - return visitELF_MIPS_32(R, Value); + return visitELF_MIPS64_32(R, Value); case llvm::ELF::R_MIPS_64: - return visitELF_MIPS_64(R, Value); + return visitELF_MIPS64_64(R, Value); default: HasError = true; return RelocToApply(); @@ -313,11 +313,18 @@ private: /// MIPS ELF RelocToApply visitELF_MIPS_32(RelocationRef R, uint64_t Value) { - uint32_t Res = (Value)&0xFFFFFFFF; + uint32_t Res = Value & 0xFFFFFFFF; + return RelocToApply(Res, 4); + } + + /// MIPS64 ELF + RelocToApply visitELF_MIPS64_32(RelocationRef R, uint64_t Value) { + int64_t Addend = getELFAddend(R); + uint32_t Res = (Value + Addend) & 0xFFFFFFFF; return RelocToApply(Res, 4); } - RelocToApply visitELF_MIPS_64(RelocationRef R, uint64_t Value) { + RelocToApply visitELF_MIPS64_64(RelocationRef R, uint64_t Value) { int64_t Addend = getELFAddend(R); uint64_t Res = (Value + Addend); return RelocToApply(Res, 8); diff --git a/test/Object/Inputs/elf-mip64-reloc.o b/test/Object/Inputs/elf-mip64-reloc.o new file mode 100644 index 00000000000..5e689254a43 Binary files /dev/null and b/test/Object/Inputs/elf-mip64-reloc.o differ diff --git a/test/Object/Mips/reloc-visit.test b/test/Object/Mips/reloc-visit.test new file mode 100644 index 00000000000..d75551a387c --- /dev/null +++ b/test/Object/Mips/reloc-visit.test @@ -0,0 +1,6 @@ +RUN: llvm-dwarfdump -debug-dump=info %p/../Inputs/elf-mip64-reloc.o 2>&1 | \ +RUN: FileCheck %s + +CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000037] = "") +CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000054] = "foo") +CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000058] = "int")