• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1=================
2TableGen BackEnds
3=================
4
5.. contents::
6   :local:
7
8Introduction
9============
10
11TableGen backends are at the core of TableGen's functionality. The source
12files provide the classes and records that are parsed and end up as a
13collection of record instances, but it's up to the backend to interpret and
14print the records in a way that is meaningful to the user (normally a C++
15include file or a textual list of warnings, options, and error messages).
16
17TableGen is used by both LLVM, Clang, and MLIR with very different goals.
18LLVM uses it as a way to automate the generation of massive amounts of
19information regarding instructions, schedules, cores, and architecture
20features. Some backends generate output that is consumed by more than one
21source file, so they need to be created in a way that makes it is easy for
22preprocessor tricks to be used. Some backends can also print C++ code
23structures, so that they can be directly included as-is.
24
25Clang, on the other hand, uses it mainly for diagnostic messages (errors,
26warnings, tips) and attributes, so more on the textual end of the scale.
27
28MLIR uses TableGen to define operations, operation dialects, and operation
29traits.
30
31See the :doc:`TableGen Programmer's Reference <./ProgRef>` for an in-depth
32description of TableGen, and the :doc:`TableGen Backend Developer's Guide
33<./BackGuide>` for a guide to writing a new backend.
34
35LLVM BackEnds
36=============
37
38.. warning::
39   This portion is incomplete. Each section below needs three subsections:
40   description of its purpose with a list of users, output generated from
41   generic input, and finally why it needed a new backend (in case there's
42   something similar).
43
44Overall, each backend will take the same TableGen file type and transform into
45similar output for different targets/uses. There is an implicit contract between
46the TableGen files, the back-ends and their users.
47
48For instance, a global contract is that each back-end produces macro-guarded
49sections. Based on whether the file is included by a header or a source file,
50or even in which context of each file the include is being used, you have
51todefine a macro just before including it, to get the right output:
52
53.. code-block:: c++
54
55  #define GET_REGINFO_TARGET_DESC
56  #include "ARMGenRegisterInfo.inc"
57
58And just part of the generated file would be included. This is useful if
59you need the same information in multiple formats (instantiation, initialization,
60getter/setter functions, etc) from the same source TableGen file without having
61to re-compile the TableGen file multiple times.
62
63Sometimes, multiple macros might be defined before the same include file to
64output multiple blocks:
65
66.. code-block:: c++
67
68  #define GET_REGISTER_MATCHER
69  #define GET_SUBTARGET_FEATURE_NAME
70  #define GET_MATCHER_IMPLEMENTATION
71  #include "ARMGenAsmMatcher.inc"
72
73The macros will be undef'd automatically as they're used, in the include file.
74
75On all LLVM back-ends, the ``llvm-tblgen`` binary will be executed on the root
76TableGen file ``<Target>.td``, which should include all others. This guarantees
77that all information needed is accessible, and that no duplication is needed
78in the TableGen files.
79
80CodeEmitter
81-----------
82
83**Purpose**: CodeEmitterGen uses the descriptions of instructions and their fields to
84construct an automated code emitter: a function that, given a MachineInstr,
85returns the (currently, 32-bit unsigned) value of the instruction.
86
87**Output**: C++ code, implementing the target's CodeEmitter
88class by overriding the virtual functions as ``<Target>CodeEmitter::function()``.
89
90**Usage**: Used to include directly at the end of ``<Target>MCCodeEmitter.cpp``.
91
92RegisterInfo
93------------
94
95**Purpose**: This tablegen backend is responsible for emitting a description of a target
96register file for a code generator.  It uses instances of the Register,
97RegisterAliases, and RegisterClass classes to gather this information.
98
99**Output**: C++ code with enums and structures representing the register mappings,
100properties, masks, etc.
101
102**Usage**: Both on ``<Target>BaseRegisterInfo`` and ``<Target>MCTargetDesc`` (headers
103and source files) with macros defining in which they are for declaration vs.
104initialization issues.
105
106InstrInfo
107---------
108
109**Purpose**: This tablegen backend is responsible for emitting a description of the target
110instruction set for the code generator. (what are the differences from CodeEmitter?)
111
112**Output**: C++ code with enums and structures representing the instruction mappings,
113properties, masks, etc.
114
115**Usage**: Both on ``<Target>BaseInstrInfo`` and ``<Target>MCTargetDesc`` (headers
116and source files) with macros defining in which they are for declaration vs.
117initialization issues.
118
119AsmWriter
120---------
121
122**Purpose**: Emits an assembly printer for the current target.
123
124**Output**: Implementation of ``<Target>InstPrinter::printInstruction()``, among
125other things.
126
127**Usage**: Included directly into ``InstPrinter/<Target>InstPrinter.cpp``.
128
129AsmMatcher
130----------
131
132**Purpose**: Emits a target specifier matcher for
133converting parsed assembly operands in the MCInst structures. It also
134emits a matcher for custom operand parsing. Extensive documentation is
135written on the ``AsmMatcherEmitter.cpp`` file.
136
137**Output**: Assembler parsers' matcher functions, declarations, etc.
138
139**Usage**: Used in back-ends' ``AsmParser/<Target>AsmParser.cpp`` for
140building the AsmParser class.
141
142Disassembler
143------------
144
145**Purpose**: Contains disassembler table emitters for various
146architectures. Extensive documentation is written on the
147``DisassemblerEmitter.cpp`` file.
148
149**Output**: Decoding tables, static decoding functions, etc.
150
151**Usage**: Directly included in ``Disassembler/<Target>Disassembler.cpp``
152to cater for all default decodings, after all hand-made ones.
153
154PseudoLowering
155--------------
156
157**Purpose**: Generate pseudo instruction lowering.
158
159**Output**: Implements ``<Target>AsmPrinter::emitPseudoExpansionLowering()``.
160
161**Usage**: Included directly into ``<Target>AsmPrinter.cpp``.
162
163CallingConv
164-----------
165
166**Purpose**: Responsible for emitting descriptions of the calling
167conventions supported by this target.
168
169**Output**: Implement static functions to deal with calling conventions
170chained by matching styles, returning false on no match.
171
172**Usage**: Used in ISelLowering and FastIsel as function pointers to
173implementation returned by a CC selection function.
174
175DAGISel
176-------
177
178**Purpose**: Generate a DAG instruction selector.
179
180**Output**: Creates huge functions for automating DAG selection.
181
182**Usage**: Included in ``<Target>ISelDAGToDAG.cpp`` inside the target's
183implementation of ``SelectionDAGISel``.
184
185DFAPacketizer
186-------------
187
188**Purpose**: This class parses the Schedule.td file and produces an API that
189can be used to reason about whether an instruction can be added to a packet
190on a VLIW architecture. The class internally generates a deterministic finite
191automaton (DFA) that models all possible mappings of machine instructions
192to functional units as instructions are added to a packet.
193
194**Output**: Scheduling tables for GPU back-ends (Hexagon, AMD).
195
196**Usage**: Included directly on ``<Target>InstrInfo.cpp``.
197
198FastISel
199--------
200
201**Purpose**: This tablegen backend emits code for use by the "fast"
202instruction selection algorithm. See the comments at the top of
203lib/CodeGen/SelectionDAG/FastISel.cpp for background. This file
204scans through the target's tablegen instruction-info files
205and extracts instructions with obvious-looking patterns, and it emits
206code to look up these instructions by type and operator.
207
208**Output**: Generates ``Predicate`` and ``FastEmit`` methods.
209
210**Usage**: Implements private methods of the targets' implementation
211of ``FastISel`` class.
212
213Subtarget
214---------
215
216**Purpose**: Generate subtarget enumerations.
217
218**Output**: Enums, globals, local tables for sub-target information.
219
220**Usage**: Populates ``<Target>Subtarget`` and
221``MCTargetDesc/<Target>MCTargetDesc`` files (both headers and source).
222
223Intrinsic
224---------
225
226**Purpose**: Generate (target) intrinsic information.
227
228OptParserDefs
229-------------
230
231**Purpose**: Print enum values for a class.
232
233SearchableTables
234----------------
235
236**Purpose**: Generate custom searchable tables.
237
238**Output**: Enums, global tables, and lookup helper functions.
239
240**Usage**: This backend allows generating free-form, target-specific tables
241from TableGen records. The ARM and AArch64 targets use this backend to generate
242tables of system registers; the AMDGPU target uses it to generate meta-data
243about complex image and memory buffer instructions.
244
245See `SearchableTables Reference`_ for a detailed description.
246
247CTags
248-----
249
250**Purpose**: This tablegen backend emits an index of definitions in ctags(1)
251format. A helper script, utils/TableGen/tdtags, provides an easier-to-use
252interface; run 'tdtags -H' for documentation.
253
254X86EVEX2VEX
255-----------
256
257**Purpose**: This X86 specific tablegen backend emits tables that map EVEX
258encoded instructions to their VEX encoded identical instruction.
259
260Clang BackEnds
261==============
262
263ClangAttrClasses
264----------------
265
266**Purpose**: Creates Attrs.inc, which contains semantic attribute class
267declarations for any attribute in ``Attr.td`` that has not set ``ASTNode = 0``.
268This file is included as part of ``Attr.h``.
269
270ClangAttrParserStringSwitches
271-----------------------------
272
273**Purpose**: Creates AttrParserStringSwitches.inc, which contains
274StringSwitch::Case statements for parser-related string switches. Each switch
275is given its own macro (such as ``CLANG_ATTR_ARG_CONTEXT_LIST``, or
276``CLANG_ATTR_IDENTIFIER_ARG_LIST``), which is expected to be defined before
277including AttrParserStringSwitches.inc, and undefined after.
278
279ClangAttrImpl
280-------------
281
282**Purpose**: Creates AttrImpl.inc, which contains semantic attribute class
283definitions for any attribute in ``Attr.td`` that has not set ``ASTNode = 0``.
284This file is included as part of ``AttrImpl.cpp``.
285
286ClangAttrList
287-------------
288
289**Purpose**: Creates AttrList.inc, which is used when a list of semantic
290attribute identifiers is required. For instance, ``AttrKinds.h`` includes this
291file to generate the list of ``attr::Kind`` enumeration values. This list is
292separated out into multiple categories: attributes, inheritable attributes, and
293inheritable parameter attributes. This categorization happens automatically
294based on information in ``Attr.td`` and is used to implement the ``classof``
295functionality required for ``dyn_cast`` and similar APIs.
296
297ClangAttrPCHRead
298----------------
299
300**Purpose**: Creates AttrPCHRead.inc, which is used to deserialize attributes
301in the ``ASTReader::ReadAttributes`` function.
302
303ClangAttrPCHWrite
304-----------------
305
306**Purpose**: Creates AttrPCHWrite.inc, which is used to serialize attributes in
307the ``ASTWriter::WriteAttributes`` function.
308
309ClangAttrSpellings
310---------------------
311
312**Purpose**: Creates AttrSpellings.inc, which is used to implement the
313``__has_attribute`` feature test macro.
314
315ClangAttrSpellingListIndex
316--------------------------
317
318**Purpose**: Creates AttrSpellingListIndex.inc, which is used to map parsed
319attribute spellings (including which syntax or scope was used) to an attribute
320spelling list index. These spelling list index values are internal
321implementation details exposed via
322``AttributeList::getAttributeSpellingListIndex``.
323
324ClangAttrVisitor
325-------------------
326
327**Purpose**: Creates AttrVisitor.inc, which is used when implementing
328recursive AST visitors.
329
330ClangAttrTemplateInstantiate
331----------------------------
332
333**Purpose**: Creates AttrTemplateInstantiate.inc, which implements the
334``instantiateTemplateAttribute`` function, used when instantiating a template
335that requires an attribute to be cloned.
336
337ClangAttrParsedAttrList
338-----------------------
339
340**Purpose**: Creates AttrParsedAttrList.inc, which is used to generate the
341``AttributeList::Kind`` parsed attribute enumeration.
342
343ClangAttrParsedAttrImpl
344-----------------------
345
346**Purpose**: Creates AttrParsedAttrImpl.inc, which is used by
347``AttributeList.cpp`` to implement several functions on the ``AttributeList``
348class. This functionality is implemented via the ``AttrInfoMap ParsedAttrInfo``
349array, which contains one element per parsed attribute object.
350
351ClangAttrParsedAttrKinds
352------------------------
353
354**Purpose**: Creates AttrParsedAttrKinds.inc, which is used to implement the
355``AttributeList::getKind`` function, mapping a string (and syntax) to a parsed
356attribute ``AttributeList::Kind`` enumeration.
357
358ClangAttrDump
359-------------
360
361**Purpose**: Creates AttrDump.inc, which dumps information about an attribute.
362It is used to implement ``ASTDumper::dumpAttr``.
363
364ClangDiagsDefs
365--------------
366
367Generate Clang diagnostics definitions.
368
369ClangDiagGroups
370---------------
371
372Generate Clang diagnostic groups.
373
374ClangDiagsIndexName
375-------------------
376
377Generate Clang diagnostic name index.
378
379ClangCommentNodes
380-----------------
381
382Generate Clang AST comment nodes.
383
384ClangDeclNodes
385--------------
386
387Generate Clang AST declaration nodes.
388
389ClangStmtNodes
390--------------
391
392Generate Clang AST statement nodes.
393
394ClangSACheckers
395---------------
396
397Generate Clang Static Analyzer checkers.
398
399ClangCommentHTMLTags
400--------------------
401
402Generate efficient matchers for HTML tag names that are used in documentation comments.
403
404ClangCommentHTMLTagsProperties
405------------------------------
406
407Generate efficient matchers for HTML tag properties.
408
409ClangCommentHTMLNamedCharacterReferences
410----------------------------------------
411
412Generate function to translate named character references to UTF-8 sequences.
413
414ClangCommentCommandInfo
415-----------------------
416
417Generate command properties for commands that are used in documentation comments.
418
419ClangCommentCommandList
420-----------------------
421
422Generate list of commands that are used in documentation comments.
423
424ArmNeon
425-------
426
427Generate arm_neon.h for clang.
428
429ArmNeonSema
430-----------
431
432Generate ARM NEON sema support for clang.
433
434ArmNeonTest
435-----------
436
437Generate ARM NEON tests for clang.
438
439AttrDocs
440--------
441
442**Purpose**: Creates ``AttributeReference.rst`` from ``AttrDocs.td``, and is
443used for documenting user-facing attributes.
444
445General BackEnds
446================
447
448Print Records
449-------------
450
451The TableGen command option ``--print-records`` invokes a simple backend
452that prints all the classes and records defined in the source files. This is
453the default backend option. See the :doc:`TableGen Backend Developer's Guide
454<./BackGuide>` for more information.
455
456Print Detailed Records
457----------------------
458
459The TableGen command option ``--print-detailed-records`` invokes a backend
460that prints all the global variables, classes, and records defined in the
461source files, with more detail than the default record printer. See the
462:doc:`TableGen Backend Developer's Guide <./BackGuide>` for more
463information.
464
465JSON Reference
466--------------
467
468**Purpose**: Output all the values in every ``def``, as a JSON data
469structure that can be easily parsed by a variety of languages. Useful
470for writing custom backends without having to modify TableGen itself,
471or for performing auxiliary analysis on the same TableGen data passed
472to a built-in backend.
473
474**Output**:
475
476The root of the output file is a JSON object (i.e. dictionary),
477containing the following fixed keys:
478
479* ``!tablegen_json_version``: a numeric version field that will
480  increase if an incompatible change is ever made to the structure of
481  this data. The format described here corresponds to version 1.
482
483* ``!instanceof``: a dictionary whose keys are the class names defined
484  in the TableGen input. For each key, the corresponding value is an
485  array of strings giving the names of ``def`` records that derive
486  from that class. So ``root["!instanceof"]["Instruction"]``, for
487  example, would list the names of all the records deriving from the
488  class ``Instruction``.
489
490For each ``def`` record, the root object also has a key for the record
491name. The corresponding value is a subsidiary object containing the
492following fixed keys:
493
494* ``!superclasses``: an array of strings giving the names of all the
495  classes that this record derives from.
496
497* ``!fields``: an array of strings giving the names of all the variables
498  in this record that were defined with the ``field`` keyword.
499
500* ``!name``: a string giving the name of the record. This is always
501  identical to the key in the JSON root object corresponding to this
502  record's dictionary. (If the record is anonymous, the name is
503  arbitrary.)
504
505* ``!anonymous``: a boolean indicating whether the record's name was
506  specified by the TableGen input (if it is ``false``), or invented by
507  TableGen itself (if ``true``).
508
509For each variable defined in a record, the ``def`` object for that
510record also has a key for the variable name. The corresponding value
511is a translation into JSON of the variable's value, using the
512conventions described below.
513
514Some TableGen data types are translated directly into the
515corresponding JSON type:
516
517* A completely undefined value (e.g. for a variable declared without
518  initializer in some superclass of this record, and never initialized
519  by the record itself or any other superclass) is emitted as the JSON
520  ``null`` value.
521
522* ``int`` and ``bit`` values are emitted as numbers. Note that
523  TableGen ``int`` values are capable of holding integers too large to
524  be exactly representable in IEEE double precision. The integer
525  literal in the JSON output will show the full exact integer value.
526  So if you need to retrieve large integers with full precision, you
527  should use a JSON reader capable of translating such literals back
528  into 64-bit integers without losing precision, such as Python's
529  standard ``json`` module.
530
531* ``string`` and ``code`` values are emitted as JSON strings.
532
533* ``list<T>`` values, for any element type ``T``, are emitted as JSON
534  arrays. Each element of the array is represented in turn using these
535  same conventions.
536
537* ``bits`` values are also emitted as arrays. A ``bits`` array is
538  ordered from least-significant bit to most-significant. So the
539  element with index ``i`` corresponds to the bit described as
540  ``x{i}`` in TableGen source. However, note that this means that
541  scripting languages are likely to *display* the array in the
542  opposite order from the way it appears in the TableGen source or in
543  the diagnostic ``-print-records`` output.
544
545All other TableGen value types are emitted as a JSON object,
546containing two standard fields: ``kind`` is a discriminator describing
547which kind of value the object represents, and ``printable`` is a
548string giving the same representation of the value that would appear
549in ``-print-records``.
550
551* A reference to a ``def`` object has ``kind=="def"``, and has an
552  extra field ``def`` giving the name of the object referred to.
553
554* A reference to another variable in the same record has
555  ``kind=="var"``, and has an extra field ``var`` giving the name of
556  the variable referred to.
557
558* A reference to a specific bit of a ``bits``-typed variable in the
559  same record has ``kind=="varbit"``, and has two extra fields:
560  ``var`` gives the name of the variable referred to, and ``index``
561  gives the index of the bit.
562
563* A value of type ``dag`` has ``kind=="dag"``, and has two extra
564  fields. ``operator`` gives the initial value after the opening
565  parenthesis of the dag initializer; ``args`` is an array giving the
566  following arguments. The elements of ``args`` are arrays of length
567  2, giving the value of each argument followed by its colon-suffixed
568  name (if any). For example, in the JSON representation of the dag
569  value ``(Op 22, "hello":$foo)`` (assuming that ``Op`` is the name of
570  a record defined elsewhere with a ``def`` statement):
571
572  * ``operator`` will be an object in which ``kind=="def"`` and
573    ``def=="Op"``
574
575  * ``args`` will be the array ``[[22, null], ["hello", "foo"]]``.
576
577* If any other kind of value or complicated expression appears in the
578  output, it will have ``kind=="complex"``, and no additional fields.
579  These values are not expected to be needed by backends. The standard
580  ``printable`` field can be used to extract a representation of them
581  in TableGen source syntax if necessary.
582
583SearchableTables Reference
584--------------------------
585
586A TableGen include file, ``SearchableTable.td``, provides classes for
587generating C++ searchable tables. These tables are described in the
588following sections. To generate the C++ code, run ``llvm-tblgen`` with the
589``--gen-searchable-tables`` option, which invokes the backend that generates
590the tables from the records you provide.
591
592Each of the data structures generated for searchable tables is guarded by an
593``#ifdef``. This allows you to include the generated ``.inc`` file and select only
594certain data structures for inclusion. The examples below show the macro
595names used in these guards.
596
597Generic Enumerated Types
598~~~~~~~~~~~~~~~~~~~~~~~~
599
600The ``GenericEnum`` class makes it easy to define a C++ enumerated type and
601the enumerated *elements* of that type. To define the type, define a record
602whose parent class is ``GenericEnum`` and whose name is the desired enum
603type. This class provides three fields, which you can set in the record
604using the ``let`` statement.
605
606* ``string FilterClass``. The enum type will have one element for each record
607  that derives from this class. These records are collected to assemble the
608  complete set of elements.
609
610* ``string NameField``. The name of a field *in the collected records* that specifies
611  the name of the element. If a record has no such field, the record's
612  name will be used.
613
614* ``string ValueField``. The name of a field *in the collected records* that
615  specifies the numerical value of the element. If a record has no such
616  field, it will be assigned an integer value. Values are assigned in
617  alphabetical order starting with 0.
618
619Here is an example where the values of the elements are specified
620explicitly, as a template argument to the ``BEntry`` class. The resulting
621C++ code is shown.
622
623.. code-block:: text
624
625  def BValues : GenericEnum {
626    let FilterClass = "BEntry";
627    let NameField = "Name";
628    let ValueField = "Encoding";
629  }
630
631  class BEntry<bits<16> enc> {
632    string Name = NAME;
633    bits<16> Encoding = enc;
634  }
635
636  def BFoo   : BEntry<0xac>;
637  def BBar   : BEntry<0x14>;
638  def BZoo   : BEntry<0x80>;
639  def BSnork : BEntry<0x4c>;
640
641.. code-block:: text
642
643  #ifdef GET_BValues_DECL
644  enum BValues {
645    BBar = 20,
646    BFoo = 172,
647    BSnork = 76,
648    BZoo = 128,
649  };
650  #endif
651
652In the following example, the values of the elements are assigned
653automatically. Note that values are assigned from 0, in alphabetical order
654by element name.
655
656.. code-block:: text
657
658  def CEnum : GenericEnum {
659    let FilterClass = "CEnum";
660  }
661
662  class CEnum;
663
664  def CFoo : CEnum;
665  def CBar : CEnum;
666  def CBaz : CEnum;
667
668.. code-block:: text
669
670  #ifdef GET_CEnum_DECL
671  enum CEnum {
672    CBar = 0,
673    CBaz = 1,
674    CFoo = 2,
675  };
676  #endif
677
678
679Generic Tables
680~~~~~~~~~~~~~~
681
682The ``GenericTable`` class is used to define a searchable generic table.
683TableGen produces C++ code to define the table entries and also produces
684the declaration and definition of a function to search the table based on a
685primary key. To define the table, define a record whose parent class is
686``GenericTable`` and whose name is the name of the global table of entries.
687This class provides six fields.
688
689* ``string FilterClass``. The table will have one entry for each record
690  that derives from this class.
691
692* ``string CppTypeName``. The name of the C++ struct/class type of the
693  table that holds the entries. If unspecified, the ``FilterClass`` name is
694  used.
695
696* ``list<string> Fields``. A list of the names of the fields *in the
697  collected records* that contain the data for the table entries. The order of
698  this list determines the order of the values in the C++ initializers. See
699  below for information about the types of these fields.
700
701* ``list<string> PrimaryKey``. The list of fields that make up the
702  primary key.
703
704* ``string PrimaryKeyName``. The name of the generated C++ function
705  that performs a lookup on the primary key.
706
707* ``bit PrimaryKeyEarlyOut``. See the third example below.
708
709TableGen attempts to deduce the type of each of the table fields so that it
710can format the C++ initializers in the emitted table. It can deduce ``bit``,
711``bits<n>``, ``string``, ``Intrinsic``, and ``Instruction``.  These can be
712used in the primary key. Any other field types must be specified
713explicitly; this is done as shown in the second example below. Such fields
714cannot be used in the primary key.
715
716One special case of the field type has to do with code. Arbitrary code is
717represented by a string, but has to be emitted as a C++ initializer without
718quotes. If the code field was defined using a code literal (``[{...}]``),
719then TableGen will know to emit it without quotes. However, if it was
720defined using a string literal or complex string expression, then TableGen
721will not know. In this case, you can force TableGen to treat the field as
722code by including the following line in the ``GenericTable`` record, where
723*xxx* is the code field name.
724
725.. code-block:: text
726
727  string TypeOf_xxx = "code";
728
729Here is an example where TableGen can deduce the field types. Note that the
730table entry records are anonymous; the names of entry records are
731irrelevant.
732
733.. code-block:: text
734
735  def ATable : GenericTable {
736    let FilterClass = "AEntry";
737    let Fields = ["Str", "Val1", "Val2"];
738    let PrimaryKey = ["Val1", "Val2"];
739    let PrimaryKeyName = "lookupATableByValues";
740  }
741
742  class AEntry<string str, int val1, int val2> {
743    string Str = str;
744    bits<8> Val1 = val1;
745    bits<10> Val2 = val2;
746  }
747
748  def : AEntry<"Bob",   5, 3>;
749  def : AEntry<"Carol", 2, 6>;
750  def : AEntry<"Ted",   4, 4>;
751  def : AEntry<"Alice", 4, 5>;
752  def : AEntry<"Costa", 2, 1>;
753
754Here is the generated C++ code. The declaration of ``lookupATableByValues``
755is guarded by ``GET_ATable_DECL``, while the definitions are guarded by
756``GET_ATable_IMPL``.
757
758.. code-block:: text
759
760  #ifdef GET_ATable_DECL
761  const AEntry *lookupATableByValues(uint8_t Val1, uint16_t Val2);
762  #endif
763
764  #ifdef GET_ATable_IMPL
765  constexpr AEntry ATable[] = {
766    { "Costa", 0x2, 0x1 }, // 0
767    { "Carol", 0x2, 0x6 }, // 1
768    { "Ted", 0x4, 0x4 }, // 2
769    { "Alice", 0x4, 0x5 }, // 3
770    { "Bob", 0x5, 0x3 }, // 4
771  };
772
773  const AEntry *lookupATableByValues(uint8_t Val1, uint16_t Val2) {
774    struct KeyType {
775      uint8_t Val1;
776      uint16_t Val2;
777    };
778    KeyType Key = { Val1, Val2 };
779    auto Table = makeArrayRef(ATable);
780    auto Idx = std::lower_bound(Table.begin(), Table.end(), Key,
781      [](const AEntry &LHS, const KeyType &RHS) {
782        if (LHS.Val1 < RHS.Val1)
783          return true;
784        if (LHS.Val1 > RHS.Val1)
785          return false;
786        if (LHS.Val2 < RHS.Val2)
787          return true;
788        if (LHS.Val2 > RHS.Val2)
789          return false;
790        return false;
791      });
792
793    if (Idx == Table.end() ||
794        Key.Val1 != Idx->Val1 ||
795        Key.Val2 != Idx->Val2)
796      return nullptr;
797    return &*Idx;
798  }
799  #endif
800
801The table entries in ``ATable`` are sorted in order by ``Val1``, and within
802each of those values, by ``Val2``. This allows a binary search of the table,
803which is performed in the lookup function by ``std::lower_bound``. The
804lookup function returns a reference to the found table entry, or the null
805pointer if no entry is found.
806
807This example includes a field whose type TableGen cannot deduce. The ``Kind``
808field uses the enumerated type ``CEnum`` defined above. To inform TableGen
809of the type, the record derived from ``GenericTable`` must include a string field
810named ``TypeOf_``\ *field*, where *field* is the name of the field whose type
811is required.
812
813.. code-block:: text
814
815  def CTable : GenericTable {
816    let FilterClass = "CEntry";
817    let Fields = ["Name", "Kind", "Encoding"];
818    string TypeOf_Kind = "CEnum";
819    let PrimaryKey = ["Encoding"];
820    let PrimaryKeyName = "lookupCEntryByEncoding";
821  }
822
823  class CEntry<string name, CEnum kind, int enc> {
824    string Name = name;
825    CEnum Kind = kind;
826    bits<16> Encoding = enc;
827  }
828
829  def : CEntry<"Apple", CFoo, 10>;
830  def : CEntry<"Pear",  CBaz, 15>;
831  def : CEntry<"Apple", CBar, 13>;
832
833Here is the generated C++ code.
834
835.. code-block:: text
836
837  #ifdef GET_CTable_DECL
838  const CEntry *lookupCEntryByEncoding(uint16_t Encoding);
839  #endif
840
841  #ifdef GET_CTable_IMPL
842  constexpr CEntry CTable[] = {
843    { "Apple", CFoo, 0xA }, // 0
844    { "Apple", CBar, 0xD }, // 1
845    { "Pear", CBaz, 0xF }, // 2
846  };
847
848  const CEntry *lookupCEntryByEncoding(uint16_t Encoding) {
849    struct KeyType {
850      uint16_t Encoding;
851    };
852    KeyType Key = { Encoding };
853    auto Table = makeArrayRef(CTable);
854    auto Idx = std::lower_bound(Table.begin(), Table.end(), Key,
855      [](const CEntry &LHS, const KeyType &RHS) {
856        if (LHS.Encoding < RHS.Encoding)
857          return true;
858        if (LHS.Encoding > RHS.Encoding)
859          return false;
860        return false;
861      });
862
863    if (Idx == Table.end() ||
864        Key.Encoding != Idx->Encoding)
865      return nullptr;
866    return &*Idx;
867  }
868
869The ``PrimaryKeyEarlyOut`` field, when set to 1, modifies the lookup
870function so that it tests the first field of the primary key to determine
871whether it is within the range of the collected records' primary keys. If
872not, the function returns the null pointer without performing the binary
873search. This is useful for tables that provide data for only some of the
874elements of a larger enum-based space. The first field of the primary key
875must be an integral type; it cannot be a string.
876
877Adding ``let PrimaryKeyEarlyOut = 1`` to the ``ATable`` above:
878
879.. code-block:: text
880
881  def ATable : GenericTable {
882    let FilterClass = "AEntry";
883    let Fields = ["Str", "Val1", "Val2"];
884    let PrimaryKey = ["Val1", "Val2"];
885    let PrimaryKeyName = "lookupATableByValues";
886    let PrimaryKeyEarlyOut = 1;
887  }
888
889causes the lookup function to change as follows:
890
891.. code-block:: text
892
893  const AEntry *lookupATableByValues(uint8_t Val1, uint16_t Val2) {
894    if ((Val1 < 0x2) ||
895        (Val1 > 0x5))
896      return nullptr;
897
898    struct KeyType {
899    ...
900
901Search Indexes
902~~~~~~~~~~~~~~
903
904The ``SearchIndex`` class is used to define additional lookup functions for
905generic tables. To define an additional function, define a record whose parent
906class is ``SearchIndex`` and whose name is the name of the desired lookup
907function. This class provides three fields.
908
909* ``GenericTable Table``. The name of the table that is to receive another
910  lookup function.
911
912* ``list<string> Key``. The list of fields that make up the secondary key.
913
914* ``bit EarlyOut``. See the third example in `Generic Tables`_.
915
916Here is an example of a secondary key added to the ``CTable`` above. The
917generated function looks up entries based on the ``Name`` and ``Kind`` fields.
918
919.. code-block:: text
920
921  def lookupCEntry : SearchIndex {
922    let Table = CTable;
923    let Key = ["Name", "Kind"];
924  }
925
926This use of ``SearchIndex`` generates the following additional C++ code.
927
928.. code-block:: text
929
930  const CEntry *lookupCEntry(StringRef Name, unsigned Kind);
931
932  ...
933
934  const CEntry *lookupCEntryByName(StringRef Name, unsigned Kind) {
935    struct IndexType {
936      const char * Name;
937      unsigned Kind;
938      unsigned _index;
939    };
940    static const struct IndexType Index[] = {
941      { "APPLE", CBar, 1 },
942      { "APPLE", CFoo, 0 },
943      { "PEAR", CBaz, 2 },
944    };
945
946    struct KeyType {
947      std::string Name;
948      unsigned Kind;
949    };
950    KeyType Key = { Name.upper(), Kind };
951    auto Table = makeArrayRef(Index);
952    auto Idx = std::lower_bound(Table.begin(), Table.end(), Key,
953      [](const IndexType &LHS, const KeyType &RHS) {
954        int CmpName = StringRef(LHS.Name).compare(RHS.Name);
955        if (CmpName < 0) return true;
956        if (CmpName > 0) return false;
957        if ((unsigned)LHS.Kind < (unsigned)RHS.Kind)
958          return true;
959        if ((unsigned)LHS.Kind > (unsigned)RHS.Kind)
960          return false;
961        return false;
962      });
963
964    if (Idx == Table.end() ||
965        Key.Name != Idx->Name ||
966        Key.Kind != Idx->Kind)
967      return nullptr;
968    return &CTable[Idx->_index];
969  }
970
971