From 3b8cc2299ba497e7c774622f6770403a0e970494 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 12 Mar 2014 16:55:59 +0000 Subject: [PATCH] Try harder to evaluate expressions when printing assembly. When printing assembly we don't have a Layout object, but we can still try to fold some constants. Testcase by Ulrich Weigand. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203677 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCExpr.h | 2 +- lib/MC/MCAssembler.cpp | 4 ++-- lib/MC/MCExpr.cpp | 6 +++--- lib/MC/MachObjectWriter.cpp | 4 ++-- lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.cpp | 2 +- lib/Target/Mips/MCTargetDesc/MipsMCExpr.cpp | 4 +--- lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp | 5 ++++- lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp | 4 +--- test/MC/PowerPC/ppc64-fixups.s | 12 ++++++++---- 9 files changed, 23 insertions(+), 20 deletions(-) diff --git a/include/llvm/MC/MCExpr.h b/include/llvm/MC/MCExpr.h index 133bd5280d7..a822513ffd8 100644 --- a/include/llvm/MC/MCExpr.h +++ b/include/llvm/MC/MCExpr.h @@ -91,7 +91,7 @@ public: /// @param Res - The relocatable value, if evaluation succeeds. /// @param Layout - The assembler layout object to use for evaluating values. /// @result - True on success. - bool EvaluateAsRelocatable(MCValue &Res, const MCAsmLayout &Layout) const; + bool EvaluateAsRelocatable(MCValue &Res, const MCAsmLayout *Layout) const; /// FindAssociatedSection - Find the "associated section" for this expression, /// which is currently defined as the absolute section for constants, or diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index b8a4b438f6c..89d7d190167 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -122,7 +122,7 @@ uint64_t MCAsmLayout::getSymbolOffset(const MCSymbolData *SD) const { // If this is a variable, then recursively evaluate now. if (S.isVariable()) { MCValue Target; - if (!S.getVariableValue()->EvaluateAsRelocatable(Target, *this)) + if (!S.getVariableValue()->EvaluateAsRelocatable(Target, this)) report_fatal_error("unable to evaluate offset for variable '" + S.getName() + "'"); @@ -357,7 +357,7 @@ bool MCAssembler::evaluateFixup(const MCAsmLayout &Layout, MCValue &Target, uint64_t &Value) const { ++stats::evaluateFixup; - if (!Fixup.getValue()->EvaluateAsRelocatable(Target, Layout)) + if (!Fixup.getValue()->EvaluateAsRelocatable(Target, &Layout)) getContext().FatalError(Fixup.getLoc(), "expected relocatable expression"); bool IsPCRel = Backend.getFixupKindInfo( diff --git a/lib/MC/MCExpr.cpp b/lib/MC/MCExpr.cpp index 75bde8ed36b..9a4c41699e1 100644 --- a/lib/MC/MCExpr.cpp +++ b/lib/MC/MCExpr.cpp @@ -607,9 +607,9 @@ static bool EvaluateSymbolicAdd(const MCAssembler *Asm, } bool MCExpr::EvaluateAsRelocatable(MCValue &Res, - const MCAsmLayout &Layout) const { - return EvaluateAsRelocatableImpl(Res, &Layout.getAssembler(), &Layout, - 0, false); + const MCAsmLayout *Layout) const { + MCAssembler *Assembler = Layout ? &Layout->getAssembler() : 0; + return EvaluateAsRelocatableImpl(Res, Assembler, Layout, 0, false); } bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res, diff --git a/lib/MC/MachObjectWriter.cpp b/lib/MC/MachObjectWriter.cpp index edbd2b98b28..b3b593d3154 100644 --- a/lib/MC/MachObjectWriter.cpp +++ b/lib/MC/MachObjectWriter.cpp @@ -82,7 +82,7 @@ uint64_t MachObjectWriter::getSymbolAddress(const MCSymbolData* SD, MCValue Target; - if (!S.getVariableValue()->EvaluateAsRelocatable(Target, Layout)) + if (!S.getVariableValue()->EvaluateAsRelocatable(Target, &Layout)) report_fatal_error("unable to evaluate offset for variable '" + S.getName() + "'"); @@ -631,7 +631,7 @@ void MachObjectWriter::markAbsoluteVariableSymbols(MCAssembler &Asm, // and neither symbol is external, mark the variable as absolute. const MCExpr *Expr = SD.getSymbol().getVariableValue(); MCValue Value; - if (Expr->EvaluateAsRelocatable(Value, Layout)) { + if (Expr->EvaluateAsRelocatable(Value, &Layout)) { if (Value.getSymA() && Value.getSymB()) const_cast(&SD.getSymbol())->setAbsolute(); } diff --git a/lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.cpp b/lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.cpp index 66ce92d7b93..c7ccaee8653 100644 --- a/lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.cpp +++ b/lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.cpp @@ -79,7 +79,7 @@ void AArch64MCExpr::PrintImpl(raw_ostream &OS) const { bool AArch64MCExpr::EvaluateAsRelocatableImpl(MCValue &Res, const MCAsmLayout *Layout) const { - return getSubExpr()->EvaluateAsRelocatable(Res, *Layout); + return getSubExpr()->EvaluateAsRelocatable(Res, Layout); } static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) { diff --git a/lib/Target/Mips/MCTargetDesc/MipsMCExpr.cpp b/lib/Target/Mips/MCTargetDesc/MipsMCExpr.cpp index e470fea1653..22ce41100a0 100644 --- a/lib/Target/Mips/MCTargetDesc/MipsMCExpr.cpp +++ b/lib/Target/Mips/MCTargetDesc/MipsMCExpr.cpp @@ -36,9 +36,7 @@ void MipsMCExpr::PrintImpl(raw_ostream &OS) const { bool MipsMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, const MCAsmLayout *Layout) const { - if (!Layout) - return false; - return getSubExpr()->EvaluateAsRelocatable(Res, *Layout); + return getSubExpr()->EvaluateAsRelocatable(Res, Layout); } // FIXME: This basically copies MCObjectStreamer::AddValueSymbols. Perhaps diff --git a/lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp b/lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp index 562badfd59d..c181e03fe64 100644 --- a/lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp +++ b/lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp @@ -54,7 +54,7 @@ PPCMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, const MCAsmLayout *Layout) const { MCValue Value; - if (!Layout || !getSubExpr()->EvaluateAsRelocatable(Value, *Layout)) + if (!getSubExpr()->EvaluateAsRelocatable(Value, Layout)) return false; if (Value.isAbsolute()) { @@ -86,6 +86,9 @@ PPCMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, } Res = MCValue::get(Result); } else { + if (!Layout) + return false; + MCContext &Context = Layout->getAssembler().getContext(); const MCSymbolRefExpr *Sym = Value.getSymA(); MCSymbolRefExpr::VariantKind Modifier = Sym->getKind(); diff --git a/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp b/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp index 7f2b25e4081..e6b2acab9d0 100644 --- a/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp +++ b/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp @@ -160,9 +160,7 @@ Sparc::Fixups SparcMCExpr::getFixupKind(SparcMCExpr::VariantKind Kind) { bool SparcMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, const MCAsmLayout *Layout) const { - if (!Layout) - return false; - return getSubExpr()->EvaluateAsRelocatable(Res, *Layout); + return getSubExpr()->EvaluateAsRelocatable(Res, Layout); } static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) { diff --git a/test/MC/PowerPC/ppc64-fixups.s b/test/MC/PowerPC/ppc64-fixups.s index a0750664c2c..733e3b9be7b 100644 --- a/test/MC/PowerPC/ppc64-fixups.s +++ b/test/MC/PowerPC/ppc64-fixups.s @@ -423,6 +423,14 @@ base: # CHECK-REL: 0x{{[0-9A-F]*[048C]}} R_PPC64_TLS target 0x0 add 3, 4, target@tls +# Verify that fixups on constants are resolved at assemble time + +# CHECK: ori 1, 2, 65535 # encoding: [0x60,0x41,0xff,0xff] + ori 1, 2, 131071@l +# CHECK: ori 1, 2, 1 # encoding: [0x60,0x41,0x00,0x01] + ori 1, 2, 131071@h +# CHECK: ori 1, 2, 2 # encoding: [0x60,0x41,0x00,0x02] + ori 1, 2, 131071@ha # Data relocs # llvm-mc does not show any "encoding" string for data, so we just check the relocs @@ -442,7 +450,3 @@ base: # CHECK-REL: 0x{{[0-9A-F]*[08]}} R_PPC64_DTPREL64 target 0x0 .quad target@dtprel -# Constant fixup - ori 1, 2, 131071@l -# CHECK: ori 1, 2, 131071@l # encoding: [0x60,0x41,A,A] -# CHECK-NEXT: # fixup A - offset: 2, value: 131071@l, kind: fixup_ppc_half16 -- 2.34.1