Frame pointer for Thumb-2 non-leaf functions

Denis Khalikov d.khalikov@partner.samsung.com
Wed Jul 11 18:06:00 GMT 2018


 > The AAPCS does not define a frame pointer, so any code that uses one may
 > implement it in any way that it sees fit.  It can only be used
 > internally within that function.

It's good to know, because AddressSanitizer's "fast unwinder" relies on
predictable location of the frame pointer.
Thanks.

On 07/11/2018 07:35 PM, Richard Earnshaw (lists) wrote:
> On 11/07/18 16:12, Denis Khalikov wrote:
>> Hello everyone,
>> I have a question about frame pointer for the thumb mode.
>>
>> This is my example:
>>
>> $cat a.cc
>> __attribute__((noinline)) int bar(int a) { return a + 1; }
>> __attribute__((noinline)) int foo(int a) { return bar(a + 1); }
>> int main(int argc, char **argv) { return foo(argc); }
>>
>> $armv7l-linux-gnueabi-g++ --version
>> armv7l-linux-gnueabi-g++ (GCC) 9.0.0 20180709 (experimental)
>>
>> $armv7l-linux-gnueabi-g++ -o a.S a.cc -fno-omit-frame-pointer -S -marm
>>
>> The prologue for the foo () function is:
>>
>>   push	{fp, lr}
>>   add	fp, sp, #4
>>   sub	sp, sp, #8
>>
>> Current fp points to lr on the stack, so it's easy to find previous fp
>> on the stack.
>>
>> But, if we look at the same function with thumb mode, we will see the
>> difference:
>>
>> $armv7l-linux-gnueabi-g++ -o a.S a.cc -fno-omit-frame-pointer -S -mthumb
>>
>>   push	{r7, lr}
>>   sub	sp, sp, #8
>>   add	r7, sp, #0
>>
>> In this case the frame pointer points to the top of the stack (in case
>> stack grows downward) or whatever thumb_set_frame_pointer() function
>> will emit. So, looks like it's impossible to find the previous frame
>> pointer at the runtime, because we should know the amount of the local
>> vars and the size of them, in my example.
>>
>> Also, as far as I understood, clang produce code with frame pointer
>> which points to the predictable location for the arm and thumb modes.
>>
>> $clang++ -o a.S a.cc -fno-omit-frame-pointer -mthumb -S -target armv7l
>>
>>   push	{r7, lr}
>>   mov	r7, sp
>>   sub	sp, #8
>>
>> $clang++ -o a.S a.cc -fno-omit-frame-pointer -marm -S -target armv7l
>>
>>   push	{r11, lr}
>>   mov	r11, sp
>>   sub	sp, sp, #8
>>
>> So, my question is, does GCC has any restrictions about frame layout
>> generation for the thumb mode or it could be rewrited ?
>> Thanks.
>>
>
> The AAPCS does not define a frame pointer, so any code that uses one may
> implement it in any way that it sees fit.  It can only be used
> internally within that function.
>
> R.
>
>
>



More information about the Gcc-help mailing list