Index: cfe/trunk/lib/CodeGen/CGDebugInfo.h =================================================================== --- cfe/trunk/lib/CodeGen/CGDebugInfo.h +++ cfe/trunk/lib/CodeGen/CGDebugInfo.h @@ -538,9 +538,16 @@ /// 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(); Index: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp =================================================================== --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp @@ -429,7 +429,13 @@ 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 @@ 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 @@ 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, Index: cfe/trunk/test/CodeGen/debug-info-compilation-dir.c =================================================================== --- cfe/trunk/test/CodeGen/debug-info-compilation-dir.c +++ cfe/trunk/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 Index: cfe/trunk/test/PCH/debug-info-pch-path.c =================================================================== --- cfe/trunk/test/PCH/debug-info-pch-path.c +++ cfe/trunk/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]]