Building GC on statepoint-example


I’m trying to build a gc using the statepoint-example strategy. However, after hours of searching, reading documentation and trying to find code examples online, I cannot figure out how to access the Stack Map.

The documentation for statepoint-example says:

The stack map format generated by this GC strategy can be found in the Stack Map Section using a format documented here. This format is intended to be the standard format supported by LLVM going forward.

Ok, great, I see the format. But… how do I access the Stack Map from my runtime? Where is it?

The link seems to send me to this instruction:

A JIT compiler can easily access this section by providing its own memory manager via the LLVM C APILLVMCreateSimpleMCJITMemoryManager(). When creating the memory manager, the JIT provides a callback:LLVMMemoryManagerAllocateDataSectionCallback(). When LLVM creates this section, it invokes the callback and passes the section name.

None of these API’s are well-documented, so I’m kind of trying to guess what to do here. As a proof of concept, I tried building a do-nothing memory manager that calls APILLVMCreateSimpleMCJITMemoryManager on static initialization and passes the callbacks to it. I link the necessary llvm libs into my runtime and fire it up.

I can confirm that my safepoint poll code is getting hit. I can confirm that creating the “memory manager” is called on runtime boot and that it’s succeeding. But the callbacks never get hit. Even if they were, it’s unclear how I would use the parameters of those callbacks to locate the stack map.

What am I missing?


Note: These instructions seem to be targeted towards people creating a JIT. My compiler compiles to native. I suppose I just need a reference to the stack location of the stack map, wherever that is.


I just submitted a change to the docs to hopefully address your confusion. Can you take a look and let me know if you have further questions? Start with the revised Stack Map Format section.


p.s. I just submitted this and it’ll take a few minutes to refresh. In the meantime, you could look at the diff for 346405.

Yes, that’s more clear (you duplicated the word specified, minor typo).

The other part that threw me off was that the section name was only identified “for Darwin.” I was able to find the section via assembly inspection, but that threw me off a bit.

Both should be fixed in 346416.