This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

gcc accumulates instead of overlaying frame variables


I am submitting this as instructed, as a last resort, because

(1) I can't figure out how to attach files in the bugzilla page; and
(2) I can't find a gccbug script in a 3.3 source package.

So here are the things from

gcc -v -save-temps x.c f.c

$ tar tvf gnu.tar
drwxrwxr-x leblanc/leblanc   0 2004-05-12 12:50:24 ./
-rw-rw-r-- leblanc/leblanc 152 2004-05-12 12:12:33 ./x.c
-rw-rw-r-- leblanc/leblanc  76 2004-05-12 12:10:54 ./f.c
-rw-rw-r-- leblanc/leblanc 207 2004-05-12 12:49:20 ./x.i
-rw-rw-r-- leblanc/leblanc 367 2004-05-12 12:49:20 ./x.s
-rw-rw-r-- leblanc/leblanc 134 2004-05-12 12:49:20 ./f.i
-rw-rw-r-- leblanc/leblanc 437 2004-05-12 12:49:20 ./f.s
-rw-rw-r-- leblanc/leblanc 2776 2004-05-12 12:49:20 ./stderr

See the source down below. SUN and Metaware believe, correctly, that the
two blocks overlay each other in the final stack frame. GCC adds them
together. It looks like this mistake has been around for quite a while.


(1) on Solaris

    SUN
        % /opt/SUNWspro/bin/cc -V
        cc: Sun WorkShop 6 2000/04/07 C 5.1

        % /opt/SUNWspro/bin/cc x.c f.c
        x.c:
        f.c:

        % ./a.out
        frame is about 612 bytes
        frame is about 612 bytes

HighC
% hc x.c f.c -Hcopyr
x.c:
MetaWare High C Compiler R2.8 Serial 1-SKY-799999.
(c) Copyright 1987-98, MetaWare Incorporated
f.c:
w "f.c",L4/C3(#291): printf: Function called but not declared.
No errors 1 warning


        % ./a.out
        frame is about 608 bytes
        frame is about 608 bytes

GCC
% gcc -v
Reading specs from /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/2.95.3/specs
gcc version 2.95.3 20010315 (release)


% gcc x.c f.c

        % ./a.out
        frame is about 1136 bytes
        frame is about 624 bytes
(2) on YDL 3.0

        $ gcc -v
        ...
        gcc version 3.3

$ gcc x.c f.c

        $ ./a.out
        frame is about 547 bytes
        frame is about 1059 bytes

SOURCE

        % cat f.c
        void foo(char *p)
        {
          char x;
          printf("frame is about %d bytes\n",p-&x);
        }

% cat x.c

#define N 512

extern void foo(char *p);

        int main()
        {
          {
            char x[N];
            foo(&x[N-1]);
          }
          {
            char x[N];
            foo(&x[N-1]);
          }
          return 0;
        }

Attachment: gnu.tar
Description: Unix tar archive


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]