60 "invalid integer write size: %zu",
Size);
66 std::vector<uint8_t> FillData(
Size, 0);
67 OS.
write(
reinterpret_cast<char *
>(FillData.data()),
Size);
72 bool IsLittleEndian) {
89 OS.
write(Str.data(), Str.size());
98 "Index should be less than the size of DebugAbbrev array");
99 auto [It, Inserted] = AbbrevTableContents.try_emplace(Index);
107 AbbrevCode = AbbrevDecl.Code ? (
uint64_t)*AbbrevDecl.Code : AbbrevCode + 1;
111 for (
const auto &Attr : AbbrevDecl.Attributes) {
114 if (Attr.Form == dwarf::DW_FORM_implicit_const)
142 AddrSize = *
Range.AddrSize;
155 const uint64_t PaddedHeaderLength =
alignTo(HeaderLength, AddrSize * 2);
160 Length += PaddedHeaderLength - HeaderLength;
161 Length += AddrSize * 2 * (
Range.Descriptors.size() + 1);
171 for (
const auto &Descriptor :
Range.Descriptors) {
175 "unable to write debug_aranges address: %s",
187 const size_t RangesOffset =
OS.
tell();
190 const size_t CurrOffset =
OS.
tell() - RangesOffset;
191 if (DebugRanges.Offset && (
uint64_t)*DebugRanges.Offset < CurrOffset)
193 "'Offset' for 'debug_ranges' with index " +
195 " must be greater than or equal to the "
196 "number of bytes written already (0x" +
198 if (DebugRanges.Offset)
202 if (DebugRanges.AddrSize)
203 AddrSize = *DebugRanges.AddrSize;
206 for (
const auto &
Entry : DebugRanges.Entries) {
211 "unable to write debug_ranges address offset: %s",
224 bool IsLittleEndian,
bool IsGNUPubSec =
false) {
229 for (
const auto &Entry : Sect.
Entries) {
233 OS.
write(Entry.Name.data(), Entry.Name.size());
269 if (AbbrCode == 0 || Entry.Values.empty())
270 return OS.
tell() - EntryBegin;
274 if (!AbbrevTableInfoOrErr)
277 " for compilation unit with index " +
281 DI.
DebugAbbrev[AbbrevTableInfoOrErr->Index].Table);
283 if (AbbrCode > AbbrevDecls.
size())
286 "abbrev code must be less than or equal to the number of "
287 "entries in abbreviation table");
289 auto FormVal = Entry.Values.begin();
291 for (; FormVal != Entry.Values.end() && AbbrForm != Abbrev.
Attributes.end();
292 ++FormVal, ++AbbrForm) {
298 case dwarf::DW_FORM_addr:
301 FormVal->Value, Params.
AddrSize,
OS, IsLittleEndian))
302 return std::move(Err);
304 case dwarf::DW_FORM_ref_addr:
309 return std::move(Err);
311 case dwarf::DW_FORM_exprloc:
312 case dwarf::DW_FORM_block:
314 OS.
write((
const char *)FormVal->BlockData.data(),
315 FormVal->BlockData.size());
317 case dwarf::DW_FORM_block1: {
319 OS.
write((
const char *)FormVal->BlockData.data(),
320 FormVal->BlockData.size());
323 case dwarf::DW_FORM_block2: {
325 OS.
write((
const char *)FormVal->BlockData.data(),
326 FormVal->BlockData.size());
329 case dwarf::DW_FORM_block4: {
331 OS.
write((
const char *)FormVal->BlockData.data(),
332 FormVal->BlockData.size());
335 case dwarf::DW_FORM_strx:
336 case dwarf::DW_FORM_addrx:
337 case dwarf::DW_FORM_rnglistx:
338 case dwarf::DW_FORM_loclistx:
339 case dwarf::DW_FORM_udata:
340 case dwarf::DW_FORM_ref_udata:
341 case dwarf::DW_FORM_GNU_addr_index:
342 case dwarf::DW_FORM_GNU_str_index:
345 case dwarf::DW_FORM_data1:
346 case dwarf::DW_FORM_ref1:
347 case dwarf::DW_FORM_flag:
348 case dwarf::DW_FORM_strx1:
349 case dwarf::DW_FORM_addrx1:
352 case dwarf::DW_FORM_data2:
353 case dwarf::DW_FORM_ref2:
354 case dwarf::DW_FORM_strx2:
355 case dwarf::DW_FORM_addrx2:
358 case dwarf::DW_FORM_data4:
359 case dwarf::DW_FORM_ref4:
360 case dwarf::DW_FORM_ref_sup4:
361 case dwarf::DW_FORM_strx4:
362 case dwarf::DW_FORM_addrx4:
365 case dwarf::DW_FORM_data8:
366 case dwarf::DW_FORM_ref8:
367 case dwarf::DW_FORM_ref_sup8:
368 case dwarf::DW_FORM_ref_sig8:
371 case dwarf::DW_FORM_sdata:
374 case dwarf::DW_FORM_string:
375 OS.
write(FormVal->CStr.data(), FormVal->CStr.size());
378 case dwarf::DW_FORM_indirect:
384 case dwarf::DW_FORM_strp:
385 case dwarf::DW_FORM_sec_offset:
386 case dwarf::DW_FORM_GNU_ref_alt:
387 case dwarf::DW_FORM_GNU_strp_alt:
388 case dwarf::DW_FORM_line_strp:
389 case dwarf::DW_FORM_strp_sup:
400 return OS.
tell() - EntryBegin;
417 case dwarf::DW_UT_compile:
418 case dwarf::DW_UT_partial:
421 case dwarf::DW_UT_type:
422 case dwarf::DW_UT_split_type:
426 case dwarf::DW_UT_skeleton:
427 case dwarf::DW_UT_split_compile:
436 std::string EntryBuffer;
446 return EntryLength.takeError();
463 AbbrevTableOffset = AbbrevTableInfoOrErr->Offset;
477 case dwarf::DW_UT_compile:
478 case dwarf::DW_UT_partial:
481 case dwarf::DW_UT_type:
482 case dwarf::DW_UT_split_type:
486 case dwarf::DW_UT_skeleton:
487 case dwarf::DW_UT_split_compile:
496 OS.
write(EntryBuffer.data(), EntryBuffer.size());
503 OS.
write(File.Name.data(), File.Name.size());
511 uint8_t AddrSize,
bool IsLittleEndian,
518 std::string OpBuffer;
521 switch (
Op.SubOpcode) {
522 case dwarf::DW_LNE_set_address:
526 case dwarf::DW_LNE_define_file:
529 case dwarf::DW_LNE_set_discriminator:
532 case dwarf::DW_LNE_end_sequence:
535 for (
auto OpByte :
Op.UnknownOpcodeData)
538 uint64_t ExtLen =
Op.ExtLen.value_or(OpBuffer.size());
540 OS.
write(OpBuffer.data(), OpBuffer.size());
547 if (
Op.Opcode == 0) {
549 }
else if (
Op.Opcode < OpcodeBase) {
551 case dwarf::DW_LNS_copy:
552 case dwarf::DW_LNS_negate_stmt:
553 case dwarf::DW_LNS_set_basic_block:
554 case dwarf::DW_LNS_const_add_pc:
555 case dwarf::DW_LNS_set_prologue_end:
556 case dwarf::DW_LNS_set_epilogue_begin:
559 case dwarf::DW_LNS_advance_pc:
560 case dwarf::DW_LNS_set_file:
561 case dwarf::DW_LNS_set_column:
562 case dwarf::DW_LNS_set_isa:
566 case dwarf::DW_LNS_advance_line:
570 case dwarf::DW_LNS_fixed_advance_pc:
575 for (
auto OpData :
Op.StandardOpcodeData) {
582static std::vector<uint8_t>
586 std::vector<uint8_t> StandardOpcodeLengths{0, 1, 1, 1, 1, 0,
590 StandardOpcodeLengths.resize(9);
591 }
else if (OpcodeBase) {
592 StandardOpcodeLengths.resize(*OpcodeBase > 0 ? *OpcodeBase - 1 : 0, 0);
594 return StandardOpcodeLengths;
612 std::vector<uint8_t> StandardOpcodeLengths =
617 : StandardOpcodeLengths.size() + 1;
619 for (
uint8_t OpcodeLength : StandardOpcodeLengths)
624 BufferOS.
write(
'\0');
626 BufferOS.
write(
'\0');
630 BufferOS.
write(
'\0');
652 OS.
write(Buffer.data(), Buffer.size());
685 "unable to write debug_addr segment: %s",
691 "unable to write debug_addr address: %s",
723void emitDebugNamesHeader(
raw_ostream &
OS,
bool IsLittleEndian,
727 StringRef AugmentationString =
"LLVM0700";
728 size_t TotalSize = CombinedSizeOtherParts + 5 *
sizeof(
uint32_t) +
729 2 *
sizeof(
uint16_t) +
sizeof(NameCount) +
730 sizeof(AbbrevSize) + AugmentationString.
size();
754 for (
auto [
Idx, Form] : Abbrev.Indices) {
767std::string emitDebugNamesCUOffsets(
bool IsLittleEndian) {
778std::string emitDebugNamesNameTable(
782 assert(Entries.size() == EntryPoolOffsets.
size());
789 for (
uint32_t PoolOffset : EntryPoolOffsets)
799 StrpToEntries[
Entry.NameStrp].push_back(Entry);
800 return StrpToEntries;
806getNonZeroDataSizesFor(
uint32_t AbbrevCode,
808 const auto *AbbrevIt =
find_if(Abbrevs, [&](
const auto &Abbrev) {
809 return Abbrev.Code.value == AbbrevCode;
811 if (AbbrevIt == Abbrevs.
end())
813 "did not find an Abbreviation for this code");
817 for (
auto [
Idx, Form] : AbbrevIt->Indices) {
821 "unsupported Form for YAML debug_names emitter");
829struct PoolOffsetsAndData {
830 std::string PoolData;
831 std::vector<uint32_t> PoolOffsets;
843 PoolOffsetsAndData
Result;
854 getNonZeroDataSizesFor(
Entry.Code, Abbrevs);
857 if (DataSizes->size() !=
Entry.Values.size())
860 "mismatch between provided and required number of values");
887 std::string NamesTableData = emitDebugNamesNameTable(
890 std::string AbbrevData = emitDebugNamesAbbrev(
DebugNames.Abbrevs);
891 std::string CUOffsetsData = emitDebugNamesCUOffsets(DI.
IsLittleEndian);
893 size_t TotalSize = PoolInfo->PoolData.size() + NamesTableData.size() +
894 AbbrevData.size() + CUOffsetsData.size();
898 AbbrevData.size(), TotalSize);
899 OS.
write(CUOffsetsData.data(), CUOffsetsData.size());
901 OS.
write(NamesTableData.data(), NamesTableData.size());
902 OS.
write(AbbrevData.data(), AbbrevData.size());
903 OS.
write(PoolInfo->PoolData.data(), PoolInfo->PoolData.size());
911 if (Values.
size() != ExpectedOperands)
914 "invalid number (%zu) of operands for the operator: %s, %" PRIu64
916 Values.
size(), EncodingString.
str().c_str(), ExpectedOperands);
923 bool IsLittleEndian) {
926 "unable to write address for the operator %s: %s",
927 EncodingName.
str().c_str(),
936 uint8_t AddrSize,
bool IsLittleEndian) {
937 auto CheckOperands = [&](
uint64_t ExpectedOperands) ->
Error {
945 case dwarf::DW_OP_consts:
946 if (
Error Err = CheckOperands(1))
947 return std::move(Err);
950 case dwarf::DW_OP_stack_value:
951 if (
Error Err = CheckOperands(0))
952 return std::move(Err);
957 "DWARF expression: " +
961 " is not supported");
963 return OS.
tell() - ExpressionBegin;
969 bool IsLittleEndian) {
975 auto CheckOperands = [&](
uint64_t ExpectedOperands) ->
Error {
984 switch (Entry.Operator) {
985 case dwarf::DW_RLE_end_of_list:
986 if (
Error Err = CheckOperands(0))
987 return std::move(Err);
989 case dwarf::DW_RLE_base_addressx:
990 if (
Error Err = CheckOperands(1))
991 return std::move(Err);
994 case dwarf::DW_RLE_startx_endx:
995 case dwarf::DW_RLE_startx_length:
996 case dwarf::DW_RLE_offset_pair:
997 if (
Error Err = CheckOperands(2))
998 return std::move(Err);
1002 case dwarf::DW_RLE_base_address:
1003 if (
Error Err = CheckOperands(1))
1004 return std::move(Err);
1005 if (
Error Err = WriteAddress(Entry.Values[0]))
1006 return std::move(Err);
1008 case dwarf::DW_RLE_start_end:
1009 if (
Error Err = CheckOperands(2))
1010 return std::move(Err);
1011 if (
Error Err = WriteAddress(Entry.Values[0]))
1012 return std::move(Err);
1013 cantFail(WriteAddress(Entry.Values[1]));
1015 case dwarf::DW_RLE_start_length:
1016 if (
Error Err = CheckOperands(2))
1017 return std::move(Err);
1018 if (
Error Err = WriteAddress(Entry.Values[0]))
1019 return std::move(Err);
1024 return OS.
tell() - BeginOffset;
1030 bool IsLittleEndian) {
1036 auto CheckOperands = [&](
uint64_t ExpectedOperands) ->
Error {
1045 auto WriteDWARFOperations = [&]() ->
Error {
1046 std::string OpBuffer;
1053 DescriptionsLength += *OpSize;
1055 return OpSize.takeError();
1058 if (Entry.DescriptionsLength)
1059 DescriptionsLength = *Entry.DescriptionsLength;
1061 DescriptionsLength = OpBuffer.size();
1064 OS.
write(OpBuffer.data(), OpBuffer.size());
1069 switch (Entry.Operator) {
1070 case dwarf::DW_LLE_end_of_list:
1071 if (
Error Err = CheckOperands(0))
1072 return std::move(Err);
1074 case dwarf::DW_LLE_base_addressx:
1075 if (
Error Err = CheckOperands(1))
1076 return std::move(Err);
1079 case dwarf::DW_LLE_startx_endx:
1080 case dwarf::DW_LLE_startx_length:
1081 case dwarf::DW_LLE_offset_pair:
1082 if (
Error Err = CheckOperands(2))
1083 return std::move(Err);
1086 if (
Error Err = WriteDWARFOperations())
1087 return std::move(Err);
1089 case dwarf::DW_LLE_default_location:
1090 if (
Error Err = CheckOperands(0))
1091 return std::move(Err);
1092 if (
Error Err = WriteDWARFOperations())
1093 return std::move(Err);
1095 case dwarf::DW_LLE_base_address:
1096 if (
Error Err = CheckOperands(1))
1097 return std::move(Err);
1098 if (
Error Err = WriteAddress(Entry.Values[0]))
1099 return std::move(Err);
1101 case dwarf::DW_LLE_start_end:
1102 if (
Error Err = CheckOperands(2))
1103 return std::move(Err);
1104 if (
Error Err = WriteAddress(Entry.Values[0]))
1105 return std::move(Err);
1106 cantFail(WriteAddress(Entry.Values[1]));
1107 if (
Error Err = WriteDWARFOperations())
1108 return std::move(Err);
1110 case dwarf::DW_LLE_start_length:
1111 if (
Error Err = CheckOperands(2))
1112 return std::move(Err);
1113 if (
Error Err = WriteAddress(Entry.Values[0]))
1114 return std::move(Err);
1116 if (
Error Err = WriteDWARFOperations())
1117 return std::move(Err);
1121 return OS.
tell() - BeginOffset;
1124template <
typename EntryType>
1127 bool IsLittleEndian,
bool Is64BitAddrSize) {
1135 AddrSize = *Table.AddrSize;
1137 AddrSize = Is64BitAddrSize ? 8 : 4;
1143 std::string ListBuffer;
1149 std::vector<uint64_t> Offsets;
1152 Offsets.push_back(ListBufferOS.
tell());
1156 }
else if (
List.Entries) {
1157 for (
const EntryType &Entry : *
List.Entries) {
1172 if (Table.OffsetEntryCount)
1173 OffsetEntryCount = *Table.OffsetEntryCount;
1175 OffsetEntryCount = Table.Offsets ? Table.Offsets->size() : Offsets.size();
1199 Table.Offsets->size()),
1201 else if (OffsetEntryCount != 0)
1202 EmitOffsets(Offsets, OffsetsSize);
1204 OS.
write(ListBuffer.data(), ListBuffer.size());
1212 return writeDWARFLists<DWARFYAML::RnglistEntry>(
1218 return writeDWARFLists<DWARFYAML::LoclistEntry>(
1244 SecName +
" is not supported");
1252 StringMap<std::unique_ptr<MemoryBuffer>> &OutputBuffers) {
1258 if (
Error Err = EmitFunc(DebugInfoStream, DI))
1260 DebugInfoStream.
flush();
1269 bool Is64BitAddrSize) {
1270 auto CollectDiagnostic = [](
const SMDiagnostic &Diag,
void *DiagContext) {
1275 yaml::Input YIn(YAMLString,
nullptr, CollectDiagnostic,
1294 return std::move(Err);
1295 return std::move(DebugSections);
This file defines the StringMap class.
static void writeDWARFOffset(uint64_t Offset, dwarf::DwarfFormat Format, raw_ostream &OS, bool IsLittleEndian)
static Error emitDebugSectionImpl(const DWARFYAML::Data &DI, StringRef Sec, StringMap< std::unique_ptr< MemoryBuffer > > &OutputBuffers)
static void ZeroFillBytes(raw_ostream &OS, size_t Size)
static void emitFileEntry(raw_ostream &OS, const DWARFYAML::File &File)
static Error writeDWARFLists(raw_ostream &OS, ArrayRef< DWARFYAML::ListTable< EntryType > > Tables, bool IsLittleEndian, bool Is64BitAddrSize)
static void writeLineTableOpcode(const DWARFYAML::LineTableOpcode &Op, uint8_t OpcodeBase, uint8_t AddrSize, raw_ostream &OS, bool IsLittleEndian)
static Error writeVariableSizedInteger(uint64_t Integer, size_t Size, raw_ostream &OS, bool IsLittleEndian)
static Expected< uint64_t > writeListEntry(raw_ostream &OS, const DWARFYAML::RnglistEntry &Entry, uint8_t AddrSize, bool IsLittleEndian)
static void writeInteger(T Integer, raw_ostream &OS, bool IsLittleEndian)
static void writeExtendedOpcode(const DWARFYAML::LineTableOpcode &Op, uint8_t AddrSize, bool IsLittleEndian, raw_ostream &OS)
static Error checkOperandCount(StringRef EncodingString, ArrayRef< yaml::Hex64 > Values, uint64_t ExpectedOperands)
static Expected< uint64_t > writeDWARFExpression(raw_ostream &OS, const DWARFYAML::DWARFOperation &Operation, uint8_t AddrSize, bool IsLittleEndian)
static Error emitPubSection(raw_ostream &OS, const DWARFYAML::PubSection &Sect, bool IsLittleEndian, bool IsGNUPubSec=false)
static Expected< uint64_t > writeDIE(const DWARFYAML::Data &DI, uint64_t CUIndex, uint64_t AbbrevTableID, const dwarf::FormParams &Params, const DWARFYAML::Entry &Entry, raw_ostream &OS, bool IsLittleEndian)
static void writeInitialLength(const dwarf::DwarfFormat Format, const uint64_t Length, raw_ostream &OS, bool IsLittleEndian)
static std::vector< uint8_t > getStandardOpcodeLengths(uint16_t Version, std::optional< uint8_t > OpcodeBase)
static Error writeListEntryAddress(StringRef EncodingName, raw_ostream &OS, uint64_t Addr, uint8_t AddrSize, bool IsLittleEndian)
Common declarations for yaml2obj.
This file declares classes for handling the YAML representation of DWARF Debug Info.
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file contains constants used for implementing Dwarf debug support.
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
PowerPC Reduce CR logical Operation
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
This class represents an Operation in the Expression.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
static std::unique_ptr< MemoryBuffer > getMemBufferCopy(StringRef InputData, const Twine &BufferName="")
Open the specified memory range as a MemoryBuffer, copying the contents and taking ownership of it.
Instances of this class encapsulate one diagnostic report, allowing printing to a raw_ostream as a ca...
StringRef getMessage() const
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
StringRef - Represent a constant reference to a string, i.e.
std::string str() const
str - Get the contents as an std::string.
constexpr bool empty() const
empty - Check if the string is empty.
constexpr size_t size() const
size - Get the string size.
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
A switch()-like statement whose cases are string literals.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
static Twine utohexstr(const uint64_t &Val)
LLVM Value Representation.
This class implements an extremely fast bulk output stream that can only output to a stream.
raw_ostream & write_zeros(unsigned NumZeros)
write_zeros - Insert 'NumZeros' nulls.
uint64_t tell() const
tell - Return the current offset with the file.
raw_ostream & write(unsigned char C)
A raw_ostream that writes to an std::string.
StringRef RangeListEncodingString(unsigned Encoding)
StringRef LocListEncodingString(unsigned Encoding)
StringRef OperationEncodingString(unsigned Encoding)
Error emitDebugStrOffsets(raw_ostream &OS, const Data &DI)
Error emitDebugInfo(raw_ostream &OS, const Data &DI)
Error emitDebugRanges(raw_ostream &OS, const Data &DI)
Error emitDebugAranges(raw_ostream &OS, const Data &DI)
Error emitDebugGNUPubnames(raw_ostream &OS, const Data &DI)
Error emitDebugAbbrev(raw_ostream &OS, const Data &DI)
Error emitDebugRnglists(raw_ostream &OS, const Data &DI)
Error emitDebugLoclists(raw_ostream &OS, const Data &DI)
std::function< Error(raw_ostream &, const Data &)> getDWARFEmitterByName(StringRef SecName)
Expected< StringMap< std::unique_ptr< MemoryBuffer > > > emitDebugSections(StringRef YAMLString, bool IsLittleEndian=sys::IsLittleEndianHost, bool Is64BitAddrSize=true)
Error emitDebugGNUPubtypes(raw_ostream &OS, const Data &DI)
Error emitDebugStr(raw_ostream &OS, const Data &DI)
Error emitDebugPubnames(raw_ostream &OS, const Data &DI)
Error emitDebugAddr(raw_ostream &OS, const Data &DI)
Error emitDebugNames(raw_ostream &OS, const Data &DI)
Error emitDebugPubtypes(raw_ostream &OS, const Data &DI)
Error emitDebugLine(raw_ostream &OS, const Data &DI)
DwarfFormat
Constants that define the DWARF format as 32 or 64 bit.
std::optional< uint8_t > getFixedFormByteSize(dwarf::Form Form, FormParams Params)
Get the fixed byte size for a given form.
@ DW_LENGTH_DWARF64
Indicator of 64-bit DWARF format.
static const bool IsLittleEndianHost
void swapByteOrder(T &Value)
This is an optimization pass for GlobalISel generic memory operations.
detail::zippy< detail::zip_first, T, U, Args... > zip_equal(T &&t, U &&u, Args &&...args)
zip iterator that assumes that all iteratees have the same length.
std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
SmallVectorImpl< T >::const_pointer c_str(SmallVectorImpl< T > &str)
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
Error joinErrors(Error E1, Error E2)
Concatenate errors.
auto make_first_range(ContainerTy &&c)
Given a container of pairs, return a range over the first elements.
void cantFail(Error Err, const char *Msg=nullptr)
Report a fatal error if Err is a failure value.
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
auto make_second_range(ContainerTy &&c)
Given a container of pairs, return a range over the second elements.
unsigned encodeSLEB128(int64_t Value, raw_ostream &OS, unsigned PadTo=0)
Utility function to encode a SLEB128 value to an output stream.
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
const char * toString(DWARFSectionKind Kind)
unsigned encodeULEB128(uint64_t Value, raw_ostream &OS, unsigned PadTo=0)
Utility function to encode a ULEB128 value to an output stream.
void consumeError(Error Err)
Consume a Error without doing anything.
std::vector< AttributeAbbrev > Attributes
std::optional< yaml::Hex64 > Length
std::optional< yaml::Hex8 > AddrSize
dwarf::DwarfFormat Format
yaml::Hex8 SegSelectorSize
std::vector< SegAddrPair > SegAddrPairs
std::vector< Unit > Units
std::vector< LineTable > DebugLines
std::optional< std::vector< AddrTableEntry > > DebugAddr
std::optional< std::vector< Ranges > > DebugRanges
std::optional< std::vector< ListTable< LoclistEntry > > > DebugLoclists
std::vector< AbbrevTable > DebugAbbrev
Expected< AbbrevTableInfo > getAbbrevTableInfoByID(uint64_t ID) const
std::optional< PubSection > GNUPubNames
std::optional< std::vector< ARange > > DebugAranges
StringRef getAbbrevTableContentByIndex(uint64_t Index) const
std::optional< PubSection > GNUPubTypes
SetVector< StringRef > getNonEmptySectionNames() const
std::optional< std::vector< StringOffsetsTable > > DebugStrOffsets
std::optional< std::vector< StringRef > > DebugStrings
std::optional< std::vector< ListTable< RnglistEntry > > > DebugRnglists
std::optional< PubSection > PubNames
std::optional< DebugNamesSection > DebugNames
std::optional< PubSection > PubTypes
std::optional< uint64_t > Length
std::optional< uint8_t > OpcodeBase
std::vector< LineTableOpcode > Opcodes
std::optional< uint64_t > PrologueLength
dwarf::DwarfFormat Format
std::vector< File > Files
std::vector< StringRef > IncludeDirs
std::optional< std::vector< uint8_t > > StandardOpcodeLengths
dwarf::DwarfFormat Format
std::vector< PubEntry > Entries
std::optional< yaml::Hex64 > Length
std::vector< yaml::Hex64 > Offsets
dwarf::DwarfFormat Format
std::optional< uint64_t > AbbrevTableID
dwarf::DwarfFormat Format
std::optional< yaml::Hex64 > Length
yaml::Hex64 TypeSignatureOrDwoID
std::optional< uint8_t > AddrSize
llvm::dwarf::UnitType Type
std::vector< Entry > Entries
std::optional< yaml::Hex64 > AbbrOffset