[clang] [llvm] [dwarf] make dwarf fission compatible with RISCV relaxations (PR #164128)
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 20 09:54:46 PDT 2025
================
@@ -3290,34 +3275,70 @@ static MCSymbol *emitLoclistsTableHeader(AsmPrinter *Asm,
return TableEnd;
}
-template <typename Ranges, typename PayloadEmitter>
-static void emitRangeList(
- DwarfDebug &DD, AsmPrinter *Asm, MCSymbol *Sym, const Ranges &R,
- const DwarfCompileUnit &CU, unsigned BaseAddressx, unsigned OffsetPair,
- unsigned StartxLength, unsigned EndOfList,
- StringRef (*StringifyEnum)(unsigned),
- bool ShouldUseBaseAddress,
- PayloadEmitter EmitPayload) {
+namespace {
+
+struct DebugLocSpanList {
+ MCSymbol *Label;
+ const DwarfCompileUnit *CU;
+ llvm::ArrayRef<llvm::DebugLocStream::Entry> Ranges;
+};
+
+template <typename DWARFSpanList> struct DwarfRangeListTraits {};
+
+template <> struct DwarfRangeListTraits<DebugLocSpanList> {
+ static constexpr unsigned BaseAddressx = dwarf::DW_LLE_base_addressx;
+ static constexpr unsigned OffsetPair = dwarf::DW_LLE_offset_pair;
+ static constexpr unsigned StartxLength = dwarf::DW_LLE_startx_length;
+ static constexpr unsigned StartxEndx = dwarf::DW_LLE_startx_endx;
+ static constexpr unsigned EndOfList = dwarf::DW_LLE_end_of_list;
+
+ static StringRef StringifyRangeKind(unsigned Encoding) {
+ return llvm::dwarf::LocListEncodingString(Encoding);
+ }
+};
+
+template <> struct DwarfRangeListTraits<RangeSpanList> {
+ static constexpr unsigned BaseAddressx = dwarf::DW_RLE_base_addressx;
+ static constexpr unsigned OffsetPair = dwarf::DW_RLE_offset_pair;
+ static constexpr unsigned StartxLength = dwarf::DW_RLE_startx_length;
+ static constexpr unsigned StartxEndx = dwarf::DW_RLE_startx_endx;
+ static constexpr unsigned EndOfList = dwarf::DW_RLE_end_of_list;
+
+ static StringRef StringifyRangeKind(unsigned Encoding) {
+ return llvm::dwarf::RangeListEncodingString(Encoding);
+ }
+};
+
+} // namespace
+
+template <
+ typename Ranges, typename PayloadEmitter,
+ std::enable_if_t<DwarfRangeListTraits<Ranges>::BaseAddressx, bool> = true>
----------------
dwblaikie wrote:
Probably doesn't need the enable_if SFINAE? (emitRangeList isn't overloaded, right? So it can just fail to compile if someone passes in a range that doesn't have matching traits?)
& could you split this change out - do the trait-based change as NFC (but still send it for review) then do the relaxation stuff on top of that, would help isolate the changes?
https://github.com/llvm/llvm-project/pull/164128
More information about the llvm-commits
mailing list