From 273a92eb0a88f77d3147d53b3d490d423751fb42 Mon Sep 17 00:00:00 2001 From: Dan Gohman <gohman@apple.com> Date: Fri, 21 Sep 2012 18:21:48 +0000 Subject: [PATCH] Document the new !tbaa.struct metadata. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164398 91177308-0d34-0410-b5e6-96231b3b80d8 --- docs/LangRef.html | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/docs/LangRef.html b/docs/LangRef.html index 4daab592e9d..1fea29950b8 100644 --- a/docs/LangRef.html +++ b/docs/LangRef.html @@ -103,6 +103,7 @@ <li><a href="#metadata">Metadata Nodes and Metadata Strings</a> <ol> <li><a href="#tbaa">'<tt>tbaa</tt>' Metadata</a></li> + <li><a href="#tbaa.struct">'<tt>tbaa.struct</tt>' Metadata</a></li> <li><a href="#fpmath">'<tt>fpmath</tt>' Metadata</a></li> <li><a href="#range">'<tt>range</tt>' Metadata</a></li> </ol> @@ -3050,6 +3051,44 @@ call void @llvm.dbg.value(metadata !24, i64 0, metadata !25) </div> +<!-- _______________________________________________________________________ --> +<h4> + <a name="tbaa.struct">'<tt>tbaa.struct</tt>' Metadata</a> +</h4> + +<div> + +<p>The <a href="#int_memcpy"><tt>llvm.memcpy</tt></a> is often used to implement +aggregate assignment operations in C and similar languages, however it is +defined to copy a contiguous region of memory, which is more than strictly +necessary for aggregate types which contain holes due to padding. Also, it +doesn't contain any TBAA information about the fields of the aggregate.</p> + +<p><tt>!tbaa.struct</tt> metadata can describe which memory subregions in a memcpy +are padding and what the TBAA tags of the struct are.</p> + +<p>The current metadata format is very simple. <tt>!tbaa.struct</tt> metadata nodes + are a list of operands which are in conceptual groups of three. For each + group of three, the first operand gives the byte offset of a field in address + units, the second gives its size in address units, and the third gives its + tbaa tag. e.g.:</p> + +<div class="doc_code"> +<pre> +!4 = metadata !{ i64 0, i64 4, metadata !1, i64 8, i64 4, metadata !2 } +</pre> +</div> + +<p>This describes a struct with two fields. The first is at offset 0 address units + with size 4 address units, and has tbaa tag !1. The second is at offset 8 address + units and has size 4 address units and has tbaa tag !2.</p> + +<p>Note that the fields need not be contiguous. In this example, there is a + 4 byte gap between the two fields. This gap represents padding which + does not carry useful data and need not be preserved.</p> + +</div> + <!-- _______________________________________________________________________ --> <h4> <a name="fpmath">'<tt>fpmath</tt>' Metadata</a>