[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