[dwarfdump] Do not apply relocations in mach-o files if there is no LoadedObjectInfo.
authorFrederic Riss <friss@apple.com>
Sun, 23 Aug 2015 04:44:21 +0000 (04:44 +0000)
committerFrederic Riss <friss@apple.com>
Sun, 23 Aug 2015 04:44:21 +0000 (04:44 +0000)
Not only do we not need to do anything to read correct values from the
object files, but the current logic actually wrongly applies twice the
section base address when there is no LoadedObjectInfo passed to the
DWARFContext creation (as the added test shows).

Simply do not apply any relocations on the mach-o debug info if there is
no load offset to apply.

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

lib/DebugInfo/DWARF/DWARFContext.cpp
test/DebugInfo/Inputs/dwarfdump-macho-relocs.macho.x86_64.o [new file with mode: 0644]
test/DebugInfo/dwarfdump-macho-relocs.test [new file with mode: 0644]

index 2e7bcaf96c0a2d5ee953e646215dfad22810aa07..aecd991ff0db2c32c60b3e4e435054eab4ab4215 100644 (file)
@@ -637,6 +637,14 @@ DWARFContextInMemory::DWARFContextInMemory(const object::ObjectFile &Obj,
     if (L && L->getLoadedSectionContents(*RelocatedSection,RelSecData))
       continue;
 
+    // In Mach-o files, the relocations do not need to be applied if
+    // there is no load offset to apply. The value read at the
+    // relocation point already factors in the section address
+    // (actually applying the relocations will produce wrong results
+    // as the section address will be added twice).
+    if (!L && dyn_cast<MachOObjectFile>(&Obj))
+      continue;
+
     RelSecName = RelSecName.substr(
         RelSecName.find_first_not_of("._")); // Skip . and _ prefixes.
 
diff --git a/test/DebugInfo/Inputs/dwarfdump-macho-relocs.macho.x86_64.o b/test/DebugInfo/Inputs/dwarfdump-macho-relocs.macho.x86_64.o
new file mode 100644 (file)
index 0000000..a5f8476
Binary files /dev/null and b/test/DebugInfo/Inputs/dwarfdump-macho-relocs.macho.x86_64.o differ
diff --git a/test/DebugInfo/dwarfdump-macho-relocs.test b/test/DebugInfo/dwarfdump-macho-relocs.test
new file mode 100644 (file)
index 0000000..95798a8
--- /dev/null
@@ -0,0 +1,27 @@
+// RUN: llvm-dwarfdump -debug-dump=info %p/Inputs/dwarfdump-macho-relocs.macho.x86_64.o | FileCheck %s
+
+// The dumped file has 2 functions in different sections of the __TEXT segment.
+// Check that the addresses are are dumped correctly
+
+// Compiled with: clang -x c -g -c -o dwarfdump-macho-relocs.macho.x86_64.o dwarfdump-macho-relocs.test
+
+__attribute__((section("__TEXT,__blah")))
+int foo() {
+        return 42;
+}
+
+// CHECK:  DW_TAG_subprogram
+// CHECK-NEXT:    DW_AT_low_pc{{.*}}0x0000000000000020
+// CHECK-NEXT:    DW_AT_high_pc{{.*}}0x000000000000002b
+// CHECK-NEXT:    DW_AT_frame_base
+// CHECK-NEXT:    DW_AT_name{{.*}}"foo"
+
+int main() {
+        return foo();
+}
+
+// CHECK:  DW_TAG_subprogram
+// CHECK-NEXT:    DW_AT_low_pc{{.*}}0x0000000000000000
+// CHECK-NEXT:    DW_AT_high_pc{{.*}}0x000000000000001a
+// CHECK-NEXT:    DW_AT_frame_base
+// CHECK-NEXT:    DW_AT_name{{.*}}"main"