aboutsummaryrefslogtreecommitdiffstats
path: root/docs/LLVMVsTheWorld.html
blob: 24e781af38b55a6c97347f79e8e5be79f85d2e9d (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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
                      "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <link rel="stylesheet" href="llvm.css" type="text/css">
  <title>LLVM vs. the World - Comparing Compilers to Compilers</title>
</head>

<body>

<div class="doc_title">
  LLVM vs. the World - Comparing Compilers to Compilers
</div>

<ol>
  <li><a href="#introduction">Introduction</a></li>
  <li><a href="#generalapplicability">General Applicability</a></li>
  <li><a href="#typesystem">Type System</a></li>
  <li><a href="#dataflowinformation">Control-flow and Data-flow Information</a></li>
  <li><a href="#registers">Registers</a></li>
  <li><a href="#programmerinterface">Programmer Interface</a></li>
  <li><a href="#codeemission">Machine Code Emission</a></li>
</ol>

<div class="doc_text">    
  <p><b>Written by Brian R. Gaeke</b></p>
</div>

<!-- *********************************************************************** -->
<div class="doc_section">
  <a name="introduction">Introduction</a>
</div>
<!-- *********************************************************************** -->

<div class="doc_text">
<p>Whether you are a stranger to LLVM or not, and whether you are considering
using it for your projects or not, you may find it useful to understand how we
compare ourselves to other well-known compilers. The following list of points
should help you understand -- from our point of view -- some of the important
ways in which we see LLVM as different from other selected compilers and
code generation systems.</p>

<p>At the moment, we only compare ourselves below to <a
href="http://gcc.gnu.org/">GCC</a> and <a
href="http://www.gnu.org/software/lightning/">GNU lightning</a>, but we will try
to revise and expand it as our knowledge and experience permit. Contributions are
welcome.</p>
</div>

<!-- *********************************************************************** -->
<div class="doc_section">
  <a name="generalapplicability">General Applicability</a>
</div>
<!-- *********************************************************************** -->

<div class="doc_text">
<p>GNU lightning: Only currently usable for dynamic runtime emission of binary
machine code to memory. Supports one backend at a time.</p>

<p>LLVM: Supports compilation of C and C++ (with more languages coming soon),
strong SSA-based optimization at compile-time, link-time, run-time, and
off-line, and multiple platform backends with Just-in-Time and ahead-of-time
compilation frameworks. (See our document on <a
href="http://llvm.cs.uiuc.edu/pubs/2004-01-30-CGO-LLVM.html">Lifelong
Code Optimization</a> for more.)</p>

<p>GCC: Many relatively mature platform backends support assembly-language code
generation from many source languages. No run-time compilation
support.</p>
</div>

<!-- *********************************************************************** -->
<div class="doc_section">
  <a name="typesystem">Type System</a>
</div>
<!-- *********************************************************************** -->

<div class="doc_text">
<p>GNU lightning: C integer types and "void *" are supported. No type checking
is performed. Explicit type casts are not typically necessary unless the
underlying machine-specific types are distinct (e.g., sign- or zero-extension is
apparently necessary, but casting "int" to "void *" would not be.)
Floating-point support may not work on all platforms (it does not appear to be
documented in the latest release).</p>

<p>LLVM: Compositional type system based on C types, supporting structures,
opaque types, and C integer and floating point types. Explicit cast instructions
are required to transform a value from one type to another.</p>

<p>GCC: Union of high-level types including those used in Pascal, C, C++, Ada,
Java, and FORTRAN.</p>
</div>

<!-- *********************************************************************** -->
<div class="doc_section">
  <a name="dataflowinformation">Control-flow and Data-flow Information</a>
</div>
<!-- *********************************************************************** -->

<div class="doc_text">
<p>GNU lightning: No data-flow information encoded in the generated program. No
support for calculating CFG or def-use chains over generated programs.</p>

<p>LLVM: Scalar values in Static Single-Assignment form; def-use chains and CFG
always implicitly available and automatically kept up to date.</p>

<p>GCC: Trees and RTL do not directly encode data-flow info; but def-use chains
and CFGs can be calculated on the side. They are not automatically kept up to
date.</p>
</div>

<!-- *********************************************************************** -->
<div class="doc_section">
  <a name="registers">Registers</a>
</div>
<!-- *********************************************************************** -->

<div class="doc_text">
<p>GNU lightning: Very small fixed register set -- it takes the least common
denominator of supported platforms; basically it inherits its tiny register set
from IA-32, unnecessarily crippling targets like PowerPC with a large register
set.</p>

<p>LLVM: An infinite register set, reduced to a particular platform's finite
register set by register allocator.</p>

<p>GCC: Trees and RTL provide an arbitrarily large set of values.  Reduced to a
particular platform's finite register set by register allocator.</p>
</div>

<!-- *********************************************************************** -->
<div class="doc_section">
  <a name="programmerinterface">Programmer Interface</a>
</div>
<!-- *********************************************************************** -->

<div class="doc_text">
<p>GNU lightning: Library interface based on C preprocessor macros that emit
binary code for a particular instruction to memory. No support for manipulating
code before emission.</p>

<p>LLVM: Library interface based on classes representing platform-independent
intermediate code (Instruction) and platform-dependent code (MachineInstr) which
can be manipulated arbitrarily and then emitted to memory.</p>

<p>GCC: Internal header file interface (tree.h) to abstract syntax trees,
representing roughly the union of all possible supported source-language
constructs; also, an internal header file interface (rtl.h, rtl.def) to a
low-level IR called RTL which represents roughly the union of all possible
target machine instructions.</p>
</div>

<!-- *********************************************************************** -->
<div class="doc_section">
  <a name="codeemission">Machine Code Emission</a>
</div>
<!-- *********************************************************************** -->

<div class="doc_text">
<p>GNU lightning: Only supports binary machine code emission to memory.</p>

<p>LLVM: Supports writing out assembly language to a file, and binary machine
code to memory, from the same back-end.</p>

<p>GCC: Supports writing out assembly language to a file. No support for
emitting machine code to memory.</p>
</div>

<!-- *********************************************************************** -->

<hr>
<div class="doc_footer">
  <address>Brian R. Gaeke</address>
  <a href="http://llvm.cs.uiuc.edu">The LLVM Compiler Infrastructure</a>
  <br>
  Last modified: $Date$
</div>

</body>
</html>