Re: [fpc-devel] CFI

2022-06-07 Thread Joost van der Sluis via fpc-devel


Op 07-06-2022 om 14:07 schreef Jonas Maebe via fpc-devel:

On 2022-06-07 11:09, Joost van der Sluis via fpc-devel wrote:


This is a snippet of the information that the compiler typically
generates: (x86_64-linux)

fde:
<    0><0x00401090:0x004010c1>
    0x00401090:  
    0x00401091:   r16=-8(cfa) >

    0x004010c0:  

This basically means that when the instruction-pointer is at
0x00401090, the CFA (frame) can be obtained by taking register 7 (rsp)
and add 8 to it.
The return address (called r16 here) if obtained by taking the CFA,
substract 8 and then read the value at that memory location.

So far so good. But then I need the next frame. So use the return
address, substract one (To obtain the call address). And start over...
but, the value of r7 is not available anymore.


The CFA (call frame address) is defined as "the value of %rsp at the 
call site in the previous frame" (*). So the value you calculated above 
in the first rule is the value of r7 in the previous frame and the call 
site address.


Thanks, also for the link. Good to know that it is defined officially 
that way.


Regards,

Joost
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel


Re: [fpc-devel] CFI

2022-06-07 Thread Jonas Maebe via fpc-devel




On 2022-06-07 11:09, Joost van der Sluis via fpc-devel wrote:


This is a snippet of the information that the compiler typically
generates: (x86_64-linux)

fde:
<0><0x00401090:0x004010c1>
0x00401090:  
0x00401091:   r16=-8(cfa) >

0x004010c0:  

This basically means that when the instruction-pointer is at
0x00401090, the CFA (frame) can be obtained by taking register 7 (rsp)
and add 8 to it.
The return address (called r16 here) if obtained by taking the CFA,
substract 8 and then read the value at that memory location.

So far so good. But then I need the next frame. So use the return
address, substract one (To obtain the call address). And start over...
but, the value of r7 is not available anymore.


The CFA (call frame address) is defined as "the value of %rsp at the 
call site in the previous frame" (*). So the value you calculated above 
in the first rule is the value of r7 in the previous frame and the call 
site address.



Jonas

(*) 
https://gitlab.com/x86-psABIs/x86-64-ABI/-/jobs/2486914365/artifacts/download, 
definition of _Unwind_GetCFA

___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel