mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00: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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@212101 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e9a4e0681e
commit
4551671908
@ -434,12 +434,27 @@ const MCSymbolData *MCAssembler::getAtom(const MCSymbolData *SD) const {
|
|||||||
return SD->getFragment()->getAtom();
|
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,
|
bool MCAssembler::evaluateFixup(const MCAsmLayout &Layout,
|
||||||
const MCFixup &Fixup, const MCFragment *DF,
|
const MCFixup &Fixup, const MCFragment *DF,
|
||||||
MCValue &Target, uint64_t &Value) const {
|
MCValue &Target, uint64_t &Value) const {
|
||||||
++stats::evaluateFixup;
|
++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");
|
getContext().FatalError(Fixup.getLoc(), "expected relocatable expression");
|
||||||
|
|
||||||
bool IsPCRel = Backend.getFixupKindInfo(
|
bool IsPCRel = Backend.getFixupKindInfo(
|
||||||
|
19
test/MC/ELF/no-reloc.s
Normal file
19
test/MC/ELF/no-reloc.s
Normal 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
|
Loading…
Reference in New Issue
Block a user