From: Adrian Prantl Date: Wed, 9 Nov 2016 00:42:03 +0000 (+0000) Subject: Emit debug info for global constants whose address is taken exactly once. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2123f44cb9cbd94dd7ab83812281cc062f52b938;p=clang Emit debug info for global constants whose address is taken exactly once. Add a check to the DeclCache before emitting debug info for a GlobalVariable a second time and just attach the previsously created one to it. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@286322 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index b17d2482a7..c4e7ffdd54 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -3675,6 +3675,13 @@ void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, assert(DebugKind >= codegenoptions::LimitedDebugInfo); if (D->hasAttr()) return; + + // If we already created a DIGlobalVariable for this declaration, just attach + // it to the llvm::GlobalVariable. + auto Cached = DeclCache.find(D->getCanonicalDecl()); + if (Cached != DeclCache.end()) + return Var->addDebugInfo(cast(Cached->second)); + // Create global variable debug descriptor. llvm::DIFile *Unit = nullptr; llvm::DIScope *DContext = nullptr; diff --git a/test/CodeGen/debug-info-global-constant.c b/test/CodeGen/debug-info-global-constant.c new file mode 100644 index 0000000000..f214fdcd11 --- /dev/null +++ b/test/CodeGen/debug-info-global-constant.c @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -emit-llvm -debug-info-kind=standalone \ +// RUN: -triple %itanium_abi_triple %s -o - | FileCheck %s + +// Debug info for a global constant whose address is taken should be emitted +// exactly once. + +// CHECK: @i = internal constant i32 1, align 4, !dbg ![[I:[0-9]+]] +// CHECK: ![[I]] = distinct !DIGlobalVariable(name: "i", +// CHECK-SAME: expr: ![[EXPR:[0-9]+]] +// CHECK: !DICompileUnit({{.*}}globals: ![[GLOBALS:[0-9]+]]) +// CHECK: ![[GLOBALS]] = !{![[I]]} +// CHECK: ![[EXPR]] = !DIExpression(DW_OP_constu, 1, DW_OP_stack_value) +static const int i = 1; + +void g(const int *, int); +void f() { + g(&i, i); +}