[llvm] r259339 - [dsymutil] Support scattered relocs.

Frederic Riss via llvm-commits llvm-commits at lists.llvm.org
Sun Jan 31 19:44:22 PST 2016


Author: friss
Date: Sun Jan 31 21:44:22 2016
New Revision: 259339

URL: http://llvm.org/viewvc/llvm-project?rev=259339&view=rev
Log:
[dsymutil] Support scattered relocs.

Although it seems like clang will never emit scattered relocations in
the debug information (at least I couldn't find a way), we have too
support them for the benefit of other compilers.
As clang doesn't generate them, the included testcase was produced
from hacked up assembly.

Added:
    llvm/trunk/test/tools/dsymutil/ARM/dummy-debug-map.map
    llvm/trunk/test/tools/dsymutil/ARM/scattered.c
    llvm/trunk/test/tools/dsymutil/Inputs/scattered-reloc/
    llvm/trunk/test/tools/dsymutil/Inputs/scattered-reloc/1.o
    llvm/trunk/test/tools/dsymutil/Inputs/scattered-reloc/1.s
Modified:
    llvm/trunk/tools/dsymutil/DwarfLinker.cpp

Added: llvm/trunk/test/tools/dsymutil/ARM/dummy-debug-map.map
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/ARM/dummy-debug-map.map?rev=259339&view=auto
==============================================================================
--- llvm/trunk/test/tools/dsymutil/ARM/dummy-debug-map.map (added)
+++ llvm/trunk/test/tools/dsymutil/ARM/dummy-debug-map.map Sun Jan 31 21:44:22 2016
@@ -0,0 +1,15 @@
+# This is a dummy debug map used for some tests where the contents of the
+# map are just an implementation detail. The tests wanting to use that file
+# should put all there object files in an explicitely named sub-directory
+# of Inputs, and they should be named 1.o, 2.o, ...
+# As not finding an object file or symbols isn't a fatal error for dsymutil,
+# you can extend this file with as much object files and symbols as needed.
+
+---
+triple:          'thumbv7-apple-darwin'
+objects:
+  - filename: 1.o
+    symbols:
+      - { sym: _bar, objAddr: 0x0, binAddr: 0x10000, size: 0x10 }
+...
+

Added: llvm/trunk/test/tools/dsymutil/ARM/scattered.c
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/ARM/scattered.c?rev=259339&view=auto
==============================================================================
--- llvm/trunk/test/tools/dsymutil/ARM/scattered.c (added)
+++ llvm/trunk/test/tools/dsymutil/ARM/scattered.c Sun Jan 31 21:44:22 2016
@@ -0,0 +1,12 @@
+RUN: llvm-dsymutil -y %p/dummy-debug-map.map -oso-prepend-path %p/../Inputs/scattered-reloc/ -f -o - | llvm-dwarfdump -debug-dump=info - | FileCheck %s
+
+// See Inputs/scattered-reloc/scattered.s to see how this test
+// actually works. 
+int bar = 42;
+
+CHECK: DW_TAG_variable
+CHECK-NOT: DW_TAG
+CHECK: DW_AT_name{{.*}}"bar"
+CHECK-NOT: DW_TAG
+CHECK: DW_AT_location{{.*}}<0x05> 03 10 00 01 00 
+

Added: llvm/trunk/test/tools/dsymutil/Inputs/scattered-reloc/1.o
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inputs/scattered-reloc/1.o?rev=259339&view=auto
==============================================================================
Binary files llvm/trunk/test/tools/dsymutil/Inputs/scattered-reloc/1.o (added) and llvm/trunk/test/tools/dsymutil/Inputs/scattered-reloc/1.o Sun Jan 31 21:44:22 2016 differ

Added: llvm/trunk/test/tools/dsymutil/Inputs/scattered-reloc/1.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inputs/scattered-reloc/1.s?rev=259339&view=auto
==============================================================================
--- llvm/trunk/test/tools/dsymutil/Inputs/scattered-reloc/1.s (added)
+++ llvm/trunk/test/tools/dsymutil/Inputs/scattered-reloc/1.s Sun Jan 31 21:44:22 2016
@@ -0,0 +1,186 @@
+# This assembly file was generated from the following trivial C code:
+# $ cat scattered.c 
+# int bar = 42;
+# $ clang -S -arch armv7 -g scattered.c
+# $ clang -c -o 1.o scattered.s
+#
+# Then I edited the debug info bellow to change the DW_AT_location of the bar
+# variable from '.long _bar' to '.long _bar + 16' in order to generate a
+# scattered reloc (I do not think LLVM will generate scattered relocs in
+# debug info by itself).
+
+	.section	__TEXT,__text,regular,pure_instructions
+	.ios_version_min 5, 0
+	.syntax unified
+	.file	1 "scattered.c"
+	.section	__DATA,__data
+	.globl	_bar                    @ @bar
+	.p2align	2
+_bar:
+	.long	42                      @ 0x2a
+
+	.section	__DWARF,__debug_str,regular,debug
+Linfo_string:
+	.asciz	"clang version 3.9.0 (trunk 259311)" @ string offset=0
+	.asciz	"scattered.c"           @ string offset=35
+	.asciz	"/tmp"                  @ string offset=47
+	.asciz	"bar"                   @ string offset=52
+	.asciz	"int"                   @ string offset=56
+	.section	__DWARF,__debug_loc,regular,debug
+Lsection_debug_loc:
+	.section	__DWARF,__debug_abbrev,regular,debug
+Lsection_abbrev:
+	.byte	1                       @ Abbreviation Code
+	.byte	17                      @ DW_TAG_compile_unit
+	.byte	1                       @ DW_CHILDREN_yes
+	.byte	37                      @ DW_AT_producer
+	.byte	14                      @ DW_FORM_strp
+	.byte	19                      @ DW_AT_language
+	.byte	5                       @ DW_FORM_data2
+	.byte	3                       @ DW_AT_name
+	.byte	14                      @ DW_FORM_strp
+	.byte	16                      @ DW_AT_stmt_list
+	.byte	6                       @ DW_FORM_data4
+	.byte	27                      @ DW_AT_comp_dir
+	.byte	14                      @ DW_FORM_strp
+	.byte	0                       @ EOM(1)
+	.byte	0                       @ EOM(2)
+	.byte	2                       @ Abbreviation Code
+	.byte	52                      @ DW_TAG_variable
+	.byte	0                       @ DW_CHILDREN_no
+	.byte	3                       @ DW_AT_name
+	.byte	14                      @ DW_FORM_strp
+	.byte	73                      @ DW_AT_type
+	.byte	19                      @ DW_FORM_ref4
+	.byte	63                      @ DW_AT_external
+	.byte	12                      @ DW_FORM_flag
+	.byte	58                      @ DW_AT_decl_file
+	.byte	11                      @ DW_FORM_data1
+	.byte	59                      @ DW_AT_decl_line
+	.byte	11                      @ DW_FORM_data1
+	.byte	2                       @ DW_AT_location
+	.byte	10                      @ DW_FORM_block1
+	.byte	0                       @ EOM(1)
+	.byte	0                       @ EOM(2)
+	.byte	3                       @ Abbreviation Code
+	.byte	36                      @ DW_TAG_base_type
+	.byte	0                       @ DW_CHILDREN_no
+	.byte	3                       @ DW_AT_name
+	.byte	14                      @ DW_FORM_strp
+	.byte	62                      @ DW_AT_encoding
+	.byte	11                      @ DW_FORM_data1
+	.byte	11                      @ DW_AT_byte_size
+	.byte	11                      @ DW_FORM_data1
+	.byte	0                       @ EOM(1)
+	.byte	0                       @ EOM(2)
+	.byte	0                       @ EOM(3)
+	.section	__DWARF,__debug_info,regular,debug
+Lsection_info:
+Lcu_begin0:
+	.long	52                      @ Length of Unit
+	.short	2                       @ DWARF version number
+Lset0 = Lsection_abbrev-Lsection_abbrev @ Offset Into Abbrev. Section
+	.long	Lset0
+	.byte	4                       @ Address Size (in bytes)
+	.byte	1                       @ Abbrev [1] 0xb:0x2d DW_TAG_compile_unit
+	.long	0                       @ DW_AT_producer
+	.short	12                      @ DW_AT_language
+	.long	35                      @ DW_AT_name
+Lset1 = Lline_table_start0-Lsection_line @ DW_AT_stmt_list
+	.long	Lset1
+	.long	47                      @ DW_AT_comp_dir
+	.byte	2                       @ Abbrev [2] 0x1e:0x12 DW_TAG_variable
+	.long	52                      @ DW_AT_name
+	.long	48                      @ DW_AT_type
+	.byte	1                       @ DW_AT_external
+	.byte	1                       @ DW_AT_decl_file
+	.byte	1                       @ DW_AT_decl_line
+	.byte	5                       @ DW_AT_location
+	.byte	3
+	.long	_bar + 16
+	.byte	3                       @ Abbrev [3] 0x30:0x7 DW_TAG_base_type
+	.long	56                      @ DW_AT_name
+	.byte	5                       @ DW_AT_encoding
+	.byte	4                       @ DW_AT_byte_size
+	.byte	0                       @ End Of Children Mark
+	.section	__DWARF,__debug_ranges,regular,debug
+Ldebug_range:
+	.section	__DWARF,__debug_macinfo,regular,debug
+	.byte	0                       @ End Of Macro List Mark
+	.section	__DWARF,__apple_names,regular,debug
+Lnames_begin:
+	.long	1212240712              @ Header Magic
+	.short	1                       @ Header Version
+	.short	0                       @ Header Hash Function
+	.long	1                       @ Header Bucket Count
+	.long	1                       @ Header Hash Count
+	.long	12                      @ Header Data Length
+	.long	0                       @ HeaderData Die Offset Base
+	.long	1                       @ HeaderData Atom Count
+	.short	1                       @ DW_ATOM_die_offset
+	.short	6                       @ DW_FORM_data4
+	.long	0                       @ Bucket 0
+	.long	193487034               @ Hash in Bucket 0
+	.long	LNames0-Lnames_begin    @ Offset in Bucket 0
+LNames0:
+	.long	52                      @ bar
+	.long	1                       @ Num DIEs
+	.long	30
+	.long	0
+	.section	__DWARF,__apple_objc,regular,debug
+Lobjc_begin:
+	.long	1212240712              @ Header Magic
+	.short	1                       @ Header Version
+	.short	0                       @ Header Hash Function
+	.long	1                       @ Header Bucket Count
+	.long	0                       @ Header Hash Count
+	.long	12                      @ Header Data Length
+	.long	0                       @ HeaderData Die Offset Base
+	.long	1                       @ HeaderData Atom Count
+	.short	1                       @ DW_ATOM_die_offset
+	.short	6                       @ DW_FORM_data4
+	.long	-1                      @ Bucket 0
+	.section	__DWARF,__apple_namespac,regular,debug
+Lnamespac_begin:
+	.long	1212240712              @ Header Magic
+	.short	1                       @ Header Version
+	.short	0                       @ Header Hash Function
+	.long	1                       @ Header Bucket Count
+	.long	0                       @ Header Hash Count
+	.long	12                      @ Header Data Length
+	.long	0                       @ HeaderData Die Offset Base
+	.long	1                       @ HeaderData Atom Count
+	.short	1                       @ DW_ATOM_die_offset
+	.short	6                       @ DW_FORM_data4
+	.long	-1                      @ Bucket 0
+	.section	__DWARF,__apple_types,regular,debug
+Ltypes_begin:
+	.long	1212240712              @ Header Magic
+	.short	1                       @ Header Version
+	.short	0                       @ Header Hash Function
+	.long	1                       @ Header Bucket Count
+	.long	1                       @ Header Hash Count
+	.long	20                      @ Header Data Length
+	.long	0                       @ HeaderData Die Offset Base
+	.long	3                       @ HeaderData Atom Count
+	.short	1                       @ DW_ATOM_die_offset
+	.short	6                       @ DW_FORM_data4
+	.short	3                       @ DW_ATOM_die_tag
+	.short	5                       @ DW_FORM_data2
+	.short	4                       @ DW_ATOM_type_flags
+	.short	11                      @ DW_FORM_data1
+	.long	0                       @ Bucket 0
+	.long	193495088               @ Hash in Bucket 0
+	.long	Ltypes0-Ltypes_begin    @ Offset in Bucket 0
+Ltypes0:
+	.long	56                      @ int
+	.long	1                       @ Num DIEs
+	.long	48
+	.short	36
+	.byte	0
+	.long	0
+
+.subsections_via_symbols
+	.section	__DWARF,__debug_line,regular,debug
+Lsection_line:
+Lline_table_start0:

Modified: llvm/trunk/tools/dsymutil/DwarfLinker.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/DwarfLinker.cpp?rev=259339&r1=259338&r2=259339&view=diff
==============================================================================
--- llvm/trunk/tools/dsymutil/DwarfLinker.cpp (original)
+++ llvm/trunk/tools/dsymutil/DwarfLinker.cpp Sun Jan 31 21:44:22 2016
@@ -1898,6 +1898,19 @@ findValidRelocsMachO(const object::Secti
     uint32_t Offset = Offset64;
     // Mach-o uses REL relocations, the addend is at the relocation offset.
     uint64_t Addend = Data.getUnsigned(&Offset, RelocSize);
+    uint64_t SymAddress;
+    int64_t SymOffset;
+
+    if (Obj.isRelocationScattered(MachOReloc)) {
+      // The address of the base symbol for scattered relocations is
+      // stored in the reloc itself. The actual addend will store the
+      // base address plus the offset.
+      SymAddress = Obj.getScatteredRelocationValue(MachOReloc);
+      SymOffset = int64_t(Addend) - SymAddress;
+    } else {
+      SymAddress = Addend;
+      SymOffset = 0;
+    }
 
     auto Sym = Reloc.getSymbol();
     if (Sym != Obj.symbol_end()) {
@@ -1908,11 +1921,11 @@ findValidRelocsMachO(const object::Secti
       }
       if (const auto *Mapping = DMO.lookupSymbol(*SymbolName))
         ValidRelocs.emplace_back(Offset64, RelocSize, Addend, Mapping);
-    } else if (const auto *Mapping = DMO.lookupObjectAddress(Addend)) {
+    } else if (const auto *Mapping = DMO.lookupObjectAddress(SymAddress)) {
       // Do not store the addend. The addend was the address of the
       // symbol in the object file, the address in the binary that is
       // stored in the debug map doesn't need to be offseted.
-      ValidRelocs.emplace_back(Offset64, RelocSize, 0, Mapping);
+      ValidRelocs.emplace_back(Offset64, RelocSize, SymOffset, Mapping);
     }
   }
 }




More information about the llvm-commits mailing list