From f4a3b2313e8347e8e43a0c285bbb5e3fd431cdab Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Sat, 5 Apr 2014 07:23:17 +0000 Subject: [PATCH] DebugInfo: Avoid emitting constnants for every use While the folding set would deduplicate the nodes themselves and LLVM would handle not emitting the same global twice, it still meant creating a long/redundant list of global variables. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@205668 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGDebugInfo.cpp | 6 +++++- test/CodeGenCXX/debug-info-global.cpp | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 test/CodeGenCXX/debug-info-global.cpp diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 41f1ddb697..7275e734f6 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -3230,10 +3230,14 @@ void CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, // Do not emit separate definitions for function local const/statics. if (isa(VD->getDeclContext())) return; + VD = cast(VD->getCanonicalDecl()); + auto pair = DeclCache.insert(std::make_pair(VD, llvm::WeakVH())); + if (!pair.second) + return; llvm::DIGlobalVariable GV = DBuilder.createStaticVariable( Unit, Name, Name, Unit, getLineNumber(VD->getLocation()), Ty, true, Init, getOrCreateStaticDataMemberDeclarationOrNull(cast(VD))); - DeclCache.insert(std::make_pair(VD->getCanonicalDecl(), llvm::WeakVH(GV))); + pair.first->second = llvm::WeakVH(GV); } llvm::DIScope CGDebugInfo::getCurrentContextDescriptor(const Decl *D) { diff --git a/test/CodeGenCXX/debug-info-global.cpp b/test/CodeGenCXX/debug-info-global.cpp new file mode 100644 index 0000000000..5f075b9613 --- /dev/null +++ b/test/CodeGenCXX/debug-info-global.cpp @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -triple x86_64-none-linux-gnu -emit-llvm -g %s -o - | FileCheck %s + +// Multiple references to the same constant should result in only one entry in +// the globals list. + +const int cnst = 42; +int f1() { + return cnst + cnst; +} + +// CHECK: metadata [[GLOBALS:![0-9]*]], metadata {{![0-9]*}}, metadata !"{{.*}}", i32 {{[0-9]*}}} ; [ DW_TAG_compile_unit ] + +// CHECK: [[GLOBALS]] = metadata !{metadata [[CNST:![0-9]*]]} + -- 2.50.1