forked from OSchip/llvm-project
Honor -fdebug-prefix-map when creating function names for the debug info.
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: 348060
This commit is contained in:
parent
b07298eedd
commit
bef4f92a3b
|
@ -38,21 +38,20 @@ public:
|
|||
struct PrintingPolicy {
|
||||
/// Create a default printing policy for the specified language.
|
||||
PrintingPolicy(const LangOptions &LO)
|
||||
: Indentation(2), SuppressSpecifiers(false),
|
||||
SuppressTagKeyword(LO.CPlusPlus),
|
||||
IncludeTagDefinition(false), SuppressScope(false),
|
||||
SuppressUnwrittenScope(false), SuppressInitializers(false),
|
||||
ConstantArraySizeAsWritten(false), AnonymousTagLocations(true),
|
||||
SuppressStrongLifetime(false), SuppressLifetimeQualifiers(false),
|
||||
SuppressTemplateArgsInCXXConstructors(false),
|
||||
Bool(LO.Bool), Restrict(LO.C99),
|
||||
Alignof(LO.CPlusPlus11), UnderscoreAlignof(LO.C11),
|
||||
UseVoidForZeroParams(!LO.CPlusPlus),
|
||||
TerseOutput(false), PolishForDeclaration(false),
|
||||
Half(LO.Half), MSWChar(LO.MicrosoftExt && !LO.WChar),
|
||||
IncludeNewlines(true), MSVCFormatting(false),
|
||||
ConstantsAsWritten(false), SuppressImplicitBase(false),
|
||||
FullyQualifiedName(false) { }
|
||||
: Indentation(2), SuppressSpecifiers(false),
|
||||
SuppressTagKeyword(LO.CPlusPlus), IncludeTagDefinition(false),
|
||||
SuppressScope(false), SuppressUnwrittenScope(false),
|
||||
SuppressInitializers(false), ConstantArraySizeAsWritten(false),
|
||||
AnonymousTagLocations(true), SuppressStrongLifetime(false),
|
||||
SuppressLifetimeQualifiers(false),
|
||||
SuppressTemplateArgsInCXXConstructors(false), Bool(LO.Bool),
|
||||
Restrict(LO.C99), Alignof(LO.CPlusPlus11), UnderscoreAlignof(LO.C11),
|
||||
UseVoidForZeroParams(!LO.CPlusPlus), TerseOutput(false),
|
||||
PolishForDeclaration(false), Half(LO.Half),
|
||||
MSWChar(LO.MicrosoftExt && !LO.WChar), IncludeNewlines(true),
|
||||
MSVCFormatting(false), ConstantsAsWritten(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
|
||||
|
@ -225,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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -341,6 +341,9 @@ public:
|
|||
|
||||
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;
|
||||
|
@ -528,9 +531,6 @@ private:
|
|||
/// 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;
|
||||
|
|
|
@ -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([]{});
|
||||
}
|
Loading…
Reference in New Issue