| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> |
| <html> |
| <head> |
| <title>Using The LLVM Libraries</title> |
| <link rel="stylesheet" href="llvm.css" type="text/css"> |
| </head> |
| <body> |
| <div class="doc_title">Using The LLVM Libraries</div> |
| <ol> |
| <li><a href="#abstract">Abstract</a></li> |
| <li><a href="#introduction">Introduction</a></li> |
| <li><a href="#descriptions">Library Descriptions</a></li> |
| <li><a href="#dependencies">Library Dependencies</a></li> |
| <li><a href="#rot">Linkage Rules Of Thumb</a> |
| <ol> |
| <li><a href="#always">Always link LLVMCore, LLVMSupport, LLVMSystem</a> |
| <li><a href="#onlyone">Never link both archive and re-linked</a> |
| </ol> |
| </li> |
| </ol> |
| |
| <div class="doc_author"> |
| <p>Written by <a href="mailto:rspencer@x10sys.com">Reid Spencer</a></p> |
| </div> |
| |
| <p class="doc_warning">Warning: This document is out of date, please see <a href="CommandGuide/html/llvm-config.html">llvm-config</a> for more information.</p> |
| |
| <!-- ======================================================================= --> |
| <div class="doc_section"><a name="abstract">Abstract</a></div> |
| <div class="doc_text"> |
| <p>Amongst other things, LLVM is a toolkit for building compilers, linkers, |
| runtime executives, virtual machines, and other program execution related |
| tools. In addition to the LLVM tool set, the functionality of LLVM is |
| available through a set of libraries. To use LLVM as a toolkit for |
| constructing tools, a developer needs to understand what is contained in the |
| various libraries, what they depend on, and how to use them. Fortunately, |
| there is a tool, <tt>llvm-config</tt> to aid with this. This document |
| describes the contents of the libraries and how to use <tt>llvm-config</tt> |
| to generate command line options. |
| </p> |
| </div> |
| |
| <!-- ======================================================================= --> |
| <div class="doc_section"> <a name="introduction">Introduction</a></div> |
| <div class="doc_text"> |
| <p>If you're writing a compiler, virtual machine, or any other utility based |
| on LLVM, you'll need to figure out which of the many libraries files you will |
| need to link with to be successful. An understanding of the contents of these |
| libraries will be useful in coming up with an optimal specification for the |
| libraries to link with. The purpose of this document is to reduce some of |
| the trial and error that the author experienced in using LLVM.</p> |
| <p>LLVM produces two types of libraries: archives (ending in <tt>.a</tt>) and |
| objects (ending in <tt>.o</tt>). However, both are libraries. Libraries ending |
| in <tt>.o</tt> are known as re-linked libraries because they contain all the |
| compilation units of the library linked together as a single <tt>.o</tt> file. |
| Furthermore, several of the libraries have <em>both</em> forms of library. The |
| re-linked libraries are used whenever you want to include all symbols from the |
| library. The archive libraries are used whenever you want to only resolve |
| outstanding symbols at that point in the link without including everything in |
| the library. </p> |
| <p>If you're using the LLVM Makefile system to link your tools,you will use |
| the <tt>LLVMLIBS</tt> make variable. |
| (see the <a href="MakefileGuide.html#LLVMLIBS">Makefile Guide</a> for |
| details). This variable specifies which LLVM libraries to link into your tool |
| and the order in which they will be linked. You specify re-linked libraries by |
| naming the library without a suffix. You specify archive libraries by naming |
| the library with a <tt>.a</tt> suffix but without the <tt>lib</tt> prefix. The |
| order in which the libraries appear in the <tt>LLVMLIBS</tt> variable |
| definition is the order in which they will be linked. Getting this order |
| correct for your tool can sometimes be challenging. |
| </div> |
| <!-- ======================================================================= --> |
| <div class="doc_section"><a name="descriptions"></a>Library Descriptions</div> |
| <div class="doc_text"> |
| <p>The table below categorizes each library |
| <table style="text-align:left"> |
| <tr><th>Library</th><th>Forms</th><th>Description</th></tr> |
| <tr><th colspan="3">Core Libraries</th></tr> |
| <tr><td>LLVMArchive</td><td><tt>.a</tt></td> |
| <td>LLVM archive reading and writing</td></tr> |
| <tr><td>LLVMAsmParser</td><td><tt>.a</tt></td> |
| <td>LLVM assembly parsing</td></tr> |
| <tr><td>LLVMBCReader</td><td><tt>.a</tt></td> |
| <td>LLVM bytecode reading</td></tr> |
| <tr><td>LLVMBCWriter</td><td><tt>.a</tt></td> |
| <td>LLVM bytecode writing</td></tr> |
| <tr><td>LLVMCore</td><td><tt>.a</tt></td> |
| <td>LLVM core intermediate representation</td></tr> |
| <tr><td>LLVMDebugger</td><td><tt>.a</tt></td> |
| <td>Source level debugging support</td></tr> |
| <tr><td>LLVMLinker</td><td><tt>.a</tt></td> |
| <td>Bytecode and archive linking interface</td></tr> |
| <tr><td>LLVMSupport</td><td><tt>.a</tt></td> |
| <td>General support utilities</td></tr> |
| <tr><td>LLVMSystem</td><td><tt>.a</tt></td> |
| <td>Operating system abstraction layer</td></tr> |
| <tr><td>LLVMbzip2</td><td><tt>.a</tt></td> |
| <td>BZip2 compression library</td></tr> |
| |
| <tr><th colspan="3">Analysis Libraries</th></tr> |
| <tr><td>LLVMAnalysis</td><td><tt>.a</tt></td> |
| <td>Various analysis passes.</td></tr> |
| <tr><td>LLVMDataStructure</td><td><tt>.o</tt></td> |
| <td>Data structure analysis passes.</td></tr> |
| <tr><td>LLVMipa</td><td><tt>.a</tt></td> |
| <td>Inter-procedural analysis passes.</td></tr> |
| |
| <tr><th colspan="3">Transformation Libraries</th></tr> |
| <tr><td>LLVMInstrumentation</td><td><tt>.a</tt></td> |
| <td>Instrumentation passes.</td></tr> |
| <tr><td>LLVMipo</td><td><tt>.a</tt></td> |
| <td>All inter-procedural optimization passes.</td></tr> |
| <tr><td>LLVMScalarOpts</td><td><tt>.a</tt></td> |
| <td>All scalar optimization passes.</td></tr> |
| <tr><td>LLVMTransforms</td><td><tt>.a</tt></td> |
| <td>Uncategorized transformation passes.</td></tr> |
| <tr><td>LLVMTransformUtils</td><td><tt>.a</tt></td> |
| <td>Transformation utilities.</td></tr> |
| |
| <tr><th colspan="3">Code Generation Libraries </th></tr> |
| <tr><td>LLVMCodeGen</td><td><tt>.o</tt></td> |
| <td>Native code generation infrastructure</td></tr> |
| <tr><td>LLVMSelectionDAG</td><td><tt>.o</tt></td> |
| <td>Aggressive instruction selector for directed acyclic graphs</td></tr> |
| |
| <tr><th colspan="3">Target Libraries</th></tr> |
| <tr><td>LLVMAlpha</td><td><tt>.o</tt></td> |
| <td>Code generation for Alpha architecture</td></tr> |
| <tr><td>LLVMARM</td><td><tt>.o</tt></td> |
| <td>Code generation for ARM architecture</td></tr> |
| <tr><td>LLVMCBackend</td><td><tt>.o</tt></td> |
| <td>'C' language code generator.</td></tr> |
| <tr><td>LLVMIA64</td><td><tt>.o</tt></td> |
| <td>Code generation for IA64 architecture</td></tr> |
| <tr><td>LLVMPowerPC</td><td><tt>.o</tt></td> |
| <td>Code generation for PowerPC architecture</td></tr> |
| <tr><td>LLVMSparc</td><td><tt>.o</tt></td> |
| <td>Code generation for Sparc architecture</td></tr> |
| <tr><td>LLVMTarget</td><td><tt>.a</tt></td> |
| <td>Generic code generation utilities.</td></tr> |
| <tr><td>LLVMX86</td><td><tt>.o</tt></td> |
| <td>Code generation for Intel x86 architecture</td></tr> |
| |
| <tr><th colspan="3">Runtime Libraries</th></tr> |
| <tr><td>LLVMInterpreter</td><td><tt>.o</tt></td> |
| <td>Bytecode Interpreter</td></tr> |
| <tr><td>LLVMJIT</td><td><tt>.o</tt></td> |
| <td>Bytecode JIT Compiler</td></tr> |
| <tr><td>LLVMExecutionEngine</td><td><tt>.o</tt></td> |
| <td>Virtual machine engine</td></tr> |
| </table> |
| </div> |
| |
| <!-- ======================================================================= --> |
| <div class="doc_section"><a name="dependencies"></a>Using llvm-config</div> |
| <div class="doc_text"> |
| <p>The <tt>llvm-config</tt> tool is a perl script that produces on its output |
| various kinds of information. For example, the source or object directories |
| used to build LLVM can be accessed by passing options to <tt>llvm-config</tt>. |
| For complete details on this tool, please see the |
| <a href="CommandGuide/html/llvm-config.html">manual page</a>.</p> |
| <p>To understand the relationships between libraries, the <tt>llvm-config</tt> |
| can be very useful. If all you know is that you want certain libraries to |
| be available, you can generate the complete set of libraries to link with |
| using one of four options, as below:</p> |
| <ol> |
| <li><tt>--ldflags</tt>. This generates the command line options necessary to |
| be passed to the <tt>ld</tt> tool in order to link with LLVM. Most notably, |
| the <tt>-L</tt> option is provided to specify a library search directory |
| that contains the LLVM libraries.</li> |
| <li><tt>--libs</tt>. This generates command line options suitable for |
| use with a gcc-style linker. That is, libraries are given with a -l option |
| and object files are given with a full path.</li> |
| <li><tt>--libnames</tt>. This generates a list of just the library file |
| names. If you know the directory in which these files reside (see --ldflags) |
| then you can find the libraries there.</li> |
| <li><tt>--libfiles</tt>. This generates the full path names of the |
| LLVM library files.</li> |
| </ol> |
| <p>If you wish to delve further into how <tt>llvm-config</tt> generates the |
| correct order (based on library dependencies), please see the tool named |
| <tt>GenLibDeps.pl</tt> in the <tt>utils</tt> source directory of LLVM.</p> |
| |
| <!-- =======NOTE: =========================================================--> |
| <!-- === The following graphs and <dl> list are generated automatically ===--> |
| <!-- === by the util named GenLibDeps.pl in the llvm/utils directory. ===--> |
| <!-- === This should be updated whenever new libraries are added, ===--> |
| <!-- === removed, or changed ===--> |
| <!-- =======NOTE: =========================================================--> |
| <h2>Dependency Relationships Of Libraries</h2> |
| <p>This graph shows the dependency of archive libraries on other archive |
| libraries or objects. Where a library has both archive and object forms, only |
| the archive form is shown.</p> |
| <img src="img/libdeps.gif" alt="Library Dependencies"/> |
| <h2>Dependency Relationships Of Object Files</h2> |
| <p>This graph shows the dependency of object files on archive libraries or |
| other objects. Where a library has both object and archive forms, only the |
| dependency to the archive form is shown.</p> |
| <img src="img/objdeps.gif" alt="Object File Dependencies"/> |
| <p>The following list shows the dependency relationships between libraries in |
| textual form. The information is the same as shown on the graphs but arranged |
| alphabetically.</p> |
| <dl> |
| <dt><b>libLLVMAnalysis.a</b</dt><dd><ul> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| <li>libLLVMTarget.a</li> |
| </ul></dd> |
| <dt><b>libLLVMArchive.a</b</dt><dd><ul> |
| <li>libLLVMBCReader.a</li> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| </ul></dd> |
| <dt><b>libLLVMAsmParser.a</b</dt><dd><ul> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| </ul></dd> |
| <dt><b>libLLVMBCReader.a</b</dt><dd><ul> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| </ul></dd> |
| <dt><b>libLLVMBCWriter.a</b</dt><dd><ul> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| </ul></dd> |
| <dt><b>libLLVMCodeGen.a</b</dt><dd><ul> |
| <li>libLLVMAnalysis.a</li> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| <li>libLLVMTarget.a</li> |
| </ul></dd> |
| <dt><b>libLLVMCore.a</b</dt><dd><ul> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| </ul></dd> |
| <dt><b>libLLVMDebugger.a</b</dt><dd><ul> |
| <li>libLLVMBCReader.a</li> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| </ul></dd> |
| <dt><b>libLLVMInstrumentation.a</b</dt><dd><ul> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMScalarOpts.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMTransformUtils.a</li> |
| </ul></dd> |
| <dt><b>libLLVMLinker.a</b</dt><dd><ul> |
| <li>libLLVMArchive.a</li> |
| <li>libLLVMBCReader.a</li> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMSystem.a</li> |
| </ul></dd> |
| <dt><b>libLLVMScalarOpts.a</b</dt><dd><ul> |
| <li>libLLVMAnalysis.a</li> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| <li>libLLVMTarget.a</li> |
| <li>libLLVMTransformUtils.a</li> |
| </ul></dd> |
| <dt><b>libLLVMSelectionDAG.a</b</dt><dd><ul> |
| <li>libLLVMCodeGen.a</li> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| <li>libLLVMTarget.a</li> |
| <li>libLLVMTransformUtils.a</li> |
| </ul></dd> |
| <dt><b>libLLVMSupport.a</b</dt><dd><ul> |
| <li>libLLVMSystem.a</li> |
| <li>libLLVMbzip2.a</li> |
| </ul></dd> |
| <dt><b>libLLVMSystem.a</b</dt><dd></dd> |
| <dt><b>libLLVMTarget.a</b</dt><dd><ul> |
| <li>libLLVMCodeGen.a</li> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMSelectionDAG.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| </ul></dd> |
| <dt><b>libLLVMTransformUtils.a</b</dt><dd><ul> |
| <li>libLLVMAnalysis.a</li> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMScalarOpts.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| <li>libLLVMipa.a</li> |
| </ul></dd> |
| <dt><b>libLLVMTransforms.a</b</dt><dd><ul> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMTarget.a</li> |
| <li>libLLVMTransformUtils.a</li> |
| </ul></dd> |
| <dt><b>libLLVMbzip2.a</b</dt><dd></dd> |
| <dt><b>libLLVMipa.a</b</dt><dd><ul> |
| <li>libLLVMAnalysis.a</li> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| </ul></dd> |
| <dt><b>libLLVMipo.a</b</dt><dd><ul> |
| <li>libLLVMAnalysis.a</li> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| <li>libLLVMTarget.a</li> |
| <li>libLLVMTransformUtils.a</li> |
| <li>libLLVMipa.a</li> |
| </ul></dd> |
| <dt><b>LLVMARM.o</b</dt><dd><ul> |
| <li>libLLVMCodeGen.a</li> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMScalarOpts.a</li> |
| <li>libLLVMSelectionDAG.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| <li>libLLVMTarget.a</li> |
| </ul></dd> |
| <dt><b>LLVMAlpha.o</b</dt><dd><ul> |
| <li>libLLVMCodeGen.a</li> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMScalarOpts.a</li> |
| <li>libLLVMSelectionDAG.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| <li>libLLVMTarget.a</li> |
| </ul></dd> |
| <dt><b>LLVMCBackend.o</b</dt><dd><ul> |
| <li>libLLVMAnalysis.a</li> |
| <li>libLLVMCodeGen.a</li> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMScalarOpts.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| <li>libLLVMTarget.a</li> |
| <li>libLLVMipa.a</li> |
| </ul></dd> |
| <dt><b>LLVMDataStructure.o</b</dt><dd><ul> |
| <li>libLLVMAnalysis.a</li> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| <li>libLLVMTarget.a</li> |
| </ul></dd> |
| <dt><b>LLVMExecutionEngine.o</b</dt><dd><ul> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| <li>libLLVMTarget.a</li> |
| </ul></dd> |
| <dt><b>LLVMIA64.o</b</dt><dd><ul> |
| <li>libLLVMCodeGen.a</li> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMScalarOpts.a</li> |
| <li>libLLVMSelectionDAG.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| <li>libLLVMTarget.a</li> |
| </ul></dd> |
| <dt><b>LLVMInterpreter.o</b</dt><dd><ul> |
| <li>LLVMExecutionEngine.o</li> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| <li>libLLVMTarget.a</li> |
| </ul></dd> |
| <dt><b>LLVMJIT.o</b</dt><dd><ul> |
| <li>LLVMExecutionEngine.o</li> |
| <li>libLLVMCodeGen.a</li> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| <li>libLLVMTarget.a</li> |
| </ul></dd> |
| <dt><b>LLVMPowerPC.o</b</dt><dd><ul> |
| <li>libLLVMCodeGen.a</li> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMScalarOpts.a</li> |
| <li>libLLVMSelectionDAG.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| <li>libLLVMTarget.a</li> |
| </ul></dd> |
| <dt><b>LLVMSparc.o</b</dt><dd><ul> |
| <li>libLLVMCodeGen.a</li> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMScalarOpts.a</li> |
| <li>libLLVMSelectionDAG.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| <li>libLLVMTarget.a</li> |
| </ul></dd> |
| <dt><b>LLVMX86.o</b</dt><dd><ul> |
| <li>libLLVMCodeGen.a</li> |
| <li>libLLVMCore.a</li> |
| <li>libLLVMScalarOpts.a</li> |
| <li>libLLVMSelectionDAG.a</li> |
| <li>libLLVMSupport.a</li> |
| <li>libLLVMSystem.a</li> |
| <li>libLLVMTarget.a</li> |
| </ul></dd> |
| </dl> |
| </div> |
| |
| <!-- ======================================================================= --> |
| <div class="doc_section"><a name="rot">Linkage Rules Of Thumb</a></div> |
| <div class="doc_text"> |
| <p>This section contains various "rules of thumb" about what files you |
| should link into your programs.</p> |
| </div> |
| <!-- ======================================================================= --> |
| <div class="doc_subsection"><a name="always">Always Link LLVMCore, LLVMSupport, |
| and LLVMSystem</a></div> |
| <div class="doc_text"> |
| <p>No matter what you do with LLVM, the last three entries in the value of |
| your LLVMLIBS make variable should always be: |
| <tt>LLVMCore LLVMSupport.a LLVMSystem.a</tt>. There are no <tt>LLVM</tt> |
| programs that don't depend on these three.</p> |
| </div> |
| <!-- ======================================================================= --> |
| <div class="doc_subsection"><a name="onlyone">Never link both archive and |
| re-linked library</a></div> |
| <div class="doc_text"> |
| <p>There is never any point to linking both the re-linked (<tt>.o</tt>) and |
| the archive (<tt>.a</tt>) versions of a library. Since the re-linked version |
| includes the entire library, the archive version will not resolve any symbols. |
| You could even end up with link error if you place the archive version before |
| the re-linked version on the linker's command line.</p> |
| </div> |
| <!-- ======================================================================= --> |
| <hr> |
| <div class="doc_footer"> |
| <address> |
| <a href="http://jigsaw.w3.org/css-validator/check/referer"><img |
| src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!"/></a> |
| <a href="http://validator.w3.org/check/referer"><img |
| src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!" /></a> |
| <a href="mailto:rspencer@x10sys.com">Reid Spencer</a> |
| </address> |
| <a href="http://llvm.org">The LLVM Compiler Infrastructure</a> |
| <br>Last modified: $Date$ </div> |
| </body> |
| </html> |
| <!-- vim: sw=2 ts=2 ai |
| --> |