mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-19 04:32:19 +00:00
MC: Calculate intra-section symbol differences correctly for COFF
This fixes PR22060. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228565 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
cda59be931
commit
3c1b9d53d0
@ -706,17 +706,22 @@ void WinCOFFObjectWriter::RecordRelocation(
|
||||
CrossSection = &Symbol.getSection() != &B->getSection();
|
||||
|
||||
// Offset of the symbol in the section
|
||||
int64_t a = Layout.getSymbolOffset(&B_SD);
|
||||
int64_t OffsetOfB = Layout.getSymbolOffset(&B_SD);
|
||||
|
||||
// Offset of the relocation in the section
|
||||
int64_t b = Layout.getFragmentOffset(Fragment) + Fixup.getOffset();
|
||||
|
||||
FixedValue = b - a;
|
||||
// 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.
|
||||
if (!CrossSection)
|
||||
if (!CrossSection) {
|
||||
int64_t OffsetOfA = Layout.getSymbolOffset(&A_SD);
|
||||
FixedValue = (OffsetOfA - OffsetOfB) + Target.getConstant();
|
||||
return;
|
||||
}
|
||||
|
||||
// Offset of the relocation in the section
|
||||
int64_t OffsetOfRelocation =
|
||||
Layout.getFragmentOffset(Fragment) + Fixup.getOffset();
|
||||
|
||||
FixedValue = OffsetOfRelocation - OffsetOfB;
|
||||
} else {
|
||||
FixedValue = Target.getConstant();
|
||||
}
|
||||
|
@ -1,5 +1,23 @@
|
||||
// RUN: llvm-mc -filetype=obj -triple i686-pc-mingw32 %s | llvm-readobj -s -sr -sd | FileCheck %s
|
||||
|
||||
.section baz, "xr"
|
||||
.def X
|
||||
.scl 2;
|
||||
.type 32;
|
||||
.endef
|
||||
.globl X
|
||||
X:
|
||||
mov Y-X+42, %eax
|
||||
retl
|
||||
|
||||
.def Y
|
||||
.scl 2;
|
||||
.type 32;
|
||||
.endef
|
||||
.globl Y
|
||||
Y:
|
||||
retl
|
||||
|
||||
.def _foobar;
|
||||
.scl 2;
|
||||
.type 32;
|
||||
@ -30,3 +48,10 @@ _rust_crate:
|
||||
// CHECK: SectionData (
|
||||
// CHECK-NEXT: 0000: 00000000 00000000 1C000000 20000000
|
||||
// CHECK-NEXT: )
|
||||
|
||||
// CHECK: Name: baz
|
||||
// CHECK: Relocations [
|
||||
// CHECK-NEXT: ]
|
||||
// CHECK: SectionData (
|
||||
// CHECK-NEXT: 0000: A1300000 00C3C3
|
||||
// CHECK-NEXT: )
|
||||
|
Loading…
x
Reference in New Issue
Block a user