]> granicus.if.org Git - clang/commitdiff
Module Debugging: Use the clang module signature as the module's dwo_id
authorAdrian Prantl <aprantl@apple.com>
Tue, 22 Sep 2015 23:26:43 +0000 (23:26 +0000)
committerAdrian Prantl <aprantl@apple.com>
Tue, 22 Sep 2015 23:26:43 +0000 (23:26 +0000)
when building a module. Clang already records the module signature when
building a skeleton CU to reference a clang module.

Matching the id in the skeleton with the one in the module allows a DWARF
consumer to verify that they found the correct version of the module
without them needing to know about the clang module format.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@248345 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Frontend/PCHContainerOperations.h
lib/CodeGen/CGDebugInfo.cpp
lib/CodeGen/CGDebugInfo.h
lib/CodeGen/ObjectFilePCHContainerOperations.cpp
lib/Serialization/GeneratePCH.cpp
test/Modules/DebugInfoTransitiveImport.m
test/Modules/ModuleDebugInfo.cpp
test/Modules/ModuleDebugInfo.m

index 92d9386207e4baeebf440123129c65ac82598b18..67c36cf08eb35f7e4b7900189df9fb1f17d26ca6 100644 (file)
@@ -30,8 +30,9 @@ class DiagnosticsEngine;
 class CompilerInstance;
 
 struct PCHBuffer {
-  bool IsComplete;
+  uint64_t Signature;
   llvm::SmallVector<char, 0> Data;
+  bool IsComplete;
 };
   
 /// This abstract interface provides operations for creating
index ae1f5e7ecfad0751e3b5da78e2b518729c87b6d4..72ddf4efc7c84e0f7ed5be9187d73c9e1f1fb226 100644 (file)
@@ -3453,6 +3453,12 @@ CGDebugInfo::getOrCreateNameSpace(const NamespaceDecl *NSDecl) {
   return NS;
 }
 
+void CGDebugInfo::setDwoId(uint64_t Signature) {
+  assert(TheCU && "no main compile unit");
+  TheCU->setDWOId(Signature);
+}
+
+
 void CGDebugInfo::finalize() {
   // Creating types might create further types - invalidating the current
   // element and the size(), so don't cache/reference them.
index 8cad0c16b764e6b316139add013d7a16de8dc885..ddc90bfa67d818ea4e8eba26eca9a0b52f3f1bdc 100644 (file)
@@ -276,6 +276,9 @@ public:
 
   void finalize();
 
+  /// Set the main CU's DwoId field to \p Signature.
+  void setDwoId(uint64_t Signature);
+
   /// When generating debug information for a clang module or
   /// precompiled header, this module map will be used to determine
   /// the module of origin of each Decl.
index 310e374e348da0c8c48cefbd7c7abea4a0a3f875..8ceaf7cb3a070224616157a17ee6ab9efdde3a2a 100644 (file)
@@ -142,7 +142,6 @@ public:
     CodeGenOpts.ThreadModel = "single";
     CodeGenOpts.DebugTypeExtRefs = true;
     CodeGenOpts.setDebugInfo(CodeGenOptions::FullDebugInfo);
-    CodeGenOpts.SplitDwarfFile = OutputFileName;
   }
 
   ~PCHContainerGenerator() override = default;
@@ -201,6 +200,7 @@ public:
 
     M->setTargetTriple(Ctx.getTargetInfo().getTriple().getTriple());
     M->setDataLayout(Ctx.getTargetInfo().getDataLayoutString());
+    Builder->getModuleDebugInfo()->setDwoId(Buffer->Signature);
 
     // Finalize the Builder.
     if (Builder)
index 08660bc9675282737afdd8a652e0728de3b9ceb6..9de2fdb75a070f92464ee0f79657033edee257e2 100644 (file)
@@ -48,7 +48,8 @@ void PCHGenerator::HandleTranslationUnit(ASTContext &Ctx) {
 
   // Emit the PCH file to the Buffer.
   assert(SemaPtr && "No Sema?");
-  Writer.WriteAST(*SemaPtr, OutputFile, Module, isysroot, hasErrors);
+  Buffer->Signature =
+      Writer.WriteAST(*SemaPtr, OutputFile, Module, isysroot, hasErrors);
 
   Buffer->IsComplete = true;
 }
index c6828244d269a5eed948b52164b9388b7acedb60..baec1231b107f2ff97b0cd19eafca6b606a1b989 100644 (file)
@@ -6,10 +6,17 @@
 
 @import diamond_left;
 
-// CHECK: ![[TOP_DEF:.*]] = distinct !DICompileUnit({{.*}}diamond_top
-// CHECK: ![[LEFT_DEF:.*]] = distinct !DICompileUnit({{.*}}diamond_left
+// Definition of top:
+// CHECK: !DICompileUnit({{.*}}dwoId:
+// CHECK: !DIFile({{.*}}diamond_top.h
+
+// Definition of left:
+// CHECK: !DICompileUnit({{.*}}dwoId:
+// CHECK: !DIFile({{.*}}diamond_left
 // CHECK: !DIImportedEntity(tag: DW_TAG_imported_declaration,
 // CHECK-SAME:              entity: ![[MODULE:.*]], line: 3)
 // CHECK: ![[MODULE]] = !DIModule(scope: null, name: "diamond_top"
-// CHECK: ![[TOP_SKEL_CU:.*]] = distinct !DICompileUnit({{.*}}diamond_top{{.*}}dwoId:
+
+// Skeleton for top:
+// CHECK: !DICompileUnit({{.*}}splitDebugFilename: {{.*}}diamond_top{{.*}}dwoId:
 
index a23c2459a9004f5bacbaf29779433790a98db462..823d5dda06d6fe2391294ea9dc297c8374525837 100644 (file)
@@ -8,6 +8,7 @@
 // RUN: %clang_cc1 -triple %itanium_abi_triple -x objective-c++ -std=c++11 -g -fmodules -fmodule-format=obj -fimplicit-module-maps -DMODULES -fmodules-cache-path=%t %s -I %S/Inputs -I %t -emit-llvm -o %t.ll -mllvm -debug-only=pchcontainer &>%t-mod.ll
 // RUN: cat %t-mod.ll | FileCheck %s
 // RUN: cat %t-mod.ll | FileCheck --check-prefix=CHECK-NEG %s
+// RUN: cat %t-mod.ll | FileCheck --check-prefix=CHECK-DWO %s
 
 // PCH:
 // RUN: %clang_cc1 -triple %itanium_abi_triple -x c++ -std=c++11 -emit-pch -fmodule-format=obj -I %S/Inputs -o %t.pch %S/Inputs/DebugCXX.h -mllvm -debug-only=pchcontainer &>%t-pch.ll
@@ -20,7 +21,8 @@
 
 // CHECK: distinct !DICompileUnit(language: DW_LANG_{{.*}}C_plus_plus,
 // CHECK-SAME:                    isOptimized: false,
-// CHECK-SAME:                    splitDebugFilename:
+// CHECK-SAME-NOT:                splitDebugFilename:
+// CHECK-DWO:                     dwoId:
 // CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "Enum"
 // CHECK-SAME:             identifier: "_ZTSN8DebugCXX4EnumE")
 // CHECK: !DINamespace(name: "DebugCXX"
index 49ec76d13064cee50c24e1698a6c340323ee2a3d..546a62a2c4090007500a6f8f19012f4ce3b29daf 100644 (file)
@@ -18,7 +18,6 @@
 
 // CHECK: distinct !DICompileUnit(language: DW_LANG_ObjC
 // CHECK-SAME:                    isOptimized: false,
-// CHECK-SAME:                    splitDebugFilename:
 // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "ObjCClass"
 // CHECK: !DIObjCProperty(name: "property",
 // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "ivar"