From a25ee390b55582d4e8a66466d52a237ce8c6ac5f Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 6 Jul 2015 12:18:44 +0000 Subject: [PATCH] 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 --- include/llvm/Object/RelocVisitor.h | 15 +++++++++++---- test/Object/Inputs/elf-mip64-reloc.o | Bin 0 -> 3208 bytes test/Object/Mips/reloc-visit.test | 6 ++++++ 3 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 test/Object/Inputs/elf-mip64-reloc.o create mode 100644 test/Object/Mips/reloc-visit.test 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 0000000000000000000000000000000000000000..5e689254a43e9afc632c9294ebfb36e6523b332a GIT binary patch literal 3208 zcmb_eOKTHR6uvh}H5!f8`e=OyRIG|qwblAU13rrQK=6TxAd_TTqsdIjOiNu=a3g{X zH?GB>;6~TFap6{QsVkT2%7sY%&dfdWus6Fl9 zE$tuMH@5%4&eCwBG1DCBV58%sJJqo;s@47DYUFm%^hUg}RrhN_!yO^2nhXL}_amiO z>g~mWzHG67-G<_)xuKPM)gq-bjw0jp+)#NiTRc)YTG%mkcHqPi2ufwQsci9hp-@Pg zpHMk6^2za+C1B5IUY<9vn?%qQaxzP1Uz}sDV%9leyQoJa-8(0#^H~0IG)b@?PV{}$ zPpq`hawe1Mx?jHQ)$@=Xu3yh?Sw@#-WHlQ?(=&1~KH(;`A0@i*arh+E=VB~7&w5}o&k6V>o3V&X`K0WIvk-n5 zxXg3K1f8<*>jtND(Q{|_lZI~um-cLa$zXP$yLxb^=2fPrZn>38+nZ5N+W6l3?S)a> zq-fRJ@fVOxSobFb<@iD5ITIJJ?g=Bedbg`$qwafMz+@Y>xKtyk@;l_9P~=vW6W(ja zy5>f%a++~Z4o-7$43qgk@)>F9&KHo}s|3{cdn4cG72vQ>cPpiA9Ql3_)NgQ7-?2E} z?&Ff+NmIttGtT+{CH|+VFKdvUR-gMN&O;3q$&9~h$uII+nso-Ek*LLVk4#hT-gNi z{TGcd`#%j#<}(yhn(zNl^~)fp)xSvu)JH37pMXf)4{^6W!A{mzis@m~|T=YIgl)A^}}?8k(V z!XKYRthsdNN4syZ(&mrWVxf4tL;jz_d8z(OthD+(_aop)k^C3fNUQ(M1W_HTPnty5 W{{r8dTg)MN)>t2)sV2v<9{dFoAI$&& literal 0 HcmV?d00001 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") -- 2.34.1