Home | History | Annotate | Download | only in docs
      1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
      2                       "http://www.w3.org/TR/html4/strict.dtd">
      3 <html>
      4 <head>
      5   <title>Extending LLVM: Adding instructions, intrinsics, types, etc.</title>
      6   <link rel="stylesheet" href="llvm.css" type="text/css">
      7 </head>
      8 
      9 <body>
     10 
     11 <h1>
     12   Extending LLVM: Adding instructions, intrinsics, types, etc.
     13 </h1>
     14 
     15 <ol>
     16   <li><a href="#introduction">Introduction and Warning</a></li>
     17   <li><a href="#intrinsic">Adding a new intrinsic function</a></li>
     18   <li><a href="#instruction">Adding a new instruction</a></li>
     19   <li><a href="#sdnode">Adding a new SelectionDAG node</a></li>
     20   <li><a href="#type">Adding a new type</a>
     21   <ol>
     22     <li><a href="#fund_type">Adding a new fundamental type</a></li>
     23     <li><a href="#derived_type">Adding a new derived type</a></li>
     24   </ol></li>
     25 </ol>
     26 
     27 <div class="doc_author">    
     28   <p>Written by <a href="http://misha.brukman.net">Misha Brukman</a>,
     29   Brad Jones, Nate Begeman,
     30   and <a href="http://nondot.org/sabre">Chris Lattner</a></p>
     31 </div>
     32 
     33 <!-- *********************************************************************** -->
     34 <h2>
     35   <a name="introduction">Introduction and Warning</a>
     36 </h2>
     37 <!-- *********************************************************************** -->
     38 
     39 <div>
     40 
     41 <p>During the course of using LLVM, you may wish to customize it for your
     42 research project or for experimentation. At this point, you may realize that
     43 you need to add something to LLVM, whether it be a new fundamental type, a new
     44 intrinsic function, or a whole new instruction.</p>
     45 
     46 <p>When you come to this realization, stop and think. Do you really need to
     47 extend LLVM? Is it a new fundamental capability that LLVM does not support at
     48 its current incarnation or can it be synthesized from already pre-existing LLVM
     49 elements? If you are not sure, ask on the <a
     50 href="http://mail.cs.uiuc.edu/mailman/listinfo/llvmdev">LLVM-dev</a> list. The
     51 reason is that extending LLVM will get involved as you need to update all the
     52 different passes that you intend to use with your extension, and there are
     53 <em>many</em> LLVM analyses and transformations, so it may be quite a bit of
     54 work.</p>
     55 
     56 <p>Adding an <a href="#intrinsic">intrinsic function</a> is far easier than
     57 adding an instruction, and is transparent to optimization passes.  If your added
     58 functionality can be expressed as a
     59 function call, an intrinsic function is the method of choice for LLVM
     60 extension.</p>
     61 
     62 <p>Before you invest a significant amount of effort into a non-trivial
     63 extension, <span class="doc_warning">ask on the list</span> if what you are
     64 looking to do can be done with already-existing infrastructure, or if maybe
     65 someone else is already working on it. You will save yourself a lot of time and
     66 effort by doing so.</p>
     67 
     68 </div>
     69 
     70 <!-- *********************************************************************** -->
     71 <h2>
     72   <a name="intrinsic">Adding a new intrinsic function</a>
     73 </h2>
     74 <!-- *********************************************************************** -->
     75 
     76 <div>
     77 
     78 <p>Adding a new intrinsic function to LLVM is much easier than adding a new
     79 instruction.  Almost all extensions to LLVM should start as an intrinsic
     80 function and then be turned into an instruction if warranted.</p>
     81 
     82 <ol>
     83 <li><tt>llvm/docs/LangRef.html</tt>:
     84     Document the intrinsic.  Decide whether it is code generator specific and
     85     what the restrictions are.  Talk to other people about it so that you are
     86     sure it's a good idea.</li>
     87 
     88 <li><tt>llvm/include/llvm/Intrinsics*.td</tt>:
     89     Add an entry for your intrinsic.  Describe its memory access characteristics
     90     for optimization (this controls whether it will be DCE'd, CSE'd, etc). Note
     91     that any intrinsic using the <tt>llvm_int_ty</tt> type for an argument will
     92     be deemed by <tt>tblgen</tt> as overloaded and the corresponding suffix 
     93     will be required on the intrinsic's name.</li>
     94 
     95 <li><tt>llvm/lib/Analysis/ConstantFolding.cpp</tt>: If it is possible to 
     96     constant fold your intrinsic, add support to it in the 
     97     <tt>canConstantFoldCallTo</tt> and <tt>ConstantFoldCall</tt> functions.</li>
     98 
     99 <li><tt>llvm/test/Regression/*</tt>: Add test cases for your test cases to the 
    100     test suite</li>
    101 </ol>
    102 
    103 <p>Once the intrinsic has been added to the system, you must add code generator
    104 support for it.  Generally you must do the following steps:</p>
    105 
    106 <dl>
    107 <dt>Add support to the C backend in <tt>lib/Target/CBackend/</tt></dt>
    108 
    109 <dd>Depending on the intrinsic, there are a few ways to implement this.  For
    110     most intrinsics, it makes sense to add code to lower your intrinsic in
    111     <tt>LowerIntrinsicCall</tt> in <tt>lib/CodeGen/IntrinsicLowering.cpp</tt>.
    112     Second, if it makes sense to lower the intrinsic to an expanded sequence of
    113     C code in all cases, just emit the expansion in <tt>visitCallInst</tt> in
    114     <tt>Writer.cpp</tt>.  If the intrinsic has some way to express it with GCC
    115     (or any other compiler) extensions, it can be conditionally supported based
    116     on the compiler compiling the CBE output (see <tt>llvm.prefetch</tt> for an
    117     example).  Third, if the intrinsic really has no way to be lowered, just
    118     have the code generator emit code that prints an error message and calls
    119     abort if executed.</dd>
    120 
    121 <dt>Add support to the .td file for the target(s) of your choice in 
    122    <tt>lib/Target/*/*.td</tt>.</dt>
    123 
    124 <dd>This is usually a matter of adding a pattern to the .td file that matches
    125     the intrinsic, though it may obviously require adding the instructions you
    126     want to generate as well.  There are lots of examples in the PowerPC and X86
    127     backend to follow.</dd>
    128 </dl>
    129 
    130 </div>
    131 
    132 <!-- *********************************************************************** -->
    133 <h2>
    134   <a name="sdnode">Adding a new SelectionDAG node</a>
    135 </h2>
    136 <!-- *********************************************************************** -->
    137 
    138 <div>
    139 
    140 <p>As with intrinsics, adding a new SelectionDAG node to LLVM is much easier
    141 than adding a new instruction.  New nodes are often added to help represent
    142 instructions common to many targets.  These nodes often map to an LLVM
    143 instruction (add, sub) or intrinsic (byteswap, population count).  In other
    144 cases, new nodes have been added to allow many targets to perform a common task
    145 (converting between floating point and integer representation) or capture more
    146 complicated behavior in a single node (rotate).</p>
    147 
    148 <ol>
    149 <li><tt>include/llvm/CodeGen/ISDOpcodes.h</tt>:
    150     Add an enum value for the new SelectionDAG node.</li>
    151 <li><tt>lib/CodeGen/SelectionDAG/SelectionDAG.cpp</tt>:
    152     Add code to print the node to <tt>getOperationName</tt>.  If your new node
    153     can be evaluated at compile time when given constant arguments (such as an
    154     add of a constant with another constant), find the <tt>getNode</tt> method
    155     that takes the appropriate number of arguments, and add a case for your node
    156     to the switch statement that performs constant folding for nodes that take
    157     the same number of arguments as your new node.</li>
    158 <li><tt>lib/CodeGen/SelectionDAG/LegalizeDAG.cpp</tt>:
    159     Add code to <a href="CodeGenerator.html#selectiondag_legalize">legalize, 
    160     promote, and expand</a> the node as necessary.  At a minimum, you will need
    161     to add a case statement for your node in <tt>LegalizeOp</tt> which calls
    162     LegalizeOp on the node's operands, and returns a new node if any of the
    163     operands changed as a result of being legalized.  It is likely that not all
    164     targets supported by the SelectionDAG framework will natively support the
    165     new node.  In this case, you must also add code in your node's case
    166     statement in <tt>LegalizeOp</tt> to Expand your node into simpler, legal
    167     operations.  The case for <tt>ISD::UREM</tt> for expanding a remainder into
    168     a divide, multiply, and a subtract is a good example.</li>
    169 <li><tt>lib/CodeGen/SelectionDAG/LegalizeDAG.cpp</tt>:
    170     If targets may support the new node being added only at certain sizes, you 
    171     will also need to add code to your node's case statement in 
    172     <tt>LegalizeOp</tt> to Promote your node's operands to a larger size, and 
    173     perform the correct operation.  You will also need to add code to 
    174     <tt>PromoteOp</tt> to do this as well.  For a good example, see 
    175     <tt>ISD::BSWAP</tt>,
    176     which promotes its operand to a wider size, performs the byteswap, and then
    177     shifts the correct bytes right to emulate the narrower byteswap in the
    178     wider type.</li>
    179 <li><tt>lib/CodeGen/SelectionDAG/LegalizeDAG.cpp</tt>:
    180     Add a case for your node in <tt>ExpandOp</tt> to teach the legalizer how to
    181     perform the action represented by the new node on a value that has been
    182     split into high and low halves.  This case will be used to support your 
    183     node with a 64 bit operand on a 32 bit target.</li>
    184 <li><tt>lib/CodeGen/SelectionDAG/DAGCombiner.cpp</tt>:
    185     If your node can be combined with itself, or other existing nodes in a 
    186     peephole-like fashion, add a visit function for it, and call that function
    187     from <tt></tt>.  There are several good examples for simple combines you
    188     can do; <tt>visitFABS</tt> and <tt>visitSRL</tt> are good starting places.
    189     </li>
    190 <li><tt>lib/Target/PowerPC/PPCISelLowering.cpp</tt>:
    191     Each target has an implementation of the <tt>TargetLowering</tt> class,
    192     usually in its own file (although some targets include it in the same
    193     file as the DAGToDAGISel).  The default behavior for a target is to
    194     assume that your new node is legal for all types that are legal for
    195     that target.  If this target does not natively support your node, then
    196     tell the target to either Promote it (if it is supported at a larger
    197     type) or Expand it.  This will cause the code you wrote in 
    198     <tt>LegalizeOp</tt> above to decompose your new node into other legal
    199     nodes for this target.</li>
    200 <li><tt>lib/Target/TargetSelectionDAG.td</tt>:
    201     Most current targets supported by LLVM generate code using the DAGToDAG
    202     method, where SelectionDAG nodes are pattern matched to target-specific
    203     nodes, which represent individual instructions.  In order for the targets
    204     to match an instruction to your new node, you must add a def for that node
    205     to the list in this file, with the appropriate type constraints. Look at
    206     <tt>add</tt>, <tt>bswap</tt>, and <tt>fadd</tt> for examples.</li>
    207 <li><tt>lib/Target/PowerPC/PPCInstrInfo.td</tt>:
    208     Each target has a tablegen file that describes the target's instruction
    209     set.  For targets that use the DAGToDAG instruction selection framework,
    210     add a pattern for your new node that uses one or more target nodes.
    211     Documentation for this is a bit sparse right now, but there are several
    212     decent examples.  See the patterns for <tt>rotl</tt> in 
    213     <tt>PPCInstrInfo.td</tt>.</li>
    214 <li>TODO: document complex patterns.</li>
    215 <li><tt>llvm/test/Regression/CodeGen/*</tt>: Add test cases for your new node
    216     to the test suite.  <tt>llvm/test/Regression/CodeGen/X86/bswap.ll</tt> is
    217     a good example.</li>
    218 </ol>
    219 
    220 </div>
    221 
    222 <!-- *********************************************************************** -->
    223 <h2>
    224   <a name="instruction">Adding a new instruction</a>
    225 </h2>
    226 <!-- *********************************************************************** -->
    227 
    228 <div>
    229 
    230 <p><span class="doc_warning">WARNING: adding instructions changes the bitcode
    231 format, and it will take some effort to maintain compatibility with
    232 the previous version.</span> Only add an instruction if it is absolutely
    233 necessary.</p>
    234 
    235 <ol>
    236 
    237 <li><tt>llvm/include/llvm/Instruction.def</tt>:
    238     add a number for your instruction and an enum name</li>
    239 
    240 <li><tt>llvm/include/llvm/Instructions.h</tt>:
    241     add a definition for the class that will represent your instruction</li>
    242 
    243 <li><tt>llvm/include/llvm/Support/InstVisitor.h</tt>:
    244     add a prototype for a visitor to your new instruction type</li>
    245 
    246 <li><tt>llvm/lib/AsmParser/Lexer.l</tt>:
    247     add a new token to parse your instruction from assembly text file</li>
    248 
    249 <li><tt>llvm/lib/AsmParser/llvmAsmParser.y</tt>:
    250     add the grammar on how your instruction can be read and what it will
    251     construct as a result</li>
    252 
    253 <li><tt>llvm/lib/Bitcode/Reader/Reader.cpp</tt>:
    254     add a case for your instruction and how it will be parsed from bitcode</li>
    255 
    256 <li><tt>llvm/lib/VMCore/Instruction.cpp</tt>:
    257     add a case for how your instruction will be printed out to assembly</li>
    258 
    259 <li><tt>llvm/lib/VMCore/Instructions.cpp</tt>:
    260     implement the class you defined in
    261     <tt>llvm/include/llvm/Instructions.h</tt></li>
    262 
    263 <li>Test your instruction</li>
    264 
    265 <li><tt>llvm/lib/Target/*</tt>: 
    266     Add support for your instruction to code generators, or add a lowering
    267     pass.</li>
    268 
    269 <li><tt>llvm/test/Regression/*</tt>: add your test cases to the test suite.</li>
    270 
    271 </ol>
    272 
    273 <p>Also, you need to implement (or modify) any analyses or passes that you want
    274 to understand this new instruction.</p>
    275 
    276 </div>
    277 
    278 
    279 <!-- *********************************************************************** -->
    280 <h2>
    281   <a name="type">Adding a new type</a>
    282 </h2>
    283 <!-- *********************************************************************** -->
    284 
    285 <div>
    286 
    287 <p><span class="doc_warning">WARNING: adding new types changes the bitcode
    288 format, and will break compatibility with currently-existing LLVM
    289 installations.</span> Only add new types if it is absolutely necessary.</p>
    290 
    291 <!-- ======================================================================= -->
    292 <h3>
    293   <a name="fund_type">Adding a fundamental type</a>
    294 </h3>
    295 
    296 <div>
    297 
    298 <ol>
    299 
    300 <li><tt>llvm/include/llvm/Type.h</tt>:
    301     add enum for the new type; add static <tt>Type*</tt> for this type</li>
    302 
    303 <li><tt>llvm/lib/VMCore/Type.cpp</tt>:
    304     add mapping from <tt>TypeID</tt> =&gt; <tt>Type*</tt>;
    305     initialize the static <tt>Type*</tt></li>
    306 
    307 <li><tt>llvm/lib/AsmReader/Lexer.l</tt>:
    308     add ability to parse in the type from text assembly</li>
    309 
    310 <li><tt>llvm/lib/AsmReader/llvmAsmParser.y</tt>:
    311     add a token for that type</li>
    312 
    313 </ol>
    314 
    315 </div>
    316 
    317 <!-- ======================================================================= -->
    318 <h3>
    319   <a name="derived_type">Adding a derived type</a>
    320 </h3>
    321 
    322 <div>
    323 
    324 <ol>
    325 <li><tt>llvm/include/llvm/Type.h</tt>:
    326     add enum for the new type; add a forward declaration of the type
    327     also</li>
    328 
    329 <li><tt>llvm/include/llvm/DerivedTypes.h</tt>:
    330     add new class to represent new class in the hierarchy; add forward 
    331     declaration to the TypeMap value type</li>
    332 
    333 <li><tt>llvm/lib/VMCore/Type.cpp</tt>:
    334     add support for derived type to: 
    335 <div class="doc_code">
    336 <pre>
    337 std::string getTypeDescription(const Type &amp;Ty,
    338   std::vector&lt;const Type*&gt; &amp;TypeStack)
    339 bool TypesEqual(const Type *Ty, const Type *Ty2,
    340   std::map&lt;const Type*, const Type*&gt; &amp; EqTypes)
    341 </pre>
    342 </div>
    343     add necessary member functions for type, and factory methods</li>
    344 
    345 <li><tt>llvm/lib/AsmReader/Lexer.l</tt>:
    346     add ability to parse in the type from text assembly</li>
    347 
    348 <li><tt>llvm/lib/BitCode/Writer/Writer.cpp</tt>:
    349     modify <tt>void BitcodeWriter::outputType(const Type *T)</tt> to serialize
    350     your type</li>
    351 
    352 <li><tt>llvm/lib/BitCode/Reader/Reader.cpp</tt>:
    353     modify <tt>const Type *BitcodeReader::ParseType()</tt> to read your data
    354     type</li> 
    355 
    356 <li><tt>llvm/lib/VMCore/AsmWriter.cpp</tt>:
    357     modify
    358 <div class="doc_code">
    359 <pre>
    360 void calcTypeName(const Type *Ty,
    361                   std::vector&lt;const Type*&gt; &amp;TypeStack,
    362                   std::map&lt;const Type*,std::string&gt; &amp;TypeNames,
    363                   std::string &amp; Result)
    364 </pre>
    365 </div>
    366     to output the new derived type
    367 </li>  
    368  
    369 
    370 </ol>
    371 
    372 </div>
    373 
    374 </div>
    375 
    376 <!-- *********************************************************************** -->
    377 
    378 <hr>
    379 <address>
    380   <a href="http://jigsaw.w3.org/css-validator/check/referer"><img
    381   src="http://jigsaw.w3.org/css-validator/images/vcss-blue" alt="Valid CSS"></a>
    382   <a href="http://validator.w3.org/check/referer"><img
    383   src="http://www.w3.org/Icons/valid-html401-blue" alt="Valid HTML 4.01"></a>
    384 
    385   <a href="http://llvm.org/">The LLVM Compiler Infrastructure</a>
    386   <br>
    387   Last modified: $Date: 2011-06-30 02:37:07 -0400 (Thu, 30 Jun 2011) $
    388 </address>
    389 
    390 </body>
    391 </html>
    392