Questions about deallocation responsibilities

I am, from a front end, calling functions like LLVMModuleCreateWithName, found
in Core.h, ultimately calling LLVMWriteBitcodeToFile, found in BitWriter.h.

Do I correctly presume, from the existence of LLVMDisposeModule, that
I am responsible for calling it when I'm done? Will I need to do deeper
disposing myself? I presume at least I will need to free strings I allocated
myself, such as the module name I passed in.

What about, for example, llvm::DIBuilder::DICreateCompileUnit? I haven't
been able so far to find a companion dispose for this object.

LLVM has some standard ownership conventions:

  • A LLVMContext owns constants and types, and must outlive all other IR data structures using it
  • A Module owns all functions, globals, aliases, metadata, and other stuff in it
  • A Function owns all basic blocks in it
  • A BasicBlock owns all of its instructions

Disposing a module should throw away all the other IR it contains, but you also need to throw away the context if you want to really throw away all of LLVM’s state.

LLVM typically copies symbol names into it’s own internal data structures, so any strings you allocate for symbol names are owned by the frontend.

I’m not familiar with DIBuilder, but I’m pretty sure the metadata it creates is owned by the module or context depending on the type.

I am, from a front end, calling functions like LLVMModuleCreateWithName,
found
in Core.h, ultimately calling LLVMWriteBitcodeToFile, found in BitWriter.h.

Do I correctly presume, from the existence of LLVMDisposeModule, that
I am responsible for calling it when I'm done? Will I need to do deeper
disposing myself? I presume at least I will need to free strings I
allocated
myself, such as the module name I passed in.

What about, for example, llvm::DIBuilder::DICreateCompileUnit? I haven't
been able so far to find a companion dispose for this object.

Metadata is owned by the LLVMContext on construction. (except temporary
metadata, which must be destroyed manually (there's a corresponding destroy
function in llvm::MDNode) usually after RAUWing it with something else).

Thanks. These posts help a lot.