diff --git a/include/llvm/MC/MCAssembler.h b/include/llvm/MC/MCAssembler.h index 4f3223f5db3..0fb3a8ce2d0 100644 --- a/include/llvm/MC/MCAssembler.h +++ b/include/llvm/MC/MCAssembler.h @@ -352,13 +352,11 @@ class MCLEBFragment : public MCFragment { /// IsSigned - True if this is a sleb128, false if uleb128. bool IsSigned; - /// Size - The current size estimate. - uint64_t Size; - + SmallString<8> Contents; public: MCLEBFragment(const MCExpr &Value_, bool IsSigned_, MCSectionData *SD) : MCFragment(FT_LEB, SD), - Value(&Value_), IsSigned(IsSigned_), Size(1) {} + Value(&Value_), IsSigned(IsSigned_) { Contents.push_back(0); } /// @name Accessors /// @{ @@ -367,9 +365,8 @@ public: bool isSigned() const { return IsSigned; } - uint64_t getSize() const { return Size; } - - void setSize(uint64_t Size_) { Size = Size_; } + SmallString<8> &getContents() { return Contents; } + const SmallString<8> &getContents() const { return Contents; } /// @} @@ -388,14 +385,13 @@ class MCDwarfLineAddrFragment : public MCFragment { /// make up the address delta between two .loc dwarf directives. const MCExpr *AddrDelta; - /// Size - The current size estimate. - uint64_t Size; + SmallString<8> Contents; public: MCDwarfLineAddrFragment(int64_t _LineDelta, const MCExpr &_AddrDelta, MCSectionData *SD = 0) : MCFragment(FT_Dwarf, SD), - LineDelta(_LineDelta), AddrDelta(&_AddrDelta), Size(1) {} + LineDelta(_LineDelta), AddrDelta(&_AddrDelta) { Contents.push_back(0); } /// @name Accessors /// @{ @@ -404,9 +400,8 @@ public: const MCExpr &getAddrDelta() const { return *AddrDelta; } - uint64_t getSize() const { return Size; } - - void setSize(uint64_t Size_) { Size = Size_; } + SmallString<8> &getContents() { return Contents; } + const SmallString<8> &getContents() const { return Contents; } /// @} diff --git a/include/llvm/MC/MCDwarf.h b/include/llvm/MC/MCDwarf.h index e9fc0cf8769..46177be2303 100644 --- a/include/llvm/MC/MCDwarf.h +++ b/include/llvm/MC/MCDwarf.h @@ -220,9 +220,6 @@ namespace llvm { static void Emit(MCStreamer *MCOS, int64_t LineDelta,uint64_t AddrDelta); - /// Utility function to compute the size of the encoding. - static uint64_t ComputeSize(int64_t LineDelta, uint64_t AddrDelta); - /// Utility function to write the encoding to an object writer. static void Write(MCObjectWriter *OW, int64_t LineDelta, uint64_t AddrDelta); diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 86bdca1c21f..451ad1f4e84 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -348,7 +348,7 @@ uint64_t MCAssembler::ComputeFragmentSize(const MCFragment &F, return cast(F).getInstSize(); case MCFragment::FT_LEB: - return cast(F).getSize(); + return cast(F).getContents().size(); case MCFragment::FT_Align: { const MCAlignFragment &AF = cast(F); @@ -370,7 +370,7 @@ uint64_t MCAssembler::ComputeFragmentSize(const MCFragment &F, return cast(F).getSize(); case MCFragment::FT_Dwarf: - return cast(F).getSize(); + return cast(F).getContents().size(); } assert(0 && "invalid fragment kind"); @@ -522,20 +522,7 @@ static void WriteFragmentData(const MCAssembler &Asm, const MCAsmLayout &Layout, case MCFragment::FT_LEB: { MCLEBFragment &LF = cast(F); - - // FIXME: It is probably better if we don't call EvaluateAsAbsolute in - // here. - int64_t Value; - bool IsAbs = LF.getValue().EvaluateAsAbsolute(Value, &Layout); - assert(IsAbs); - (void) IsAbs; - SmallString<32> Tmp; - raw_svector_ostream OSE(Tmp); - if (LF.isSigned()) - MCObjectWriter::EncodeSLEB128(Value, OSE); - else - MCObjectWriter::EncodeULEB128(Value, OSE); - OW->WriteBytes(OSE.str()); + OW->WriteBytes(LF.getContents().str()); break; } @@ -550,15 +537,7 @@ static void WriteFragmentData(const MCAssembler &Asm, const MCAsmLayout &Layout, case MCFragment::FT_Dwarf: { const MCDwarfLineAddrFragment &OF = cast(F); - - // The AddrDelta is really unsigned and it can only increase. - int64_t AddrDelta; - OF.getAddrDelta().EvaluateAsAbsolute(AddrDelta, &Layout); - - int64_t LineDelta; - LineDelta = OF.getLineDelta(); - - MCDwarfLineAddr::Write(OW, LineDelta, (uint64_t)AddrDelta); + OW->WriteBytes(OF.getContents().str()); break; } } @@ -830,29 +809,34 @@ bool MCAssembler::RelaxOrg(const MCObjectWriter &Writer, bool MCAssembler::RelaxLEB(const MCObjectWriter &Writer, MCAsmLayout &Layout, MCLEBFragment &LF) { - int64_t Value; + int64_t Value = 0; + uint64_t OldSize = LF.getContents().size(); LF.getValue().EvaluateAsAbsolute(Value, &Layout); - SmallString<32> Tmp; - raw_svector_ostream OSE(Tmp); + SmallString<8> &Data = LF.getContents(); + Data.clear(); + raw_svector_ostream OSE(Data); if (LF.isSigned()) MCObjectWriter::EncodeSLEB128(Value, OSE); else MCObjectWriter::EncodeULEB128(Value, OSE); - uint64_t OldSize = LF.getSize(); - LF.setSize(OSE.GetNumBytesInBuffer()); - return OldSize != LF.getSize(); + OSE.flush(); + return OldSize != LF.getContents().size(); } bool MCAssembler::RelaxDwarfLineAddr(const MCObjectWriter &Writer, MCAsmLayout &Layout, MCDwarfLineAddrFragment &DF) { - int64_t AddrDelta; + int64_t AddrDelta = 0; + uint64_t OldSize = DF.getContents().size(); DF.getAddrDelta().EvaluateAsAbsolute(AddrDelta, &Layout); int64_t LineDelta; LineDelta = DF.getLineDelta(); - uint64_t OldSize = DF.getSize(); - DF.setSize(MCDwarfLineAddr::ComputeSize(LineDelta, AddrDelta)); - return OldSize != DF.getSize(); + SmallString<8> &Data = DF.getContents(); + Data.clear(); + raw_svector_ostream OSE(Data); + MCDwarfLineAddr::Encode(LineDelta, AddrDelta, OSE); + OSE.flush(); + return OldSize != Data.size(); } bool MCAssembler::LayoutOnce(const MCObjectWriter &Writer, diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp index 1b1d5097042..53731dca7eb 100644 --- a/lib/MC/MCDwarf.cpp +++ b/lib/MC/MCDwarf.cpp @@ -320,14 +320,6 @@ void MCDwarfFileTable::Emit(MCStreamer *MCOS, MCOS->EmitLabel(LineEndSym); } -/// Utility function to compute the size of the encoding. -uint64_t MCDwarfLineAddr::ComputeSize(int64_t LineDelta, uint64_t AddrDelta) { - SmallString<256> Tmp; - raw_svector_ostream OS(Tmp); - MCDwarfLineAddr::Encode(LineDelta, AddrDelta, OS); - return OS.GetNumBytesInBuffer(); -} - /// Utility function to write the encoding to an object writer. void MCDwarfLineAddr::Write(MCObjectWriter *OW, int64_t LineDelta, uint64_t AddrDelta) {