123 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| typedef short		valnum;
 | |
| typedef struct entity 	*entity_p;
 | |
| typedef struct avail 	*avail_p;
 | |
| typedef struct token	*token_p;
 | |
| typedef struct occur	*occur_p;
 | |
| 
 | |
| struct token {
 | |
| 	valnum	tk_vn;
 | |
| 	offset	tk_size;
 | |
| 	line_p	tk_lfirst;	/* Textually first instruction, involved
 | |
| 			 	 * in pushing this token.
 | |
| 				 */
 | |
| };
 | |
| 
 | |
| 	/* We distinguish these entities. */
 | |
| #define ENCONST		0
 | |
| #define ENLOCAL		1
 | |
| #define ENEXTERNAL	2
 | |
| #define ENINDIR		3
 | |
| #define ENOFFSETTED	4
 | |
| #define ENALOCAL	5
 | |
| #define ENAEXTERNAL	6
 | |
| #define ENAOFFSETTED	7
 | |
| #define ENALOCBASE	8
 | |
| #define ENAARGBASE	9
 | |
| #define ENPROC		10
 | |
| #define ENFZER		11
 | |
| #define ENARRELEM	12
 | |
| #define ENLOCBASE	13
 | |
| #define ENHEAPPTR	14
 | |
| #define ENIGNMASK	15
 | |
| 
 | |
| struct entity {
 | |
| 	valnum	en_vn;
 | |
| 	bool	en_static;
 | |
| 	byte	en_kind;		/* ENLOCAL, ENEXTERNAL, etc.	*/
 | |
| 	offset	en_size;
 | |
| 	union {
 | |
| 		offset	en__val;	/* ENCONST.			*/
 | |
| 		offset	en__loc;	/* ENLOCAL, ENALOCAL.		*/
 | |
| 		obj_p	en__ext;	/* ENEXTERNAL, ENAEXTERNAL.	*/
 | |
| 		valnum	en__ind;	/* ENINDIR.			*/
 | |
| 		struct {
 | |
| 			valnum	en__base;
 | |
| 			offset	en__off;
 | |
| 		} en_offs;		/* ENOFFSETTED, ENAOFFSETTED.	*/
 | |
| 		offset	en__levels;	/* ENALOCBASE, ENAARGBASE.	*/
 | |
| 		proc_p	en__pro;	/* ENPROC.			*/
 | |
| 		struct {
 | |
| 			valnum	en__arbase;
 | |
| 			valnum	en__index;
 | |
| 			valnum	en__adesc;
 | |
| 		} en_arr;		/* ENARRELEM.			*/
 | |
| 	} en_inf;
 | |
| };
 | |
| 
 | |
| 	/* Macros to increase ease of use. */
 | |
| #define en_val		en_inf.en__val
 | |
| #define en_loc		en_inf.en__loc
 | |
| #define en_ext		en_inf.en__ext
 | |
| #define en_ind		en_inf.en__ind
 | |
| #define en_base		en_inf.en_offs.en__base
 | |
| #define en_off		en_inf.en_offs.en__off
 | |
| #define en_levels	en_inf.en__levels
 | |
| #define en_pro		en_inf.en__pro
 | |
| #define en_arbase	en_inf.en_arr.en__arbase
 | |
| #define en_index	en_inf.en_arr.en__index
 | |
| #define en_adesc	en_inf.en_arr.en__adesc
 | |
| 
 | |
| struct occur {
 | |
| 	line_p		oc_lfirst;  /* First instruction of expression. */
 | |
| 	line_p		oc_llast;   /* Last one. */
 | |
| 	bblock_p	oc_belongs; /* Basic block it belongs to. */
 | |
| };
 | |
| 	    
 | |
| 	/* We distinguish these groups of instructions. */
 | |
| #define SIMPLE_LOAD	0
 | |
| #define EXPENSIVE_LOAD	1
 | |
| #define LOAD_ARRAY	2
 | |
| #define STORE_DIRECT	3
 | |
| #define STORE_INDIR	4
 | |
| #define STORE_ARRAY	5
 | |
| #define UNAIR_OP	6
 | |
| #define BINAIR_OP	7
 | |
| #define TERNAIR_OP	8
 | |
| #define KILL_ENTITY	9
 | |
| #define SIDE_EFFECTS	10
 | |
| #define FIDDLE_STACK	11
 | |
| #define IGNORE		12
 | |
| #define HOPELESS	13
 | |
| #define BBLOCK_END	14
 | |
| 
 | |
| struct avail {
 | |
| 	avail_p	av_before;	/* Ptr to earlier discovered expressions. */
 | |
| 	byte	av_instr;	/* Operator instruction. */
 | |
| 	offset	av_size;
 | |
| 	line_p	av_found;	/* Line where expression is first found. */
 | |
| 	lset	av_occurs;	/* Set of recurrences of expression. */
 | |
| 	entity_p av_saveloc;	/* Local where result is put in. */
 | |
| 	valnum	av_result;
 | |
| 	union {
 | |
| 		valnum	av__operand;		/* EXPENSIVE_LOAD, UNAIR_OP. */
 | |
| 		struct {
 | |
| 			valnum	av__oleft;
 | |
| 			valnum	av__oright;
 | |
| 		} av_2;				/* BINAIR_OP. */
 | |
| 		struct {
 | |
| 			valnum	av__ofirst;
 | |
| 			valnum	av__osecond;
 | |
| 			valnum	av__othird;
 | |
| 		} av_3;				/* TERNAIR_OP. */
 | |
| 	} av_o;
 | |
| };
 | |
| 
 | |
| 	/* Macros to increase ease of use. */
 | |
| #define av_operand	av_o.av__operand
 | |
| #define av_oleft	av_o.av_2.av__oleft
 | |
| #define av_oright	av_o.av_2.av__oright
 | |
| #define av_ofirst	av_o.av_3.av__ofirst
 | |
| #define av_osecond	av_o.av_3.av__osecond
 | |
| #define av_othird	av_o.av_3.av__othird
 | |
| 
 | |
| extern int Scs; /* Number of optimizations found. */
 |