r222373 - Fix a temporary MDNode leak.
David Blaikie
dblaikie at gmail.com
Wed Nov 19 15:08:46 PST 2014
On Wed, Nov 19, 2014 at 11:18 AM, Frédéric Riss <friss at apple.com> wrote:
>
> On Nov 19, 2014, at 11:05 AM, David Blaikie <dblaikie at gmail.com> wrote:
>
>
>
> On Wed, Nov 19, 2014 at 10:53 AM, Frederic Riss <friss at apple.com> wrote:
>
>> Author: friss
>> Date: Wed Nov 19 12:53:46 2014
>> New Revision: 222373
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=222373&view=rev
>> Log:
>> Fix a temporary MDNode leak.
>>
>> 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.
>>
>> Modified:
>> cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>>
>> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=222373&r1=222372&r2=222373&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Wed Nov 19 12:53:46 2014
>> @@ -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());
>>
>
> Should we avoid creating a variables node for declarations in the first
> place?
>
>
> I wondered about that also. I couldn’t find a nice way to rework
> DIBuilder.cpp:createFunctionHelper() to make that happen, except for
> duplicating the code and removing the helper altogether. If you have any
> ideas (or if you think just separating totally createFunction and
> createTempFunctionFwdDecl is cleaner), let me know.
>
Would it work for the callers to just pass in that field? Something like
this:
diff --git lib/IR/DIBuilder.cpp lib/IR/DIBuilder.cpp
index 204817f..4fe2be6 100644
--- lib/IR/DIBuilder.cpp
+++ lib/IR/DIBuilder.cpp
@@ -937,11 +937,10 @@ createFunctionHelper(LLVMContext &VMContext,
DIDescriptor Context, StringRef Nam
StringRef LinkageName, DIFile File, unsigned LineNo,
DICompositeType Ty, bool isLocalToUnit, bool
isDefinition,
unsigned ScopeLine, unsigned Flags, bool isOptimized,
- Function *Fn, MDNode *TParams, MDNode *Decl,
+ Function *Fn, MDNode *TParams, MDNode *Decl, MDNode
*Vars,
std::function<MDNode *(ArrayRef<Value *>)>
CreateFunc) {
assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
"function types should be subroutines");
- Value *TElts[] = {HeaderBuilder::get(DW_TAG_base_type).get(VMContext)};
Value *Elts[] = {
HeaderBuilder::get(dwarf::DW_TAG_subprogram)
.concat(Name)
@@ -957,7 +956,7 @@ createFunctionHelper(LLVMContext &VMContext,
DIDescriptor Context, StringRef Nam
.concat(ScopeLine)
.get(VMContext),
File.getFileNode(),
DIScope(getNonCompileUnitScope(Context)).getRef(), Ty,
- nullptr, Fn, TParams, Decl, MDNode::getTemporary(VMContext, TElts)};
+ nullptr, Fn, TParams, Decl, Vars};
DISubprogram S(CreateFunc(Elts));
assert(S.isSubprogram() &&
@@ -976,6 +975,7 @@ DISubprogram DIBuilder::createFunction(DIDescriptor
Context, StringRef Name,
return createFunctionHelper(VMContext, Context, Name, LinkageName, File,
LineNo, Ty, isLocalToUnit, isDefinition,
ScopeLine,
Flags, isOptimized, Fn, TParams, Decl,
+ MDNode::getTemporary(VMContext, None),
[&] (ArrayRef<Value *> Elts) -> MDNode *{
MDNode *Node = MDNode::get(VMContext,
Elts);
// Create a named metadata so that we
@@ -996,7 +996,7 @@ DIBuilder::createTempFunctionFwdDecl(DIDescriptor
Context, StringRef Name,
MDNode *TParams, MDNode *Decl) {
return createFunctionHelper(VMContext, Context, Name, LinkageName, File,
LineNo, Ty, isLocalToUnit, isDefinition,
ScopeLine,
- Flags, isOptimized, Fn, TParams, Decl,
+ Flags, isOptimized, Fn, TParams, Decl,
nullptr,
[&] (ArrayRef<Value *> Elts) {
return MDNode::getTemporary(VMContext,
Elts);
});
>
> Fred
>
>
>
>> +
>> FwdDecl.replaceAllUsesWith(CGM.getLLVMContext(),
>>
>> llvm::DIDescriptor(cast<llvm::MDNode>(VH)));
>> }
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141119/404d6d41/attachment.html>
More information about the cfe-commits
mailing list