Describe the recent changes to the bytecode format for PR761.
[oota-llvm.git] / docs / BytecodeFormat.html
index 8f7ec511d612eb4a47d11d8cca29a59477f23dc6..1b508e62406d02b280618b23e32098e24a40dc86 100644 (file)
@@ -700,56 +700,23 @@ sections.</p>
 <!-- _______________________________________________________________________ -->
 <div class="doc_subsubsection"><a name="format">Format Information</a></div>
 <div class="doc_text">
-<p>The format information field is encoded into a <a href="#uint32_vbr">uint32_vbr</a>
-as shown in the following table.</p>
-<table>
-  <tbody>
-    <tr>
-      <th><b>Type</b></th>
-      <th class="td_left"><b>Description</b></th>
-    </tr>
-    <tr>
-      <td><a href="#bit">bit(0)</a></td>
-      <td class="td_left">Target is big endian?</td>
-    </tr>
-    <tr>
-      <td><a href="#bit">bit(1)</a></td>
-      <td class="td_left">On target pointers are 64-bit?</td>
-    </tr>
-    <tr>
-      <td><a href="#bit">bit(2)</a></td>
-      <td class="td_left">Target has no endianess?</td>
-    </tr>
-    <tr>
-      <td><a href="#bit">bit(3)</a></td>
-      <td class="td_left">Target has no pointer size?</td>
-    </tr>
-    <tr>
-      <td><a href="#bit">bit(4-31)</a></td>
-      <td class="td_left">Bytecode format version</td>
-    </tr>
-  </tbody>
-</table>
-<p>
-Of particular note, the bytecode format number is simply a 28-bit
+<p>The format information field is encoded into a <a href="#uint32_vbr">uint32_vbr</a>.</p>
+
+<p>Of particular note, the bytecode format number is simply a 32-bit
 monotonically increasing integer that identifies the version of the bytecode
 format (which is not directly related to the LLVM release number). The
 bytecode versions defined so far are (note that this document only
-describes the latest version, 1.3):</p>
+describes the latest version, 2.0):</p>
 <ul>
   <li>#0: LLVM 1.0 &amp; 1.1</li>
   <li>#1: LLVM 1.2</li>
   <li>#2: LLVM 1.2.5 (not released)</li>
   <li>#3: LLVM 1.3</li>
   <li>#4: LLVM 1.3.x (not released)</li>
-  <li>#5: LLVM 1.4, 1.5, 1.6</li>
-  </li>
+  <li>#5: LLVM 1.4 through 1.8</li>
+  <li>#6: LLVM 1.9</li>
+  <li>#7: LLVM 2.0 and newer</li>
 </ul>
-<p>Note that we plan to eventually expand the target description
-capabilities
-of bytecode files to <a href="http://llvm.org/PR263">target
-triples</a>.
-</p>
 </div>
 <!-- _______________________________________________________________________ -->
 <div class="doc_subsection"><a name="globaltypes">Global Type Pool</a> </div>
@@ -939,6 +906,23 @@ missing otherwise.</td>
     </tr>
   </tbody>
 </table>
+<h3>Packed Structure Types</h3>
+<table>
+  <tbody>
+    <tr>
+      <th><b>Type</b></th>
+      <th class="td_left"><b>Description</b></th>
+    </tr>
+    <tr>
+      <td><a href="#uint24_vbr">uint24_vbr</a></td>
+      <td class="td_left">Type ID for packed structure types (19)</td>
+    </tr>
+    <tr>
+      <td><a href="#zlist">zlist</a>(<a href="#uint24_vbr">uint24_vbr</a>)</td>
+      <td class="td_left">Slot number of each of the element's fields.</td>
+    </tr>
+  </tbody>
+</table>
 </div>
 <!-- _______________________________________________________________________ -->
 <div class="doc_subsection"><a name="globalinfo">Module Global Info</a>
@@ -977,7 +961,12 @@ depends upon.</td>
       <td><a href="#string">string</a></td>
       <td class="td_left">The target
 triple for the module (blank means no target triple specified, i.e. a
-platform independent module).</td>
+platform-independent module).</td>
+    </tr>
+    <tr>
+         <td><a href="#string">string</a></td>
+         <td class="td_left">The data layout string describing the endianness, pointer size, and
+type alignments for which the module was written (blank means no data layout specified, i.e. a platform-independent module).</td>
     </tr>
     <tr>
       <td><a href="#llist">llist</a>(<a href="#string">string</a>)</td>
@@ -1025,7 +1014,8 @@ follows. </td>
     <tr>
       <td><a href="#bit">bit(2-4)</a></td>
       <td class="td_left">Linkage type: 0=External, 1=Weak,
-2=Appending, 3=Internal, 4=LinkOnce</td>
+        2=Appending, 3=Internal, 4=LinkOnce, 5=DllImport, 
+        6=DllExport, 7=ExternWeak</td>
     </tr>
     <tr>
       <td><a href="#bit">bit(5-31)</a></td>
@@ -1064,7 +1054,11 @@ and can includes more information:</p>
       <td class="td_left">If this bit is set, a SectionID follows this vbr.</td>
     </tr>
     <tr>
-      <td><a href="#bit">bit(10-31)</a></td>
+      <td><a href="#bit">bit(10-12)</a></td>
+      <td class="td_left">Visibility style: 0=Default, 1=Hidden.</td>
+    </tr>
+    <tr>
+      <td><a href="#bit">bit(13-31)</a></td>
       <td class="td_left">Currently unassigned.</td>
     </tr>
   </tbody>
@@ -1136,13 +1130,16 @@ href="#uint32_vbr">uint32_vbr</a> that describes the function.</p>
       <td><a href="#bit">bit(4)</a></td>
       <td class="td_left">If this bit is set to 1, the indicated function is
       external, and there is no <a href="#functiondefs">Function Definiton
-      Block</a> in the bytecode file for the function.</td>
+      Block</a> in the bytecode file for the function. If the function is
+      external and has <tt>dllimport or extern_weak</tt> linkage additional
+      field in the extension word is used to indicate the actual linkage
+      type.</td>
     </tr>
     <tr>
       <td><a href="#bit">bit(5-30)</a></td>
       <td class="td_left">Type slot number of type for the function.</td>
     </tr>
-    <tr>
+                                      <tr>
       <td><a href="#bit">bit(31)</a></td>
       <td class="td_left">Indicates whether an extension word follows.</td>
     </tr>
@@ -1171,7 +1168,12 @@ follows with the following fields:</p>
       <td class="td_left">If this bit is set, a SectionID follows this vbr.</td>
     </tr>
     <tr>
-      <td><a href="#bit">bit(11-31)</a></td>
+      <td><a href="#bit">bit(11-12)</a></td>
+      <td class="td_left">Linkage type for external functions. 0 - External
+        linkage, 1 - DLLImport linkage, 2 - External weak linkage.</td>
+    </tr>
+    <tr>
+      <td><a href="#bit">bit(13-31)</a></td>
       <td class="td_left">Currently unassigned.</td>
     </tr>
   </tbody>
@@ -1311,7 +1313,7 @@ field values of the structure.</li>
 </div>
 
 <!-- _______________________________________________________________________ -->
-<div class="doc_subsubsection">Undef Entries</a></div>
+<div class="doc_subsubsection">Undef Entries</div>
 
 <div class="doc_text">
 <p>When the number of operands to the constant is one, we have an 'undef' value
@@ -1319,7 +1321,7 @@ of the specified type.</p>
 </div>
 
 <!-- _______________________________________________________________________ -->
-<div class="doc_subsubsection">Inline Assembler Entries</a></div>
+<div class="doc_subsubsection">Inline Assembler Entries</div>
 
 <div class="doc_text">
 <p>Inline Assembler entries are stored in the constant pool, though they are not
@@ -1343,7 +1345,7 @@ of the specified type.</p>
     </tr>
     <tr>
       <td><a href="#uint32_vbr">uint32_vbr</a></td>
-      <td class="td_left">Flags</sup></td>
+      <td class="td_left">Flags</td>
     </tr>
   </tbody>
 </table>
@@ -1354,7 +1356,7 @@ of the specified type.</p>
 </div>
 
 <!-- _______________________________________________________________________ -->
-<div class="doc_subsubsection">Constant Expression Entries</a></div>
+<div class="doc_subsubsection">Constant Expression Entries</div>
 
 <div class="doc_text">
 
@@ -1410,8 +1412,8 @@ size<br>
     </tr>
     <tr>
       <td><a href="#uint32_vbr">uint32_vbr</a></td>
-      <td class="td_left">The linkage type of the function: 0=External,
-1=Weak, 2=Appending, 3=Internal, 4=LinkOnce<sup>1</sup></td>
+      <td class="td_left"><a href="#funclinkage_and_visibility">The linkage and
+      visibility</a> style field</td>
     </tr>
     <tr>
       <td><a href="#block">block</a></td>
@@ -1444,7 +1446,38 @@ other fields will be present as the function is defined elsewhere.</li>
 be written. Compaction tables are only written if they will actually
 save bytecode space. If not, then a regular constant pool is written.</li>
 </ol>
+
+<!-- _______________________________________________________________________ -->
+<div class="doc_subsubsection"><a name="funclinkage_and_visibility">Linkage and
+    visibility word</a>
+</div>
+<div class="doc_text">
+
+<table>
+  <tbody>
+    <tr>
+      <th><b>Type</b></th>
+      <th class="td_left"><b>Field Description</b></th>
+    </tr>
+    <tr>
+      <td><a href="#bit">bit(0-15)</a></td>
+      <td class="td_left">The linkage type of the function: 0=External, 1=Weak,
+2=Appending, 3=Internal, 4=LinkOnce, 5=DllImport, 6=DllExport<sup>1</sup></td>
+    </tr>
+    <tr>
+      <td><a href="#bit">bit(16-18)</a></td>
+      <td class="td_left">Visibility style: 0=Default, 1=Hidden.</td>
+    </tr>
+    <tr>
+      <td><a href="#bit">bit(19-31)</a></td>
+      <td class="td_left>Currently unassigned.</td>
+    </tr>
+  </tbody>
+</table>
+
 </div>
+</div>
+
 <!-- _______________________________________________________________________ -->
 <div class="doc_subsection"><a name="compactiontable">Compaction Table</a>
 </div>
@@ -1578,35 +1611,44 @@ possible. </p>
       <tr><td>Add</td><td>7</td><td>1</td><td>1.0</td></tr>
       <tr><td>Sub</td><td>8</td><td>1</td><td>1.0</td></tr>
       <tr><td>Mul</td><td>9</td><td>1</td><td>1.0</td></tr>
-      <tr><td>Div</td><td>10</td><td>1</td><td>1.0</td></tr>
-      <tr><td>Rem</td><td>11</td><td>1</td><td>1.0</td></tr>
+      <tr><td>UDiv</td><td>10</td><td>1</td><td>1.9</td></tr>
+      <tr><td>SDiv</td><td>11</td><td>1</td><td>1.9</td></tr>
+      <tr><td>FDiv</td><td>12</td><td>1</td><td>1.9</td></tr>
+      <tr><td>URem</td><td>13</td><td>1</td><td>1.9</td></tr>
+      <tr><td>SRem</td><td>14</td><td>1</td><td>1.9</td></tr>
+      <tr><td>FRem</td><td>15</td><td>1</td><td>1.9</td></tr>
       <tr><td colspan="4"><b>Logical Operators</b></td></tr>
-      <tr><td>And</td><td>12</td><td>1</td><td>1.0</td></tr>
-      <tr><td>Or</td><td>13</td><td>1</td><td>1.0</td></tr>
-      <tr><td>Xor</td><td>14</td><td>1</td><td>1.0</td></tr>
+      <tr><td>And</td><td>16</td><td>1</td><td>1.0</td></tr>
+      <tr><td>Or</td><td>17</td><td>1</td><td>1.0</td></tr>
+      <tr><td>Xor</td><td>18</td><td>1</td><td>1.0</td></tr>
       <tr><td colspan="4"><b>Binary Comparison Operators</b></td></tr>
-      <tr><td>SetEQ</td><td>15</td><td>1</td><td>1.0</td></tr>
-      <tr><td>SetNE</td><td>16</td><td>1</td><td>1.0</td></tr>
-      <tr><td>SetLE</td><td>17</td><td>1</td><td>1.0</td></tr>
-      <tr><td>SetGE</td><td>18</td><td>1</td><td>1.0</td></tr>
-      <tr><td>SetLT</td><td>19</td><td>1</td><td>1.0</td></tr>
-      <tr><td>SetGT</td><td>20</td><td>1</td><td>1.0</td></tr>
+      <tr><td>SetEQ</td><td>19</td><td>1</td><td>1.0</td></tr>
+      <tr><td>SetNE</td><td>20</td><td>1</td><td>1.0</td></tr>
+      <tr><td>SetLE</td><td>21</td><td>1</td><td>1.0</td></tr>
+      <tr><td>SetGE</td><td>22</td><td>1</td><td>1.0</td></tr>
+      <tr><td>SetLT</td><td>23</td><td>1</td><td>1.0</td></tr>
+      <tr><td>SetGT</td><td>24</td><td>1</td><td>1.0</td></tr>
       <tr><td colspan="4"><b>Memory Operators</b></td></tr>
-      <tr><td>Malloc</td><td>21</td><td>1</td><td>1.0</td></tr>
-      <tr><td>Free</td><td>22</td><td>1</td><td>1.0</td></tr>
-      <tr><td>Alloca</td><td>23</td><td>1</td><td>1.0</td></tr>
-      <tr><td>Load</td><td>24</td><td>1</td><td>1.0</td></tr>
-      <tr><td>Store</td><td>25</td><td>1</td><td>1.0</td></tr>
-      <tr><td>GetElementPtr</td><td>26</td><td>1</td><td>1.0</td></tr>
+      <tr><td>Malloc</td><td>25</td><td>1</td><td>1.0</td></tr>
+      <tr><td>Free</td><td>26</td><td>1</td><td>1.0</td></tr>
+      <tr><td>Alloca</td><td>27</td><td>1</td><td>1.0</td></tr>
+      <tr><td>Load</td><td>28</td><td>1</td><td>1.0</td></tr>
+      <tr><td>Store</td><td>29</td><td>1</td><td>1.0</td></tr>
+      <tr><td>GetElementPtr</td><td>30</td><td>1</td><td>1.0</td></tr>
       <tr><td colspan="4"><b>Other Operators</b></td></tr>
-      <tr><td>PHI</td><td>27</td><td>1</td><td>1.0</td></tr>
-      <tr><td>Cast</td><td>28</td><td>1</td><td>1.0</td></tr>
-      <tr><td>Call</td><td>29</td><td>1</td><td>1.0</td></tr>
-      <tr><td>Shl</td><td>30</td><td>1</td><td>1.0</td></tr>
-      <tr><td>Shr</td><td>31</td><td>1</td><td>1.0</td></tr>
-      <tr><td>VANext</td><td>32</td><td>1</td><td>1.0</td></tr>
-      <tr><td>VAArg</td><td>33</td><td>1</td><td>1.0</td></tr>
-      <tr><td>Select</td><td>34</td><td>2</td><td>1.2</td></tr>
+      <tr><td>PHI</td><td>31</td><td>1</td><td>1.0</td></tr>
+      <tr><td>Cast</td><td>32</td><td>1</td><td>1.0</td></tr>
+      <tr><td>Call</td><td>33</td><td>1</td><td>1.0</td></tr>
+      <tr><td>Shl</td><td>34</td><td>1</td><td>1.0</td></tr>
+      <tr><td>LShr</td><td>35</td><td>6</td><td>2.0</td></tr>
+      <tr><td>AShr</td><td>36</td><td>6</td><td>2.0</td></tr>
+      <tr><td>Select</td><td>37</td><td>2</td><td>1.2</td></tr>
+      <tr><td>UserOp1</td><td>38</td><td>1</td><td>1.0</td></tr>
+      <tr><td>UserOp2</td><td>39</td><td>1</td><td>1.0</td></tr>
+      <tr><td>VAArg</td><td>40</td><td>5</td><td>1.5</td></tr>
+      <tr><td>ExtractElement</td><td>41</td><td>5</td><td>1.5</td></tr>
+      <tr><td>InsertElement</td><td>42</td><td>5</td><td>1.5</td></tr>
+      <tr><td>ShuffleElement</td><td>43</td><td>5</td><td>1.5</td></tr>
       <tr><td colspan="4">
           <b>Pseudo Instructions<a href="#pi_note">*</a></b>
       </td></tr>