mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 20:29:53 +00:00
ARM: when falling back to scattered relocs, keep the type.
The linker relies on relocation type info (e.g. is it a branch?) to perform the correct actions, so we should keep that even when we end up using a scattered relocation for whatever reason. rdar://problem/17553104 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@212333 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5b003bb869
commit
0f9d1b381e
@ -32,6 +32,7 @@ class ARMMachObjectWriter : public MCMachObjectTargetWriter {
|
||||
const MCFragment *Fragment,
|
||||
const MCFixup &Fixup,
|
||||
MCValue Target,
|
||||
unsigned Type,
|
||||
unsigned Log2Size,
|
||||
uint64_t &FixedValue);
|
||||
void RecordARMScatteredHalfRelocation(MachObjectWriter *Writer,
|
||||
@ -251,11 +252,11 @@ void ARMMachObjectWriter::RecordARMScatteredRelocation(MachObjectWriter *Writer,
|
||||
const MCFragment *Fragment,
|
||||
const MCFixup &Fixup,
|
||||
MCValue Target,
|
||||
unsigned Type,
|
||||
unsigned Log2Size,
|
||||
uint64_t &FixedValue) {
|
||||
uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
|
||||
unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
|
||||
unsigned Type = MachO::ARM_RELOC_VANILLA;
|
||||
|
||||
// See <reloc.h>.
|
||||
const MCSymbol *A = &Target.getSymA()->getSymbol();
|
||||
@ -272,6 +273,7 @@ void ARMMachObjectWriter::RecordARMScatteredRelocation(MachObjectWriter *Writer,
|
||||
uint32_t Value2 = 0;
|
||||
|
||||
if (const MCSymbolRefExpr *B = Target.getSymB()) {
|
||||
assert(Type == MachO::ARM_RELOC_VANILLA && "invalid reloc for 2 symbols");
|
||||
const MCSymbolData *B_SD = &Asm.getSymbolData(B->getSymbol());
|
||||
|
||||
if (!B_SD->getFragment())
|
||||
@ -374,7 +376,8 @@ void ARMMachObjectWriter::RecordRelocation(MachObjectWriter *Writer,
|
||||
return RecordARMScatteredHalfRelocation(Writer, Asm, Layout, Fragment,
|
||||
Fixup, Target, FixedValue);
|
||||
return RecordARMScatteredRelocation(Writer, Asm, Layout, Fragment, Fixup,
|
||||
Target, Log2Size, FixedValue);
|
||||
Target, RelocType, Log2Size,
|
||||
FixedValue);
|
||||
}
|
||||
|
||||
// Get the symbol data, if any.
|
||||
@ -392,7 +395,8 @@ void ARMMachObjectWriter::RecordRelocation(MachObjectWriter *Writer,
|
||||
Offset += 1 << Log2Size;
|
||||
if (Offset && SD && !Writer->doesSymbolRequireExternRelocation(SD))
|
||||
return RecordARMScatteredRelocation(Writer, Asm, Layout, Fragment, Fixup,
|
||||
Target, Log2Size, FixedValue);
|
||||
Target, RelocType, Log2Size,
|
||||
FixedValue);
|
||||
|
||||
// See <reloc.h>.
|
||||
uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
|
||||
|
34
test/MC/ARM/macho-relocs-with-addend.s
Normal file
34
test/MC/ARM/macho-relocs-with-addend.s
Normal file
@ -0,0 +1,34 @@
|
||||
@ RUN: llvm-mc -triple thumbv7-apple-ios7.0 -filetype=obj -o - %s | \
|
||||
@ RUN: llvm-readobj -r - | FileCheck %s
|
||||
|
||||
@ MachO relocations that end up expressed as internal
|
||||
@ (scattered) still need to have the type set correctly.
|
||||
|
||||
.text
|
||||
.thumb_func
|
||||
.thumb
|
||||
.globl _with_thumb
|
||||
_with_thumb:
|
||||
bl _dest+10
|
||||
blx _dest+20
|
||||
|
||||
.globl _with_arm
|
||||
.arm
|
||||
_with_arm:
|
||||
bl _dest+10
|
||||
blx _dest+20
|
||||
bne _dest+30
|
||||
b _dest+40
|
||||
|
||||
.data
|
||||
_dest:
|
||||
.word 42
|
||||
|
||||
@ CHECK: Relocations [
|
||||
@ CHECK-NEXT: Section __text {
|
||||
@ CHECK-NEXT: 0x14 1 2 n/a ARM_RELOC_BR24 1 0x18
|
||||
@ CHECK-NEXT: 0x10 1 2 n/a ARM_RELOC_BR24 1 0x18
|
||||
@ CHECK-NEXT: 0xC 1 2 n/a ARM_RELOC_BR24 1 0x18
|
||||
@ CHECK-NEXT: 0x8 1 2 n/a ARM_RELOC_BR24 1 0x18
|
||||
@ CHECK-NEXT: 0x4 1 2 n/a ARM_THUMB_RELOC_BR22 1 0x18
|
||||
@ CHECK-NEXT: 0x0 1 2 n/a ARM_THUMB_RELOC_BR22 1 0x18
|
Loading…
Reference in New Issue
Block a user