[project @ 1999-04-27 10:06:47 by sewardj]
[ghc-hetmet.git] / ghc / interpreter / backend.h
1
2 /* --------------------------------------------------------------------------
3  * STG syntax
4  *
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
8  *
9  * $RCSfile: backend.h,v $
10  * $Revision: 1.4 $
11  * $Date: 1999/04/27 10:06:47 $
12  * ------------------------------------------------------------------------*/
13
14 /* --------------------------------------------------------------------------
15  * STG Syntax:
16  * 
17  *   Rhs     -> STGCON   (Con, [Atom])
18  *            | STGAPP   (Var, [Atom])     -- delayed application
19  *            | Expr                       
20  *                                         
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,[])
28  *                                         
29  *   Atom    -> Var                        
30  *            | CHAR                       -- unboxed
31  *            | INT                        -- unboxed
32  *            | BIGNUM                     -- unboxed
33  *            | FLOAT                      -- unboxed
34  *            | ADDR                       -- unboxed
35  *            | STRING                     -- boxed
36  *                                         
37  *   Var     -> STGVAR   (Rhs,StgRep,info) -- let, case or lambda bound
38  *            | Name                       -- let-bound (effectively)
39  *                                         -- always unboxed (PTR_REP)
40  *
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
45  * 
46  * We use pointer equality to distinguish variables.
47  * The info field of a Var is used as follows in various phases:
48  * 
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  * ------------------------------------------------------------------------*/
55
56 typedef Cell   StgRhs;
57 typedef Cell   StgExpr;
58 typedef Cell   StgAtom;
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 */
64
65 #define mkStgLet(binds,body)       ap(LETREC,pair(binds,body))
66 #define stgLetBinds(e)             fst(snd(e))
67 #define stgLetBody(e)              snd(snd(e))
68
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))
73
74 #define mkStgCase(scrut,alts)      ap(CASE,pair(scrut,alts))
75 #define stgCaseScrut(e)            fst(snd(e))
76 #define stgCaseAlts(e)             snd(snd(e))
77
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))
82
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)
87
88 #define mkStgPrimCase(scrut,alts)  ap(PRIMCASE,pair(scrut,alts))
89 #define stgPrimCaseScrut(e)        fst(snd(e))
90 #define stgPrimCaseAlts(e)         snd(snd(e))
91
92 #define mkStgPrimAlt(vs,body)      ap(PRIMALT,pair(vs,body))
93 #define stgPrimAltVars(alt)        fst(snd(alt))
94 #define stgPrimAltBody(alt)        snd(snd(alt))
95
96 #define mkStgApp(fun,args)         ap(STGAPP,pair(fun,args))
97 #define stgAppFun(e)               fst(snd(e))
98 #define stgAppArgs(e)              snd(snd(e))
99
100 #define mkStgPrim(op,args)         ap(STGPRIM,pair(op,args))
101 #define stgPrimOp(e)               fst(snd(e))
102 #define stgPrimArgs(e)             snd(snd(e))
103
104 #define mkStgCon(con,args)         ap(STGCON,pair(con,args))
105 #define stgConCon(e)               fst(snd(e))
106 #define stgConArgs(e)              snd(snd(e))
107
108 #define mkStgLambda(args,body)     ap(LAMBDA,pair(args,body))
109 #define stgLambdaArgs(e)           fst(snd(e))
110 #define stgLambdaBody(e)           snd(snd(e))
111
112 extern int stgConTag  ( StgDiscr d );
113 extern void* stgConInfo ( StgDiscr d );
114 extern int stgDiscrTag( StgDiscr d );
115
116 /* --------------------------------------------------------------------------
117  * Utility functions for manipulating STG syntax trees.
118  * ------------------------------------------------------------------------*/
119
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 );
128
129 extern Int     stgSize       ( StgExpr e );
130
131 #define mkStgRep(c) mkChar(c)
132
133 /*-------------------------------------------------------------------------*/
134
135
136
137
138 extern Void  cgBinds       Args((StgRhs));
139 extern void* closureOfVar  Args((StgVar));
140 extern char* lookupHugsName Args((void*));
141
142
143
144 extern Void stgDefn       Args(( Name n, Int arity, Cell e ));
145
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));
153 #if TREX                         
154 extern  Name   implementRecShw   Args((Text));
155 extern  Name   implementRecEq    Args((Text));
156 #endif
157
158 /* Association list storing globals assigned to dictionaries, tuples, etc */
159 extern List stgGlobals;
160
161 extern Void optimiseBind Args((StgVar));
162
163
164
165
166 Void printStg( FILE *fp, StgVar b);
167             
168 #if DEBUG_PRINTER
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 );
175 #endif
176
177
178 extern List liftBinds( List binds );
179 extern Void liftControl ( Int what );
180
181 extern StgExpr substExpr ( List sub, StgExpr e );
182 extern StgExpr zubstExpr ( List sub, StgExpr e );
183
184 extern List freeVarsBind Args((List, StgVar));
185 extern Void optimiseBind Args((StgVar));
186
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 );
193 #endif