mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
MC tweak symbol difference resolution for non-local symbols.
When the non-local symbol in the expression is in the same fragment as the second symbol, the assembler can still evaluate the expression without needing a relocation. For example, on ARM: _foo: ldr lr, (_foo - 4) rdar://10348687 llvm-svn: 148341
This commit is contained in:
parent
095e519996
commit
e6d2a7a097
@ -590,8 +590,8 @@ IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
|
||||
// assembler locals.
|
||||
|
||||
if (!Asm.getBackend().hasReliableSymbolDifference()) {
|
||||
if ((!SA.isTemporary() && Asm.getSubsectionsViaSymbols()) ||
|
||||
!SA.isInSection() || &SecA != &SecB)
|
||||
if (!SA.isInSection() || &SecA != &SecB ||
|
||||
(!SA.isTemporary() && &FB != Asm.getSymbolData(SA).getFragment()))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
@ -12,9 +12,9 @@ _f1:
|
||||
|
||||
.data
|
||||
_d0:
|
||||
Ld0_0:
|
||||
Ld0_0:
|
||||
.long Lsc0_0 - Ld0_0
|
||||
|
||||
|
||||
.section __TEXT,__cstring,cstring_literals
|
||||
Lsc0_0:
|
||||
.long 0
|
||||
|
@ -11,6 +11,7 @@
|
||||
|
||||
.text
|
||||
_a:
|
||||
_b:
|
||||
call _a
|
||||
|
||||
.subsections_via_symbols
|
||||
|
@ -8,13 +8,13 @@
|
||||
// CHECK: ('word-1', 0x6)),
|
||||
// CHECK: # Relocation 2
|
||||
// CHECK: (('word-0', 0x40),
|
||||
// CHECK: ('word-1', 0xd000002)),
|
||||
// CHECK: ('word-1', 0xd000003)),
|
||||
// CHECK: # Relocation 3
|
||||
// CHECK: (('word-0', 0x3b),
|
||||
// CHECK: ('word-1', 0xd000002)),
|
||||
// CHECK: ('word-1', 0xd000003)),
|
||||
// CHECK: # Relocation 4
|
||||
// CHECK: (('word-0', 0x36),
|
||||
// CHECK: ('word-1', 0xd000002)),
|
||||
// CHECK: ('word-1', 0xd000003)),
|
||||
// CHECK: # Relocation 5
|
||||
// CHECK: (('word-0', 0xe0000031),
|
||||
// CHECK: ('word-1', 0x4)),
|
||||
@ -41,6 +41,7 @@
|
||||
_a:
|
||||
xorl %eax,%eax
|
||||
_b:
|
||||
_d:
|
||||
xorl %eax,%eax
|
||||
L0:
|
||||
xorl %eax,%eax
|
||||
|
Loading…
Reference in New Issue
Block a user