summaryrefslogtreecommitdiff
path: root/bcc/function.c
diff options
context:
space:
mode:
Diffstat (limited to 'bcc/function.c')
-rw-r--r--bcc/function.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/bcc/function.c b/bcc/function.c
index e3dcd61..1f8b6f3 100644
--- a/bcc/function.c
+++ b/bcc/function.c
@@ -271,7 +271,18 @@ PRIVATE void out_callstring()
PUBLIC void popframe()
{
#ifdef STUPIDFRAME
- poplist(callee1mask); /*XXX: Add if round this */
+#ifndef NO_DEL_PUSH
+ if (optimise && !callersaves) {
+ outstr("if ");
+ outstr(funcname);
+ outnstr(".off=0");
+ }
+ poplist(callee1mask);
+ if (optimise && !callersaves)
+ outnstr("endif");
+#else
+ poplist(callee1mask);
+#endif
poplist(FRAMEREG);
#else
poplist(frame1list);
@@ -313,7 +324,18 @@ PUBLIC void reslocals()
pushreg(FRAMEREG);
regtransfer(STACKREG, FRAMEREG);
framep = sp;
- pushlist(callee1mask); /*XXX: Add if round this */
+#ifndef NO_DEL_PUSH
+ if (optimise && !callersaves) {
+ outstr("if ");
+ outstr(funcname);
+ outnstr(".off=0");
+ }
+ pushlist(callee1mask);
+ if (optimise && !callersaves)
+ outnstr("endif");
+#else
+ pushlist(callee1mask);
+#endif
# else /* not STUPIDFRAME */
# ifdef CANHANDLENOFRAME
if (stackarg || softsp != -frameregsize) /* args or locals */