Skip to content
LangRef.html 98.8 KiB
Newer Older
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
                      "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <title>LLVM Assembly Language Reference Manual</title>
  <link rel="stylesheet" href="llvm.css" type="text/css">
</head>
Chris Lattner's avatar
Chris Lattner committed
<div class="doc_title"> LLVM Language Reference Manual </div>
Chris Lattner's avatar
Chris Lattner committed
<ol>
  <li><a href="#abstract">Abstract</a></li>
  <li><a href="#introduction">Introduction</a></li>
  <li><a href="#identifiers">Identifiers</a></li>
Chris Lattner's avatar
Chris Lattner committed
  <li><a href="#typesystem">Type System</a>
    <ol>
Chris Lattner's avatar
Chris Lattner committed
      <li><a href="#t_primitive">Primitive Types</a> 	
        <ol>
          <li><a href="#t_classifications">Type Classifications</a></li>
Chris Lattner's avatar
Chris Lattner committed
        </ol>
      </li>
Chris Lattner's avatar
Chris Lattner committed
      <li><a href="#t_derived">Derived Types</a>
        <ol>
Chris Lattner's avatar
Chris Lattner committed
          <li><a href="#t_array">Array Type</a></li>
          <li><a href="#t_function">Function Type</a></li>
          <li><a href="#t_pointer">Pointer Type</a></li>
Chris Lattner's avatar
Chris Lattner committed
          <li><a href="#t_struct">Structure Type</a></li>
<!-- <li><a href="#t_packed" >Packed Type</a> -->
        </ol>
      </li>
    </ol>
  </li>
Chris Lattner's avatar
Chris Lattner committed
  <li><a href="#highlevel">High Level Structure</a>
    <ol>
      <li><a href="#modulestructure">Module Structure</a></li>
      <li><a href="#globalvars">Global Variables</a></li>
      <li><a href="#functionstructure">Function Structure</a></li>
Chris Lattner's avatar
Chris Lattner committed
    </ol>
  </li>
Chris Lattner's avatar
Chris Lattner committed
  <li><a href="#instref">Instruction Reference</a>
    <ol>
      <li><a href="#terminators">Terminator Instructions</a>
        <ol>
Chris Lattner's avatar
Chris Lattner committed
          <li><a href="#i_ret">'<tt>ret</tt>' Instruction</a></li>
          <li><a href="#i_br">'<tt>br</tt>' Instruction</a></li>
          <li><a href="#i_switch">'<tt>switch</tt>' Instruction</a></li>
          <li><a href="#i_invoke">'<tt>invoke</tt>' Instruction</a></li>
Chris Lattner's avatar
Chris Lattner committed
          <li><a href="#i_unwind">'<tt>unwind</tt>'  Instruction</a></li>
        </ol>
      </li>
Chris Lattner's avatar
Chris Lattner committed
      <li><a href="#binaryops">Binary Operations</a>
        <ol>
Chris Lattner's avatar
Chris Lattner committed
          <li><a href="#i_add">'<tt>add</tt>' Instruction</a></li>
          <li><a href="#i_sub">'<tt>sub</tt>' Instruction</a></li>
          <li><a href="#i_mul">'<tt>mul</tt>' Instruction</a></li>
          <li><a href="#i_div">'<tt>div</tt>' Instruction</a></li>
          <li><a href="#i_rem">'<tt>rem</tt>' Instruction</a></li>
          <li><a href="#i_setcc">'<tt>set<i>cc</i></tt>' Instructions</a></li>
Chris Lattner's avatar
Chris Lattner committed
        </ol>
      </li>
Chris Lattner's avatar
Chris Lattner committed
      <li><a href="#bitwiseops">Bitwise Binary Operations</a>
        <ol>
          <li><a href="#i_and">'<tt>and</tt>' Instruction</a></li>
Chris Lattner's avatar
Chris Lattner committed
          <li><a href="#i_or">'<tt>or</tt>'  Instruction</a></li>
          <li><a href="#i_xor">'<tt>xor</tt>' Instruction</a></li>
          <li><a href="#i_shl">'<tt>shl</tt>' Instruction</a></li>
          <li><a href="#i_shr">'<tt>shr</tt>' Instruction</a></li>
Chris Lattner's avatar
Chris Lattner committed
        </ol>
      </li>
Chris Lattner's avatar
Chris Lattner committed
      <li><a href="#memoryops">Memory Access Operations</a>
        <ol>
Chris Lattner's avatar
Chris Lattner committed
          <li><a href="#i_malloc">'<tt>malloc</tt>'   Instruction</a></li>
          <li><a href="#i_free">'<tt>free</tt>'     Instruction</a></li>
          <li><a href="#i_alloca">'<tt>alloca</tt>'   Instruction</a></li>
	 <li><a href="#i_load">'<tt>load</tt>'     Instruction</a></li>
	 <li><a href="#i_store">'<tt>store</tt>'    Instruction</a></li>
	 <li><a href="#i_getelementptr">'<tt>getelementptr</tt>' Instruction</a></li>
        </ol>
      </li>
Chris Lattner's avatar
Chris Lattner committed
      <li><a href="#otherops">Other Operations</a>
        <ol>
Chris Lattner's avatar
Chris Lattner committed
          <li><a href="#i_phi">'<tt>phi</tt>'   Instruction</a></li>
          <li><a href="#i_cast">'<tt>cast .. to</tt>' Instruction</a></li>
          <li><a href="#i_select">'<tt>select</tt>' Instruction</a></li>
Chris Lattner's avatar
Chris Lattner committed
          <li><a href="#i_call">'<tt>call</tt>'  Instruction</a></li>
          <li><a href="#i_vanext">'<tt>vanext</tt>' Instruction</a></li>
Chris Lattner's avatar
Chris Lattner committed
          <li><a href="#i_vaarg">'<tt>vaarg</tt>'  Instruction</a></li>
Chris Lattner's avatar
Chris Lattner committed
        </ol>
Chris Lattner's avatar
Chris Lattner committed
      </li>
Chris Lattner's avatar
Chris Lattner committed
    </ol>
Chris Lattner's avatar
Chris Lattner committed
  </li>
  <li><a href="#intrinsics">Intrinsic Functions</a>
    <ol>
Chris Lattner's avatar
Chris Lattner committed
      <li><a href="#int_varargs">Variable Argument Handling Intrinsics</a>
        <ol>
          <li><a href="#i_va_start">'<tt>llvm.va_start</tt>' Intrinsic</a></li>
          <li><a href="#i_va_end">'<tt>llvm.va_end</tt>'   Intrinsic</a></li>
          <li><a href="#i_va_copy">'<tt>llvm.va_copy</tt>'  Intrinsic</a></li>
        </ol>
      </li>
      <li><a href="#int_gc">Accurate Garbage Collection Intrinsics</a>
        <ol>
          <li><a href="#i_gcroot">'<tt>llvm.gcroot</tt>' Intrinsic</a></li>
          <li><a href="#i_gcread">'<tt>llvm.gcread</tt>' Intrinsic</a></li>
          <li><a href="#i_gcwrite">'<tt>llvm.gcwrite</tt>' Intrinsic</a></li>
        </ol>
      </li>
Chris Lattner's avatar
Chris Lattner committed
      <li><a href="#int_codegen">Code Generator Intrinsics</a>
        <ol>
          <li><a href="#i_returnaddress">'<tt>llvm.returnaddress</tt>' Intrinsic</a></li>
          <li><a href="#i_frameaddress">'<tt>llvm.frameaddress</tt>'   Intrinsic</a></li>
        </ol>
      </li>
      <li><a href="#int_os">Operating System Intrinsics</a>
        <ol>
          <li><a href="#i_readport">'<tt>llvm.readport</tt>' Intrinsic</a></li>
          <li><a href="#i_writeport">'<tt>llvm.writeport</tt>' Intrinsic</a></li>
          <li><a href="#i_readio">'<tt>llvm.readio</tt>'   Intrinsic</a></li>
          <li><a href="#i_writeio">'<tt>llvm.writeio</tt>'   Intrinsic</a></li>
Chris Lattner's avatar
Chris Lattner committed
        </ol>
      <li><a href="#int_libc">Standard C Library Intrinsics</a>
        <ol>
          <li><a href="#i_memcpy">'<tt>llvm.memcpy</tt>' Intrinsic</a></li>
          <li><a href="#i_memmove">'<tt>llvm.memmove</tt>' Intrinsic</a></li>
Chris Lattner's avatar
Chris Lattner committed
          <li><a href="#i_memset">'<tt>llvm.memset</tt>' Intrinsic</a></li>
          <li><a href="#i_isnan">'<tt>llvm.isnan</tt>' Intrinsic</a></li>
      <li><a href="#int_debugger">Debugger intrinsics</a></li>
Chris Lattner's avatar
Chris Lattner committed
    </ol>
  </li>
Chris Lattner's avatar
Chris Lattner committed
</ol>

<div class="doc_author">
  <p>Written by <a href="mailto:sabre@nondot.org">Chris Lattner</a>
            and <a href="mailto:vadve@cs.uiuc.edu">Vikram Adve</a></p>
Chris Lattner's avatar
Chris Lattner committed
<!-- *********************************************************************** -->
Chris Lattner's avatar
Chris Lattner committed
<div class="doc_section"> <a name="abstract">Abstract </a></div>
Chris Lattner's avatar
Chris Lattner committed
<!-- *********************************************************************** -->
Chris Lattner's avatar
Chris Lattner committed
<p>This document is a reference manual for the LLVM assembly language. 
LLVM is an SSA based representation that provides type safety,
low-level operations, flexibility, and the capability of representing
'all' high-level languages cleanly.  It is the common code
representation used throughout all phases of the LLVM compilation
strategy.</p>
Chris Lattner's avatar
Chris Lattner committed
<!-- *********************************************************************** -->
Chris Lattner's avatar
Chris Lattner committed
<div class="doc_section"> <a name="introduction">Introduction</a> </div>
Chris Lattner's avatar
Chris Lattner committed
<!-- *********************************************************************** -->
Chris Lattner's avatar
Chris Lattner committed
<p>The LLVM code representation is designed to be used in three
different forms: as an in-memory compiler IR, as an on-disk bytecode
representation (suitable for fast loading by a Just-In-Time compiler),
and as a human readable assembly language representation.  This allows
LLVM to provide a powerful intermediate representation for efficient
compiler transformations and analysis, while providing a natural means
to debug and visualize the transformations.  The three different forms
of LLVM are all equivalent.  This document describes the human readable
representation and notation.</p>
Chris Lattner's avatar
Chris Lattner committed
<p>The LLVM representation aims to be a light-weight and low-level
while being expressive, typed, and extensible at the same time.  It
aims to be a "universal IR" of sorts, by being at a low enough level
that high-level ideas may be cleanly mapped to it (similar to how
microprocessors are "universal IR's", allowing many source languages to
be mapped to them).  By providing type information, LLVM can be used as
the target of optimizations: for example, through pointer analysis, it
can be proven that a C automatic variable is never accessed outside of
the current function... allowing it to be promoted to a simple SSA
value instead of a memory location.</p>
Chris Lattner's avatar
Chris Lattner committed
<!-- _______________________________________________________________________ -->
Chris Lattner's avatar
Chris Lattner committed
<div class="doc_subsubsection"> <a name="wellformed">Well-Formedness</a> </div>
Chris Lattner's avatar
Chris Lattner committed
<p>It is important to note that this document describes 'well formed'
LLVM assembly language.  There is a difference between what the parser
accepts and what is considered 'well formed'.  For example, the
following instruction is syntactically okay, but not well formed:</p>

<pre>
  %x = <a href="#i_add">add</a> int 1, %x
</pre>

Chris Lattner's avatar
Chris Lattner committed
<p>...because the definition of <tt>%x</tt> does not dominate all of
its uses. The LLVM infrastructure provides a verification pass that may
be used to verify that an LLVM module is well formed.  This pass is
automatically run by the parser after parsing input assembly, and by
the optimizer before it outputs bytecode.  The violations pointed out
Loading
Loading full blame...