[llvm-commits] [llvm] r120920 - in /llvm/trunk: include/llvm/MC/MCAssembler.h include/llvm/MC/MCDwarf.h lib/MC/MCAssembler.cpp lib/MC/MCDwarf.cpp
Rafael Espindola
rafael.espindola at gmail.com
Sat Dec 4 13:58:52 PST 2010
Author: rafael
Date: Sat Dec 4 15:58:52 2010
New Revision: 120920
URL: http://llvm.org/viewvc/llvm-project?rev=120920&view=rev
Log:
Remember the contents of leb and dwarfline fragments when relaxing. This avoids
having to evaluate the expression again when writing.
Modified:
llvm/trunk/include/llvm/MC/MCAssembler.h
llvm/trunk/include/llvm/MC/MCDwarf.h
llvm/trunk/lib/MC/MCAssembler.cpp
llvm/trunk/lib/MC/MCDwarf.cpp
Modified: llvm/trunk/include/llvm/MC/MCAssembler.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAssembler.h?rev=120920&r1=120919&r2=120920&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCAssembler.h (original)
+++ llvm/trunk/include/llvm/MC/MCAssembler.h Sat Dec 4 15:58:52 2010
@@ -352,13 +352,11 @@
/// 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 @@
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 @@
/// 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 @@
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; }
/// @}
Modified: llvm/trunk/include/llvm/MC/MCDwarf.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCDwarf.h?rev=120920&r1=120919&r2=120920&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCDwarf.h (original)
+++ llvm/trunk/include/llvm/MC/MCDwarf.h Sat Dec 4 15:58:52 2010
@@ -220,9 +220,6 @@
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);
Modified: llvm/trunk/lib/MC/MCAssembler.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAssembler.cpp?rev=120920&r1=120919&r2=120920&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCAssembler.cpp (original)
+++ llvm/trunk/lib/MC/MCAssembler.cpp Sat Dec 4 15:58:52 2010
@@ -348,7 +348,7 @@
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 @@
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 @@
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 @@
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::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,
Modified: llvm/trunk/lib/MC/MCDwarf.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCDwarf.cpp?rev=120920&r1=120919&r2=120920&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCDwarf.cpp (original)
+++ llvm/trunk/lib/MC/MCDwarf.cpp Sat Dec 4 15:58:52 2010
@@ -320,14 +320,6 @@
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) {
More information about the llvm-commits
mailing list