[llvm-dev] Passing stack pointer to statepoint-gc

Philip Reames via llvm-dev llvm-dev at lists.llvm.org
Thu Nov 8 13:52:02 PST 2018


Yes, program counter.  Also known as instruction pointer.  On X86-64, 
RIP register.


Philip


On 11/8/18 10:48 AM, Jordan Rudd wrote:
> Program counter?
> ------------------------------------------------------------------------
> *From:* llvm-dev <llvm-dev-bounces at lists.llvm.org> on behalf of Jordan 
> Rudd via llvm-dev <llvm-dev at lists.llvm.org>
> *Sent:* Thursday, November 8, 2018 10:47 AM
> *To:* Philip Reames; llvm-dev at lists.llvm.org
> *Subject:* Re: [llvm-dev] Passing stack pointer to statepoint-gc
> Sorry, what does "PC" mean here?
> ------------------------------------------------------------------------
> *From:* Philip Reames <listmail at philipreames.com>
> *Sent:* Thursday, November 8, 2018 7:27 AM
> *To:* Jordan Rudd; llvm-dev at lists.llvm.org
> *Subject:* Re: [llvm-dev] Passing stack pointer to statepoint-gc
>
> Jordon,
>
>
> First of all, StackMaps are keyed by PC, not by SP.  Each entry 
> corresponds to given location within the generated code.
>
>
> This isn't something you want to do in generated code. Your runtime 
> should be responsible for this.  If you support stack walking or back 
> traces for any purpose, you should already have the code to identify 
> the PC for a suspended frame on the stack.
>
>
> If you don't, the easiest approach will be to use a assembly stub 
> between your generated code and your C/C++ runtime code which grabs 
> the PC from the stack, and moves it into an argument register.
>
>
> Philip
>
>
> On 11/7/18 5:22 PM, Jordan Rudd via llvm-dev wrote:
>> Hi,
>>
>> I'm trying to use the statepoint-example strategy to build a simple 
>> garbage collector. After using the PlaceSafepoints 
>> and RewriteStatepointsForGC passes, I can successfully generate a 
>> stack map in my binary and call into my runtime's gc poll.
>>
>> As far as I can tell, I need the stack pointer at the point of the 
>> poll to find the correct frame in the stack map. I'm having trouble 
>> doing that.
>>
>> One library I looked at online (statepoint-utils) simply defines a 
>> helper function written in assembly that pushes the RSP register to 
>> RDI before calling into the runtime, so that the runtime gc polling 
>> function can read it as a parameter.
>>
>> I was trying to do the same thing except in llvm, so from my 
>> gc.safepoint_poll definition, I tried adding these lines:
>>
>> declare void @runtime_safepoint_poll(i64)
>> declare i64 @llvm.read_register.i64(metadata) #1
>> !0 = !{!"rsp\00"}
>>
>> ; Read the stack pointer and pass it to our polling function (assumes 
>> x64)
>> define void @gc.safepoint_poll() {
>>   %stackpointer = call i64 @llvm.read_register.i64(metadata !0)
>>   call void @runtime_safepoint_poll(i64 %stackpointer)
>>   ret void
>> }
>>
>> attributes #1 = { "gc-leaf-function" nounwind readnone }
>>
>> Note that the target triple is x86_64-pc-windows-msvc.
>>
>> When I test this, the values that come from reading RSP are never in 
>> the address space of the module. Like, not even close.
>>
>> As far as I can tell, this /should /work, and I'm a little stymied as 
>> to why I'm getting back garbage. Do I misunderstand the read_register 
>> call here?
>>
>> Thanks,
>> Jordan
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org  <mailto:llvm-dev at lists.llvm.org>
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev  <https://nam01.safelinks.protection.outlook.com/?url=http%3A%2F%2Flists.llvm.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fllvm-dev&data=02%7C01%7C%7Cbb88aac921f247a9080b08d645aaa91e%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C636772996613513985&sdata=IQb%2B6Gs6UMJYw9iNiQpbM5veWc8%2F4SVcDStnSqE5DLQ%3D&reserved=0>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20181108/9ed96439/attachment.html>


More information about the llvm-dev mailing list