aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Grosbach <grosbach@apple.com>2012-01-17 22:14:39 +0000
committerJim Grosbach <grosbach@apple.com>2012-01-17 22:14:39 +0000
commit8b9300b972745a6d89b482cbcd4206c01359f7df (patch)
tree071c86c422c7148217e4bc75b6849d8b5227d38b
parent283f1fff47db3a483ab94e4b49cc39eb39dd48ea (diff)
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
-rw-r--r--lib/MC/MachObjectWriter.cpp4
-rw-r--r--test/MC/MachO/ARM/darwin-ARM-reloc.s4
-rw-r--r--test/MC/MachO/reloc-pcrel-offset.s1
-rw-r--r--test/MC/MachO/reloc-pcrel.s7
4 files changed, 9 insertions, 7 deletions
diff --git a/lib/MC/MachObjectWriter.cpp b/lib/MC/MachObjectWriter.cpp
index e016f09c95..ce222b75cf 100644
--- a/lib/MC/MachObjectWriter.cpp
+++ b/lib/MC/MachObjectWriter.cpp
@@ -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;
}
diff --git a/test/MC/MachO/ARM/darwin-ARM-reloc.s b/test/MC/MachO/ARM/darwin-ARM-reloc.s
index fe69a94c27..b98c80c46e 100644
--- a/test/MC/MachO/ARM/darwin-ARM-reloc.s
+++ b/test/MC/MachO/ARM/darwin-ARM-reloc.s
@@ -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
diff --git a/test/MC/MachO/reloc-pcrel-offset.s b/test/MC/MachO/reloc-pcrel-offset.s
index bc611d7f36..e113e9616c 100644
--- a/test/MC/MachO/reloc-pcrel-offset.s
+++ b/test/MC/MachO/reloc-pcrel-offset.s
@@ -11,6 +11,7 @@
.text
_a:
+_b:
call _a
.subsections_via_symbols
diff --git a/test/MC/MachO/reloc-pcrel.s b/test/MC/MachO/reloc-pcrel.s
index b6d4be6689..1133415036 100644
--- a/test/MC/MachO/reloc-pcrel.s
+++ b/test/MC/MachO/reloc-pcrel.s
@@ -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