]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - opencl/llvm.git/commitdiff
PR14606: Debug Info for namespace aliases/DW_TAG_imported_module
authorDavid Blaikie <dblaikie@gmail.com>
Mon, 20 May 2013 22:50:35 +0000 (22:50 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Mon, 20 May 2013 22:50:35 +0000 (22:50 +0000)
This resolves the last of the PR14606 failures in the GDB 7.5 test
suite by implementing an optional name field for
DW_TAG_imported_modules/DIImportedEntities and using that to implement
C++ namespace aliases (eg: "namespace X = Y;").

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

include/llvm/DIBuilder.h
include/llvm/DebugInfo.h
lib/CodeGen/AsmPrinter/DwarfDebug.cpp
lib/IR/DIBuilder.cpp
lib/IR/DebugInfo.cpp
test/DebugInfo/namespace.ll

index 72da916e45e5e88f4f96c13c71b2f8978a849d10..1fa7bc1da4e9bc16c7c394e90e834fda19b292e0 100644 (file)
@@ -577,8 +577,17 @@ namespace llvm {
     /// @param NS The namespace being imported here
     /// @param Line Line number
     DIImportedEntity createImportedModule(DIScope Context, DINameSpace NS,
-                                          unsigned Line);
+                                          unsigned Line,
+                                          StringRef Name = StringRef());
 
+    /// \brief Create a descriptor for an imported module.
+    /// @param Context The scope this module is imported into
+    /// @param NS An aliased namespace
+    /// @param Line Line number
+    DIImportedEntity createImportedModule(DIScope Context, DIImportedEntity NS,
+                                          unsigned Line, StringRef Name);
+
+    /// \brief Create a descriptor for an imported function.
     /// \brief Create a descriptor for an imported function.
     /// @param Context The scope this module is imported into
     /// @param Decl The declaration (or definition) of a function, type, or
index 91c30663383602f76898432a28849e1ddd2a69ae..a4330070dcd7f77c91d53e13699f4f7f16ea201f 100644 (file)
@@ -695,6 +695,7 @@ namespace llvm {
     DIScope getContext() const { return getFieldAs<DIScope>(1); }
     DIDescriptor getEntity() const { return getFieldAs<DIDescriptor>(2); }
     unsigned getLineNumber() const { return getUnsignedField(3); }
+    StringRef getName() const { return getStringField(4); }
     bool Verify() const;
   };
 
index 19bbc738154e9db58f65ac24eb303c80d86a19c5..b72e65340f828721142701ee529ffb25f74cea7b 100644 (file)
@@ -817,6 +817,9 @@ void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
   TheCU->addUInt(IMDie, dwarf::DW_AT_decl_file, 0, FileID);
   TheCU->addUInt(IMDie, dwarf::DW_AT_decl_line, 0, Module.getLineNumber());
   TheCU->addDIEEntry(IMDie, dwarf::DW_AT_import, dwarf::DW_FORM_ref4, EntityDie);
+  StringRef Name = Module.getName();
+  if (!Name.empty())
+    TheCU->addString(IMDie, dwarf::DW_AT_name, Name);
   Context->addChild(IMDie);
 }
 
index 4bb87c9afb7758d299ccf2db768a13f6d431cb75..1c799452754e97caf4743cc724efc0f367a5f1e3 100644 (file)
@@ -128,21 +128,50 @@ void DIBuilder::createCompileUnit(unsigned Lang, StringRef Filename,
   NMD->addOperand(TheCU);
 }
 
-DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
-                                                 DINameSpace NS,
-                                                 unsigned Line) {
-  Value *Elts[] = {
-    GetTagConstant(VMContext, dwarf::DW_TAG_imported_module),
-    Context,
-    NS,
-    ConstantInt::get(Type::getInt32Ty(VMContext), Line),
-  };
-  DIImportedEntity M(MDNode::get(VMContext, Elts));
+static DIImportedEntity
+createImportedModule(LLVMContext &C, DIScope Context, DIDescriptor NS,
+                     unsigned Line, StringRef Name,
+                     SmallVectorImpl<Value *> &AllImportedModules) {
+  const MDNode *R;
+  if (Name.empty()) {
+    Value *Elts[] = {
+      GetTagConstant(C, dwarf::DW_TAG_imported_module),
+      Context,
+      NS,
+      ConstantInt::get(Type::getInt32Ty(C), Line),
+    };
+    R = MDNode::get(C, Elts);
+  } else {
+    Value *Elts[] = {
+      GetTagConstant(C, dwarf::DW_TAG_imported_module),
+      Context,
+      NS,
+      ConstantInt::get(Type::getInt32Ty(C), Line),
+      MDString::get(C, Name)
+    };
+    R = MDNode::get(C, Elts);
+  }
+  DIImportedEntity M(R);
   assert(M.Verify() && "Imported module should be valid");
   AllImportedModules.push_back(M);
   return M;
 }
 
+DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
+                                                 DINameSpace NS, unsigned Line,
+                                                 StringRef Name) {
+  return ::createImportedModule(VMContext, Context, NS, Line, Name,
+                                AllImportedModules);
+}
+
+DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
+                                                 DIImportedEntity NS,
+                                                 unsigned Line,
+                                                 StringRef Name) {
+  return ::createImportedModule(VMContext, Context, NS, Line, Name,
+                                AllImportedModules);
+}
+
 DIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context,
                                                       DIDescriptor Decl,
                                                       unsigned Line) {
index 8a0fb8d5b10e69a59e1582febcaef803cef1d80b..6a014aee5f32cd8ba6540f8fe9a36aae0293c4ec 100644 (file)
@@ -591,7 +591,8 @@ bool DITemplateValueParameter::Verify() const {
 
 /// \brief Verify that the imported module descriptor is well formed.
 bool DIImportedEntity::Verify() const {
-  return isImportedEntity() && DbgNode->getNumOperands() == 4;
+  return isImportedEntity() &&
+         (DbgNode->getNumOperands() == 4 || DbgNode->getNumOperands() == 5);
 }
 
 /// getOriginalTypeSize - If this type is derived from a base type then
index 7db57638d0c38f5384515d0f17e9f54386ba2e00..81b8a877d38493d8b83e211bbbf3869ad7a82224 100644 (file)
 ; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x16)
 ; CHECK-NEXT: DW_AT_import{{.*}}=> {[[I]]})
 ; CHECK-NOT: NULL
+; CHECK: [[X:0x[0-9a-f]*]]:{{ *}}DW_TAG_imported_module
+; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F2]])
+; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x18)
+; CHECK-NEXT: DW_AT_import{{.*}}=> {[[NS1]]})
+; CHECK-NEXT: DW_AT_name{{.*}}"X"
+; CHECK-NOT: NULL
+; CHECK: DW_TAG_imported_module
+; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F2]])
+; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x19)
+; CHECK-NEXT: DW_AT_import{{.*}}=> {[[X]]})
+; CHECK-NEXT: DW_AT_name{{.*}}"Y"
+; CHECK-NOT: NULL
 ; CHECK: DW_TAG_lexical_block
 ; CHECK-NOT: NULL
 ; CHECK: DW_TAG_imported_module
 ;   using B::f1;
 ;   using B::i;
 ;   bar x;
-;   return i;
+;   namespace X = A;
+;   namespace Y = X;
+;   return i + X::B::i + Y::B::i;
 ; }
 
 %"struct.A::B::bar" = type { i8 }
 ; Function Attrs: nounwind uwtable
 define void @_ZN1A1B2f1Ev() #0 {
 entry:
-  ret void, !dbg !39
+  ret void, !dbg !41
 }
 
 ; Function Attrs: nounwind uwtable
@@ -137,8 +151,8 @@ define void @_ZN1A1B2f1Ei(i32) #0 {
 entry:
   %.addr = alloca i32, align 4
   store i32 %0, i32* %.addr, align 4
-  call void @llvm.dbg.declare(metadata !{i32* %.addr}, metadata !40), !dbg !41
-  ret void, !dbg !41
+  call void @llvm.dbg.declare(metadata !{i32* %.addr}, metadata !42), !dbg !43
+  ret void, !dbg !43
 }
 
 ; Function Attrs: nounwind readnone
@@ -152,25 +166,29 @@ entry:
   %x = alloca %"struct.A::B::bar", align 1
   %frombool = zext i1 %b to i8
   store i8 %frombool, i8* %b.addr, align 1
-  call void @llvm.dbg.declare(metadata !{i8* %b.addr}, metadata !42), !dbg !43
-  %0 = load i8* %b.addr, align 1, !dbg !44
-  %tobool = trunc i8 %0 to i1, !dbg !44
-  br i1 %tobool, label %if.then, label %if.end, !dbg !44
+  call void @llvm.dbg.declare(metadata !{i8* %b.addr}, metadata !44), !dbg !45
+  %0 = load i8* %b.addr, align 1, !dbg !46
+  %tobool = trunc i8 %0 to i1, !dbg !46
+  br i1 %tobool, label %if.then, label %if.end, !dbg !46
 
 if.then:                                          ; preds = %entry
-  %1 = load i32* @_ZN1A1B1iE, align 4, !dbg !45
-  store i32 %1, i32* %retval, !dbg !45
-  br label %return, !dbg !45
+  %1 = load i32* @_ZN1A1B1iE, align 4, !dbg !47
+  store i32 %1, i32* %retval, !dbg !47
+  br label %return, !dbg !47
 
 if.end:                                           ; preds = %entry
-  call void @llvm.dbg.declare(metadata !{%"struct.A::B::bar"* %x}, metadata !46), !dbg !47
-  %2 = load i32* @_ZN1A1B1iE, align 4, !dbg !48
-  store i32 %2, i32* %retval, !dbg !48
-  br label %return, !dbg !48
+  call void @llvm.dbg.declare(metadata !{%"struct.A::B::bar"* %x}, metadata !48), !dbg !49
+  %2 = load i32* @_ZN1A1B1iE, align 4, !dbg !50
+  %3 = load i32* @_ZN1A1B1iE, align 4, !dbg !50
+  %add = add nsw i32 %2, %3, !dbg !50
+  %4 = load i32* @_ZN1A1B1iE, align 4, !dbg !50
+  %add1 = add nsw i32 %add, %4, !dbg !50
+  store i32 %add1, i32* %retval, !dbg !50
+  br label %return, !dbg !50
 
 return:                                           ; preds = %if.end, %if.then
-  %3 = load i32* %retval, !dbg !49
-  ret i32 %3, !dbg !49
+  %5 = load i32* %retval, !dbg !51
+  ret i32 %5, !dbg !51
 }
 
 attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
@@ -199,7 +217,7 @@ attributes #1 = { nounwind readnone }
 !18 = metadata !{i32 786468, null, null, metadata !"bool", i32 0, i64 8, i64 8, i64 0, i32 0, i32 2} ; [ DW_TAG_base_type ] [bool] [line 0, size 8, align 8, offset 0, enc DW_ATE_boolean]
 !19 = metadata !{metadata !20}
 !20 = metadata !{i32 786484, i32 0, metadata !6, metadata !"i", metadata !"i", metadata !"_ZN1A1B1iE", metadata !15, i32 2, metadata !13, i32 0, i32 1, i32* @_ZN1A1B1iE, null} ; [ DW_TAG_variable ] [i] [line 2] [def]
-!21 = metadata !{metadata !22, metadata !23, metadata !24, metadata !26, metadata !27, metadata !29, metadata !37, metadata !38}
+!21 = metadata !{metadata !22, metadata !23, metadata !24, metadata !26, metadata !27, metadata !29, metadata !37, metadata !38, metadata !39, metadata !40}
 !22 = metadata !{i32 786490, metadata !7, metadata !6, i32 8} ; [ DW_TAG_imported_module ]
 !23 = metadata !{i32 786490, metadata !0, metadata !7, i32 11} ; [ DW_TAG_imported_module ]
 !24 = metadata !{i32 786490, metadata !25, metadata !6, i32 15} ; [ DW_TAG_imported_module ]
@@ -217,14 +235,16 @@ attributes #1 = { nounwind readnone }
 !36 = metadata !{i32 786468}
 !37 = metadata !{i32 786440, metadata !14, metadata !10, i32 21} ; [ DW_TAG_imported_declaration ]
 !38 = metadata !{i32 786440, metadata !14, metadata !20, i32 22} ; [ DW_TAG_imported_declaration ]
-!39 = metadata !{i32 3, i32 0, metadata !4, null}
-!40 = metadata !{i32 786689, metadata !10, metadata !"", metadata !15, i32 16777220, metadata !13, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [line 4]
-!41 = metadata !{i32 4, i32 0, metadata !10, null}
-!42 = metadata !{i32 786689, metadata !14, metadata !"b", metadata !15, i32 16777229, metadata !18, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [b] [line 13]
-!43 = metadata !{i32 13, i32 0, metadata !14, null}
-!44 = metadata !{i32 14, i32 0, metadata !14, null}
-!45 = metadata !{i32 16, i32 0, metadata !25, null}
-!46 = metadata !{i32 786688, metadata !14, metadata !"x", metadata !15, i32 23, metadata !30, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [x] [line 23]
-!47 = metadata !{i32 23, i32 0, metadata !14, null}
-!48 = metadata !{i32 24, i32 0, metadata !14, null}
-!49 = metadata !{i32 25, i32 0, metadata !14, null}
+!39 = metadata !{i32 786490, metadata !14, metadata !7, i32 24, metadata !"X"} ; [ DW_TAG_imported_module ]
+!40 = metadata !{i32 786490, metadata !14, metadata !39, i32 25, metadata !"Y"} ; [ DW_TAG_imported_module ]
+!41 = metadata !{i32 3, i32 0, metadata !4, null}
+!42 = metadata !{i32 786689, metadata !10, metadata !"", metadata !15, i32 16777220, metadata !13, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [line 4]
+!43 = metadata !{i32 4, i32 0, metadata !10, null}
+!44 = metadata !{i32 786689, metadata !14, metadata !"b", metadata !15, i32 16777229, metadata !18, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [b] [line 13]
+!45 = metadata !{i32 13, i32 0, metadata !14, null}
+!46 = metadata !{i32 14, i32 0, metadata !14, null}
+!47 = metadata !{i32 16, i32 0, metadata !25, null}
+!48 = metadata !{i32 786688, metadata !14, metadata !"x", metadata !15, i32 23, metadata !30, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [x] [line 23]
+!49 = metadata !{i32 23, i32 0, metadata !14, null}
+!50 = metadata !{i32 26, i32 0, metadata !14, null}
+!51 = metadata !{i32 27, i32 0, metadata !14, null}