From: Rafael Espindola Date: Tue, 2 Nov 2010 21:38:23 +0000 (+0000) Subject: Do relaxations with FT_Org fragments. Fixes the FIXME: X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=187ce544b2c6fa5ee6545390f2d07bc471e4159b;p=oota-llvm.git Do relaxations with FT_Org fragments. Fixes the FIXME: // FIXME: We should compute this sooner, we don't want to recurse here, and // we would like to be more functional. In MCAssembler::ComputeFragmentSize. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118080 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/MC/MCAssembler.h b/include/llvm/MC/MCAssembler.h index 174a7552722..6a1f83e1597 100644 --- a/include/llvm/MC/MCAssembler.h +++ b/include/llvm/MC/MCAssembler.h @@ -319,10 +319,13 @@ class MCOrgFragment : public MCFragment { /// Value - Value to use for filling bytes. int8_t Value; + /// Size - The current estimate of the size. + unsigned Size; + public: MCOrgFragment(const MCExpr &_Offset, int8_t _Value, MCSectionData *SD = 0) : MCFragment(FT_Org, SD), - Offset(&_Offset), Value(_Value) {} + Offset(&_Offset), Value(_Value), Size(0) {} /// @name Accessors /// @{ @@ -331,6 +334,9 @@ public: uint8_t getValue() const { return Value; } + unsigned getSize() const { return Size; } + + void setSize(unsigned Size_) { Size = Size_; } /// @} static bool classof(const MCFragment *F) { @@ -715,6 +721,9 @@ private: bool RelaxInstruction(const MCObjectWriter &Writer, MCAsmLayout &Layout, MCInstFragment &IF); + bool RelaxOrg(const MCObjectWriter &Writer, MCAsmLayout &Layout, + MCOrgFragment &OF); + bool RelaxLEB(const MCObjectWriter &Writer, MCAsmLayout &Layout, MCLEBFragment &IF); diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 1b464ee98fd..6558a1b927b 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -337,23 +337,8 @@ uint64_t MCAssembler::ComputeFragmentSize(MCAsmLayout &Layout, return Size; } - case MCFragment::FT_Org: { - const MCOrgFragment &OF = cast(F); - - // FIXME: We should compute this sooner, we don't want to recurse here, and - // we would like to be more functional. - int64_t TargetLocation; - if (!OF.getOffset().EvaluateAsAbsolute(TargetLocation, &Layout)) - report_fatal_error("expected assembly-time absolute expression"); - - // FIXME: We need a way to communicate this error. - int64_t Offset = TargetLocation - FragmentOffset; - if (Offset < 0 || Offset >= 0x40000000) - report_fatal_error("invalid .org offset '" + Twine(TargetLocation) + - "' (at offset '" + Twine(FragmentOffset) + "')"); - - return Offset; - } + case MCFragment::FT_Org: + return cast(F).getSize(); case MCFragment::FT_Dwarf: { const MCDwarfLineAddrFragment &OF = cast(F); @@ -841,6 +826,25 @@ bool MCAssembler::RelaxInstruction(const MCObjectWriter &Writer, return true; } +bool MCAssembler::RelaxOrg(const MCObjectWriter &Writer, + MCAsmLayout &Layout, + MCOrgFragment &OF) { + int64_t TargetLocation; + if (!OF.getOffset().EvaluateAsAbsolute(TargetLocation, &Layout)) + report_fatal_error("expected assembly-time absolute expression"); + + // FIXME: We need a way to communicate this error. + uint64_t FragmentOffset = Layout.getFragmentOffset(&OF); + int64_t Offset = TargetLocation - FragmentOffset; + if (Offset < 0 || Offset >= 0x40000000) + report_fatal_error("invalid .org offset '" + Twine(TargetLocation) + + "' (at offset '" + Twine(FragmentOffset) + "')"); + + unsigned OldSize = OF.getSize(); + OF.setSize(Offset); + return OldSize != OF.getSize(); +} + bool MCAssembler::RelaxLEB(const MCObjectWriter &Writer, MCAsmLayout &Layout, MCLEBFragment &LF) { @@ -857,7 +861,6 @@ bool MCAssembler::RelaxLEB(const MCObjectWriter &Writer, return OldSize != LF.getSize(); } - bool MCAssembler::LayoutOnce(const MCObjectWriter &Writer, MCAsmLayout &Layout) { ++stats::RelaxationSteps; @@ -880,6 +883,9 @@ bool MCAssembler::LayoutOnce(const MCObjectWriter &Writer, WasRelaxed |= RelaxInstruction(Writer, Layout, *cast(it2)); break; + case MCFragment::FT_Org: + WasRelaxed |= RelaxOrg(Writer, Layout, *cast(it2)); + break; case MCFragment::FT_LEB: WasRelaxed |= RelaxLEB(Writer, Layout, *cast(it2)); break;