2008-12-12 00:24:40 +01:00
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
< html xmlns = "http://www.w3.org/1999/xhtml" xml:lang = "en" lang = "en" >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" / >
2011-04-24 16:17:37 +02:00
< meta name = "generator" content = "Docutils 0.6: http://docutils.sourceforge.net/" / >
2008-12-12 00:33:33 +01:00
< title > Tutorial - Using LLVMC< / title >
2008-12-13 18:50:58 +01:00
< link rel = "stylesheet" href = "llvm.css" type = "text/css" / >
2008-12-12 00:24:40 +01:00
< / head >
< body >
2008-12-12 00:33:33 +01:00
< div class = "document" id = "tutorial-using-llvmc" >
< h1 class = "title" > Tutorial - Using LLVMC< / h1 >
2009-05-06 03:41:47 +02:00
2008-12-13 18:51:47 +01:00
<!-- This file was automatically generated by rst2html.
Please do not edit directly!
The ReST source lives in the directory 'tools/llvmc/doc'. -->
2009-05-06 03:41:47 +02:00
< div class = "contents topic" id = "contents" >
< p class = "topic-title first" > Contents< / p >
2008-12-13 03:28:58 +01:00
< ul class = "simple" >
2009-05-06 03:41:47 +02:00
< li > < a class = "reference internal" href = "#introduction" id = "id1" > Introduction< / a > < / li >
2011-04-24 16:17:37 +02:00
< li > < a class = "reference internal" href = "#using-the-llvmc-program" id = "id2" > Using the < tt class = "docutils literal" > llvmc< / tt > program< / a > < / li >
2009-05-06 03:41:47 +02:00
< li > < a class = "reference internal" href = "#using-llvmc-to-generate-toolchain-drivers" id = "id3" > Using LLVMC to generate toolchain drivers< / a > < / li >
2008-12-13 03:28:58 +01:00
< / ul >
< / div >
< div class = "doc_author" >
< p > Written by < a href = "mailto:foldr@codedgers.com" > Mikhail Glushenkov< / a > < / p >
2009-05-06 03:41:47 +02:00
< / div > < div class = "section" id = "introduction" >
< h1 > < a class = "toc-backref" href = "#id1" > Introduction< / a > < / h1 >
2011-04-24 16:17:37 +02:00
< p > LLVMC is a generic compiler driver, which plays the same role for LLVM as the
< tt class = "docutils literal" > gcc< / tt > program does for GCC - the difference being that LLVMC is designed to be
more adaptable and easier to customize. Most of LLVMC functionality is
implemented via high-level TableGen code, from which a corresponding C++ source
file is automatically generated. This tutorial describes the basic usage and
configuration of LLVMC.< / p >
2008-12-12 00:24:40 +01:00
< / div >
2011-04-24 16:17:37 +02:00
< div class = "section" id = "using-the-llvmc-program" >
< h1 > < a class = "toc-backref" href = "#id2" > Using the < tt class = "docutils literal" > llvmc< / tt > program< / a > < / h1 >
< p > In general, < tt class = "docutils literal" > llvmc< / tt > tries to be command-line compatible with < tt class = "docutils literal" > gcc< / tt > as much
as possible, so most of the familiar options work:< / p >
2008-12-12 00:24:40 +01:00
< pre class = "literal-block" >
$ llvmc -O3 -Wall hello.cpp
$ ./a.out
hello
< / pre >
2011-04-24 16:17:37 +02:00
< p > This will invoke < tt class = "docutils literal" > < span class = "pre" > llvm-g++< / span > < / tt > under the hood (you can see which commands are
executed by using the < tt class = "docutils literal" > < span class = "pre" > -v< / span > < / tt > option). For further help on command-line LLVMC
usage, refer to the < tt class = "docutils literal" > llvmc < span class = "pre" > --help< / span > < / tt > output.< / p >
2008-12-12 00:24:40 +01:00
< / div >
2009-05-06 03:41:47 +02:00
< div class = "section" id = "using-llvmc-to-generate-toolchain-drivers" >
< h1 > < a class = "toc-backref" href = "#id3" > Using LLVMC to generate toolchain drivers< / a > < / h1 >
2011-04-24 16:17:37 +02:00
< p > LLVMC-based drivers are written mostly using < a class = "reference external" href = "http://llvm.org/docs/TableGenFundamentals.html" > TableGen< / a > , so you need to be
familiar with it to get anything done.< / p >
< p > Start by compiling < tt class = "docutils literal" > example/Simple< / tt > , which is a primitive wrapper for
< tt class = "docutils literal" > gcc< / tt > :< / p >
2008-12-12 00:33:33 +01:00
< pre class = "literal-block" >
2011-04-24 16:17:37 +02:00
$ cd $LLVM_OBJ_DIR/tools/examples/Simple
$ make
2008-12-12 00:33:33 +01:00
$ cat > hello.c
2011-04-24 16:17:37 +02:00
#include < stdio.h>
int main() { printf(" Hello\n" ); }
$ $LLVM_BIN_DIR/Simple -v hello.c
gcc hello.c -o hello.out
2008-12-12 00:33:33 +01:00
$ ./hello.out
Hello
< / pre >
2011-04-24 16:17:37 +02:00
< p > We have thus produced a simple driver called, appropriately, < tt class = "docutils literal" > Simple< / tt > , from
the input TableGen file < tt class = "docutils literal" > Simple.td< / tt > . The < tt class = "docutils literal" > llvmc< / tt > program itself is generated
using a similar process (see < tt class = "docutils literal" > llvmc/src< / tt > ). Contents of the file < tt class = "docutils literal" > Simple.td< / tt >
look like this:< / p >
2008-12-12 00:33:33 +01:00
< pre class = "literal-block" >
// Include common definitions
2008-12-12 00:24:40 +01:00
include " llvm/CompilerDriver/Common.td"
2008-12-12 00:33:33 +01:00
// Tool descriptions
def gcc : Tool<
[(in_language " c" ),
(out_language " executable" ),
(output_suffix " out" ),
2011-04-24 16:17:37 +02:00
(command " gcc" ),
(sink),
// -o is what is used by default, out_file_option here is included for
// instructive purposes.
(out_file_option " -o" )
2008-12-12 00:24:40 +01:00
]> ;
2008-12-12 00:33:33 +01:00
// Language map
2011-04-24 16:17:37 +02:00
def LanguageMap : LanguageMap< [(lang_to_suffixes " c" , " c" )]> ;
2008-12-12 00:24:40 +01:00
2008-12-12 00:33:33 +01:00
// Compilation graph
2011-04-24 16:17:37 +02:00
def CompilationGraph : CompilationGraph< [(edge " root" , " gcc" )]> ;
2008-12-12 00:33:33 +01:00
< / pre >
2011-04-24 16:17:37 +02:00
< p > As you can see, this file consists of three parts: tool descriptions, language
map, and the compilation graph definition.< / p >
< p > At the heart of LLVMC is the idea of a compilation graph: vertices in this graph
are tools, and edges represent a transformation path between two tools (for
example, assembly source produced by the compiler can be transformed into
executable code by an assembler). The compilation graph is basically a list of
edges; a special node named < tt class = "docutils literal" > root< / tt > is used to mark graph entry points.< / p >
< p > Tool descriptions are represented as property lists: most properties in the
example above should be self-explanatory; the < tt class = "docutils literal" > sink< / tt > property means that all
options lacking an explicit description should be forwarded to this tool.< / p >
< p > The < tt class = "docutils literal" > LanguageMap< / tt > associates a language name with a list of suffixes and is
used for deciding which toolchain corresponds to a given input file.< / p >
< p > To learn more about writing your own drivers with LLVMC, refer to the reference
manual and examples in the < tt class = "docutils literal" > examples< / tt > directory. Of a particular interest is
the < tt class = "docutils literal" > Skeleton< / tt > example, which can serve as a template for your LLVMC-based
drivers.< / p >
2008-12-12 00:43:14 +01:00
< hr / >
2008-12-12 00:24:40 +01:00
< address >
2008-12-13 03:28:58 +01:00
< a href = "http://jigsaw.w3.org/css-validator/check/referer" >
< img src = "http://jigsaw.w3.org/css-validator/images/vcss-blue"
alt="Valid CSS" />< / a >
< a href = "http://validator.w3.org/check?uri=referer" >
< img src = "http://www.w3.org/Icons/valid-xhtml10-blue"
alt="Valid XHTML 1.0 Transitional"/>< / a >
2008-12-12 00:24:40 +01:00
2008-12-13 03:28:58 +01:00
< a href = "mailto:foldr@codedgers.com" > Mikhail Glushenkov< / a > < br / >
2011-04-24 16:17:37 +02:00
< a href = "http://llvm.org" > LLVM Compiler Infrastructure< / a > < br / >
2008-12-12 00:24:40 +01:00
2008-12-13 03:28:58 +01:00
Last modified: $Date: 2008-12-11 11:34:48 -0600 (Thu, 11 Dec 2008) $
< / address > < / div >
2008-12-12 00:24:40 +01:00
< / div >
< / body >
< / html >