<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jun 30, 2015 at 10:39 AM, Adrian Prantl <span dir="ltr"><<a href="mailto:aprantl@apple.com" target="_blank">aprantl@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: adrian<br>
Date: Tue Jun 30 12:39:51 2015<br>
New Revision: 241084<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D241084-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=O4RZSsBDhGCySwNYAg3oY-6nBcU2A5ZLrAg1nZSbvek&s=91diLkrJ9HYcnuXtf5z4q__xib05IXoaBKWRPCmx2qc&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=241084&view=rev</a><br>
Log:<br>
Debug Info: Emit debug info for @import declarations.<br>
<br>
This allows a module-aware debugger such as LLDB to import the currently<br>
visible modules before dropping into the expression evaluator.<br>
<br>
rdar://problem/20965932<br>
<br>
Added:<br>
    cfe/trunk/test/Modules/Inputs/DebugModule.h<br>
    cfe/trunk/test/Modules/debug-info-moduleimport.m<br>
Modified:<br>
    cfe/trunk/lib/CodeGen/CGDebugInfo.cpp<br>
    cfe/trunk/lib/CodeGen/CGDebugInfo.h<br>
    cfe/trunk/lib/CodeGen/CodeGenModule.cpp<br>
    cfe/trunk/test/Modules/Inputs/module.map<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_CodeGen_CGDebugInfo.cpp-3Frev-3D241084-26r1-3D241083-26r2-3D241084-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=O4RZSsBDhGCySwNYAg3oY-6nBcU2A5ZLrAg1nZSbvek&s=oBdGCldgRmrKm9Q0jLqLcw7AeadR-yCTEE7w_x8TYB4&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=241084&r1=241083&r2=241084&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Tue Jun 30 12:39:51 2015<br>
@@ -27,6 +27,8 @@<br>
 #include "clang/Basic/SourceManager.h"<br>
 #include "clang/Basic/Version.h"<br>
 #include "clang/Frontend/CodeGenOptions.h"<br>
+#include "clang/Lex/HeaderSearchOptions.h"<br>
+#include "clang/Lex/PreprocessorOptions.h"<br>
 #include "llvm/ADT/SmallVector.h"<br>
 #include "llvm/ADT/StringExtras.h"<br>
 #include "llvm/IR/Constants.h"<br>
@@ -1661,6 +1663,49 @@ llvm::DIType *CGDebugInfo::CreateType(co<br>
   return CreateTypeDefinition(Ty, Unit);<br>
 }<br>
<br>
+llvm::DIModule *<br>
+CGDebugInfo::getOrCreateModuleRef(ExternalASTSource::ASTSourceDescriptor Mod) {<br>
+  llvm::DIModule *ModuleRef = nullptr;<br>
+  auto it = ModuleRefCache.find(Mod.Signature);<br>
+  if (it != ModuleRefCache.end())<br>
+    ModuleRef = it->second;<br></blockquote><div><br></div><div>Early return to reduce indentation?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+  else {<br>
+    // Macro definitions that were defined with "-D" on the command line.<br>
+    SmallString<128> ConfigMacros;<br>
+    {<br>
+      llvm::raw_svector_ostream OS(ConfigMacros);<br>
+      const auto &PPOpts = CGM.getPreprocessorOpts();<br>
+      unsigned I = 0;<br>
+      // Translate the macro definitions back into a commmand line.<br>
+      for (auto &M : PPOpts.Macros) {<br>
+        if (++I > 1)<br>
+          OS << " ";<br>
+        const std::string &Macro = M.first;<br>
+        bool Undef = M.second;<br>
+        OS << "\"-" << (Undef ? 'U' : 'D');<br>
+        for (char c : Macro)<br>
+          switch (c) {<br>
+          case '\\' : OS << "\\\\"; break;<br>
+          case '"'  : OS << "\\\""; break;<br>
+          default: OS << c;<br>
+          }<br>
+        OS << '\"';<br>
+      }<br>
+    }<br>
+    llvm::DIBuilder DIB(CGM.getModule());<br>
+    auto *CU = DIB.createCompileUnit(<br>
+        TheCU->getSourceLanguage(), internString(Mod.ModuleName),<br>
+        internString(Mod.Path), TheCU->getProducer(), true, StringRef(), 0,<br>
+        internString(Mod.ASTFile), llvm::DIBuilder::FullDebug, Mod.Signature);<br>
+    ModuleRef = DIB.createModule(<br>
+        CU, Mod.ModuleName, ConfigMacros, internString(Mod.Path),<br>
+        internString(CGM.getHeaderSearchOpts().Sysroot));<br>
+    DIB.finalize();<br>
+    ModuleRefCache.insert(std::make_pair(Mod.Signature, ModuleRef));<br>
+  }<br>
+  return ModuleRef;<br>
+}<br>
+<br>
 llvm::DIType *CGDebugInfo::CreateTypeDefinition(const ObjCInterfaceType *Ty,<br>
                                                 llvm::DIFile *Unit) {<br>
   ObjCInterfaceDecl *ID = Ty->getDecl();<br>
@@ -3304,6 +3349,15 @@ void CGDebugInfo::EmitUsingDecl(const Us<br>
         getLineNumber(USD.getLocation()));<br>
 }<br>
<br>
+void CGDebugInfo::EmitImportDecl(const ImportDecl &ID) {<br>
+  auto *Reader = CGM.getContext().getExternalSource();<br>
+  auto Info = Reader->getSourceDescriptor(*ID.getImportedModule());<br>
+  DBuilder.createImportedDeclaration(<br>
+    getCurrentContextDescriptor(cast<Decl>(ID.getDeclContext())),<br>
+                                getOrCreateModuleRef(Info),<br>
+                                getLineNumber(ID.getLocation()));<br>
+}<br>
+<br>
 llvm::DIImportedEntity *<br>
 CGDebugInfo::EmitNamespaceAlias(const NamespaceAliasDecl &NA) {<br>
   if (CGM.getCodeGenOpts().getDebugInfo() < CodeGenOptions::LimitedDebugInfo)<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_CodeGen_CGDebugInfo.h-3Frev-3D241084-26r1-3D241083-26r2-3D241084-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=O4RZSsBDhGCySwNYAg3oY-6nBcU2A5ZLrAg1nZSbvek&s=XZ8UgPykEHr7xaU_wn9SM3MNMcu4UnU9Zpm-ThUTyMA&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.h?rev=241084&r1=241083&r2=241084&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGDebugInfo.h (original)<br>
+++ cfe/trunk/lib/CodeGen/CGDebugInfo.h Tue Jun 30 12:39:51 2015<br>
@@ -83,6 +83,9 @@ class CGDebugInfo {<br>
   /// which may change.<br>
   llvm::SmallVector<ObjCInterfaceCacheEntry, 32> ObjCInterfaceCache;<br>
<br>
+  /// \brief Cache of references to AST files such as PCHs or modules.<br>
+  llvm::DenseMap<uint64_t, llvm::DIModule *> ModuleRefCache;<br>
+<br>
   /// \brief list of interfaces we want to keep even if orphaned.<br>
   std::vector<void *> RetainedTypes;<br>
<br>
@@ -289,6 +292,9 @@ public:<br>
   /// \brief Emit C++ using declaration.<br>
   void EmitUsingDecl(const UsingDecl &UD);<br>
<br>
+  /// \brief Emit an @import declaration.<br>
+  void EmitImportDecl(const ImportDecl &ID);<br>
+<br>
   /// \brief Emit C++ namespace alias.<br>
   llvm::DIImportedEntity *EmitNamespaceAlias(const NamespaceAliasDecl &NA);<br>
<br>
@@ -344,6 +350,10 @@ private:<br>
   /// necessary.<br>
   llvm::DIType *getOrCreateType(QualType Ty, llvm::DIFile *Fg);<br>
<br>
+  /// \brief Get a reference to a clang module.<br>
+  llvm::DIModule *<br>
+  getOrCreateModuleRef(ExternalASTSource::ASTSourceDescriptor Mod);<br>
+<br>
   /// \brief Get the type from the cache or create a new<br>
   /// partial type if necessary.<br>
   llvm::DIType *getOrCreateLimitedType(const RecordType *Ty, llvm::DIFile *F);<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_CodeGen_CodeGenModule.cpp-3Frev-3D241084-26r1-3D241083-26r2-3D241084-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=O4RZSsBDhGCySwNYAg3oY-6nBcU2A5ZLrAg1nZSbvek&s=4GqO5li3EPv-yJAK53GiS-BPmBsAdztwbg9PBiR0uPo&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=241084&r1=241083&r2=241084&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Tue Jun 30 12:39:51 2015<br>
@@ -3362,6 +3362,8 @@ void CodeGenModule::EmitTopLevelDecl(Dec<br>
           Owner->getTopLevelModule()->Name == getLangOpts().CurrentModule)<br>
         break;<br>
     }<br>
+    if (CGDebugInfo *DI = getModuleDebugInfo())<br>
+      DI->EmitImportDecl(*Import);<br>
<br>
     ImportedModules.insert(Import->getImportedModule());<br>
     break;<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/DebugModule.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_Modules_Inputs_DebugModule.h-3Frev-3D241084-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=O4RZSsBDhGCySwNYAg3oY-6nBcU2A5ZLrAg1nZSbvek&s=48wk1SdxJfpTW7n-56G99yL4zGRX8cmm7_utGIhaA9A&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/DebugModule.h?rev=241084&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/Inputs/DebugModule.h (added)<br>
+++ cfe/trunk/test/Modules/Inputs/DebugModule.h Tue Jun 30 12:39:51 2015<br>
@@ -0,0 +1 @@<br>
+@class F;<br>
<br>
Modified: cfe/trunk/test/Modules/Inputs/module.map<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_Modules_Inputs_module.map-3Frev-3D241084-26r1-3D241083-26r2-3D241084-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=O4RZSsBDhGCySwNYAg3oY-6nBcU2A5ZLrAg1nZSbvek&s=uU_dUc-fQ0CdjBdkE81kkJhc4jRwv9toQpmAk_s_G5s&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/module.map?rev=241084&r1=241083&r2=241084&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/Inputs/module.map (original)<br>
+++ cfe/trunk/test/Modules/Inputs/module.map Tue Jun 30 12:39:51 2015<br>
@@ -327,3 +327,8 @@ module recursive2 {<br>
 module crash {<br>
   header "crash.h"<br>
 }<br>
+<br>
+module DebugModule {<br>
+  header "DebugModule.h"<br>
+}<br>
+<br>
<br>
Added: cfe/trunk/test/Modules/debug-info-moduleimport.m<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_Modules_debug-2Dinfo-2Dmoduleimport.m-3Frev-3D241084-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=O4RZSsBDhGCySwNYAg3oY-6nBcU2A5ZLrAg1nZSbvek&s=FPil9JkGAWK3kB_6RCfAANvt7oG7N1ScVNBBAA59TuY&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/debug-info-moduleimport.m?rev=241084&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/debug-info-moduleimport.m (added)<br>
+++ cfe/trunk/test/Modules/debug-info-moduleimport.m Tue Jun 30 12:39:51 2015<br>
@@ -0,0 +1,7 @@<br>
+// RUN: rm -rf %t<br>
+// RUN: %clang_cc1 -g -fmodules -DGREETING="Hello World" -UNDEBUG -fimplicit-module-maps -fmodules-cache-path=%t %s -I %S/Inputs -isysroot /tmp/.. -I %t -emit-llvm -o - | FileCheck %s<br>
+<br>
+// CHECK: ![[CU:.*]] = !DICompileUnit<br>
+@import DebugModule;<br>
+// CHECK: !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: ![[CU]], entity: ![[MODULE:.*]], line: 5)<br>
+// CHECK: ![[MODULE]] = !DIModule(scope: null, name: "DebugModule", configMacros: "\22-DGREETING=Hello World\22 \22-UNDEBUG\22", includePath: "{{.*}}/test/Modules/Inputs", isysroot: "/tmp/..")<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>