dlin@NYNEXST.COM (David Lin) (06/15/89)
Name : David Lin Organization : NYNEX corp. E-Mail : dlin@nynexst.com Machine : Sun 3/110 with 68881 OS : SunOS 3.5 configuration : config.g++ sun3 G++ version : 1.35.0 *********************************************** Command for compilation : g++ -S bug.cc -v ******************* Output ********************* g++ version 1.35.0 /usr/local1/lib/gcc-cpp -+ -v -undef -D__GNU__ -D__GNUG__ -D__cplusplus -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -D__HAVE_68881__ -Dmc68020 bug.cc /tmp/cca17942.cpp GNU CPP version 1.35 /usr/local1/lib/gcc-cc1plus /tmp/cca17942.cpp -quiet -dumpbase bug.cc -noreg -version -o bug.s GNU C++ version 1.35.0 (68k, MIT syntax) compiled by GNU C version 1.35. ******************** List of source ********************* 01 #include <stream.h> 02 03 /* when no constructor is defined, program works fine */ 04 05 class A { 06 int i; 07 public: // constructors : 08 A() { cout << "construct 1\n"; } 09 A(const A& b) { cout << "construct 2\n"; } 10 public: 11 A operator-(A); 12 friend ostream& operator<<(ostream& k, A) { return k; } 13 }; 14 15 A A::operator-(A k) { 16 cout << "doing minus\n"; 17 return(k); 18 } 19 20 main () 21 { 22 A a, d; 23 cout << "assignment done\n"; 24 cout << (a-d) << "Got it\n"; 25 } ******************************************** Problem: The program suppose to print out "Got it\n" at line 24. But it prints out garbage instead. Getting rid of both constructors eliminates the problem. Compilation with -S flag produced the following: Sympton: Incorrect assembly instruction in output. The temporary data space on stack is not allocated right. Therefore clobbering the data on the stack. ******************************************** #NO_APP gcc_compiled.: .text .even LC0: .double 0r0.00000000000000000000e+00 .even _op$alshift_expr_Sostream_SA: link a6,#0 movel a6@(8),d1 movel d1,d0 jra L513 L513: unlk a6 rts LC1: .ascii "construct 2\12\0" .even _A_PSA_SA: link a6,#0 movel d2,sp@- movel a6@(8),d2 tstl d2 jne L515 pea 4:w jbsr ___builtin_new movel d0,d2 addqw #4,sp L515: pea LC1 pea _cout jbsr _op$alshift_expr_PSostream_PQI addqw #8,sp movel d2,d1 movel d1,d0 jra L514 L514: movel a6@(-4),d2 unlk a6 rts LC2: .ascii "construct 1\12\0" .even _A_PSA: link a6,#0 movel d2,sp@- movel a6@(8),d2 tstl d2 jne L517 pea 4:w jbsr ___builtin_new movel d0,d2 addqw #4,sp L517: pea LC2 pea _cout jbsr _op$alshift_expr_PSostream_PQI addqw #8,sp movel d2,d1 movel d1,d0 jra L516 L516: movel a6@(-4),d2 unlk a6 rts LC3: .ascii "doing minus\12\0" .even .globl _op$minus_expr_PSA_SA _op$minus_expr_PSA_SA: link a6,#0 moveml #0x3800,sp@- movel a6@(8),d2 movel a1,d4 pea LC3 pea _cout jbsr _op$alshift_expr_PSostream_PQI moveq #12,d0 addl a6,d0 movel d0,sp@- movel d4,d3 movel d3,sp@- jbsr _A_PSA_SA jra L518 movel d4,d0 L518: moveml a6@(-12),#0x1c unlk a6 rts LC4: .ascii "assignment done\12\0" LC5: .ascii "Got it\12\0" .even .globl _main _main: link a6,#-8 moveml #0x3e00,sp@- movel a6,d2 subql #4,d2 movel d2,sp@- jbsr _A_PSA movel a6,d3 subql #8,d3 movel d3,sp@- jbsr _A_PSA pea LC4 pea _cout jbsr _op$alshift_expr_PSostream_PQI pea LC5 **************************** subw #0,sp | should be subw #8,sp movel sp,d6 addql #4,d6 subw #0,sp | should be subw #8,sp movel sp,d0 addql #4,d0 ***************************** movel a6,d1 subql #8,d1 movel d1,sp@- movel d0,sp@- jbsr _A_PSA_SA addqw #8,sp movel d0,d0 movel a6,d4 subql #4,d4 movel d4,sp@ movel d6,a1 jbsr _op$minus_expr_PSA_SA addqw #8,sp movel #_cout,sp@ jbsr _op$alshift_expr_Sostream_SA addqw #8,sp movel d0,d5 movel d5,sp@- jbsr _op$alshift_expr_PSostream_PQI addqw #8,sp L519: moveml a6@(-28),#0x7c unlk a6 rts ***************************************************** At the location marked, the rtl output is: ***************************************************** (insn 15 14 16 (set (reg:SI 15) (minus:SI (reg:SI 15) (const_int 0))) -1 (nil) (nil)) (insn 16 15 17 (set (reg:SI 59) (plus:SI (reg:SI 15) (const_int 4))) -1 (nil) (nil)) (insn 17 16 18 (set (reg:SI 15) (minus:SI (reg:SI 15) (const_int 0))) -1 (nil) (nil)) (insn 18 17 19 (set (reg:SI 60) (plus:SI (reg:SI 15) (const_int 4))) -1 (nil) (nil)) ***************************************************** If you need more info, please feel free to mail me. I have no access to gnu newsgroup, so I have no idea if the problem is been posted or not. -David