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



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@148341 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jim Grosbach 2012-01-17 22:14:39 +00:00
parent 283f1fff47
commit 8b9300b972
4 changed files with 9 additions and 7 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -11,6 +11,7 @@
.text
_a:
_b:
call _a
.subsections_via_symbols

View File

@ -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