[llvm] 390643e - MCDwarfFrameEmitter::EncodeAdvanceLoc: use SmallVectorImpl instead of raw_ostream. NFC

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Sun May 7 19:32:59 PDT 2023


Author: Fangrui Song
Date: 2023-05-07T19:32:53-07:00
New Revision: 390643e3c5c3700bb3a79b21dca19b9f82b207bb

URL: https://github.com/llvm/llvm-project/commit/390643e3c5c3700bb3a79b21dca19b9f82b207bb
DIFF: https://github.com/llvm/llvm-project/commit/390643e3c5c3700bb3a79b21dca19b9f82b207bb.diff

LOG: MCDwarfFrameEmitter::EncodeAdvanceLoc: use SmallVectorImpl instead of raw_ostream. NFC

Similar to 49488490d195591bfc90daef111cd7293f8c80aa.
Remove MCDwarfFrameEmitter::EmitAdvanceLoc which is only called once.

Added: 
    

Modified: 
    llvm/include/llvm/MC/MCDwarf.h
    llvm/include/llvm/Support/EndianStream.h
    llvm/lib/MC/MCAssembler.cpp
    llvm/lib/MC/MCDwarf.cpp
    llvm/lib/MC/MCObjectStreamer.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/MC/MCDwarf.h b/llvm/include/llvm/MC/MCDwarf.h
index 776937c2faa9..547fb34a0696 100644
--- a/llvm/include/llvm/MC/MCDwarf.h
+++ b/llvm/include/llvm/MC/MCDwarf.h
@@ -704,9 +704,8 @@ class MCDwarfFrameEmitter {
   // This emits the frame info section.
   //
   static void Emit(MCObjectStreamer &streamer, MCAsmBackend *MAB, bool isEH);
-  static void EmitAdvanceLoc(MCObjectStreamer &Streamer, uint64_t AddrDelta);
-  static void EncodeAdvanceLoc(MCContext &Context, uint64_t AddrDelta,
-                               raw_ostream &OS);
+  static void encodeAdvanceLoc(MCContext &Context, uint64_t AddrDelta,
+                               SmallVectorImpl<char> &OS);
 };
 
 } // end namespace llvm

diff  --git a/llvm/include/llvm/Support/EndianStream.h b/llvm/include/llvm/Support/EndianStream.h
index d2289ccfa893..8ff87d23e83b 100644
--- a/llvm/include/llvm/Support/EndianStream.h
+++ b/llvm/include/llvm/Support/EndianStream.h
@@ -15,6 +15,7 @@
 #define LLVM_SUPPORT_ENDIANSTREAM_H
 
 #include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/SmallVector.h"
 #include "llvm/Support/Endian.h"
 #include "llvm/Support/MathExtras.h"
 #include "llvm/Support/raw_ostream.h"
@@ -48,6 +49,12 @@ inline void write(raw_ostream &os, ArrayRef<value_type> vals,
     write(os, v, endian);
 }
 
+template <typename value_type>
+inline void write(SmallVectorImpl<char> &Out, value_type V, endianness E) {
+  V = byte_swap<value_type>(V, E);
+  Out.append((const char *)&V, (const char *)&V + sizeof(value_type));
+}
+
 /// Adapter to write values to a stream in a particular byte order.
 struct Writer {
   raw_ostream &OS;

diff  --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp
index 2f6fdb7fabd0..f1853bfe2b92 100644
--- a/llvm/lib/MC/MCAssembler.cpp
+++ b/llvm/lib/MC/MCAssembler.cpp
@@ -1117,10 +1117,9 @@ bool MCAssembler::relaxDwarfCallFrameFragment(MCAsmLayout &Layout,
   (void) Abs;
   SmallVectorImpl<char> &Data = DF.getContents();
   Data.clear();
-  raw_svector_ostream OSE(Data);
   DF.getFixups().clear();
 
-  MCDwarfFrameEmitter::EncodeAdvanceLoc(Context, AddrDelta, OSE);
+  MCDwarfFrameEmitter::encodeAdvanceLoc(Context, AddrDelta, Data);
   return OldSize != Data.size();
 }
 

diff  --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp
index 3ee36034b49d..6acfd08d4ce6 100644
--- a/llvm/lib/MC/MCDwarf.cpp
+++ b/llvm/lib/MC/MCDwarf.cpp
@@ -1925,18 +1925,9 @@ void MCDwarfFrameEmitter::Emit(MCObjectStreamer &Streamer, MCAsmBackend *MAB,
   }
 }
 
-void MCDwarfFrameEmitter::EmitAdvanceLoc(MCObjectStreamer &Streamer,
-                                         uint64_t AddrDelta) {
-  MCContext &Context = Streamer.getContext();
-  SmallString<256> Tmp;
-  raw_svector_ostream OS(Tmp);
-  MCDwarfFrameEmitter::EncodeAdvanceLoc(Context, AddrDelta, OS);
-  Streamer.emitBytes(OS.str());
-}
-
-void MCDwarfFrameEmitter::EncodeAdvanceLoc(MCContext &Context,
+void MCDwarfFrameEmitter::encodeAdvanceLoc(MCContext &Context,
                                            uint64_t AddrDelta,
-                                           raw_ostream &OS) {
+                                           SmallVectorImpl<char> &Out) {
   // Scale the address delta by the minimum instruction length.
   AddrDelta = ScaleAddrDelta(Context, AddrDelta);
   if (AddrDelta == 0)
@@ -1947,16 +1938,16 @@ void MCDwarfFrameEmitter::EncodeAdvanceLoc(MCContext &Context,
 
   if (isUIntN(6, AddrDelta)) {
     uint8_t Opcode = dwarf::DW_CFA_advance_loc | AddrDelta;
-    OS << Opcode;
+    Out.push_back(Opcode);
   } else if (isUInt<8>(AddrDelta)) {
-    OS << uint8_t(dwarf::DW_CFA_advance_loc1);
-    OS << uint8_t(AddrDelta);
+    Out.push_back(dwarf::DW_CFA_advance_loc1);
+    Out.push_back(AddrDelta);
   } else if (isUInt<16>(AddrDelta)) {
-    OS << uint8_t(dwarf::DW_CFA_advance_loc2);
-    support::endian::write<uint16_t>(OS, AddrDelta, E);
+    Out.push_back(dwarf::DW_CFA_advance_loc2);
+    support::endian::write<uint16_t>(Out, AddrDelta, E);
   } else {
     assert(isUInt<32>(AddrDelta));
-    OS << uint8_t(dwarf::DW_CFA_advance_loc4);
-    support::endian::write<uint32_t>(OS, AddrDelta, E);
+    Out.push_back(dwarf::DW_CFA_advance_loc4);
+    support::endian::write<uint32_t>(Out, AddrDelta, E);
   }
 }

diff  --git a/llvm/lib/MC/MCObjectStreamer.cpp b/llvm/lib/MC/MCObjectStreamer.cpp
index d609194992a5..059d7e9d602b 100644
--- a/llvm/lib/MC/MCObjectStreamer.cpp
+++ b/llvm/lib/MC/MCObjectStreamer.cpp
@@ -573,10 +573,12 @@ void MCObjectStreamer::emitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel,
   const MCExpr *AddrDelta = buildSymbolDiff(*this, Label, LastLabel);
   int64_t Res;
   if (AddrDelta->evaluateAsAbsolute(Res, getAssemblerPtr())) {
-    MCDwarfFrameEmitter::EmitAdvanceLoc(*this, Res);
-    return;
+    SmallString<8> Tmp;
+    MCDwarfFrameEmitter::encodeAdvanceLoc(getContext(), Res, Tmp);
+    emitBytes(Tmp);
+  } else {
+    insert(new MCDwarfCallFrameFragment(*AddrDelta));
   }
-  insert(new MCDwarfCallFrameFragment(*AddrDelta));
 }
 
 void MCObjectStreamer::emitCVLocDirective(unsigned FunctionId, unsigned FileNo,


        


More information about the llvm-commits mailing list