| ================= | 
 | TableGen BackEnds | 
 | ================= | 
 |  | 
 | .. contents:: | 
 |    :local: | 
 |  | 
 | Introduction | 
 | ============ | 
 |  | 
 | TableGen backends are at the core of TableGen's functionality. The source files | 
 | provide the semantics to a generated (in memory) structure, but it's up to the | 
 | backend to print this out in a way that is meaningful to the user (normally a | 
 | C program including a file or a textual list of warnings, options and error | 
 | messages). | 
 |  | 
 | TableGen is used by both LLVM and Clang with very different goals. LLVM uses it | 
 | as a way to automate the generation of massive amounts of information regarding | 
 | instructions, schedules, cores and architecture features. Some backends generate | 
 | output that is consumed by more than one source file, so they need to be created | 
 | in a way that is easy to use pre-processor tricks. Some backends can also print | 
 | C code structures, so that they can be directly included as-is. | 
 |  | 
 | Clang, on the other hand, uses it mainly for diagnostic messages (errors, | 
 | warnings, tips) and attributes, so more on the textual end of the scale. | 
 |  | 
 | LLVM BackEnds | 
 | ============= | 
 |  | 
 | .. warning:: | 
 |    This document is raw. Each section below needs three sub-sections: description | 
 |    of its purpose with a list of users, output generated from generic input, and | 
 |    finally why it needed a new backend (in case there's something similar). | 
 |  | 
 | Overall, each backend will take the same TableGen file type and transform into | 
 | similar output for different targets/uses. There is an implicit contract between | 
 | the TableGen files, the back-ends and their users. | 
 |  | 
 | For instance, a global contract is that each back-end produces macro-guarded | 
 | sections. Based on whether the file is included by a header or a source file, | 
 | or even in which context of each file the include is being used, you have | 
 | todefine a macro just before including it, to get the right output: | 
 |  | 
 | .. code-block:: c++ | 
 |  | 
 |   #define GET_REGINFO_TARGET_DESC | 
 |   #include "ARMGenRegisterInfo.inc" | 
 |  | 
 | And just part of the generated file would be included. This is useful if | 
 | you need the same information in multiple formats (instantiation, initialization, | 
 | getter/setter functions, etc) from the same source TableGen file without having | 
 | to re-compile the TableGen file multiple times. | 
 |  | 
 | Sometimes, multiple macros might be defined before the same include file to | 
 | output multiple blocks: | 
 |  | 
 | .. code-block:: c++ | 
 |  | 
 |   #define GET_REGISTER_MATCHER | 
 |   #define GET_SUBTARGET_FEATURE_NAME | 
 |   #define GET_MATCHER_IMPLEMENTATION | 
 |   #include "ARMGenAsmMatcher.inc" | 
 |  | 
 | The macros will be undef'd automatically as they're used, in the include file. | 
 |  | 
 | On all LLVM back-ends, the ``llvm-tblgen`` binary will be executed on the root | 
 | TableGen file ``<Target>.td``, which should include all others. This guarantees | 
 | that all information needed is accessible, and that no duplication is needed | 
 | in the TableGen files. | 
 |  | 
 | CodeEmitter | 
 | ----------- | 
 |  | 
 | **Purpose**: CodeEmitterGen uses the descriptions of instructions and their fields to | 
 | construct an automated code emitter: a function that, given a MachineInstr, | 
 | returns the (currently, 32-bit unsigned) value of the instruction. | 
 |  | 
 | **Output**: C++ code, implementing the target's CodeEmitter | 
 | class by overriding the virtual functions as ``<Target>CodeEmitter::function()``. | 
 |  | 
 | **Usage**: Used to include directly at the end of ``<Target>MCCodeEmitter.cpp``. | 
 |  | 
 | RegisterInfo | 
 | ------------ | 
 |  | 
 | **Purpose**: This tablegen backend is responsible for emitting a description of a target | 
 | register file for a code generator.  It uses instances of the Register, | 
 | RegisterAliases, and RegisterClass classes to gather this information. | 
 |  | 
 | **Output**: C++ code with enums and structures representing the register mappings, | 
 | properties, masks, etc. | 
 |  | 
 | **Usage**: Both on ``<Target>BaseRegisterInfo`` and ``<Target>MCTargetDesc`` (headers | 
 | and source files) with macros defining in which they are for declaration vs. | 
 | initialization issues. | 
 |  | 
 | InstrInfo | 
 | --------- | 
 |  | 
 | **Purpose**: This tablegen backend is responsible for emitting a description of the target | 
 | instruction set for the code generator. (what are the differences from CodeEmitter?) | 
 |  | 
 | **Output**: C++ code with enums and structures representing the instruction mappings, | 
 | properties, masks, etc. | 
 |  | 
 | **Usage**: Both on ``<Target>BaseInstrInfo`` and ``<Target>MCTargetDesc`` (headers | 
 | and source files) with macros defining in which they are for declaration vs. | 
 | initialization issues. | 
 |  | 
 | AsmWriter | 
 | --------- | 
 |  | 
 | **Purpose**: Emits an assembly printer for the current target. | 
 |  | 
 | **Output**: Implementation of ``<Target>InstPrinter::printInstruction()``, among | 
 | other things. | 
 |  | 
 | **Usage**: Included directly into ``InstPrinter/<Target>InstPrinter.cpp``. | 
 |  | 
 | AsmMatcher | 
 | ---------- | 
 |  | 
 | **Purpose**: Emits a target specifier matcher for | 
 | converting parsed assembly operands in the MCInst structures. It also | 
 | emits a matcher for custom operand parsing. Extensive documentation is | 
 | written on the ``AsmMatcherEmitter.cpp`` file. | 
 |  | 
 | **Output**: Assembler parsers' matcher functions, declarations, etc. | 
 |  | 
 | **Usage**: Used in back-ends' ``AsmParser/<Target>AsmParser.cpp`` for | 
 | building the AsmParser class. | 
 |  | 
 | Disassembler | 
 | ------------ | 
 |  | 
 | **Purpose**: Contains disassembler table emitters for various | 
 | architectures. Extensive documentation is written on the | 
 | ``DisassemblerEmitter.cpp`` file. | 
 |  | 
 | **Output**: Decoding tables, static decoding functions, etc. | 
 |  | 
 | **Usage**: Directly included in ``Disassembler/<Target>Disassembler.cpp`` | 
 | to cater for all default decodings, after all hand-made ones. | 
 |  | 
 | PseudoLowering | 
 | -------------- | 
 |  | 
 | **Purpose**: Generate pseudo instruction lowering. | 
 |  | 
 | **Output**: Implements ``<Target>AsmPrinter::emitPseudoExpansionLowering()``. | 
 |  | 
 | **Usage**: Included directly into ``<Target>AsmPrinter.cpp``. | 
 |  | 
 | CallingConv | 
 | ----------- | 
 |  | 
 | **Purpose**: Responsible for emitting descriptions of the calling | 
 | conventions supported by this target. | 
 |  | 
 | **Output**: Implement static functions to deal with calling conventions | 
 | chained by matching styles, returning false on no match. | 
 |  | 
 | **Usage**: Used in ISelLowering and FastIsel as function pointers to | 
 | implementation returned by a CC selection function. | 
 |  | 
 | DAGISel | 
 | ------- | 
 |  | 
 | **Purpose**: Generate a DAG instruction selector. | 
 |  | 
 | **Output**: Creates huge functions for automating DAG selection. | 
 |  | 
 | **Usage**: Included in ``<Target>ISelDAGToDAG.cpp`` inside the target's | 
 | implementation of ``SelectionDAGISel``. | 
 |  | 
 | DFAPacketizer | 
 | ------------- | 
 |  | 
 | **Purpose**: This class parses the Schedule.td file and produces an API that | 
 | can be used to reason about whether an instruction can be added to a packet | 
 | on a VLIW architecture. The class internally generates a deterministic finite | 
 | automaton (DFA) that models all possible mappings of machine instructions | 
 | to functional units as instructions are added to a packet. | 
 |  | 
 | **Output**: Scheduling tables for GPU back-ends (Hexagon, AMD). | 
 |  | 
 | **Usage**: Included directly on ``<Target>InstrInfo.cpp``. | 
 |  | 
 | FastISel | 
 | -------- | 
 |  | 
 | **Purpose**: This tablegen backend emits code for use by the "fast" | 
 | instruction selection algorithm. See the comments at the top of | 
 | lib/CodeGen/SelectionDAG/FastISel.cpp for background. This file | 
 | scans through the target's tablegen instruction-info files | 
 | and extracts instructions with obvious-looking patterns, and it emits | 
 | code to look up these instructions by type and operator. | 
 |  | 
 | **Output**: Generates ``Predicate`` and ``FastEmit`` methods. | 
 |  | 
 | **Usage**: Implements private methods of the targets' implementation | 
 | of ``FastISel`` class. | 
 |  | 
 | Subtarget | 
 | --------- | 
 |  | 
 | **Purpose**: Generate subtarget enumerations. | 
 |  | 
 | **Output**: Enums, globals, local tables for sub-target information. | 
 |  | 
 | **Usage**: Populates ``<Target>Subtarget`` and | 
 | ``MCTargetDesc/<Target>MCTargetDesc`` files (both headers and source). | 
 |  | 
 | Intrinsic | 
 | --------- | 
 |  | 
 | **Purpose**: Generate (target) intrinsic information. | 
 |  | 
 | OptParserDefs | 
 | ------------- | 
 |  | 
 | **Purpose**: Print enum values for a class. | 
 |  | 
 | CTags | 
 | ----- | 
 |  | 
 | **Purpose**: This tablegen backend emits an index of definitions in ctags(1) | 
 | format. A helper script, utils/TableGen/tdtags, provides an easier-to-use | 
 | interface; run 'tdtags -H' for documentation. | 
 |  | 
 | Clang BackEnds | 
 | ============== | 
 |  | 
 | ClangAttrClasses | 
 | ---------------- | 
 |  | 
 | **Purpose**: Creates Attrs.inc, which contains semantic attribute class | 
 | declarations for any attribute in ``Attr.td`` that has not set ``ASTNode = 0``. | 
 | This file is included as part of ``Attr.h``. | 
 |  | 
 | ClangAttrParserStringSwitches | 
 | ----------------------------- | 
 |  | 
 | **Purpose**: Creates AttrParserStringSwitches.inc, which contains | 
 | StringSwitch::Case statements for parser-related string switches. Each switch | 
 | is given its own macro (such as ``CLANG_ATTR_ARG_CONTEXT_LIST``, or | 
 | ``CLANG_ATTR_IDENTIFIER_ARG_LIST``), which is expected to be defined before | 
 | including AttrParserStringSwitches.inc, and undefined after. | 
 |  | 
 | ClangAttrImpl | 
 | ------------- | 
 |  | 
 | **Purpose**: Creates AttrImpl.inc, which contains semantic attribute class | 
 | definitions for any attribute in ``Attr.td`` that has not set ``ASTNode = 0``. | 
 | This file is included as part of ``AttrImpl.cpp``. | 
 |  | 
 | ClangAttrList | 
 | ------------- | 
 |  | 
 | **Purpose**: Creates AttrList.inc, which is used when a list of semantic | 
 | attribute identifiers is required. For instance, ``AttrKinds.h`` includes this | 
 | file to generate the list of ``attr::Kind`` enumeration values. This list is | 
 | separated out into multiple categories: attributes, inheritable attributes, and | 
 | inheritable parameter attributes. This categorization happens automatically | 
 | based on information in ``Attr.td`` and is used to implement the ``classof`` | 
 | functionality required for ``dyn_cast`` and similar APIs. | 
 |  | 
 | ClangAttrPCHRead | 
 | ---------------- | 
 |  | 
 | **Purpose**: Creates AttrPCHRead.inc, which is used to deserialize attributes | 
 | in the ``ASTReader::ReadAttributes`` function. | 
 |  | 
 | ClangAttrPCHWrite | 
 | ----------------- | 
 |  | 
 | **Purpose**: Creates AttrPCHWrite.inc, which is used to serialize attributes in | 
 | the ``ASTWriter::WriteAttributes`` function. | 
 |  | 
 | ClangAttrSpellings | 
 | --------------------- | 
 |  | 
 | **Purpose**: Creates AttrSpellings.inc, which is used to implement the | 
 | ``__has_attribute`` feature test macro. | 
 |  | 
 | ClangAttrSpellingListIndex | 
 | -------------------------- | 
 |  | 
 | **Purpose**: Creates AttrSpellingListIndex.inc, which is used to map parsed | 
 | attribute spellings (including which syntax or scope was used) to an attribute | 
 | spelling list index. These spelling list index values are internal | 
 | implementation details exposed via | 
 | ``AttributeList::getAttributeSpellingListIndex``. | 
 |  | 
 | ClangAttrVisitor | 
 | ------------------- | 
 |  | 
 | **Purpose**: Creates AttrVisitor.inc, which is used when implementing  | 
 | recursive AST visitors. | 
 |  | 
 | ClangAttrTemplateInstantiate | 
 | ---------------------------- | 
 |  | 
 | **Purpose**: Creates AttrTemplateInstantiate.inc, which implements the | 
 | ``instantiateTemplateAttribute`` function, used when instantiating a template | 
 | that requires an attribute to be cloned. | 
 |  | 
 | ClangAttrParsedAttrList | 
 | ----------------------- | 
 |  | 
 | **Purpose**: Creates AttrParsedAttrList.inc, which is used to generate the | 
 | ``AttributeList::Kind`` parsed attribute enumeration. | 
 |  | 
 | ClangAttrParsedAttrImpl | 
 | ----------------------- | 
 |  | 
 | **Purpose**: Creates AttrParsedAttrImpl.inc, which is used by | 
 | ``AttributeList.cpp`` to implement several functions on the ``AttributeList`` | 
 | class. This functionality is implemented via the ``AttrInfoMap ParsedAttrInfo`` | 
 | array, which contains one element per parsed attribute object. | 
 |  | 
 | ClangAttrParsedAttrKinds | 
 | ------------------------ | 
 |  | 
 | **Purpose**: Creates AttrParsedAttrKinds.inc, which is used to implement the | 
 | ``AttributeList::getKind`` function, mapping a string (and syntax) to a parsed | 
 | attribute ``AttributeList::Kind`` enumeration. | 
 |  | 
 | ClangAttrDump | 
 | ------------- | 
 |  | 
 | **Purpose**: Creates AttrDump.inc, which dumps information about an attribute. | 
 | It is used to implement ``ASTDumper::dumpAttr``. | 
 |  | 
 | ClangDiagsDefs | 
 | -------------- | 
 |  | 
 | Generate Clang diagnostics definitions. | 
 |  | 
 | ClangDiagGroups | 
 | --------------- | 
 |  | 
 | Generate Clang diagnostic groups. | 
 |  | 
 | ClangDiagsIndexName | 
 | ------------------- | 
 |  | 
 | Generate Clang diagnostic name index. | 
 |  | 
 | ClangCommentNodes | 
 | ----------------- | 
 |  | 
 | Generate Clang AST comment nodes. | 
 |  | 
 | ClangDeclNodes | 
 | -------------- | 
 |  | 
 | Generate Clang AST declaration nodes. | 
 |  | 
 | ClangStmtNodes | 
 | -------------- | 
 |  | 
 | Generate Clang AST statement nodes. | 
 |  | 
 | ClangSACheckers | 
 | --------------- | 
 |  | 
 | Generate Clang Static Analyzer checkers. | 
 |  | 
 | ClangCommentHTMLTags | 
 | -------------------- | 
 |  | 
 | Generate efficient matchers for HTML tag names that are used in documentation comments. | 
 |  | 
 | ClangCommentHTMLTagsProperties | 
 | ------------------------------ | 
 |  | 
 | Generate efficient matchers for HTML tag properties. | 
 |  | 
 | ClangCommentHTMLNamedCharacterReferences | 
 | ---------------------------------------- | 
 |  | 
 | Generate function to translate named character references to UTF-8 sequences. | 
 |  | 
 | ClangCommentCommandInfo | 
 | ----------------------- | 
 |  | 
 | Generate command properties for commands that are used in documentation comments. | 
 |  | 
 | ClangCommentCommandList | 
 | ----------------------- | 
 |  | 
 | Generate list of commands that are used in documentation comments. | 
 |  | 
 | ArmNeon | 
 | ------- | 
 |  | 
 | Generate arm_neon.h for clang. | 
 |  | 
 | ArmNeonSema | 
 | ----------- | 
 |  | 
 | Generate ARM NEON sema support for clang. | 
 |  | 
 | ArmNeonTest | 
 | ----------- | 
 |  | 
 | Generate ARM NEON tests for clang. | 
 |  | 
 | AttrDocs | 
 | -------- | 
 |  | 
 | **Purpose**: Creates ``AttributeReference.rst`` from ``AttrDocs.td``, and is | 
 | used for documenting user-facing attributes. | 
 |  | 
 | How to write a back-end | 
 | ======================= | 
 |  | 
 | TODO. | 
 |  | 
 | Until we get a step-by-step HowTo for writing TableGen backends, you can at | 
 | least grab the boilerplate (build system, new files, etc.) from Clang's | 
 | r173931. | 
 |  | 
 | TODO: How they work, how to write one.  This section should not contain details | 
 | about any particular backend, except maybe ``-print-enums`` as an example.  This | 
 | should highlight the APIs in ``TableGen/Record.h``. | 
 |  |