X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=docs%2FExtendingLLVM.html;h=b072ed3b6e8532fdc10f66b21975813cd7a6b58f;hb=73b43b9b549a75fb0015c825df68abd95705a67c;hp=0d90fc1c08169c94200643132e4b4086867fd4b3;hpb=c92dba26bf7b1576d175021b450e8b988a8efa5e;p=oota-llvm.git diff --git a/docs/ExtendingLLVM.html b/docs/ExtendingLLVM.html index 0d90fc1c081..b072ed3b6e8 100644 --- a/docs/ExtendingLLVM.html +++ b/docs/ExtendingLLVM.html @@ -53,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.

@@ -85,21 +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.td: - Add an entry for your intrinsic.
  • - -
  • 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
  • @@ -111,35 +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 Adding a new SelectionDAG node section.
    - -
    -
    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.
    +
    @@ -241,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.

    @@ -264,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
  • @@ -298,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.

    @@ -361,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: @@ -396,7 +382,7 @@ void calcTypeName(const Type *Ty, Valid HTML 4.01! - The LLVM Compiler Infrastructure + The LLVM Compiler Infrastructure
    Last modified: $Date$