]> granicus.if.org Git - llvm/commitdiff
[llvm-objdump] Correctly distinguish between the MachO upper/lower16 relocations
authorMartin Storsjo <martin@martin.st>
Thu, 13 Jul 2017 05:54:08 +0000 (05:54 +0000)
committerMartin Storsjo <martin@martin.st>
Thu, 13 Jul 2017 05:54:08 +0000 (05:54 +0000)
All other code in MachODump.cpp uses the same comparison,
((r_length & 0x1) == 1), for distinguishing between the two,
while the code in llvm-objdump.cpp seemed to be incorrect.

Differential Revision: https://reviews.llvm.org/D35240

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307882 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/llvm-objdump/ARM/Inputs/reloc-half.obj.macho-arm [new file with mode: 0644]
test/tools/llvm-objdump/ARM/macho-reloc-half.test [new file with mode: 0644]
tools/llvm-objdump/llvm-objdump.cpp

diff --git a/test/tools/llvm-objdump/ARM/Inputs/reloc-half.obj.macho-arm b/test/tools/llvm-objdump/ARM/Inputs/reloc-half.obj.macho-arm
new file mode 100644 (file)
index 0000000..79d1996
Binary files /dev/null and b/test/tools/llvm-objdump/ARM/Inputs/reloc-half.obj.macho-arm differ
diff --git a/test/tools/llvm-objdump/ARM/macho-reloc-half.test b/test/tools/llvm-objdump/ARM/macho-reloc-half.test
new file mode 100644 (file)
index 0000000..888c7f5
--- /dev/null
@@ -0,0 +1,4 @@
+RUN: llvm-objdump -r %p/Inputs/reloc-half.obj.macho-arm | FileCheck %s
+
+CHECK-DAG: 00000004 ARM_RELOC_HALF :upper16:(_stringbuf)
+CHECK-DAG: 00000000 ARM_RELOC_HALF :lower16:(_stringbuf)
index be5635a3d4c69129f16b443dc1c35cda583e48b3..812f1af3ac680851d2d3339ecdbdbffc8471af29 100644 (file)
@@ -1032,7 +1032,7 @@ static std::error_code getRelocationValueString(const MachOObjectFile *Obj,
       case MachO::ARM_RELOC_HALF_SECTDIFF: {
         // Half relocations steal a bit from the length field to encode
         // whether this is an upper16 or a lower16 relocation.
-        bool isUpper = Obj->getAnyRelocationLength(RE) >> 1;
+        bool isUpper = (Obj->getAnyRelocationLength(RE) & 0x1) == 1;
 
         if (isUpper)
           fmt << ":upper16:(";