[llvm] 4948849 - [MC] MCDwarfLineAddr::Encode: use SmallVectorImpl instead of raw_ostream. NFC
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sun May 7 16:26:57 PDT 2023
Author: Fangrui Song
Date: 2023-05-07T16:26:52-07:00
New Revision: 49488490d195591bfc90daef111cd7293f8c80aa
URL: https://github.com/llvm/llvm-project/commit/49488490d195591bfc90daef111cd7293f8c80aa
DIFF: https://github.com/llvm/llvm-project/commit/49488490d195591bfc90daef111cd7293f8c80aa.diff
LOG: [MC] MCDwarfLineAddr::Encode: use SmallVectorImpl instead of raw_ostream. NFC
Similar to D145791: most call sites need a SmallString, but have to provide a
raw_svector_ostream wrapper with unneeded abstraction and overhead:
raw_ostream::write =(inlinable)=> flush_tied_then_write (unneeded TiedStream check) =(virtual function call)=> raw_svector_ostream::write_impl ==> SmallVector append(ItTy in_start, ItTy in_end) (range; less efficient then push_back).
Just use SmallVectorImpl to simplify and optimize code. Unfortunately most call
sites use SmallString, so we have to use SmallVectorImpl<char> instead of
<uint8_t> to avoid large refactoring.
Added:
Modified:
llvm/include/llvm/MC/MCDwarf.h
llvm/lib/DWARFLinker/DWARFStreamer.cpp
llvm/lib/MC/MCAssembler.cpp
llvm/lib/MC/MCDwarf.cpp
llvm/unittests/MC/DwarfLineTables.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/MC/MCDwarf.h b/llvm/include/llvm/MC/MCDwarf.h
index ce9c154d34547..776937c2faa95 100644
--- a/llvm/include/llvm/MC/MCDwarf.h
+++ b/llvm/include/llvm/MC/MCDwarf.h
@@ -429,8 +429,8 @@ class MCDwarfLineTable {
class MCDwarfLineAddr {
public:
/// Utility function to encode a Dwarf pair of LineDelta and AddrDeltas.
- static void Encode(MCContext &Context, MCDwarfLineTableParams Params,
- int64_t LineDelta, uint64_t AddrDelta, raw_ostream &OS);
+ static void encode(MCContext &Context, MCDwarfLineTableParams Params,
+ int64_t LineDelta, uint64_t AddrDelta, SmallVectorImpl<char> &OS);
/// Utility function to emit the encoding to a streamer.
static void Emit(MCStreamer *MCOS, MCDwarfLineTableParams Params,
diff --git a/llvm/lib/DWARFLinker/DWARFStreamer.cpp b/llvm/lib/DWARFLinker/DWARFStreamer.cpp
index 1593ea65065d5..ebd54f7923100 100644
--- a/llvm/lib/DWARFLinker/DWARFStreamer.cpp
+++ b/llvm/lib/DWARFLinker/DWARFStreamer.cpp
@@ -655,9 +655,9 @@ void DwarfStreamer::emitLineTableForUnit(MCDwarfLineTableParams Params,
if (Rows.empty()) {
// We only have the dummy entry, dsymutil emits an entry with a 0
// address in that case.
- MCDwarfLineAddr::Encode(*MC, Params, std::numeric_limits<int64_t>::max(), 0,
- EncodingOS);
- MS->emitBytes(EncodingOS.str());
+ MCDwarfLineAddr::encode(*MC, Params, std::numeric_limits<int64_t>::max(), 0,
+ EncodingBuffer);
+ MS->emitBytes(EncodingBuffer);
LineSectionSize += EncodingBuffer.size();
MS->emitLabel(LineEndSym);
return;
@@ -735,8 +735,8 @@ void DwarfStreamer::emitLineTableForUnit(MCDwarfLineTableParams Params,
int64_t LineDelta = int64_t(Row.Line) - LastLine;
if (!Row.EndSequence) {
- MCDwarfLineAddr::Encode(*MC, Params, LineDelta, AddressDelta, EncodingOS);
- MS->emitBytes(EncodingOS.str());
+ MCDwarfLineAddr::encode(*MC, Params, LineDelta, AddressDelta, EncodingBuffer);
+ MS->emitBytes(EncodingBuffer);
LineSectionSize += EncodingBuffer.size();
EncodingBuffer.resize(0);
Address = Row.Address.Address;
@@ -753,9 +753,9 @@ void DwarfStreamer::emitLineTableForUnit(MCDwarfLineTableParams Params,
MS->emitULEB128IntValue(AddressDelta);
LineSectionSize += 1 + getULEB128Size(AddressDelta);
}
- MCDwarfLineAddr::Encode(*MC, Params, std::numeric_limits<int64_t>::max(),
- 0, EncodingOS);
- MS->emitBytes(EncodingOS.str());
+ MCDwarfLineAddr::encode(*MC, Params, std::numeric_limits<int64_t>::max(),
+ 0, EncodingBuffer);
+ MS->emitBytes(EncodingBuffer);
LineSectionSize += EncodingBuffer.size();
EncodingBuffer.resize(0);
Address = -1ULL;
@@ -765,9 +765,9 @@ void DwarfStreamer::emitLineTableForUnit(MCDwarfLineTableParams Params,
}
if (RowsSinceLastSequence) {
- MCDwarfLineAddr::Encode(*MC, Params, std::numeric_limits<int64_t>::max(), 0,
- EncodingOS);
- MS->emitBytes(EncodingOS.str());
+ MCDwarfLineAddr::encode(*MC, Params, std::numeric_limits<int64_t>::max(), 0,
+ EncodingBuffer);
+ MS->emitBytes(EncodingBuffer);
LineSectionSize += EncodingBuffer.size();
EncodingBuffer.resize(0);
}
diff --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp
index 8d87bcb5dc202..2f6fdb7fabd0f 100644
--- a/llvm/lib/MC/MCAssembler.cpp
+++ b/llvm/lib/MC/MCAssembler.cpp
@@ -1096,11 +1096,10 @@ bool MCAssembler::relaxDwarfLineAddr(MCAsmLayout &Layout,
LineDelta = DF.getLineDelta();
SmallVectorImpl<char> &Data = DF.getContents();
Data.clear();
- raw_svector_ostream OSE(Data);
DF.getFixups().clear();
- MCDwarfLineAddr::Encode(Context, getDWARFLinetableParams(), LineDelta,
- AddrDelta, OSE);
+ MCDwarfLineAddr::encode(Context, getDWARFLinetableParams(), LineDelta,
+ AddrDelta, Data);
return OldSize != Data.size();
}
diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp
index 66984ce08ad52..3ee36034b49d3 100644
--- a/llvm/lib/MC/MCDwarf.cpp
+++ b/llvm/lib/MC/MCDwarf.cpp
@@ -667,9 +667,8 @@ void MCDwarfLineAddr::Emit(MCStreamer *MCOS, MCDwarfLineTableParams Params,
int64_t LineDelta, uint64_t AddrDelta) {
MCContext &Context = MCOS->getContext();
SmallString<256> Tmp;
- raw_svector_ostream OS(Tmp);
- MCDwarfLineAddr::Encode(Context, Params, LineDelta, AddrDelta, OS);
- MCOS->emitBytes(OS.str());
+ MCDwarfLineAddr::encode(Context, Params, LineDelta, AddrDelta, Tmp);
+ MCOS->emitBytes(Tmp);
}
/// Given a special op, return the address skip amount (in units of
@@ -679,9 +678,10 @@ static uint64_t SpecialAddr(MCDwarfLineTableParams Params, uint64_t op) {
}
/// Utility function to encode a Dwarf pair of LineDelta and AddrDeltas.
-void MCDwarfLineAddr::Encode(MCContext &Context, MCDwarfLineTableParams Params,
+void MCDwarfLineAddr::encode(MCContext &Context, MCDwarfLineTableParams Params,
int64_t LineDelta, uint64_t AddrDelta,
- raw_ostream &OS) {
+ SmallVectorImpl<char> &Out) {
+ uint8_t Buf[16];
uint64_t Temp, Opcode;
bool NeedCopy = false;
@@ -696,14 +696,14 @@ void MCDwarfLineAddr::Encode(MCContext &Context, MCDwarfLineTableParams Params,
// end_sequence to emit the matrix entry.
if (LineDelta == INT64_MAX) {
if (AddrDelta == MaxSpecialAddrDelta)
- OS << char(dwarf::DW_LNS_const_add_pc);
+ Out.push_back(dwarf::DW_LNS_const_add_pc);
else if (AddrDelta) {
- OS << char(dwarf::DW_LNS_advance_pc);
- encodeULEB128(AddrDelta, OS);
+ Out.push_back(dwarf::DW_LNS_advance_pc);
+ Out.append(Buf, Buf + encodeULEB128(AddrDelta, Buf));
}
- OS << char(dwarf::DW_LNS_extended_op);
- OS << char(1);
- OS << char(dwarf::DW_LNE_end_sequence);
+ Out.push_back(dwarf::DW_LNS_extended_op);
+ Out.push_back(1);
+ Out.push_back(dwarf::DW_LNE_end_sequence);
return;
}
@@ -714,8 +714,8 @@ void MCDwarfLineAddr::Encode(MCContext &Context, MCDwarfLineTableParams Params,
// it with DW_LNS_advance_line.
if (Temp >= Params.DWARF2LineRange ||
Temp + Params.DWARF2LineOpcodeBase > 255) {
- OS << char(dwarf::DW_LNS_advance_line);
- encodeSLEB128(LineDelta, OS);
+ Out.push_back(dwarf::DW_LNS_advance_line);
+ Out.append(Buf, Buf + encodeSLEB128(LineDelta, Buf));
LineDelta = 0;
Temp = 0 - Params.DWARF2LineBase;
@@ -724,7 +724,7 @@ void MCDwarfLineAddr::Encode(MCContext &Context, MCDwarfLineTableParams Params,
// Use DW_LNS_copy instead of a "line +0, addr +0" special opcode.
if (LineDelta == 0 && AddrDelta == 0) {
- OS << char(dwarf::DW_LNS_copy);
+ Out.push_back(dwarf::DW_LNS_copy);
return;
}
@@ -736,28 +736,28 @@ void MCDwarfLineAddr::Encode(MCContext &Context, MCDwarfLineTableParams Params,
// Try using a special opcode.
Opcode = Temp + AddrDelta * Params.DWARF2LineRange;
if (Opcode <= 255) {
- OS << char(Opcode);
+ Out.push_back(Opcode);
return;
}
// Try using DW_LNS_const_add_pc followed by special op.
Opcode = Temp + (AddrDelta - MaxSpecialAddrDelta) * Params.DWARF2LineRange;
if (Opcode <= 255) {
- OS << char(dwarf::DW_LNS_const_add_pc);
- OS << char(Opcode);
+ Out.push_back(dwarf::DW_LNS_const_add_pc);
+ Out.push_back(Opcode);
return;
}
}
// Otherwise use DW_LNS_advance_pc.
- OS << char(dwarf::DW_LNS_advance_pc);
- encodeULEB128(AddrDelta, OS);
+ Out.push_back(dwarf::DW_LNS_advance_pc);
+ Out.append(Buf, Buf + encodeULEB128(AddrDelta, Buf));
if (NeedCopy)
- OS << char(dwarf::DW_LNS_copy);
+ Out.push_back(dwarf::DW_LNS_copy);
else {
assert(Temp <= 255 && "Buggy special opcode encoding.");
- OS << char(Temp);
+ Out.push_back(Temp);
}
}
diff --git a/llvm/unittests/MC/DwarfLineTables.cpp b/llvm/unittests/MC/DwarfLineTables.cpp
index f16d20c790aa6..3de8c9870eb46 100644
--- a/llvm/unittests/MC/DwarfLineTables.cpp
+++ b/llvm/unittests/MC/DwarfLineTables.cpp
@@ -57,9 +57,8 @@ Context &getContext() {
void verifyEncoding(MCDwarfLineTableParams Params, int LineDelta, int AddrDelta,
ArrayRef<uint8_t> ExpectedEncoding) {
SmallString<16> Buffer;
- raw_svector_ostream EncodingOS(Buffer);
- MCDwarfLineAddr::Encode(getContext(), Params, LineDelta, AddrDelta,
- EncodingOS);
+ MCDwarfLineAddr::encode(getContext(), Params, LineDelta, AddrDelta,
+ Buffer);
EXPECT_EQ(ExpectedEncoding, arrayRefFromStringRef(Buffer));
}
More information about the llvm-commits
mailing list