blob: eff760cf2745ee7619f69f8892c9c4dc99927b78 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>SAFECode Install Guide</title>
<link rel="stylesheet" href="llvm.css" type="text/css">
</head>
<body>
<div class="doc_title">
SAFECode Install Guide
</div>
<!--
==============================================================================
LLVM Release License
==============================================================================
University of Illinois/NCSA
Open Source License
Copyright (c) 2003-2012 University of Illinois at Urbana-Champaign.
All rights reserved.
Developed by:
LLVM Team
University of Illinois at Urbana-Champaign
http://llvm.org
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal with
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimers.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimers in the
documentation and/or other materials provided with the distribution.
* Neither the names of the LLVM Team, University of Illinois at
Urbana-Champaign, nor the names of its contributors may be used to
endorse or promote products derived from this Software without specific
prior written permission.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
SOFTWARE.
-->
<!-- ********************************************************************** -->
<!-- * Table of Contents * -->
<!-- ********************************************************************** -->
<ul>
<li><a href="#overview">Overview</a></li>
<li><a href="#requirements">Requirements</a></li>
<ul>
<li><a href="#dependencies">Software and Build Tool Dependencies</a>
<li><a href="#platforms">Supported Platforms</a>
</ul>
<li><a href="#download">Getting the Source Code</a></li>
<ul>
<li><a href="#direct">Source TAR Archive</a>
<li><a href="#svn">Subversion Repository Download</a>
</ul>
<li><a href="#configure">Configuring the Source Code</a></li>
<li><a href="#compile">Compiling SAFECode</a></li>
<li><a href="#install">Installing SAFECode</a></li>
</ul>
<!-- ********************************************************************** -->
<!-- * Authors * -->
<!-- ********************************************************************** -->
<div class="doc_author">
<p>Written by the LLVM Research Group. Includes text from LLVM
contributors which is licensed under the
<a href="http://llvm.org/releases/3.2/LICENSE.TXT">
University of Illinois/NCSA Open Source license.</a></p>
</div>
<!-- *********************************************************************** -->
<div class="doc_section">
<a name="overview"><b>Overview</b></a>
</div>
<!-- *********************************************************************** -->
<div class="doc_text">
<p>
Welcome to the SAFECode compiler! This manual provides instructions for
downloading and compiling SAFECode. It also provides information on software
that you must have in order to install SAFECode.
</p>
</div>
<!-- *********************************************************************** -->
<div class="doc_section">
<a name="requirements"><b>Requirements</b></a>
</div>
<!-- *********************************************************************** -->
<div class="doc_subsection">
<a name="dependencies"><b>Software and Build Tool Dependencies</b></a>
</div>
<div class="doc_text">
<p>
SAFECode depends upon several other pieces of software. SAFECode is built
using the <a href="http://llvm.org">LLVM Compiler Infrastructure</a>, so you
must have LLVM. SAFECode also uses libraries from the
Automatic Pool Allocation project. Directions on how to download these will be
provided with the directions on downloading SAFECode.
</p>
<p>
SAFECode comes pre-compiled for some architectures, but the best way to get it
is as as source code. If building from source, you will need the proper tools
(namely GCC and GNU make) to compile it. The necessary requirements are those
needed by LLVM and are listed
<a href="http://llvm.org/docs/GettingStarted.html#requirements">here</a>.
</p>
</div>
<div class="doc_subsection">
<a name="platforms"><b>Supported Platforms</b></a>
</div>
<div class="doc_text">
<p>
SAFECode is currently supported on Linux and Mac OS X running on x86
processors.
</p>
</div>
<!-- *********************************************************************** -->
<div class="doc_section">
<a name="download"><b>Getting the Source Code</b></a>
</div>
<!-- *********************************************************************** -->
<div class="doc_text">
<p>
There are two ways to get SAFECode: downloading the tar archive or downloading
it from the public Subversion repository.
</p>
</div>
<div class="doc_subsection">
<a name="direct"><b>Source TAR Archive</b></a>
</div>
<div class="doc_text">
<p>
Complete source TAR archives of SAFECode can be found
<a href="http://safecode.cs.illinois.edu/downloads.html">here</a>. These
archives include LLVM as well as the Automatic Pool Allocation and SAFECode
projects located within the <tt>llvm/projects</tt> directory. You will need
GNU Zip (<tt>gunzip</tt>) and the tar utility (<tt>tar</tt>) to unpack the
archive (these are available on practically all Unix systems today).
</p>
</div>
<div class="doc_subsection">
<a name="svn"><b>Subversion Repository Download</b></a>
</div>
<div class="doc_text">
<p>
SAFECode, the Automatic Pool Allocation project, and LLVM are all stored in
the public Subversion repository at llvm.org. You can retrieve the source code
for these projects using a standard Subversion client as described below.
</p>
<p>
By default, you should put Automatic Pool Allocation and SAFECode into the
projects subdirectory of the LLVM source distribution. The following commands
should download all of the source code into the appropriate places (note that,
in this example, we are grabbing the version of SAFECode from the release_32
branch which works with LLVM 3.2):
</p>
<ul>
<li><tt>cd <i>where-you-want-llvm-to-live</i></tt></li>
<li><tt>svn co http://llvm.org/svn/llvm-project/llvm/branches/release_32 llvm</tt></li>
<li><tt>cd llvm/projects</tt></li>
<li><tt>
svn co http://llvm.org/svn/llvm-project/poolalloc/branches/release_32 poolalloc
</tt></li>
<li><tt>
svn co http://llvm.org/svn/llvm-project/safecode/branches/release_32 safecode
</tt></li>
</ul>
<p>
You may optionally want to get the LLVM Test Suite (test-suite) source code:
</p>
<ul>
<li><tt>cd llvm/projects</tt></li>
<li><tt>
svn co http://llvm.org/svn/llvm-project/test-suite/branches/release_32 test-suite
</tt></li>
</ul>
<p>
If you use the LLVM Test Suite, you will also need the LLVM GCC front-end, and
you will need to configure LLVM so that it knows where to find llvm-gcc and
llvm-g++. Directions for downloading and installing the front-end can be found
in the
<a href="http://llvm.org/docs/GettingStarted.html">
LLVM Getting Started Guide
</a>.
</p>
</div>
<!-- *********************************************************************** -->
<div class="doc_section">
<a name="configure"><b>Configuring the Source Code</b></a>
</div>
<!-- *********************************************************************** -->
<div class="doc_text">
<p>
Once you have the source code checked out, you should be able to configure
LLVM, the poolalloc project, and the SAFECode project using just the top level
LLVM configure script (the LLVM <tt>configure</tt> script configures the
poolalloc and safecode projects automatically if they're present in the
<tt>projects</tt> subdirectory). Simply configure LLVM as you normally would
(e.g., run <tt>./configure</tt> in the LLVM source tree), and SAFECode will be
configured automatically for you.
</p>
<p>
If you have any problems configuring SAFECode (or you're doing something
unconventional), you can try adding the following options to the command line
when running <tt>configure</tt>:
</p>
<ul>
<li>
<tt>--with-llvmsrc=<i>directory</i></tt>:
Specifies the location of the LLVM source directory. This option is used by
the Automatic Pool Allocation and SAFECode build systems to find the LLVM
source tree; it is ignored by the LLVM configure script but passed to the
Automatic Pool Allocation configure script. This option is not needed if
building in the source tree (i.e., SRCDIR == OBJDIR) and the project
(poolalloc or safecode) is in the LLVM projects subdirectory.
</li>
<li>
<tt>--with-llvmobj=<i>directory</i></tt>:
Specifies the location of the LLVM object directory. This option is used by
the Automatic Pool Allocation and SAFECode build systems to find the LLVM
object tree; it is ignored by the LLVM configure script but passed to the
Automatic Pool Allocation configure script. This option is not needed if
building in the source tree (i.e., SRCDIR == OBJDIR) and the project
(poolalloc or safecode) is in the LLVM projects subdirectory.
</li>
</ul>
<p>
Additional options for the SAFECode configure script include:
</p>
<ul>
<li><tt>--with-poolalloc-srcdir</tt>:
Specifies the location of the source code for Automatic Pool Allocation.
This should only be necessary if the either the poolalloc source tree or
safecode source tree is not within <tt>llvm/projects</tt>.
</li>
<li><tt>--with-poolalloc-objdir</tt>:
Specifies the location of the object code for Automatic Pool Allocation.
This should only be necessary if the either the poolalloc object tree or
safecode object tree is not within the <tt>projects</tt> subdirectory of the
LLVM object tree.
</li>
</ul>
The overall process will look like the following if you are building Automatic
Pool Allocation and SAFECode in the the projects subdirectory of the LLVM
object tree:
<ul>
<li><tt>cd <i>LLVM-object-directory</i></tt></li>
<li><tt><i>LLVM-source-directory</i>/configure [options]</tt></li>
</ul>
</div>
<!-- *********************************************************************** -->
<div class="doc_section">
<a name="compile"><b>Compiling SAFECode</b></a>
</div>
<!-- *********************************************************************** -->
<div class="doc_text">
<p>
To build SAFECode, first compile the LLVM tools and then SAFECode itself:
</p>
<ul>
<li><tt>cd <i>LLVM-object-directory</i></tt></li>
<li><tt>make tools-only</tt></li>
<li><tt>cd projects/poolalloc</tt></li>
<li><tt>make</tt></li>
<li><tt>cd ../safecode</tt></li>
<li><tt>make</tt></li>
</ul>
SAFECode will, by default, perform the same type of build that LLVM does. For
example, if LLVM is configured to do a Release build by default, SAFECode will
do a Release build by default as well.
There are three types of builds:
<ul>
<li>
Debug:
The SAFECode libraries and tools are placed in <tt>Debug/lib</tt> and
<tt>Debug/bin</tt> in the SAFECode object tree. The libraries and programs
are compiled with debug symbols enabled. The tools may operate more slowly
due to the extra debug information.
</li>
<li>
Release:
The SAFECode libraries and tools are placed in <tt>Release/lib</tt> and
<tt>Release/bin</tt> in the SAFECode object tree. The libraries and programs
are compiled at a higher optimization level and debug symbols are stripped
from executables, making the SAFECode tools faster.
</li>
<li>
Profile:
The SAFECode libraries and tools are placed in <tt>Profile/lib</tt> and
<tt>Profile/bin</tt> in the SAFECode object tree. The libraries and programs
are compiled to generate profiling information which can be used to find
performance bottlenecks.
</li>
</ul>
<p>
If you only want to use SAFECode, use a Release build. If you are doing
development work on SAFECode, use the Debug or Profile builds as appropriate.
</p>
</div>
<!-- *********************************************************************** -->
<div class="doc_section">
<a name="install"><b>Installing SAFECode</b></a>
</div>
<!-- *********************************************************************** -->
<div class="doc_subsection">
<a name="install"><b>Installing the SAFECode Compiler</b></a>
</div>
<div class="doc_text">
<p>
Once SAFECode has been built, you can install it using the following commands:
</p>
<ul>
<li><tt>cd <i>LLVM-object-directory</i></tt></li>
<li><tt>make install</tt></li>
<li><tt>cd projects/poolalloc</tt></li>
<li><tt>make install</tt></li>
<li><tt>cd ../safecode</tt></li>
<li><tt>make install</tt></li>
</ul>
<p>
Like LLVM, installing SAFECode is not necessary for using it; however,
performing the installation may place the SAFECode binaries and libraries into
directories that are more convenient. By default, clang and clang++ are
installed into <tt>/usr/local/bin</tt>, and the libraries are installed in
<tt>/usr/local/lib</tt>; however, these locations can be changed by using the
<tt>--prefix</tt> option to the LLVM configure script.
</p>
</div>
<div class="doc_subsection">
<a name="install"><b>Installing the SAFECode Link-Time Optimizer (Optional)</b></a>
</div>
<div class="doc_text">
<p>
SAFECode uses a set of whole program analysis techniques to make its run-time
checks more stringent and to optimize away unneeded run-time checks. To
perform whole-program analysis, SAFECode provides a replacement libLTO plugin
for the linker that performs these analyses and transformations.
</p>
<p>
Installing SAFECode's libLTO plugin is not necessary for using SAFECode, but it
will make SAFECode's run-time checks more thorough, so you will want to
install it if you can.
</p>
<p>
The install instructions differ based on platform:
</p>
<b>Mac OS X:</b>
<br>
For Mac OS X, you simply need to backup the original LTO plugin
(<tt>/usr/lib/libLTO.dylib</tt>) and replace it with the one from the SAFECode
build (this will, sadly, require root access). To do that, do the following:
<ul>
<li><tt>cd <i>SAFECode-object-directory</i></tt></li>
<li><tt>sudo</tt></li>
<li><tt>cp /usr/lib/libLTO.dylib /usr/lib/orig.libLTO.dylib</tt></li>
<li><tt>cp Debug/lib/libLTO.dylib /usr/lib</tt></li>
</ul>
<b>Linux:</b>
<br>
For Linux, you will need to install new, LTO-compatible versions of the ld, nm,
and ar utilities. You will then need to configure, compile, and install LLVM
and SAFECode. More specifically, you will need to do the following:
<ol>
<li>
<b>Select a directory into which all the tools will be installed</b>
<br>
It will be much easier to use libLTO if you install all the software into a
directory. Call this directory $PREFIX.
</li>
<br>
<li>
<b>Build LTO-compatible versions of ld, nm, and ar</b>
<br>
The directions to build LTO-compatible versions of ld, nm, and ar are found
in the LLVM Gold Plugin document at
<a href="http://llvm.org/docs/GoldPlugin.html">http://llvm.org/docs/GoldPlugin.html</a>.
However, you will want to install all of binutils into $PREFIX; to do that,
make sure to add a --prefix=$PREFIX option to the configure command
line and use "make install" instead of "make all-gold." In other words, you
will want to do the following:
<ul>
<li><tt>mkdir binutils</tt></li>
<li><tt>cd binutils</tt></li>
<li><tt>cvs -z 9 -d :pserver:anoncvs@sourceware.org:/cvs/src login</tt></li>
<li>{enter "anoncvs" as the password}</li>
<li><tt>cvs -z 9 -d :pserver:anoncvs@sourceware.org:/cvs/src co binutils</tt></li>
<li><tt>mkdir build</tt></li>
<li><tt>cd build</tt></li>
<li><tt>../src/configure --prefix=$PREFIX --enable-gold --enable-plugins</tt></li>
<li><tt>make</tt></li>
<li><tt>make install</tt></li>
</ul>
<br>
<li>
<b>Configure, Build, and Install LLVM and SAFECode</b>
<br>
You will need to tell LLVM where to find the Binutils header files, and you
will need to configure it to install into the same directory as Binutils:
<ul>
<li><tt>cd <i>LLVM-object-directory</i></tt></li>
<li><tt><i>LLVM-source-directory</i>/configure --prefix=$PREFIX
--with-binutils-include=/path/to/binutils/src/include [additional options]</tt></li>
<li><tt>make install</tt></li>
<li><tt>cd projects/poolalloc</tt></li>
<li><tt>make install</tt></li>
<li><tt>cd ../safecode</tt></li>
<li><tt>make install</tt></li>
</ul>
</li>
<br>
<li>
<b>Switch the Linker to the Gold Linker</b>
<br>
By default, Binutils will create three files: $PREFIX/bin/ld,
$PREFIX/bin/ld.bfd, and $PREFIX/bin/ld.gold. You need to change
$PREFIX/bin/ld so that it is a hard link to $PREFIX/bin/ld.bfd:
<ul>
<li><tt>rm $PREFIX/bin/ld</tt></ld>
<li><tt>ln $PREFIX/bin/ld.gold $PREFIX/bin/ld</tt></ld>
</ul>
</li>
<br>
<li>
<b>Change your $PATH so that $PREFIX/bin is first</b>
<br>
Now that everything is installed, change your $PATH environment variable so
that $PREFIX/bin is the first directory that is searched. This will make
SAFECode's clang and SAFECode's libLTO the default ones that are used.
</li>
</ol>
<p>
With all of that done, you should now have a working SAFECode with libLTO
installation on your system.
</p>
</div>