#include "cgraph.h"
#include "except.h"
-#ifndef STACK_POINTER_OFFSET
-#define STACK_POINTER_OFFSET 0
-#endif
-
/* Like PREFERRED_STACK_BOUNDARY but in units of bytes, not bits. */
#define STACK_BYTES (PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT)
if the context of the call as a whole permits. */
inhibit_defer_pop = old_inhibit_defer_pop;
- /* Don't bother cleaning up after a noreturn function. */
- if (ecf_flags & (ECF_NORETURN | ECF_LONGJMP))
- return;
-
if (n_popped > 0)
{
if (!already_popped)
if (rounded_stack_size != 0)
{
- if (ecf_flags & ECF_SP_DEPRESSED)
+ if (ecf_flags & (ECF_SP_DEPRESSED | ECF_NORETURN | ECF_LONGJMP))
/* Just pretend we did the pop. */
stack_pointer_delta -= rounded_stack_size;
else if (flag_defer_pop && inhibit_defer_pop == 0
/* Start updating where the next arg would go.
- On some machines (such as the PA) indirect calls have a difuferent
+ On some machines (such as the PA) indirect calls have a different
calling convention than normal calls. The last argument in
INIT_CUMULATIVE_ARGS tells the backend if this is an indirect call
or not. */
emit_barrier_after (last);
- /* Stack adjustments after a noreturn call are dead code. */
- stack_pointer_delta = old_stack_allocated;
- pending_stack_adjust = 0;
+ /* Stack adjustments after a noreturn call are dead code.
+ However when NO_DEFER_POP is in effect, we must preserve
+ stack_pointer_delta. */
+ if (inhibit_defer_pop == 0)
+ {
+ stack_pointer_delta = old_stack_allocated;
+ pending_stack_adjust = 0;
+ }
}
if (flags & ECF_LONGJMP)