Skip to content

Commit

Permalink
Try harder to evaluate expressions when printing assembly.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
espindola committed Mar 12, 2014
1 parent a3802ac commit 3b8cc22
Show file tree
Hide file tree
Showing 9 changed files with 23 additions and 20 deletions.
2 changes: 1 addition & 1 deletion include/llvm/MC/MCExpr.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ class MCExpr {
/// @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
Expand Down
4 changes: 2 additions & 2 deletions lib/MC/MCAssembler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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() + "'");

Expand Down Expand Up @@ -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(
Expand Down
6 changes: 3 additions & 3 deletions lib/MC/MCExpr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
4 changes: 2 additions & 2 deletions lib/MC/MachObjectWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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() + "'");

Expand Down Expand Up @@ -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<MCSymbol*>(&SD.getSymbol())->setAbsolute();
}
Expand Down
2 changes: 1 addition & 1 deletion lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
4 changes: 1 addition & 3 deletions lib/Target/Mips/MCTargetDesc/MipsMCExpr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 4 additions & 1 deletion lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()) {
Expand Down Expand Up @@ -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();
Expand Down
4 changes: 1 addition & 3 deletions lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
12 changes: 8 additions & 4 deletions test/MC/PowerPC/ppc64-fixups.s
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

0 comments on commit 3b8cc22

Please sign in to comment.