Skip to content

Commit

Permalink
PR14606: Debug Info for namespace aliases/DW_TAG_imported_module
Browse files Browse the repository at this point in the history
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
  • Loading branch information
dwblaikie committed May 20, 2013
1 parent ff2515e commit 7b72cc7
Show file tree
Hide file tree
Showing 6 changed files with 104 additions and 41 deletions.
11 changes: 10 additions & 1 deletion include/llvm/DIBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions include/llvm/DebugInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};

Expand Down
3 changes: 3 additions & 0 deletions lib/CodeGen/AsmPrinter/DwarfDebug.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
49 changes: 39 additions & 10 deletions lib/IR/DIBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
3 changes: 2 additions & 1 deletion lib/IR/DebugInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
78 changes: 49 additions & 29 deletions test/DebugInfo/namespace.ll
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,18 @@
; 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
Expand Down Expand Up @@ -119,7 +131,9 @@
; 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 }
Expand All @@ -129,16 +143,16 @@
; Function Attrs: nounwind uwtable
define void @_ZN1A1B2f1Ev() #0 {
entry:
ret void, !dbg !39
ret void, !dbg !41
}

; Function Attrs: nounwind uwtable
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
Expand All @@ -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" }
Expand Down Expand Up @@ -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 ]
Expand All @@ -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}

0 comments on commit 7b72cc7

Please sign in to comment.