123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421 |
- =================
- TableGen BackEnds
- =================
- .. contents::
- :local:
- Introduction
- ============
- NOTE: the DirectX Compiler project supports TableGen functionality, but also
- relies on /utils/hct/hctdb.py and its supporting files to generate code and
- documentation. The hctdb.py file is a Python script that builds an in-memory
- representation of various concepts; other tools can query this information to
- generate code. Long-form simple declarations are preferred for hctdb, but when
- convenient more powerful constructs can be employed.
- 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 TbleGen 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 register 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.
- 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 ``ARMAsmPrinter::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 sellection 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.
|