mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-26 10:29:36 +00:00
Behave like gnu as when a relocation crosses sections.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129850 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b32204cd16
commit
3660a847f1
@ -647,13 +647,12 @@ void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm,
|
||||
|
||||
COFFSection *coff_section = SectionMap[&SectionData->getSection()];
|
||||
COFFSymbol *coff_symbol = SymbolMap[&A_SD.getSymbol()];
|
||||
const MCSymbolRefExpr *SymA = Target.getSymA();
|
||||
const MCSymbolRefExpr *SymB = Target.getSymB();
|
||||
const bool CrossSection = SymB &&
|
||||
&SymA->getSymbol().getSection() != &SymB->getSymbol().getSection();
|
||||
|
||||
if (Target.getSymB()) {
|
||||
if (&Target.getSymA()->getSymbol().getSection()
|
||||
!= &Target.getSymB()->getSymbol().getSection()) {
|
||||
llvm_unreachable("Symbol relative relocations are only allowed between "
|
||||
"symbols in the same section");
|
||||
}
|
||||
const MCSymbol *B = &Target.getSymB()->getSymbol();
|
||||
MCSymbolData &B_SD = Asm.getSymbolData(*B);
|
||||
|
||||
@ -662,7 +661,8 @@ void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm,
|
||||
// In the case where we have SymbA and SymB, we just need to store the delta
|
||||
// between the two symbols. Update FixedValue to account for the delta, and
|
||||
// skip recording the relocation.
|
||||
return;
|
||||
if (!CrossSection)
|
||||
return;
|
||||
} else {
|
||||
FixedValue = Target.getConstant();
|
||||
}
|
||||
@ -673,7 +673,7 @@ void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm,
|
||||
Reloc.Data.VirtualAddress = Layout.getFragmentOffset(Fragment);
|
||||
|
||||
// Turn relocations for temporary symbols into section relocations.
|
||||
if (coff_symbol->MCData->getSymbol().isTemporary()) {
|
||||
if (coff_symbol->MCData->getSymbol().isTemporary() || CrossSection) {
|
||||
Reloc.Symb = coff_symbol->Section->Symbol;
|
||||
FixedValue += Layout.getFragmentOffset(coff_symbol->MCData->Fragment)
|
||||
+ coff_symbol->MCData->getOffset();
|
||||
@ -684,7 +684,12 @@ void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm,
|
||||
|
||||
Reloc.Data.VirtualAddress += Fixup.getOffset();
|
||||
|
||||
switch ((unsigned)Fixup.getKind()) {
|
||||
unsigned FixupKind = Fixup.getKind();
|
||||
|
||||
if (CrossSection)
|
||||
FixupKind = FK_PCRel_4;
|
||||
|
||||
switch (FixupKind) {
|
||||
case FK_PCRel_4:
|
||||
case X86::reloc_riprel_4byte:
|
||||
case X86::reloc_riprel_4byte_movq_load:
|
||||
|
28
test/MC/COFF/diff.s
Normal file
28
test/MC/COFF/diff.s
Normal file
@ -0,0 +1,28 @@
|
||||
// RUN: llvm-mc -filetype=obj -triple i686-pc-mingw32 %s | coff-dump.py | FileCheck %s
|
||||
|
||||
.def _foobar;
|
||||
.scl 2;
|
||||
.type 32;
|
||||
.endef
|
||||
.text
|
||||
.globl _foobar
|
||||
.align 16, 0x90
|
||||
_foobar: # @foobar
|
||||
# BB#0:
|
||||
ret
|
||||
|
||||
.data
|
||||
.globl _rust_crate # @rust_crate
|
||||
.align 4
|
||||
_rust_crate:
|
||||
.long _foobar-_rust_crate
|
||||
|
||||
|
||||
// CHECK: Relocations = [
|
||||
// CHECK-NEXT: 0 = {
|
||||
// CHECK-NEXT: VirtualAddress = 0x0
|
||||
// CHECK-NEXT: SymbolTableIndex =
|
||||
// CHECK-NEXT: Type = IMAGE_REL_I386_REL32 (20)
|
||||
// CHECK-NEXT: SymbolName = .text
|
||||
// CHECK-NEXT: }
|
||||
// CHECK-NEXT: ]
|
Loading…
x
Reference in New Issue
Block a user