Skip to content

Commit

Permalink
Cleanup the plumbing for DILineInfoSpecifier. [NFC]
Browse files Browse the repository at this point in the history
Summary:
1. FileLineInfoSpecifier::Default isn't the default for anything.
Rename to RawValue, which accurately reflects its role.
2. Most functions that take a part of a FileLineInfoSpecifier end up
constructing a full one later or plumb two values through. Make them
all just take a complete FileLineInfoSpecifier.
3. Printing basenames only was handled differently from all other
variants, make it parallel to all the other variants.

Reviewers: jhenderson

Subscribers: hiraditya, MaskRay, rupprecht, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D76394
  • Loading branch information
Sterling-Augustine committed Mar 19, 2020
1 parent c999084 commit 98ff6eb
Show file tree
Hide file tree
Showing 11 changed files with 44 additions and 33 deletions.
8 changes: 6 additions & 2 deletions llvm/include/llvm/DebugInfo/DIContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,11 @@ enum class DINameKind { None, ShortName, LinkageName };
struct DILineInfoSpecifier {
enum class FileLineInfoKind {
None,
Default,
// RawValue is whatever the compiler stored in the filename table. Could be
// a full path, could be something else.
RawValue,
BaseNameOnly,
// Relative to the compilation directory.
RelativeFilePath,
AbsoluteFilePath
};
Expand All @@ -145,7 +149,7 @@ struct DILineInfoSpecifier {
FileLineInfoKind FLIKind;
FunctionNameKind FNKind;

DILineInfoSpecifier(FileLineInfoKind FLIKind = FileLineInfoKind::Default,
DILineInfoSpecifier(FileLineInfoKind FLIKind = FileLineInfoKind::RawValue,
FunctionNameKind FNKind = FunctionNameKind::None)
: FLIKind(FLIKind), FNKind(FNKind) {}
};
Expand Down
8 changes: 3 additions & 5 deletions llvm/include/llvm/DebugInfo/Symbolize/DIPrinter.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#ifndef LLVM_DEBUGINFO_SYMBOLIZE_DIPRINTER_H
#define LLVM_DEBUGINFO_SYMBOLIZE_DIPRINTER_H

#include "llvm/DebugInfo/DIContext.h"
#include "llvm/Support/raw_ostream.h"

namespace llvm {
Expand All @@ -34,7 +35,6 @@ class DIPrinter {
bool PrintPretty;
int PrintSourceContext;
bool Verbose;
bool Basenames;
OutputStyle Style;

void print(const DILineInfo &Info, bool Inlined);
Expand All @@ -43,11 +43,10 @@ class DIPrinter {
public:
DIPrinter(raw_ostream &OS, bool PrintFunctionNames = true,
bool PrintPretty = false, int PrintSourceContext = 0,
bool Verbose = false, bool Basenames = false,
OutputStyle Style = OutputStyle::LLVM)
bool Verbose = false, OutputStyle Style = OutputStyle::LLVM)
: OS(OS), PrintFunctionNames(PrintFunctionNames),
PrintPretty(PrintPretty), PrintSourceContext(PrintSourceContext),
Verbose(Verbose), Basenames(Basenames), Style(Style) {}
Verbose(Verbose), Style(Style) {}

DIPrinter &operator<<(const DILineInfo &Info);
DIPrinter &operator<<(const DIInliningInfo &Info);
Expand All @@ -58,4 +57,3 @@ class DIPrinter {
}

#endif

5 changes: 3 additions & 2 deletions llvm/include/llvm/DebugInfo/Symbolize/SymbolizableModule.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,12 @@ class SymbolizableModule {
virtual ~SymbolizableModule() = default;

virtual DILineInfo symbolizeCode(object::SectionedAddress ModuleOffset,
FunctionNameKind FNKind,
DILineInfoSpecifier LineInfoSpecifier,
bool UseSymbolTable) const = 0;
virtual DIInliningInfo
symbolizeInlinedCode(object::SectionedAddress ModuleOffset,
FunctionNameKind FNKind, bool UseSymbolTable) const = 0;
DILineInfoSpecifier LineInfoSpecifier,
bool UseSymbolTable) const = 0;
virtual DIGlobal
symbolizeData(object::SectionedAddress ModuleOffset) const = 0;
virtual std::vector<DILocal>
Expand Down
2 changes: 2 additions & 0 deletions llvm/include/llvm/DebugInfo/Symbolize/Symbolize.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,13 @@ namespace symbolize {
using namespace object;

using FunctionNameKind = DILineInfoSpecifier::FunctionNameKind;
using FileLineInfoKind = DILineInfoSpecifier::FileLineInfoKind;

class LLVMSymbolizer {
public:
struct Options {
FunctionNameKind PrintFunctions = FunctionNameKind::LinkageName;
FileLineInfoKind PathStyle = FileLineInfoKind::AbsoluteFilePath;
bool UseSymbolTable = true;
bool Demangle = true;
bool RelativeAddresses = false;
Expand Down
6 changes: 5 additions & 1 deletion llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1209,11 +1209,15 @@ bool DWARFDebugLine::Prologue::getFileNameByIndex(
if (!Name)
return false;
StringRef FileName = *Name;
if (Kind == FileLineInfoKind::Default ||
if (Kind == FileLineInfoKind::RawValue ||
isPathAbsoluteOnWindowsOrPosix(FileName)) {
Result = std::string(FileName);
return true;
}
if (Kind == FileLineInfoKind::BaseNameOnly) {
Result = std::string(llvm::sys::path::filename(FileName));
return true;
}

SmallString<16> FilePath;
StringRef IncludeDir;
Expand Down
2 changes: 0 additions & 2 deletions llvm/lib/DebugInfo/Symbolize/DIPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,6 @@ void DIPrinter::print(const DILineInfo &Info, bool Inlined) {
std::string Filename = Info.FileName;
if (Filename == DILineInfo::BadString)
Filename = DILineInfo::Addr2LineBadString;
else if (Basenames)
Filename = std::string(llvm::sys::path::filename(Filename));
if (!Verbose) {
OS << Filename << ":" << Info.Line;
if (Style == OutputStyle::LLVM)
Expand Down
22 changes: 8 additions & 14 deletions llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,6 @@ using namespace llvm;
using namespace object;
using namespace symbolize;

static DILineInfoSpecifier
getDILineInfoSpecifier(FunctionNameKind FNKind) {
return DILineInfoSpecifier(
DILineInfoSpecifier::FileLineInfoKind::AbsoluteFilePath, FNKind);
}

ErrorOr<std::unique_ptr<SymbolizableObjectFile>>
SymbolizableObjectFile::create(const object::ObjectFile *Obj,
std::unique_ptr<DIContext> DICtx,
Expand Down Expand Up @@ -251,16 +245,16 @@ bool SymbolizableObjectFile::shouldOverrideWithSymbolTable(

DILineInfo
SymbolizableObjectFile::symbolizeCode(object::SectionedAddress ModuleOffset,
FunctionNameKind FNKind,
DILineInfoSpecifier LineInfoSpecifier,
bool UseSymbolTable) const {
if (ModuleOffset.SectionIndex == object::SectionedAddress::UndefSection)
ModuleOffset.SectionIndex =
getModuleSectionIndexForAddress(ModuleOffset.Address);
DILineInfo LineInfo = DebugInfoContext->getLineInfoForAddress(
ModuleOffset, getDILineInfoSpecifier(FNKind));
DILineInfo LineInfo =
DebugInfoContext->getLineInfoForAddress(ModuleOffset, LineInfoSpecifier);

// Override function name from symbol table if necessary.
if (shouldOverrideWithSymbolTable(FNKind, UseSymbolTable)) {
if (shouldOverrideWithSymbolTable(LineInfoSpecifier.FNKind, UseSymbolTable)) {
std::string FunctionName;
uint64_t Start, Size;
if (getNameFromSymbolTable(SymbolRef::ST_Function, ModuleOffset.Address,
Expand All @@ -272,20 +266,20 @@ SymbolizableObjectFile::symbolizeCode(object::SectionedAddress ModuleOffset,
}

DIInliningInfo SymbolizableObjectFile::symbolizeInlinedCode(
object::SectionedAddress ModuleOffset, FunctionNameKind FNKind,
bool UseSymbolTable) const {
object::SectionedAddress ModuleOffset,
DILineInfoSpecifier LineInfoSpecifier, bool UseSymbolTable) const {
if (ModuleOffset.SectionIndex == object::SectionedAddress::UndefSection)
ModuleOffset.SectionIndex =
getModuleSectionIndexForAddress(ModuleOffset.Address);
DIInliningInfo InlinedContext = DebugInfoContext->getInliningInfoForAddress(
ModuleOffset, getDILineInfoSpecifier(FNKind));
ModuleOffset, LineInfoSpecifier);

// Make sure there is at least one frame in context.
if (InlinedContext.getNumberOfFrames() == 0)
InlinedContext.addFrame(DILineInfo());

// Override the function name in lower frame with name from symbol table.
if (shouldOverrideWithSymbolTable(FNKind, UseSymbolTable)) {
if (shouldOverrideWithSymbolTable(LineInfoSpecifier.FNKind, UseSymbolTable)) {
std::string FunctionName;
uint64_t Start, Size;
if (getNameFromSymbolTable(SymbolRef::ST_Function, ModuleOffset.Address,
Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,10 @@ class SymbolizableObjectFile : public SymbolizableModule {
bool UntagAddresses);

DILineInfo symbolizeCode(object::SectionedAddress ModuleOffset,
FunctionNameKind FNKind,
DILineInfoSpecifier LineInfoSpecifier,
bool UseSymbolTable) const override;
DIInliningInfo symbolizeInlinedCode(object::SectionedAddress ModuleOffset,
FunctionNameKind FNKind,
DILineInfoSpecifier LineInfoSpecifier,
bool UseSymbolTable) const override;
DIGlobal symbolizeData(object::SectionedAddress ModuleOffset) const override;
std::vector<DILocal>
Expand Down
8 changes: 5 additions & 3 deletions llvm/lib/DebugInfo/Symbolize/Symbolize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,9 @@ LLVMSymbolizer::symbolizeCodeCommon(SymbolizableModule *Info,
if (Opts.RelativeAddresses)
ModuleOffset.Address += Info->getModulePreferredBase();

DILineInfo LineInfo = Info->symbolizeCode(ModuleOffset, Opts.PrintFunctions,
Opts.UseSymbolTable);
DILineInfo LineInfo = Info->symbolizeCode(
ModuleOffset, DILineInfoSpecifier(Opts.PathStyle, Opts.PrintFunctions),
Opts.UseSymbolTable);
if (Opts.Demangle)
LineInfo.FunctionName = DemangleName(LineInfo.FunctionName, Info);
return LineInfo;
Expand Down Expand Up @@ -103,7 +104,8 @@ LLVMSymbolizer::symbolizeInlinedCode(const std::string &ModuleName,
ModuleOffset.Address += Info->getModulePreferredBase();

DIInliningInfo InlinedContext = Info->symbolizeInlinedCode(
ModuleOffset, Opts.PrintFunctions, Opts.UseSymbolTable);
ModuleOffset, DILineInfoSpecifier(Opts.PathStyle, Opts.PrintFunctions),
Opts.UseSymbolTable);
if (Opts.Demangle) {
for (int i = 0, n = InlinedContext.getNumberOfFrames(); i < n; i++) {
auto *Frame = InlinedContext.getMutableFrame(i);
Expand Down
5 changes: 4 additions & 1 deletion llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,9 @@ int main(int argc, char **argv) {
Opts.FallbackDebugPath = ClFallbackDebugPath;
Opts.DWPName = ClDwpName;
Opts.DebugFileDirectory = ClDebugFileDirectory;
Opts.PathStyle = DILineInfoSpecifier::FileLineInfoKind::AbsoluteFilePath;
if (ClBasenames)
Opts.PathStyle = DILineInfoSpecifier::FileLineInfoKind::BaseNameOnly;

for (const auto &hint : ClDsymHint) {
if (sys::path::extension(hint) == ".dSYM") {
Expand All @@ -322,7 +325,7 @@ int main(int argc, char **argv) {

DIPrinter Printer(outs(), ClPrintFunctions != FunctionNameKind::None,
ClPrettyPrint, ClPrintSourceContextLines, ClVerbose,
ClBasenames, ClOutputStyle);
ClOutputStyle);

if (ClInputAddresses.empty()) {
const int kMaxInputStringLength = 1024;
Expand Down
7 changes: 6 additions & 1 deletion llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1324,7 +1324,12 @@ TEST_F(DebugLineBasicFixture, PrintPathsProperly) {
EXPECT_TRUE((*ExpectedLineTable)
->Prologue.getFileNameByIndex(
1, CompDir,
DILineInfoSpecifier::FileLineInfoKind::Default, Result));
DILineInfoSpecifier::FileLineInfoKind::RawValue, Result));
EXPECT_TRUE((*ExpectedLineTable)
->Prologue.getFileNameByIndex(
1, CompDir,
DILineInfoSpecifier::FileLineInfoKind::BaseNameOnly,
Result));
EXPECT_STREQ(Result.c_str(), "b file");
EXPECT_TRUE((*ExpectedLineTable)
->Prologue.getFileNameByIndex(
Expand Down

0 comments on commit 98ff6eb

Please sign in to comment.