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 files
12provide the semantics to a generated (in memory) structure, but it's up to the
13backend to print this out in a way that is meaningful to the user (normally a
14C program including a file or a textual list of warnings, options and error
15messages).
16
17TableGen is used by both LLVM and Clang with very different goals. LLVM uses it
18as a way to automate the generation of massive amounts of information regarding
19instructions, schedules, cores and architecture features. Some backends generate
20output that is consumed by more than one source file, so they need to be created
21in a way that is easy to use pre-processor tricks. Some backends can also print
22C code structures, so that they can be directly included as-is.
23
24Clang, on the other hand, uses it mainly for diagnostic messages (errors,
25warnings, tips) and attributes, so more on the textual end of the scale.
26
27LLVM BackEnds
28=============
29
30.. warning::
31   This document is raw. Each section below needs three sub-sections: description
32   of its purpose with a list of users, output generated from generic input, and
33   finally why it needed a new backend (in case there's something similar).
34
35Overall, each backend will take the same TableGen file type and transform into
36similar output for different targets/uses. There is an implicit contract between
37the TableGen files, the back-ends and their users.
38
39For instance, a global contract is that each back-end produces macro-guarded
40sections. Based on whether the file is included by a header or a source file,
41or even in which context of each file the include is being used, you have
42todefine a macro just before including it, to get the right output:
43
44.. code-block:: c++
45
46  #define GET_REGINFO_TARGET_DESC
47  #include "ARMGenRegisterInfo.inc"
48
49And just part of the generated file would be included. This is useful if
50you need the same information in multiple formats (instantiation, initialization,
51getter/setter functions, etc) from the same source TableGen file without having
52to re-compile the TableGen file multiple times.
53
54Sometimes, multiple macros might be defined before the same include file to
55output multiple blocks:
56
57.. code-block:: c++
58
59  #define GET_REGISTER_MATCHER
60  #define GET_SUBTARGET_FEATURE_NAME
61  #define GET_MATCHER_IMPLEMENTATION
62  #include "ARMGenAsmMatcher.inc"
63
64The macros will be undef'd automatically as they're used, in the include file.
65
66On all LLVM back-ends, the ``llvm-tblgen`` binary will be executed on the root
67TableGen file ``<Target>.td``, which should include all others. This guarantees
68that all information needed is accessible, and that no duplication is needed
69in the TableGen files.
70
71CodeEmitter
72-----------
73
74**Purpose**: CodeEmitterGen uses the descriptions of instructions and their fields to
75construct an automated code emitter: a function that, given a MachineInstr,
76returns the (currently, 32-bit unsigned) value of the instruction.
77
78**Output**: C++ code, implementing the target's CodeEmitter
79class by overriding the virtual functions as ``<Target>CodeEmitter::function()``.
80
81**Usage**: Used to include directly at the end of ``<Target>MCCodeEmitter.cpp``.
82
83RegisterInfo
84------------
85
86**Purpose**: This tablegen backend is responsible for emitting a description of a target
87register file for a code generator.  It uses instances of the Register,
88RegisterAliases, and RegisterClass classes to gather this information.
89
90**Output**: C++ code with enums and structures representing the register mappings,
91properties, masks, etc.
92
93**Usage**: Both on ``<Target>BaseRegisterInfo`` and ``<Target>MCTargetDesc`` (headers
94and source files) with macros defining in which they are for declaration vs.
95initialization issues.
96
97InstrInfo
98---------
99
100**Purpose**: This tablegen backend is responsible for emitting a description of the target
101instruction set for the code generator. (what are the differences from CodeEmitter?)
102
103**Output**: C++ code with enums and structures representing the instruction mappings,
104properties, masks, etc.
105
106**Usage**: Both on ``<Target>BaseInstrInfo`` and ``<Target>MCTargetDesc`` (headers
107and source files) with macros defining in which they are for declaration vs.
108initialization issues.
109
110AsmWriter
111---------
112
113**Purpose**: Emits an assembly printer for the current target.
114
115**Output**: Implementation of ``<Target>InstPrinter::printInstruction()``, among
116other things.
117
118**Usage**: Included directly into ``InstPrinter/<Target>InstPrinter.cpp``.
119
120AsmMatcher
121----------
122
123**Purpose**: Emits a target specifier matcher for
124converting parsed assembly operands in the MCInst structures. It also
125emits a matcher for custom operand parsing. Extensive documentation is
126written on the ``AsmMatcherEmitter.cpp`` file.
127
128**Output**: Assembler parsers' matcher functions, declarations, etc.
129
130**Usage**: Used in back-ends' ``AsmParser/<Target>AsmParser.cpp`` for
131building the AsmParser class.
132
133Disassembler
134------------
135
136**Purpose**: Contains disassembler table emitters for various
137architectures. Extensive documentation is written on the
138``DisassemblerEmitter.cpp`` file.
139
140**Output**: Decoding tables, static decoding functions, etc.
141
142**Usage**: Directly included in ``Disassembler/<Target>Disassembler.cpp``
143to cater for all default decodings, after all hand-made ones.
144
145PseudoLowering
146--------------
147
148**Purpose**: Generate pseudo instruction lowering.
149
150**Output**: Implements ``<Target>AsmPrinter::emitPseudoExpansionLowering()``.
151
152**Usage**: Included directly into ``<Target>AsmPrinter.cpp``.
153
154CallingConv
155-----------
156
157**Purpose**: Responsible for emitting descriptions of the calling
158conventions supported by this target.
159
160**Output**: Implement static functions to deal with calling conventions
161chained by matching styles, returning false on no match.
162
163**Usage**: Used in ISelLowering and FastIsel as function pointers to
164implementation returned by a CC selection function.
165
166DAGISel
167-------
168
169**Purpose**: Generate a DAG instruction selector.
170
171**Output**: Creates huge functions for automating DAG selection.
172
173**Usage**: Included in ``<Target>ISelDAGToDAG.cpp`` inside the target's
174implementation of ``SelectionDAGISel``.
175
176DFAPacketizer
177-------------
178
179**Purpose**: This class parses the Schedule.td file and produces an API that
180can be used to reason about whether an instruction can be added to a packet
181on a VLIW architecture. The class internally generates a deterministic finite
182automaton (DFA) that models all possible mappings of machine instructions
183to functional units as instructions are added to a packet.
184
185**Output**: Scheduling tables for GPU back-ends (Hexagon, AMD).
186
187**Usage**: Included directly on ``<Target>InstrInfo.cpp``.
188
189FastISel
190--------
191
192**Purpose**: This tablegen backend emits code for use by the "fast"
193instruction selection algorithm. See the comments at the top of
194lib/CodeGen/SelectionDAG/FastISel.cpp for background. This file
195scans through the target's tablegen instruction-info files
196and extracts instructions with obvious-looking patterns, and it emits
197code to look up these instructions by type and operator.
198
199**Output**: Generates ``Predicate`` and ``FastEmit`` methods.
200
201**Usage**: Implements private methods of the targets' implementation
202of ``FastISel`` class.
203
204Subtarget
205---------
206
207**Purpose**: Generate subtarget enumerations.
208
209**Output**: Enums, globals, local tables for sub-target information.
210
211**Usage**: Populates ``<Target>Subtarget`` and
212``MCTargetDesc/<Target>MCTargetDesc`` files (both headers and source).
213
214Intrinsic
215---------
216
217**Purpose**: Generate (target) intrinsic information.
218
219OptParserDefs
220-------------
221
222**Purpose**: Print enum values for a class.
223
224CTags
225-----
226
227**Purpose**: This tablegen backend emits an index of definitions in ctags(1)
228format. A helper script, utils/TableGen/tdtags, provides an easier-to-use
229interface; run 'tdtags -H' for documentation.
230
231Clang BackEnds
232==============
233
234ClangAttrClasses
235----------------
236
237**Purpose**: Creates Attrs.inc, which contains semantic attribute class
238declarations for any attribute in ``Attr.td`` that has not set ``ASTNode = 0``.
239This file is included as part of ``Attr.h``.
240
241ClangAttrParserStringSwitches
242-----------------------------
243
244**Purpose**: Creates AttrParserStringSwitches.inc, which contains
245StringSwitch::Case statements for parser-related string switches. Each switch
246is given its own macro (such as ``CLANG_ATTR_ARG_CONTEXT_LIST``, or
247``CLANG_ATTR_IDENTIFIER_ARG_LIST``), which is expected to be defined before
248including AttrParserStringSwitches.inc, and undefined after.
249
250ClangAttrImpl
251-------------
252
253**Purpose**: Creates AttrImpl.inc, which contains semantic attribute class
254definitions for any attribute in ``Attr.td`` that has not set ``ASTNode = 0``.
255This file is included as part of ``AttrImpl.cpp``.
256
257ClangAttrList
258-------------
259
260**Purpose**: Creates AttrList.inc, which is used when a list of semantic
261attribute identifiers is required. For instance, ``AttrKinds.h`` includes this
262file to generate the list of ``attr::Kind`` enumeration values. This list is
263separated out into multiple categories: attributes, inheritable attributes, and
264inheritable parameter attributes. This categorization happens automatically
265based on information in ``Attr.td`` and is used to implement the ``classof``
266functionality required for ``dyn_cast`` and similar APIs.
267
268ClangAttrPCHRead
269----------------
270
271**Purpose**: Creates AttrPCHRead.inc, which is used to deserialize attributes
272in the ``ASTReader::ReadAttributes`` function.
273
274ClangAttrPCHWrite
275-----------------
276
277**Purpose**: Creates AttrPCHWrite.inc, which is used to serialize attributes in
278the ``ASTWriter::WriteAttributes`` function.
279
280ClangAttrSpellings
281---------------------
282
283**Purpose**: Creates AttrSpellings.inc, which is used to implement the
284``__has_attribute`` feature test macro.
285
286ClangAttrSpellingListIndex
287--------------------------
288
289**Purpose**: Creates AttrSpellingListIndex.inc, which is used to map parsed
290attribute spellings (including which syntax or scope was used) to an attribute
291spelling list index. These spelling list index values are internal
292implementation details exposed via
293``AttributeList::getAttributeSpellingListIndex``.
294
295ClangAttrVisitor
296-------------------
297
298**Purpose**: Creates AttrVisitor.inc, which is used when implementing
299recursive AST visitors.
300
301ClangAttrTemplateInstantiate
302----------------------------
303
304**Purpose**: Creates AttrTemplateInstantiate.inc, which implements the
305``instantiateTemplateAttribute`` function, used when instantiating a template
306that requires an attribute to be cloned.
307
308ClangAttrParsedAttrList
309-----------------------
310
311**Purpose**: Creates AttrParsedAttrList.inc, which is used to generate the
312``AttributeList::Kind`` parsed attribute enumeration.
313
314ClangAttrParsedAttrImpl
315-----------------------
316
317**Purpose**: Creates AttrParsedAttrImpl.inc, which is used by
318``AttributeList.cpp`` to implement several functions on the ``AttributeList``
319class. This functionality is implemented via the ``AttrInfoMap ParsedAttrInfo``
320array, which contains one element per parsed attribute object.
321
322ClangAttrParsedAttrKinds
323------------------------
324
325**Purpose**: Creates AttrParsedAttrKinds.inc, which is used to implement the
326``AttributeList::getKind`` function, mapping a string (and syntax) to a parsed
327attribute ``AttributeList::Kind`` enumeration.
328
329ClangAttrDump
330-------------
331
332**Purpose**: Creates AttrDump.inc, which dumps information about an attribute.
333It is used to implement ``ASTDumper::dumpAttr``.
334
335ClangDiagsDefs
336--------------
337
338Generate Clang diagnostics definitions.
339
340ClangDiagGroups
341---------------
342
343Generate Clang diagnostic groups.
344
345ClangDiagsIndexName
346-------------------
347
348Generate Clang diagnostic name index.
349
350ClangCommentNodes
351-----------------
352
353Generate Clang AST comment nodes.
354
355ClangDeclNodes
356--------------
357
358Generate Clang AST declaration nodes.
359
360ClangStmtNodes
361--------------
362
363Generate Clang AST statement nodes.
364
365ClangSACheckers
366---------------
367
368Generate Clang Static Analyzer checkers.
369
370ClangCommentHTMLTags
371--------------------
372
373Generate efficient matchers for HTML tag names that are used in documentation comments.
374
375ClangCommentHTMLTagsProperties
376------------------------------
377
378Generate efficient matchers for HTML tag properties.
379
380ClangCommentHTMLNamedCharacterReferences
381----------------------------------------
382
383Generate function to translate named character references to UTF-8 sequences.
384
385ClangCommentCommandInfo
386-----------------------
387
388Generate command properties for commands that are used in documentation comments.
389
390ClangCommentCommandList
391-----------------------
392
393Generate list of commands that are used in documentation comments.
394
395ArmNeon
396-------
397
398Generate arm_neon.h for clang.
399
400ArmNeonSema
401-----------
402
403Generate ARM NEON sema support for clang.
404
405ArmNeonTest
406-----------
407
408Generate ARM NEON tests for clang.
409
410AttrDocs
411--------
412
413**Purpose**: Creates ``AttributeReference.rst`` from ``AttrDocs.td``, and is
414used for documenting user-facing attributes.
415
416How to write a back-end
417=======================
418
419TODO.
420
421Until we get a step-by-step HowTo for writing TableGen backends, you can at
422least grab the boilerplate (build system, new files, etc.) from Clang's
423r173931.
424
425TODO: How they work, how to write one.  This section should not contain details
426about any particular backend, except maybe ``-print-enums`` as an example.  This
427should highlight the APIs in ``TableGen/Record.h``.
428
429