|
@@ -308,7 +308,14 @@ unit cgcpu;
|
|
|
list.concat(Taicpu.op_none(A_EMMS,S_NO));
|
|
|
|
|
|
{ remove stackframe }
|
|
|
- if not nostackframe then
|
|
|
+ if not(nostackframe) and
|
|
|
+ { we do not need an exit stack frame when we never return
|
|
|
+
|
|
|
+ * the final ret is left so the peephole optimizer can easily do call/ret -> jmp or call conversions
|
|
|
+ * the entry stack frame must be normally generated because the subroutine could be still left by
|
|
|
+ an exception and then the unwinding code might need to restore the registers stored by the entry code
|
|
|
+ }
|
|
|
+ not(po_noreturn in current_procinfo.procdef.procoptions) then
|
|
|
begin
|
|
|
if (current_procinfo.framepointer=NR_STACK_POINTER_REG) or
|
|
|
(current_procinfo.procdef.proctypeoption=potype_exceptfilter) then
|