tiemann@SUN.COM (Michael Tiemann) (11/18/89)
This should help people with problems like this: f(_,_,_, new Foo) // works ("new Foo" pushed first) f(_,_, new Foo, _) // doesn't t = new Foo; f(_,_,t,_) // does // For anyone having the same problem: compiling with -fno-defer-pop // will provide a temporary workaround... If anybody has been using -fno-defer-pop as a preventative measure on Sun3, please try these fixes and see if -fno-defer-pop is still neccessary for correct behavior. This should also cure the problem of some functions starting out with mysterious pops. Thanks, Michael teacake% diff -c2 cplus-init.c~ cplus-init.c *** cplus-init.c~ Sat Nov 18 05:12:57 1989 --- cplus-init.c Sat Nov 18 05:42:56 1989 *************** *** 2603,2606 **** --- 2603,2607 ---- TREE_TYPE (xval) = TREE_TYPE (rval); + do_pending_stack_adjust (); start_sequence (); *************** *** 2615,2620 **** expand_aggr_init (build_indirect_ref (rval, 0), init, 0); TREE_VOLATILE (xval) = 1; - emit_insn (gen_sequence ()); RTL_EXPR_SEQUENCE (xval) = get_insns (); end_sequence (); --- 2616,2622 ---- expand_aggr_init (build_indirect_ref (rval, 0), init, 0); + do_pending_stack_adjust (); + TREE_VOLATILE (xval) = 1; RTL_EXPR_SEQUENCE (xval) = get_insns (); end_sequence (); *************** *** 3414,3417 **** --- 3416,3420 ---- TREE_TYPE (rval) = void_type_node; + do_pending_stack_adjust (); start_sequence (); emit_note (0, -1); *************** *** 3420,3425 **** dtor_dummy, auto_delete_vec, auto_delete); TREE_VOLATILE (rval) = 1; - emit_insn (gen_sequence ()); RTL_EXPR_SEQUENCE (rval) = get_insns (); end_sequence (); --- 3423,3429 ---- dtor_dummy, auto_delete_vec, auto_delete); + do_pending_stack_adjust (); + TREE_VOLATILE (rval) = 1; RTL_EXPR_SEQUENCE (rval) = get_insns (); end_sequence (); teacake%