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 */
 
--- a/stdio.h	Fri Nov 28 15:16:43 2003 +0900
+++ b/stdio.h	Sun Nov 30 04:30:27 2003 +0900
@@ -1,4 +1,4 @@
-#ifndef __micro_c__
+#ifndef __micro_c__aaa
 #include "/usr/include/stdio.h"
 #else