2 /* --------------------------------------------------------------------------
5 * Copyright (c) The University of Nottingham and Yale University, 1994-1997.
6 * All rights reserved. See NOTICE for details and conditions of use etc...
7 * Hugs version 1.4, December 1997
9 * $RCSfile: backend.h,v $
11 * $Date: 1999/04/27 10:06:47 $
12 * ------------------------------------------------------------------------*/
14 /* --------------------------------------------------------------------------
17 * Rhs -> STGCON (Con, [Atom])
18 * | STGAPP (Var, [Atom]) -- delayed application
21 * Expr -> LETREC ([Var],Expr) -- Vars contain their bound value
22 * | LAMBDA ([Var],Expr) -- all vars bound to NIL
23 * | CASE (Expr,[Alt]) -- algebraic case
24 * | PRIMCASE (Expr,[PrimAlt]) -- primitive case
25 * | STGPRIM (Prim,[Atom])
26 * | STGAPP (Var, [Atom]) -- tail call
27 * | Var -- Abbreviation for STGAPP(Var,[])
37 * Var -> STGVAR (Rhs,StgRep,info) -- let, case or lambda bound
38 * | Name -- let-bound (effectively)
39 * -- always unboxed (PTR_REP)
41 * Alt -> DEEFALT (Var,Expr) -- var bound to NIL
42 * | CASEALT (Con,[Var],Expr) -- vars bound to NIL;
43 * -- Con is Name or TUPLE
44 * PrimAlt -> PRIMALT ([Var],Expr) -- vars bound to NIL or int
46 * We use pointer equality to distinguish variables.
47 * The info field of a Var is used as follows in various phases:
49 * Translation: unused (set to NIL on output)
50 * Freevar analysis: list of free vars after
51 * Lambda lifting: freevar list or UNIT on input, discarded after
52 * Code generation: unused
53 * Optimisation: number of uses (sort-of) of let-bound variable
54 * ------------------------------------------------------------------------*/
59 typedef Cell StgVar; /* Could be a Name or an STGVAR */
60 typedef Cell StgCaseAlt;
61 typedef Cell StgPrimAlt;
62 typedef Cell StgDiscr;
63 typedef Cell StgRep; /* PTR_REP | .. DOUBLE_REP */
65 #define mkStgLet(binds,body) ap(LETREC,pair(binds,body))
66 #define stgLetBinds(e) fst(snd(e))
67 #define stgLetBody(e) snd(snd(e))
69 #define mkStgPrimVar(rhs,rep,info) ap(STGVAR,triple(rhs,rep,info))
70 #define stgVarBody(e) fst3(snd(e))
71 #define stgVarRep(e) snd3(snd(e))
72 #define stgVarInfo(e) thd3(snd(e))
74 #define mkStgCase(scrut,alts) ap(CASE,pair(scrut,alts))
75 #define stgCaseScrut(e) fst(snd(e))
76 #define stgCaseAlts(e) snd(snd(e))
78 #define mkStgCaseAlt(con,vs,e) ap(CASEALT,triple(con,vs,e))
79 #define stgCaseAltCon(alt) fst3(snd(alt))
80 #define stgCaseAltVars(alt) snd3(snd(alt))
81 #define stgCaseAltBody(alt) thd3(snd(alt))
83 #define mkStgDefault(v,e) ap(DEEFALT,pair(v,e))
84 #define stgDefaultVar(alt) fst(snd(alt))
85 #define stgDefaultBody(alt) snd(snd(alt))
86 #define isDefaultAlt(alt) (fst(alt)==DEEFALT)
88 #define mkStgPrimCase(scrut,alts) ap(PRIMCASE,pair(scrut,alts))
89 #define stgPrimCaseScrut(e) fst(snd(e))
90 #define stgPrimCaseAlts(e) snd(snd(e))
92 #define mkStgPrimAlt(vs,body) ap(PRIMALT,pair(vs,body))
93 #define stgPrimAltVars(alt) fst(snd(alt))
94 #define stgPrimAltBody(alt) snd(snd(alt))
96 #define mkStgApp(fun,args) ap(STGAPP,pair(fun,args))
97 #define stgAppFun(e) fst(snd(e))
98 #define stgAppArgs(e) snd(snd(e))
100 #define mkStgPrim(op,args) ap(STGPRIM,pair(op,args))
101 #define stgPrimOp(e) fst(snd(e))
102 #define stgPrimArgs(e) snd(snd(e))
104 #define mkStgCon(con,args) ap(STGCON,pair(con,args))
105 #define stgConCon(e) fst(snd(e))
106 #define stgConArgs(e) snd(snd(e))
108 #define mkStgLambda(args,body) ap(LAMBDA,pair(args,body))
109 #define stgLambdaArgs(e) fst(snd(e))
110 #define stgLambdaBody(e) snd(snd(e))
112 extern int stgConTag ( StgDiscr d );
113 extern void* stgConInfo ( StgDiscr d );
114 extern int stgDiscrTag( StgDiscr d );
116 /* --------------------------------------------------------------------------
117 * Utility functions for manipulating STG syntax trees.
118 * ------------------------------------------------------------------------*/
120 extern List makeArgs ( Int );
121 extern StgExpr makeStgLambda ( List args, StgExpr body );
122 extern StgExpr makeStgApp ( StgVar fun, List args );
123 extern StgExpr makeStgLet ( List binds, StgExpr body );
124 extern StgExpr makeStgIf ( StgExpr cond, StgExpr e1, StgExpr e2 );
125 extern Bool isStgVar ( StgRhs rhs );
126 extern Bool isAtomic ( StgRhs rhs );
127 extern StgVar mkStgVar ( StgRhs rhs, Cell info );
129 extern Int stgSize ( StgExpr e );
131 #define mkStgRep(c) mkChar(c)
133 /*-------------------------------------------------------------------------*/
138 extern Void cgBinds Args((StgRhs));
139 extern void* closureOfVar Args((StgVar));
140 extern char* lookupHugsName Args((void*));
144 extern Void stgDefn Args(( Name n, Int arity, Cell e ));
146 extern Void implementForeignImport Args((Name));
147 extern Void implementForeignExport Args((Name));
148 extern Void implementCfun Args((Name, List));
149 extern Void implementConToTag Args((Tycon));
150 extern Void implementTagToCon Args((Tycon));
151 extern Void implementPrim Args((Name));
152 extern Void implementTuple Args((Int));
154 extern Name implementRecShw Args((Text));
155 extern Name implementRecEq Args((Text));
158 /* Association list storing globals assigned to dictionaries, tuples, etc */
159 extern List stgGlobals;
161 extern Void optimiseBind Args((StgVar));
166 Void printStg( FILE *fp, StgVar b);
169 extern Void ppStg ( StgVar v );
170 extern Void ppStgExpr ( StgExpr e );
171 extern Void ppStgRhs ( StgRhs rhs );
172 extern Void ppStgAlts ( List alts );
173 extern Void ppStgPrimAlts( List alts );
174 extern Void ppStgVars ( List vs );
178 extern List liftBinds( List binds );
179 extern Void liftControl ( Int what );
181 extern StgExpr substExpr ( List sub, StgExpr e );
182 extern StgExpr zubstExpr ( List sub, StgExpr e );
184 extern List freeVarsBind Args((List, StgVar));
185 extern Void optimiseBind Args((StgVar));
187 #ifdef CRUDE_PROFILING
188 extern void cp_init ( void );
189 extern void cp_enter ( Cell /*StgVar*/ );
190 extern void cp_bill_words ( int );
191 extern void cp_bill_insns ( int );
192 extern void cp_show ( void );