void __attribute__ ((noipa, noinline)) my_puts (const char *str) { } void __attribute__ ((noipa, noinline)) my_free (void *p) { } struct Node { struct Node *child; }; struct Node space[2] = { }; struct Node * __attribute__ ((noipa, noinline)) my_malloc (int bytes) { return &space[0]; } void walk (struct Node *module, int cleanup) { if (module == 0) { return; } if (!cleanup) { my_puts ("No cleanup"); } walk (module->child, cleanup); if (cleanup) { my_free (module); } } int main () { struct Node *node = my_malloc (sizeof (struct Node)); node->child = 0; walk (node, 1); }