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