Quellcode durchsuchen

Improved symbol table for grind

ceriel vor 32 Jahren
Ursprung
Commit
164c4c6997
5 geänderte Dateien mit 50 neuen und 3 gelöschten Zeilen
  1. 0 3
      lang/m2/comp/declar.g
  2. 18 0
      lang/m2/comp/stab.c
  3. 9 0
      lang/m2/comp/type.c
  4. 18 0
      lang/pc/comp/stab.c
  5. 5 0
      lang/pc/comp/type.c

+ 0 - 3
lang/m2/comp/declar.g

@@ -188,9 +188,6 @@ TypeDeclaration
 	'=' type(&tp)
 			{ DeclareType(nd, df, tp);
 			  FreeNode(nd);
-#ifdef DBSYMTAB
-			  if (options['g']) stb_string(df, D_TYPE);
-#endif /* DBSYMTAB */
 			}
 ;
 

+ 18 - 0
lang/m2/comp/stab.c

@@ -247,6 +247,24 @@ stb_type(tp, assign_num)
 	}
 }
 
+stb_addtp(s, tp)
+	char	*s;
+	t_type	*tp;
+{
+	create_db_str();
+	adds_db_str(s);
+	addc_db_str(':');
+	addc_db_str('t');
+	stb_type(tp, 1);
+	addc_db_str(';');
+	C_ms_stb_cst(db_str.base,
+		     N_LSYM,
+		     tp == void_type || tp->tp_size >= max_int[2]
+		       ? 0
+		       : (int)tp->tp_size,
+		     (arith) 0);
+}
+
 stb_string(df, kind)
 	register t_def *df;
 {

+ 9 - 0
lang/m2/comp/type.c

@@ -25,6 +25,7 @@
 #include	"node.h"
 #include	"scope.h"
 #include	"walk.h"
+#include	"main.h"
 #include	"chk_expr.h"
 #include	"warning.h"
 #include	"uns_arith.h"
@@ -673,6 +674,9 @@ DeclareType(nd, df, tp)
 			CheckForImports(df);
 		}
 	}
+#ifdef DBSYMTAB
+	if (options['g']) stb_string(df, D_TYPE);
+#endif
 
 	SolveForwardTypeRefs(df);
 }
@@ -688,6 +692,11 @@ SolveForwardTypeRefs(df)
 		df->df_kind = D_TYPE;
 		while (nd) {
 			nd->nd_type->tp_next = df->df_type;
+#ifdef DBSYMTAB
+			if (options['g'] && nd->nd_type->tp_dbindex < 0) {
+				stb_addtp("(forward_type)", nd->nd_type);
+			}
+#endif
 			nd = nd->nd_RIGHT;
 		}
 		FreeNode(df->df_forw_node);

+ 18 - 0
lang/pc/comp/stab.c

@@ -229,6 +229,24 @@ stb_type(tp, assign_num)
 	}
 }
 
+stb_addtp(s, tp)
+	char    *s;
+	struct type  *tp;
+{
+	create_db_str();
+	adds_db_str(s);
+	addc_db_str(':');
+	addc_db_str('t');
+	stb_type(tp, 1);
+	addc_db_str(';');
+	C_ms_stb_cst(db_str.base,
+		     N_LSYM,
+		     tp == void_type || tp->tp_size > 32767
+		       ? 0
+		       : (IsPacked(tp) ? (int) tp->tp_psize : (int)tp->tp_size),
+		     (arith) 0);
+}
+
 stb_string(df, kind)
 	register struct def *df;
 	long kind;

+ 5 - 0
lang/pc/comp/type.c

@@ -550,6 +550,11 @@ chk_forw_types()
 				  	   "identifier \"%s\" is not a type",
 					   df->df_idf->id_text);
 			fw_type->f_type->next = tp;
+#ifdef DBSYMTAB
+			if (options['g']) {
+				stb_addtp("(forward_type)", fw_type->f_type);
+			}
+#endif
 			fw_type = fw_type->f_next;
 		    }