Add a helper to MCExpr for when an expression is know to be absolute.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@215713 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola
2014-08-15 14:20:32 +00:00
parent a348fc7fda
commit 216fdfe9ac
4 changed files with 30 additions and 22 deletions

View File

@ -50,6 +50,11 @@ private:
bool EvaluateAsAbsolute(int64_t &Res, const MCAssembler *Asm, bool EvaluateAsAbsolute(int64_t &Res, const MCAssembler *Asm,
const MCAsmLayout *Layout, const MCAsmLayout *Layout,
const SectionAddrMap *Addrs) const; const SectionAddrMap *Addrs) const;
bool evaluateAsAbsolute(int64_t &Res, const MCAssembler *Asm,
const MCAsmLayout *Layout,
const SectionAddrMap *Addrs, bool InSet) const;
protected: protected:
explicit MCExpr(ExprKind _Kind) : Kind(_Kind) {} explicit MCExpr(ExprKind _Kind) : Kind(_Kind) {}
@ -89,6 +94,8 @@ public:
bool EvaluateAsAbsolute(int64_t &Res, const MCAssembler &Asm) const; bool EvaluateAsAbsolute(int64_t &Res, const MCAssembler &Asm) const;
bool EvaluateAsAbsolute(int64_t &Res, const MCAsmLayout &Layout) const; bool EvaluateAsAbsolute(int64_t &Res, const MCAsmLayout &Layout) const;
int64_t evaluateKnownAbsolute(const MCAsmLayout &Layout) const;
/// EvaluateAsRelocatable - Try to evaluate the expression to a relocatable /// EvaluateAsRelocatable - Try to evaluate the expression to a relocatable
/// value, i.e. an expression of the fixed form (a - b + constant). /// value, i.e. an expression of the fixed form (a - b + constant).
/// ///

View File

@ -994,11 +994,8 @@ bool MCAssembler::relaxInstruction(MCAsmLayout &Layout,
} }
bool MCAssembler::relaxLEB(MCAsmLayout &Layout, MCLEBFragment &LF) { bool MCAssembler::relaxLEB(MCAsmLayout &Layout, MCLEBFragment &LF) {
int64_t Value = 0;
uint64_t OldSize = LF.getContents().size(); uint64_t OldSize = LF.getContents().size();
bool IsAbs = LF.getValue().EvaluateAsAbsolute(Value, Layout); int64_t Value = LF.getValue().evaluateKnownAbsolute(Layout);
(void)IsAbs;
assert(IsAbs);
SmallString<8> &Data = LF.getContents(); SmallString<8> &Data = LF.getContents();
Data.clear(); Data.clear();
raw_svector_ostream OSE(Data); raw_svector_ostream OSE(Data);
@ -1013,11 +1010,8 @@ bool MCAssembler::relaxLEB(MCAsmLayout &Layout, MCLEBFragment &LF) {
bool MCAssembler::relaxDwarfLineAddr(MCAsmLayout &Layout, bool MCAssembler::relaxDwarfLineAddr(MCAsmLayout &Layout,
MCDwarfLineAddrFragment &DF) { MCDwarfLineAddrFragment &DF) {
MCContext &Context = Layout.getAssembler().getContext(); MCContext &Context = Layout.getAssembler().getContext();
int64_t AddrDelta = 0;
uint64_t OldSize = DF.getContents().size(); uint64_t OldSize = DF.getContents().size();
bool IsAbs = DF.getAddrDelta().EvaluateAsAbsolute(AddrDelta, Layout); int64_t AddrDelta = DF.getAddrDelta().evaluateKnownAbsolute(Layout);
(void)IsAbs;
assert(IsAbs);
int64_t LineDelta; int64_t LineDelta;
LineDelta = DF.getLineDelta(); LineDelta = DF.getLineDelta();
SmallString<8> &Data = DF.getContents(); SmallString<8> &Data = DF.getContents();
@ -1031,11 +1025,8 @@ bool MCAssembler::relaxDwarfLineAddr(MCAsmLayout &Layout,
bool MCAssembler::relaxDwarfCallFrameFragment(MCAsmLayout &Layout, bool MCAssembler::relaxDwarfCallFrameFragment(MCAsmLayout &Layout,
MCDwarfCallFrameFragment &DF) { MCDwarfCallFrameFragment &DF) {
MCContext &Context = Layout.getAssembler().getContext(); MCContext &Context = Layout.getAssembler().getContext();
int64_t AddrDelta = 0;
uint64_t OldSize = DF.getContents().size(); uint64_t OldSize = DF.getContents().size();
bool IsAbs = DF.getAddrDelta().EvaluateAsAbsolute(AddrDelta, Layout); int64_t AddrDelta = DF.getAddrDelta().evaluateKnownAbsolute(Layout);
(void)IsAbs;
assert(IsAbs);
SmallString<8> &Data = DF.getContents(); SmallString<8> &Data = DF.getContents();
Data.clear(); Data.clear();
raw_svector_ostream OSE(Data); raw_svector_ostream OSE(Data);

View File

@ -467,9 +467,27 @@ bool MCExpr::EvaluateAsAbsolute(int64_t &Res, const MCAssembler &Asm) const {
return EvaluateAsAbsolute(Res, &Asm, nullptr, nullptr); return EvaluateAsAbsolute(Res, &Asm, nullptr, nullptr);
} }
int64_t MCExpr::evaluateKnownAbsolute(const MCAsmLayout &Layout) const {
int64_t Res;
bool Abs =
evaluateAsAbsolute(Res, &Layout.getAssembler(), &Layout, nullptr, true);
(void)Abs;
assert(Abs && "Not actually absolute");
return Res;
}
bool MCExpr::EvaluateAsAbsolute(int64_t &Res, const MCAssembler *Asm, bool MCExpr::EvaluateAsAbsolute(int64_t &Res, const MCAssembler *Asm,
const MCAsmLayout *Layout, const MCAsmLayout *Layout,
const SectionAddrMap *Addrs) const { const SectionAddrMap *Addrs) const {
// FIXME: The use if InSet = Addrs is a hack. Setting InSet causes us
// absolutize differences across sections and that is what the MachO writer
// uses Addrs for.
return evaluateAsAbsolute(Res, Asm, Layout, Addrs, Addrs);
}
bool MCExpr::evaluateAsAbsolute(int64_t &Res, const MCAssembler *Asm,
const MCAsmLayout *Layout,
const SectionAddrMap *Addrs, bool InSet) const {
MCValue Value; MCValue Value;
// Fast path constants. // Fast path constants.
@ -478,12 +496,8 @@ bool MCExpr::EvaluateAsAbsolute(int64_t &Res, const MCAssembler *Asm,
return true; return true;
} }
// FIXME: The use if InSet = Addrs is a hack. Setting InSet causes us bool IsRelocatable = EvaluateAsRelocatableImpl(
// absolutize differences across sections and that is what the MachO writer Value, Asm, Layout, nullptr, Addrs, InSet, /*ForceVarExpansion*/ false);
// uses Addrs for.
bool IsRelocatable =
EvaluateAsRelocatableImpl(Value, Asm, Layout, nullptr, Addrs,
/*InSet*/ Addrs, /*ForceVarExpansion*/ false);
// Record the current value. // Record the current value.
Res = Value.getConstant(); Res = Value.getConstant();

View File

@ -144,7 +144,6 @@ void MCObjectStreamer::EmitULEB128Value(const MCExpr *Value) {
EmitULEB128IntValue(IntValue); EmitULEB128IntValue(IntValue);
return; return;
} }
Value = ForceExpAbs(Value);
insert(new MCLEBFragment(*Value, false)); insert(new MCLEBFragment(*Value, false));
} }
@ -154,7 +153,6 @@ void MCObjectStreamer::EmitSLEB128Value(const MCExpr *Value) {
EmitSLEB128IntValue(IntValue); EmitSLEB128IntValue(IntValue);
return; return;
} }
Value = ForceExpAbs(Value);
insert(new MCLEBFragment(*Value, true)); insert(new MCLEBFragment(*Value, true));
} }
@ -280,7 +278,6 @@ void MCObjectStreamer::EmitDwarfAdvanceLineAddr(int64_t LineDelta,
MCDwarfLineAddr::Emit(this, LineDelta, Res); MCDwarfLineAddr::Emit(this, LineDelta, Res);
return; return;
} }
AddrDelta = ForceExpAbs(AddrDelta);
insert(new MCDwarfLineAddrFragment(LineDelta, *AddrDelta)); insert(new MCDwarfLineAddrFragment(LineDelta, *AddrDelta));
} }
@ -292,7 +289,6 @@ void MCObjectStreamer::EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel,
MCDwarfFrameEmitter::EmitAdvanceLoc(*this, Res); MCDwarfFrameEmitter::EmitAdvanceLoc(*this, Res);
return; return;
} }
AddrDelta = ForceExpAbs(AddrDelta);
insert(new MCDwarfCallFrameFragment(*AddrDelta)); insert(new MCDwarfCallFrameFragment(*AddrDelta));
} }