===================================
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 the get the operands, both individually and together.

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

* Functions to the 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
functions returns null.

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

The ``Record`` class provides a function to obtain the superclasses of a
record. It is named ``getSuperClasses`` and returns an ``ArrayRef`` of an
array of ``std::pair`` pairs. The superclasses are in post-order: the order
in which the superclasses were visited while copying their fields into the
record. 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 superclasses of the ``Prototype`` record and then
iterates over the pairs in the returned array.

.. code-block:: text

  ArrayRef<std::pair<Record *, SMRange>>
      Superclasses = Prototype->getSuperClasses();
  for (const auto &SuperPair : Superclasses) {
    ...
  }

The ``Record`` class also provides a function, ``getDirectSuperClasses``, to
append the *direct* superclasses of a record to a given vector of type
``SmallVectorImpl<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_buffer_load_format, ...
  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``.
