diff options
-rw-r--r-- | lib/MC/MachObjectWriter.cpp | 2 | ||||
-rw-r--r-- | test/MC/MachO/darwin-ARM-reloc.s | 62 |
2 files changed, 39 insertions, 25 deletions
diff --git a/lib/MC/MachObjectWriter.cpp b/lib/MC/MachObjectWriter.cpp index 1347427741..5c4d6f2375 100644 --- a/lib/MC/MachObjectWriter.cpp +++ b/lib/MC/MachObjectWriter.cpp @@ -962,7 +962,7 @@ public: // // Is this right for ARM? uint32_t Offset = Target.getConstant(); - if (IsPCRel) + if (IsPCRel && !Is24BitBranch) Offset += 1 << Log2Size; if (Offset && SD && !doesSymbolRequireExternRelocation(SD)) return RecordARMScatteredRelocation(Asm, Layout, Fragment, Fixup, diff --git a/test/MC/MachO/darwin-ARM-reloc.s b/test/MC/MachO/darwin-ARM-reloc.s index 08cfeca9b1..86b45e07bf 100644 --- a/test/MC/MachO/darwin-ARM-reloc.s +++ b/test/MC/MachO/darwin-ARM-reloc.s @@ -7,6 +7,9 @@ _f0: bl _printf +_f1: + bl _f0 + .data _d0: Ld0_0: @@ -28,9 +31,9 @@ Lsc0_0: @ CHECK: ('size', 260) @ CHECK: ('segment_name', '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') @ CHECK: ('vm_addr', 0) -@ CHECK: ('vm_size', 12) +@ CHECK: ('vm_size', 16) @ CHECK: ('file_offset', 392) -@ CHECK: ('file_size', 12) +@ CHECK: ('file_size', 16) @ CHECK: ('maxprot', 7) @ CHECK: ('initprot', 7) @ CHECK: ('num_sections', 3) @@ -40,29 +43,32 @@ Lsc0_0: @ CHECK: (('section_name', '__text\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') @ CHECK: ('segment_name', '__TEXT\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') @ CHECK: ('address', 0) -@ CHECK: ('size', 4) +@ CHECK: ('size', 8) @ CHECK: ('offset', 392) @ CHECK: ('alignment', 0) -@ CHECK: ('reloc_offset', 404) -@ CHECK: ('num_reloc', 1) +@ CHECK: ('reloc_offset', 408) +@ CHECK: ('num_reloc', 2) @ CHECK: ('flags', 0x80000400) @ CHECK: ('reserved1', 0) @ CHECK: ('reserved2', 0) @ CHECK: ), @ CHECK: ('_relocations', [ @ CHECK: # Relocation 0 +@ CHECK: (('word-0', 0x4), +@ CHECK: ('word-1', 0x55000001)), +@ CHECK: # Relocation 1 @ CHECK: (('word-0', 0x0), -@ CHECK: ('word-1', 0x5d000002)), +@ CHECK: ('word-1', 0x5d000003)), @ CHECK: ]) -@ CHECK: ('_section_data', 'feffffeb') +@ CHECK: ('_section_data', 'feffffeb fdffffeb') @ CHECK: # Section 1 @ CHECK: (('section_name', '__data\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') @ CHECK: ('segment_name', '__DATA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') -@ CHECK: ('address', 4) +@ CHECK: ('address', 8) @ CHECK: ('size', 4) -@ CHECK: ('offset', 396) +@ CHECK: ('offset', 400) @ CHECK: ('alignment', 0) -@ CHECK: ('reloc_offset', 412) +@ CHECK: ('reloc_offset', 424) @ CHECK: ('num_reloc', 2) @ CHECK: ('flags', 0x0) @ CHECK: ('reserved1', 0) @@ -71,18 +77,18 @@ Lsc0_0: @ CHECK: ('_relocations', [ @ CHECK: # Relocation 0 @ CHECK: (('word-0', 0xa2000000), -@ CHECK: ('word-1', 0x8)), +@ CHECK: ('word-1', 0xc)), @ CHECK: # Relocation 1 @ CHECK: (('word-0', 0xa1000000), -@ CHECK: ('word-1', 0x4)), +@ CHECK: ('word-1', 0x8)), @ CHECK: ]) @ CHECK: ('_section_data', '04000000') @ CHECK: # Section 2 @ CHECK: (('section_name', '__cstring\x00\x00\x00\x00\x00\x00\x00') @ CHECK: ('segment_name', '__TEXT\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') -@ CHECK: ('address', 8) +@ CHECK: ('address', 12) @ CHECK: ('size', 4) -@ CHECK: ('offset', 400) +@ CHECK: ('offset', 404) @ CHECK: ('alignment', 0) @ CHECK: ('reloc_offset', 0) @ CHECK: ('num_reloc', 0) @@ -98,11 +104,11 @@ Lsc0_0: @ CHECK: # Load Command 1 @ CHECK: (('command', 2) @ CHECK: ('size', 24) -@ CHECK: ('symoff', 428) -@ CHECK: ('nsyms', 3) -@ CHECK: ('stroff', 464) -@ CHECK: ('strsize', 20) -@ CHECK: ('_string_data', '\x00_printf\x00_f0\x00_d0\x00\x00\x00\x00') +@ CHECK: ('symoff', 440) +@ CHECK: ('nsyms', 4) +@ CHECK: ('stroff', 488) +@ CHECK: ('strsize', 24) +@ CHECK: ('_string_data', '\x00_printf\x00_f0\x00_f1\x00_d0\x00\x00\x00\x00') @ CHECK: ('_symbols', [ @ CHECK: # Symbol 0 @ CHECK: (('n_strx', 9) @@ -115,12 +121,20 @@ Lsc0_0: @ CHECK: # Symbol 1 @ CHECK: (('n_strx', 13) @ CHECK: ('n_type', 0xe) -@ CHECK: ('n_sect', 2) +@ CHECK: ('n_sect', 1) @ CHECK: ('n_desc', 0) @ CHECK: ('n_value', 4) -@ CHECK: ('_string', '_d0') +@ CHECK: ('_string', '_f1') @ CHECK: ), @ CHECK: # Symbol 2 +@ CHECK: (('n_strx', 17) +@ CHECK: ('n_type', 0xe) +@ CHECK: ('n_sect', 2) +@ CHECK: ('n_desc', 0) +@ CHECK: ('n_value', 8) +@ CHECK: ('_string', '_d0') +@ CHECK: ), +@ CHECK: # Symbol 3 @ CHECK: (('n_strx', 1) @ CHECK: ('n_type', 0x1) @ CHECK: ('n_sect', 0) @@ -134,10 +148,10 @@ Lsc0_0: @ CHECK: (('command', 11) @ CHECK: ('size', 80) @ CHECK: ('ilocalsym', 0) -@ CHECK: ('nlocalsym', 2) -@ CHECK: ('iextdefsym', 2) +@ CHECK: ('nlocalsym', 3) +@ CHECK: ('iextdefsym', 3) @ CHECK: ('nextdefsym', 0) -@ CHECK: ('iundefsym', 2) +@ CHECK: ('iundefsym', 3) @ CHECK: ('nundefsym', 1) @ CHECK: ('tocoff', 0) @ CHECK: ('ntoc', 0) |