Skip to content

Commit

Permalink
If available, pass down the Fixup object to EvaluateAsRelocatable.
Browse files Browse the repository at this point in the history
At least on PowerPC, the interpretation of certain modifiers depends on
the context they appear in.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@215310 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
jsonn committed Aug 10, 2014
1 parent f96cd1a commit b2b3634
Show file tree
Hide file tree
Showing 16 changed files with 70 additions and 49 deletions.
12 changes: 9 additions & 3 deletions include/llvm/MC/MCExpr.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class MCAsmInfo;
class MCAsmLayout;
class MCAssembler;
class MCContext;
class MCFixup;
class MCSection;
class MCSectionData;
class MCStreamer;
Expand Down Expand Up @@ -54,6 +55,7 @@ class MCExpr {

bool EvaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm,
const MCAsmLayout *Layout,
const MCFixup *Fixup,
const SectionAddrMap *Addrs, bool InSet,
bool ForceVarExpansion) const;

Expand Down Expand Up @@ -92,16 +94,19 @@ class MCExpr {
///
/// @param Res - The relocatable value, if evaluation succeeds.
/// @param Layout - The assembler layout object to use for evaluating values.
/// @param Fixup - The Fixup object if available.
/// @result - True on success.
bool EvaluateAsRelocatable(MCValue &Res, const MCAsmLayout *Layout) const;
bool EvaluateAsRelocatable(MCValue &Res, const MCAsmLayout *Layout,
const MCFixup *Fixup) const;

/// \brief Try to evaluate the expression to the form (a - b + constant) where
/// neither a nor b are variables.
///
/// This is a more aggressive variant of EvaluateAsRelocatable. The intended
/// use is for when relocations are not available, like the symbol value in
/// the symbol table.
bool EvaluateAsValue(MCValue &Res, const MCAsmLayout *Layout) const;
bool EvaluateAsValue(MCValue &Res, const MCAsmLayout *Layout,
const MCFixup *Fixup) const;

/// FindAssociatedSection - Find the "associated section" for this expression,
/// which is currently defined as the absolute section for constants, or
Expand Down Expand Up @@ -524,7 +529,8 @@ class MCTargetExpr : public MCExpr {

virtual void PrintImpl(raw_ostream &OS) const = 0;
virtual bool EvaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout) const = 0;
const MCAsmLayout *Layout,
const MCFixup *Fixup) const = 0;
virtual void visitUsedExpr(MCStreamer& Streamer) const = 0;
virtual const MCSection *FindAssociatedSection() const = 0;

Expand Down
13 changes: 7 additions & 6 deletions lib/MC/MCAssembler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ static bool getSymbolOffsetImpl(const MCAsmLayout &Layout,

// If SD is a variable, evaluate it.
MCValue Target;
if (!S.getVariableValue()->EvaluateAsValue(Target, &Layout))
if (!S.getVariableValue()->EvaluateAsValue(Target, &Layout, nullptr))
report_fatal_error("unable to evaluate offset for variable '" +
S.getName() + "'");

Expand Down Expand Up @@ -187,7 +187,7 @@ const MCSymbol *MCAsmLayout::getBaseSymbol(const MCSymbol &Symbol) const {

const MCExpr *Expr = Symbol.getVariableValue();
MCValue Value;
if (!Expr->EvaluateAsValue(Value, this))
if (!Expr->EvaluateAsValue(Value, this, nullptr))
llvm_unreachable("Invalid Expression");

const MCSymbolRefExpr *RefB = Value.getSymB();
Expand Down Expand Up @@ -438,11 +438,12 @@ const MCSymbolData *MCAssembler::getAtom(const MCSymbolData *SD) const {
// 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))
const MCFixup &Fixup, MCValue &Target) {
if (Expr.EvaluateAsValue(Target, &Layout, &Fixup)) {
if (Target.isAbsolute())
return true;
return Expr.EvaluateAsRelocatable(Target, &Layout);
}
return Expr.EvaluateAsRelocatable(Target, &Layout, &Fixup);
}

bool MCAssembler::evaluateFixup(const MCAsmLayout &Layout,
Expand All @@ -454,7 +455,7 @@ bool MCAssembler::evaluateFixup(const MCAsmLayout &Layout,
// 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))
if (!evaluate(*Expr, Layout, Fixup, Target))
getContext().FatalError(Fixup.getLoc(), "expected relocatable expression");

bool IsPCRel = Backend.getFixupKindInfo(
Expand Down
39 changes: 23 additions & 16 deletions lib/MC/MCExpr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -482,8 +482,8 @@ bool MCExpr::EvaluateAsAbsolute(int64_t &Res, const MCAssembler *Asm,
// absolutize differences across sections and that is what the MachO writer
// uses Addrs for.
bool IsRelocatable =
EvaluateAsRelocatableImpl(Value, Asm, Layout, Addrs, /*InSet*/ Addrs,
/*ForceVarExpansion*/ false);
EvaluateAsRelocatableImpl(Value, Asm, Layout, nullptr, Addrs,
/*InSet*/ Addrs, /*ForceVarExpansion*/ false);

// Record the current value.
Res = Value.getConstant();
Expand Down Expand Up @@ -632,27 +632,31 @@ static bool EvaluateSymbolicAdd(const MCAssembler *Asm,
}

bool MCExpr::EvaluateAsRelocatable(MCValue &Res,
const MCAsmLayout *Layout) const {
const MCAsmLayout *Layout,
const MCFixup *Fixup) const {
MCAssembler *Assembler = Layout ? &Layout->getAssembler() : nullptr;
return EvaluateAsRelocatableImpl(Res, Assembler, Layout, nullptr, false,
/*ForceVarExpansion*/ false);
return EvaluateAsRelocatableImpl(Res, Assembler, Layout, Fixup, nullptr,
false, /*ForceVarExpansion*/ false);
}

bool MCExpr::EvaluateAsValue(MCValue &Res, const MCAsmLayout *Layout) const {
bool MCExpr::EvaluateAsValue(MCValue &Res, const MCAsmLayout *Layout,
const MCFixup *Fixup) const {
MCAssembler *Assembler = Layout ? &Layout->getAssembler() : nullptr;
return EvaluateAsRelocatableImpl(Res, Assembler, Layout, nullptr, false,
/*ForceVarExpansion*/ true);
return EvaluateAsRelocatableImpl(Res, Assembler, Layout, Fixup, nullptr,
false, /*ForceVarExpansion*/ true);
}

bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm,
const MCAsmLayout *Layout,
const MCFixup *Fixup,
const SectionAddrMap *Addrs, bool InSet,
bool ForceVarExpansion) const {
++stats::MCExprEvaluate;

switch (getKind()) {
case Target:
return cast<MCTargetExpr>(this)->EvaluateAsRelocatableImpl(Res, Layout);
return cast<MCTargetExpr>(this)->EvaluateAsRelocatableImpl(Res, Layout,
Fixup);

case Constant:
Res = MCValue::get(cast<MCConstantExpr>(this)->getValue());
Expand All @@ -666,7 +670,7 @@ bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm,
// Evaluate recursively if this is a variable.
if (Sym.isVariable() && SRE->getKind() == MCSymbolRefExpr::VK_None) {
if (Sym.getVariableValue()->EvaluateAsRelocatableImpl(
Res, Asm, Layout, Addrs, true, ForceVarExpansion)) {
Res, Asm, Layout, Fixup, Addrs, true, ForceVarExpansion)) {
const MCSymbolRefExpr *A = Res.getSymA();
const MCSymbolRefExpr *B = Res.getSymB();

Expand Down Expand Up @@ -697,8 +701,9 @@ bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm,
const MCUnaryExpr *AUE = cast<MCUnaryExpr>(this);
MCValue Value;

if (!AUE->getSubExpr()->EvaluateAsRelocatableImpl(Value, Asm, Layout, Addrs,
InSet, ForceVarExpansion))
if (!AUE->getSubExpr()->EvaluateAsRelocatableImpl(Value, Asm, Layout,
Fixup, Addrs, InSet,
ForceVarExpansion))
return false;

switch (AUE->getOpcode()) {
Expand Down Expand Up @@ -731,10 +736,12 @@ bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm,
const MCBinaryExpr *ABE = cast<MCBinaryExpr>(this);
MCValue LHSValue, RHSValue;

if (!ABE->getLHS()->EvaluateAsRelocatableImpl(LHSValue, Asm, Layout, Addrs,
InSet, ForceVarExpansion) ||
!ABE->getRHS()->EvaluateAsRelocatableImpl(RHSValue, Asm, Layout, Addrs,
InSet, ForceVarExpansion))
if (!ABE->getLHS()->EvaluateAsRelocatableImpl(LHSValue, Asm, Layout,
Fixup, Addrs, InSet,
ForceVarExpansion) ||
!ABE->getRHS()->EvaluateAsRelocatableImpl(RHSValue, Asm, Layout,
Fixup, Addrs, InSet,
ForceVarExpansion))
return false;

// We only support a few operations on non-constant expressions, handle
Expand Down
4 changes: 2 additions & 2 deletions lib/MC/MachObjectWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ uint64_t MachObjectWriter::getSymbolAddress(const MCSymbolData* SD,


MCValue Target;
if (!S.getVariableValue()->EvaluateAsRelocatable(Target, &Layout))
if (!S.getVariableValue()->EvaluateAsRelocatable(Target, &Layout, nullptr))
report_fatal_error("unable to evaluate offset for variable '" +
S.getName() + "'");

Expand Down Expand Up @@ -664,7 +664,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, nullptr)) {
if (Value.getSymA() && Value.getSymB())
const_cast<MCSymbol*>(&SD.getSymbol())->setAbsolute();
}
Expand Down
5 changes: 3 additions & 2 deletions lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,9 @@ const MCSection *AArch64MCExpr::FindAssociatedSection() const {
}

bool AArch64MCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout) const {
if (!getSubExpr()->EvaluateAsRelocatable(Res, Layout))
const MCAsmLayout *Layout,
const MCFixup *Fixup) const {
if (!getSubExpr()->EvaluateAsRelocatable(Res, Layout, Fixup))
return false;

Res =
Expand Down
3 changes: 2 additions & 1 deletion lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.h
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,8 @@ class AArch64MCExpr : public MCTargetExpr {
const MCSection *FindAssociatedSection() const override;

bool EvaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout) const override;
const MCAsmLayout *Layout,
const MCFixup *Fixup) const override;

void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override;

Expand Down
3 changes: 2 additions & 1 deletion lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,8 @@ void AArch64MachObjectWriter::RecordRelocation(
// FIXME: Will the Target we already have ever have any data in it
// we need to preserve and merge with the new Target? How about
// the FixedValue?
if (!Symbol->getVariableValue()->EvaluateAsRelocatable(Target, &Layout))
if (!Symbol->getVariableValue()->EvaluateAsRelocatable(Target, &Layout,
&Fixup))
Asm.getContext().FatalError(Fixup.getLoc(),
"unable to resolve variable '" +
Symbol->getName() + "'");
Expand Down
6 changes: 0 additions & 6 deletions lib/Target/ARM/MCTargetDesc/ARMMCExpr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,6 @@ void ARMMCExpr::PrintImpl(raw_ostream &OS) const {
OS << ')';
}

bool
ARMMCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout) const {
return false;
}

void ARMMCExpr::visitUsedExpr(MCStreamer &Streamer) const {
Streamer.visitUsedExpr(*getSubExpr());
}
7 changes: 5 additions & 2 deletions lib/Target/ARM/MCTargetDesc/ARMMCExpr.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,11 @@ class ARMMCExpr : public MCTargetExpr {

void PrintImpl(raw_ostream &OS) const override;
bool EvaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout) const override;
void visitUsedExpr(MCStreamer &Streamer) const override;
const MCAsmLayout *Layout,
const MCFixup *Fixup) const override {
return false;
}
void visitUsedExpr(MCStreamer &Streamer) const override;
const MCSection *FindAssociatedSection() const override {
return getSubExpr()->FindAssociatedSection();
}
Expand Down
5 changes: 3 additions & 2 deletions lib/Target/Mips/MCTargetDesc/MipsMCExpr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,9 @@ void MipsMCExpr::PrintImpl(raw_ostream &OS) const {

bool
MipsMCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout) const {
return getSubExpr()->EvaluateAsRelocatable(Res, Layout);
const MCAsmLayout *Layout,
const MCFixup *Fixup) const {
return getSubExpr()->EvaluateAsRelocatable(Res, Layout, Fixup);
}

void MipsMCExpr::visitUsedExpr(MCStreamer &Streamer) const {
Expand Down
3 changes: 2 additions & 1 deletion lib/Target/Mips/MCTargetDesc/MipsMCExpr.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ class MipsMCExpr : public MCTargetExpr {

void PrintImpl(raw_ostream &OS) const override;
bool EvaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout) const override;
const MCAsmLayout *Layout,
const MCFixup *Fixup) const override;
void visitUsedExpr(MCStreamer &Streamer) const override;
const MCSection *FindAssociatedSection() const override {
return getSubExpr()->FindAssociatedSection();
Expand Down
3 changes: 2 additions & 1 deletion lib/Target/NVPTX/NVPTXMCExpr.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@ class NVPTXFloatMCExpr : public MCTargetExpr {

void PrintImpl(raw_ostream &OS) const override;
bool EvaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout) const override {
const MCAsmLayout *Layout,
const MCFixup *Fixup) const override {
return false;
}
void visitUsedExpr(MCStreamer &Streamer) const override {};
Expand Down
5 changes: 3 additions & 2 deletions lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,11 @@ void PPCMCExpr::PrintImpl(raw_ostream &OS) const {

bool
PPCMCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout) const {
const MCAsmLayout *Layout,
const MCFixup *Fixup) const {
MCValue Value;

if (!getSubExpr()->EvaluateAsRelocatable(Value, Layout))
if (!getSubExpr()->EvaluateAsRelocatable(Value, Layout, Fixup))
return false;

if (Value.isAbsolute()) {
Expand Down
3 changes: 2 additions & 1 deletion lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,8 @@ class PPCMCExpr : public MCTargetExpr {

void PrintImpl(raw_ostream &OS) const override;
bool EvaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout) const override;
const MCAsmLayout *Layout,
const MCFixup *Fixup) const override;
void visitUsedExpr(MCStreamer &Streamer) const override;
const MCSection *FindAssociatedSection() const override {
return getSubExpr()->FindAssociatedSection();
Expand Down
5 changes: 3 additions & 2 deletions lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -161,8 +161,9 @@ Sparc::Fixups SparcMCExpr::getFixupKind(SparcMCExpr::VariantKind Kind) {

bool
SparcMCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout) const {
return getSubExpr()->EvaluateAsRelocatable(Res, Layout);
const MCAsmLayout *Layout,
const MCFixup *Fixup) const {
return getSubExpr()->EvaluateAsRelocatable(Res, Layout, Fixup);
}

static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) {
Expand Down
3 changes: 2 additions & 1 deletion lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@ class SparcMCExpr : public MCTargetExpr {
/// @}
void PrintImpl(raw_ostream &OS) const override;
bool EvaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout) const override;
const MCAsmLayout *Layout,
const MCFixup *Fixup) const override;
void visitUsedExpr(MCStreamer &Streamer) const override;
const MCSection *FindAssociatedSection() const override {
return getSubExpr()->FindAssociatedSection();
Expand Down

0 comments on commit b2b3634

Please sign in to comment.