=================
TableGen BackEnds
=================

.. contents::
   :local:

Introduction
============

TableGen backends are at the core of TableGen's functionality. The source
files provide the classes and records that are parsed and end up as a
collection of record instances, but it's up to the backend to interpret and
print the records in a way that is meaningful to the user (normally a C++
include file or a textual list of warnings, options, and error messages).

TableGen is used by both LLVM, Clang, and MLIR 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 makes it is easy for
preprocessor tricks to be used. 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.

MLIR uses TableGen to define operations, operation dialects, and operation
traits.

See the :doc:`TableGen Programmer's Reference <./ProgRef>` for an in-depth
description of TableGen, and the :doc:`TableGen Backend Developer's Guide
<./BackGuide>` for a guide to writing a new backend.

LLVM BackEnds
=============

.. warning::
   This portion is incomplete. Each section below needs three subsections:
   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.

See `SearchableTables Reference`_ for a detailed description.

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
================

Print Records
-------------

The TableGen command option ``--print-records`` invokes a simple backend
that prints all the classes and records defined in the source files. This is
the default backend option. See the :doc:`TableGen Backend Developer's Guide
<./BackGuide>` for more information.

Print Detailed Records
----------------------

The TableGen command option ``--print-detailed-records`` invokes a backend
that prints all the global variables, classes, and records defined in the
source files, with more detail than the default record printer. See the
:doc:`TableGen Backend Developer's Guide <./BackGuide>` for more
information.

JSON Reference
--------------

**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.

SearchableTables Reference
--------------------------

A TableGen include file, ``SearchableTable.td``, provides classes for
generating C++ searchable tables. These tables are described in the
following sections. To generate the C++ code, run ``llvm-tblgen`` with the
``--gen-searchable-tables`` option, which invokes the backend that generates
the tables from the records you provide.

Each of the data structures generated for searchable tables is guarded by an
``#ifdef``. This allows you to include the generated ``.inc`` file and select only
certain data structures for inclusion. The examples below show the macro
names used in these guards.

Generic Enumerated Types
~~~~~~~~~~~~~~~~~~~~~~~~

The ``GenericEnum`` class makes it easy to define a C++ enumerated type and
the enumerated *elements* of that type. To define the type, define a record
whose parent class is ``GenericEnum`` and whose name is the desired enum
type. This class provides three fields, which you can set in the record
using the ``let`` statement.

* ``string FilterClass``. The enum type will have one element for each record
  that derives from this class. These records are collected to assemble the
  complete set of elements.

* ``string NameField``. The name of a field *in the collected records* that specifies
  the name of the element. If a record has no such field, the record's
  name will be used.

* ``string ValueField``. The name of a field *in the collected records* that
  specifies the numerical value of the element. If a record has no such
  field, it will be assigned an integer value. Values are assigned in
  alphabetical order starting with 0.

Here is an example where the values of the elements are specified
explicitly, as a template argument to the ``BEntry`` class. The resulting
C++ code is shown.

.. code-block:: text

  def BValues : GenericEnum {
    let FilterClass = "BEntry";
    let NameField = "Name";
    let ValueField = "Encoding";
  }

  class BEntry<bits<16> enc> {
    string Name = NAME;
    bits<16> Encoding = enc;
  }

  def BFoo   : BEntry<0xac>;
  def BBar   : BEntry<0x14>;
  def BZoo   : BEntry<0x80>;
  def BSnork : BEntry<0x4c>;

.. code-block:: text

  #ifdef GET_BValues_DECL
  enum BValues {
    BBar = 20,
    BFoo = 172,
    BSnork = 76,
    BZoo = 128,
  };
  #endif

In the following example, the values of the elements are assigned
automatically. Note that values are assigned from 0, in alphabetical order
by element name.

.. code-block:: text

  def CEnum : GenericEnum {
    let FilterClass = "CEnum";
  }

  class CEnum;

  def CFoo : CEnum;
  def CBar : CEnum;
  def CBaz : CEnum;

.. code-block:: text

  #ifdef GET_CEnum_DECL
  enum CEnum {
    CBar = 0,
    CBaz = 1,
    CFoo = 2,
  };
  #endif


Generic Tables
~~~~~~~~~~~~~~

The ``GenericTable`` class is used to define a searchable generic table.
TableGen produces C++ code to define the table entries and also produces
the declaration and definition of a function to search the table based on a
primary key. To define the table, define a record whose parent class is
``GenericTable`` and whose name is the name of the global table of entries.
This class provides six fields.

* ``string FilterClass``. The table will have one entry for each record
  that derives from this class.

* ``string CppTypeName``. The name of the C++ struct/class type of the
  table that holds the entries. If unspecified, the ``FilterClass`` name is
  used.

* ``list<string> Fields``. A list of the names of the fields *in the
  collected records* that contain the data for the table entries. The order of
  this list determines the order of the values in the C++ initializers. See
  below for information about the types of these fields.

* ``list<string> PrimaryKey``. The list of fields that make up the
  primary key.

* ``string PrimaryKeyName``. The name of the generated C++ function
  that performs a lookup on the primary key.

* ``bit PrimaryKeyEarlyOut``. See the third example below.

TableGen attempts to deduce the type of each of the table fields so that it
can format the C++ initializers in the emitted table. It can deduce ``bit``,
``bits<n>``, ``string``, ``Intrinsic``, and ``Instruction``.  These can be
used in the primary key. Any other field types must be specified
explicitly; this is done as shown in the second example below. Such fields
cannot be used in the primary key.

One special case of the field type has to do with code. Arbitrary code is
represented by a string, but has to be emitted as a C++ initializer without
quotes. If the code field was defined using a code literal (``[{...}]``),
then TableGen will know to emit it without quotes. However, if it was
defined using a string literal or complex string expression, then TableGen
will not know. In this case, you can force TableGen to treat the field as
code by including the following line in the ``GenericTable`` record, where
*xxx* is the code field name.

.. code-block:: text

  string TypeOf_xxx = "code";

Here is an example where TableGen can deduce the field types. Note that the
table entry records are anonymous; the names of entry records are
irrelevant.

.. code-block:: text

  def ATable : GenericTable {
    let FilterClass = "AEntry";
    let Fields = ["Str", "Val1", "Val2"];
    let PrimaryKey = ["Val1", "Val2"];
    let PrimaryKeyName = "lookupATableByValues";
  }

  class AEntry<string str, int val1, int val2> {
    string Str = str;
    bits<8> Val1 = val1;
    bits<10> Val2 = val2;
  }

  def : AEntry<"Bob",   5, 3>;
  def : AEntry<"Carol", 2, 6>;
  def : AEntry<"Ted",   4, 4>;
  def : AEntry<"Alice", 4, 5>;
  def : AEntry<"Costa", 2, 1>;

Here is the generated C++ code. The declaration of ``lookupATableByValues``
is guarded by ``GET_ATable_DECL``, while the definitions are guarded by
``GET_ATable_IMPL``.

.. code-block:: text

  #ifdef GET_ATable_DECL
  const AEntry *lookupATableByValues(uint8_t Val1, uint16_t Val2);
  #endif

  #ifdef GET_ATable_IMPL
  constexpr AEntry ATable[] = {
    { "Costa", 0x2, 0x1 }, // 0
    { "Carol", 0x2, 0x6 }, // 1
    { "Ted", 0x4, 0x4 }, // 2
    { "Alice", 0x4, 0x5 }, // 3
    { "Bob", 0x5, 0x3 }, // 4
  };

  const AEntry *lookupATableByValues(uint8_t Val1, uint16_t Val2) {
    struct KeyType {
      uint8_t Val1;
      uint16_t Val2;
    };
    KeyType Key = { Val1, Val2 };
    auto Table = makeArrayRef(ATable);
    auto Idx = std::lower_bound(Table.begin(), Table.end(), Key,
      [](const AEntry &LHS, const KeyType &RHS) {
        if (LHS.Val1 < RHS.Val1)
          return true;
        if (LHS.Val1 > RHS.Val1)
          return false;
        if (LHS.Val2 < RHS.Val2)
          return true;
        if (LHS.Val2 > RHS.Val2)
          return false;
        return false;
      });
  
    if (Idx == Table.end() ||
        Key.Val1 != Idx->Val1 ||
        Key.Val2 != Idx->Val2)
      return nullptr;
    return &*Idx;
  }
  #endif

The table entries in ``ATable`` are sorted in order by ``Val1``, and within
each of those values, by ``Val2``. This allows a binary search of the table,
which is performed in the lookup function by ``std::lower_bound``. The
lookup function returns a reference to the found table entry, or the null
pointer if no entry is found.

This example includes a field whose type TableGen cannot deduce. The ``Kind``
field uses the enumerated type ``CEnum`` defined above. To inform TableGen
of the type, the record derived from ``GenericTable`` must include a string field
named ``TypeOf_``\ *field*, where *field* is the name of the field whose type
is required.

.. code-block:: text

  def CTable : GenericTable {
    let FilterClass = "CEntry";
    let Fields = ["Name", "Kind", "Encoding"];
    string TypeOf_Kind = "CEnum";
    let PrimaryKey = ["Encoding"];
    let PrimaryKeyName = "lookupCEntryByEncoding";
  }

  class CEntry<string name, CEnum kind, int enc> {
    string Name = name;
    CEnum Kind = kind;
    bits<16> Encoding = enc;
  }

  def : CEntry<"Apple", CFoo, 10>;
  def : CEntry<"Pear",  CBaz, 15>;
  def : CEntry<"Apple", CBar, 13>;

Here is the generated C++ code.

.. code-block:: text

  #ifdef GET_CTable_DECL
  const CEntry *lookupCEntryByEncoding(uint16_t Encoding);
  #endif

  #ifdef GET_CTable_IMPL
  constexpr CEntry CTable[] = {
    { "Apple", CFoo, 0xA }, // 0
    { "Apple", CBar, 0xD }, // 1
    { "Pear", CBaz, 0xF }, // 2
  };

  const CEntry *lookupCEntryByEncoding(uint16_t Encoding) {
    struct KeyType {
      uint16_t Encoding;
    };
    KeyType Key = { Encoding };
    auto Table = makeArrayRef(CTable);
    auto Idx = std::lower_bound(Table.begin(), Table.end(), Key,
      [](const CEntry &LHS, const KeyType &RHS) {
        if (LHS.Encoding < RHS.Encoding)
          return true;
        if (LHS.Encoding > RHS.Encoding)
          return false;
        return false;
      });

    if (Idx == Table.end() ||
        Key.Encoding != Idx->Encoding)
      return nullptr;
    return &*Idx;
  }

The ``PrimaryKeyEarlyOut`` field, when set to 1, modifies the lookup
function so that it tests the first field of the primary key to determine
whether it is within the range of the collected records' primary keys. If
not, the function returns the null pointer without performing the binary
search. This is useful for tables that provide data for only some of the
elements of a larger enum-based space. The first field of the primary key
must be an integral type; it cannot be a string.

Adding ``let PrimaryKeyEarlyOut = 1`` to the ``ATable`` above:

.. code-block:: text

  def ATable : GenericTable {
    let FilterClass = "AEntry";
    let Fields = ["Str", "Val1", "Val2"];
    let PrimaryKey = ["Val1", "Val2"];
    let PrimaryKeyName = "lookupATableByValues";
    let PrimaryKeyEarlyOut = 1;
  }

causes the lookup function to change as follows:

.. code-block:: text

  const AEntry *lookupATableByValues(uint8_t Val1, uint16_t Val2) {
    if ((Val1 < 0x2) ||
        (Val1 > 0x5))
      return nullptr;

    struct KeyType {
    ...

Search Indexes
~~~~~~~~~~~~~~

The ``SearchIndex`` class is used to define additional lookup functions for
generic tables. To define an additional function, define a record whose parent
class is ``SearchIndex`` and whose name is the name of the desired lookup
function. This class provides three fields.

* ``GenericTable Table``. The name of the table that is to receive another
  lookup function.

* ``list<string> Key``. The list of fields that make up the secondary key.

* ``bit EarlyOut``. See the third example in `Generic Tables`_.

Here is an example of a secondary key added to the ``CTable`` above. The
generated function looks up entries based on the ``Name`` and ``Kind`` fields.

.. code-block:: text

  def lookupCEntry : SearchIndex {
    let Table = CTable;
    let Key = ["Name", "Kind"];
  }

This use of ``SearchIndex`` generates the following additional C++ code.

.. code-block:: text

  const CEntry *lookupCEntry(StringRef Name, unsigned Kind);

  ...

  const CEntry *lookupCEntryByName(StringRef Name, unsigned Kind) {
    struct IndexType {
      const char * Name;
      unsigned Kind;
      unsigned _index;
    };
    static const struct IndexType Index[] = {
      { "APPLE", CBar, 1 },
      { "APPLE", CFoo, 0 },
      { "PEAR", CBaz, 2 },
    };

    struct KeyType {
      std::string Name;
      unsigned Kind;
    };
    KeyType Key = { Name.upper(), Kind };
    auto Table = makeArrayRef(Index);
    auto Idx = std::lower_bound(Table.begin(), Table.end(), Key,
      [](const IndexType &LHS, const KeyType &RHS) {
        int CmpName = StringRef(LHS.Name).compare(RHS.Name);
        if (CmpName < 0) return true;
        if (CmpName > 0) return false;
        if ((unsigned)LHS.Kind < (unsigned)RHS.Kind)
          return true;
        if ((unsigned)LHS.Kind > (unsigned)RHS.Kind)
          return false;
        return false;
      });

    if (Idx == Table.end() ||
        Key.Name != Idx->Name ||
        Key.Kind != Idx->Kind)
      return nullptr;
    return &CTable[Idx->_index];
  }

