1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

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
This commit is contained in:
Rafael Espindola 2014-07-01 14:34:30 +00:00
parent f8c6acefcd
commit 0ef4dc0ae7
2 changed files with 35 additions and 1 deletions

View File

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

19
test/MC/ELF/no-reloc.s Normal file
View File

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