blob: 196ec9150db9668b53bb9a9ebb013783eb1df60c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
<title>The GHC Commentary - Spineless Tagless C</title>
</head>
<body BGCOLOR="FFFFFF">
<h1>The GHC Commentary - Spineless Tagless C</h1>
<p>
The C code generated by GHC doesn't use higher-level features of C to be
able to control as precisely as possible what code is generated.
Moreover, it uses special features of gcc (such as, first class labels)
to produce more efficient code.
<p>
STG C makes ample use of C's macro language to define idioms, which also
reduces the size of the generated C code (thus, reducing I/O times).
These macros are defined in the C headers located in GHC's <a
href="http://cvs.haskell.org/cgi-bin/cvsweb.cgi/fptools/ghc/includes/"><code>includes</code></a>
directory.
<h4><code>TailCalls.h</code></h4>
<p>
<a
href="http://cvs.haskell.org/cgi-bin/cvsweb.cgi/fptools/ghc/includes/TailCalls.h"><code>TailCalls.h</code></a>
defines how tail calls are implemented - and in particular - optimised
in GHC generated code. The default case, for an architecture for which
GHC is not optimised, is to use the mini interpreter described in the <a
href="http://research.microsoft.com/copyright/accept.asp?path=/users/simonpj/papers/spineless-tagless-gmachine.ps.gz&pub=34">STG paper.</a>
<p>
For supported architectures, various tricks are used to generate
assembler implementing proper tail calls. On i386, gcc's first class
labels are used to directly jump to a function pointer. Furthermore,
markers of the form <code>--- BEGIN ---</code> and <code>--- END
---</code> are added to the assembly right after the function prologue
and before the epilogue. These markers are used by <a
href="../the-beast/mangler.html">the Evil Mangler.</a>
<p><small>
<!-- hhmts start -->
Last modified: Wed Aug 8 19:28:29 EST 2001
<!-- hhmts end -->
</small>
</body>
</html>
|