summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2011-10-27 19:19:07 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2011-10-27 19:19:07 +0000
commit249d953ed7b850446fdfc600992ffb221da2f9d3 (patch)
treefc80fa69369a683449554351b470f6c5aca5ef92 /docs
parent32a43cc0fc3cd42702d7859eaa58dd42f561a54d (diff)
downloadllvm-249d953ed7b850446fdfc600992ffb221da2f9d3.tar.gz
llvm-249d953ed7b850446fdfc600992ffb221da2f9d3.tar.bz2
llvm-249d953ed7b850446fdfc600992ffb221da2f9d3.tar.xz
Document tbaa metadata in LangRef (documentation largely based on
comments at top of TypeBasedAliasAnalysis.cpp). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@143134 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'docs')
-rw-r--r--docs/GetElementPtr.html8
-rw-r--r--docs/LangRef.html53
2 files changed, 56 insertions, 5 deletions
diff --git a/docs/GetElementPtr.html b/docs/GetElementPtr.html
index 2c32a9ea7c..6297aa7de7 100644
--- a/docs/GetElementPtr.html
+++ b/docs/GetElementPtr.html
@@ -594,10 +594,10 @@ idx3 = (char*) &amp;MyVar + 8
because LLVM has no restrictions on mixing types in addressing, loads or
stores.</p>
- <p>It would be possible to add special annotations to the IR, probably using
- metadata, to describe a different type system (such as the C type system),
- and do type-based aliasing on top of that. This is a much bigger
- undertaking though.</p>
+ <p>LLVM's type-based alias analysis pass uses metadata to describe a different
+ type system (such as the C type system), and performs type-based aliasing
+ on top of that. Further details are in the
+ <a href="LangRef.html#tbaa">language reference</a>.</p>
</div>
diff --git a/docs/LangRef.html b/docs/LangRef.html
index f937ae6ef9..8dca415172 100644
--- a/docs/LangRef.html
+++ b/docs/LangRef.html
@@ -100,7 +100,11 @@
<li><a href="#othervalues">Other Values</a>
<ol>
<li><a href="#inlineasm">Inline Assembler Expressions</a></li>
- <li><a href="#metadata">Metadata Nodes and Metadata Strings</a></li>
+ <li><a href="#metadata">Metadata Nodes and Metadata Strings</a>
+ <ol>
+ <li><a href="#tbaa">'<tt>tbaa</tt>' Metadata</a></li>
+ </ol>
+ </li>
</ol>
</li>
<li><a href="#intrinsic_globals">Intrinsic Global Variables</a>
@@ -2915,6 +2919,53 @@ call void @llvm.dbg.value(metadata !24, i64 0, metadata !25)
</pre>
</div>
+<p>More information about specific metadata nodes recognized by the optimizers
+ and code generator is found below.</p>
+
+<h4>
+ <a name="tbaa">'<tt>tbaa</tt>' Metadata</a>
+</h4>
+
+<div>
+
+<p>In LLVM IR, memory does not have types, so LLVM's own type system is not
+ suitable for doing TBAA. Instead, metadata is added to the IR to describe
+ a type system of a higher level language. This can be used to implement
+ typical C/C++ TBAA, but it can also be used to implement custom alias
+ analysis behavior for other languages.</p>
+
+<p>The current metadata format is very simple. TBAA metadata nodes have up to
+ three fields, e.g.:</p>
+
+<div class="doc_code">
+<pre>
+!0 = metadata !{ metadata !"an example type tree" }
+!1 = metadata !{ metadata !"int", metadata !0 }
+!2 = metadata !{ metadata !"float", metadata !0 }
+!3 = metadata !{ metadata !"const float", metadata !2, i64 1 }
+</pre>
+</div>
+
+<p>The first field is an identity field. It can be any value, usually
+ a metadata string, which uniquely identifies the type. The most important
+ name in the tree is the name of the root node. Two trees with
+ different root node names are entirely disjoint, even if they
+ have leaves with common names.</p>
+
+<p>The second field identifies the type's parent node in the tree, or
+ is null or omitted for a root node. A type is considered to alias
+ all of its descendants and all of its ancestors in the tree. Also,
+ a type is considered to alias all types in other trees, so that
+ bitcode produced from multiple front-ends is handled conservatively.</p>
+
+<p>If the third field is present, it's an integer which if equal to 1
+ indicates that the type is "constant" (meaning
+ <tt>pointsToConstantMemory</tt> should return true; see
+ <a href="AliasAnalysis.html#OtherItfs">other useful
+ <tt>AliasAnalysis</tt> methods</a>).</p>
+
+</div>
+
</div>
</div>