===================================
TableGen Backend Developer's Guide
===================================

.. sectnum::

.. contents::
   :local:

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

The purpose of TableGen is to generate complex output files based on
information from source files that are significantly easier to code than the
output files would be, and also easier to maintain and modify over time. The
information is coded in a declarative style involving classes and records,
which are then processed by TableGen. The internalized records are passed on
to various backends, which extract information from a subset of the records
and generate an output file. These output files are typically ``.inc`` files
for C++, but may be any type of file that the backend developer needs.

This document is a guide to writing a backend for TableGen. It is not a
complete reference manual, but rather a guide to using the facilities
provided by TableGen for the backends. For a complete reference to the
various data structures and functions involved, see the primary TableGen
header file (``record.h``) and/or the Doxygen documentation.

This document assumes that you have read the :doc:`TableGen Programmer's
Reference <./ProgRef>`, which provides a detailed reference for coding
TableGen source files. For a description of the existing backends, see
:doc:`TableGen BackEnds <./BackEnds>`.

Data Structures
===============

The following sections describe the data structures that contain the classes
and records that are collected from the TableGen source files by the
TableGen parser. Note that the term *class* refers to an abstract record
class, while the term *record* refers to a concrete record.

Unless otherwise noted, functions associated with classes are instance
functions.

``RecordKeeper``
----------------

An instance of the ``RecordKeeper`` class acts as the container for all the
classes and records parsed and collected by TableGen. The ``RecordKeeper``
instance is passed to the backend when it is invoked by TableGen. This class
is usually abbreviated ``RK``.

There are two maps in the recordkeeper, one for classes and one for records
(the latter often referred to as *defs*). Each map maps the class or record
name to an instance of the ``Record`` class (see `Record`_), which contains
all the information about that class or record.

In addition to the two maps, the ``RecordKeeper`` instance contains:

* A map that maps the names of global variables to their values.
  Global variables are defined in TableGen files with outer
  ``defvar`` statements.

* A counter for naming anonymous records.

The ``RecordKeeper`` class provides a few useful functions.

* Functions to get the complete class and record maps.

* Functions to get a subset of the records based on their parent classes.

* Functions to get individual classes, records, and globals, by name.

A ``RecordKeeper`` instance can be printed to an output stream with the ``<<``
operator.

``Record``
----------

Each class or record built by TableGen is represented by an instance of
the ``Record`` class. The ``RecordKeeper`` instance contains one map for the
classes and one for the records. The primary data members of a record are
the record name, the vector of field names and their values, and the vector of
superclasses of the record.

The record name is stored as a pointer to an ``Init`` (see `Init`_), which
is a class whose instances hold TableGen values (sometimes referred to as
*initializers*). The field names and values are stored in a vector of
``RecordVal`` instances (see `RecordVal`_), each of which contains both the
field name and its value. The superclass vector contains a sequence of
pairs, with each pair including the superclass record and its source
file location.

In addition to those members, a ``Record`` instance contains:

* A vector of source file locations that includes the record definition
  itself, plus the locations of any multiclasses involved in its definition.

* For a class record, a vector of the class's template arguments.

* An instance of ``DefInit`` (see `DefInit`_) corresponding to this record.

* A unique record ID.

* A boolean that specifies whether this is a class definition.

* A boolean that specifies whether this is an anonymous record.

The ``Record`` class provides many useful functions.

* Functions to get the record name, fields, source file locations,
  template arguments, and unique ID.

* Functions to get all the record's superclasses or just its direct
  superclasses.

* Functions to get a particular field value by specifying its name in various
  forms, and returning its value in various forms
  (see `Getting Record Names and Fields`_).

* Boolean functions to check the various attributes of the record.

A ``Record`` instance can be printed to an output stream with the ``<<``
operator.


``RecordVal``
-------------

Each field of a record is stored in an instance of the ``RecordVal`` class.
The ``Record`` instance includes a vector of these value instances. A
``RecordVal`` instance contains the name of the field, stored in an ``Init``
instance. It also contains the value of the field, likewise stored in an
``Init``. (A better name for this class might be ``RecordField``.)

In addition to those primary members, the ``RecordVal`` has other data members.

* The source file location of the field definition.

* The type of the field, stored as an instance
  of the ``RecTy`` class (see `RecTy`_).

The ``RecordVal`` class provides some useful functions.

* Functions to get the name of the field in various forms.

* A function to get the type of the field.

* A function to get the value of the field.

* A function to get the source file location.

Note that field values are more easily obtained directly from the ``Record``
instance (see `Record`_).

A ``RecordVal`` instance can be printed to an output stream with the ``<<``
operator.

``RecTy``
---------

The ``RecTy`` class is used to represent the types of field values. It is
the base class for a series of subclasses, one for each of the
available field types. The ``RecTy`` class has one data member that is an
enumerated type specifying the specific type of field value. (A better
name for this class might be ``FieldTy``.)

The ``RecTy`` class provides a few useful functions.

* A virtual function to get the type name as a string.

* A virtual function to check whether all the values of this type can
  be converted to another given type.

* A virtual function to check whether this type is a subtype of
  another given type.

* A function to get the corresponding ``list``
  type for lists with elements of this type. For example, the function
  returns the ``list<int>`` type when called with the ``int`` type.

The subclasses that inherit from ``RecTy`` are
``BitRecTy``,
``BitsRecTy``,
``CodeRecTy``,
``DagRecTy``,
``IntRecTy``,
``ListRecTy``,
``RecordRecTy``, and
``StringRecTy``.
Some of these classes have additional members that
are described in the following subsections.

*All* of the classes derived from ``RecTy`` provide the ``get()`` function.
It returns an instance of ``RecTy`` corresponding to the derived class.
Some of the ``get()`` functions require an argument to
specify which particular variant of the type is desired. These arguments are
described in the following subsections.

A ``RecTy`` instance can be printed to an output stream with the ``<<``
operator.

.. warning::
  It is not specified whether there is a single ``RecTy`` instance of a
  particular type or multiple instances.


``BitsRecTy``
~~~~~~~~~~~~~

This class includes a data member with the size of the ``bits`` value and a
function to get that size.

The ``get()`` function takes the length of the sequence, *n*, and returns the
``BitsRecTy`` type corresponding to ``bits<``\ *n*\ ``>``.

``ListRecTy``
~~~~~~~~~~~~~

This class includes a data member that specifies the type of the list's
elements and a function to get that type.

The ``get()`` function takes the ``RecTy`` *type* of the list members and
returns the ``ListRecTy`` type corresponding to ``list<``\ *type*\ ``>``.


``RecordRecTy``
~~~~~~~~~~~~~~~

This class includes data members that contain the list of parent classes of
this record. It also provides a function to obtain the array of classes and
two functions to get the iterator ``begin()`` and ``end()`` values. The
class defines a type for the return values of the latter two functions.

.. code-block:: text

  using const_record_iterator = Record * const *;

The ``get()`` function takes an ``ArrayRef`` of pointers to the ``Record``
instances of the *direct* superclasses of the record and returns the ``RecordRecTy``
corresponding to the record inheriting from those superclasses.

``Init``
--------

The ``Init`` class is used to represent TableGen values.  The name derives
from *initialization value*. This class should not be confused with the
``RecordVal`` class, which represents record fields, both their names and
values. The ``Init`` class is the base class for a series of subclasses, one
for each of the available value types. The primary data member of ``Init``
is an enumerated type that represents the specific type of the value.

The ``Init`` class provides a few useful functions.

* A function to get the type enumerator.

* A boolean virtual function to determine whether a value is completely
  specified; that is, has no uninitialized subvalues.

* Virtual functions to get the value as a string.

* Virtual functions to cast the value to other types, implement the bit
  range feature of TableGen, and implement the list slice feature.

* A virtual function to get a particular bit of the value.

The subclasses that inherit directly from ``Init`` are
``UnsetInit`` and ``TypedInit``.

An ``Init`` instance can be printed to an output stream with the ``<<``
operator.

.. warning::
  It is not specified whether two separate initialization values with
  the same underlying type and value (e.g., two strings with the value
  "Hello") are represented by two ``Init``\ s or share the same ``Init``.

``UnsetInit``
~~~~~~~~~~~~~

This class, a subclass of ``Init``, represents the unset (uninitialized)
value. The static function ``get()`` can be used to obtain the singleton
``Init`` of this type.


``TypedInit``
~~~~~~~~~~~~~

This class, a subclass of ``Init``, acts as the parent class of the classes
that represent specific value types (except for the unset value). These
classes include ``BitInit``, ``BitsInit``, ``DagInit``, ``DefInit``,
``IntInit``, ``ListInit``, and ``StringInit``. (There are additional derived
types used by the TableGen parser.)

This class includes a data member that specifies the ``RecTy`` type of the
value. It provides a function to get that ``RecTy`` type.

``BitInit``
~~~~~~~~~~~

The ``BitInit`` class is a subclass of ``TypedInit``. Its instances
represent the possible values of a bit: 0 or 1. It includes a data member
that contains the bit.

*All* of the classes derived from ``TypedInit`` provide the following functions.

* A static function named ``get()`` that returns an ``Init`` representing
  the specified value(s). In the case of ``BitInit``, ``get(true)`` returns
  an instance of ``BitInit`` representing true, while ``get(false)`` returns
  an instance
  representing false. As noted above, it is not specified whether there
  is exactly one or more than one ``BitInit`` representing true (or false).

* A function named ``GetValue()`` that returns the value of the instance
  in a more direct form, in this case as a ``bool``.

``BitsInit``
~~~~~~~~~~~~

The ``BitsInit`` class is a subclass of ``TypedInit``. Its instances
represent sequences of bits, from high-order to low-order. It includes a
data member with the length of the sequence and a vector of pointers to
``Init`` instances, one per bit.

The class provides the usual ``get()`` function. It does not provide the
``getValue()`` function.

The class provides the following additional functions.

* A function to get the number of bits in the sequence.

* A function that gets a bit specified by an integer index.

``DagInit``
~~~~~~~~~~~

The ``DagInit`` class is a subclass of ``TypedInit``. Its instances
represent the possible direct acyclic graphs (``dag``).

The class includes a pointer to an ``Init`` for the DAG operator and a
pointer to a ``StringInit`` for the operator name. It includes the count of
DAG operands and the count of operand names. Finally, it includes a vector of
pointers to ``Init`` instances for the operands and another to
``StringInit`` instances for the operand names.
(The DAG operands are also referred to as *arguments*.)

The class provides two forms of the usual ``get()`` function. It does not
provide the usual ``getValue()`` function.

The class provides many additional functions:

* Functions to get the operator in various forms and to get the
  operator name in various forms.

* Functions to determine whether there are any operands and to get the
  number of operands.

* Functions to get the operands, both individually and together.

* Functions to determine whether there are any names and to
  get the number of names

* Functions to get the names, both individually and together.

* Functions to get the operand iterator ``begin()`` and ``end()`` values.

* Functions to get the name iterator ``begin()`` and ``end()`` values.

The class defines two types for the return values of the operand and name
iterators.

.. code-block:: text

  using const_arg_iterator = SmallVectorImpl<Init*>::const_iterator;
  using const_name_iterator = SmallVectorImpl<StringInit*>::const_iterator;


``DefInit``
~~~~~~~~~~~

The ``DefInit`` class is a subclass of ``TypedInit``. Its instances
represent the records that were collected by TableGen. It includes a data
member that is a pointer to the record's ``Record`` instance.

The class provides the usual ``get()`` function. It does not provide
``getValue()``. Instead, it provides ``getDef()``, which returns the
``Record`` instance.

``IntInit``
~~~~~~~~~~~

The ``IntInit`` class is a subclass of ``TypedInit``. Its instances
represent the possible values of a 64-bit integer. It includes a data member
that contains the integer.

The class provides the usual ``get()`` and ``getValue()`` functions. The
latter function returns the integer as an ``int64_t``.

The class also provides a function, ``getBit()``, to obtain a specified bit
of the integer value.

``ListInit``
~~~~~~~~~~~~

The ``ListInit`` class is a subclass of ``TypedInit``. Its instances
represent lists of elements of some type. It includes a data member with the
length of the list and a vector of pointers to ``Init`` instances, one per
element.

The class provides the usual ``get()`` and ``getValues()`` functions. The
latter function returns an ``ArrayRef`` of the vector of pointers to ``Init``
instances.

The class provides these additional functions.

* A function to get the element type.

* Functions to get the length of the vector and to determine whether
  it is empty.

* Functions to get an element specified by an integer index and return
  it in various forms.

* Functions to get the iterator ``begin()`` and ``end()`` values. The
  class defines a type for the return type of these two functions.

.. code-block:: text

  using const_iterator = Init *const *;


``StringInit``
~~~~~~~~~~~~~~

The ``StringInit`` class is a subclass of ``TypedInit``. Its instances
represent arbitrary-length strings. It includes a data member
that contains a ``StringRef`` of the value.

The class provides the usual ``get()`` and ``getValue()`` functions. The
latter function returns the ``StringRef``.

Creating a New Backend
======================

The following steps are required to create a new backend for TableGen.

#. Invent a name for your backend C++ file, say ``GenAddressModes``.

#. Write the new backend, using the file ``TableGenBackendSkeleton.cpp``
   as a starting point.

#. Determine which instance of TableGen requires the new backend. There is
   one instance for Clang and another for LLVM. Or you may be building
   your own instance.

#. Add your backend C++ file to the appropriate ``CMakeLists.txt`` file so
   that it will be built.

#. Add your C++ file to the system.

The Backend Skeleton
====================

The file ``TableGenBackendSkeleton.cpp`` provides a skeleton C++ translation
unit for writing a new TableGen backend. Here are a few notes on the file.

* The list of includes is the minimal list required by most backends.

* As with all LLVM C++ files, it has a ``using namespace llvm;`` statement.
  It also has an anonymous namespace that contains all the file-specific
  data structure definitions, along with the class embodying the emitter
  data members and functions. Continuing with the ``GenAddressModes`` example,
  this class is named ``AddressModesEmitter``.

* The constructor for the emitter class accepts a ``RecordKeeper`` reference,
  typically named ``RK``. The ``RecordKeeper`` reference is saved in a data
  member so that records can be obtained from it. This data member is usually
  named ``Records``.

* One function is named ``run``. It is invoked by the backend's "main
  function" to collect records and emit the output file. It accepts an instance
  of the ``raw_ostream`` class, typically named ``OS``. The output file is
  emitted by writing to this stream.

* The ``run`` function should use the ``emitSourceFileHeader`` helper function
  to include a standard header in the emitted file.

* Register the class or the function as the command line option
  with ``llvm/TableGen/TableGenBackend.h``.

  * Use ``llvm::TableGen::Emitter::OptClass<AddressModesEmitter>``
    if the class has the constructor ``(RK)`` and
    the method ``run(OS)``.

  * Otherwise, use ``llvm::TableGen::Emitter::Opt``.

All the examples in the remainder of this document will assume the naming
conventions used in the skeleton file.

Getting Classes
===============

The ``RecordKeeper`` class provides two functions for getting the
``Record`` instances for classes defined in the TableGen files.

* ``getClasses()`` returns a ``RecordMap`` reference for all the classes.

* ``getClass(``\ *name*\ ``)`` returns a ``Record`` reference for the named
  class.

If you need to iterate over all the class records:

.. code-block:: text

  for (auto ClassPair : Records.getClasses()) {
    Record *ClassRec = ClassPair.second.get();
    ...
  }

``ClassPair.second`` gets the class's ``unique_ptr``, then ``.get()`` gets the
class ``Record`` itself.


Getting Records
===============

The ``RecordKeeper`` class provides four functions for getting the
``Record`` instances for concrete records defined in the TableGen files.

* ``getDefs()`` returns a ``RecordMap`` reference for all the concrete
  records.

* ``getDef(``\ *name*\ ``)`` returns a ``Record`` reference for the named
  concrete record.

* ``getAllDerivedDefinitions(``\ *classname*\ ``)`` returns a vector of
  ``Record`` references for the concrete records that derive from the
  given class.

* ``getAllDerivedDefinitions(``\ *classnames*\ ``)`` returns
  a vector of ``Record`` references for the concrete records that derive from
  *all* of the given classes.

This statement obtains all the records that derive from the ``Attribute``
class and iterates over them.

.. code-block:: text

  auto AttrRecords = Records.getAllDerivedDefinitions("Attribute");
  for (Record *AttrRec : AttrRecords) {
    ...
  }

Getting Record Names and Fields
===============================

As described above (see `Record`_), there are multiple functions that
return the name of a record. One particularly useful one is
``getNameInitAsString()``, which returns the name as a ``std::string``.

There are also multiple functions that return the fields of a record. To
obtain and iterate over all the fields:

.. code-block:: text

  for (const RecordVal &Field : SomeRec->getValues()) {
    ...
  }

You will recall that ``RecordVal`` is the class whose instances contain
information about the fields in records.

The ``getValue()`` function returns the ``RecordVal`` instance for a field
specified by name. There are multiple overloaded functions, some taking a
``StringRef`` and others taking a ``const Init *``. Some functions return a
``RecordVal *`` and others return a ``const RecordVal *``. If the field does
not exist, a fatal error message is printed.

More often than not, you are interested in the value of the field, not all
the information in the ``RecordVal``. There is a large set of functions that
take a field name in some form and return its value. One function,
``getValueInit``, returns the value as an ``Init *``. Another function,
``isValueUnset``, returns a boolean specifying whether the value is unset
(uninitialized).

Most of the functions return the value in some more useful form. For
example:

.. code-block:: text

  std::vector<int64_t> RegCosts =
      SomeRec->getValueAsListOfInts("RegCosts");

The field ``RegCosts`` is assumed to be a list of integers. That list is
returned as a ``std::vector`` of 64-bit integers. If the field is not a list
of integers, a fatal error message is printed.

Here is a function that returns a field value as a ``Record``, but returns
null if the field does not exist.

.. code-block:: text

  if (Record *BaseRec = SomeRec->getValueAsOptionalDef(BaseFieldName)) {
    ...
  }

The field is assumed to have another record as its value. That record is returned
as a pointer to a ``Record``. If the field does not exist or is unset, the
function returns null.

Getting Record Superclasses
===========================

The ``Record`` class provides a function to obtain the direct superclasses
of a record. It is named ``getDirectSuperClasses`` and returns an
``ArrayRef`` of an array of ``std::pair`` pairs. Each pair consists of a
pointer to the ``Record`` instance for a superclass record and an instance
of the ``SMRange`` class. The range indicates the source file locations of
the beginning and end of the class definition.

This example obtains the direct superclasses of the ``Prototype`` record and
then iterates over the pairs in the returned array.

.. code-block:: text

  ArrayRef<std::pair<const Record *, SMRange>>
      Superclasses = Prototype->getDirectSuperClasses();
  for (const auto &[Super, Range] : Superclasses) {
    ...
  }

The ``Record`` class also provides a function, ``getSuperClasses``, to
return a vector of *all* superclasses of a record. The superclasses are in
post-order: the order in which the superclasses were visited while copying
their fields into the record.

Emitting Text to the Output Stream
==================================

The ``run`` function is passed a ``raw_ostream`` to which it prints the
output file. By convention, this stream is saved in the emitter class member
named ``OS``, although some ``run`` functions are simple and just use the
stream without saving it. The output can be produced by writing values
directly to the output stream, or by using the ``std::format()`` or
``llvm::formatv()`` functions.

.. code-block:: text

  OS << "#ifndef " << NodeName << "\n";

  OS << format("0x%0*x, ", Digits, Value);

Instances of the following classes can be printed using the ``<<`` operator:
``RecordKeeper``,
``Record``,
``RecTy``,
``RecordVal``, and
``Init``.

The helper function ``emitSourceFileHeader()`` prints the header comment
that should be included at the top of every output file. A call to it is
included in the skeleton backend file ``TableGenBackendSkeleton.cpp``.

Printing Error Messages
=======================

TableGen records are often derived from multiple classes and also often
defined through a sequence of multiclasses. Because of this, it can be
difficult for backends to report clear error messages with accurate source
file locations.  To make error reporting easier, five error reporting
functions are provided, each with four overloads.

* ``PrintWarning`` prints a message tagged as a warning.

* ``PrintError`` prints a message tagged as an error.

* ``PrintFatalError`` prints a message tagged as an error and then terminates.

* ``PrintNote`` prints a note. It is often used after one of the previous
  functions to provide more information.

* ``PrintFatalNote`` prints a note and then terminates.

Each of these five functions is overloaded four times.

* ``PrintError(const Twine &Msg)``:
  Prints the message with no source file location.

* ``PrintError(ArrayRef<SMLoc> ErrorLoc, const Twine &Msg)``:
  Prints the message followed by the specified source line,
  along with a pointer to the item in error. The array of
  source file locations is typically taken from a ``Record`` instance.

* ``PrintError(const Record *Rec, const Twine &Msg)``:
  Prints the message followed by the source line associated with the
  specified record (see `Record`_).

* ``PrintError(const RecordVal *RecVal, const Twine &Msg)``:
  Prints the message followed by the source line associated with the
  specified record field (see `RecordVal`_).

Using these functions, the goal is to produce the most specific error report
possible.

Debugging Tools
===============

TableGen provides some tools to aid in debugging backends.

The ``PrintRecords`` Backend
----------------------------

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. The format of the output is guaranteed to be
constant over time, so that the output can be compared in tests. The output
looks like this:

.. code-block:: text

  ------------- Classes -----------------
  ...
  class XEntry<string XEntry:str = ?, int XEntry:val1 = ?> { // XBase
    string Str = XEntry:str;
    bits<8> Val1 = { !cast<bits<8>>(XEntry:val1){7}, ... };
    bit Val3 = 1;
  }
  ...
  ------------- Defs -----------------
  def ATable {	// GenericTable
    string FilterClass = "AEntry";
    string CppTypeName = "AEntry";
    list<string> Fields = ["Str", "Val1", "Val2"];
    list<string> PrimaryKey = ["Val1", "Val2"];
    string PrimaryKeyName = "lookupATableByValues";
    bit PrimaryKeyEarlyOut = 0;
  }
  ...
  def anonymous_0 {	// AEntry
    string Str = "Bob";
    bits<8> Val1 = { 0, 0, 0, 0, 0, 1, 0, 1 };
    bits<10> Val2 = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 };
  }

Classes are shown with their template arguments, parent classes (following
``//``), and fields. Records are shown with their parent classes and
fields. Note that anonymous records are named ``anonymous_0``,
``anonymous_1``, etc.

The ``PrintDetailedRecords`` Backend
------------------------------------

The TableGen command option ``--print-detailed-records`` invokes a backend
that prints all the global variables, classes, and records defined in the
source files. The format of the output is *not* guaranteed to be constant
over time. The output looks like this.

.. code-block:: text

  DETAILED RECORDS for file llvm-project\llvm\lib\target\arc\arc.td

  -------------------- Global Variables (5) --------------------

  AMDGPUBufferIntrinsics = [int_amdgcn_s_buffer_load, ...
  AMDGPUImageDimAtomicIntrinsics = [int_amdgcn_image_atomic_swap_1d, ...
  ...
  -------------------- Classes (758) --------------------

  AMDGPUBufferLoad  |IntrinsicsAMDGPU.td:879|
    Template args:
      LLVMType AMDGPUBufferLoad:data_ty = llvm_any_ty  |IntrinsicsAMDGPU.td:879|
    Superclasses: (SDPatternOperator) Intrinsic AMDGPURsrcIntrinsic
    Fields:
      list<SDNodeProperty> Properties = [SDNPMemOperand]  |Intrinsics.td:348|
      string LLVMName = ""  |Intrinsics.td:343|
  ...
  -------------------- Records (12303) --------------------

  AMDGPUSample_lz_o  |IntrinsicsAMDGPU.td:560|
    Defm sequence: |IntrinsicsAMDGPU.td:584| |IntrinsicsAMDGPU.td:566|
    Superclasses: AMDGPUSampleVariant
    Fields:
      string UpperCaseMod = "_LZ_O"  |IntrinsicsAMDGPU.td:542|
      string LowerCaseMod = "_lz_o"  |IntrinsicsAMDGPU.td:543|
  ...

* Global variables defined with outer ``defvar`` statements are shown with
  their values.

* The classes are shown with their source location, template arguments,
  superclasses, and fields.

* The records are shown with their source location, ``defm`` sequence,
  superclasses, and fields.

Superclasses are shown in the order processed, with indirect superclasses in
parentheses. Each field is shown with its value and the source location at
which it was set.
The ``defm`` sequence gives the locations of the ``defm`` statements that
were involved in generating the record, in the order they were invoked.

Timing TableGen Phases
----------------------

TableGen provides a phase timing feature that produces a report of the time
used by the various phases of parsing the source files and running the
selected backend. This feature is enabled with the ``--time-phases`` option
of the TableGen command.

If the backend is *not* instrumented for timing, then a report such as the
following is produced. This is the timing for the
``--print-detailed-records`` backend run on the AMDGPU target.

.. code-block:: text

  ===-------------------------------------------------------------------------===
                               TableGen Phase Timing
  ===-------------------------------------------------------------------------===
    Total Execution Time: 101.0106 seconds (102.4819 wall clock)

     ---User Time---   --System Time--   --User+System--   ---Wall Time---  --- Name ---
    85.5197 ( 84.9%)   0.1560 ( 50.0%)  85.6757 ( 84.8%)  85.7009 ( 83.6%)  Backend overall
    15.1789 ( 15.1%)   0.0000 (  0.0%)  15.1789 ( 15.0%)  15.1829 ( 14.8%)  Parse, build records
     0.0000 (  0.0%)   0.1560 ( 50.0%)   0.1560 (  0.2%)   1.5981 (  1.6%)  Write output
    100.6986 (100.0%)   0.3120 (100.0%)  101.0106 (100.0%)  102.4819 (100.0%)  Total

Note that all the time for the backend is lumped under "Backend overall".

If the backend is instrumented for timing, then its processing is
divided into phases and each one timed separately. This is the timing for
the ``--emit-dag-isel`` backend run on the AMDGPU target.

.. code-block:: text

  ===-------------------------------------------------------------------------===
                               TableGen Phase Timing
  ===-------------------------------------------------------------------------===
    Total Execution Time: 746.3868 seconds (747.1447 wall clock)

     ---User Time---   --System Time--   --User+System--   ---Wall Time---  --- Name ---
    657.7938 ( 88.1%)   0.1404 ( 90.0%)  657.9342 ( 88.1%)  658.6497 ( 88.2%)  Emit matcher table
    70.2317 (  9.4%)   0.0000 (  0.0%)  70.2317 (  9.4%)  70.2700 (  9.4%)  Convert to matchers
    14.8825 (  2.0%)   0.0156 ( 10.0%)  14.8981 (  2.0%)  14.9009 (  2.0%)  Parse, build records
     2.1840 (  0.3%)   0.0000 (  0.0%)   2.1840 (  0.3%)   2.1791 (  0.3%)  Sort patterns
     1.1388 (  0.2%)   0.0000 (  0.0%)   1.1388 (  0.2%)   1.1401 (  0.2%)  Optimize matchers
     0.0000 (  0.0%)   0.0000 (  0.0%)   0.0000 (  0.0%)   0.0050 (  0.0%)  Write output
    746.2308 (100.0%)   0.1560 (100.0%)  746.3868 (100.0%)  747.1447 (100.0%)  Total

The backend has been divided into four phases and timed separately.

If you want to instrument a backend, refer to the backend ``DAGISelEmitter.cpp``
and search for ``Records.startTimer``.
