diff options
author | Manman Ren <mren@apple.com> | 2013-02-01 23:54:37 +0000 |
---|---|---|
committer | Manman Ren <mren@apple.com> | 2013-02-01 23:54:37 +0000 |
commit | e697d3cd2ec7df5d36d9649c33b4e18afc48feeb (patch) | |
tree | 7f507a7c12c9af491c1e9f0b87eaef471da88eb6 /llvm/lib/CodeGen | |
parent | 44180f8f6d5d55ba69764bb8eb9d89aee0c4d5eb (diff) | |
download | bcm5719-llvm-e697d3cd2ec7df5d36d9649c33b4e18afc48feeb.tar.gz bcm5719-llvm-e697d3cd2ec7df5d36d9649c33b4e18afc48feeb.zip |
[Dwarf] avoid emitting multiple AT_const_value for static memebers.
Testing case is reduced from MultiSource/BenchMarks/Prolangs-C++/deriv1.
rdar://problem/13071590
llvm-svn: 174235
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index f0655e67847..dad10548727 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -1286,6 +1286,7 @@ void CompileUnit::createGlobalVariableDIE(const MDNode *N) { // If this is a static data member definition, some attributes belong // to the declaration DIE. DIE *VariableDIE = NULL; + bool IsStaticMember = false; DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration(); if (SDMDecl.Verify()) { assert(SDMDecl.isStaticMember() && "Expected static member decl"); @@ -1295,6 +1296,7 @@ void CompileUnit::createGlobalVariableDIE(const MDNode *N) { getOrCreateContextDIE(SDMDecl.getContext()); VariableDIE = getDIE(SDMDecl); assert(VariableDIE && "Static member decl has no context?"); + IsStaticMember = true; } // If this is not a static data member definition, create the variable @@ -1348,9 +1350,13 @@ void CompileUnit::createGlobalVariableDIE(const MDNode *N) { addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name, getRealLinkageName(LinkageName)); } else if (const ConstantInt *CI = - dyn_cast_or_null<ConstantInt>(GV.getConstant())) - addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType()); - else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) { + dyn_cast_or_null<ConstantInt>(GV.getConstant())) { + // AT_const_value was added when the static memeber was created. To avoid + // emitting AT_const_value multiple times, we only add AT_const_value when + // it is not a static member. + if (!IsStaticMember) + addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType()); + } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) { addToAccelTable = true; // GV is a merged global. DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); |