newer version
This commit is contained in:
		
							parent
							
								
									15896e422c
								
							
						
					
					
						commit
						a4887558b8
					
				
					 15 changed files with 270 additions and 37 deletions
				
			
		|  | @ -99,7 +99,7 @@ node.o: LLlex.h debug.h def.h node.h type.h | ||||||
| cstoper.o: LLlex.h Lpars.h debug.h idf.h node.h standards.h target_sizes.h type.h | cstoper.o: LLlex.h Lpars.h debug.h idf.h node.h standards.h target_sizes.h type.h | ||||||
| chk_expr.o: LLlex.h Lpars.h const.h debug.h def.h idf.h node.h scope.h standards.h type.h | chk_expr.o: LLlex.h Lpars.h const.h debug.h def.h idf.h node.h scope.h standards.h type.h | ||||||
| options.o: idfsize.h main.h ndir.h type.h | options.o: idfsize.h main.h ndir.h type.h | ||||||
| walk.o: LLlex.h Lpars.h debug.h def.h main.h node.h scope.h type.h | walk.o: LLlex.h Lpars.h debug.h def.h desig.h main.h node.h scope.h type.h | ||||||
| casestat.o: LLlex.h Lpars.h debug.h density.h node.h type.h | casestat.o: LLlex.h Lpars.h debug.h density.h node.h type.h | ||||||
| tokenfile.o: Lpars.h | tokenfile.o: Lpars.h | ||||||
| program.o: LLlex.h Lpars.h debug.h def.h idf.h main.h node.h scope.h type.h | program.o: LLlex.h Lpars.h debug.h def.h idf.h main.h node.h scope.h type.h | ||||||
|  |  | ||||||
|  | @ -461,6 +461,8 @@ chk_designator(expp, flag) | ||||||
| 			return 0; | 			return 0; | ||||||
| 		} | 		} | ||||||
| 		else { | 		else { | ||||||
|  | 			expp->nd_right->nd_class = Def; | ||||||
|  | 			expp->nd_right->nd_def = df; | ||||||
| 			expp->nd_type = df->df_type; | 			expp->nd_type = df->df_type; | ||||||
| 			if (!(df->df_flags & (D_EXPORTED|D_QEXPORTED))) { | 			if (!(df->df_flags & (D_EXPORTED|D_QEXPORTED))) { | ||||||
| node_error(expp->nd_right, | node_error(expp->nd_right, | ||||||
|  |  | ||||||
|  | @ -33,7 +33,6 @@ ProcedureDeclaration | ||||||
| } : | } : | ||||||
| 	ProcedureHeading(&df, D_PROCEDURE) | 	ProcedureHeading(&df, D_PROCEDURE) | ||||||
| 			{ | 			{ | ||||||
| 			  df->prc_level = proclevel++; |  | ||||||
| 			  currentdef = df; | 			  currentdef = df; | ||||||
| 			} | 			} | ||||||
| 	';' block(&(df->prc_body)) IDENT | 	';' block(&(df->prc_body)) IDENT | ||||||
|  | @ -55,8 +54,9 @@ ProcedureHeading(struct def **pdf; int type;) | ||||||
| } : | } : | ||||||
| 	PROCEDURE IDENT | 	PROCEDURE IDENT | ||||||
| 		{ | 		{ | ||||||
|  | 		  if (type == D_PROCEDURE) proclevel++; | ||||||
| 		  df = DeclProc(type); | 		  df = DeclProc(type); | ||||||
| 		  if (proclevel) { | 		  if (proclevel > 1) { | ||||||
| 			/* Room for static link | 			/* Room for static link | ||||||
| 			*/ | 			*/ | ||||||
| 			df->prc_nbpar = pointer_size; | 			df->prc_nbpar = pointer_size; | ||||||
|  |  | ||||||
|  | @ -6,25 +6,18 @@ struct module { | ||||||
| 	arith mo_priority;	/* priority of a module */ | 	arith mo_priority;	/* priority of a module */ | ||||||
| 	struct scopelist *mo_vis;/* scope of this module */ | 	struct scopelist *mo_vis;/* scope of this module */ | ||||||
| 	struct node *mo_body;	/* body of this module */ | 	struct node *mo_body;	/* body of this module */ | ||||||
| 	int mo_number;		/* number of this module */ |  | ||||||
| #define mod_priority	df_value.df_module.mo_priority | #define mod_priority	df_value.df_module.mo_priority | ||||||
| #define mod_vis		df_value.df_module.mo_vis | #define mod_vis		df_value.df_module.mo_vis | ||||||
| #define mod_body	df_value.df_module.mo_body | #define mod_body	df_value.df_module.mo_body | ||||||
| #define mod_number	df_value.df_module.mo_number |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct variable { | struct variable { | ||||||
| 	arith va_off;		/* address or offset of variable */ | 	arith va_off;		/* address or offset of variable */ | ||||||
| 	char *va_name;		/* name of variable if given */ | 	char *va_name;		/* name of variable if given */ | ||||||
| 	char va_addrgiven;	/* an address was given in the program */ | 	char va_addrgiven;	/* an address was given in the program */ | ||||||
| 	char va_noreg;		/* may not be in a register */ |  | ||||||
| 	short va_number;	/* number of this variable in definition module
 |  | ||||||
| 				*/ |  | ||||||
| #define var_off		df_value.df_variable.va_off | #define var_off		df_value.df_variable.va_off | ||||||
| #define var_name	df_value.df_variable.va_name | #define var_name	df_value.df_variable.va_name | ||||||
| #define var_addrgiven	df_value.df_variable.va_addrgiven | #define var_addrgiven	df_value.df_variable.va_addrgiven | ||||||
| #define var_noreg	df_value.df_variable.va_noreg |  | ||||||
| #define var_number	df_value.df_variable.va_number |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct constant { | struct constant { | ||||||
|  | @ -52,11 +45,9 @@ struct field { | ||||||
| 
 | 
 | ||||||
| struct dfproc { | struct dfproc { | ||||||
| 	struct scopelist *pr_vis; /* scope of procedure */ | 	struct scopelist *pr_vis; /* scope of procedure */ | ||||||
| 	short pr_level;		/* depth level of this procedure */ |  | ||||||
| 	arith pr_nbpar;		/* number of bytes parameters */ | 	arith pr_nbpar;		/* number of bytes parameters */ | ||||||
| 	struct node *pr_body;	/* body of this procedure */ | 	struct node *pr_body;	/* body of this procedure */ | ||||||
| #define prc_vis		df_value.df_proc.pr_vis | #define prc_vis		df_value.df_proc.pr_vis | ||||||
| #define prc_level	df_value.df_proc.pr_level |  | ||||||
| #define prc_nbpar	df_value.df_proc.pr_nbpar | #define prc_nbpar	df_value.df_proc.pr_nbpar | ||||||
| #define prc_body	df_value.df_proc.pr_body | #define prc_body	df_value.df_proc.pr_body | ||||||
| }; | }; | ||||||
|  |  | ||||||
							
								
								
									
										164
									
								
								lang/m2/comp/desig.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								lang/m2/comp/desig.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,164 @@ | ||||||
|  | /* D E S I G N A T O R   E V A L U A T I O N */ | ||||||
|  | 
 | ||||||
|  | #ifndef NORCSID | ||||||
|  | static char *RcsId = "$Header$"; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /*	Code generation for designators.
 | ||||||
|  |    	This file contains some routines that generate code common to address | ||||||
|  | 	as well as value computations, and leave a description in a "desig" | ||||||
|  | 	structure.  It also contains routines to load an address, load a value | ||||||
|  | 	or perform a store. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #include	"debug.h" | ||||||
|  | 
 | ||||||
|  | #include	<em_arith.h> | ||||||
|  | #include	<em_label.h> | ||||||
|  | #include	<assert.h> | ||||||
|  | 
 | ||||||
|  | #include	"type.h" | ||||||
|  | #include	"def.h" | ||||||
|  | #include	"scope.h" | ||||||
|  | #include	"desig.h" | ||||||
|  | #include	"LLlex.h" | ||||||
|  | #include	"node.h" | ||||||
|  | 
 | ||||||
|  | CodeValue(ds, size) | ||||||
|  | 	register struct desig *ds; | ||||||
|  | { | ||||||
|  | 	/*	Generate code to load the value of the designator described
 | ||||||
|  | 		in "ds" | ||||||
|  | 	*/ | ||||||
|  | 
 | ||||||
|  | 	switch(ds->dsg_kind) { | ||||||
|  | 	case DSG_LOADED: | ||||||
|  | 		break; | ||||||
|  | 
 | ||||||
|  | 	case DSG_FIXED: | ||||||
|  | 		if (size == word_size) { | ||||||
|  | 			if (ds->dsg_name) { | ||||||
|  | 				C_loe_dnam(ds->dsg_name, ds->dsg_offset); | ||||||
|  | 			} | ||||||
|  | 			else	C_lol(ds->dsg_offset); | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (size == dwird_size) { | ||||||
|  | 			if (ds->dsg_name) { | ||||||
|  | 				C_lde_dnam(ds->dsg_name, ds->dsg_offset); | ||||||
|  | 			} | ||||||
|  | 			else	C_ldl(ds->dsg_offset); | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 		/* Fall through */ | ||||||
|  | 	case DSG_PLOADED: | ||||||
|  | 	case DSG_PFIXED: | ||||||
|  | 		CodeAddress(ds); | ||||||
|  | 		C_loi(size); | ||||||
|  | 		break; | ||||||
|  | 
 | ||||||
|  | 	case DSG_INDEXED: | ||||||
|  | 		C_lar(word_size); | ||||||
|  | 		break; | ||||||
|  | 
 | ||||||
|  | 	default: | ||||||
|  | 		assert(0); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	ds->dsg_kind = DSG_LOADED; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | CodeAddress(ds) | ||||||
|  | 	register struct desig *ds; | ||||||
|  | { | ||||||
|  | 	/*	Generate code to load the address of the designator described
 | ||||||
|  | 	   	in "ds" | ||||||
|  | 	*/ | ||||||
|  | 
 | ||||||
|  | 	switch(ds->dsg_kind) { | ||||||
|  | 	case DSG_PLOADED: | ||||||
|  | 		if (ds->dsg_offset) { | ||||||
|  | 			C_adp(ds->dsg_offset); | ||||||
|  | 		} | ||||||
|  | 		break; | ||||||
|  | 
 | ||||||
|  | 	case DSG_FIXED: | ||||||
|  | 		if (ds->dsg_name) { | ||||||
|  | 			C_lae_dnam(ds->dsg_name, ds->dsg_offset); | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 		C_lal(ds->dsg_offset); | ||||||
|  | 		break; | ||||||
|  | 		 | ||||||
|  | 	case DSG_PFIXED: | ||||||
|  | 		ds->dsg_kind = DSG_FIXED; | ||||||
|  | 		CodeValue(ds, pointer_size); | ||||||
|  | 		break; | ||||||
|  | 
 | ||||||
|  | 	case DSG_INDEXED: | ||||||
|  | 		C_aar(word_size); | ||||||
|  | 		break; | ||||||
|  | 
 | ||||||
|  | 	default: | ||||||
|  | 		assert(0); | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	ds->dsg_offset = 0; | ||||||
|  | 	ds->dsg_kind = DSG_PLOADED; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | CodeFieldDesig(df, ds) | ||||||
|  | 	register struct def *df; | ||||||
|  | 	register struct desig *ds; | ||||||
|  | { | ||||||
|  | 	/* Generate code for a field designator. Only the code common for
 | ||||||
|  | 	   address as well as value computation is generated, and the | ||||||
|  | 	   resulting information on where to find the designator is placed | ||||||
|  | 	   in "ds". "df" indicates the definition of the field. | ||||||
|  | 	*/ | ||||||
|  | 
 | ||||||
|  | 	register struct withdesig *wds; | ||||||
|  | 
 | ||||||
|  | 	if (ds->dsg_kind == DSG_INIT) { | ||||||
|  | 		/* In a WITH statement. We must find the designator in the
 | ||||||
|  | 		   WITH statement, and act as if the field is a selection | ||||||
|  | 		   of this designator. | ||||||
|  | 		   So, first find the right WITH statement, which is the | ||||||
|  | 		   first one of the proper record type. | ||||||
|  | 		   Notice that the proper record type is recognized by its | ||||||
|  | 		   scope indication. | ||||||
|  | 		*/ | ||||||
|  | 		wds = WithDesigs; | ||||||
|  | 		assert(wds != 0); | ||||||
|  | 
 | ||||||
|  | 		while (wds->w_scope != df->df_scope) { | ||||||
|  | 			wds = wds->w_next; | ||||||
|  | 			assert(wds != 0); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		/* Found it. Now, act like it was a selection.
 | ||||||
|  | 		*/ | ||||||
|  | 		*ds = wds->w_desig; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	switch(ds->dsg_kind) { | ||||||
|  | 	case DSG_PLOADED: | ||||||
|  | 	case DSG_FIXED: | ||||||
|  | 		ds->dsg_offset += df->fld_off; | ||||||
|  | 		break; | ||||||
|  | 
 | ||||||
|  | 	case DSG_PFIXED: | ||||||
|  | 	case DSG_INDEXED: | ||||||
|  | 		CodeAddress(ds); | ||||||
|  | 		ds->dsg_kind = PLOADED; | ||||||
|  | 		ds->dsg_offset = df->fld_off; | ||||||
|  | 		break; | ||||||
|  | 
 | ||||||
|  | 	default: | ||||||
|  | 		assert(0); | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										53
									
								
								lang/m2/comp/desig.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								lang/m2/comp/desig.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,53 @@ | ||||||
|  | /* D E S I G N A T O R   D E S C R I P T I O N S */ | ||||||
|  | 
 | ||||||
|  | /* $Header$ */ | ||||||
|  | 
 | ||||||
|  | /* Generating code for designators is not particularly easy, especially if
 | ||||||
|  |    you don't know wether you want the address or the value. | ||||||
|  |    The next structure is used to generate code for designators. | ||||||
|  |    It contains information on how to find the designator, after generation | ||||||
|  |    of the code that is common to both address and value computations. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | struct desig { | ||||||
|  | 	int	dsg_kind; | ||||||
|  | #define DSG_INIT	0	/* don't know anything yet */ | ||||||
|  | #define DSG_LOADED	1	/* designator loaded  on top of the stack */ | ||||||
|  | #define DSG_PLOADED	2	/* designator accessible through pointer on | ||||||
|  | 				   stack, possibly with an offset | ||||||
|  | 				*/ | ||||||
|  | #define DSG_FIXED	3	/* designator directly accessible */ | ||||||
|  | #define DSG_PFIXED	4	/* designator accessible through directly | ||||||
|  | 				   accessible pointer | ||||||
|  | 				*/ | ||||||
|  | #define DSG_INDEXED	5	/* designator accessible through array | ||||||
|  | 				   operation. Address of array descriptor on | ||||||
|  | 				   top of the stack, index beneath that, and | ||||||
|  | 				   base address beneath that | ||||||
|  | 				*/ | ||||||
|  | 	arith	dsg_offset;	/* contains an offset for PLOADED,
 | ||||||
|  | 				   or for FIXED or PFIXED it contains an | ||||||
|  | 				   offset from dsg_name, if it exists, | ||||||
|  | 				   or from the current Local Base | ||||||
|  | 				*/ | ||||||
|  | 	char	*dsg_name;	/* name of global variable, used for
 | ||||||
|  | 				   FIXED and PFIXED | ||||||
|  | 				*/ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* The next structure describes the designator in a with-statement.
 | ||||||
|  |    We have a linked list of them, as with-statements may be nested. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | struct withdesig { | ||||||
|  | 	struct withdesig *w_next; | ||||||
|  | 	struct scope *w_scope;	/* scope in which fields of this record
 | ||||||
|  | 				   reside | ||||||
|  | 				*/ | ||||||
|  | 	struct desig *w_desig;	/* a desig structure for this particular
 | ||||||
|  | 				   designator | ||||||
|  | 				*/ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | extern struct withdesig	*WithDesigs; | ||||||
|  | extern struct desig	Desig; | ||||||
|  | @ -105,7 +105,7 @@ EnterVarList(IdList, type, local) | ||||||
| 	/*	Enter a list of identifiers representing variables into the
 | 	/*	Enter a list of identifiers representing variables into the
 | ||||||
| 		name list. "type" represents the type of the variables. | 		name list. "type" represents the type of the variables. | ||||||
| 		"local" is set if the variables are declared local to a | 		"local" is set if the variables are declared local to a | ||||||
| 		procedure | 		procedure. | ||||||
| 	*/ | 	*/ | ||||||
| 	register struct def *df; | 	register struct def *df; | ||||||
| 	register struct scopelist *sc; | 	register struct scopelist *sc; | ||||||
|  | @ -143,14 +143,15 @@ node_error(IdList->nd_left,"Illegal type for address"); | ||||||
| 						type->tp_align); | 						type->tp_align); | ||||||
| 			df->var_off = sc->sc_scope->sc_off; | 			df->var_off = sc->sc_scope->sc_off; | ||||||
| 		} | 		} | ||||||
| 		else if (!DefinitionModule && | 		else if (!DefinitionModule && CurrVis != Defined->mod_vis) {	 | ||||||
| 			 CurrVis != Defined->mod_vis) {	 |  | ||||||
| 			/* variable list belongs to an internal global
 | 			/* variable list belongs to an internal global
 | ||||||
| 			   module. Align offset and add size | 			   module. | ||||||
|  | 			   Align offset and add size | ||||||
| 			*/ | 			*/ | ||||||
| 			sc->sc_scope->sc_off = | 			sc->sc_scope->sc_off = | ||||||
| 				align(sc->sc_scope->sc_off, type->tp_align); | 				align(sc->sc_scope->sc_off, type->tp_align); | ||||||
| 			df->var_off = sc->sc_scope->sc_off; | 			df->var_off = sc->sc_scope->sc_off; | ||||||
|  | 			df->var_name = 0; | ||||||
| 			sc->sc_scope->sc_off += type->tp_size; | 			sc->sc_scope->sc_off += type->tp_size; | ||||||
| 		} | 		} | ||||||
| 		else { | 		else { | ||||||
|  | @ -160,6 +161,7 @@ node_error(IdList->nd_left,"Illegal type for address"); | ||||||
| 					    df->df_idf->id_text); | 					    df->df_idf->id_text); | ||||||
| 			df->var_name = Malloc((unsigned)(strlen(buf)+1)); | 			df->var_name = Malloc((unsigned)(strlen(buf)+1)); | ||||||
| 			strcpy(df->var_name, buf); | 			strcpy(df->var_name, buf); | ||||||
|  | 
 | ||||||
|  			if (DefinitionModule) { |  			if (DefinitionModule) { | ||||||
| 				C_exa_dnam(df->var_name); | 				C_exa_dnam(df->var_name); | ||||||
| 			} | 			} | ||||||
|  | @ -167,6 +169,7 @@ node_error(IdList->nd_left,"Illegal type for address"); | ||||||
| 				C_ina_dnam(df->var_name); | 				C_ina_dnam(df->var_name); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
| 		IdList = IdList->nd_right; | 		IdList = IdList->nd_right; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -84,7 +84,7 @@ Compile(src, dst) | ||||||
| 		return 1; | 		return 1; | ||||||
| 	} | 	} | ||||||
| #endif DEBUG | #endif DEBUG | ||||||
| 	(void) open_scope(CLOSEDSCOPE); | 	open_scope(CLOSEDSCOPE); | ||||||
| 	GlobalScope = CurrentScope; | 	GlobalScope = CurrentScope; | ||||||
| 	C_init(word_size, pointer_size); | 	C_init(word_size, pointer_size); | ||||||
| 	if (! C_open(dst)) { | 	if (! C_open(dst)) { | ||||||
|  |  | ||||||
|  | @ -64,7 +64,10 @@ DoOption(text) | ||||||
| 			switch (c)	{ | 			switch (c)	{ | ||||||
| 
 | 
 | ||||||
| 			case 'w':	/* word		*/ | 			case 'w':	/* word		*/ | ||||||
| 				if (size != (arith)0) word_size = size; | 				if (size != (arith)0) { | ||||||
|  | 					word_size = size; | ||||||
|  | 					dword_size = 2 * size; | ||||||
|  | 				} | ||||||
| 				if (align != 0) word_align = align; | 				if (align != 0) word_align = align; | ||||||
| 				break; | 				break; | ||||||
| 			case 'i':	/* int		*/ | 			case 'i':	/* int		*/ | ||||||
|  |  | ||||||
|  | @ -67,16 +67,18 @@ ModuleDeclaration | ||||||
| 			  	open_scope(CLOSEDSCOPE); | 			  	open_scope(CLOSEDSCOPE); | ||||||
| 			  	df->mod_vis = CurrVis; | 			  	df->mod_vis = CurrVis; | ||||||
| 			  } | 			  } | ||||||
| 			  else	CurrVis = df->mod_vis; | 			  else { | ||||||
|  | 				CurrVis = df->mod_vis; | ||||||
|  | 				CurrentScope->sc_level = proclevel; | ||||||
|  | 			  } | ||||||
| 
 | 
 | ||||||
| 			  df->df_type = standard_type(T_RECORD, 0, (arith) 0); | 			  df->df_type = standard_type(T_RECORD, 0, (arith) 0); | ||||||
| 			  df->df_type->rec_scope = df->mod_vis->sc_scope; | 			  df->df_type->rec_scope = df->mod_vis->sc_scope; | ||||||
| 			  df->mod_number = ++modulecount; | 			  sprint(buf, "__%d%s", ++modulecount, id->id_text); | ||||||
| 			  sprint(buf, "__%d%s", df->mod_number, id->id_text); |  | ||||||
| 			  CurrentScope->sc_name = | 			  CurrentScope->sc_name = | ||||||
| 				Malloc((unsigned) (strlen(buf) + 1)); | 				Malloc((unsigned) (strlen(buf) + 1)); | ||||||
| 			  strcpy(CurrentScope->sc_name, buf); | 			  strcpy(CurrentScope->sc_name, buf); | ||||||
| 			  C_ina_dnam(&buf[1]); | 			  if (! proclevel) C_ina_dnam(&buf[1]); | ||||||
| 			  C_inp(buf); | 			  C_inp(buf); | ||||||
| 			} | 			} | ||||||
| 	priority(&(df->mod_priority))? | 	priority(&(df->mod_priority))? | ||||||
|  | @ -161,7 +163,6 @@ DefinitionModule | ||||||
| 			  if (!SYSTEMModule) open_scope(CLOSEDSCOPE); | 			  if (!SYSTEMModule) open_scope(CLOSEDSCOPE); | ||||||
| 			  if (!Defined) Defined = df; | 			  if (!Defined) Defined = df; | ||||||
| 			  df->mod_vis = CurrVis; | 			  df->mod_vis = CurrVis; | ||||||
| 			  df->mod_number = 0; |  | ||||||
| 			  CurrentScope->sc_name = id->id_text; | 			  CurrentScope->sc_name = id->id_text; | ||||||
| 			  df->df_type = standard_type(T_RECORD, 0, (arith) 0); | 			  df->df_type = standard_type(T_RECORD, 0, (arith) 0); | ||||||
| 			  df->df_type->rec_scope = df->mod_vis->sc_scope; | 			  df->df_type->rec_scope = df->mod_vis->sc_scope; | ||||||
|  | @ -253,7 +254,6 @@ ProgramModule(int state;) | ||||||
| 		  	Defined = df; | 		  	Defined = df; | ||||||
| 			open_scope(CLOSEDSCOPE); | 			open_scope(CLOSEDSCOPE); | ||||||
| 			df->mod_vis = CurrVis; | 			df->mod_vis = CurrVis; | ||||||
| 			df->mod_number = 0; |  | ||||||
| 			CurrentScope->sc_name = id->id_text; | 			CurrentScope->sc_name = id->id_text; | ||||||
| 		  } | 		  } | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -20,7 +20,7 @@ static char *RcsId = "$Header$"; | ||||||
| 
 | 
 | ||||||
| struct scope *PervasiveScope, *GlobalScope; | struct scope *PervasiveScope, *GlobalScope; | ||||||
| struct scopelist *CurrVis; | struct scopelist *CurrVis; | ||||||
| static int scp_level; | extern int proclevel; | ||||||
| static struct scopelist *PervVis; | static struct scopelist *PervVis; | ||||||
| 
 | 
 | ||||||
| /* STATICALLOCDEF "scope" */ | /* STATICALLOCDEF "scope" */ | ||||||
|  | @ -36,7 +36,7 @@ open_scope(scopetype) | ||||||
| 
 | 
 | ||||||
| 	assert(scopetype == OPENSCOPE || scopetype == CLOSEDSCOPE); | 	assert(scopetype == OPENSCOPE || scopetype == CLOSEDSCOPE); | ||||||
| 	sc->sc_scopeclosed = scopetype == CLOSEDSCOPE; | 	sc->sc_scopeclosed = scopetype == CLOSEDSCOPE; | ||||||
| 	sc->sc_level = scp_level++; | 	sc->sc_level = proclevel; | ||||||
| 	sc->sc_forw = 0; | 	sc->sc_forw = 0; | ||||||
| 	sc->sc_def = 0; | 	sc->sc_def = 0; | ||||||
| 	sc->sc_off = 0; | 	sc->sc_off = 0; | ||||||
|  | @ -57,7 +57,7 @@ init_scope() | ||||||
| 	sc->sc_scopeclosed = 0; | 	sc->sc_scopeclosed = 0; | ||||||
| 	sc->sc_forw = 0; | 	sc->sc_forw = 0; | ||||||
| 	sc->sc_def = 0; | 	sc->sc_def = 0; | ||||||
| 	sc->sc_level = scp_level++; | 	sc->sc_level = proclevel; | ||||||
| 	PervasiveScope = sc; | 	PervasiveScope = sc; | ||||||
| 	ls->next = 0; | 	ls->next = 0; | ||||||
| 	ls->sc_encl = 0; | 	ls->sc_encl = 0; | ||||||
|  | @ -228,7 +228,6 @@ close_scope(flag) | ||||||
| 		if (flag & SC_REVERSE) Reverse(&(sc->sc_def)); | 		if (flag & SC_REVERSE) Reverse(&(sc->sc_def)); | ||||||
| 	} | 	} | ||||||
| 	CurrVis = enclosing(CurrVis); | 	CurrVis = enclosing(CurrVis); | ||||||
| 	scp_level = CurrentScope->sc_level; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #ifdef DEBUG | #ifdef DEBUG | ||||||
|  |  | ||||||
|  | @ -27,8 +27,8 @@ struct scope { | ||||||
| 
 | 
 | ||||||
| struct scopelist { | struct scopelist { | ||||||
| 	struct scopelist *next; | 	struct scopelist *next; | ||||||
| 	struct scopelist *sc_encl; |  | ||||||
| 	struct scope *sc_scope; | 	struct scope *sc_scope; | ||||||
|  | 	struct scopelist *sc_encl; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| extern struct scope | extern struct scope | ||||||
|  |  | ||||||
|  | @ -112,6 +112,7 @@ extern int | ||||||
| 
 | 
 | ||||||
| extern arith | extern arith | ||||||
| 	word_size, | 	word_size, | ||||||
|  | 	dword_size, | ||||||
| 	int_size, | 	int_size, | ||||||
| 	long_size, | 	long_size, | ||||||
| 	float_size, | 	float_size, | ||||||
|  |  | ||||||
|  | @ -34,6 +34,7 @@ int | ||||||
| 
 | 
 | ||||||
| arith | arith | ||||||
| 	word_size = SZ_WORD, | 	word_size = SZ_WORD, | ||||||
|  | 	dword_size = 2 * SZ_WORD, | ||||||
| 	int_size = SZ_INT, | 	int_size = SZ_INT, | ||||||
| 	long_size = SZ_LONG, | 	long_size = SZ_LONG, | ||||||
| 	float_size = SZ_FLOAT, | 	float_size = SZ_FLOAT, | ||||||
|  |  | ||||||
|  | @ -21,12 +21,14 @@ static char *RcsId = "$Header$"; | ||||||
| #include	"LLlex.h" | #include	"LLlex.h" | ||||||
| #include	"node.h" | #include	"node.h" | ||||||
| #include	"Lpars.h" | #include	"Lpars.h" | ||||||
|  | #include	"desig.h" | ||||||
| 
 | 
 | ||||||
| extern arith	align(); | extern arith	align(); | ||||||
| static int	prclev = 0; | extern int	proclevel; | ||||||
| static label	instructionlabel; | static label	instructionlabel; | ||||||
| static char	return_expr_occurred; | static char	return_expr_occurred; | ||||||
| static struct type *func_type; | static struct type *func_type; | ||||||
|  | struct withdesig *WithDesigs; | ||||||
| 
 | 
 | ||||||
| label | label | ||||||
| text_label() | text_label() | ||||||
|  | @ -54,7 +56,7 @@ WalkModule(module) | ||||||
| 	vis = CurrVis; | 	vis = CurrVis; | ||||||
| 	CurrVis = module->mod_vis; | 	CurrVis = module->mod_vis; | ||||||
| 
 | 
 | ||||||
| 	if (!prclev && module->mod_number) { | 	if (!proclevel && module != Defined) { | ||||||
| 		/* This module is a local module, but not within a
 | 		/* This module is a local module, but not within a
 | ||||||
| 		   procedure. Generate code to allocate storage for its | 		   procedure. Generate code to allocate storage for its | ||||||
| 		   variables. This is done by generating a "bss", | 		   variables. This is done by generating a "bss", | ||||||
|  | @ -63,6 +65,8 @@ WalkModule(module) | ||||||
| 		arith size = align(CurrentScope->sc_off, word_align); | 		arith size = align(CurrentScope->sc_off, word_align); | ||||||
| 
 | 
 | ||||||
| 		if (size == 0) size = word_size; | 		if (size == 0) size = word_size; | ||||||
|  | 		/* WHY ??? because we generated an INA for it ??? */ | ||||||
|  | 
 | ||||||
| 		C_df_dnam(&(CurrentScope->sc_name[1])); | 		C_df_dnam(&(CurrentScope->sc_name[1])); | ||||||
| 		C_bss_cst(size, (arith) 0, 0); | 		C_bss_cst(size, (arith) 0, 0); | ||||||
| 	} | 	} | ||||||
|  | @ -109,7 +113,7 @@ WalkProcedure(procedure) | ||||||
| 	*/ | 	*/ | ||||||
| 	struct scopelist *vis = CurrVis; | 	struct scopelist *vis = CurrVis; | ||||||
| 
 | 
 | ||||||
| 	prclev++; | 	proclevel++; | ||||||
| 	CurrVis = procedure->prc_vis; | 	CurrVis = procedure->prc_vis; | ||||||
| 	 | 	 | ||||||
| 	WalkDef(CurrentScope->sc_def); | 	WalkDef(CurrentScope->sc_def); | ||||||
|  | @ -133,9 +137,9 @@ node_error(procedure->prc_body,"function procedure does not return a value"); | ||||||
| 		C_ret((int) align(func_type->tp_size, word_align)); | 		C_ret((int) align(func_type->tp_size, word_align)); | ||||||
| 	} | 	} | ||||||
| 	else	C_ret(0); | 	else	C_ret(0); | ||||||
| 	C_end((int) align(-CurrentScope->sc_off, word_align)); | 	C_end(align(-CurrentScope->sc_off, word_align)); | ||||||
| 	CurrVis = vis; | 	CurrVis = vis; | ||||||
| 	prclev--; | 	proclevel--; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| WalkDef(df) | WalkDef(df) | ||||||
|  | @ -295,6 +299,7 @@ WalkStat(nd, lab) | ||||||
| 	case WITH: | 	case WITH: | ||||||
| 		{ | 		{ | ||||||
| 			struct scopelist link; | 			struct scopelist link; | ||||||
|  | 			struct withdesig wds; | ||||||
| 
 | 
 | ||||||
| 			WalkDesignator(left); | 			WalkDesignator(left); | ||||||
| 			if (left->nd_type->tp_fund != T_RECORD) { | 			if (left->nd_type->tp_fund != T_RECORD) { | ||||||
|  | @ -302,12 +307,23 @@ WalkStat(nd, lab) | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			link.sc_scope = left->nd_type->rec_scope; | 			wds.w_next = WithDesigs; | ||||||
|  | 			WithDesigs = &wds; | ||||||
|  | 			wds.w_scope = left->nd_type->rec_scope; | ||||||
|  | 			/* 
 | ||||||
|  | 			   Decide here wether to use a temporary variable or | ||||||
|  | 			   not, depending on the value of Desig. | ||||||
|  | 			   Suggestion: temporary if Desig != DSG_FIXED | ||||||
|  | 
 | ||||||
|  | 			   And then: | ||||||
|  | 			   wds.w_desig = Desig; ??? | ||||||
|  | 			*/ | ||||||
|  | 			link.sc_scope = wds.w_scope; | ||||||
| 			link.next = CurrVis; | 			link.next = CurrVis; | ||||||
| 			CurrVis = &link; | 			CurrVis = &link; | ||||||
| 			WalkNode(right, lab); | 			WalkNode(right, lab); | ||||||
| 			CurrVis = link.next; | 			CurrVis = link.next; | ||||||
| 			/* ??? */ | 			WithDesigs = wds.w_next; | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue