소스 검색

Modified for Solaris 2

ceriel 31 년 전
부모
커밋
5cdd5193e0

+ 14 - 5
mach/sparc/ce/back.src/do_open.c

@@ -3,13 +3,22 @@
 open_back( filename)
 char *filename;
 {
-	if ( filename == (char *) 0)
+	if ( filename == (char *) 0) {
 		codefile= STDOUT;
-	else
+#ifdef __solaris__
+		fprint(codefile, ".section \".text\"\n");
+#endif
+		return 1;
+	}
 #ifndef sys_close
-		return( sys_open( filename, OP_WRITE, &codefile));
+	if ( sys_open( filename, OP_WRITE, &codefile)) {
 #else
-		return (codefile = fopen(filename, "w")) != NULL;
+	if ((codefile = fopen(filename, "w")) != NULL) {
+#endif
+#ifdef __solaris__
+		fprint(codefile, ".section \".text\"\n");
 #endif
-	return 1;
+		return 1;
+	}
+	return 0;
 }

+ 9 - 5
mach/sparc/ce/cache.c.x

@@ -2,13 +2,12 @@
 
 #include <stdio.h>
 #include <assert.h>
+#include <alloc.h>
 #include "mach.h"
 
 #ifdef __STDC__
-#include <stdlib.h>
 #include <string.h>
 #else
-extern char *malloc();
 extern char *strcpy();
 #endif
 
@@ -108,6 +107,12 @@ static struct cache_elt cache[CACHE_SIZE], *tos = 0;
 static int c_count = 0;
 static const_str_t s;
 
+_PROTOTYPE(static void panic, (char*));
+_PROTOTYPE(static void dump_cache, (File *stream));
+_PROTOTYPE(static int cache_read, (int n, int i));
+_PROTOTYPE(static void flush_part_cache, (int c, int r, int f, int d));
+_PROTOTYPE(static void subst_reg, (reg_t, reg_t));
+
 static void panic(s)
 char *s;
 {
@@ -824,8 +829,7 @@ char *s;
 	char *p;
 
 enter("push_ext");
-	p = malloc(strlen(s)+1);
-	assert(p);
+	p = Malloc(strlen(s)+1);
 
 	INC_TOS;
 	tos->reg = reg_g0;
@@ -1282,7 +1286,7 @@ enter("dup_tos");
 			*tos = tos[-n];
 			if (tos->ext)
 			{
-				ext= malloc(strlen(tos->ext)+1);
+				ext= Malloc(strlen(tos->ext)+1);
 				strcpy(ext, tos->ext);
 				tos->ext= ext;
 			}

+ 1 - 1
mach/sparc/ce/ce.src/.distr

@@ -8,7 +8,7 @@ C_mes_end.c
 C_pnam.c
 C_rom_scon.c
 C_scon.c
-C_exp.c
+C_pro.c
 C_exa_dnam.c
 misc.c
 ms_reg.c

+ 1 - 0
mach/sparc/ce/ce.src/C_con_scon.c

@@ -3,6 +3,7 @@
 #include "mach.h"
 #include "back.h"
 
+void
 C_con_scon( s, n)
 char *s;
 arith n;

+ 1 - 0
mach/sparc/ce/ce.src/C_exa_dnam.c

@@ -2,6 +2,7 @@
 #include <em.h>
 #include "back.h"
 
+void
 C_exa_dnam( s)
 char *s;
 {

+ 28 - 0
mach/sparc/ce/ce.src/C_pro.c

@@ -0,0 +1,28 @@
+#define CODE_EXPANDER
+#include <em.h>
+#include "back.h"
+#include <alloc.h>
+
+extern int B_locals_created;
+extern int B_procno;
+char	*B_procnam;
+
+void
+C_pro( s, l)
+char *s;
+arith l;
+{
+	swtxt();
+	s = extnd_name(s);
+#ifdef __solaris__
+	fprint(codefile, "\t.type\t%s,#function\n", s);
+	if (B_procnam) free(B_procnam);
+	B_procnam = Salloc(s, strlen(s)+1);
+#endif
+
+	symbol_definition(  s);
+	B_procno++;
+	C_prolog();
+	C_locals(l);
+	B_locals_created = 1;
+}

+ 1 - 0
mach/sparc/ce/ce.src/C_rom_scon.c

@@ -3,6 +3,7 @@
 #include "mach.h"
 #include "back.h"
 
+void
 C_rom_scon( s, n)
 char *s;
 arith n;

+ 72 - 0
mach/sparc/ce/ce.src/ms_reg.c

@@ -34,6 +34,7 @@ static int current_reg_mes[RM_COUNT+4];
 static int in_reg_mes = 0;	/* boolean */
 static int reg_mes_nr;
 static int db_mes = 0;
+static int db_kind = 0;
 static int db_str = 0;
 static int db_nul = 0;		/* boolean */
 
@@ -252,18 +253,36 @@ load_float_regs()
 
 }
 
+void
 C_mes_begin( ms)
 int ms;
 {
+#ifdef __solaris__
+	static int inits;
+#endif
+
 	reg_mes_nr = 0;
 	in_reg_mes = (ms == ms_reg);
 	if (ms == ms_gto)
 		fprint(codefile, "ta	3\n");
 	db_mes = (ms == ms_stb || ms == ms_std) ? ms : 0;
+#ifdef __solaris__
+	if (db_mes && ! inits) {
+		fprint(codefile, ".pushsection \".text\"\nBtext.text:\n.popsection\n");
+		fprint(codefile, ".pushsection \".data\"\nBdata.data:\n.popsection\n");
+		fprint(codefile, ".pushsection \".bss\"\nBbss.bss:\n.popsection\n");
+		inits = 1;
+	}
+#endif
 }
 
 static dump_reg_tabs();
 
+#ifdef __solaris__
+extern char *B_procnam;
+#endif
+
+void
 C_mes_end()
 {
 	int pos;
@@ -271,10 +290,22 @@ C_mes_end()
 
 	if (db_mes) {
 		db_nul = 0;
+#ifdef __solaris__
+		if (db_mes == ms_std) {
+			if (db_str == 2) {
+				fprint(codefile, ",1f\n1:\n");
+			}
+			else {
+				fprint(codefile, ",1f-%s\n1:\n", B_procnam);
+			}
+		}
+#else
 		if (db_mes == ms_std && db_str == 2) fprint(codefile,",1f\n1:\n");
+#endif
 		else fprint(codefile, "\n");
 		db_str = 0;
 		db_mes = 0;
+		db_kind = 0;
 	}
 	if (!in_reg_mes)	/* end of some other mes */
 		return;
@@ -326,22 +357,32 @@ C_mes_end()
 
 extern int __gdb_flag;
 
+void
 C_cst( l)
 arith l;
 {
 	static int correct_offset;
 
 	if (db_mes) {
+		if (! db_kind) db_kind = l;
 		if (! db_str) {
 			switchseg( SEGTXT);
 			if (l == N_SLINE && ! __gdb_flag) {
 				flush_cache();
+#ifdef __solaris__
+				fprint(codefile, "call $__uX_LiB\nnop\n");
+#else
 				fprint(codefile, "call ___uX_LiB\nnop\n");
+#endif
 			}
+#ifdef __solaris__
+			fprint(codefile, ".stabn 0x%lx,0", (long) l);
+#else
 			if (db_mes == ms_std) {
 				fprint(codefile, ".stabd 0x%lx,0", (long) l);
 			}
 			else	fprint(codefile, ".stabn 0x%lx,0", (long) l);
+#endif
 			db_str = 1;
 			db_nul = 1;
 		}
@@ -364,6 +405,7 @@ arith l;
 		current_reg_mes[reg_mes_nr++] = l;
 }
 
+void
 C_scon(s, l)
 register char *s;
 register arith l;
@@ -383,6 +425,7 @@ register arith l;
 	}
 }
 
+void
 C_dlb(l, off)
 label l;
 arith off;
@@ -391,9 +434,20 @@ arith off;
 		fprint(codefile,",");
 		fprint(codefile, DLB_FMT, (long) l);
 		if (off) fprint(codefile,"+%ld", (long) off);
+#ifdef __solaris__
+		switch(db_kind) {
+		case N_LCSYM:
+			fprint(codefile, "-Bbss.bss");
+			break;
+		case N_STSYM:
+			fprint(codefile, "-Bdata.data");
+			break;
+		}
+#endif
 	}
 }
 
+void
 C_dnam(l, off)
 char *l;
 arith off;
@@ -402,26 +456,44 @@ arith off;
 		fprint(codefile,",");
 		fprint(codefile, DNAM_FMT, l);
 		if (off) fprint(codefile,"+%ld", (long) off);
+#ifdef __solaris__
+		switch(db_kind) {
+		case N_LCSYM:
+			fprint(codefile, "-Bbss.bss");
+			break;
+		case N_STSYM:
+			fprint(codefile, "-Bdata.data");
+			break;
+		}
+#endif
 	}
 }
 
 extern int B_procno;
 
+void
 C_ilb(l)
 label l;
 {
 	if (db_mes) {
 		fprint(codefile,",");
 		fprint(codefile, ILB_FMT, B_procno, (long)l);
+#ifdef __solaris__
+		fprint(codefile, "-Btext.text");
+#endif
 	}
 }
 
+void
 C_pnam(s)
 char *s;
 {
 	if (db_mes) {
 		fprint(codefile,",");
 		fprint(codefile, NAME_FMT, s);
+#ifdef __solaris__
+		fprint(codefile, "-Btext.text");
+#endif
 	}
 }
 

+ 0 - 13
mach/sparc/ce/mach.c

@@ -13,19 +13,6 @@ int arg;
 }
 #endif
 
-
-/*
-do_open( filename)
-char *filename;
-{
-	if ( filename == (char *)0 || !sys_open( filename, OP_WRITE, &codefile))
-		return( 0);
-
-	fprint( codefile, ".sect .text; .sect .rom; .sect .data; .sect .bss\n");
-	return( 1);
-}
-*/
-
 #define IEEEFLOAT
 #define FL_MSL_AT_LOW_ADDRESS	1
 #define FL_MSW_AT_LOW_ADDRESS	1

+ 1 - 12
mach/sparc/ce/push_pop.h

@@ -34,11 +34,7 @@ extern reg_t reg_f0;
 extern reg_t reg_sp, reg_lb, reg_gap;
 extern reg_t reg_tmp;
 
-#ifdef __STDC__
-#define _PROTOTYPE(x,y) x y
-#else
-#define _PROTOTYPE(x,y) x()
-#endif
+#include "ansi.h"
 
 _PROTOTYPE(int const13, (int));
 _PROTOTYPE(void init_cache, (void));
@@ -54,13 +50,8 @@ _PROTOTYPE(void push_const, (arith));
 _PROTOTYPE(void push_reg, (reg_t));
 _PROTOTYPE(void push_ext, (char *));
 _PROTOTYPE(void flush_cache, (void));
-static _PROTOTYPE(void flush_part_cache, (int c, int r, int f, int d));
-static _PROTOTYPE(void subst_reg, (reg_t, reg_t));
 _PROTOTYPE(void cache_need, (int));
-static _PROTOTYPE(int cache_read, (int n, int i));
-static _PROTOTYPE(void dump_cache, (File *stream));
 _PROTOTYPE(void pop_nop, (int));
-static _PROTOTYPE(void panic, (char*));
 
 _PROTOTYPE(reg_t alloc_reg, (void));
 _PROTOTYPE(reg_t alloc_reg_var, (void));
@@ -74,8 +65,6 @@ _PROTOTYPE(reg_t pop_reg_reg, (reg_t*));
 _PROTOTYPE(reg_t pop_float, (void));
 _PROTOTYPE(reg_t pop_double, (reg_t *sub_reg));
 _PROTOTYPE(void pop_reg_as, (reg_t r));
-static _PROTOTYPE(reg_t top_reg, (void));
-static _PROTOTYPE(reg_t top_reg_c13, (char*));
 
 _PROTOTYPE(arith pop_const, (char *n_str));
 _PROTOTYPE(arith top_const, (void));