[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