[LLVMdev] Making it possible to clear the LLVMContext
Rafael Avila de Espindola
rafael.espindola at gmail.com
Tue Jun 24 19:22:46 PDT 2014
Sent from my iPhone
> On Jun 24, 2014, at 12:17, Mathias Fröhlich <Mathias.Froehlich at gmx.net> wrote:
>
>
> Hi,
>
>> On Tuesday, June 24, 2014 15:18:51 Marcello Maggioni wrote:
>> I'm trying to develop a way to reliably clean the LLVMContext in order to
>> make it possible to use it multiple times.
>>
>> LLVMContext itself is an almost empty object delegating almost all its
>> content to LLVMContextImpl.
>> This makes it very clean ideally, because clearing the LLVMContext would be
>> as easy as deleting the LLVMContextImpl and creating a new one.
>>
>> The problem is that for some reason which I'm not aware of LLVMContextImpl
>> is actually exposed as a public pointer in the LLVMContext interface,making
>> it publicly available to objects that use it directly (this seems to happen
>> quite a lot in the codebase).
>>
>> In LLVMContext the LLVMContextImpl is contained in a pImpl pointer that is
>> const (the pointer itself can't be changed) and I guess this is some kind
>> of protection against object replacing the LLVMContextImpl directly, which
>> stops us from just deleting it + getting a new one.
>> In addition to that, being pImpl public, there is no guarantee that objects
>> don't rely on pImpl remaining always the same pointer.
>>
>> This makes it more difficult to clear LLVMContext.
>
> I can't comment on your solution.
> But again the open source OpenGL driver stack is suffering from problems connected to
> LLVMContext.
>
> So our observation is, if we use several LLVMContexts within the program execution
> lifetime, LLVM accumulates memory that is only freed on destruction of the
> managed singletons. It turns out that in SDNode::getValueTypeList(EVT) the non simple
> value types are cached and keyed by a llvm::Type value which in the end refers to a
> LLVMContext reference value. Which in turn leads to the llvm library hogging memory
> in this EVT std::set for each new LLVMContext.
> For the OpenGL drivers using the global LLVMContext singleton leads to serious
> threadsafeness problems. One driver is just non OpenGL conformant
> non thread safe because of that, some others just tolerate LLVM hogging
> memory because of that. Even worse for the ones just tolerating hogging
> memory, I could potentially think of possible ABA like problems with a
> new LLVMContext or llvm::Type being malloced at the same address than a previous already deleted
> one but not knowing about the cached EVT's which appear to belong to this context.
>
> That said I think you need to be careful since some of the llvm static caches refer to
> LLVMContext pointers and at least the one I mentioned above is not cleared if either
> a whole LLVMContext is cleared nor it is cleared by what you want to achieve.
>
> Also for my interest:
> Does anybody know of other statically cached object instances that are tied to an
> LLVMContext but not cleaned up when the referring LLVMContext is destroyed?
>
This is probably an independent bug, no? How about moving the evt cache to the llvmcontext so that it goes away with it?
> Greetings and thanks
>
> Mathias
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
More information about the llvm-dev
mailing list