[llvm-dev] How to find real heap references using LLVM Stack Map

Philip Reames via llvm-dev llvm-dev at lists.llvm.org
Thu May 20 09:57:52 PDT 2021


This is out of scope for LLVM, but let me give you a high level summary.

Your GC needs to be able to walk all stack frames on the stack at point 
of suspension.  This can be done by using libunwind, manually writing 
your own stack crawler, etc..

Once you have the ability to walk the stack, each return PC on the stack 
will correspond to a stack map entry in the stack map section.  In this 
case, the return PC for the foo call will correspond to an entry in that 
section.  All of the offsets in that entry refer to the frame 
corresponding to main.  Your stack walker must be able to turn those 
into actual addresses.

For callee saved registers - which I *think* is the case you're actually 
asking about - , you can either a) disable that by tweaking your copy of 
LLVM, or b) use the callee saved register information generated for 
eh_frame to translate CSRs into their spill locations.  If you want to 
avoid dealing with this, look at the "no_callee_saved_registers" 
function attribute.  It's a very blunt hammer, but you can come back 
later and refine.

This is a pretty standard GC implementation technique.  Any off the 
shelf GC you use should already be able to do this.

Philip

On 5/20/21 7:50 AM, Kavindu Gimhan Zoysa via llvm-dev wrote:
> Hi all,
>
> Let's say I have an example like this
>
>     /fn foo() {
>          heapRef2 = getHeapRef()
>          readStackMap()
>     }
>     fn main() {
>         heapRef1 = getHeapRef()
>         foo();
>     }/
>
>
> When we start to read stack map in foo(), our stack has two heap 
> references (heapRef1 and heapRef2). From the LLVM stack map we can get 
> the location of *heapRef2*, using let's say rsp + offset.
>
> But, When we consider about *heapRef1, *its' offset is given with 
> respect to its' function(main) rsp or rbp.**But at this moment those 
> registers are pointed to foo()'s stack frame locations. There fore how 
> do we get the location of *heapRef1?*
>
> Highly appreciate your input on this.
>
> Thank you,
> Kavindu
>
> Kavindu Gimhan Zoysa,
> BSc(Hons) | ENTC | UoM,
> SSE | WSO2
>
> GitHub <https://github.com/KavinduZoysa> LinkedIn 
> <https://www.linkedin.com/in/kavindu-gimhan-zoysa-85939a122/> Medium 
> <https://medium.com/@kavindugimhanzoysa>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210520/7e63b7ae/attachment.html>


More information about the llvm-dev mailing list