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;
+}