Skip to content

Commit

Permalink
[DebugInfo] Move function from line table to the prologue (NFC)
Browse files Browse the repository at this point in the history
In LLDB, when parsing type units, we don't need to parse the whole line
table. Instead, we only need to parse the "support files" from the line
table prologue.

To make that possible, this patch moves the respective functions from
the LineTable into the Prologue. Because I don't think users of the
LineTable should have to know that these files come from the Prologue,

I've left the original methods in place, and made them redirect to the
LineTable.

Differential revision: https://reviews.llvm.org/D64774

llvm-svn: 366158
  • Loading branch information
JDevlieghere committed Jul 16, 2019
1 parent bf20b2a commit 509903e
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 42 deletions.
26 changes: 18 additions & 8 deletions llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h
Expand Up @@ -121,6 +121,17 @@ class DWARFDebugLine {
return LineBase + (int8_t)LineRange - 1;
}

/// Get DWARF-version aware access to the file name entry at the provided
/// index.
const llvm::DWARFDebugLine::FileNameEntry &
getFileNameEntry(uint64_t Index) const;

bool hasFileAtIndex(uint64_t FileIndex) const;

bool getFileNameByIndex(uint64_t FileIndex, StringRef CompDir,
DILineInfoSpecifier::FileLineInfoKind Kind,
std::string &Result) const;

void clear();
void dump(raw_ostream &OS, DIDumpOptions DumpOptions) const;
Error parse(const DWARFDataExtractor &DebugLineData, uint32_t *OffsetPtr,
Expand Down Expand Up @@ -240,16 +251,20 @@ class DWARFDebugLine {
bool lookupAddressRange(object::SectionedAddress Address, uint64_t Size,
std::vector<uint32_t> &Result) const;

bool hasFileAtIndex(uint64_t FileIndex) const;
bool hasFileAtIndex(uint64_t FileIndex) const {
return Prologue.hasFileAtIndex(FileIndex);
}

/// Extracts filename by its index in filename table in prologue.
/// In Dwarf 4, the files are 1-indexed and the current compilation file
/// name is not represented in the list. In DWARF v5, the files are
/// 0-indexed and the primary source file has the index 0.
/// Returns true on success.
bool getFileNameByIndex(uint64_t FileIndex, const char *CompDir,
bool getFileNameByIndex(uint64_t FileIndex, StringRef CompDir,
DILineInfoSpecifier::FileLineInfoKind Kind,
std::string &Result) const;
std::string &Result) const {
return Prologue.getFileNameByIndex(FileIndex, CompDir, Kind, Result);
}

/// Fills the Result argument with the file and line information
/// corresponding to Address. Returns true on success.
Expand All @@ -268,11 +283,6 @@ class DWARFDebugLine {
std::function<void(Error)> RecoverableErrorCallback,
raw_ostream *OS = nullptr);

/// Get DWARF-version aware access to the file name entry at the provided
/// index.
const llvm::DWARFDebugLine::FileNameEntry &
getFileNameEntry(uint64_t Index) const;

using RowVector = std::vector<Row>;
using RowIter = RowVector::const_iterator;
using SequenceVector = std::vector<Sequence>;
Expand Down
67 changes: 33 additions & 34 deletions llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
Expand Up @@ -66,6 +66,26 @@ void DWARFDebugLine::ContentTypeTracker::trackContentType(

DWARFDebugLine::Prologue::Prologue() { clear(); }

bool DWARFDebugLine::Prologue::hasFileAtIndex(uint64_t FileIndex) const {
uint16_t DwarfVersion = getVersion();
assert(DwarfVersion != 0 &&
"line table prologue has no dwarf version information");
if (DwarfVersion >= 5)
return FileIndex < FileNames.size();
return FileIndex != 0 && FileIndex <= FileNames.size();
}

const llvm::DWARFDebugLine::FileNameEntry &
DWARFDebugLine::Prologue::getFileNameEntry(uint64_t Index) const {
uint16_t DwarfVersion = getVersion();
assert(DwarfVersion != 0 &&
"line table prologue has no dwarf version information");
// In DWARF v5 the file names are 0-indexed.
if (DwarfVersion >= 5)
return FileNames[Index];
return FileNames[Index - 1];
}

void DWARFDebugLine::Prologue::clear() {
TotalLength = PrologueLength = 0;
SegSelectorSize = 0;
Expand Down Expand Up @@ -968,30 +988,11 @@ bool DWARFDebugLine::LineTable::lookupAddressRangeImpl(
return true;
}

bool DWARFDebugLine::LineTable::hasFileAtIndex(uint64_t FileIndex) const {
uint16_t DwarfVersion = Prologue.getVersion();
assert(DwarfVersion != 0 && "LineTable has no dwarf version information");
if (DwarfVersion >= 5)
return FileIndex < Prologue.FileNames.size();
return FileIndex != 0 && FileIndex <= Prologue.FileNames.size();
}

const llvm::DWARFDebugLine::FileNameEntry &
DWARFDebugLine::LineTable::getFileNameEntry(uint64_t Index) const {
uint16_t DwarfVersion = Prologue.getVersion();
assert(DwarfVersion != 0 && "LineTable has no dwarf version information");
// In DWARF v5 the file names are 0-indexed.
if (DwarfVersion >= 5)
return Prologue.FileNames[Index];
else
return Prologue.FileNames[Index - 1];
}

Optional<StringRef> DWARFDebugLine::LineTable::getSourceByIndex(uint64_t FileIndex,
FileLineInfoKind Kind) const {
if (Kind == FileLineInfoKind::None || !hasFileAtIndex(FileIndex))
if (Kind == FileLineInfoKind::None || !Prologue.hasFileAtIndex(FileIndex))
return None;
const FileNameEntry &Entry = getFileNameEntry(FileIndex);
const FileNameEntry &Entry = Prologue.getFileNameEntry(FileIndex);
if (Optional<const char *> source = Entry.Source.getAsCString())
return StringRef(*source);
return None;
Expand All @@ -1005,10 +1006,10 @@ static bool isPathAbsoluteOnWindowsOrPosix(const Twine &Path) {
sys::path::is_absolute(Path, sys::path::Style::windows);
}

bool DWARFDebugLine::LineTable::getFileNameByIndex(uint64_t FileIndex,
const char *CompDir,
FileLineInfoKind Kind,
std::string &Result) const {
bool DWARFDebugLine::Prologue::getFileNameByIndex(uint64_t FileIndex,
StringRef CompDir,
FileLineInfoKind Kind,
std::string &Result) const {
if (Kind == FileLineInfoKind::None || !hasFileAtIndex(FileIndex))
return false;
const FileNameEntry &Entry = getFileNameEntry(FileIndex);
Expand All @@ -1022,20 +1023,18 @@ bool DWARFDebugLine::LineTable::getFileNameByIndex(uint64_t FileIndex,
SmallString<16> FilePath;
StringRef IncludeDir;
// Be defensive about the contents of Entry.
if (Prologue.getVersion() >= 5) {
if (Entry.DirIdx < Prologue.IncludeDirectories.size())
IncludeDir =
Prologue.IncludeDirectories[Entry.DirIdx].getAsCString().getValue();
if (getVersion() >= 5) {
if (Entry.DirIdx < IncludeDirectories.size())
IncludeDir = IncludeDirectories[Entry.DirIdx].getAsCString().getValue();
} else {
if (0 < Entry.DirIdx && Entry.DirIdx <= Prologue.IncludeDirectories.size())
IncludeDir = Prologue.IncludeDirectories[Entry.DirIdx - 1]
.getAsCString()
.getValue();
if (0 < Entry.DirIdx && Entry.DirIdx <= IncludeDirectories.size())
IncludeDir =
IncludeDirectories[Entry.DirIdx - 1].getAsCString().getValue();

// We may still need to append compilation directory of compile unit.
// We know that FileName is not absolute, the only way to have an
// absolute path at this point would be if IncludeDir is absolute.
if (CompDir && !isPathAbsoluteOnWindowsOrPosix(IncludeDir))
if (!CompDir.empty() && !isPathAbsoluteOnWindowsOrPosix(IncludeDir))
sys::path::append(FilePath, CompDir);
}

Expand Down

0 comments on commit 509903e

Please sign in to comment.