Mercurial > hg > CbC > old > device
diff test/stackframe.c @ 667:dbfbeb05210c before-ia32-function
*** empty log message ***
author | kono |
---|---|
date | Tue, 01 May 2007 13:26:42 +0900 |
parents | |
children | 1530b1a636ac |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/stackframe.c Tue May 01 13:26:42 2007 +0900 @@ -0,0 +1,55 @@ +extern int printf(const char *,...); +// extern void *alloca(int); + +#define A0 0xa0a0a0a0 +#define A1 0xa1a1a1a1 +#define A2 0xa2a2a2a2 +#define A3 0xa3a3a3a3 +#define A4 0xa4a4a4a4 + +#define L0 0xb0b0b0b0 +#define L1 0xb1b1b1b1 +#define L2 0xb2b2b2b2 +#define L3 0xb3b3b3b3 +#define L4 0xb4b4b4b4 + +void *ret; + +void +frame(int a0,int a1,int a2) +{ + int l0 = L0; + int *top = (int *)__builtin_alloca(16); + int *p; + int i = 0; + int l1 = L1; + + *top = L2; + for(p = top;p<top+0x100; ) { + if (*p==(int)ret) { + printf("%04x: ret address\n",i); + } else if (*p==A0) { + printf("%04x: caller arg 1\n",i); + } else if (*p==A2) { + printf("%04x: caller arg last\n",i); + } else if (*p==L0) { + printf("%04x: local var top\n",i); + } else if (*p==L1) { + printf("%04x: local var end\n",i); + } else if (*p==L2) { + printf("%04x: stack top (alloca)\n",i); + } + i+= sizeof(int); + p++; + } +} + + +int +main() +{ + ret = &&label; + frame(A0,A1,A2); +label: + return 0; +}