aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/LangRef.html5374
1 files changed, 2598 insertions, 2776 deletions
diff --git a/docs/LangRef.html b/docs/LangRef.html
index 4fb712ee3b..9b801cffc3 100644
--- a/docs/LangRef.html
+++ b/docs/LangRef.html
@@ -287,12 +287,13 @@
<!-- *********************************************************************** -->
<div class="doc_text">
-<p>This document is a reference manual for the LLVM assembly language.
-LLVM is a Static Single Assignment (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>
+
+<p>This document is a reference manual for the LLVM assembly language. LLVM is
+ a Static Single Assignment (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>
+
</div>
<!-- *********************************************************************** -->
@@ -301,26 +302,24 @@ strategy.</p>
<div class="doc_text">
-<p>The LLVM code representation is designed to be used in three
-different forms: as an in-memory compiler IR, as an on-disk bitcode
-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>
+<p>The LLVM code representation is designed to be used in three different forms:
+ as an in-memory compiler IR, as an on-disk bitcode 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>
-<p>The LLVM representation aims to be 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>
+<p>The LLVM representation aims to be 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>
</div>
@@ -329,10 +328,10 @@ value instead of a memory location.</p>
<div class="doc_text">
-<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>
+<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>
<div class="doc_code">
<pre>
@@ -340,13 +339,13 @@ following instruction is syntactically okay, but not well formed:</p>
</pre>
</div>
-<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 bitcode. The violations pointed out
-by the verifier pass indicate bugs in transformation passes or input to
-the parser.</p>
+<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 bitcode. The violations pointed out by the verifier pass indicate
+ bugs in transformation passes or input to the parser.</p>
+
</div>
<!-- Describe the typesetting conventions here. -->
@@ -357,44 +356,47 @@ the parser.</p>
<div class="doc_text">
- <p>LLVM identifiers come in two basic types: global and local. Global
- identifiers (functions, global variables) begin with the @ character. Local
- identifiers (register names, types) begin with the % character. Additionally,
- there are three different formats for identifiers, for different purposes:</p>
+<p>LLVM identifiers come in two basic types: global and local. Global
+ identifiers (functions, global variables) begin with the <tt>'@'</tt>
+ character. Local identifiers (register names, types) begin with
+ the <tt>'%'</tt> character. Additionally, there are three different formats
+ for identifiers, for different purposes:</p>
<ol>
<li>Named values are represented as a string of characters with their prefix.
- For example, %foo, @DivisionByZero, %a.really.long.identifier. The actual
- regular expression used is '<tt>[%@][a-zA-Z$._][a-zA-Z$._0-9]*</tt>'.
- Identifiers which require other characters in their names can be surrounded
- with quotes. Special characters may be escaped using "\xx" where xx is the
- ASCII code for the character in hexadecimal. In this way, any character can
- be used in a name value, even quotes themselves.
+ For example, <tt>%foo</tt>, <tt>@DivisionByZero</tt>,
+ <tt>%a.really.long.identifier</tt>. The actual regular expression used is
+ '<tt>[%@][a-zA-Z$._][a-zA-Z$._0-9]*</tt>'. Identifiers which require
+ other characters in their names can be surrounded with quotes. Special
+ characters may be escaped using <tt>"\xx"</tt> where <tt>xx</tt> is the
+ ASCII code for the character in hexadecimal. In this way, any character
+ can be used in a name value, even quotes themselves.</li>
<li>Unnamed values are represented as an unsigned numeric value with their
- prefix. For example, %12, @2, %44.</li>
+ prefix. For example, <tt>%12</tt>, <tt>@2</tt>, <tt>%44</tt>.</li>
<li>Constants, which are described in a <a href="#constants">section about
- constants</a>, below.</li>
+ constants</a>, below.</li>
</ol>
<p>LLVM requires that values start with a prefix for two reasons: Compilers
-don't need to worry about name clashes with reserved words, and the set of
-reserved words may be expanded in the future without penalty. Additionally,
-unnamed identifiers allow a compiler to quickly come up with a temporary
-variable without having to avoid symbol table conflicts.</p>
+ don't need to worry about name clashes with reserved words, and the set of
+ reserved words may be expanded in the future without penalty. Additionally,
+ unnamed identifiers allow a compiler to quickly come up with a temporary
+ variable without having to avoid symbol table conflicts.</p>
<p>Reserved words in LLVM are very similar to reserved words in other
-languages. There are keywords for different opcodes
-('<tt><a href="#i_add">add</a></tt>',
- '<tt><a href="#i_bitcast">bitcast</a></tt>',
- '<tt><a href="#i_ret">ret</a></tt>', etc...), for primitive type names ('<tt><a
-href="#t_void">void</a></tt>', '<tt><a href="#t_primitive">i32</a></tt>', etc...),
-and others. These reserved words cannot conflict with variable names, because
-none of them start with a prefix character ('%' or '@').</p>
+ languages. There are keywords for different opcodes
+ ('<tt><a href="#i_add">add</a></tt>',
+ '<tt><a href="#i_bitcast">bitcast</a></tt>',
+ '<tt><a href="#i_ret">ret</a></tt>', etc...), for primitive type names
+ ('<tt><a href="#t_void">void</a></tt>',
+ '<tt><a href="#t_primitive">i32</a></tt>', etc...), and others. These
+ reserved words cannot conflict with variable names, because none of them
+ start with a prefix character (<tt>'%'</tt> or <tt>'@'</tt>).</p>
<p>Here is an example of LLVM code to multiply the integer variable
-'<tt>%X</tt>' by 8:</p>
+ '<tt>%X</tt>' by 8:</p>
<p>The easy way:</p>
@@ -422,25 +424,23 @@ none of them start with a prefix character ('%' or '@').</p>
</pre>
</div>
-<p>This last way of multiplying <tt>%X</tt> by 8 illustrates several
-important lexical features of LLVM:</p>
+<p>This last way of multiplying <tt>%X</tt> by 8 illustrates several important
+ lexical features of LLVM:</p>
<ol>
-
<li>Comments are delimited with a '<tt>;</tt>' and go until the end of
- line.</li>
+ line.</li>
<li>Unnamed temporaries are created when the result of a computation is not
- assigned to a named value.</li>
+ assigned to a named value.</li>
<li>Unnamed temporaries are numbered sequentially</li>
-
</ol>
<p>...and it also shows a convention that we follow in this document. When
-demonstrating instructions, we will follow an instruction with a comment that
-defines the type and name of value produced. Comments are shown in italic
-text.</p>
+ demonstrating instructions, we will follow an instruction with a comment that
+ defines the type and name of value produced. Comments are shown in italic
+ text.</p>
</div>
@@ -454,12 +454,12 @@ text.</p>
<div class="doc_text">
-<p>LLVM programs are composed of "Module"s, each of which is a
-translation unit of the input programs. Each module consists of
-functions, global variables, and symbol table entries. Modules may be
-combined together with the LLVM linker, which merges function (and
-global variable) definitions, resolves forward declarations, and merges
-symbol table entries. Here is an example of the "hello world" module:</p>
+<p>LLVM programs are composed of "Module"s, each of which is a translation unit
+ of the input programs. Each module consists of functions, global variables,
+ and symbol table entries. Modules may be combined together with the LLVM
+ linker, which merges function (and global variable) definitions, resolves
+ forward declarations, and merges symbol table entries. Here is an example of
+ the "hello world" module:</p>
<div class="doc_code">
<pre><i>; Declare the string constant as a global constant...</i>
@@ -467,32 +467,32 @@ symbol table entries. Here is an example of the "hello world" module:</p>
href="#globalvars">constant</a> <a href="#t_array">[13 x i8]</a> c"hello world\0A\00" <i>; [13 x i8]*</i>
<i>; External declaration of the puts function</i>
-<a href="#functionstructure">declare</a> i32 @puts(i8 *) <i>; i32(i8 *)* </i>
+<a href="#functionstructure">declare</a> i32 @puts(i8 *) <i>; i32(i8 *)* </i>
<i>; Definition of main function</i>
-define i32 @main() { <i>; i32()* </i>
+define i32 @main() { <i>; i32()* </i>
<i>; Convert [13 x i8]* to i8 *...</i>
%cast210 = <a
- href="#i_getelementptr">getelementptr</a> [13 x i8]* @.LC0, i64 0, i64 0 <i>; i8 *</i>
+ href="#i_getelementptr">getelementptr</a> [13 x i8]* @.LC0, i64 0, i64 0 <i>; i8 *</i>
<i>; Call puts function to write out the string to stdout...</i>
<a
- href="#i_call">call</a> i32 @puts(i8 * %cast210) <i>; i32</i>
+ href="#i_call">call</a> i32 @puts(i8 * %cast210) <i>; i32</i>
<a
href="#i_ret">ret</a> i32 0<br>}<br>
</pre>
</div>
-<p>This example is made up of a <a href="#globalvars">global variable</a>
-named "<tt>.LC0</tt>", an external declaration of the "<tt>puts</tt>"
-function, and a <a href="#functionstructure">function definition</a>
-for "<tt>main</tt>".</p>
+<p>This example is made up of a <a href="#globalvars">global variable</a> named
+ "<tt>.LC0</tt>", an external declaration of the "<tt>puts</tt>" function, and
+ a <a href="#functionstructure">function definition</a> for
+ "<tt>main</tt>".</p>
-<p>In general, a module is made up of a list of global values,
-where both functions and global variables are global values. Global values are
-represented by a pointer to a memory location (in this case, a pointer to an
-array of char, and a pointer to a function), and have one of the following <a
-href="#linkage">linkage types</a>.</p>
+<p>In general, a module is made up of a list of global values, where both
+ functions and global variables are global values. Global values are
+ represented by a pointer to a memory location (in this case, a pointer to an
+ array of char, and a pointer to a function), and have one of the
+ following <a href="#linkage">linkage types</a>.</p>
</div>
@@ -503,21 +503,18 @@ href="#linkage">linkage types</a>.</p>
<div class="doc_text">
-<p>
-All Global Variables and Functions have one of the following types of linkage:
-</p>
+<p>All Global Variables and Functions have one of the following types of
+ linkage:</p>
<dl>
-
<dt><tt><b><a name="linkage_private">private</a></b></tt>: </dt>
- <dd>Global values with private linkage are only directly accessible by
- objects in the current module. In particular, linking code into a module with
- an private global value may cause the private to be renamed as necessary to
- avoid collisions. Because the symbol is private to the module, all
- references can be updated. This doesn't show up in any symbol table in the
- object file.
- </dd>
+ <dd>Global values with private linkage are only directly accessible by objects
+ in the current module. In particular, linking code into a module with an
+ private global value may cause the private to be renamed as necessary to
+ avoid collisions. Because the symbol is private to the module, all
+ references can be updated. This doesn't show up in any symbol table in the
+ object file.</dd>
<dt><tt><b><a name="linkage_linker_private">linker_private</a></b></tt>: </dt>
@@ -526,121 +523,111 @@ All Global Variables and Functions have one of the following types of linkage:
<dt><tt><b><a name="linkage_internal">internal</a></b></tt>: </dt>
- <dd> Similar to private, but the value shows as a local symbol (STB_LOCAL in
- the case of ELF) in the object file. This corresponds to the notion of the
- '<tt>static</tt>' keyword in C.
- </dd>
+ <dd>Similar to private, but the value shows as a local symbol
+ (<tt>STB_LOCAL</tt> in the case of ELF) in the object file. This
+ corresponds to the notion of the '<tt>static</tt>' keyword in C.</dd>
- <dt><tt><b><a name="linkage_available_externally">available_externally</a></b></tt>:
- </dt>
+ <dt><tt><b><a name="linkage_available_externally">available_externally</a></b></tt>: </dt>
<dd>Globals with "<tt>available_externally</tt>" linkage are never emitted
- into the object file corresponding to the LLVM module. They exist to
- allow inlining and other optimizations to take place given knowledge of the
- definition of the global, which is known to be somewhere outside the module.
- Globals with <tt>available_externally</tt> linkage are allowed to be discarded
- at will, and are otherwise the same as <tt>linkonce_odr</tt>. This linkage
- type is only allowed on definitions, not declarations.</dd>
+ into the object file corresponding to the LLVM module. They exist to
+ allow inlining and other optimizations to take place given knowledge of
+ the definition of the global, which is known to be somewhere outside the
+ module. Globals with <tt>available_externally</tt> linkage are allowed to
+ be discarded at will, and are otherwise the same as <tt>linkonce_odr</tt>.
+ This linkage type is only allowed on definitions, not declarations.</dd>
<dt><tt><b><a name="linkage_linkonce">linkonce</a></b></tt>: </dt>
<dd>Globals with "<tt>linkonce</tt>" linkage are merged with other globals of
- the same name when linkage occurs. This is typically used to implement
- inline functions, templates, or other code which must be generated in each
- translation unit that uses it. Unreferenced <tt>linkonce</tt> globals are
- allowed to be discarded.
- </dd>
+ the same name when linkage occurs. This is typically used to implement
+ inline functions, templates, or other code which must be generated in each
+ translation unit that uses it. Unreferenced <tt>linkonce</tt> globals are
+ allowed to be discarded.</dd>
<dt><tt><b><a name="linkage_common">common</a></b></tt>: </dt>
- <dd>"<tt>common</tt>" linkage is exactly the same as <tt>linkonce</tt>
- linkage, except that unreferenced <tt>common</tt> globals may not be
- discarded. This is used for globals that may be emitted in multiple
- translation units, but that are not guaranteed to be emitted into every
- translation unit that uses them. One example of this is tentative
- definitions in C, such as "<tt>int X;</tt>" at global scope.
- </dd>
+ <dd>"<tt>common</tt>" linkage is exactly the same as <tt>linkonce</tt>
+ linkage, except that unreferenced <tt>common</tt> globals may not be
+ discarded. This is used for globals that may be emitted in multiple
+ translation units, but that are not guaranteed to be emitted into every
+ translation unit that uses them. One example of this is tentative
+ definitions in C, such as "<tt>int X;</tt>" at global scope.</dd>
<dt><tt><b><a name="linkage_weak">weak</a></b></tt>: </dt>
<dd>"<tt>weak</tt>" linkage is the same as <tt>common</tt> linkage, except
- that some targets may choose to emit different assembly sequences for them
- for target-dependent reasons. This is used for globals that are declared
- "weak" in C source code.
- </dd>
+ that some targets may choose to emit different assembly sequences for them
+ for target-dependent reasons. This is used for globals that are declared
+ "weak" in C source code.</dd>
<dt><tt><b><a name="linkage_appending">appending</a></b></tt>: </dt>
<dd>"<tt>appending</tt>" linkage may only be applied to global variables of
- pointer to array type. When two global variables with appending linkage are
- linked together, the two global arrays are appended together. This is the
- LLVM, typesafe, equivalent of having the system linker append together
- "sections" with identical names when .o files are linked.
- </dd>
+ pointer to array type. When two global variables with appending linkage
+ are linked together, the two global arrays are appended together. This is
+ the LLVM, typesafe, equivalent of having the system linker append together
+ "sections" with identical names when .o files are linked.</dd>
<dt><tt><b><a name="linkage_externweak">extern_weak</a></b></tt>: </dt>
- <dd>The semantics of this linkage follow the ELF object file model: the
- symbol is weak until linked, if not linked, the symbol becomes null instead
- of being an undefined reference.
- </dd>
+ <dd>The semantics of this linkage follow the ELF object file model: the symbol
+ is weak until linked, if not linked, the symbol becomes null instead of
+ being an undefined reference.</dd>
<dt><tt><b><a name="linkage_linkonce">linkonce_odr</a></b></tt>: </dt>
<dt><tt><b><a name="linkage_weak">weak_odr</a></b></tt>: </dt>
- <dd>Some languages allow differing globals to be merged, such as two
- functions with different semantics. Other languages, such as <tt>C++</tt>,
- ensure that only equivalent globals are ever merged (the "one definition
- rule" - "ODR"). Such languages can use the <tt>linkonce_odr</tt>
- and <tt>weak_odr</tt> linkage types to indicate that the global will only
- be merged with equivalent globals. These linkage types are otherwise the
- same as their non-<tt>odr</tt> versions.
- </dd>
+
+ <dd>Some languages allow differing globals to be merged, such as two functions
+ with different semantics. Other languages, such as <tt>C++</tt>, ensure
+ that only equivalent globals are ever merged (the "one definition rule" -
+ "ODR"). Such languages can use the <tt>linkonce_odr</tt>
+ and <tt>weak_odr</tt> linkage types to indicate that the global will only
+ be merged with equivalent globals. These linkage types are otherwise the
+ same as their non-<tt>odr</tt> versions.</dd>
<dt><tt><b><a name="linkage_external">externally visible</a></b></tt>:</dt>
<dd>If none of the above identifiers are used, the global is externally
- visible, meaning that it participates in linkage and can be used to resolve
- external symbol references.
- </dd>
+ visible, meaning that it participates in linkage and can be used to
+ resolve external symbol references.</dd>
</dl>
- <p>
- The next two types of linkage are targeted for Microsoft Windows platform
- only. They are designed to support importing (exporting) symbols from (to)
- DLLs (Dynamic Link Libraries).
- </p>
+<p>The next two types of linkage are targeted for Microsoft Windows platform
+ only. They are designed to support importing (exporting) symbols from (to)
+ DLLs (Dynamic Link Libraries).</p>
- <dl>
+<dl>
<dt><tt><b><a name="linkage_dllimport">dllimport</a></b></tt>: </dt>
<dd>"<tt>dllimport</tt>" linkage causes the compiler to reference a function
- or variable via a global pointer to a pointer that is set up by the DLL
- exporting the symbol. On Microsoft Windows targets, the pointer name is
- formed by combining <code>__imp_</code> and the function or variable name.
- </dd>
+ or variable via a global pointer to a pointer that is set up by the DLL
+ exporting the symbol. On Microsoft Windows targets, the pointer name is
+ formed by combining <code>__imp_</code> and the function or variable
+ name.</dd>
<dt><tt><b><a name="linkage_dllexport">dllexport</a></b></tt>: </dt>
<dd>"<tt>dllexport</tt>" linkage causes the compiler to provide a global
- pointer to a pointer in a DLL, so that it can be referenced with the
- <tt>dllimport</tt> attribute. On Microsoft Windows targets, the pointer
- name is formed by combining <code>__imp_</code> and the function or variable
- name.
- </dd>
-
+ pointer to a pointer in a DLL, so that it can be referenced with the
+ <tt>dllimport</tt> attribute. On Microsoft Windows targets, the pointer
+ name is formed by combining <code>__imp_</code> and the function or
+ variable name.</dd>
</dl>
-<p>For example, since the "<tt>.LC0</tt>"
-variable is defined to be internal, if another module defined a "<tt>.LC0</tt>"
-variable and was linked with this one, one of the two would be renamed,
-preventing a collision. Since "<tt>main</tt>" and "<tt>puts</tt>" are
-external (i.e., lacking any linkage declarations), they are accessible
-outside of the current module.</p>
-<p>It is illegal for a function <i>declaration</i>
-to have any linkage type other than "externally visible", <tt>dllimport</tt>
-or <tt>extern_weak</tt>.</p>
+<p>For example, since the "<tt>.LC0</tt>" variable is defined to be internal, if
+ another module defined a "<tt>.LC0</tt>" variable and was linked with this
+ one, one of the two would be renamed, preventing a collision. Since
+ "<tt>main</tt>" and "<tt>puts</tt>" are external (i.e., lacking any linkage
+ declarations), they are accessible outside of the current module.</p>
+
+<p>It is illegal for a function <i>declaration</i> to have any linkage type
+ other than "externally visible", <tt>dllimport</tt>
+ or <tt>extern_weak</tt>.</p>
+
<p>Aliases can have only <tt>external</tt>, <tt>internal</tt>, <tt>weak</tt>
-or <tt>weak_odr</tt> linkages.</p>
+ or <tt>weak_odr</tt> linkages.</p>
+
</div>
<!-- ======================================================================= -->
@@ -651,55 +638,52 @@ or <tt>weak_odr</tt> linkages.</p>
<div class="doc_text">
<p>LLVM <a href="#functionstructure">functions</a>, <a href="#i_call">calls</a>
-and <a href="#i_invoke">invokes</a> can all have an optional calling convention
-specified for the call. The calling convention of any pair of dynamic
-caller/callee must match, or the behavior of the program is undefined. The
-following calling conventions are supported by LLVM, and more may be added in
-the future:</p>
+ and <a href="#i_invoke">invokes</a> can all have an optional calling
+ convention specified for the call. The calling convention of any pair of
+ dynamic caller/callee must match, or the behavior of the program is
+ undefined. The following calling conventions are supported by LLVM, and more
+ may be added in the future:</p>
<dl>
<dt><b>"<tt>ccc</tt>" - The C calling convention</b>:</dt>
<dd>This calling convention (the default if no other calling convention is
- specified) matches the target C calling conventions. This calling convention
- supports varargs function calls and tolerates some mismatch in the declared
- prototype and implemented declaration of the function (as does normal C).
- </dd>
+ specified) matches the target C calling conventions. This calling
+ convention supports varargs function calls and tolerates some mismatch in
+ the declared prototype and implemented declaration of the function (as
+ does normal C).</dd>
<dt><b>"<tt>fastcc</tt>" - The fast calling convention</b>:</dt>
<dd>This calling convention attempts to make calls as fast as possible
- (e.g. by passing things in registers). This calling convention allows the
- target to use whatever tricks it wants to produce fast code for the target,
- without having to conform to an externally specified ABI (Application Binary
- Interface). Implementations of this convention should allow arbitrary
- <a href="CodeGenerator.html#tailcallopt">tail call optimization</a> to be
- supported. This calling convention does not support varargs and requires the
- prototype of all callees to exactly match the prototype of the function
- definition.
- </dd>
+ (e.g. by passing things in registers). This calling convention allows the
+ target to use whatever tricks it wants to produce fast code for the
+ target, without having to conform to an externally specified ABI
+ (Application Binary Interface). Implementations of this convention should
+ allow arbitrary <a href="CodeGenerator.html#tailcallopt">tail call
+ optimization</a> to be supported. This calling convention does not
+ support varargs and requires the prototype of all callees to exactly match
+ the prototype of the function definition.</dd>
<dt><b>"<tt>coldcc</tt>" - The cold calling convention</b>:</dt>
<dd>This calling convention attempts to make code in the caller as efficient
- as possible under the assumption that the call is not commonly executed. As
- such, these calls often preserve all registers so that the call does not break
- any live ranges in the caller side. This calling convention does not support
- varargs and requires the prototype of all callees to exactly match the
- prototype of the function definition.
- </dd>
+ as possible under the assumption that the call is not commonly executed.
+ As such, these calls often preserve all registers so that the call does
+ not break any live ranges in the caller side. This calling convention
+ does not support varargs and requires the prototype of all callees to
+ exactly match the prototype of the function definition.</dd>
<dt><b>"<tt>cc &lt;<em>n</em>&gt;</tt>" - Numbered convention</b>:</dt>
<dd>Any calling convention may be specified by number, allowing
- target-specific calling conventions to be used. Target specific calling
- conventions start at 64.
- </dd>
+ target-specific calling conventions to be used. Target specific calling
+ conventions start at 64.</dd>
</dl>
<p>More calling conventions can be added/defined on an as-needed basis, to
-support pascal conventions or any other well-known target-independent
-convention.</p>
+ support Pascal conventions or any other well-known target-independent
+ convention.</p>
</div>
@@ -710,37 +694,32 @@ convention.</p>
<div class="doc_text">
-<p>
-All Global Variables and Functions have one of the following visibility styles:
-</p>
+<p>All Global Variables and Functions have one of the following visibility
+ styles:</p>
<dl>
<dt><b>"<tt>default</tt>" - Default style</b>:</dt>
<dd>On targets that use the ELF object file format, default visibility means
- that the declaration is visible to other
- modules and, in shared libraries, means that the declared entity may be
- overridden. On Darwin, default visibility means that the declaration is
- visible to other modules. Default visibility corresponds to "external
- linkage" in the language.
- </dd>
+ that the declaration is visible to other modules and, in shared libraries,
+ means that the declared entity may be overridden. On Darwin, default
+ visibility means that the declaration is visible to other modules. Default
+ visibility corresponds to "external linkage" in the language.</dd>
<dt><b>"<tt>hidden</tt>" - Hidden style</b>:</dt>
<dd>Two declarations of an object with hidden visibility refer to the same
- object if they are in the same shared object. Usually, hidden visibility
- indicates that the symbol will not be placed into the dynamic symbol table,
- so no other module (executable or shared library) can reference it
- directly.
- </dd>
+ object if they are in the same shared object. Usually, hidden visibility
+ indicates that the symbol will not be placed into the dynamic symbol
+ table, so no other module (executable or shared library) can reference it
+ directly.</dd>
<dt><b>"<tt>protected</tt>" - Protected style</b>:</dt>
<dd>On ELF, protected visibility indicates that the symbol will be placed in
- the dynamic symbol table, but that references within the defining module will
- bind to the local symbol. That is, the symbol cannot be overridden by another
- module.
- </dd>
+ the dynamic symbol table, but that references within the defining module
+ will bind to the local symbol. That is, the symbol cannot be overridden by
+ another module.</dd>
</dl>
</div>
@@ -753,9 +732,8 @@ All Global Variables and Functions have one of the following visibility styles:
<div class="doc_text">
<p>LLVM IR allows you to specify name aliases for certain types. This can make
-it easier to read the IR and make the IR more condensed (particularly when
-recursive types are involved). An example of a name specification is:
-</p>
+ it easier to read the IR and make the IR more condensed (particularly when
+ recursive types are involved). An example of a name specification is:</p>
<div class="doc_code">
<pre>
@@ -763,19 +741,19 @@ recursive types are involved). An example of a name specification is:
</pre>
</div>
-<p>You may give a name to any <a href="#typesystem">type</a> except "<a
-href="t_void">void</a>". Type name aliases may be used anywhere a type is
-expected with the syntax "%mytype".</p>
+<p>You may give a name to any <a href="#typesystem">type</a> except
+ "<a href="t_void">void</a>". Type name aliases may be used anywhere a type
+ is expected with the syntax "%mytype".</p>
<p>Note that type names are aliases for the structural type that they indicate,
-and that you can therefore specify multiple names for the same type. This often
-leads to confusing behavior when dumping out a .ll file. Since LLVM IR uses
-structural typing, the name is not part of the type. When printing out LLVM IR,
-the printer will pick <em>one name</em> to render all types of a particular
-shape. This means that if you have code where two different source types end up
-having the same LLVM type, that the dumper will sometimes print the "wrong" or
-unexpected type. This is an important design point and isn't going to
-change.</p>
+ and that you can therefore specify multiple names for the same type. This
+ often leads to confusing behavior when dumping out a .ll file. Since LLVM IR
+ uses structural typing, the name is not part of the type. When printing out
+ LLVM IR, the printer will pick <em>one name</em> to render all types of a
+ particular shape. This means that if you have code where two different
+ source types end up having the same LLVM type, that the dumper will sometimes
+ print the "wrong" or unexpected type. This is an important design point and
+ isn't going to change.</p>
</div>
@@ -787,48 +765,47 @@ change.</p>
<div class="doc_text">
<p>Global variables define regions of memory allocated at compilation time
-instead of run-time. Global variables may optionally be initialized, may have
-an explicit section to be placed in, and may have an optional explicit alignment
-specified. A variable may be defined as "thread_local", which means that it
-will not be shared by threads (each thread will have a separated copy of the
-variable). A variable may be defined as a global "constant," which indicates
-that the contents of the variable will <b>never</b> be modified (enabling better
-optimization, allowing the global data to be placed in the read-only section of
-an executable, etc). Note that variables that need runtime initialization
-cannot be marked "constant" as there is a store to the variable.</p>
-
-<p>
-LLVM explicitly allows <em>declarations</em> of global variables to be marked
-constant, even if the final definition of the global is not. This capability
-can be used to enable slightly better optimization of the program, but requires
-the language definition to guarantee that optimizations based on the
-'constantness' are valid for the translation units that do not include the
-definition.
-</p>
-
-<p>As SSA values, global variables define pointer values that are in
-scope (i.e. they dominate) all basic blocks in the program. Global
-variables always define a pointer to their "content" type because they
-describe a region of memory, and all memory objects in LLVM are
-accessed through pointers.</p>
-
-<p>A global variable may be declared to reside in a target-specific numbered
-address space. For targets that support them, address spaces may affect how
-optimizations are performed and/or what target instructions are used to access
-the variable. The default address space is zero. The address space qualifier
-must precede any other attributes.</p>
+ instead of run-time. Global variables may optionally be initialized, may
+ have an explicit section to be placed in, and may have an optional explicit
+ alignment specified. A variable may be defined as "thread_local", which
+ means that it will not be shared by threads (each thread will have a
+ separated copy of the variable). A variable may be defined as a global
+ "constant," which indicates that the contents of the variable
+ will <b>never</b> be modified (enabling better optimization, allowing the
+ global data to be placed in the read-only section of an executable, etc).
+ Note that variables that need runtime initialization cannot be marked
+ "constant" as there is a store to the variable.</p>
+
+<p>LLVM explicitly allows <em>declarations</em> of global variables to be marked
+ constant, even if the final definition of the global is not. This capability
+ can be used to enable slightly better optimization of the program, but
+ requires the language definition to guarantee that optimizations based on the
+ 'constantness' are valid for the translation units that do not include the
+ definition.</p>
+
+<p>As SSA values, global variables define pointer values that are in scope
+ (i.e. they dominate) all basic blocks in the program. Global variables
+ always define a pointer to their "content" type because they describe a
+ region of memory, and all memory objects in LLVM are accessed through
+ pointers.</p>
+
+<p>A global variable may be declared to reside in a target-specific numbered
+ address space. For targets that support them, address spaces may affect how
+ optimizations are performed and/or what target instructions are used to
+ access the variable. The default address space is zero. The address space
+ qualifier must precede any other attributes.</p>
<p>LLVM allows an explicit section to be specified for globals. If the target
-supports it, it will emit globals to the section specified.</p>
+ supports it, it will emit globals to the section specified.</p>
<p>An explicit alignment may be specified for a global. If not present, or if
-the alignment is set to zero, the alignment of the global is set by the target
-to whatever it feels convenient. If an explicit alignment is specified, the
-global is forced to have at least that much alignment. All alignments must be