Skip to content

Commit

Permalink
DebugInfo: Support namespace aliases as DW_TAG_imported_declaration i…
Browse files Browse the repository at this point in the history
…nstead of DW_TAG_imported_module

I really should read the spec more often (and test GCC more often too).
I just assumed that namespace aliases would be the same as using
directives, except with a name. But apparently that's not how the DWARF
standards suggests they be implemented. DWARF4 provides an example and
other non-normative text suggesting that namespace aliases be
implemented by named imported declarations intsead of named imported
modules.

So be it.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205685 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
dwblaikie committed Apr 6, 2014
1 parent 20384a5 commit 1c41705
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 33 deletions.
13 changes: 8 additions & 5 deletions include/llvm/IR/DIBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -647,24 +647,27 @@ namespace llvm {
/// @param NS The namespace being imported here
/// @param Line Line number
DIImportedEntity createImportedModule(DIScope Context, DINameSpace NS,
unsigned Line,
StringRef Name = StringRef());
unsigned Line);

/// \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);
unsigned Line);

/// \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
/// variable
/// @param Line Line number
DIImportedEntity createImportedDeclaration(DIScope Context, DIScope Decl,
unsigned Line,
StringRef Name = StringRef());
DIImportedEntity createImportedDeclaration(DIScope Context,
DIScope Decl,
unsigned Line);
DIImportedEntity NS,
unsigned Line,
StringRef Name = StringRef());

/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
/// @param Storage llvm::Value of the variable
Expand Down
47 changes: 23 additions & 24 deletions lib/IR/DIBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,21 +146,21 @@ DICompileUnit DIBuilder::createCompileUnit(unsigned Lang, StringRef Filename,
}

static DIImportedEntity
createImportedModule(LLVMContext &C, DIScope Context, DIDescriptor NS,
unsigned Line, StringRef Name,
SmallVectorImpl<TrackingVH<MDNode> > &AllImportedModules) {
createImportedModule(LLVMContext &C, dwarf::Tag Tag, DIScope Context,
Value *NS, unsigned Line, StringRef Name,
SmallVectorImpl<TrackingVH<MDNode>> &AllImportedModules) {
const MDNode *R;
if (Name.empty()) {
Value *Elts[] = {
GetTagConstant(C, dwarf::DW_TAG_imported_module),
GetTagConstant(C, Tag),
Context,
NS,
ConstantInt::get(Type::getInt32Ty(C), Line),
};
R = MDNode::get(C, Elts);
} else {
Value *Elts[] = {
GetTagConstant(C, dwarf::DW_TAG_imported_module),
GetTagConstant(C, Tag),
Context,
NS,
ConstantInt::get(Type::getInt32Ty(C), Line),
Expand All @@ -175,33 +175,32 @@ createImportedModule(LLVMContext &C, DIScope Context, DIDescriptor NS,
}

DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
DINameSpace NS, unsigned Line,
StringRef Name) {
return ::createImportedModule(VMContext, Context, NS, Line, Name,
AllImportedModules);
DINameSpace NS,
unsigned Line) {
return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
Context, NS, Line, StringRef(), AllImportedModules);
}

DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
DIImportedEntity NS,
unsigned Line,
StringRef Name) {
return ::createImportedModule(VMContext, Context, NS, Line, Name,
AllImportedModules);
unsigned Line) {
return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
Context, NS, Line, StringRef(), AllImportedModules);
}

DIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context,
DIScope Decl,
unsigned Line) {
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_imported_declaration),
Context,
Decl.getRef(),
ConstantInt::get(Type::getInt32Ty(VMContext), Line),
};
DIImportedEntity M(MDNode::get(VMContext, Elts));
assert(M.Verify() && "Imported module should be valid");
AllImportedModules.push_back(TrackingVH<MDNode>(M));
return M;
unsigned Line, StringRef Name) {
return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_declaration,
Context, Decl.getRef(), Line, Name,
AllImportedModules);
}

DIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context,
DIImportedEntity Imp,
unsigned Line, StringRef Name) {
return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_declaration,
Context, Imp, Line, Name, AllImportedModules);
}

/// createFile - Create a file descriptor to hold debugging information
Expand Down
8 changes: 4 additions & 4 deletions test/DebugInfo/namespace.ll
Original file line number Diff line number Diff line change
Expand Up @@ -73,13 +73,13 @@
; 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: [[X:0x[0-9a-f]*]]:{{ *}}DW_TAG_imported_declaration
; 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: DW_TAG_imported_declaration
; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F2]])
; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x19)
; CHECK-NEXT: DW_AT_import{{.*}}=> {[[X]]})
Expand Down Expand Up @@ -236,8 +236,8 @@ 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 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 ]
!39 = metadata !{i32 786440, metadata !14, metadata !7, i32 24, metadata !"X"} ; [ DW_TAG_imported_declaration ]
!40 = metadata !{i32 786440, metadata !14, metadata !39, i32 25, metadata !"Y"} ; [ DW_TAG_imported_declaration ]
!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}
Expand Down

0 comments on commit 1c41705

Please sign in to comment.