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.
--- /dev/null
+// 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"