31 using namespace dwarf;
37 struct ContentDescriptor {
48 switch (ContentType) {
49 case dwarf::DW_LNCT_timestamp:
52 case dwarf::DW_LNCT_size:
55 case dwarf::DW_LNCT_MD5:
58 case dwarf::DW_LNCT_LLVM_source:
71 TotalLength = PrologueLength = 0;
73 MinInstLength = MaxOpsPerInst = DefaultIsStmt = LineBase = LineRange = 0;
77 StandardOpcodeLengths.clear();
78 IncludeDirectories.clear();
84 OS <<
"Line table prologue:\n" 85 <<
format(
" total_length: 0x%8.8" PRIx64
"\n", TotalLength)
86 <<
format(
" version: %u\n", getVersion());
87 if (getVersion() >= 5)
88 OS <<
format(
" address_size: %u\n", getAddressSize())
89 <<
format(
" seg_select_size: %u\n", SegSelectorSize);
90 OS <<
format(
" prologue_length: 0x%8.8" PRIx64
"\n", PrologueLength)
91 <<
format(
" min_inst_length: %u\n", MinInstLength)
92 <<
format(getVersion() >= 4 ?
"max_ops_per_inst: %u\n" :
"", MaxOpsPerInst)
93 <<
format(
" default_is_stmt: %u\n", DefaultIsStmt)
94 <<
format(
" line_base: %i\n", LineBase)
95 <<
format(
" line_range: %u\n", LineRange)
96 <<
format(
" opcode_base: %u\n", OpcodeBase);
98 for (
uint32_t I = 0;
I != StandardOpcodeLengths.size(); ++
I)
99 OS <<
format(
"standard_opcode_lengths[%s] = %u\n",
102 if (!IncludeDirectories.empty()) {
104 uint32_t DirBase = getVersion() >= 5 ? 0 : 1;
105 for (
uint32_t I = 0;
I != IncludeDirectories.size(); ++
I) {
106 OS <<
format(
"include_directories[%3u] = ",
I + DirBase);
107 IncludeDirectories[
I].dump(OS, DumpOptions);
112 if (!FileNames.empty()) {
114 uint32_t FileBase = getVersion() >= 5 ? 0 : 1;
117 OS <<
format(
"file_names[%3u]:\n",
I + FileBase);
119 FileEntry.
Name.
dump(OS, DumpOptions);
121 <<
format(
" dir_index: %" PRIu64
"\n", FileEntry.
DirIdx);
122 if (ContentTypes.HasMD5)
124 if (ContentTypes.HasModTime)
125 OS <<
format(
" mod_time: 0x%8.8" PRIx64
"\n", FileEntry.
ModTime);
126 if (ContentTypes.HasLength)
127 OS <<
format(
" length: 0x%8.8" PRIx64
"\n", FileEntry.
Length);
128 if (ContentTypes.HasSource) {
140 uint32_t *OffsetPtr, uint64_t EndPrologueOffset,
142 std::vector<DWARFFormValue> &IncludeDirectories,
143 std::vector<DWARFDebugLine::FileNameEntry> &FileNames) {
144 while (*OffsetPtr < EndPrologueOffset) {
150 IncludeDirectories.push_back(Dir);
153 while (*OffsetPtr < EndPrologueOffset) {
163 FileNames.push_back(FileEntry);
173 static ContentDescriptors
177 ContentDescriptors Descriptors;
178 int FormatCount = DebugLineData.
getU8(OffsetPtr);
179 bool HasPath =
false;
180 for (
int I = 0;
I != FormatCount; ++
I) {
181 if (*OffsetPtr >= EndPrologueOffset)
182 return ContentDescriptors();
183 ContentDescriptor Descriptor;
187 if (Descriptor.Type == dwarf::DW_LNCT_path)
191 Descriptors.push_back(Descriptor);
193 return HasPath ? Descriptors : ContentDescriptors();
198 uint32_t *OffsetPtr, uint64_t EndPrologueOffset,
202 std::vector<DWARFFormValue> &IncludeDirectories,
203 std::vector<DWARFDebugLine::FileNameEntry> &FileNames) {
205 ContentDescriptors DirDescriptors =
207 if (DirDescriptors.empty())
211 int DirEntryCount = DebugLineData.
getU8(OffsetPtr);
212 for (
int I = 0;
I != DirEntryCount; ++
I) {
213 if (*OffsetPtr >= EndPrologueOffset)
215 for (
auto Descriptor : DirDescriptors) {
217 switch (Descriptor.Type) {
219 if (!Value.
extractValue(DebugLineData, OffsetPtr, FormParams, &Ctx, U))
221 IncludeDirectories.push_back(Value);
224 if (!Value.
skipValue(DebugLineData, OffsetPtr, FormParams))
231 ContentDescriptors FileDescriptors =
234 if (FileDescriptors.empty())
238 int FileEntryCount = DebugLineData.
getU8(OffsetPtr);
239 for (
int I = 0;
I != FileEntryCount; ++
I) {
240 if (*OffsetPtr >= EndPrologueOffset)
243 for (
auto Descriptor : FileDescriptors) {
245 if (!Value.
extractValue(DebugLineData, OffsetPtr, FormParams, &Ctx, U))
247 switch (Descriptor.Type) {
249 FileEntry.
Name = Value;
251 case DW_LNCT_LLVM_source:
254 case DW_LNCT_directory_index:
257 case DW_LNCT_timestamp:
265 std::uninitialized_copy_n(Value.
getAsBlock().getValue().begin(), 16,
272 FileNames.push_back(FileEntry);
281 const uint64_t PrologueOffset = *OffsetPtr;
284 TotalLength = DebugLineData.
getU32(OffsetPtr);
285 if (TotalLength == UINT32_MAX) {
287 TotalLength = DebugLineData.
getU64(OffsetPtr);
288 }
else if (TotalLength >= 0xffffff00) {
290 "parsing line table prologue at offset 0x%8.8" PRIx64
291 " unsupported reserved unit length found of value 0x%8.8" PRIx64,
292 PrologueOffset, TotalLength);
295 if (getVersion() < 2)
297 "parsing line table prologue at offset 0x%8.8" PRIx64
298 " found unsupported version 0x%2.2" PRIx16,
299 PrologueOffset, getVersion());
301 if (getVersion() >= 5) {
305 "Line table header and data extractor disagree");
306 SegSelectorSize = DebugLineData.
getU8(OffsetPtr);
309 PrologueLength = DebugLineData.
getUnsigned(OffsetPtr, sizeofPrologueLength());
310 const uint64_t EndPrologueOffset = PrologueLength + *OffsetPtr;
311 MinInstLength = DebugLineData.
getU8(OffsetPtr);
312 if (getVersion() >= 4)
313 MaxOpsPerInst = DebugLineData.
getU8(OffsetPtr);
314 DefaultIsStmt = DebugLineData.
getU8(OffsetPtr);
315 LineBase = DebugLineData.
getU8(OffsetPtr);
316 LineRange = DebugLineData.
getU8(OffsetPtr);
317 OpcodeBase = DebugLineData.
getU8(OffsetPtr);
319 StandardOpcodeLengths.reserve(OpcodeBase - 1);
321 uint8_t OpLen = DebugLineData.
getU8(OffsetPtr);
322 StandardOpcodeLengths.push_back(OpLen);
325 if (getVersion() >= 5) {
328 IncludeDirectories, FileNames)) {
330 "parsing line table prologue at 0x%8.8" PRIx64
331 " found an invalid directory or file table description at" 333 PrologueOffset, (uint64_t)*OffsetPtr);
337 ContentTypes, IncludeDirectories, FileNames);
339 if (*OffsetPtr != EndPrologueOffset)
341 "parsing line table prologue at 0x%8.8" PRIx64
342 " should have ended at 0x%8.8" PRIx64
343 " but it ended at 0x%8.8" PRIx64,
344 PrologueOffset, EndPrologueOffset, (uint64_t)*OffsetPtr);
353 EpilogueBegin =
false;
363 IsStmt = DefaultIsStmt;
367 EpilogueBegin =
false;
371 OS <<
"Address Line Column File ISA Discriminator Flags\n" 372 <<
"------------------ ------ ------ ------ --- ------------- " 377 OS <<
format(
"0x%16.16" PRIx64
" %6u %6u",
Address, Line, Column)
378 <<
format(
" %6u %3u %13u ",
File, Isa, Discriminator)
379 << (IsStmt ?
" is_stmt" :
"") << (
BasicBlock ?
" basic_block" :
"")
380 << (PrologueEnd ?
" prologue_end" :
"")
381 << (EpilogueBegin ?
" epilogue_begin" :
"")
382 << (EndSequence ?
" end_sequence" :
"") <<
'\n';
403 Row::dumpTableHeader(OS);
404 for (
const Row &R : Rows) {
416 DWARFDebugLine::ParsingState::ParsingState(
struct LineTable *
LT)
418 resetRowAndSequence();
421 void DWARFDebugLine::ParsingState::resetRowAndSequence() {
426 void DWARFDebugLine::ParsingState::appendRowToMatrix(
uint32_t Offset) {
448 LineTableConstIter Pos = LineTableMap.find(Offset);
449 if (Pos != LineTableMap.end())
459 " is not a valid debug line section offset",
462 std::pair<LineTableIter, bool> Pos =
463 LineTableMap.insert(LineTableMapTy::value_type(Offset,
LineTable()));
467 LT->
parse(DebugLineData, &Offset, Ctx, U, RecoverableErrorCallback))
468 return std::move(Err);
478 const uint32_t DebugLineOffset = *OffsetPtr;
504 ParsingState State(
this);
506 while (*OffsetPtr < EndOffset) {
508 *OS <<
format(
"0x%08.08" PRIx32
": ", *OffsetPtr);
510 uint8_t Opcode = DebugLineData.
getU8(OffsetPtr);
513 *OS <<
format(
"%02.02" PRIx8
" ", Opcode);
518 uint64_t Len = DebugLineData.
getULEB128(OffsetPtr);
524 *OS <<
"Badly formed extended line op (length 0)\n";
528 uint8_t SubOpcode = DebugLineData.
getU8(OffsetPtr);
532 case DW_LNE_end_sequence:
540 State.Row.EndSequence =
true;
541 State.appendRowToMatrix(*OffsetPtr);
547 State.resetRowAndSequence();
550 case DW_LNE_set_address:
564 "mismatching address size at offset 0x%8.8" PRIx32
565 " expected 0x%2.2" PRIx8
" found 0x%2.2" PRIx64,
571 *OS <<
format(
" (0x%16.16" PRIx64
")", State.Row.Address);
574 case DW_LNE_define_file:
597 const char *
Name = DebugLineData.
getCStr(OffsetPtr);
605 *OS <<
" (" << Name <<
", dir=" << FileEntry.
DirIdx <<
", mod_time=" 607 <<
", length=" << FileEntry.
Length <<
")";
611 case DW_LNE_set_discriminator:
612 State.Row.Discriminator = DebugLineData.
getULEB128(OffsetPtr);
614 *OS <<
" (" << State.Row.Discriminator <<
")";
619 *OS <<
format(
"Unrecognized extended op 0x%02.02" PRIx8, SubOpcode)
620 <<
format(
" length %" PRIx64, Len);
623 (*OffsetPtr) += Len - 1;
628 if (*OffsetPtr - ExtOffset != Len)
630 "unexpected line op length at offset 0x%8.8" PRIx32
631 " expected 0x%2.2" PRIx64
" found 0x%2.2" PRIx32,
632 ExtOffset, Len, *OffsetPtr - ExtOffset);
642 State.appendRowToMatrix(*OffsetPtr);
651 case DW_LNS_advance_pc:
656 uint64_t AddrOffset =
658 State.Row.Address += AddrOffset;
660 *OS <<
" (" << AddrOffset <<
")";
664 case DW_LNS_advance_line:
667 State.Row.Line += DebugLineData.
getSLEB128(OffsetPtr);
669 *OS <<
" (" << State.Row.Line <<
")";
672 case DW_LNS_set_file:
675 State.Row.File = DebugLineData.
getULEB128(OffsetPtr);
677 *OS <<
" (" << State.Row.File <<
")";
680 case DW_LNS_set_column:
683 State.Row.Column = DebugLineData.
getULEB128(OffsetPtr);
685 *OS <<
" (" << State.Row.Column <<
")";
688 case DW_LNS_negate_stmt:
691 State.Row.IsStmt = !State.Row.IsStmt;
694 case DW_LNS_set_basic_block:
697 State.Row.BasicBlock =
true;
700 case DW_LNS_const_add_pc:
714 uint64_t AddrOffset =
716 State.Row.Address += AddrOffset;
719 <<
format(
" (0x%16.16" PRIx64
")", AddrOffset);
723 case DW_LNS_fixed_advance_pc:
734 uint16_t PCOffset = DebugLineData.
getU16(OffsetPtr);
735 State.Row.Address += PCOffset;
738 <<
format(
" (0x%16.16" PRIx64
")", PCOffset);
742 case DW_LNS_set_prologue_end:
745 State.Row.PrologueEnd =
true;
748 case DW_LNS_set_epilogue_begin:
751 State.Row.EpilogueBegin =
true;
757 State.Row.Isa = DebugLineData.
getULEB128(OffsetPtr);
759 *OS <<
" (" << State.Row.Isa <<
")";
769 for (uint8_t
I = 0;
I < OpcodeLength; ++
I) {
772 *OS <<
format(
"Skipping ULEB128 value: 0x%16.16" PRIx64
")\n",
813 uint64_t AddrOffset =
817 State.Row.Line += LineOffset;
818 State.Row.Address += AddrOffset;
821 *OS <<
"address += " << ((
uint32_t)AdjustOpcode)
822 <<
", line += " << LineOffset <<
"\n";
827 State.appendRowToMatrix(*OffsetPtr);
829 State.Row.Discriminator = 0;
835 if (!State.Sequence.Empty)
836 RecoverableErrorCallback(
838 "last sequence in debug line table is not terminated!"));
841 if (!Sequences.empty()) {
842 llvm::sort(Sequences, Sequence::orderByLowPC);
858 return UnknownRowIndex;
868 if (RowPos == LastRow) {
872 if (RowPos->Address > Address) {
873 if (RowPos == FirstRow)
874 return UnknownRowIndex;
882 if (Sequences.empty())
883 return UnknownRowIndex;
886 Sequence.
LowPC = Address;
892 if (SeqPos == LastSeq) {
893 FoundSeq = Sequences.back();
894 }
else if (SeqPos->LowPC == Address) {
897 if (SeqPos == FirstSeq)
898 return UnknownRowIndex;
899 FoundSeq = *(SeqPos - 1);
901 return findRowInSeq(FoundSeq, Address);
905 uint64_t Address, uint64_t
Size, std::vector<uint32_t> &Result)
const {
906 if (Sequences.empty())
908 uint64_t EndAddr = Address +
Size;
911 Sequence.
LowPC = Address;
916 if (SeqPos == LastSeq || SeqPos->LowPC != Address) {
917 if (SeqPos == FirstSeq)
921 if (!SeqPos->containsPC(Address))
929 while (SeqPos != LastSeq && SeqPos->LowPC < EndAddr) {
934 if (SeqPos == StartPos)
935 FirstRowIndex = findRowInSeq(CurSeq, Address);
938 uint32_t LastRowIndex = findRowInSeq(CurSeq, EndAddr - 1);
939 if (LastRowIndex == UnknownRowIndex)
942 assert(FirstRowIndex != UnknownRowIndex);
943 assert(LastRowIndex != UnknownRowIndex);
945 for (
uint32_t I = FirstRowIndex;
I <= LastRowIndex; ++
I) {
980 std::string &Result)
const {
985 if (Kind != FileLineInfoKind::AbsoluteFilePath ||
992 uint64_t IncludeDirIndex = Entry.
DirIdx;
995 if (IncludeDirIndex > 0 &&
1004 if (CompDir && Kind == FileLineInfoKind::AbsoluteFilePath &&
1010 Result = FilePath.
str();
1018 uint32_t RowIndex = lookupAddress(Address);
1019 if (RowIndex == -1U)
1022 const auto &
Row = Rows[RowIndex];
1040 for (
const auto &
CU : CUs)
1041 if (
auto CUDIE =
CU->getUnitDIE())
1043 LineToUnit.insert(std::make_pair(*StmtOffset, &*
CU));
1044 for (
const auto &TU : TUs)
1045 if (
auto TUDIE = TU->getUnitDIE())
1047 LineToUnit.insert(std::make_pair(*StmtOffset, &*TU));
1054 : DebugLineData(Data),
Context(C) {
1061 return TotalLength == 0xffffffff || TotalLength < 0xffffff00;
1068 "parsing should have terminated");
1072 if (
Error Err = LT.
parse(DebugLineData, &Offset, Context, U,
1073 RecoverableErrorCallback, OS))
1074 UnrecoverableErrorCallback(std::move(Err));
1075 moveToNextTable(OldOffset, LT.
Prologue);
1082 "parsing should have terminated");
1087 ErrorCallback(std::move(Err));
1088 moveToNextTable(OldOffset, LT.
Prologue);
1093 auto It = LineToUnit.find(Offset);
1094 if (It != LineToUnit.end())
1100 void DWARFDebugLine::SectionParser::moveToNextTable(
uint32_t OldOffset,
SequenceVector::const_iterator SequenceIter
Optional< StringRef > Source
uint64_t LowPC
Sequence describes instructions at address range [LowPC, HighPC) and is described by line table rows ...
uint8_t getAddressSize() const
This class represents lattice values for constants.
Row(bool DefaultIsStmt=false)
uint32_t sizeofTotalLength() const
SmallString< 32 > digest() const
StringRef LNExtendedString(unsigned Encoding)
static bool orderByAddress(const Row &LHS, const Row &RHS)
StringRef LNStandardString(unsigned Standard)
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
uint8_t MinInstLength
The size in bytes of the smallest target machine instruction.
An efficient, type-erasing, non-owning reference to a callable.
uint32_t Line
An unsigned integer indicating a source line number.
SectionParser(DWARFDataExtractor &Data, const DWARFContext &C, cu_range CUs, tu_range TUs)
void dump(raw_ostream &OS, DIDumpOptions DumpOptions) const
Error parse(const DWARFDataExtractor &DebugLineData, uint32_t *OffsetPtr, const DWARFContext &Ctx, const DWARFUnit *U=nullptr)
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
std::vector< DWARFFormValue > IncludeDirectories
A format-neutral container for source line information.
void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
amdgpu Simplify well known AMD library false Value Value const Twine & Name
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Represents a series of contiguous machine instructions.
uint64_t Address
The program-counter value corresponding to a machine instruction generated by the compiler...
bool hasFileAtIndex(uint64_t FileIndex) const
void postAppend()
Called after a row is appended to the matrix.
bool is_absolute(const Twine &path, Style style=Style::native)
Is path absolute?
Tagged union holding either a T or a Error.
uint32_t lookupAddress(uint64_t Address) const
Returns the index of the row with file/line info for a given address, or UnknownRowIndex if there is ...
uint8_t LineRange
This parameter affects the meaning of the special opcodes. See below.
uint8_t getAddressByteSize() const
StringRef str() const
Explicit conversion to StringRef.
uint8_t OpcodeBase
The number assigned to the first special opcode.
void reset(bool DefaultIsStmt)
const T & getValue() const LLVM_LVALUE_FUNCTION
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE bool empty() const
empty - Check if the string is empty.
uint64_t TotalLength
The size in bytes of the statement information for this compilation unit (not including the total_len...
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
auto lower_bound(R &&Range, ForwardIt I) -> decltype(adl_begin(Range))
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
bool HasModTime
Whether filename entries provide a modification timestamp.
Expected< const LineTable * > getOrParseLineTable(DWARFDataExtractor &DebugLineData, uint32_t Offset, const DWARFContext &Ctx, const DWARFUnit *U, std::function< void(Error)> RecoverableErrorCallback)
Container for dump options that control which debug information will be dumped.
Optional< uint64_t > toSectionOffset(const Optional< DWARFFormValue > &V)
Take an optional DWARFFormValue and try to extract an section offset.
uint8_t EndSequence
A boolean indicating that the current address is that of the first byte after the end of a sequence o...
* if(!EatIfPresent(lltok::kw_thread_local)) return false
ParseOptionalThreadLocal := /*empty.
void dump(raw_ostream &OS) const
LLVM Basic Block Representation.
The instances of the Type class are immutable: once they are created, they are never changed...
LineTable parseNext(function_ref< void(Error)> RecoverableErrorCallback, function_ref< void(Error)> UnrecoverableErrorCallback, raw_ostream *OS=nullptr)
Get the next line table from the section.
uint16_t File
An unsigned integer indicating the identity of the source file corresponding to a machine instruction...
bool totalLengthIsValid() const
bool HasLength
Whether filename entries provide a file size.
Error parse(DWARFDataExtractor &DebugLineData, uint32_t *OffsetPtr, const DWARFContext &Ctx, const DWARFUnit *U, std::function< void(Error)> RecoverableErrorCallback, raw_ostream *OS=nullptr)
Parse prologue and all rows.
static ContentDescriptors parseV5EntryFormat(const DWARFDataExtractor &DebugLineData, uint32_t *OffsetPtr, uint64_t EndPrologueOffset, DWARFDebugLine::ContentTypeTracker *ContentTypes)
void appendSequence(const DWARFDebugLine::Sequence &S)
void dump(raw_ostream &OS, DIDumpOptions DumpOptions) const
Standard .debug_line state machine structure.
void sort(IteratorTy Start, IteratorTy End)
bool lookupAddressRange(uint64_t Address, uint64_t Size, std::vector< uint32_t > &Result) const
bool containsPC(uint64_t PC) const
static bool parseV5DirFileTables(const DWARFDataExtractor &DebugLineData, uint32_t *OffsetPtr, uint64_t EndPrologueOffset, const dwarf::FormParams &FormParams, const DWARFContext &Ctx, const DWARFUnit *U, DWARFDebugLine::ContentTypeTracker &ContentTypes, std::vector< DWARFFormValue > &IncludeDirectories, std::vector< DWARFDebugLine::FileNameEntry > &FileNames)
uint16_t Column
An unsigned integer indicating a column number within a source line.
static ErrorSuccess success()
Create a success value.
static DWARFDebugLine::SectionParser::LineToUnitMap buildLineToUnitMap(DWARFDebugLine::SectionParser::cu_range CUs, DWARFDebugLine::SectionParser::tu_range TUs)
std::map< uint64_t, DWARFUnit * > LineToUnitMap
bool getFileLineInfoForAddress(uint64_t Address, const char *CompDir, DILineInfoSpecifier::FileLineInfoKind Kind, DILineInfo &Result) const
Fills the Result argument with the file and line information corresponding to Address.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
void appendRow(const DWARFDebugLine::Row &R)
DWARFContext This data structure is the top level entity that deals with dwarf debug information pars...
static void dumpTableHeader(raw_ostream &OS)
std::vector< uint8_t > StandardOpcodeLengths
A range adaptor for a pair of iterators.
This file contains constants used for implementing Dwarf debug support.
static void clear(coro::Shape &Shape)
Tracks which optional content types are present in a DWARF file name entry format.
std::vector< FileNameEntry > FileNames
uint32_t Discriminator
An unsigned integer representing the DWARF path discriminator value for this location.
RowVector::const_iterator RowIter
static bool orderByLowPC(const Sequence &LHS, const Sequence &RHS)
Sequence
A sequence of states that a pointer may go through in which an objc_retain and objc_release are actua...
uint8_t DefaultIsStmt
The initial value of theis_stmtregister.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
std::array< uint8_t, 16 > Bytes
static bool isPathAbsoluteOnWindowsOrPosix(const Twine &Path)
int8_t LineBase
This parameter affects the meaning of the special opcodes. See below.
bool getFileNameByIndex(uint64_t FileIndex, const char *CompDir, DILineInfoSpecifier::FileLineInfoKind Kind, std::string &Result) const
Extracts filename by its index in filename table in prologue.
const LineTable * getLineTable(uint32_t Offset) const
LLVM Value Representation.
Lightweight error class with error context and mandatory checking.
This class implements an extremely fast bulk output stream that can only output to a stream...
static void parseV2DirFileTables(const DWARFDataExtractor &DebugLineData, uint32_t *OffsetPtr, uint64_t EndPrologueOffset, DWARFDebugLine::ContentTypeTracker &ContentTypes, std::vector< DWARFFormValue > &IncludeDirectories, std::vector< DWARFDebugLine::FileNameEntry > &FileNames)
print Print MemDeps of function
StringRef - Represent a constant reference to a string, i.e.
void skip(function_ref< void(Error)> ErrorCallback)
Skip the current line table and go to the following line table (if present) immediately.
void trackContentType(dwarf::LineNumberEntryFormat ContentType)
Update tracked content types with ContentType.
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.