diff options
| author | 2020-08-03 15:06:44 +0000 | |
|---|---|---|
| committer | 2020-08-03 15:06:44 +0000 | |
| commit | b64793999546ed8adebaeebd9d8345d18db8927d (patch) | |
| tree | 4357c27b561d73b0e089727c6ed659f2ceff5f47 /gnu/llvm/docs/TableGen | |
| parent | Add support for UTF-8 DISPLAY-HINTs with octet length. For now only (diff) | |
| download | wireguard-openbsd-b64793999546ed8adebaeebd9d8345d18db8927d.tar.xz wireguard-openbsd-b64793999546ed8adebaeebd9d8345d18db8927d.zip | |
Remove LLVM 8.0.1 files.
Diffstat (limited to 'gnu/llvm/docs/TableGen')
| -rw-r--r-- | gnu/llvm/docs/TableGen/BackEnds.rst | 571 | ||||
| -rw-r--r-- | gnu/llvm/docs/TableGen/Deficiencies.rst | 31 | ||||
| -rw-r--r-- | gnu/llvm/docs/TableGen/LangIntro.rst | 695 | ||||
| -rw-r--r-- | gnu/llvm/docs/TableGen/LangRef.rst | 497 | ||||
| -rw-r--r-- | gnu/llvm/docs/TableGen/index.rst | 304 |
5 files changed, 0 insertions, 2098 deletions
diff --git a/gnu/llvm/docs/TableGen/BackEnds.rst b/gnu/llvm/docs/TableGen/BackEnds.rst deleted file mode 100644 index 8b313383566..00000000000 --- a/gnu/llvm/docs/TableGen/BackEnds.rst +++ /dev/null @@ -1,571 +0,0 @@ -================= -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. - -SearchableTables ----------------- - -**Purpose**: Generate custom searchable tables. - -**Output**: Enums, global tables and lookup helper functions. - -**Usage**: This backend allows generating free-form, target-specific tables -from TableGen records. The ARM and AArch64 targets use this backend to generate -tables of system registers; the AMDGPU target uses it to generate meta-data -about complex image and memory buffer instructions. - -More documentation is available in ``include/llvm/TableGen/SearchableTable.td``, -which also contains the definitions of TableGen classes which must be -instantiated in order to define the enums and tables emitted by this backend. - -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. - -X86EVEX2VEX ------------ - -**Purpose**: This X86 specific tablegen backend emits tables that map EVEX -encoded instructions to their VEX encoded identical instruction. - -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. - -General BackEnds -================ - -JSON ----- - -**Purpose**: Output all the values in every ``def``, as a JSON data -structure that can be easily parsed by a variety of languages. Useful -for writing custom backends without having to modify TableGen itself, -or for performing auxiliary analysis on the same TableGen data passed -to a built-in backend. - -**Output**: - -The root of the output file is a JSON object (i.e. dictionary), -containing the following fixed keys: - -* ``!tablegen_json_version``: a numeric version field that will - increase if an incompatible change is ever made to the structure of - this data. The format described here corresponds to version 1. - -* ``!instanceof``: a dictionary whose keys are the class names defined - in the TableGen input. For each key, the corresponding value is an - array of strings giving the names of ``def`` records that derive - from that class. So ``root["!instanceof"]["Instruction"]``, for - example, would list the names of all the records deriving from the - class ``Instruction``. - -For each ``def`` record, the root object also has a key for the record -name. The corresponding value is a subsidiary object containing the -following fixed keys: - -* ``!superclasses``: an array of strings giving the names of all the - classes that this record derives from. - -* ``!fields``: an array of strings giving the names of all the variables - in this record that were defined with the ``field`` keyword. - -* ``!name``: a string giving the name of the record. This is always - identical to the key in the JSON root object corresponding to this - record's dictionary. (If the record is anonymous, the name is - arbitrary.) - -* ``!anonymous``: a boolean indicating whether the record's name was - specified by the TableGen input (if it is ``false``), or invented by - TableGen itself (if ``true``). - -For each variable defined in a record, the ``def`` object for that -record also has a key for the variable name. The corresponding value -is a translation into JSON of the variable's value, using the -conventions described below. - -Some TableGen data types are translated directly into the -corresponding JSON type: - -* A completely undefined value (e.g. for a variable declared without - initializer in some superclass of this record, and never initialized - by the record itself or any other superclass) is emitted as the JSON - ``null`` value. - -* ``int`` and ``bit`` values are emitted as numbers. Note that - TableGen ``int`` values are capable of holding integers too large to - be exactly representable in IEEE double precision. The integer - literal in the JSON output will show the full exact integer value. - So if you need to retrieve large integers with full precision, you - should use a JSON reader capable of translating such literals back - into 64-bit integers without losing precision, such as Python's - standard ``json`` module. - -* ``string`` and ``code`` values are emitted as JSON strings. - -* ``list<T>`` values, for any element type ``T``, are emitted as JSON - arrays. Each element of the array is represented in turn using these - same conventions. - -* ``bits`` values are also emitted as arrays. A ``bits`` array is - ordered from least-significant bit to most-significant. So the - element with index ``i`` corresponds to the bit described as - ``x{i}`` in TableGen source. However, note that this means that - scripting languages are likely to *display* the array in the - opposite order from the way it appears in the TableGen source or in - the diagnostic ``-print-records`` output. - -All other TableGen value types are emitted as a JSON object, -containing two standard fields: ``kind`` is a discriminator describing -which kind of value the object represents, and ``printable`` is a -string giving the same representation of the value that would appear -in ``-print-records``. - -* A reference to a ``def`` object has ``kind=="def"``, and has an - extra field ``def`` giving the name of the object referred to. - -* A reference to another variable in the same record has - ``kind=="var"``, and has an extra field ``var`` giving the name of - the variable referred to. - -* A reference to a specific bit of a ``bits``-typed variable in the - same record has ``kind=="varbit"``, and has two extra fields: - ``var`` gives the name of the variable referred to, and ``index`` - gives the index of the bit. - -* A value of type ``dag`` has ``kind=="dag"``, and has two extra - fields. ``operator`` gives the initial value after the opening - parenthesis of the dag initializer; ``args`` is an array giving the - following arguments. The elements of ``args`` are arrays of length - 2, giving the value of each argument followed by its colon-suffixed - name (if any). For example, in the JSON representation of the dag - value ``(Op 22, "hello":$foo)`` (assuming that ``Op`` is the name of - a record defined elsewhere with a ``def`` statement): - - * ``operator`` will be an object in which ``kind=="def"`` and - ``def=="Op"`` - - * ``args`` will be the array ``[[22, null], ["hello", "foo"]]``. - -* If any other kind of value or complicated expression appears in the - output, it will have ``kind=="complex"``, and no additional fields. - These values are not expected to be needed by backends. The standard - ``printable`` field can be used to extract a representation of them - in TableGen source syntax if necessary. - -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``. - diff --git a/gnu/llvm/docs/TableGen/Deficiencies.rst b/gnu/llvm/docs/TableGen/Deficiencies.rst deleted file mode 100644 index a00aecd342d..00000000000 --- a/gnu/llvm/docs/TableGen/Deficiencies.rst +++ /dev/null @@ -1,31 +0,0 @@ -===================== -TableGen Deficiencies -===================== - -.. contents:: - :local: - -Introduction -============ - -Despite being very generic, TableGen has some deficiencies that have been -pointed out numerous times. The common theme is that, while TableGen allows -you to build Domain-Specific-Languages, the final languages that you create -lack the power of other DSLs, which in turn increase considerably the size -and complexity of TableGen files. - -At the same time, TableGen allows you to create virtually any meaning of -the basic concepts via custom-made back-ends, which can pervert the original -design and make it very hard for newcomers to understand it. - -There are some in favour of extending the semantics even more, but making sure -back-ends adhere to strict rules. Others suggesting we should move to more -powerful DSLs designed with specific purposes, or even re-using existing -DSLs. - -Known Problems -============== - -TODO: Add here frequently asked questions about why TableGen doesn't do -what you want, how it might, and how we could extend/restrict it to -be more use friendly. diff --git a/gnu/llvm/docs/TableGen/LangIntro.rst b/gnu/llvm/docs/TableGen/LangIntro.rst deleted file mode 100644 index ea46550ffc0..00000000000 --- a/gnu/llvm/docs/TableGen/LangIntro.rst +++ /dev/null @@ -1,695 +0,0 @@ -============================== -TableGen Language Introduction -============================== - -.. contents:: - :local: - -.. warning:: - This document is extremely rough. If you find something lacking, please - fix it, file a documentation bug, or ask about it on llvm-dev. - -Introduction -============ - -This document is not meant to be a normative spec about the TableGen language -in and of itself (i.e. how to understand a given construct in terms of how -it affects the final set of records represented by the TableGen file). For -the formal language specification, see :doc:`LangRef`. - -TableGen syntax -=============== - -TableGen doesn't care about the meaning of data (that is up to the backend to -define), but it does care about syntax, and it enforces a simple type system. -This section describes the syntax and the constructs allowed in a TableGen file. - -TableGen primitives -------------------- - -TableGen comments -^^^^^^^^^^^^^^^^^ - -TableGen supports C++ style "``//``" comments, which run to the end of the -line, and it also supports **nestable** "``/* */``" comments. - -.. _TableGen type: - -The TableGen type system -^^^^^^^^^^^^^^^^^^^^^^^^ - -TableGen files are strongly typed, in a simple (but complete) type-system. -These types are used to perform automatic conversions, check for errors, and to -help interface designers constrain the input that they allow. Every `value -definition`_ is required to have an associated type. - -TableGen supports a mixture of very low-level types (such as ``bit``) and very -high-level types (such as ``dag``). This flexibility is what allows it to -describe a wide range of information conveniently and compactly. The TableGen -types are: - -``bit`` - A 'bit' is a boolean value that can hold either 0 or 1. - -``int`` - The 'int' type represents a simple 32-bit integer value, such as 5. - -``string`` - The 'string' type represents an ordered sequence of characters of arbitrary - length. - -``code`` - The `code` type represents a code fragment, which can be single/multi-line - string literal. - -``bits<n>`` - A 'bits' type is an arbitrary, but fixed, size integer that is broken up - into individual bits. This type is useful because it can handle some bits - being defined while others are undefined. - -``list<ty>`` - This type represents a list whose elements are some other type. The - contained type is arbitrary: it can even be another list type. - -Class type - Specifying a class name in a type context means that the defined value must - be a subclass of the specified class. This is useful in conjunction with - the ``list`` type, for example, to constrain the elements of the list to a - common base class (e.g., a ``list<Register>`` can only contain definitions - derived from the "``Register``" class). - -``dag`` - This type represents a nestable directed graph of elements. - -To date, these types have been sufficient for describing things that TableGen -has been used for, but it is straight-forward to extend this list if needed. - -.. _TableGen expressions: - -TableGen values and expressions -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -TableGen allows for a pretty reasonable number of different expression forms -when building up values. These forms allow the TableGen file to be written in a -natural syntax and flavor for the application. The current expression forms -supported include: - -``?`` - uninitialized field - -``0b1001011`` - binary integer value. - Note that this is sized by the number of bits given and will not be - silently extended/truncated. - -``7`` - decimal integer value - -``0x7F`` - hexadecimal integer value - -``"foo"`` - a single-line string value, can be assigned to ``string`` or ``code`` variable. - -``[{ ... }]`` - usually called a "code fragment", but is just a multiline string literal - -``[ X, Y, Z ]<type>`` - list value. <type> is the type of the list element and is usually optional. - In rare cases, TableGen is unable to deduce the element type in which case - the user must specify it explicitly. - -``{ a, b, 0b10 }`` - initializer for a "bits<4>" value. - 1-bit from "a", 1-bit from "b", 2-bits from 0b10. - -``value`` - value reference - -``value{17}`` - access to one bit of a value - -``value{15-17}`` - access to an ordered sequence of bits of a value, in particular ``value{15-17}`` - produces an order that is the reverse of ``value{17-15}``. - -``DEF`` - reference to a record definition - -``CLASS<val list>`` - reference to a new anonymous definition of CLASS with the specified template - arguments. - -``X.Y`` - reference to the subfield of a value - -``list[4-7,17,2-3]`` - A slice of the 'list' list, including elements 4,5,6,7,17,2, and 3 from it. - Elements may be included multiple times. - -``foreach <var> = [ <list> ] in { <body> }`` - -``foreach <var> = [ <list> ] in <def>`` - Replicate <body> or <def>, replacing instances of <var> with each value - in <list>. <var> is scoped at the level of the ``foreach`` loop and must - not conflict with any other object introduced in <body> or <def>. Only - ``def``\s and ``defm``\s are expanded within <body>. - -``foreach <var> = 0-15 in ...`` - -``foreach <var> = {0-15,32-47} in ...`` - Loop over ranges of integers. The braces are required for multiple ranges. - -``(DEF a, b)`` - a dag value. The first element is required to be a record definition, the - remaining elements in the list may be arbitrary other values, including - nested ```dag``' values. - -``!con(a, b, ...)`` - Concatenate two or more DAG nodes. Their operations must equal. - - Example: !con((op a1:$name1, a2:$name2), (op b1:$name3)) results in - the DAG node (op a1:$name1, a2:$name2, b1:$name3). - -``!dag(op, children, names)`` - Generate a DAG node programmatically. 'children' and 'names' must be lists - of equal length or unset ('?'). 'names' must be a 'list<string>'. - - Due to limitations of the type system, 'children' must be a list of items - of a common type. In practice, this means that they should either have the - same type or be records with a common superclass. Mixing dag and non-dag - items is not possible. However, '?' can be used. - - Example: !dag(op, [a1, a2, ?], ["name1", "name2", "name3"]) results in - (op a1:$name1, a2:$name2, ?:$name3). - -``!listconcat(a, b, ...)`` - A list value that is the result of concatenating the 'a' and 'b' lists. - The lists must have the same element type. - More than two arguments are accepted with the result being the concatenation - of all the lists given. - -``!strconcat(a, b, ...)`` - A string value that is the result of concatenating the 'a' and 'b' strings. - More than two arguments are accepted with the result being the concatenation - of all the strings given. - -``str1#str2`` - "#" (paste) is a shorthand for !strconcat. It may concatenate things that - are not quoted strings, in which case an implicit !cast<string> is done on - the operand of the paste. - -``!cast<type>(a)`` - If 'a' is a string, a record of type *type* obtained by looking up the - string 'a' in the list of all records defined by the time that all template - arguments in 'a' are fully resolved. - - For example, if !cast<type>(a) appears in a multiclass definition, or in a - class instantiated inside of a multiclass definition, and 'a' does not - reference any template arguments of the multiclass, then a record of name - 'a' must be instantiated earlier in the source file. If 'a' does reference - a template argument, then the lookup is delayed until defm statements - instantiating the multiclass (or later, if the defm occurs in another - multiclass and template arguments of the inner multiclass that are - referenced by 'a' are substituted by values that themselves contain - references to template arguments of the outer multiclass). - - If the type of 'a' does not match *type*, TableGen aborts with an error. - - Otherwise, perform a normal type cast e.g. between an int and a bit, or - between record types. This allows casting a record to a subclass, though if - the types do not match, constant folding will be inhibited. !cast<string> - is a special case in that the argument can be an int or a record. In the - latter case, the record's name is returned. - -``!isa<type>(a)`` - Returns an integer: 1 if 'a' is dynamically of the given type, 0 otherwise. - -``!subst(a, b, c)`` - If 'a' and 'b' are of string type or are symbol references, substitute 'b' - for 'a' in 'c.' This operation is analogous to $(subst) in GNU make. - -``!foreach(a, b, c)`` - For each member of dag or list 'b' apply operator 'c'. 'a' is the name - of a variable that will be substituted by members of 'b' in 'c'. - This operation is analogous to $(foreach) in GNU make. - -``!foldl(start, lst, a, b, expr)`` - Perform a left-fold over 'lst' with the given starting value. 'a' and 'b' - are variable names which will be substituted in 'expr'. If you think of - expr as a function f(a,b), the fold will compute - 'f(...f(f(start, lst[0]), lst[1]), ...), lst[n-1])' for a list of length n. - As usual, 'a' will be of the type of 'start', and 'b' will be of the type - of elements of 'lst'. These types need not be the same, but 'expr' must be - of the same type as 'start'. - -``!head(a)`` - The first element of list 'a.' - -``!tail(a)`` - The 2nd-N elements of list 'a.' - -``!empty(a)`` - An integer {0,1} indicating whether list 'a' is empty. - -``!size(a)`` - An integer indicating the number of elements in list 'a'. - -``!if(a,b,c)`` - 'b' if the result of 'int' or 'bit' operator 'a' is nonzero, 'c' otherwise. - -``!eq(a,b)`` - 'bit 1' if string a is equal to string b, 0 otherwise. This only operates - on string, int and bit objects. Use !cast<string> to compare other types of - objects. - -``!ne(a,b)`` - The negation of ``!eq(a,b)``. - -``!le(a,b), !lt(a,b), !ge(a,b), !gt(a,b)`` - (Signed) comparison of integer values that returns bit 1 or 0 depending on - the result of the comparison. - -``!shl(a,b)`` ``!srl(a,b)`` ``!sra(a,b)`` - The usual shift operators. Operations are on 64-bit integers, the result - is undefined for shift counts outside [0, 63]. - -``!add(a,b,...)`` ``!and(a,b,...)`` ``!or(a,b,...)`` - The usual arithmetic and binary operators. - -Note that all of the values have rules specifying how they convert to values -for different types. These rules allow you to assign a value like "``7``" -to a "``bits<4>``" value, for example. - -Classes and definitions ------------------------ - -As mentioned in the :doc:`introduction <index>`, classes and definitions (collectively known as -'records') in TableGen are the main high-level unit of information that TableGen -collects. Records are defined with a ``def`` or ``class`` keyword, the record -name, and an optional list of "`template arguments`_". If the record has -superclasses, they are specified as a comma separated list that starts with a -colon character ("``:``"). If `value definitions`_ or `let expressions`_ are -needed for the class, they are enclosed in curly braces ("``{}``"); otherwise, -the record ends with a semicolon. - -Here is a simple TableGen file: - -.. code-block:: text - - class C { bit V = 1; } - def X : C; - def Y : C { - string Greeting = "hello"; - } - -This example defines two definitions, ``X`` and ``Y``, both of which derive from -the ``C`` class. Because of this, they both get the ``V`` bit value. The ``Y`` -definition also gets the Greeting member as well. - -In general, classes are useful for collecting together the commonality between a -group of records and isolating it in a single place. Also, classes permit the -specification of default values for their subclasses, allowing the subclasses to -override them as they wish. - -.. _value definition: -.. _value definitions: - -Value definitions -^^^^^^^^^^^^^^^^^ - -Value definitions define named entries in records. A value must be defined -before it can be referred to as the operand for another value definition or -before the value is reset with a `let expression`_. A value is defined by -specifying a `TableGen type`_ and a name. If an initial value is available, it -may be specified after the type with an equal sign. Value definitions require -terminating semicolons. - -.. _let expression: -.. _let expressions: -.. _"let" expressions within a record: - -'let' expressions -^^^^^^^^^^^^^^^^^ - -A record-level let expression is used to change the value of a value definition -in a record. This is primarily useful when a superclass defines a value that a -derived class or definition wants to override. Let expressions consist of the -'``let``' keyword followed by a value name, an equal sign ("``=``"), and a new -value. For example, a new class could be added to the example above, redefining -the ``V`` field for all of its subclasses: - -.. code-block:: text - - class D : C { let V = 0; } - def Z : D; - -In this case, the ``Z`` definition will have a zero value for its ``V`` value, -despite the fact that it derives (indirectly) from the ``C`` class, because the -``D`` class overrode its value. - -References between variables in a record are substituted late, which gives -``let`` expressions unusual power. Consider this admittedly silly example: - -.. code-block:: text - - class A<int x> { - int Y = x; - int Yplus1 = !add(Y, 1); - int xplus1 = !add(x, 1); - } - def Z : A<5> { - let Y = 10; - } - -The value of ``Z.xplus1`` will be 6, but the value of ``Z.Yplus1`` is 11. Use -this power wisely. - -.. _template arguments: - -Class template arguments -^^^^^^^^^^^^^^^^^^^^^^^^ - -TableGen permits the definition of parameterized classes as well as normal -concrete classes. Parameterized TableGen classes specify a list of variable -bindings (which may optionally have defaults) that are bound when used. Here is -a simple example: - -.. code-block:: text - - class FPFormat<bits<3> val> { - bits<3> Value = val; - } - def NotFP : FPFormat<0>; - def ZeroArgFP : FPFormat<1>; - def OneArgFP : FPFormat<2>; - def OneArgFPRW : FPFormat<3>; - def TwoArgFP : FPFormat<4>; - def CompareFP : FPFormat<5>; - def CondMovFP : FPFormat<6>; - def SpecialFP : FPFormat<7>; - -In this case, template arguments are used as a space efficient way to specify a -list of "enumeration values", each with a "``Value``" field set to the specified -integer. - -The more esoteric forms of `TableGen expressions`_ are useful in conjunction -with template arguments. As an example: - -.. code-block:: text - - class ModRefVal<bits<2> val> { - bits<2> Value = val; - } - - def None : ModRefVal<0>; - def Mod : ModRefVal<1>; - def Ref : ModRefVal<2>; - def ModRef : ModRefVal<3>; - - class Value<ModRefVal MR> { - // Decode some information into a more convenient format, while providing - // a nice interface to the user of the "Value" class. - bit isMod = MR.Value{0}; - bit isRef = MR.Value{1}; - - // other stuff... - } - - // Example uses - def bork : Value<Mod>; - def zork : Value<Ref>; - def hork : Value<ModRef>; - -This is obviously a contrived example, but it shows how template arguments can -be used to decouple the interface provided to the user of the class from the -actual internal data representation expected by the class. In this case, -running ``llvm-tblgen`` on the example prints the following definitions: - -.. code-block:: text - - def bork { // Value - bit isMod = 1; - bit isRef = 0; - } - def hork { // Value - bit isMod = 1; - bit isRef = 1; - } - def zork { // Value - bit isMod = 0; - bit isRef = 1; - } - -This shows that TableGen was able to dig into the argument and extract a piece -of information that was requested by the designer of the "Value" class. For -more realistic examples, please see existing users of TableGen, such as the X86 -backend. - -Multiclass definitions and instances -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -While classes with template arguments are a good way to factor commonality -between two instances of a definition, multiclasses allow a convenient notation -for defining multiple definitions at once (instances of implicitly constructed -classes). For example, consider an 3-address instruction set whose instructions -come in two forms: "``reg = reg op reg``" and "``reg = reg op imm``" -(e.g. SPARC). In this case, you'd like to specify in one place that this -commonality exists, then in a separate place indicate what all the ops are. - -Here is an example TableGen fragment that shows this idea: - -.. code-block:: text - - def ops; - def GPR; - def Imm; - class inst<int opc, string asmstr, dag operandlist>; - - multiclass ri_inst<int opc, string asmstr> { - def _rr : inst<opc, !strconcat(asmstr, " $dst, $src1, $src2"), - (ops GPR:$dst, GPR:$src1, GPR:$src2)>; - def _ri : inst<opc, !strconcat(asmstr, " $dst, $src1, $src2"), - (ops GPR:$dst, GPR:$src1, Imm:$src2)>; - } - - // Instantiations of the ri_inst multiclass. - defm ADD : ri_inst<0b111, "add">; - defm SUB : ri_inst<0b101, "sub">; - defm MUL : ri_inst<0b100, "mul">; - ... - -The name of the resultant definitions has the multidef fragment names appended -to them, so this defines ``ADD_rr``, ``ADD_ri``, ``SUB_rr``, etc. A defm may -inherit from multiple multiclasses, instantiating definitions from each -multiclass. Using a multiclass this way is exactly equivalent to instantiating -the classes multiple times yourself, e.g. by writing: - -.. code-block:: text - - def ops; - def GPR; - def Imm; - class inst<int opc, string asmstr, dag operandlist>; - - class rrinst<int opc, string asmstr> - : inst<opc, !strconcat(asmstr, " $dst, $src1, $src2"), - (ops GPR:$dst, GPR:$src1, GPR:$src2)>; - - class riinst<int opc, string asmstr> - : inst<opc, !strconcat(asmstr, " $dst, $src1, $src2"), - (ops GPR:$dst, GPR:$src1, Imm:$src2)>; - - // Instantiations of the ri_inst multiclass. - def ADD_rr : rrinst<0b111, "add">; - def ADD_ri : riinst<0b111, "add">; - def SUB_rr : rrinst<0b101, "sub">; - def SUB_ri : riinst<0b101, "sub">; - def MUL_rr : rrinst<0b100, "mul">; - def MUL_ri : riinst<0b100, "mul">; - ... - -A ``defm`` can also be used inside a multiclass providing several levels of -multiclass instantiations. - -.. code-block:: text - - class Instruction<bits<4> opc, string Name> { - bits<4> opcode = opc; - string name = Name; - } - - multiclass basic_r<bits<4> opc> { - def rr : Instruction<opc, "rr">; - def rm : Instruction<opc, "rm">; - } - - multiclass basic_s<bits<4> opc> { - defm SS : basic_r<opc>; - defm SD : basic_r<opc>; - def X : Instruction<opc, "x">; - } - - multiclass basic_p<bits<4> opc> { - defm PS : basic_r<opc>; - defm PD : basic_r<opc>; - def Y : Instruction<opc, "y">; - } - - defm ADD : basic_s<0xf>, basic_p<0xf>; - ... - - // Results - def ADDPDrm { ... - def ADDPDrr { ... - def ADDPSrm { ... - def ADDPSrr { ... - def ADDSDrm { ... - def ADDSDrr { ... - def ADDY { ... - def ADDX { ... - -``defm`` declarations can inherit from classes too, the rule to follow is that -the class list must start after the last multiclass, and there must be at least -one multiclass before them. - -.. code-block:: text - - class XD { bits<4> Prefix = 11; } - class XS { bits<4> Prefix = 12; } - - class I<bits<4> op> { - bits<4> opcode = op; - } - - multiclass R { - def rr : I<4>; - def rm : I<2>; - } - - multiclass Y { - defm SS : R, XD; - defm SD : R, XS; - } - - defm Instr : Y; - - // Results - def InstrSDrm { - bits<4> opcode = { 0, 0, 1, 0 }; - bits<4> Prefix = { 1, 1, 0, 0 }; - } - ... - def InstrSSrr { - bits<4> opcode = { 0, 1, 0, 0 }; - bits<4> Prefix = { 1, 0, 1, 1 }; - } - -File scope entities -------------------- - -File inclusion -^^^^^^^^^^^^^^ - -TableGen supports the '``include``' token, which textually substitutes the -specified file in place of the include directive. The filename should be -specified as a double quoted string immediately after the '``include``' keyword. -Example: - -.. code-block:: text - - include "foo.td" - -'let' expressions -^^^^^^^^^^^^^^^^^ - -"Let" expressions at file scope are similar to `"let" expressions within a -record`_, except they can specify a value binding for multiple records at a -time, and may be useful in certain other cases. File-scope let expressions are -really just another way that TableGen allows the end-user to factor out -commonality from the records. - -File-scope "let" expressions take a comma-separated list of bindings to apply, -and one or more records to bind the values in. Here are some examples: - -.. code-block:: text - - let isTerminator = 1, isReturn = 1, isBarrier = 1, hasCtrlDep = 1 in - def RET : I<0xC3, RawFrm, (outs), (ins), "ret", [(X86retflag 0)]>; - - let isCall = 1 in - // All calls clobber the non-callee saved registers... - let Defs = [EAX, ECX, EDX, FP0, FP1, FP2, FP3, FP4, FP5, FP6, ST0, - MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7, - XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, EFLAGS] in { - def CALLpcrel32 : Ii32<0xE8, RawFrm, (outs), (ins i32imm:$dst,variable_ops), - "call\t${dst:call}", []>; - def CALL32r : I<0xFF, MRM2r, (outs), (ins GR32:$dst, variable_ops), - "call\t{*}$dst", [(X86call GR32:$dst)]>; - def CALL32m : I<0xFF, MRM2m, (outs), (ins i32mem:$dst, variable_ops), - "call\t{*}$dst", []>; - } - -File-scope "let" expressions are often useful when a couple of definitions need -to be added to several records, and the records do not otherwise need to be -opened, as in the case with the ``CALL*`` instructions above. - -It's also possible to use "let" expressions inside multiclasses, providing more -ways to factor out commonality from the records, specially if using several -levels of multiclass instantiations. This also avoids the need of using "let" -expressions within subsequent records inside a multiclass. - -.. code-block:: text - - multiclass basic_r<bits<4> opc> { - let Predicates = [HasSSE2] in { - def rr : Instruction<opc, "rr">; - def rm : Instruction<opc, "rm">; - } - let Predicates = [HasSSE3] in - def rx : Instruction<opc, "rx">; - } - - multiclass basic_ss<bits<4> opc> { - let IsDouble = 0 in - defm SS : basic_r<opc>; - - let IsDouble = 1 in - defm SD : basic_r<opc>; - } - - defm ADD : basic_ss<0xf>; - -Looping -^^^^^^^ - -TableGen supports the '``foreach``' block, which textually replicates the loop -body, substituting iterator values for iterator references in the body. -Example: - -.. code-block:: text - - foreach i = [0, 1, 2, 3] in { - def R#i : Register<...>; - def F#i : Register<...>; - } - -This will create objects ``R0``, ``R1``, ``R2`` and ``R3``. ``foreach`` blocks -may be nested. If there is only one item in the body the braces may be -elided: - -.. code-block:: text - - foreach i = [0, 1, 2, 3] in - def R#i : Register<...>; - -Code Generator backend info -=========================== - -Expressions used by code generator to describe instructions and isel patterns: - -``(implicit a)`` - an implicitly defined physical register. This tells the dag instruction - selection emitter the input pattern's extra definitions matches implicit - physical register definitions. - diff --git a/gnu/llvm/docs/TableGen/LangRef.rst b/gnu/llvm/docs/TableGen/LangRef.rst deleted file mode 100644 index 2efee12ec9d..00000000000 --- a/gnu/llvm/docs/TableGen/LangRef.rst +++ /dev/null @@ -1,497 +0,0 @@ -=========================== -TableGen Language Reference -=========================== - -.. contents:: - :local: - -.. warning:: - This document is extremely rough. If you find something lacking, please - fix it, file a documentation bug, or ask about it on llvm-dev. - -Introduction -============ - -This document is meant to be a normative spec about the TableGen language -in and of itself (i.e. how to understand a given construct in terms of how -it affects the final set of records represented by the TableGen file). If -you are unsure if this document is really what you are looking for, please -read the :doc:`introduction to TableGen <index>` first. - -Notation -======== - -The lexical and syntax notation used here is intended to imitate -`Python's`_. In particular, for lexical definitions, the productions -operate at the character level and there is no implied whitespace between -elements. The syntax definitions operate at the token level, so there is -implied whitespace between tokens. - -.. _`Python's`: http://docs.python.org/py3k/reference/introduction.html#notation - -Lexical Analysis -================ - -TableGen supports BCPL (``// ...``) and nestable C-style (``/* ... */``) -comments. TableGen also provides simple `Preprocessing Support`_. - -The following is a listing of the basic punctuation tokens:: - - - + [ ] { } ( ) < > : ; . = ? # - -Numeric literals take one of the following forms: - -.. TableGen actually will lex some pretty strange sequences an interpret - them as numbers. What is shown here is an attempt to approximate what it - "should" accept. - -.. productionlist:: - TokInteger: `DecimalInteger` | `HexInteger` | `BinInteger` - DecimalInteger: ["+" | "-"] ("0"..."9")+ - HexInteger: "0x" ("0"..."9" | "a"..."f" | "A"..."F")+ - BinInteger: "0b" ("0" | "1")+ - -One aspect to note is that the :token:`DecimalInteger` token *includes* the -``+`` or ``-``, as opposed to having ``+`` and ``-`` be unary operators as -most languages do. - -Also note that :token:`BinInteger` creates a value of type ``bits<n>`` -(where ``n`` is the number of bits). This will implicitly convert to -integers when needed. - -TableGen has identifier-like tokens: - -.. productionlist:: - ualpha: "a"..."z" | "A"..."Z" | "_" - TokIdentifier: ("0"..."9")* `ualpha` (`ualpha` | "0"..."9")* - TokVarName: "$" `ualpha` (`ualpha` | "0"..."9")* - -Note that unlike most languages, TableGen allows :token:`TokIdentifier` to -begin with a number. In case of ambiguity, a token will be interpreted as a -numeric literal rather than an identifier. - -TableGen also has two string-like literals: - -.. productionlist:: - TokString: '"' <non-'"' characters and C-like escapes> '"' - TokCodeFragment: "[{" <shortest text not containing "}]"> "}]" - -:token:`TokCodeFragment` is essentially a multiline string literal -delimited by ``[{`` and ``}]``. - -.. note:: - The current implementation accepts the following C-like escapes:: - - \\ \' \" \t \n - -TableGen also has the following keywords:: - - bit bits class code dag - def foreach defm field in - int let list multiclass string - -TableGen also has "bang operators" which have a -wide variety of meanings: - -.. productionlist:: - BangOperator: one of - :!eq !if !head !tail !con - :!add !shl !sra !srl !and - :!or !empty !subst !foreach !strconcat - :!cast !listconcat !size !foldl - :!isa !dag !le !lt !ge - :!gt !ne - - -Syntax -====== - -TableGen has an ``include`` mechanism. It does not play a role in the -syntax per se, since it is lexically replaced with the contents of the -included file. - -.. productionlist:: - IncludeDirective: "include" `TokString` - -TableGen's top-level production consists of "objects". - -.. productionlist:: - TableGenFile: `Object`* - Object: `Class` | `Def` | `Defm` | `Defset` | `Let` | `MultiClass` | - `Foreach` - -``class``\es ------------- - -.. productionlist:: - Class: "class" `TokIdentifier` [`TemplateArgList`] `ObjectBody` - TemplateArgList: "<" `Declaration` ("," `Declaration`)* ">" - -A ``class`` declaration creates a record which other records can inherit -from. A class can be parametrized by a list of "template arguments", whose -values can be used in the class body. - -A given class can only be defined once. A ``class`` declaration is -considered to define the class if any of the following is true: - -.. break ObjectBody into its consituents so that they are present here? - -#. The :token:`TemplateArgList` is present. -#. The :token:`Body` in the :token:`ObjectBody` is present and is not empty. -#. The :token:`BaseClassList` in the :token:`ObjectBody` is present. - -You can declare an empty class by giving and empty :token:`TemplateArgList` -and an empty :token:`ObjectBody`. This can serve as a restricted form of -forward declaration: note that records deriving from the forward-declared -class will inherit no fields from it since the record expansion is done -when the record is parsed. - -Every class has an implicit template argument called ``NAME``, which is set -to the name of the instantiating ``def`` or ``defm``. The result is undefined -if the class is instantiated by an anonymous record. - -Declarations ------------- - -.. Omitting mention of arcane "field" prefix to discourage its use. - -The declaration syntax is pretty much what you would expect as a C++ -programmer. - -.. productionlist:: - Declaration: `Type` `TokIdentifier` ["=" `Value`] - -It assigns the value to the identifier. - -Types ------ - -.. productionlist:: - Type: "string" | "code" | "bit" | "int" | "dag" - :| "bits" "<" `TokInteger` ">" - :| "list" "<" `Type` ">" - :| `ClassID` - ClassID: `TokIdentifier` - -Both ``string`` and ``code`` correspond to the string type; the difference -is purely to indicate programmer intention. - -The :token:`ClassID` must identify a class that has been previously -declared or defined. - -Values ------- - -.. productionlist:: - Value: `SimpleValue` `ValueSuffix`* - ValueSuffix: "{" `RangeList` "}" - :| "[" `RangeList` "]" - :| "." `TokIdentifier` - RangeList: `RangePiece` ("," `RangePiece`)* - RangePiece: `TokInteger` - :| `TokInteger` "-" `TokInteger` - :| `TokInteger` `TokInteger` - -The peculiar last form of :token:`RangePiece` is due to the fact that the -"``-``" is included in the :token:`TokInteger`, hence ``1-5`` gets lexed as -two consecutive :token:`TokInteger`'s, with values ``1`` and ``-5``, -instead of "1", "-", and "5". -The :token:`RangeList` can be thought of as specifying "list slice" in some -contexts. - - -:token:`SimpleValue` has a number of forms: - - -.. productionlist:: - SimpleValue: `TokIdentifier` - -The value will be the variable referenced by the identifier. It can be one -of: - -.. The code for this is exceptionally abstruse. These examples are a - best-effort attempt. - -* name of a ``def``, such as the use of ``Bar`` in:: - - def Bar : SomeClass { - int X = 5; - } - - def Foo { - SomeClass Baz = Bar; - } - -* value local to a ``def``, such as the use of ``Bar`` in:: - - def Foo { - int Bar = 5; - int Baz = Bar; - } - - Values defined in superclasses can be accessed the same way. - -* a template arg of a ``class``, such as the use of ``Bar`` in:: - - class Foo<int Bar> { - int Baz = Bar; - } - -* value local to a ``class``, such as the use of ``Bar`` in:: - - class Foo { - int Bar = 5; - int Baz = Bar; - } - -* a template arg to a ``multiclass``, such as the use of ``Bar`` in:: - - multiclass Foo<int Bar> { - def : SomeClass<Bar>; - } - -* the iteration variable of a ``foreach``, such as the use of ``i`` in:: - - foreach i = 0-5 in - def Foo#i; - -* a variable defined by ``defset`` - -* the implicit template argument ``NAME`` in a ``class`` or ``multiclass`` - -.. productionlist:: - SimpleValue: `TokInteger` - -This represents the numeric value of the integer. - -.. productionlist:: - SimpleValue: `TokString`+ - -Multiple adjacent string literals are concatenated like in C/C++. The value -is the concatenation of the strings. - -.. productionlist:: - SimpleValue: `TokCodeFragment` - -The value is the string value of the code fragment. - -.. productionlist:: - SimpleValue: "?" - -``?`` represents an "unset" initializer. - -.. productionlist:: - SimpleValue: "{" `ValueList` "}" - ValueList: [`ValueListNE`] - ValueListNE: `Value` ("," `Value`)* - -This represents a sequence of bits, as would be used to initialize a -``bits<n>`` field (where ``n`` is the number of bits). - -.. productionlist:: - SimpleValue: `ClassID` "<" `ValueListNE` ">" - -This generates a new anonymous record definition (as would be created by an -unnamed ``def`` inheriting from the given class with the given template -arguments) and the value is the value of that record definition. - -.. productionlist:: - SimpleValue: "[" `ValueList` "]" ["<" `Type` ">"] - -A list initializer. The optional :token:`Type` can be used to indicate a -specific element type, otherwise the element type will be deduced from the -given values. - -.. The initial `DagArg` of the dag must start with an identifier or - !cast, but this is more of an implementation detail and so for now just - leave it out. - -.. productionlist:: - SimpleValue: "(" `DagArg` [`DagArgList`] ")" - DagArgList: `DagArg` ("," `DagArg`)* - DagArg: `Value` [":" `TokVarName`] | `TokVarName` - -The initial :token:`DagArg` is called the "operator" of the dag. - -.. productionlist:: - SimpleValue: `BangOperator` ["<" `Type` ">"] "(" `ValueListNE` ")" - -Bodies ------- - -.. productionlist:: - ObjectBody: `BaseClassList` `Body` - BaseClassList: [":" `BaseClassListNE`] - BaseClassListNE: `SubClassRef` ("," `SubClassRef`)* - SubClassRef: (`ClassID` | `MultiClassID`) ["<" `ValueList` ">"] - DefmID: `TokIdentifier` - -The version with the :token:`MultiClassID` is only valid in the -:token:`BaseClassList` of a ``defm``. -The :token:`MultiClassID` should be the name of a ``multiclass``. - -.. put this somewhere else - -It is after parsing the base class list that the "let stack" is applied. - -.. productionlist:: - Body: ";" | "{" BodyList "}" - BodyList: BodyItem* - BodyItem: `Declaration` ";" - :| "let" `TokIdentifier` [ "{" `RangeList` "}" ] "=" `Value` ";" - -The ``let`` form allows overriding the value of an inherited field. - -``def`` -------- - -.. productionlist:: - Def: "def" [`Value`] `ObjectBody` - -Defines a record whose name is given by the optional :token:`Value`. The value -is parsed in a special mode where global identifiers (records and variables -defined by ``defset``) are not recognized, and all unrecognized identifiers -are interpreted as strings. - -If no name is given, the record is anonymous. The final name of anonymous -records is undefined, but globally unique. - -Special handling occurs if this ``def`` appears inside a ``multiclass`` or -a ``foreach``. - -When a non-anonymous record is defined in a multiclass and the given name -does not contain a reference to the implicit template argument ``NAME``, such -a reference will automatically be prepended. That is, the following are -equivalent inside a multiclass:: - - def Foo; - def NAME#Foo; - -``defm`` --------- - -.. productionlist:: - Defm: "defm" [`Value`] ":" `BaseClassListNE` ";" - -The :token:`BaseClassList` is a list of at least one ``multiclass`` and any -number of ``class``'s. The ``multiclass``'s must occur before any ``class``'s. - -Instantiates all records defined in all given ``multiclass``'s and adds the -given ``class``'s as superclasses. - -The name is parsed in the same special mode used by ``def``. If the name is -missing, a globally unique string is used instead (but instantiated records -are not considered to be anonymous, unless they were originally defined by an -anonymous ``def``) That is, the following have different semantics:: - - defm : SomeMultiClass<...>; // some globally unique name - defm "" : SomeMultiClass<...>; // empty name string - -When it occurs inside a multiclass, the second variant is equivalent to -``defm NAME : ...``. More generally, when ``defm`` occurs in a multiclass and -its name does not contain a reference to the implicit template argument -``NAME``, such a reference will automatically be prepended. That is, the -following are equivalent inside a multiclass:: - - defm Foo : SomeMultiClass<...>; - defm NAME#Foo : SomeMultiClass<...>; - -``defset`` ----------- -.. productionlist:: - Defset: "defset" `Type` `TokIdentifier` "=" "{" `Object`* "}" - -All records defined inside the braces via ``def`` and ``defm`` are collected -in a globally accessible list of the given name (in addition to being added -to the global collection of records as usual). Anonymous records created inside -initializier expressions using the ``Class<args...>`` syntax are never collected -in a defset. - -The given type must be ``list<A>``, where ``A`` is some class. It is an error -to define a record (via ``def`` or ``defm``) inside the braces which doesn't -derive from ``A``. - -``foreach`` ------------ - -.. productionlist:: - Foreach: "foreach" `ForeachDeclaration` "in" "{" `Object`* "}" - :| "foreach" `ForeachDeclaration` "in" `Object` - ForeachDeclaration: ID "=" ( "{" `RangeList` "}" | `RangePiece` | `Value` ) - -The value assigned to the variable in the declaration is iterated over and -the object or object list is reevaluated with the variable set at each -iterated value. - -Note that the productions involving RangeList and RangePiece have precedence -over the more generic value parsing based on the first token. - -Top-Level ``let`` ------------------ - -.. productionlist:: - Let: "let" `LetList` "in" "{" `Object`* "}" - :| "let" `LetList` "in" `Object` - LetList: `LetItem` ("," `LetItem`)* - LetItem: `TokIdentifier` [`RangeList`] "=" `Value` - -This is effectively equivalent to ``let`` inside the body of a record -except that it applies to multiple records at a time. The bindings are -applied at the end of parsing the base classes of a record. - -``multiclass`` --------------- - -.. productionlist:: - MultiClass: "multiclass" `TokIdentifier` [`TemplateArgList`] - : [":" `BaseMultiClassList`] "{" `MultiClassObject`+ "}" - BaseMultiClassList: `MultiClassID` ("," `MultiClassID`)* - MultiClassID: `TokIdentifier` - MultiClassObject: `Def` | `Defm` | `Let` | `Foreach` - -Preprocessing Support -===================== - -TableGen's embedded preprocessor is only intended for conditional compilation. -It supports the following directives: - -.. productionlist:: - LineBegin: ^ - LineEnd: "\n" | "\r" | EOF - WhiteSpace: " " | "\t" - CStyleComment: "/*" (.* - "*/") "*/" - BCPLComment: "//" (.* - `LineEnd`) `LineEnd` - WhiteSpaceOrCStyleComment: `WhiteSpace` | `CStyleComment` - WhiteSpaceOrAnyComment: `WhiteSpace` | `CStyleComment` | `BCPLComment` - MacroName: `ualpha` (`ualpha` | "0"..."9")* - PrepDefine: `LineBegin` (`WhiteSpaceOrCStyleComment`)* - : "#define" (`WhiteSpace`)+ `MacroName` - : (`WhiteSpaceOrAnyComment`)* `LineEnd` - PrepIfdef: `LineBegin` (`WhiteSpaceOrCStyleComment`)* - : "#ifdef" (`WhiteSpace`)+ `MacroName` - : (`WhiteSpaceOrAnyComment`)* `LineEnd` - PrepElse: `LineBegin` (`WhiteSpaceOrCStyleComment`)* - : "#else" (`WhiteSpaceOrAnyComment`)* `LineEnd` - PrepEndif: `LineBegin` (`WhiteSpaceOrCStyleComment`)* - : "#endif" (`WhiteSpaceOrAnyComment`)* `LineEnd` - PrepRegContentException: `PredIfdef` | `PredElse` | `PredEndif` | EOF - PrepRegion: .* - `PrepRegContentException` - :| `PrepIfDef` - : (`PrepRegion`)* - : [`PrepElse`] - : (`PrepRegion`)* - : `PrepEndif` - -:token:`PrepRegion` may occur anywhere in a TD file, as long as it matches -the grammar specification. - -:token:`PrepDefine` allows defining a :token:`MacroName` so that any following -:token:`PrepIfdef` - :token:`PrepElse` preprocessing region part and -:token:`PrepIfdef` - :token:`PrepEndif` preprocessing region -are enabled for TableGen tokens parsing. - -A preprocessing region, starting (i.e. having its :token:`PrepIfdef`) in a file, -must end (i.e. have its :token:`PrepEndif`) in the same file. - -A :token:`MacroName` may be defined externally by using ``{ -D<NAME> }`` -option of TableGen. diff --git a/gnu/llvm/docs/TableGen/index.rst b/gnu/llvm/docs/TableGen/index.rst deleted file mode 100644 index 0697bd0298e..00000000000 --- a/gnu/llvm/docs/TableGen/index.rst +++ /dev/null @@ -1,304 +0,0 @@ -======== -TableGen -======== - -.. contents:: - :local: - -.. toctree:: - :hidden: - - BackEnds - LangRef - LangIntro - Deficiencies - -Introduction -============ - -TableGen's purpose is to help a human develop and maintain records of -domain-specific information. Because there may be a large number of these -records, it is specifically designed to allow writing flexible descriptions and -for common features of these records to be factored out. This reduces the -amount of duplication in the description, reduces the chance of error, and makes -it easier to structure domain specific information. - -The core part of TableGen parses a file, instantiates the declarations, and -hands the result off to a domain-specific `backend`_ for processing. - -The current major users of TableGen are :doc:`../CodeGenerator` -and the -`Clang diagnostics and attributes <http://clang.llvm.org/docs/UsersManual.html#controlling-errors-and-warnings>`_. - -Note that if you work on TableGen much, and use emacs or vim, that you can find -an emacs "TableGen mode" and a vim language file in the ``llvm/utils/emacs`` and -``llvm/utils/vim`` directories of your LLVM distribution, respectively. - -.. _intro: - - -The TableGen program -==================== - -TableGen files are interpreted by the TableGen program: `llvm-tblgen` available -on your build directory under `bin`. It is not installed in the system (or where -your sysroot is set to), since it has no use beyond LLVM's build process. - -Running TableGen ----------------- - -TableGen runs just like any other LLVM tool. The first (optional) argument -specifies the file to read. If a filename is not specified, ``llvm-tblgen`` -reads from standard input. - -To be useful, one of the `backends`_ must be used. These backends are -selectable on the command line (type '``llvm-tblgen -help``' for a list). For -example, to get a list of all of the definitions that subclass a particular type -(which can be useful for building up an enum list of these records), use the -``-print-enums`` option: - -.. code-block:: bash - - $ llvm-tblgen X86.td -print-enums -class=Register - AH, AL, AX, BH, BL, BP, BPL, BX, CH, CL, CX, DH, DI, DIL, DL, DX, EAX, EBP, EBX, - ECX, EDI, EDX, EFLAGS, EIP, ESI, ESP, FP0, FP1, FP2, FP3, FP4, FP5, FP6, IP, - MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7, R10, R10B, R10D, R10W, R11, R11B, R11D, - R11W, R12, R12B, R12D, R12W, R13, R13B, R13D, R13W, R14, R14B, R14D, R14W, R15, - R15B, R15D, R15W, R8, R8B, R8D, R8W, R9, R9B, R9D, R9W, RAX, RBP, RBX, RCX, RDI, - RDX, RIP, RSI, RSP, SI, SIL, SP, SPL, ST0, ST1, ST2, ST3, ST4, ST5, ST6, ST7, - XMM0, XMM1, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, XMM2, XMM3, XMM4, XMM5, - XMM6, XMM7, XMM8, XMM9, - - $ llvm-tblgen X86.td -print-enums -class=Instruction - ABS_F, ABS_Fp32, ABS_Fp64, ABS_Fp80, ADC32mi, ADC32mi8, ADC32mr, ADC32ri, - ADC32ri8, ADC32rm, ADC32rr, ADC64mi32, ADC64mi8, ADC64mr, ADC64ri32, ADC64ri8, - ADC64rm, ADC64rr, ADD16mi, ADD16mi8, ADD16mr, ADD16ri, ADD16ri8, ADD16rm, - ADD16rr, ADD32mi, ADD32mi8, ADD32mr, ADD32ri, ADD32ri8, ADD32rm, ADD32rr, - ADD64mi32, ADD64mi8, ADD64mr, ADD64ri32, ... - -The default backend prints out all of the records. There is also a general -backend which outputs all the records as a JSON data structure, enabled using -the `-dump-json` option. - -If you plan to use TableGen, you will most likely have to write a `backend`_ -that extracts the information specific to what you need and formats it in the -appropriate way. You can do this by extending TableGen itself in C++, or by -writing a script in any language that can consume the JSON output. - -Example -------- - -With no other arguments, `llvm-tblgen` parses the specified file and prints out all -of the classes, then all of the definitions. This is a good way to see what the -various definitions expand to fully. Running this on the ``X86.td`` file prints -this (at the time of this writing): - -.. code-block:: text - - ... - def ADD32rr { // Instruction X86Inst I - string Namespace = "X86"; - dag OutOperandList = (outs GR32:$dst); - dag InOperandList = (ins GR32:$src1, GR32:$src2); - string AsmString = "add{l}\t{$src2, $dst|$dst, $src2}"; - list<dag> Pattern = [(set GR32:$dst, (add GR32:$src1, GR32:$src2))]; - list<Register> Uses = []; - list<Register> Defs = [EFLAGS]; - list<Predicate> Predicates = []; - int CodeSize = 3; - int AddedComplexity = 0; - bit isReturn = 0; - bit isBranch = 0; - bit isIndirectBranch = 0; - bit isBarrier = 0; - bit isCall = 0; - bit canFoldAsLoad = 0; - bit mayLoad = 0; - bit mayStore = 0; - bit isImplicitDef = 0; - bit isConvertibleToThreeAddress = 1; - bit isCommutable = 1; - bit isTerminator = 0; - bit isReMaterializable = 0; - bit isPredicable = 0; - bit hasDelaySlot = 0; - bit usesCustomInserter = 0; - bit hasCtrlDep = 0; - bit isNotDuplicable = 0; - bit hasSideEffects = 0; - InstrItinClass Itinerary = NoItinerary; - string Constraints = ""; - string DisableEncoding = ""; - bits<8> Opcode = { 0, 0, 0, 0, 0, 0, 0, 1 }; - Format Form = MRMDestReg; - bits<6> FormBits = { 0, 0, 0, 0, 1, 1 }; - ImmType ImmT = NoImm; - bits<3> ImmTypeBits = { 0, 0, 0 }; - bit hasOpSizePrefix = 0; - bit hasAdSizePrefix = 0; - bits<4> Prefix = { 0, 0, 0, 0 }; - bit hasREX_WPrefix = 0; - FPFormat FPForm = ?; - bits<3> FPFormBits = { 0, 0, 0 }; - } - ... - -This definition corresponds to the 32-bit register-register ``add`` instruction -of the x86 architecture. ``def ADD32rr`` defines a record named -``ADD32rr``, and the comment at the end of the line indicates the superclasses -of the definition. The body of the record contains all of the data that -TableGen assembled for the record, indicating that the instruction is part of -the "X86" namespace, the pattern indicating how the instruction is selected by -the code generator, that it is a two-address instruction, has a particular -encoding, etc. The contents and semantics of the information in the record are -specific to the needs of the X86 backend, and are only shown as an example. - -As you can see, a lot of information is needed for every instruction supported -by the code generator, and specifying it all manually would be unmaintainable, -prone to bugs, and tiring to do in the first place. Because we are using -TableGen, all of the information was derived from the following definition: - -.. code-block:: text - - let Defs = [EFLAGS], - isCommutable = 1, // X = ADD Y,Z --> X = ADD Z,Y - isConvertibleToThreeAddress = 1 in // Can transform into LEA. - def ADD32rr : I<0x01, MRMDestReg, (outs GR32:$dst), - (ins GR32:$src1, GR32:$src2), - "add{l}\t{$src2, $dst|$dst, $src2}", - [(set GR32:$dst, (add GR32:$src1, GR32:$src2))]>; - -This definition makes use of the custom class ``I`` (extended from the custom -class ``X86Inst``), which is defined in the X86-specific TableGen file, to -factor out the common features that instructions of its class share. A key -feature of TableGen is that it allows the end-user to define the abstractions -they prefer to use when describing their information. - -Syntax -====== - -TableGen has a syntax that is loosely based on C++ templates, with built-in -types and specification. In addition, TableGen's syntax introduces some -automation concepts like multiclass, foreach, let, etc. - -Basic concepts --------------- - -TableGen files consist of two key parts: 'classes' and 'definitions', both of -which are considered 'records'. - -**TableGen records** have a unique name, a list of values, and a list of -superclasses. The list of values is the main data that TableGen builds for each -record; it is this that holds the domain specific information for the -application. The interpretation of this data is left to a specific `backend`_, -but the structure and format rules are taken care of and are fixed by -TableGen. - -**TableGen definitions** are the concrete form of 'records'. These generally do -not have any undefined values, and are marked with the '``def``' keyword. - -.. code-block:: text - - def FeatureFPARMv8 : SubtargetFeature<"fp-armv8", "HasFPARMv8", "true", - "Enable ARMv8 FP">; - -In this example, FeatureFPARMv8 is ``SubtargetFeature`` record initialised -with some values. The names of the classes are defined via the -keyword `class` either on the same file or some other included. Most target -TableGen files include the generic ones in ``include/llvm/Target``. - -**TableGen classes** are abstract records that are used to build and describe -other records. These classes allow the end-user to build abstractions for -either the domain they are targeting (such as "Register", "RegisterClass", and -"Instruction" in the LLVM code generator) or for the implementor to help factor -out common properties of records (such as "FPInst", which is used to represent -floating point instructions in the X86 backend). TableGen keeps track of all of -the classes that are used to build up a definition, so the backend can find all -definitions of a particular class, such as "Instruction". - -.. code-block:: text - - class ProcNoItin<string Name, list<SubtargetFeature> Features> - : Processor<Name, NoItineraries, Features>; - -Here, the class ProcNoItin, receiving parameters `Name` of type `string` and -a list of target features is specializing the class Processor by passing the -arguments down as well as hard-coding NoItineraries. - -**TableGen multiclasses** are groups of abstract records that are instantiated -all at once. Each instantiation can result in multiple TableGen definitions. -If a multiclass inherits from another multiclass, the definitions in the -sub-multiclass become part of the current multiclass, as if they were declared -in the current multiclass. - -.. code-block:: text - - multiclass ro_signed_pats<string T, string Rm, dag Base, dag Offset, dag Extend, - dag address, ValueType sty> { - def : Pat<(i32 (!cast<SDNode>("sextload" # sty) address)), - (!cast<Instruction>("LDRS" # T # "w_" # Rm # "_RegOffset") - Base, Offset, Extend)>; - - def : Pat<(i64 (!cast<SDNode>("sextload" # sty) address)), - (!cast<Instruction>("LDRS" # T # "x_" # Rm # "_RegOffset") - Base, Offset, Extend)>; - } - - defm : ro_signed_pats<"B", Rm, Base, Offset, Extend, - !foreach(decls.pattern, address, - !subst(SHIFT, imm_eq0, decls.pattern)), - i8>; - - - -See the :doc:`TableGen Language Introduction <LangIntro>` for more generic -information on the usage of the language, and the -:doc:`TableGen Language Reference <LangRef>` for more in-depth description -of the formal language specification. - -.. _backend: -.. _backends: - -TableGen backends -================= - -TableGen files have no real meaning without a back-end. The default operation -of running ``llvm-tblgen`` is to print the information in a textual format, but -that's only useful for debugging of the TableGen files themselves. The power -in TableGen is, however, to interpret the source files into an internal -representation that can be generated into anything you want. - -Current usage of TableGen is to create huge include files with tables that you -can either include directly (if the output is in the language you're coding), -or be used in pre-processing via macros surrounding the include of the file. - -Direct output can be used if the back-end already prints a table in C format -or if the output is just a list of strings (for error and warning messages). -Pre-processed output should be used if the same information needs to be used -in different contexts (like Instruction names), so your back-end should print -a meta-information list that can be shaped into different compile-time formats. - -See the `TableGen BackEnds <BackEnds.html>`_ for more information. - -TableGen Deficiencies -===================== - -Despite being very generic, TableGen has some deficiencies that have been -pointed out numerous times. The common theme is that, while TableGen allows -you to build Domain-Specific-Languages, the final languages that you create -lack the power of other DSLs, which in turn increase considerably the size -and complexity of TableGen files. - -At the same time, TableGen allows you to create virtually any meaning of -the basic concepts via custom-made back-ends, which can pervert the original -design and make it very hard for newcomers to understand the evil TableGen -file. - -There are some in favour of extending the semantics even more, but making sure -back-ends adhere to strict rules. Others are suggesting we should move to less, -more powerful DSLs designed with specific purposes, or even re-using existing -DSLs. - -Either way, this is a discussion that will likely span across several years, -if not decades. You can read more in the `TableGen Deficiencies <Deficiencies.html>`_ -document. |
