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;
110 OS.
write(AbbrevDecl.Children);
111 for (
const auto &Attr : AbbrevDecl.Attributes) {
114 if (Attr.Form == dwarf::DW_FORM_implicit_const)
131 OS.
write(AbbrevTableContent.
data(), AbbrevTableContent.
size());
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;
599 OS << static_cast<char>(
Count);
600 for (
const auto [ContentType, Form] : Format) {
620 std::vector<uint8_t> StandardOpcodeLengths =
625 : StandardOpcodeLengths.size() + 1;
627 for (
uint8_t OpcodeLength : StandardOpcodeLengths)
643 BufferOS.
write(
'\0');
645 BufferOS.
write(
'\0');
649 BufferOS.
write(
'\0');
678 OS.
write(Buffer.data(), Buffer.size());
687 if (TableEntry.AddrSize)
688 AddrSize = *TableEntry.AddrSize;
693 if (TableEntry.Length)
697 Length = 4 + (AddrSize + TableEntry.SegSelectorSize) *
698 TableEntry.SegAddrPairs.size();
705 for (
const SegAddrPair &Pair : TableEntry.SegAddrPairs) {
706 if (TableEntry.SegSelectorSize != yaml::Hex8{0})
708 TableEntry.SegSelectorSize,
711 "unable to write debug_addr segment: %s",
717 "unable to write debug_addr address: %s",
749void emitDebugNamesHeader(
raw_ostream &OS,
bool IsLittleEndian,
753 StringRef AugmentationString =
"LLVM0700";
754 size_t TotalSize = CombinedSizeOtherParts + 5 *
sizeof(
uint32_t) +
755 2 *
sizeof(
uint16_t) +
sizeof(NameCount) +
756 sizeof(AbbrevSize) + AugmentationString.
size();
769 OS.
write(AugmentationString.
data(), AugmentationString.
size());
780 for (
auto [Idx, Form] : Abbrev.Indices) {
793std::string emitDebugNamesCUOffsets(
bool IsLittleEndian) {
795 raw_string_ostream OS(
Data);
804std::string emitDebugNamesNameTable(
806 const DenseMap<uint32_t, std::vector<DWARFYAML::DebugNameEntry>> &Entries,
807 ArrayRef<uint32_t> EntryPoolOffsets) {
808 assert(Entries.size() == EntryPoolOffsets.
size());
811 raw_string_ostream OS(
Data);
815 for (uint32_t PoolOffset : EntryPoolOffsets)
821DenseMap<uint32_t, std::vector<DWARFYAML::DebugNameEntry>>
823 DenseMap<uint32_t, std::vector<DWARFYAML::DebugNameEntry>> StrpToEntries;
824 for (
const DWARFYAML::DebugNameEntry &
Entry : Entries)
825 StrpToEntries[
Entry.NameStrp].push_back(
Entry);
826 return StrpToEntries;
831Expected<SmallVector<uint8_t>>
832getNonZeroDataSizesFor(uint32_t AbbrevCode,
834 const auto *AbbrevIt =
find_if(Abbrevs, [&](
const auto &
Abbrev) {
837 if (AbbrevIt == Abbrevs.
end())
839 "did not find an Abbreviation for this code");
841 SmallVector<uint8_t> DataSizes;
843 for (
auto [Idx, Form] : AbbrevIt->Indices) {
847 "unsupported Form for YAML debug_names emitter");
855struct PoolOffsetsAndData {
856 std::string PoolData;
857 std::vector<uint32_t> PoolOffsets;
864Expected<PoolOffsetsAndData> emitDebugNamesEntryPool(
866 const DenseMap<uint32_t, std::vector<DWARFYAML::DebugNameEntry>>
869 PoolOffsetsAndData
Result;
870 raw_string_ostream OS(
Result.PoolData);
876 for (
const DWARFYAML::DebugNameEntry &
Entry : EntriesWithSameName) {
879 Expected<SmallVector<uint8_t>> DataSizes =
880 getNonZeroDataSizesFor(
Entry.Code, Abbrevs);
886 "mismatch between provided and required number of values");
913 std::string NamesTableData = emitDebugNamesNameTable(
916 std::string AbbrevData = emitDebugNamesAbbrev(
DebugNames.Abbrevs);
917 std::string CUOffsetsData = emitDebugNamesCUOffsets(DI.
IsLittleEndian);
919 size_t TotalSize = PoolInfo->PoolData.size() + NamesTableData.size() +
920 AbbrevData.size() + CUOffsetsData.size();
924 AbbrevData.size(), TotalSize);
925 OS.
write(CUOffsetsData.data(), CUOffsetsData.size());
927 OS.
write(NamesTableData.data(), NamesTableData.size());
928 OS.
write(AbbrevData.data(), AbbrevData.size());
929 OS.
write(PoolInfo->PoolData.data(), PoolInfo->PoolData.size());
937 if (Values.
size() != ExpectedOperands)
940 "invalid number (%zu) of operands for the operator: %s, %" PRIu64
942 Values.
size(), EncodingString.
str().c_str(), ExpectedOperands);
949 bool IsLittleEndian) {
952 "unable to write address for the operator %s: %s",
953 EncodingName.
str().c_str(),
959static Expected<uint64_t>
962 uint8_t AddrSize,
bool IsLittleEndian) {
963 auto CheckOperands = [&](
uint64_t ExpectedOperands) ->
Error {
971 case dwarf::DW_OP_consts:
972 if (
Error Err = CheckOperands(1))
973 return std::move(Err);
976 case dwarf::DW_OP_stack_value:
977 if (
Error Err = CheckOperands(0))
978 return std::move(Err);
983 "DWARF expression: " +
987 " is not supported");
989 return OS.
tell() - ExpressionBegin;
995 bool IsLittleEndian) {
1001 auto CheckOperands = [&](
uint64_t ExpectedOperands) ->
Error {
1010 switch (Entry.Operator) {
1011 case dwarf::DW_RLE_end_of_list:
1012 if (
Error Err = CheckOperands(0))
1013 return std::move(Err);
1015 case dwarf::DW_RLE_base_addressx:
1016 if (
Error Err = CheckOperands(1))
1017 return std::move(Err);
1020 case dwarf::DW_RLE_startx_endx:
1021 case dwarf::DW_RLE_startx_length:
1022 case dwarf::DW_RLE_offset_pair:
1023 if (
Error Err = CheckOperands(2))
1024 return std::move(Err);
1028 case dwarf::DW_RLE_base_address:
1029 if (
Error Err = CheckOperands(1))
1030 return std::move(Err);
1031 if (
Error Err = WriteAddress(Entry.Values[0]))
1032 return std::move(Err);
1034 case dwarf::DW_RLE_start_end:
1035 if (
Error Err = CheckOperands(2))
1036 return std::move(Err);
1037 if (
Error Err = WriteAddress(Entry.Values[0]))
1038 return std::move(Err);
1039 cantFail(WriteAddress(Entry.Values[1]));
1041 case dwarf::DW_RLE_start_length:
1042 if (
Error Err = CheckOperands(2))
1043 return std::move(Err);
1044 if (
Error Err = WriteAddress(Entry.Values[0]))
1045 return std::move(Err);
1050 return OS.
tell() - BeginOffset;
1056 bool IsLittleEndian) {
1062 auto CheckOperands = [&](
uint64_t ExpectedOperands) ->
Error {
1071 auto WriteDWARFOperations = [&]() ->
Error {
1072 std::string OpBuffer;
1079 DescriptionsLength += *OpSize;
1081 return OpSize.takeError();
1084 if (Entry.DescriptionsLength)
1085 DescriptionsLength = *Entry.DescriptionsLength;
1087 DescriptionsLength = OpBuffer.size();
1090 OS.
write(OpBuffer.data(), OpBuffer.size());
1095 switch (Entry.Operator) {
1096 case dwarf::DW_LLE_end_of_list:
1097 if (
Error Err = CheckOperands(0))
1098 return std::move(Err);
1100 case dwarf::DW_LLE_base_addressx:
1101 if (
Error Err = CheckOperands(1))
1102 return std::move(Err);
1105 case dwarf::DW_LLE_startx_endx:
1106 case dwarf::DW_LLE_startx_length:
1107 case dwarf::DW_LLE_offset_pair:
1108 if (
Error Err = CheckOperands(2))
1109 return std::move(Err);
1112 if (
Error Err = WriteDWARFOperations())
1113 return std::move(Err);
1115 case dwarf::DW_LLE_default_location:
1116 if (
Error Err = CheckOperands(0))
1117 return std::move(Err);
1118 if (
Error Err = WriteDWARFOperations())
1119 return std::move(Err);
1121 case dwarf::DW_LLE_base_address:
1122 if (
Error Err = CheckOperands(1))
1123 return std::move(Err);
1124 if (
Error Err = WriteAddress(Entry.Values[0]))
1125 return std::move(Err);
1127 case dwarf::DW_LLE_start_end:
1128 if (
Error Err = CheckOperands(2))
1129 return std::move(Err);
1130 if (
Error Err = WriteAddress(Entry.Values[0]))
1131 return std::move(Err);
1132 cantFail(WriteAddress(Entry.Values[1]));
1133 if (
Error Err = WriteDWARFOperations())
1134 return std::move(Err);
1136 case dwarf::DW_LLE_start_length:
1137 if (
Error Err = CheckOperands(2))
1138 return std::move(Err);
1139 if (
Error Err = WriteAddress(Entry.Values[0]))
1140 return std::move(Err);
1142 if (
Error Err = WriteDWARFOperations())
1143 return std::move(Err);
1147 return OS.
tell() - BeginOffset;
1150template <
typename EntryType>
1153 bool IsLittleEndian,
bool Is64BitAddrSize) {
1161 AddrSize = *Table.AddrSize;
1163 AddrSize = Is64BitAddrSize ? 8 : 4;
1169 std::string ListBuffer;
1175 std::vector<uint64_t> Offsets;
1178 Offsets.push_back(ListBufferOS.
tell());
1180 List.Content->writeAsBinary(ListBufferOS,
UINT64_MAX);
1181 Length += List.Content->binary_size();
1182 }
else if (List.Entries) {
1183 for (
const EntryType &Entry : *List.Entries) {
1198 if (Table.OffsetEntryCount)
1199 OffsetEntryCount = *Table.OffsetEntryCount;
1201 OffsetEntryCount = Table.Offsets ? Table.Offsets->size() : Offsets.size();
1225 Table.Offsets->size()),
1227 else if (OffsetEntryCount != 0)
1228 EmitOffsets(Offsets, OffsetsSize);
1230 OS.
write(ListBuffer.data(), ListBuffer.size());
1270 SecName +
" is not supported");
1278 StringMap<std::unique_ptr<MemoryBuffer>> &OutputBuffers) {
1284 if (
Error Err = EmitFunc(DebugInfoStream, DI))
1292Expected<StringMap<std::unique_ptr<MemoryBuffer>>>
1294 bool Is64BitAddrSize) {
1295 auto CollectDiagnostic = [](
const SMDiagnostic &Diag,
void *DiagContext) {
1300 yaml::Input YIn(YAMLString,
nullptr, CollectDiagnostic,
1319 return std::move(Err);
1320 return std::move(DebugSections);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
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 writeV5EntryFormat(raw_ostream &OS, uint8_t Count, ArrayRef< DWARFYAML::LnctForm > Format)
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.
This file contains constants used for implementing Dwarf debug support.
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
PowerPC Reduce CR logical Operation
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.
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)
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.
StringSwitch & Case(StringLiteral S, T Value)
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
static Twine utohexstr(uint64_t Val)
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.
LLVM_ABI StringRef RangeListEncodingString(unsigned Encoding)
LLVM_ABI StringRef LocListEncodingString(unsigned Encoding)
LLVM_ABI StringRef OperationEncodingString(unsigned Encoding)
LLVM_ABI Error emitDebugStrOffsets(raw_ostream &OS, const Data &DI)
LLVM_ABI Error emitDebugInfo(raw_ostream &OS, const Data &DI)
LLVM_ABI Error emitDebugRanges(raw_ostream &OS, const Data &DI)
LLVM_ABI Error emitDebugAranges(raw_ostream &OS, const Data &DI)
LLVM_ABI Error emitDebugGNUPubnames(raw_ostream &OS, const Data &DI)
LLVM_ABI Error emitDebugAbbrev(raw_ostream &OS, const Data &DI)
LLVM_ABI Error emitDebugRnglists(raw_ostream &OS, const Data &DI)
LLVM_ABI Error emitDebugLoclists(raw_ostream &OS, const Data &DI)
LLVM_ABI std::function< Error(raw_ostream &, const Data &)> getDWARFEmitterByName(StringRef SecName)
LLVM_ABI Expected< StringMap< std::unique_ptr< MemoryBuffer > > > emitDebugSections(StringRef YAMLString, bool IsLittleEndian=sys::IsLittleEndianHost, bool Is64BitAddrSize=true)
LLVM_ABI Error emitDebugGNUPubtypes(raw_ostream &OS, const Data &DI)
LLVM_ABI Error emitDebugStr(raw_ostream &OS, const Data &DI)
LLVM_ABI Error emitDebugPubnames(raw_ostream &OS, const Data &DI)
LLVM_ABI Error emitDebugAddr(raw_ostream &OS, const Data &DI)
LLVM_ABI Error emitDebugNames(raw_ostream &OS, const Data &DI)
LLVM_ABI Error emitDebugPubtypes(raw_ostream &OS, const Data &DI)
LLVM_ABI Error emitDebugLine(raw_ostream &OS, const Data &DI)
DwarfFormat
Constants that define the DWARF format as 32 or 64 bit.
LLVM_ABI 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.
constexpr bool IsLittleEndianHost
void swapByteOrder(T &Value)
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
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.
LLVM_ABI 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)
std::string utohexstr(uint64_t X, bool LowerCase=false, unsigned Width=0)
std::string utostr(uint64_t X, bool isNeg=false)
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.
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
FunctionAddr VTableAddr Count
void cantFail(Error Err, const char *Msg=nullptr)
Report a fatal error if Err is a failure value.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
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.
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 > Code
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
LLVM_ABI Expected< AbbrevTableInfo > getAbbrevTableInfoByID(uint64_t ID) const
std::optional< PubSection > GNUPubNames
std::optional< std::vector< ARange > > DebugAranges
LLVM_ABI StringRef getAbbrevTableContentByIndex(uint64_t Index) const
std::optional< PubSection > GNUPubTypes
LLVM_ABI 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::vector< FormValue > Values
uint8_t FileNameEntryFormatCount
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::vector< LnctForm > DirectoryEntryFormat
std::vector< LnctForm > FileNameEntryFormat
std::optional< std::vector< uint8_t > > StandardOpcodeLengths
uint8_t DirectoryEntryFormatCount
uint8_t SegmentSelectorSize
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