Mercurial > hg > CbC > old > device
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; }