Mercurial > hg > CbC > old > device
changeset 178:0f395aa93438
gcc include file
author | kono |
---|---|
date | Sun, 30 Nov 2003 04:30:27 +0900 |
parents | 352feeae4b0a |
children | fde8cb5d9254 |
files | Changes mc-code-powerpc.c mc-parse.c mc.h stdio.h |
diffstat | 5 files changed, 158 insertions(+), 56 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Fri Nov 28 15:16:43 2003 +0900 +++ b/Changes Sun Nov 30 04:30:27 2003 +0900 @@ -3560,7 +3560,7 @@ いや、やっぱり、中間木をなんとかするのかなぁ。 -とりあえず、無視。 +とりあえず、無視。普通の関数(static)としてcompileする。 やっぱり、long long はいるのね〜 @@ -3575,6 +3575,35 @@ volatile ... (なにすればいいんだろう?) なんか、*.c 以外だとソースを上書きしちゃうんじゃ... + (これは直しました) うーん、struct のtagとtype名を一緒にされちゃうのか... こういうことをされると変数テーブルを直さないと動かせない... +TYPE_TAG みたいなアドホックなどだと直せない。 +なんとかなんないかなぁ。 + +あと、struct のforward definition ってのがあるみたいね。 + +#if defined(A) && A で、後ろが評価されちゃうみたいだけど。そ +うすると後ろの名前がdefineされてしまう。ふーむ。こんなのどう +やって防げばいいんだ? + +やっぱりlong long を64bit にしないとファイルサイズが +合わない。 + +やっぱり include は、そのファイルのある場所から読み込む +性質があるのか。 + +Sat Nov 29 19:01:26 JST 2003 + +typedef enum { + ... + REGS_SAVED_ALL /* All registers */ +} regs_saved_t; + +やっぱり、あるのね。 + + +void (*signal ()) (int); + +が動かなくなってます。
--- a/mc-code-powerpc.c Fri Nov 28 15:16:43 2003 +0900 +++ b/mc-code-powerpc.c Sun Nov 30 04:30:27 2003 +0900 @@ -302,6 +302,7 @@ { macro_define("__ppc__ 1\n"); macro_define("__BIG_ENDIAN__ 1\n"); + macro_define("_BSD_CT_RUNE_T_ int\n"); init_ptr_cache(); }
--- a/mc-parse.c Fri Nov 28 15:16:43 2003 +0900 +++ b/mc-parse.c Sun Nov 30 04:30:27 2003 +0900 @@ -90,6 +90,8 @@ static void set_converter(char *s); static void statement(void); static int correct_type(int e,int t); +static NMTBL *get_tag(NMTBL *n) ; +static NMTBL *get_type(NMTBL *n) ; static int struct_return = 0; @@ -97,6 +99,8 @@ static int stypedecl; static int fields; +static int in_macro_if = 0; + static Converter *conv = &null_converter; /* Converter *conv = &c_converter; */ @@ -301,6 +305,10 @@ newfile(); macro_define("__micro_c__ 1\n"); + // macro_define("__pure2\n"); + // macro_define("__dead2\n"); + macro_define("__restrict\n"); + macro_define("__micro_c__ 1\n"); #ifdef __APPLE__ macro_define("__APPLE__ 1\n"); #endif @@ -448,7 +456,7 @@ code_decl(n); return; } else if (car(type)==FUNCTION) { fdecl(n); return; - } else error(TYERR); + } else error(DCERR); } conv->return_type_(type,n,sd); def(n); @@ -494,7 +502,7 @@ getsym(); break; case ENUM: - t=edecl(); + t = edecl(); break; case STRUCT: case UNION: @@ -507,12 +515,11 @@ else if (sym==SHORT) { getsym(); t = USHORT; } else if (sym==LONG) { getsym(); - // t = ULONG; t = UNSIGNED; if(sym==LONG) { getsym(); - // t=ULONGLONG; - t=UNSIGNED; + t=ULONGLONG; + // t=UNSIGNED; } else if(sym==INT) { getsym(); t=UNSIGNED; @@ -528,18 +535,21 @@ getsym(); if(sym==LONG) { getsym(); - // t=LONGLONG; - t=INT; + t=LONGLONG; + // t=INT; + } else if(sym==DOUBLE) { + getsym(); + t=DOUBLE; } else if(sym==INT) getsym(); break; default: if(sym==IDENT) { - if(nptr->sc==TYPE) { + if((nptr=get_type(nptr))->sc==TYPE) { t=nptr->ty; typedefed=glist2((int)nptr,typedefed); getsym(); break; - } else if(nptr->sc==EMPTY && gnptr->sc==TYPE) { + } else if(nptr->sc==EMPTY && (gnptr=get_type(gnptr))->sc==TYPE) { getsym(); break; } @@ -612,7 +622,7 @@ n->dsp=0; if(stmode==EXTRN) n->sc=EXTRN; if(stmode==STATIC) n->sc=STATIC; - else n->sc=EXTRN; /* this is odd... */ + // else n->sc=EXTRN; /* this is odd... */ if (type==CODE) { n->ty=CODE; if(sym==RPAR) { @@ -664,7 +674,7 @@ args = 0; n->dsp=0; for(;;) { - if(sym==IDENT && nptr->sc!=TYPE) { + if(sym==IDENT && (nptr=get_type(nptr))->sc!=TYPE) { type=INT; /* naked argument, old K&R C */ def(nptr); getsym(); @@ -864,11 +874,15 @@ else if ( n->sc==REGISTER && n->ty==INT); else error(DCERR); } else if (mode==GSDECL||mode==LSDECL) { - if (n->sc==FIELD && n->dsp==disp); - else error(DCERR); +// if (n->sc==FIELD && n->dsp==disp); +// else error(DCERR); } else if (mode==GUDECL||mode==LUDECL) { if (n->sc==FIELD && n->dsp==0); else error(DCERR); + } else if (mode==GTDECL && n->sc==TAG) { + n = gnptr = get_type(n); + } else if (mode==LTDECL && n->sc==TAG) { + n = nptr = get_type(n); } else error(DCERR); } sz = size(n->ty = type); @@ -1158,6 +1172,9 @@ if (sdecl_f) conv->id_(sym,nptr); if (getsym() == LC) { if (sdecl_f) conv->lc_(); + nptr0 = get_tag(nptr0); + if(nptr0->sc == EMPTY) nptr0=gnptr0; + nptr0 = get_tag(nptr0); if (nptr0->sc != EMPTY) error(DCERR); nptr0->sc = TAG; nptr0->ty = list4(s,-1,0,(int)nptr0); @@ -1167,8 +1184,10 @@ /* type0 = list4(s,disp,fields,0); now ... */ } else { /* struct tag name */ + nptr0 = get_tag(nptr0); if(nptr0->sc == EMPTY) nptr0=gnptr0; - if(nptr0->sc == EMPTY) error(UDERR); + nptr0 = get_tag(nptr0); + if(nptr0->sc == EMPTY) nptr0->sc = TAG; if(nptr0->sc != TAG) error(TYERR); fields = caddr(nptr0->ty); disp = cadr(nptr0->ty); @@ -1196,8 +1215,8 @@ int smode=mode; int sdisp=disp; NMTBL *nptr0; - smode=mode; - if (mode==GDECL || mode==GEDECL) + + if (mode==GDECL || mode==GTDECL) mode=GEDECL; else mode=LEDECL; @@ -1383,14 +1402,13 @@ { if(!(mode==GDECL||mode==ADECL)|| (car(type)!=FUNCTION&&car(type)!=CODE)) error(DCERR); - if(is_code(n)) compatible(cadr(n->ty),cadr(type)); + if (n->sc==EMPTY) { + n->sc=EXTRN; + n->ty=type; + } else if(is_code(n)) compatible(cadr(n->ty),cadr(type)); else if(is_function(n)) compatible(cadr(n->ty),cadr(type)); else { - if (n->sc==EMPTY) { - n->sc=EXTRN; - n->ty=type; - } else - error(DCERR); + error(DCERR); } } @@ -2472,7 +2490,9 @@ e1=expr15(list2(FNAME,(int)nptr)); break; } else { - nptr->sc = EXTRN1; + if (!in_macro_if) { + nptr->sc = EXTRN1; + } nptr->ty= glist3(FUNCTION,INT,0); e1=list2(FNAME,(int)nptr); type=list3(nptr->sc,nptr->ty,nptr->dsp); @@ -3162,6 +3182,7 @@ return (sym==MACRO); } if (mode==IFDEF) { + nptr = nptrm; if (nptrm->sc == MACRO||nptrm->sc==FMACRO) { return (symval=1); } else { @@ -3186,6 +3207,10 @@ lfree = slfree; if (lsrc && !asmf && nptrm->sc==FMACRO) gen_comment(macro_buf); macropp[-1] =0; + if (macro_buf[0]==0) { + mode = i; + return getsym(); + } chptrsave = list2((int)chptr,chptrsave); chsave = list2(chptr[-1],chsave); chptr = macro_buf; @@ -3198,7 +3223,7 @@ if (nptr0->sc == RESERVE) return sym = nptr0->dsp; sym = IDENT; gnptr=nptr=nptr0; - if (mode==ADECL && nptr0->sc ==TYPE) return sym; + if (mode==ADECL && (nptr0=get_type(nptr0))->sc ==TYPE) return sym; if (mode==GDECL || mode==GSDECL || mode==GUDECL || mode==GTDECL || mode==TOP || mode==GEDECL) { return sym; @@ -3353,7 +3378,6 @@ return getsym(); case 0: case '\n': - getch(); return getsym(); default: error(CHERR); @@ -3361,6 +3385,51 @@ } } +static NMTBL * +other_sym(NMTBL *n) +{ + NMTBL *nptr,*iptr; + + nptr = n+1; + if (ntable <= n && n < ntable + GSYMS) { /* global */ + while(nptr->sc!=0 && neqname(nptr->nm,n->nm)) { + if (++nptr== &ntable[GSYMS]) + nptr=ntable; + if (nptr==iptr) error(GSERR); + } + } else if (ntable+GSYMS <= n && n <= ntable + GSYMS + LSYMS) { /* local */ + while(nptr->sc!=0 && neqname(nptr->nm,n->nm)) { + if (++nptr== &ntable[LSYMS+GSYMS]) + nptr= &ntable[GSYMS]; + if (nptr==iptr) error(LSERR); + } + } else error(-1); + if (nptr->sc == 0) { + copy(nptr,name); + nptr->sc=EMPTY; + } + return nptr; +} + + +static NMTBL * +get_tag(NMTBL *n) +{ + if (n->sc == EMPTY) return n; + if (n->sc == TAG) return n; + if (n->sc != TYPE) return n; + return other_sym(n); +} + +static NMTBL * +get_type(NMTBL *n) +{ + if (n->sc == EMPTY) return n; + if (n->sc == TYPE) return n; + if (n->sc != TAG) return n; + return other_sym(n); +} + static int postequ(int s1, int s2) { @@ -3680,9 +3749,11 @@ for(c=0;chptr[c];c++); chptr[c] = ';'; /* this can't happen in macro expression */ ch= *chptr; + in_macro_if = 1; getsym(); /* i=cexpr(expr(1)); #if allow undefined symbols.. */ i=expr(1); + in_macro_if = 0; if (car(i)==CONST) i=cadr(i); else i=0; if (ch) { @@ -3762,13 +3833,14 @@ } if (macro_if_skip) return; if (macroeq("define")) { + ch= *chptr; macro_define0(); *(chptr = linebuf) = '\0'; } else if (macroeq("undef")) { i=mode; - mode=LDECL; + mode=IFDEF; ch= *chptr; - if (getsym() == IDENT) { + if (getsym()) { if (nptr->sc == MACRO) { nptr->sc = EMPTY; } else if (nptr->sc == FMACRO) { @@ -3848,9 +3920,10 @@ int i,args,c; i=mode; mode=MDECL; - ch= *chptr; + // ch= *chptr; ?? +// fprintf(stderr,"macro def: ch %c *chptr %c\n",ch,*chptr); getsym(); -/* fprintf(stderr,"macro def: %s =>",name); */ +// fprintf(stderr,"macro def: %s =>",name); if (nptr->sc != EMPTY) { /* override exisiting macro */ } args = 0; @@ -3873,7 +3946,7 @@ *cheapp++ = '\0'; if (cheapp >= cheap+CHEAPSIZE) /* too late? */ error(STRERR); -/* fprintf(stderr,"%s\n",(char *)car(nptr->dsp)); */ +// fprintf(stderr,"%s\n",(char *)car(nptr->dsp)); mode=i; } @@ -4148,7 +4221,7 @@ switch (mode) { case GDECL: case GSDECL: case GUDECL: case GTDECL: - case MDECL: case ADECL: case LSDECL: case LUDECL: + case MDECL: case ADECL: case LSDECL: case LUDECL: case GEDECL: e=gfree; gfree+=n; break;
--- a/mc.h Fri Nov 28 15:16:43 2003 +0900 +++ b/mc.h Sun Nov 30 04:30:27 2003 +0900 @@ -47,30 +47,29 @@ #define SIZEOF (-31) #define TYPE (-32) #define LONG (-33) -#define ULONG (-34) -#define SHORT (-35) -#define USHORT (-36) -#define EXTRN (-37) -#define EXTRN1 (-38) -#define VOID (-39) -#define INLINE (-40) -#define REGISTER (-41) -#define FREGISTER (-42) -#define DREGISTER (-43) -#define CODE (-44) -#define ENVIRONMENT (-45) -#define DEFINED (-46) -#define ENUM (-47) -#define KONST (-48) -#define FMACRO (-49) -#define LMACRO (-50) -#define DOTS (-51) +#define SHORT (-34) +#define USHORT (-35) +#define EXTRN (-36) +#define EXTRN1 (-37) +#define VOID (-38) +#define INLINE (-39) +#define REGISTER (-40) +#define FREGISTER (-41) +#define DREGISTER (-42) +#define CODE (-43) +#define ENVIRONMENT (-44) +#define DEFINED (-45) +#define ENUM (-46) +#define KONST (-47) +#define FMACRO (-48) +#define LMACRO (-49) +#define DOTS (-50) -#define FLOAT (-52) -#define DOUBLE (-53) -#define LONGLONG (-54) -#define ULONGLONG (-55) -#define VOLATILE (-56) +#define FLOAT (-51) +#define DOUBLE (-52) +#define LONGLONG (-53) +#define ULONGLONG (-54) +#define VOLATILE (-55) /* reserved word end */