Skip to content

Commit

Permalink
Honor -fdebug-prefix-map when creating function names for the debug i…
Browse files Browse the repository at this point in the history
…nfo.

This adds a callback to PrintingPolicy to allow CGDebugInfo to remap
file paths according to -fdebug-prefix-map. Otherwise the debug info
(particularly function names for C++ lambdas) may contain paths that
should have been remapped in the debug info.

<rdar://problem/46128056>

Differential Revision: https://reviews.llvm.org/D55137

llvm-svn: 348397
  • Loading branch information
adrian-prantl committed Dec 5, 2018
1 parent a717bc7 commit 56acd5a
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 7 deletions.
9 changes: 8 additions & 1 deletion clang/include/clang/AST/PrettyPrinter.h
Expand Up @@ -50,7 +50,8 @@ struct PrintingPolicy {
PolishForDeclaration(false), Half(LO.Half),
MSWChar(LO.MicrosoftExt && !LO.WChar), IncludeNewlines(true),
MSVCFormatting(false), ConstantsAsWritten(false),
SuppressImplicitBase(false), FullyQualifiedName(false) {}
SuppressImplicitBase(false), FullyQualifiedName(false),
RemapFilePaths(false) {}

/// Adjust this printing policy for cases where it's known that we're
/// printing C++ code (for instance, if AST dumping reaches a C++-only
Expand Down Expand Up @@ -223,6 +224,12 @@ struct PrintingPolicy {
/// When true, print the fully qualified name of function declarations.
/// This is the opposite of SuppressScope and thus overrules it.
unsigned FullyQualifiedName : 1;

/// Whether to apply -fdebug-prefix-map to any file paths.
unsigned RemapFilePaths : 1;

/// When RemapFilePaths is true, this function performs the action.
std::function<std::string(StringRef)> remapPath;
};

} // end namespace clang
Expand Down
10 changes: 7 additions & 3 deletions clang/lib/AST/TypePrinter.cpp
Expand Up @@ -1157,9 +1157,13 @@ void TypePrinter::printTag(TagDecl *D, raw_ostream &OS) {
PresumedLoc PLoc = D->getASTContext().getSourceManager().getPresumedLoc(
D->getLocation());
if (PLoc.isValid()) {
OS << " at " << PLoc.getFilename()
<< ':' << PLoc.getLine()
<< ':' << PLoc.getColumn();
OS << " at ";
StringRef File = PLoc.getFilename();
if (Policy.RemapFilePaths)
OS << Policy.remapPath(File);
else
OS << File;
OS << ':' << PLoc.getLine() << ':' << PLoc.getColumn();
}
}

Expand Down
3 changes: 3 additions & 0 deletions clang/lib/CodeGen/CGDebugInfo.cpp
Expand Up @@ -235,6 +235,9 @@ PrintingPolicy CGDebugInfo::getPrintingPolicy() const {
if (CGM.getCodeGenOpts().EmitCodeView)
PP.MSVCFormatting = true;

// Apply -fdebug-prefix-map.
PP.RemapFilePaths = true;
PP.remapPath = [this](StringRef Path) { return remapDIPath(Path); };
return PP;
}

Expand Down
6 changes: 3 additions & 3 deletions clang/lib/CodeGen/CGDebugInfo.h
Expand Up @@ -341,6 +341,9 @@ class CGDebugInfo {

void finalize();

/// Remap a given path with the current debug prefix map
std::string remapDIPath(StringRef) const;

/// Register VLA size expression debug node with the qualified type.
void registerVLASizeExpression(QualType Ty, llvm::Metadata *SizeExpr) {
SizeExprCache[Ty] = SizeExpr;
Expand Down Expand Up @@ -528,9 +531,6 @@ class CGDebugInfo {
/// Create new compile unit.
void CreateCompileUnit();

/// Remap a given path with the current debug prefix map
std::string remapDIPath(StringRef) const;

/// Compute the file checksum debug info for input file ID.
Optional<llvm::DIFile::ChecksumKind>
computeChecksum(FileID FID, SmallString<32> &Checksum) const;
Expand Down
10 changes: 10 additions & 0 deletions clang/test/CodeGenCXX/debug-prefix-map-lambda.cpp
@@ -0,0 +1,10 @@
// RUN: %clang_cc1 -debug-info-kind=limited -triple %itanium_abi_triple \
// RUN: -fdebug-prefix-map=%S=/SOURCE_ROOT %s -emit-llvm -o - | FileCheck %s

template <typename T> void b(T) {}
void c() {
// CHECK: !DISubprogram(name: "b<(lambda at
// CHECK-SAME: /SOURCE_ROOT/debug-prefix-map-lambda.cpp
// CHECK-SAME: [[@LINE+1]]:{{[0-9]+}})>"
b([]{});
}

0 comments on commit 56acd5a

Please sign in to comment.