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 = AbbrevTableContents.find(Index);
100 if (It != AbbrevTableContents.cend())
103 std::string AbbrevTableBuffer;
108 AbbrevCode = AbbrevDecl.Code ? (
uint64_t)*AbbrevDecl.Code : AbbrevCode + 1;
112 for (
const auto &Attr : AbbrevDecl.Attributes) {
115 if (Attr.Form == dwarf::DW_FORM_implicit_const)
126 AbbrevTableContents.insert({Index, AbbrevTableBuffer});
128 return AbbrevTableContents[Index];
145 AddrSize = *
Range.AddrSize;
158 const uint64_t PaddedHeaderLength =
alignTo(HeaderLength, AddrSize * 2);
163 Length += PaddedHeaderLength - HeaderLength;
164 Length += AddrSize * 2 * (
Range.Descriptors.size() + 1);
174 for (
const auto &Descriptor :
Range.Descriptors) {
178 "unable to write debug_aranges address: %s",
190 const size_t RangesOffset =
OS.
tell();
193 const size_t CurrOffset =
OS.
tell() - RangesOffset;
194 if (DebugRanges.Offset && (
uint64_t)*DebugRanges.Offset < CurrOffset)
196 "'Offset' for 'debug_ranges' with index " +
198 " must be greater than or equal to the "
199 "number of bytes written already (0x" +
201 if (DebugRanges.Offset)
205 if (DebugRanges.AddrSize)
206 AddrSize = *DebugRanges.AddrSize;
209 for (
const auto &
Entry : DebugRanges.Entries) {
214 "unable to write debug_ranges address offset: %s",
227 bool IsLittleEndian,
bool IsGNUPubSec =
false) {
232 for (
const auto &Entry : Sect.
Entries) {
236 OS.
write(Entry.Name.data(), Entry.Name.size());
272 if (AbbrCode == 0 || Entry.Values.empty())
273 return OS.
tell() - EntryBegin;
277 if (!AbbrevTableInfoOrErr)
280 " for compilation unit with index " +
284 DI.
DebugAbbrev[AbbrevTableInfoOrErr->Index].Table);
286 if (AbbrCode > AbbrevDecls.
size())
289 "abbrev code must be less than or equal to the number of "
290 "entries in abbreviation table");
292 auto FormVal = Entry.Values.begin();
294 for (; FormVal != Entry.Values.end() && AbbrForm != Abbrev.
Attributes.end();
295 ++FormVal, ++AbbrForm) {
301 case dwarf::DW_FORM_addr:
304 FormVal->Value, Params.
AddrSize,
OS, IsLittleEndian))
305 return std::move(Err);
307 case dwarf::DW_FORM_ref_addr:
312 return std::move(Err);
314 case dwarf::DW_FORM_exprloc:
315 case dwarf::DW_FORM_block:
317 OS.
write((
const char *)FormVal->BlockData.data(),
318 FormVal->BlockData.size());
320 case dwarf::DW_FORM_block1: {
322 OS.
write((
const char *)FormVal->BlockData.data(),
323 FormVal->BlockData.size());
326 case dwarf::DW_FORM_block2: {
328 OS.
write((
const char *)FormVal->BlockData.data(),
329 FormVal->BlockData.size());
332 case dwarf::DW_FORM_block4: {
334 OS.
write((
const char *)FormVal->BlockData.data(),
335 FormVal->BlockData.size());
338 case dwarf::DW_FORM_strx:
339 case dwarf::DW_FORM_addrx:
340 case dwarf::DW_FORM_rnglistx:
341 case dwarf::DW_FORM_loclistx:
342 case dwarf::DW_FORM_udata:
343 case dwarf::DW_FORM_ref_udata:
344 case dwarf::DW_FORM_GNU_addr_index:
345 case dwarf::DW_FORM_GNU_str_index:
348 case dwarf::DW_FORM_data1:
349 case dwarf::DW_FORM_ref1:
350 case dwarf::DW_FORM_flag:
351 case dwarf::DW_FORM_strx1:
352 case dwarf::DW_FORM_addrx1:
355 case dwarf::DW_FORM_data2:
356 case dwarf::DW_FORM_ref2:
357 case dwarf::DW_FORM_strx2:
358 case dwarf::DW_FORM_addrx2:
361 case dwarf::DW_FORM_data4:
362 case dwarf::DW_FORM_ref4:
363 case dwarf::DW_FORM_ref_sup4:
364 case dwarf::DW_FORM_strx4:
365 case dwarf::DW_FORM_addrx4:
368 case dwarf::DW_FORM_data8:
369 case dwarf::DW_FORM_ref8:
370 case dwarf::DW_FORM_ref_sup8:
371 case dwarf::DW_FORM_ref_sig8:
374 case dwarf::DW_FORM_sdata:
377 case dwarf::DW_FORM_string:
378 OS.
write(FormVal->CStr.data(), FormVal->CStr.size());
381 case dwarf::DW_FORM_indirect:
387 case dwarf::DW_FORM_strp:
388 case dwarf::DW_FORM_sec_offset:
389 case dwarf::DW_FORM_GNU_ref_alt:
390 case dwarf::DW_FORM_GNU_strp_alt:
391 case dwarf::DW_FORM_line_strp:
392 case dwarf::DW_FORM_strp_sup:
403 return OS.
tell() - EntryBegin;
420 case dwarf::DW_UT_compile:
421 case dwarf::DW_UT_partial:
424 case dwarf::DW_UT_type:
425 case dwarf::DW_UT_split_type:
429 case dwarf::DW_UT_skeleton:
430 case dwarf::DW_UT_split_compile:
439 std::string EntryBuffer;
449 return EntryLength.takeError();
466 AbbrevTableOffset = AbbrevTableInfoOrErr->Offset;
480 case dwarf::DW_UT_compile:
481 case dwarf::DW_UT_partial:
484 case dwarf::DW_UT_type:
485 case dwarf::DW_UT_split_type:
489 case dwarf::DW_UT_skeleton:
490 case dwarf::DW_UT_split_compile:
499 OS.
write(EntryBuffer.data(), EntryBuffer.size());
506 OS.
write(File.Name.data(), File.Name.size());
514 uint8_t AddrSize,
bool IsLittleEndian,
521 std::string OpBuffer;
524 switch (
Op.SubOpcode) {
525 case dwarf::DW_LNE_set_address:
529 case dwarf::DW_LNE_define_file:
532 case dwarf::DW_LNE_set_discriminator:
535 case dwarf::DW_LNE_end_sequence:
538 for (
auto OpByte :
Op.UnknownOpcodeData)
541 uint64_t ExtLen =
Op.ExtLen.value_or(OpBuffer.size());
543 OS.
write(OpBuffer.data(), OpBuffer.size());
550 if (
Op.Opcode == 0) {
552 }
else if (
Op.Opcode < OpcodeBase) {
554 case dwarf::DW_LNS_copy:
555 case dwarf::DW_LNS_negate_stmt:
556 case dwarf::DW_LNS_set_basic_block:
557 case dwarf::DW_LNS_const_add_pc:
558 case dwarf::DW_LNS_set_prologue_end:
559 case dwarf::DW_LNS_set_epilogue_begin:
562 case dwarf::DW_LNS_advance_pc:
563 case dwarf::DW_LNS_set_file:
564 case dwarf::DW_LNS_set_column:
565 case dwarf::DW_LNS_set_isa:
569 case dwarf::DW_LNS_advance_line:
573 case dwarf::DW_LNS_fixed_advance_pc:
578 for (
auto OpData :
Op.StandardOpcodeData) {
585static std::vector<uint8_t>
589 std::vector<uint8_t> StandardOpcodeLengths{0, 1, 1, 1, 1, 0,
593 StandardOpcodeLengths.resize(9);
594 }
else if (OpcodeBase) {
595 StandardOpcodeLengths.resize(*OpcodeBase > 0 ? *OpcodeBase - 1 : 0, 0);
597 return StandardOpcodeLengths;
615 std::vector<uint8_t> StandardOpcodeLengths =
620 : StandardOpcodeLengths.size() + 1;
622 for (
uint8_t OpcodeLength : StandardOpcodeLengths)
627 BufferOS.
write(
'\0');
629 BufferOS.
write(
'\0');
633 BufferOS.
write(
'\0');
655 OS.
write(Buffer.data(), Buffer.size());
688 "unable to write debug_addr segment: %s",
694 "unable to write debug_addr address: %s",
726void emitDebugNamesHeader(
raw_ostream &
OS,
bool IsLittleEndian,
730 StringRef AugmentationString =
"LLVM0700";
731 size_t TotalSize = CombinedSizeOtherParts + 5 *
sizeof(
uint32_t) +
732 2 *
sizeof(
uint16_t) +
sizeof(NameCount) +
733 sizeof(AbbrevSize) + AugmentationString.
size();
757 for (
auto [
Idx, Form] : Abbrev.Indices) {
770std::string emitDebugNamesCUOffsets(
bool IsLittleEndian) {
781std::string emitDebugNamesNameTable(
785 assert(Entries.size() == EntryPoolOffsets.
size());
792 for (
uint32_t PoolOffset : EntryPoolOffsets)
802 StrpToEntries[
Entry.NameStrp].push_back(Entry);
803 return StrpToEntries;
809getNonZeroDataSizesFor(
uint32_t AbbrevCode,
811 const auto *AbbrevIt =
find_if(Abbrevs, [&](
const auto &Abbrev) {
812 return Abbrev.Code.value == AbbrevCode;
814 if (AbbrevIt == Abbrevs.
end())
816 "did not find an Abbreviation for this code");
820 for (
auto [
Idx, Form] : AbbrevIt->Indices) {
824 "unsupported Form for YAML debug_names emitter");
832struct PoolOffsetsAndData {
833 std::string PoolData;
834 std::vector<uint32_t> PoolOffsets;
846 PoolOffsetsAndData
Result;
857 getNonZeroDataSizesFor(
Entry.Code, Abbrevs);
860 if (DataSizes->size() !=
Entry.Values.size())
863 "mismatch between provided and required number of values");
890 std::string NamesTableData = emitDebugNamesNameTable(
893 std::string AbbrevData = emitDebugNamesAbbrev(
DebugNames.Abbrevs);
894 std::string CUOffsetsData = emitDebugNamesCUOffsets(DI.
IsLittleEndian);
896 size_t TotalSize = PoolInfo->PoolData.size() + NamesTableData.size() +
897 AbbrevData.size() + CUOffsetsData.size();
901 AbbrevData.size(), TotalSize);
902 OS.
write(CUOffsetsData.data(), CUOffsetsData.size());
904 OS.
write(NamesTableData.data(), NamesTableData.size());
905 OS.
write(AbbrevData.data(), AbbrevData.size());
906 OS.
write(PoolInfo->PoolData.data(), PoolInfo->PoolData.size());
914 if (Values.
size() != ExpectedOperands)
917 "invalid number (%zu) of operands for the operator: %s, %" PRIu64
919 Values.
size(), EncodingString.
str().c_str(), ExpectedOperands);
926 bool IsLittleEndian) {
929 "unable to write address for the operator %s: %s",
930 EncodingName.
str().c_str(),
939 uint8_t AddrSize,
bool IsLittleEndian) {
940 auto CheckOperands = [&](
uint64_t ExpectedOperands) ->
Error {
948 case dwarf::DW_OP_consts:
949 if (
Error Err = CheckOperands(1))
950 return std::move(Err);
953 case dwarf::DW_OP_stack_value:
954 if (
Error Err = CheckOperands(0))
955 return std::move(Err);
960 "DWARF expression: " +
964 " is not supported");
966 return OS.
tell() - ExpressionBegin;
972 bool IsLittleEndian) {
978 auto CheckOperands = [&](
uint64_t ExpectedOperands) ->
Error {
987 switch (Entry.Operator) {
988 case dwarf::DW_RLE_end_of_list:
989 if (
Error Err = CheckOperands(0))
990 return std::move(Err);
992 case dwarf::DW_RLE_base_addressx:
993 if (
Error Err = CheckOperands(1))
994 return std::move(Err);
997 case dwarf::DW_RLE_startx_endx:
998 case dwarf::DW_RLE_startx_length:
999 case dwarf::DW_RLE_offset_pair:
1000 if (
Error Err = CheckOperands(2))
1001 return std::move(Err);
1005 case dwarf::DW_RLE_base_address:
1006 if (
Error Err = CheckOperands(1))
1007 return std::move(Err);
1008 if (
Error Err = WriteAddress(Entry.Values[0]))
1009 return std::move(Err);
1011 case dwarf::DW_RLE_start_end:
1012 if (
Error Err = CheckOperands(2))
1013 return std::move(Err);
1014 if (
Error Err = WriteAddress(Entry.Values[0]))
1015 return std::move(Err);
1016 cantFail(WriteAddress(Entry.Values[1]));
1018 case dwarf::DW_RLE_start_length:
1019 if (
Error Err = CheckOperands(2))
1020 return std::move(Err);
1021 if (
Error Err = WriteAddress(Entry.Values[0]))
1022 return std::move(Err);
1027 return OS.
tell() - BeginOffset;
1033 bool IsLittleEndian) {
1039 auto CheckOperands = [&](
uint64_t ExpectedOperands) ->
Error {
1048 auto WriteDWARFOperations = [&]() ->
Error {
1049 std::string OpBuffer;
1056 DescriptionsLength += *OpSize;
1058 return OpSize.takeError();
1061 if (Entry.DescriptionsLength)
1062 DescriptionsLength = *Entry.DescriptionsLength;
1064 DescriptionsLength = OpBuffer.size();
1067 OS.
write(OpBuffer.data(), OpBuffer.size());
1072 switch (Entry.Operator) {
1073 case dwarf::DW_LLE_end_of_list:
1074 if (
Error Err = CheckOperands(0))
1075 return std::move(Err);
1077 case dwarf::DW_LLE_base_addressx:
1078 if (
Error Err = CheckOperands(1))
1079 return std::move(Err);
1082 case dwarf::DW_LLE_startx_endx:
1083 case dwarf::DW_LLE_startx_length:
1084 case dwarf::DW_LLE_offset_pair:
1085 if (
Error Err = CheckOperands(2))
1086 return std::move(Err);
1089 if (
Error Err = WriteDWARFOperations())
1090 return std::move(Err);
1092 case dwarf::DW_LLE_default_location:
1093 if (
Error Err = CheckOperands(0))
1094 return std::move(Err);
1095 if (
Error Err = WriteDWARFOperations())
1096 return std::move(Err);
1098 case dwarf::DW_LLE_base_address:
1099 if (
Error Err = CheckOperands(1))
1100 return std::move(Err);
1101 if (
Error Err = WriteAddress(Entry.Values[0]))
1102 return std::move(Err);
1104 case dwarf::DW_LLE_start_end:
1105 if (
Error Err = CheckOperands(2))
1106 return std::move(Err);
1107 if (
Error Err = WriteAddress(Entry.Values[0]))
1108 return std::move(Err);
1109 cantFail(WriteAddress(Entry.Values[1]));
1110 if (
Error Err = WriteDWARFOperations())
1111 return std::move(Err);
1113 case dwarf::DW_LLE_start_length:
1114 if (
Error Err = CheckOperands(2))
1115 return std::move(Err);
1116 if (
Error Err = WriteAddress(Entry.Values[0]))
1117 return std::move(Err);
1119 if (
Error Err = WriteDWARFOperations())
1120 return std::move(Err);
1124 return OS.
tell() - BeginOffset;
1127template <
typename EntryType>
1130 bool IsLittleEndian,
bool Is64BitAddrSize) {
1138 AddrSize = *Table.AddrSize;
1140 AddrSize = Is64BitAddrSize ? 8 : 4;
1146 std::string ListBuffer;
1152 std::vector<uint64_t> Offsets;
1155 Offsets.push_back(ListBufferOS.
tell());
1159 }
else if (
List.Entries) {
1160 for (
const EntryType &Entry : *
List.Entries) {
1175 if (Table.OffsetEntryCount)
1176 OffsetEntryCount = *Table.OffsetEntryCount;
1178 OffsetEntryCount = Table.Offsets ? Table.Offsets->size() : Offsets.size();
1202 Table.Offsets->size()),
1204 else if (OffsetEntryCount != 0)
1205 EmitOffsets(Offsets, OffsetsSize);
1207 OS.
write(ListBuffer.data(), ListBuffer.size());
1215 return writeDWARFLists<DWARFYAML::RnglistEntry>(
1221 return writeDWARFLists<DWARFYAML::LoclistEntry>(
1247 SecName +
" is not supported");
1255 StringMap<std::unique_ptr<MemoryBuffer>> &OutputBuffers) {
1261 if (
Error Err = EmitFunc(DebugInfoStream, DI))
1263 DebugInfoStream.
flush();
1272 bool Is64BitAddrSize) {
1273 auto CollectDiagnostic = [](
const SMDiagnostic &Diag,
void *DiagContext) {
1278 yaml::Input YIn(YAMLString,
nullptr, CollectDiagnostic,
1297 return std::move(Err);
1298 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