From 25ae67622cdce44f39a160665eebf139f60ba6fc Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Tue, 14 Oct 2014 22:22:17 +0000 Subject: [PATCH] DebugInfo: Lazily built static member variable declarations should use the canonical declaration for line/file information. When lazily constructing static member variable declarations (when the vtable optimization fires and the definition of the type is omitted (or built later, lazily), but the out of line definition of the static member is provided and must be described in debug info) ensure we use the canonical declaration when computing the file, line, etc for that declaration (rather than the definition, which is also a declaration, but not the canonical one). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@219736 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGDebugInfo.cpp | 1 + test/CodeGenCXX/debug-info-static-member.cpp | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 025bdfaed0..512db76a84 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -895,6 +895,7 @@ CGDebugInfo::CreateRecordStaticField(const VarDecl *Var, const RecordDecl* RD) { // Create the descriptor for the static variable, with or without // constant initializers. + Var = Var->getCanonicalDecl(); llvm::DIFile VUnit = getOrCreateFile(Var->getLocation()); llvm::DIType VTy = getOrCreateType(Var->getType(), VUnit); diff --git a/test/CodeGenCXX/debug-info-static-member.cpp b/test/CodeGenCXX/debug-info-static-member.cpp index 7bbac6bafc..2a4f0c3dcd 100644 --- a/test/CodeGenCXX/debug-info-static-member.cpp +++ b/test/CodeGenCXX/debug-info-static-member.cpp @@ -45,3 +45,13 @@ int main() // CHECK: metadata !{metadata !"0x34\00a\00{{.*}}", {{.*}} @_ZN1C1aE, metadata ![[DECL_A]]} ; [ DW_TAG_variable ] [a] {{.*}} [def] // CHECK: metadata !{metadata !"0x34\00b\00{{.*}}", {{.*}} @_ZN1C1bE, metadata ![[DECL_B]]} ; [ DW_TAG_variable ] [b] {{.*}} [def] // CHECK: metadata !{metadata !"0x34\00c\00{{.*}}", {{.*}} @_ZN1C1cE, metadata ![[DECL_C]]} ; [ DW_TAG_variable ] [c] {{.*}} [def] + +// Verify that even when a static member declaration is created lazily when +// creating the definition, the declaration line is that of the canonical +// declaration, not the definition. +struct V { + virtual ~V(); // cause the definition of 'V' to be omitted by no-standalone-debug optimization + static const int const_va = 42; +}; +// CHECK: ; [ DW_TAG_member ] [const_va] [line [[@LINE-2]], +const int V::const_va; -- 2.40.0