From: Adrian Prantl Date: Tue, 11 Dec 2018 16:58:43 +0000 (+0000) Subject: Reuse code from CGDebugInfo::getOrCreateFile() when creating the file X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=676ab32a770f44315f9e716683e2a5334828f170;p=clang Reuse code from CGDebugInfo::getOrCreateFile() when creating the file for the DICompileUnit. This addresses post-commit feedback for D55085. Without this patch, a main source file with an absolute paths may appear in different DIFiles, once with the absolute path and once with the common prefix between the absolute path and the current working directory. Differential Revision: https://reviews.llvm.org/D55519 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@348865 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 9a6204b5bd..d9c184c209 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -429,7 +429,13 @@ llvm::DIFile *CGDebugInfo::getOrCreateFile(SourceLocation Loc) { Optional> CSInfo; if (CSKind) CSInfo.emplace(*CSKind, Checksum); + return createFile(FileName, CSInfo, getSource(SM, SM.getFileID(Loc))); +} +llvm::DIFile * +CGDebugInfo::createFile(StringRef FileName, + Optional> CSInfo, + Optional Source) { StringRef Dir; StringRef File; std::string RemappedFile = remapDIPath(FileName); @@ -460,16 +466,13 @@ llvm::DIFile *CGDebugInfo::getOrCreateFile(SourceLocation Loc) { Dir = CurDir; File = RemappedFile; } - llvm::DIFile *F = - DBuilder.createFile(File, Dir, CSInfo, - getSource(SM, SM.getFileID(Loc))); - + llvm::DIFile *F = DBuilder.createFile(File, Dir, CSInfo, Source); DIFileCache[FileName.data()].reset(F); return F; } llvm::DIFile *CGDebugInfo::getOrCreateMainFile() { - return DBuilder.createFile( + return createFile( remapDIPath(TheCU->getFilename()), remapDIPath(TheCU->getDirectory()), TheCU->getFile()->getChecksum(), CGM.getCodeGenOpts().EmbedSource ? TheCU->getSource() : None); @@ -607,9 +610,7 @@ void CGDebugInfo::CreateCompileUnit() { auto &CGOpts = CGM.getCodeGenOpts(); TheCU = DBuilder.createCompileUnit( LangTag, - DBuilder.createFile(remapDIPath(MainFileName), - remapDIPath(getCurrentDirname()), CSInfo, - getSource(SM, SM.getMainFileID())), + createFile(MainFileName, CSInfo, getSource(SM, SM.getMainFileID())), CGOpts.EmitVersionIdentMetadata ? Producer : "", LO.Optimize || CGOpts.PrepareForLTO || CGOpts.PrepareForThinLTO, CGOpts.DwarfDebugFlags, RuntimeVers, diff --git a/lib/CodeGen/CGDebugInfo.h b/lib/CodeGen/CGDebugInfo.h index 8f29e27e60..5b0d2d7fc9 100644 --- a/lib/CodeGen/CGDebugInfo.h +++ b/lib/CodeGen/CGDebugInfo.h @@ -538,9 +538,16 @@ private: /// Get the source of the given file ID. Optional getSource(const SourceManager &SM, FileID FID); - /// Get the file debug info descriptor for the input location. + /// Convenience function to get the file debug info descriptor for the input + /// location. llvm::DIFile *getOrCreateFile(SourceLocation Loc); + /// Create a file debug info descriptor for a source file. + llvm::DIFile * + createFile(StringRef FileName, + Optional> CSInfo, + Optional Source); + /// Get the file info for main compile unit. llvm::DIFile *getOrCreateMainFile(); diff --git a/test/CodeGen/debug-info-compilation-dir.c b/test/CodeGen/debug-info-compilation-dir.c index be2cc3542d..786d23556d 100644 --- a/test/CodeGen/debug-info-compilation-dir.c +++ b/test/CodeGen/debug-info-compilation-dir.c @@ -1,4 +1,6 @@ -// RUN: %clang_cc1 -fdebug-compilation-dir /nonsense -emit-llvm -debug-info-kind=limited %s -o - | FileCheck -check-prefix=CHECK-NONSENSE %s +// RUN: mkdir -p %t.dir && cd %t.dir +// RUN: cp %s rel.c +// RUN: %clang_cc1 -fdebug-compilation-dir /nonsense -emit-llvm -debug-info-kind=limited rel.c -o - | FileCheck -check-prefix=CHECK-NONSENSE %s // CHECK-NONSENSE: nonsense // RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck -check-prefix=CHECK-DIR %s diff --git a/test/PCH/debug-info-pch-path.c b/test/PCH/debug-info-pch-path.c index 015086f726..dcf7ed41f5 100644 --- a/test/PCH/debug-info-pch-path.c +++ b/test/PCH/debug-info-pch-path.c @@ -24,7 +24,7 @@ // CHECK-REL-NODIR: !DICompileUnit( // CHECK-REL-NODIR-SAME: file: ![[PCH:[0-9]+]] // CHECK-REL-NODIR-SAME: splitDebugFilename: "prefix.pch" -// CHECK-REL-NODIR: ![[PCH]] = !DIFile({{.*}}directory: "[[DIR]]" +// CHECK-REL-NODIR: ![[PCH]] = !DIFile({{.*}}directory: "[[DIR]] // --------------------------------------------------------------------- // Relative PCH in a subdirectory. @@ -71,4 +71,4 @@ // CHECK-ABS: !DICompileUnit( // CHECK-ABS-SAME: file: ![[PCH:[0-9]+]] // CHECK-ABS-SAME: splitDebugFilename: "prefix.pch" -// CHECK-ABS: ![[PCH]] = !DIFile({{.*}}directory: "[[DIR]]" +// CHECK-ABS: ![[PCH]] = !DIFile({{.*}}directory: "[[DIR]]