diff options
author | Brian Gaeke <gaeke@uiuc.edu> | 2003-11-12 20:19:40 +0000 |
---|---|---|
committer | Brian Gaeke <gaeke@uiuc.edu> | 2003-11-12 20:19:40 +0000 |
commit | e65a8e47fbc9bbe5f1e2deaed64785fff1068466 (patch) | |
tree | f71aaa71705ae71f1cb45503614ddceb89357e50 | |
parent | 3e910feb3f64dad868191657f83beeb57f8187e2 (diff) |
First draft of LLVM-to-anything comparison document.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9926 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | docs/LLVMVsTheWorld.html | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/docs/LLVMVsTheWorld.html b/docs/LLVMVsTheWorld.html new file mode 100644 index 0000000000..955fbabcd1 --- /dev/null +++ b/docs/LLVMVsTheWorld.html @@ -0,0 +1,178 @@ +<!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 -- the way we see LLVM as +being better than and/or different from a few 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 tech report on <a +href="http://llvm.cs.uiuc.edu/pubs/2003-09-30-LifelongOptimizationTR.html">Lifelong +Code Optimization</a> for more.)</p> +</div> + +<p>GCC: Many relatively mature platform backends support assembly-language code +generation from many source languages. No run-time compilation +support. Relatively weak optimization support.</p> + +<!-- *********************************************************************** --> +<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.) No floating +point (?!)</p> + +<p>LLVM: Compositional type system based on C types, supporting structures, +opaque types, and C integer and floating point types.</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> |