mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-09 10:31:14 +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 MCFragment *Fragment,
|
||||||
const MCFixup &Fixup,
|
const MCFixup &Fixup,
|
||||||
MCValue Target,
|
MCValue Target,
|
||||||
|
unsigned Type,
|
||||||
unsigned Log2Size,
|
unsigned Log2Size,
|
||||||
uint64_t &FixedValue);
|
uint64_t &FixedValue);
|
||||||
void RecordARMScatteredHalfRelocation(MachObjectWriter *Writer,
|
void RecordARMScatteredHalfRelocation(MachObjectWriter *Writer,
|
||||||
@ -251,11 +252,11 @@ void ARMMachObjectWriter::RecordARMScatteredRelocation(MachObjectWriter *Writer,
|
|||||||
const MCFragment *Fragment,
|
const MCFragment *Fragment,
|
||||||
const MCFixup &Fixup,
|
const MCFixup &Fixup,
|
||||||
MCValue Target,
|
MCValue Target,
|
||||||
|
unsigned Type,
|
||||||
unsigned Log2Size,
|
unsigned Log2Size,
|
||||||
uint64_t &FixedValue) {
|
uint64_t &FixedValue) {
|
||||||
uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
|
uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
|
||||||
unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
|
unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
|
||||||
unsigned Type = MachO::ARM_RELOC_VANILLA;
|
|
||||||
|
|
||||||
// See <reloc.h>.
|
// See <reloc.h>.
|
||||||
const MCSymbol *A = &Target.getSymA()->getSymbol();
|
const MCSymbol *A = &Target.getSymA()->getSymbol();
|
||||||
@ -272,6 +273,7 @@ void ARMMachObjectWriter::RecordARMScatteredRelocation(MachObjectWriter *Writer,
|
|||||||
uint32_t Value2 = 0;
|
uint32_t Value2 = 0;
|
||||||
|
|
||||||
if (const MCSymbolRefExpr *B = Target.getSymB()) {
|
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());
|
const MCSymbolData *B_SD = &Asm.getSymbolData(B->getSymbol());
|
||||||
|
|
||||||
if (!B_SD->getFragment())
|
if (!B_SD->getFragment())
|
||||||
@ -374,7 +376,8 @@ void ARMMachObjectWriter::RecordRelocation(MachObjectWriter *Writer,
|
|||||||
return RecordARMScatteredHalfRelocation(Writer, Asm, Layout, Fragment,
|
return RecordARMScatteredHalfRelocation(Writer, Asm, Layout, Fragment,
|
||||||
Fixup, Target, FixedValue);
|
Fixup, Target, FixedValue);
|
||||||
return RecordARMScatteredRelocation(Writer, Asm, Layout, Fragment, Fixup,
|
return RecordARMScatteredRelocation(Writer, Asm, Layout, Fragment, Fixup,
|
||||||
Target, Log2Size, FixedValue);
|
Target, RelocType, Log2Size,
|
||||||
|
FixedValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the symbol data, if any.
|
// Get the symbol data, if any.
|
||||||
@ -392,7 +395,8 @@ void ARMMachObjectWriter::RecordRelocation(MachObjectWriter *Writer,
|
|||||||
Offset += 1 << Log2Size;
|
Offset += 1 << Log2Size;
|
||||||
if (Offset && SD && !Writer->doesSymbolRequireExternRelocation(SD))
|
if (Offset && SD && !Writer->doesSymbolRequireExternRelocation(SD))
|
||||||
return RecordARMScatteredRelocation(Writer, Asm, Layout, Fragment, Fixup,
|
return RecordARMScatteredRelocation(Writer, Asm, Layout, Fragment, Fixup,
|
||||||
Target, Log2Size, FixedValue);
|
Target, RelocType, Log2Size,
|
||||||
|
FixedValue);
|
||||||
|
|
||||||
// See <reloc.h>.
|
// See <reloc.h>.
|
||||||
uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
|
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