X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=docs%2FExtendingLLVM.html;h=647fa01d53bbca054ea108d0e1259f39f93c7d65;hb=591466baff32bd76aa3329e18092c0c09528f826;hp=b86d561794c727f307e1a1ffaf06a113e498fa5f;hpb=099d76cf159a07d35cfb80b79c34127bf2377a0e;p=oota-llvm.git diff --git a/docs/ExtendingLLVM.html b/docs/ExtendingLLVM.html index b86d561794c..647fa01d53b 100644 --- a/docs/ExtendingLLVM.html +++ b/docs/ExtendingLLVM.html @@ -26,7 +26,8 @@

Written by Misha Brukman, - Brad Jones, and Chris Lattner

+ Brad Jones, Nate Begeman, + and Chris Lattner

@@ -52,9 +53,9 @@ different passes that you intend to use with your extension, and there are many LLVM analyses and transformations, so it may be quite a bit of work.

-

Adding an intrinsic function is easier than adding -an instruction, and is transparent to optimization passes which treat it as an -unanalyzable function. If your added functionality can be expressed as a +

Adding an intrinsic function is far easier than +adding an instruction, and is transparent to optimization passes. If your added +functionality can be expressed as a function call, an intrinsic function is the method of choice for LLVM extension.

@@ -84,28 +85,17 @@ function and then be turned into an instruction if warranted.

what the restrictions are. Talk to other people about it so that you are sure it's a good idea. -
  • llvm/include/llvm/Intrinsics.h: - add an enum in the llvm::Intrinsic namespace
  • - -
  • llvm/lib/VMCore/Verifier.cpp: - Add code to check the invariants of the intrinsic are respected.
  • - -
  • llvm/lib/VMCore/Function.cpp (Function::getIntrinsicID()): - Identify the new intrinsic function, returning the enum for the intrinsic - that you added.
  • - -
  • llvm/lib/Analysis/BasicAliasAnalysis.cpp: If the new intrinsic does - not access memory or does not write to memory, add it to the relevant list - of functions.
  • +
  • llvm/include/llvm/Intrinsics*.td: + Add an entry for your intrinsic. Describe its memory access characteristics + for optimization (this controls whether it will be DCE'd, CSE'd, etc). Note + that any intrinsic using the llvm_int_ty type for an argument will + be deemed by tblgen as overloaded and the corresponding suffix + will be required on the intrinsic's name.
  • llvm/lib/Analysis/ConstantFolding.cpp: If it is possible to constant fold your intrinsic, add support to it in the canConstantFoldCallTo and ConstantFoldCall functions.
  • -
  • llvm/lib/Transforms/Utils/Local.cpp: If your intrinsic has no side- - effects, add it to the list of intrinsics in the - isInstructionTriviallyDead function.
  • -
  • llvm/test/Regression/*: Add test cases for your test cases to the test suite
  • @@ -117,33 +107,25 @@ support for it. Generally you must do the following steps:

    Add support to the C backend in lib/Target/CBackend/
    Depending on the intrinsic, there are a few ways to implement this. For -most intrinsics, it makes sense to add code to lower your intrinsic in -LowerIntrinsicCall in lib/CodeGen/IntrinsicLowering.cpp. -Second, if it makes sense to lower the intrinsic to an expanded sequence of C -code in all cases, just emit the expansion in visitCallInst in -Writer.cpp. If the intrinsic has some way to express it with GCC -(or any other compiler) extensions, it can be conditionally supported based on -the compiler compiling the CBE output (see llvm.prefetch for an example). -Third, if the intrinsic really has no way to be lowered, just have the code -generator emit code that prints an error message and calls abort if executed. -
    - -
    -
    Add support to the SelectionDAG Instruction Selector in -lib/CodeGen/SelectionDAG/
    - -
    Since most targets in LLVM use the SelectionDAG framework for generating -code, you will likely need to add support for your intrinsic there as well. -This is usually accomplished by adding a new node, and then teaching the -SelectionDAG code how to handle that node. To do this, follow the steps in -the next section, Adding a new SelectionDAG node.
    - -
    -
    Once you have added the new node, add code to -SelectionDAG/SelectionDAGISel.cpp to recognize the intrinsic. In most -cases, the intrinsic will just be turned into the node you just added. For an -example of this, see how visitIntrinsicCall handles Intrinsic::ctpop -
    + most intrinsics, it makes sense to add code to lower your intrinsic in + LowerIntrinsicCall in lib/CodeGen/IntrinsicLowering.cpp. + Second, if it makes sense to lower the intrinsic to an expanded sequence of + C code in all cases, just emit the expansion in visitCallInst in + Writer.cpp. If the intrinsic has some way to express it with GCC + (or any other compiler) extensions, it can be conditionally supported based + on the compiler compiling the CBE output (see llvm.prefetch for an + example). Third, if the intrinsic really has no way to be lowered, just + have the code generator emit code that prints an error message and calls + abort if executed. + +
    Add support to the .td file for the target(s) of your choice in + lib/Target/*/*.td.
    + +
    This is usually a matter of adding a pattern to the .td file that matches + the intrinsic, though it may obviously require adding the instructions you + want to generate as well. There are lots of examples in the PowerPC and X86 + backend to follow.
    +
    @@ -182,14 +164,15 @@ complicated behavior in a single node (rotate).

    targets supported by the SelectionDAG framework will natively support the new node. In this case, you must also add code in your node's case statement in LegalizeOp to Expand your node into simpler, legal - operations. The case for ISD::UREM for expanding a remainder into a - multiply and a subtract is a good example. + operations. The case for ISD::UREM for expanding a remainder into + a divide, multiply, and a subtract is a good example.
  • lib/CodeGen/SelectionDAG/LegalizeDAG.cpp: If targets may support the new node being added only at certain sizes, you will also need to add code to your node's case statement in LegalizeOp to Promote your node's operands to a larger size, and perform the correct operation. You will also need to add code to - PromoteOp to do this as well. For a good example, see ISD::BSWAP, + PromoteOp to do this as well. For a good example, see + ISD::BSWAP, which promotes its operand to a wider size, performs the byteswap, and then shifts the correct bytes right to emulate the narrower byteswap in the wider type.
  • @@ -244,7 +227,7 @@ complicated behavior in a single node (rotate).

    -

    WARNING: adding instructions changes the bytecode +

    WARNING: adding instructions changes the bitcode format, and it will take some effort to maintain compatibility with the previous version. Only add an instruction if it is absolutely necessary.

    @@ -267,8 +250,8 @@ necessary.

    add the grammar on how your instruction can be read and what it will construct as a result -
  • llvm/lib/Bytecode/Reader/Reader.cpp: - add a case for your instruction and how it will be parsed from bytecode
  • +
  • llvm/lib/Bitcode/Reader/Reader.cpp: + add a case for your instruction and how it will be parsed from bitcode
  • llvm/lib/VMCore/Instruction.cpp: add a case for how your instruction will be printed out to assembly
  • @@ -301,7 +284,7 @@ to understand this new instruction.

    -

    WARNING: adding new types changes the bytecode +

    WARNING: adding new types changes the bitcode format, and will break compatibility with currently-existing LLVM installations. Only add new types if it is absolutely necessary.

    @@ -364,12 +347,12 @@ bool TypesEqual(const Type *Ty, const Type *Ty2,
  • llvm/lib/AsmReader/Lexer.l: add ability to parse in the type from text assembly
  • -
  • llvm/lib/ByteCode/Writer/Writer.cpp: - modify void BytecodeWriter::outputType(const Type *T) to serialize +
  • llvm/lib/BitCode/Writer/Writer.cpp: + modify void BitcodeWriter::outputType(const Type *T) to serialize your type
  • -
  • llvm/lib/ByteCode/Reader/Reader.cpp: - modify const Type *BytecodeReader::ParseType() to read your data +
  • llvm/lib/BitCode/Reader/Reader.cpp: + modify const Type *BitcodeReader::ParseType() to read your data type
  • llvm/lib/VMCore/AsmWriter.cpp: @@ -395,11 +378,11 @@ void calcTypeName(const Type *Ty,
    Valid CSS! + src="http://jigsaw.w3.org/css-validator/images/vcss-blue" alt="Valid CSS"> Valid HTML 4.01! + src="http://www.w3.org/Icons/valid-html401-blue" alt="Valid HTML 4.01"> - The LLVM Compiler Infrastructure + The LLVM Compiler Infrastructure
    Last modified: $Date$