From 22d5bd0e3b32530785bc7b5c0f32b32a1f907342 Mon Sep 17 00:00:00 2001 From: Adrian Prantl Date: Wed, 18 Mar 2020 15:30:20 -0700 Subject: [PATCH] Allow remapping Clang module include paths in the debug info with -fdebug-prefix-map. rdar://problem/55685132 This reapplies an earlier attempt to commit this without modifications. Differential Revision: https://reviews.llvm.org/D76385 --- clang/lib/CodeGen/CGDebugInfo.cpp | 30 +++++++++++++------- clang/test/Modules/debug-info-moduleimport.m | 2 ++ 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index da6cb458982b..49c57e9860a6 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -2483,6 +2483,17 @@ llvm::DIModule *CGDebugInfo::getOrCreateModuleRef(ASTSourceDescriptor Mod, assert(StringRef(M->Name).startswith(CGM.getLangOpts().ModuleName) && "clang module without ASTFile must be specified by -fmodule-name"); + // Return a StringRef to the remapped Path. + auto RemapPath = [this](StringRef Path) -> std::string { + std::string Remapped = remapDIPath(Path); + StringRef Relative(Remapped); + StringRef CompDir = TheCU->getDirectory(); + if (Relative.consume_front(CompDir)) + Relative.consume_front(llvm::sys::path::get_separator()); + + return Relative.str(); + }; + if (CreateSkeletonCU && IsRootModule && !Mod.getASTFile().empty()) { // PCH files don't have a signature field in the control block, // but LLVM detects skeleton CUs by looking for a non-zero DWO id. @@ -2496,16 +2507,12 @@ llvm::DIModule *CGDebugInfo::getOrCreateModuleRef(ASTSourceDescriptor Mod, if (!llvm::sys::path::is_absolute(Mod.getASTFile())) PCM = Mod.getPath(); llvm::sys::path::append(PCM, Mod.getASTFile()); - std::string RemappedPCM = remapDIPath(PCM); - StringRef RelativePCM(RemappedPCM); - StringRef CompDir = TheCU->getDirectory(); - if (RelativePCM.consume_front(CompDir)) - RelativePCM.consume_front(llvm::sys::path::get_separator()); - DIB.createCompileUnit(TheCU->getSourceLanguage(), - // TODO: Support "Source" from external AST providers? - DIB.createFile(Mod.getModuleName(), CompDir), - TheCU->getProducer(), false, StringRef(), 0, RelativePCM, - llvm::DICompileUnit::FullDebug, Signature); + DIB.createCompileUnit( + TheCU->getSourceLanguage(), + // TODO: Support "Source" from external AST providers? + DIB.createFile(Mod.getModuleName(), TheCU->getDirectory()), + TheCU->getProducer(), false, StringRef(), 0, RemapPath(PCM), + llvm::DICompileUnit::FullDebug, Signature); DIB.finalize(); } @@ -2513,9 +2520,10 @@ llvm::DIModule *CGDebugInfo::getOrCreateModuleRef(ASTSourceDescriptor Mod, IsRootModule ? nullptr : getOrCreateModuleRef(ASTSourceDescriptor(*M->Parent), CreateSkeletonCU); + std::string IncludePath = Mod.getPath().str(); llvm::DIModule *DIMod = DBuilder.createModule(Parent, Mod.getModuleName(), ConfigMacros, - Mod.getPath()); + RemapPath(IncludePath)); ModuleCache[M].reset(DIMod); return DIMod; } diff --git a/clang/test/Modules/debug-info-moduleimport.m b/clang/test/Modules/debug-info-moduleimport.m index 9dee9964b538..5787ffe22751 100644 --- a/clang/test/Modules/debug-info-moduleimport.m +++ b/clang/test/Modules/debug-info-moduleimport.m @@ -34,9 +34,11 @@ // RUN: %clang_cc1 -debug-info-kind=limited -fmodules -fimplicit-module-maps \ // RUN: -fmodules-cache-path=%t -fdebug-prefix-map=%t=/MODULE-CACHE \ +// RUN: -fdebug-prefix-map=%S=/SRCDIR \ // RUN: -fmodule-format=obj -dwarf-ext-refs \ // RUN: %s -I %S/Inputs -isysroot /tmp/.. -I %t -emit-llvm -o - \ // RUN: | FileCheck %s --check-prefix=SKEL-CHECK +// SKEL-CHECK: includePath: "/SRCDIR/Inputs" // SKEL-CHECK: distinct !DICompileUnit({{.*}}file: ![[CUFILE:[0-9]+]] // SKEL-CHECK: ![[CUFILE]] = !DIFile({{.*}}directory: "[[COMP_DIR:.*]]" // SKEL-CHECK: distinct !DICompileUnit({{.*}}file: ![[DWOFILE:[0-9]+]]{{.*}}splitDebugFilename: "/MODULE-CACHE{{.*}}dwoId