From 4551671908cad78c5900e46fa37a7549adf5cc8c Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 1 Jul 2014 14:34:30 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@212101 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCAssembler.cpp | 17 ++++++++++++++++- test/MC/ELF/no-reloc.s | 19 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 test/MC/ELF/no-reloc.s diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 4f876c8ce7d..64d6071f4e6 100644 --- a/lib/MC/MCAssembler.cpp +++ b/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/test/MC/ELF/no-reloc.s b/test/MC/ELF/no-reloc.s new file mode 100644 index 00000000000..78f1b88cebb --- /dev/null +++ b/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