<div dir="ltr">Hello,<div><br></div><div>I'm trying to develop a way to reliably clean the LLVMContext in order to make it possible to use it multiple times.</div><div><br></div><div>LLVMContext itself is an almost empty object delegating almost all its content to LLVMContextImpl.</div>
<div>This makes it very clean ideally, because clearing the LLVMContext would be as easy as deleting the LLVMContextImpl and creating a new one.</div><div><br></div><div>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).</div>
<div><br></div><div>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.</div>
<div>In addition to that, being pImpl public, there is no guarantee that objects don't rely on pImpl remaining always the same pointer.</div><div><br></div><div>This makes it more difficult to clear LLVMContext.</div>
<div><br></div><div>An approach I thought of could be adding a clear() method to LLVMContext that:</div><div> - Calls directly the destructor of LLVMContextImpl on the pImpl object</div><div> - Uses a placement new to reinitialize the object.</div>
<div> - Recreates the fixed metadata kinds like the LLVMContext constructor does</div><div><br></div><div>I'm attaching a patch that show this approach in this mail.</div><div><br></div><div>I would like to know a general idea about what people think about this and see what people think would be the best approach would be.</div>
<div><br></div><div>Thanks,</div><div>Marcello</div></div>