Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
GHC
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package Registry
Model registry
Operate
Terraform modules
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Gesh
GHC
Commits
a73f9466
Commit
a73f9466
authored
26 years ago
by
Julian Seward
Browse files
Options
Downloads
Patches
Plain Diff
[project @ 1999-02-03 17:05:14 by sewardj]
Renamed stg.h to backend.h.
parent
1e4cbfcf
Loading
Loading
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
ghc/interpreter/backend.h
+188
-0
188 additions, 0 deletions
ghc/interpreter/backend.h
with
188 additions
and
0 deletions
ghc/interpreter/backend.h
0 → 100644
+
188
−
0
View file @
a73f9466
/* --------------------------------------------------------------------------
* STG syntax
*
* Copyright (c) The University of Nottingham and Yale University, 1994-1997.
* All rights reserved. See NOTICE for details and conditions of use etc...
* Hugs version 1.4, December 1997
*
* $RCSfile: backend.h,v $
* $Revision: 1.1 $
* $Date: 1999/02/03 17:05:14 $
* ------------------------------------------------------------------------*/
/* --------------------------------------------------------------------------
* STG Syntax:
*
* Rhs -> STGCON (Con, [Atom])
* | STGAPP (Var, [Atom]) -- delayed application
* | Expr
*
* Expr -> LETREC ([Var],Expr) -- Vars contain their bound value
* | LAMBDA ([Var],Expr) -- all vars bound to NIL
* | CASE (Expr,[Alt])
* | PRIMCASE (Expr,[PrimAlt])
* | STGPRIM (Prim,[Atom])
* | STGAPP (Var, [Atom]) -- tail call
* | Var -- Abbreviation for STGAPP(Var,[])
*
* Atom -> Var
* | CHAR -- unboxed
* | INT -- unboxed
* | BIGNUM -- unboxed
* | FLOAT -- unboxed
* | ADDR -- unboxed
* | STRING -- boxed
*
* Var -> STGVAR (Rhs,StgRep,info) -- let, case or lambda bound
* | Name -- let-bound (effectively)
* -- always unboxed (PTR_REP)
*
* Alt -> (Pat,Expr)
* Pat -> Var -- bound to a constructor, a tuple or unbound
* PrimAlt -> ([PrimPat],Expr)
* PrimPat -> Var -- bound to int or unbound
*
* We use pointer equality to distinguish variables.
* The info field of a Var is used as follows in various phases:
*
* Translation: unused (set to NIL on output)
* Freevar analysis: list of free vars after
* Lambda lifting: freevar list or UNIT on input, discarded after
* Code generation: unused
* ------------------------------------------------------------------------*/
typedef
Cell
StgRhs
;
typedef
Cell
StgExpr
;
typedef
Cell
StgAtom
;
typedef
Cell
StgVar
;
/* Could be a Name or an STGVAR */
typedef
Pair
StgCaseAlt
;
typedef
StgVar
StgPat
;
typedef
Cell
StgDiscr
;
typedef
Pair
StgPrimAlt
;
typedef
StgVar
StgPrimPat
;
typedef
Cell
StgRep
;
/* PTR_REP | .. DOUBLE_REP */
#define mkStgLet(binds,body) ap(LETREC,pair(binds,body))
#define stgLetBinds(e) fst(snd(e))
#define stgLetBody(e) snd(snd(e))
#define mkStgPrimVar(rhs,rep,info) ap(STGVAR,triple(rhs,rep,info))
#define stgVarBody(e) fst3(snd(e))
#define stgVarRep(e) snd3(snd(e))
#define stgVarInfo(e) thd3(snd(e))
#define mkStgCase(scrut,alts) ap(CASE,pair(scrut,alts))
#define stgCaseScrut(e) fst(snd(e))
#define stgCaseAlts(e) snd(snd(e))
#define mkStgCaseAlt(discr,vs,e) pair(mkStgVar(mkStgCon(discr,vs),NIL),e)
#define stgCaseAltPat(alt) fst(alt)
#define stgCaseAltBody(alt) snd(alt)
#define stgPatDiscr(pat) stgConCon(stgVarBody(pat))
#define stgPatVars(pat) stgConArgs(stgVarBody(pat))
#define isDefaultPat(pat) (isNull(stgVarBody(pat)))
#define isStgDefault(alt) (isDefaultPat(stgCaseAltPat(alt)))
#define mkStgDefault(v,e) pair(v,e)
#define mkStgPrimCase(scrut,alts) ap(PRIMCASE,pair(scrut,alts))
#define stgPrimCaseScrut(e) fst(snd(e))
#define stgPrimCaseAlts(e) snd(snd(e))
#define mkStgPrimAlt(vs,body) pair(vs,body)
#define stgPrimAltPats(alt) fst(alt)
#define stgPrimAltBody(alt) snd(alt)
#define mkStgApp(fun,args) ap(STGAPP,pair(fun,args))
#define stgAppFun(e) fst(snd(e))
#define stgAppArgs(e) snd(snd(e))
#define mkStgPrim(op,args) ap(STGPRIM,pair(op,args))
#define stgPrimOp(e) fst(snd(e))
#define stgPrimArgs(e) snd(snd(e))
#define mkStgCon(con,args) ap(STGCON,pair(con,args))
#define stgConCon(e) fst(snd(e))
#define stgConArgs(e) snd(snd(e))
#define mkStgLambda(args,body) ap(LAMBDA,pair(args,body))
#define stgLambdaArgs(e) fst(snd(e))
#define stgLambdaBody(e) snd(snd(e))
extern
int
stgConTag
(
StgDiscr
d
);
extern
void
*
stgConInfo
(
StgDiscr
d
);
extern
int
stgDiscrTag
(
StgDiscr
d
);
/* --------------------------------------------------------------------------
* Utility functions for manipulating STG syntax trees.
* ------------------------------------------------------------------------*/
extern
List
makeArgs
(
Int
);
extern
StgExpr
makeStgLambda
(
List
args
,
StgExpr
body
);
extern
StgExpr
makeStgApp
(
StgVar
fun
,
List
args
);
extern
StgExpr
makeStgLet
(
List
binds
,
StgExpr
body
);
extern
StgExpr
makeStgIf
(
StgExpr
cond
,
StgExpr
e1
,
StgExpr
e2
);
extern
Bool
isStgVar
(
StgRhs
rhs
);
extern
Bool
isAtomic
(
StgRhs
rhs
);
extern
StgVar
mkStgVar
(
StgRhs
rhs
,
Cell
info
);
#define mkSeq(x,y) mkStgCase(mkStgApp(nameForce,singleton(x)),singleton(mkStgDefault(mkStgVar(NIL,NIL),y)))
#define mkStgRep(c) mkChar(c)
/*-------------------------------------------------------------------------*/
extern
Void
cgBinds
Args
((
StgRhs
));
extern
void
*
closureOfVar
Args
((
StgVar
));
extern
char
*
lookupHugsName
Args
((
void
*
));
extern
Void
stgDefn
Args
((
Name
n
,
Int
arity
,
Cell
e
));
extern
Void
implementForeignImport
Args
((
Name
));
extern
Void
implementForeignExport
Args
((
Name
));
extern
Void
implementCfun
Args
((
Name
,
List
));
extern
Void
implementConToTag
Args
((
Tycon
));
extern
Void
implementTagToCon
Args
((
Tycon
));
extern
Void
implementPrim
Args
((
Name
));
extern
Void
implementTuple
Args
((
Int
));
#if TREX
extern
Name
implementRecShw
Args
((
Text
));
extern
Name
implementRecEq
Args
((
Text
));
#endif
/* Association list storing globals assigned to dictionaries, tuples, etc */
extern
List
stgGlobals
;
extern
Void
optimiseBind
Args
((
StgVar
));
Void
printStg
(
FILE
*
fp
,
StgVar
b
);
#if DEBUG_PRINTER
extern
Void
ppStg
(
StgVar
v
);
extern
Void
ppStgExpr
(
StgExpr
e
);
extern
Void
ppStgRhs
(
StgRhs
rhs
);
extern
Void
ppStgAlts
(
List
alts
);
extern
Void
ppStgPrimAlts
(
List
alts
);
extern
Void
ppStgVars
(
List
vs
);
#endif
extern
List
liftBinds
(
List
binds
);
extern
Void
liftControl
(
Int
what
);
extern
StgExpr
substExpr
(
List
sub
,
StgExpr
e
);
extern
List
freeVarsBind
Args
((
List
,
StgVar
));
extern
Void
optimiseBind
Args
((
StgVar
));
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment