This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Frame pointer for Thumb-2 non-leaf functions


> 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.





Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]