summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2014-07-01 14:34:30 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2014-07-01 14:34:30 +0000
commit83120cdf68378891bda240a814b5dff4e87af897 (patch)
tree2417995a33a3d154c0694a36e14efea67d1761b2
parent1111e6fe8411fb2251ee3b3ab7c0bd5919cb04c2 (diff)
downloadbcm5719-llvm-83120cdf68378891bda240a814b5dff4e87af897.tar.gz
bcm5719-llvm-83120cdf68378891bda240a814b5dff4e87af897.zip
Avoid revocations when possible.
This is a small targeted fix for pr20119. The code needs quiet a bit of refactoring and I added some FIXMEs about it, but I want to get the testcase passing first. llvm-svn: 212101
-rw-r--r--llvm/lib/MC/MCAssembler.cpp17
-rw-r--r--llvm/test/MC/ELF/no-reloc.s19
2 files changed, 35 insertions, 1 deletions
diff --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp
index 4f876c8ce7d..64d6071f4e6 100644
--- a/llvm/lib/MC/MCAssembler.cpp
+++ b/llvm/lib/MC/MCAssembler.cpp
@@ -434,12 +434,27 @@ const MCSymbolData *MCAssembler::getAtom(const MCSymbolData *SD) const {
return SD->getFragment()->getAtom();
}
+// Try to fully compute Expr to an absolute value and if that fails produce
+// a relocatable expr.
+// FIXME: Should this be the behavior of EvaluateAsRelocatable itself?
+static bool evaluate(const MCExpr &Expr, const MCAsmLayout &Layout,
+ MCValue &Target) {
+ if (Expr.EvaluateAsValue(Target, &Layout))
+ if (Target.isAbsolute())
+ return true;
+ return Expr.EvaluateAsRelocatable(Target, &Layout);
+}
+
bool MCAssembler::evaluateFixup(const MCAsmLayout &Layout,
const MCFixup &Fixup, const MCFragment *DF,
MCValue &Target, uint64_t &Value) const {
++stats::evaluateFixup;
- if (!Fixup.getValue()->EvaluateAsRelocatable(Target, &Layout))
+ // FIXME: This code has some duplication with RecordRelocation. We should
+ // probably merge the two into a single callback that tries to evaluate a
+ // fixup and records a relocation if one is needed.
+ const MCExpr *Expr = Fixup.getValue();
+ if (!evaluate(*Expr, Layout, Target))
getContext().FatalError(Fixup.getLoc(), "expected relocatable expression");
bool IsPCRel = Backend.getFixupKindInfo(
diff --git a/llvm/test/MC/ELF/no-reloc.s b/llvm/test/MC/ELF/no-reloc.s
new file mode 100644
index 00000000000..78f1b88cebb
--- /dev/null
+++ b/llvm/test/MC/ELF/no-reloc.s
@@ -0,0 +1,19 @@
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | llvm-readobj -r | FileCheck %s
+
+// CHECK: Relocations [
+// CHECK-NEXT: ]
+
+ .section .test1_foo
+.Ltest1_1:
+.Ltest1_2 = .Ltest1_1
+ .section .test1_bar
+ .long .Ltest1_1-.Ltest1_2
+
+
+ .section test2
+
+.Ltest2_a:
+.Ltest2_b = .Ltest2_a
+.Ltest2_c:
+.Ltest2_d = .Ltest2_c-.Ltest2_b
+ .long .Ltest2_d
OpenPOWER on IntegriCloud