diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2010-12-04 21:58:52 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2010-12-04 21:58:52 +0000 |
commit | db74aeadcd1b9a597ad0f80c0036e67e63ba20ed (patch) | |
tree | 5d8d474b0f62dd1d6f8c24561f51a054b7c13101 /lib/MC/MCAssembler.cpp | |
parent | 2a7942926b753d185cb23ee29a91f2863eda4778 (diff) |
Remember the contents of leb and dwarfline fragments when relaxing. This avoids
having to evaluate the expression again when writing.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120920 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/MCAssembler.cpp')
-rw-r--r-- | lib/MC/MCAssembler.cpp | 54 |
1 files changed, 19 insertions, 35 deletions
diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 86bdca1c21..451ad1f4e8 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -348,7 +348,7 @@ uint64_t MCAssembler::ComputeFragmentSize(const MCFragment &F, return cast<MCInstFragment>(F).getInstSize(); case MCFragment::FT_LEB: - return cast<MCLEBFragment>(F).getSize(); + return cast<MCLEBFragment>(F).getContents().size(); case MCFragment::FT_Align: { const MCAlignFragment &AF = cast<MCAlignFragment>(F); @@ -370,7 +370,7 @@ uint64_t MCAssembler::ComputeFragmentSize(const MCFragment &F, return cast<MCOrgFragment>(F).getSize(); case MCFragment::FT_Dwarf: - return cast<MCDwarfLineAddrFragment>(F).getSize(); + return cast<MCDwarfLineAddrFragment>(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<MCLEBFragment>(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<MCDwarfLineAddrFragment>(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, |