changeset 409:b72682778d75

ARM varargs
author kono
date Tue, 19 Oct 2004 09:14:01 +0900
parents b4375f895fd5
children 5a3b1b65c6a8
files Changes mc-code-arm.c mc-codegen.c stdio.h
diffstat 4 files changed, 20 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Mon Oct 18 23:44:38 2004 +0900
+++ b/Changes	Tue Oct 19 09:14:01 2004 +0900
@@ -6120,3 +6120,13 @@
 
 うーん、やっぱり構造体をレジスタに割り振るのってかなりめんどう
 なのね。特にネストする関数では...
+
+構造体はstack上で必ず align されるらしい。
+
+ARM の bitield なんだけど  |---====|=====|====----| と三つにまたがるのが
+許されるみたいだね。char でも |--===|===--| があるし。ってことは、かなり
+変えないとだめだてことだなぁ。あなあきでなければ、割りと正しく動くんだけど。
+
+残りは、stdarg と bitfield だけか。まぁ、いいんじゃない? stdarg は、
+stdarg.h を自分で作れば良いみたい。
+
--- a/mc-code-arm.c	Mon Oct 18 23:44:38 2004 +0900
+++ b/mc-code-arm.c	Tue Oct 19 09:14:01 2004 +0900
@@ -17,6 +17,7 @@
     "/Developer/Zaurus-X-gcc/opt/Embedix/tools/arm-linux/include/linux",
     "/home/zaurus/develop/include",
     "/home/zaurus/develop/include/linux",
+    "/home/zaurus/develop/lib/gcc-lib/armv4l-redhat-linux/2.95.1/include/",
     "/usr/include",
     0};
 
@@ -477,7 +478,7 @@
 /* #define __builtin_va_list int */\n\
 /* #define __builtin_va_start(ap,arg) ap=(((int)(&arg))+sizeof(arg)) */\n\
 /* #define __builtin_va_arg(ap,type)  (*((type *)ap)++) */\n\
-#define __builtin_next_arg(arg)  ap=((void *)(&arg)),va_arg(ap,typeof(arg))\n\
+#define __builtin_next_arg(arg)  (__gnuc_va_list)((char *)(&arg) + __va_rounded_size (typeof(arg)))
 #define __arm__ 1\n\
 #define __LITTLE_ENDIAN__ 1\n\
 #define __inline__\n\
@@ -492,7 +493,6 @@
 #define __const const\n\
 #define alloca __builtin_alloca\n\
 #define __restrict\n\
-#define __gnuc_va_list int\n\
 #define __flexarr\n\
 #define __const const\n\
 #define __THORW\n\
@@ -2649,18 +2649,14 @@
 void
 code_alloca(int e1,int reg)
 {
-    char *crn,*grn;
-    int g;
+    char *crn;
   
     g_expr(list3(BAND,list3(ADD,e1,list2(CONST,15)),list2(CONST,~15))); 
     use_int(reg);
-    g = get_register();
     crn = register_name(reg);
-    grn = register_name(g);
     inc_inst(2);
-    printf("\trsb\tsp, %s, sp\n",crn, grn);
+    printf("\trsb\tsp, %s, sp\n",crn);
     printf("\tmov\t%s, sp\n",crn);
-    free_register(g);
 }
 
 void
@@ -5846,8 +5842,8 @@
     case UCHAR: 		bitsz= 8; align=1;break; 
     case SHORT:         sign=1; bitsz=16; align=2;break; 
     case USHORT:        sign=1; bitsz=16; align=2;break; 
-    case LONGLONG:      sign=1; bitsz=64; align=8;l=1; break; 
-    case ULONGLONG:            	bitsz=64; align=8;l=1; break; 
+    case LONGLONG:      sign=1; bitsz=64; align=4;l=1; break; 
+    case ULONGLONG:            	bitsz=64; align=4;l=1; break; 
     default: error(-1);
     }
     *psign = sign;
@@ -5888,7 +5884,7 @@
 		i = l+bitsize;
 		*bfd = i;
 		*sz = (i+7)/8;
-// printf("# bitpos=%d bitsize=%d bitsz=%d offset=%d\n",l,bitsize,bitsz,*poffset);
+ printf("# bitpos=%d bitsize=%d bitsz=%d offset=%d\n",l,bitsize,bitsz,*poffset);
 		return l;
 	    } 
 	}
@@ -5903,7 +5899,7 @@
     *bfd = bitsize;
     *sz = (bitsize+7)/8;
 
-// printf("# bitpos=%d bitsize=%d bitsz=%d offset=%d\n",bitpos,bitsize,bitsz,*poffset);
+ printf("# bitpos=%d bitsize=%d bitsz=%d offset=%d\n",bitpos,bitsize,bitsz,*poffset);
     return bitpos;
 }
 
--- a/mc-codegen.c	Mon Oct 18 23:44:38 2004 +0900
+++ b/mc-codegen.c	Tue Oct 19 09:14:01 2004 +0900
@@ -3614,7 +3614,7 @@
     case 0: return disp-=sz;
     case 4:
 	disp-=sz;
-	if (sz==4) disp &= -4;
+	if (sz>=4) disp &= -4;
 	return disp;
     }
 }
--- a/stdio.h	Mon Oct 18 23:44:38 2004 +0900
+++ b/stdio.h	Tue Oct 19 09:14:01 2004 +0900
@@ -5,7 +5,7 @@
 void * realloc(void *ptr, size_t size);
 #else
 
-typedef int size_t;
+// typedef int size_t;
 
 long long strtoll(const char *, char **, int);
 void * realloc(void *ptr, size_t size);