]> granicus.if.org Git - clang/commitdiff
Fix a temporary MDNode leak.
authorFrederic Riss <friss@apple.com>
Wed, 19 Nov 2014 18:53:46 +0000 (18:53 +0000)
committerFrederic Riss <friss@apple.com>
Wed, 19 Nov 2014 18:53:46 +0000 (18:53 +0000)
While emitting debug information for function forward decalrations, we
create DISubprogram objects that aran't stored in the AllSubprograms
list, and thus won't get finalized by the DIBuilder. During the DIBuilder
finalize(), the temporary MDNode allocated for the DISubprogram
Variables field gets RAUWd with a non temporary DIArray. For the forward
declarations, simply delete that temporary node before we delete the
parent node, so that it doesn't leak.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@222373 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGDebugInfo.cpp

index b2a3f7e0e98bcc03c4b2131b97e167bc3d1aa023..71ccb0d9f908c8a7099cceec38d56c3dc7f71190 100644 (file)
@@ -3398,6 +3398,13 @@ void CGDebugInfo::finalize() {
       VH = p.second;
     else
       VH = it->second;
+
+    // Functions have a fake temporary MDNode operand that is supposed
+    // to get RAUWed upon DIBuilder finalization. Do not leak these
+    // nodes for the temporary functions we are about to delete.
+    if (FwdDecl.isSubprogram())
+      llvm::MDNode::deleteTemporary(llvm::DISubprogram(FwdDecl).getVariablesNodes());
+
     FwdDecl.replaceAllUsesWith(CGM.getLLVMContext(),
                                llvm::DIDescriptor(cast<llvm::MDNode>(VH)));
   }