mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13675 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			181 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!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_author">
 | 
						|
  <p>Written by Brian R. Gaeke</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>
 |