Re: alloca attribute?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Perry Smith writes:
 > On Nov 29, 2006, at 8:24 AM, Andrew Haley wrote:
 > 
 > > Perry Smith writes:
 > >>
 > >> On Nov 29, 2006, at 4:19 AM, Andrew Haley wrote:
 > >>
 > >>> Perry Smith writes:
 > >> No, I did not.  I thought it would be too big a task and I'm
 > >> willing to put a try/catch after the stack has been changed so the
 > >> unwind does not need to go through this.  This may be naive.  (See
 > >> more below).
 > >
 > > You'll need unwinder data, sooner or later.  But let's leave it for
 > > later, it's not strictly relevant to what you need now.
 > 
 > O.k.
 > 
 > >>
 > >> But in optimized code, the compiler does not load r1 with r1(0).
 > >> It assumes that r1 has not changed, and it knows the size of the
 > >> stack frame, it just adds the size of the stack frame to r1.  This
 > >> will be the same address if r1 has not been changed.
 > >
 > > Right.
 > >
 > >> It seems like (but I may be wrong), even with the DWARF unwinder
 > >> information, the compiler will still produce the code that adds the
 > >> size of the stack from to r1 to get r1 to point to the previous
 > >> stack frame instead of loading r1 with r1 (0).
 > >
 > > Sure, but why would it matter?  Your newStack routine should do
 > > something like
 > >
 > > newStack:
 > > 	  save caller registers somewhere
 > > 	  load new stack and frame pointer
 > > 	  call <foo> -- whatever it is you want to run on the new stack
 > > 	  restore caller registers, including stack and frame pointer
 > > 	  return
 > >
 > > so it should not metter how the caller of newStack uses its stack
 > > frame or what foo does.  As long as you conform to the ABI you'll be
 > > OK.
 > 
 > Ahh... I think I see your confusion.  newStack does not call <foo>.
 > I could do that and it would probably be safer, easier.  But
 > sometimes newStack would need to call foo(a) and other times it
 > would need to call foo(a, b), etc.  I thought about using varargs
 > so that any foo that is called must take a varargs argument.  That
 > approach, obviously, is doable but imposes several restriction.
 > 
 > But then I hit upon this other idea (which may suck).  newStack
 > simply mucks with the stack and returns back to testit (the routine
 > that calls newStack). 

You're right.  It sucks.  :-)

 > I wish I could include some graphics but I'll try to describe it
 > with words.

No, you've explained it perfectly well, but trust me here: it's a
really bad idea.  gcc can eliminate the stack pointer to the frame
pointer, as you have discovered.  gcc can also save a pointer to a
local area on the stack, and that can be of indeterminate size.

So gcc might do this

   int a = 2;
   p = &a;  // allocated on the stack
   newStack();
   *p = 3;
   print a;

And a, being on the new stack, would now be different from *p, which
still points to the old stack.  It can't possibly work.

Andrew.

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux