X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FMC%2FMCExpr.cpp;h=992f0a756ca81485706c6f2adfba1d95fab5c800;hb=2b861c3a24fa299d6b8a2d5097114c1000354bee;hp=2d86ae7d4931acfdce2d61ce70adf06a074d1bda;hpb=b2b363408b8cec828681a1264f4438b41b834042;p=oota-llvm.git diff --git a/lib/MC/MCExpr.cpp b/lib/MC/MCExpr.cpp index 2d86ae7d493..992f0a756ca 100644 --- a/lib/MC/MCExpr.cpp +++ b/lib/MC/MCExpr.cpp @@ -467,9 +467,27 @@ bool MCExpr::EvaluateAsAbsolute(int64_t &Res, const MCAssembler &Asm) const { 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, const MCAsmLayout *Layout, 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; // Fast path constants. @@ -478,12 +496,8 @@ bool MCExpr::EvaluateAsAbsolute(int64_t &Res, const MCAssembler *Asm, return true; } - // 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. - bool IsRelocatable = - EvaluateAsRelocatableImpl(Value, Asm, Layout, nullptr, Addrs, - /*InSet*/ Addrs, /*ForceVarExpansion*/ false); + bool IsRelocatable = EvaluateAsRelocatableImpl( + Value, Asm, Layout, nullptr, Addrs, InSet, /*ForceVarExpansion*/ false); // Record the current value. Res = Value.getConstant(); @@ -633,7 +647,7 @@ static bool EvaluateSymbolicAdd(const MCAssembler *Asm, bool MCExpr::EvaluateAsRelocatable(MCValue &Res, const MCAsmLayout *Layout, - const MCFixup *Fixup) const { + const MCFixup *Fixup) const { MCAssembler *Assembler = Layout ? &Layout->getAssembler() : nullptr; return EvaluateAsRelocatableImpl(Res, Assembler, Layout, Fixup, nullptr, false, /*ForceVarExpansion*/ false); @@ -703,7 +717,7 @@ bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm, if (!AUE->getSubExpr()->EvaluateAsRelocatableImpl(Value, Asm, Layout, Fixup, Addrs, InSet, - ForceVarExpansion)) + ForceVarExpansion)) return false; switch (AUE->getOpcode()) { @@ -738,10 +752,10 @@ bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm, if (!ABE->getLHS()->EvaluateAsRelocatableImpl(LHSValue, Asm, Layout, Fixup, Addrs, InSet, - ForceVarExpansion) || + ForceVarExpansion) || !ABE->getRHS()->EvaluateAsRelocatableImpl(RHSValue, Asm, Layout, Fixup, Addrs, InSet, - ForceVarExpansion)) + ForceVarExpansion)) return false; // We only support a few operations on non-constant expressions, handle