TableGen.cpp revision 249423
141227Sjdp//===- TableGen.cpp - Top-Level TableGen implementation for Clang ---------===//
241227Sjdp//
341227Sjdp//                     The LLVM Compiler Infrastructure
441227Sjdp//
541227Sjdp// This file is distributed under the University of Illinois Open Source
641227Sjdp// License. See LICENSE.TXT for details.
741227Sjdp//
841227Sjdp//===----------------------------------------------------------------------===//
941227Sjdp//
1041227Sjdp// This file contains the main function for Clang's TableGen.
1141227Sjdp//
1241227Sjdp//===----------------------------------------------------------------------===//
1341227Sjdp
1441227Sjdp#include "TableGenBackends.h" // Declares all backends.
1541227Sjdp#include "llvm/Support/CommandLine.h"
1641227Sjdp#include "llvm/Support/PrettyStackTrace.h"
1741227Sjdp#include "llvm/Support/Signals.h"
1841227Sjdp#include "llvm/TableGen/Error.h"
1941227Sjdp#include "llvm/TableGen/Main.h"
2041227Sjdp#include "llvm/TableGen/Record.h"
2141227Sjdp
2241227Sjdpusing namespace llvm;
2341227Sjdpusing namespace clang;
2441227Sjdp
2541227Sjdpenum ActionType {
2641227Sjdp  GenClangAttrClasses,
2741227Sjdp  GenClangAttrImpl,
2841227Sjdp  GenClangAttrList,
2941227Sjdp  GenClangAttrPCHRead,
3041227Sjdp  GenClangAttrPCHWrite,
3141227Sjdp  GenClangAttrSpellingList,
3241227Sjdp  GenClangAttrSpellingListIndex,
3341227Sjdp  GenClangAttrLateParsedList,
3441227Sjdp  GenClangAttrTemplateInstantiate,
3541227Sjdp  GenClangAttrParsedAttrList,
3641227Sjdp  GenClangAttrParsedAttrKinds,
3741227Sjdp  GenClangAttrDump,
3841227Sjdp  GenClangDiagsDefs,
3941227Sjdp  GenClangDiagGroups,
4041227Sjdp  GenClangDiagsIndexName,
4141227Sjdp  GenClangCommentNodes,
4279476Smarkm  GenClangDeclNodes,
4341227Sjdp  GenClangStmtNodes,
4479476Smarkm  GenClangSACheckers,
4579476Smarkm  GenClangCommentHTMLTags,
4679476Smarkm  GenClangCommentHTMLTagsProperties,
4779476Smarkm  GenClangCommentHTMLNamedCharacterReferences,
4879476Smarkm  GenClangCommentCommandInfo,
4941227Sjdp  GenClangCommentCommandList,
5079476Smarkm  GenOptParserDefs, GenOptParserImpl,
5179476Smarkm  GenArmNeon,
5279476Smarkm  GenArmNeonSema,
5341227Sjdp  GenArmNeonTest
5441227Sjdp};
5541227Sjdp
5641227Sjdpnamespace {
5741227Sjdp  cl::opt<ActionType>
5841227Sjdp  Action(cl::desc("Action to perform:"),
5941227Sjdp         cl::values(clEnumValN(GenOptParserDefs, "gen-opt-parser-defs",
6041227Sjdp                               "Generate option definitions"),
6141227Sjdp                    clEnumValN(GenOptParserImpl, "gen-opt-parser-impl",
6241227Sjdp                               "Generate option parser implementation"),
6341227Sjdp                    clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",
6441227Sjdp                               "Generate clang attribute clases"),
6541227Sjdp                    clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",
6641227Sjdp                               "Generate clang attribute implementations"),
6741227Sjdp                    clEnumValN(GenClangAttrList, "gen-clang-attr-list",
6841227Sjdp                               "Generate a clang attribute list"),
6941227Sjdp                    clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read",
7041227Sjdp                               "Generate clang PCH attribute reader"),
7141227Sjdp                    clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write",
7241227Sjdp                               "Generate clang PCH attribute writer"),
7341227Sjdp                    clEnumValN(GenClangAttrSpellingList,
7441227Sjdp                               "gen-clang-attr-spelling-list",
7541227Sjdp                               "Generate a clang attribute spelling list"),
7641227Sjdp                    clEnumValN(GenClangAttrSpellingListIndex,
7741227Sjdp                               "gen-clang-attr-spelling-index",
7841227Sjdp                               "Generate a clang attribute spelling index"),
7941227Sjdp                    clEnumValN(GenClangAttrLateParsedList,
8041227Sjdp                               "gen-clang-attr-late-parsed-list",
8141227Sjdp                               "Generate a clang attribute LateParsed list"),
8241227Sjdp                    clEnumValN(GenClangAttrTemplateInstantiate,
8341227Sjdp                               "gen-clang-attr-template-instantiate",
8441227Sjdp                               "Generate a clang template instantiate code"),
8541227Sjdp                    clEnumValN(GenClangAttrParsedAttrList,
8641227Sjdp                               "gen-clang-attr-parsed-attr-list",
8741227Sjdp                               "Generate a clang parsed attribute list"),
8841227Sjdp                    clEnumValN(GenClangAttrParsedAttrKinds,
8941227Sjdp                               "gen-clang-attr-parsed-attr-kinds",
9041227Sjdp                               "Generate a clang parsed attribute kinds"),
9141227Sjdp                    clEnumValN(GenClangAttrDump, "gen-clang-attr-dump",
9241227Sjdp                               "Generate clang attribute dumper"),
9341227Sjdp                    clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",
9441227Sjdp                               "Generate Clang diagnostics definitions"),
9541227Sjdp                    clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups",
9641227Sjdp                               "Generate Clang diagnostic groups"),
9741227Sjdp                    clEnumValN(GenClangDiagsIndexName,
9841227Sjdp                               "gen-clang-diags-index-name",
9941227Sjdp                               "Generate Clang diagnostic name index"),
10041227Sjdp                    clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes",
10141227Sjdp                               "Generate Clang AST comment nodes"),
10241227Sjdp                    clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes",
10341227Sjdp                               "Generate Clang AST declaration nodes"),
10441227Sjdp                    clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes",
10541227Sjdp                               "Generate Clang AST statement nodes"),
10641227Sjdp                    clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers",
10741227Sjdp                               "Generate Clang Static Analyzer checkers"),
10841227Sjdp                    clEnumValN(GenClangCommentHTMLTags,
10941227Sjdp                               "gen-clang-comment-html-tags",
11041227Sjdp                               "Generate efficient matchers for HTML tag "
11141227Sjdp                               "names that are used in documentation comments"),
11241227Sjdp                    clEnumValN(GenClangCommentHTMLTagsProperties,
11341227Sjdp                               "gen-clang-comment-html-tags-properties",
11441227Sjdp                               "Generate efficient matchers for HTML tag "
11541227Sjdp                               "properties"),
11641227Sjdp                    clEnumValN(GenClangCommentHTMLNamedCharacterReferences,
11741227Sjdp                               "gen-clang-comment-html-named-character-references",
11841227Sjdp                               "Generate function to translate named character "
11941227Sjdp                               "references to UTF-8 sequences"),
12041227Sjdp                    clEnumValN(GenClangCommentCommandInfo,
12141227Sjdp                               "gen-clang-comment-command-info",
12241227Sjdp                               "Generate command properties for commands that "
12341227Sjdp                               "are used in documentation comments"),
12441227Sjdp                    clEnumValN(GenClangCommentCommandList,
12541227Sjdp                               "gen-clang-comment-command-list",
12641227Sjdp                               "Generate list of commands that are used in "
12741227Sjdp                               "documentation comments"),
12841227Sjdp                    clEnumValN(GenArmNeon, "gen-arm-neon",
12941227Sjdp                               "Generate arm_neon.h for clang"),
13041227Sjdp                    clEnumValN(GenArmNeonSema, "gen-arm-neon-sema",
13141227Sjdp                               "Generate ARM NEON sema support for clang"),
13241227Sjdp                    clEnumValN(GenArmNeonTest, "gen-arm-neon-test",
13341227Sjdp                               "Generate ARM NEON tests for clang"),
13441227Sjdp                    clEnumValEnd));
13541227Sjdp
13641227Sjdp  cl::opt<std::string>
13741227Sjdp  ClangComponent("clang-component",
13841227Sjdp                 cl::desc("Only use warnings from specified component"),
13941227Sjdp                 cl::value_desc("component"), cl::Hidden);
14041227Sjdp
14141227Sjdpbool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
14241227Sjdp  switch (Action) {
14341227Sjdp  case GenClangAttrClasses:
14441227Sjdp    EmitClangAttrClass(Records, OS);
14541227Sjdp    break;
14641227Sjdp  case GenClangAttrImpl:
14741227Sjdp    EmitClangAttrImpl(Records, OS);
14841227Sjdp    break;
14941227Sjdp  case GenClangAttrList:
15041227Sjdp    EmitClangAttrList(Records, OS);
15141227Sjdp    break;
15241227Sjdp  case GenClangAttrPCHRead:
15341227Sjdp    EmitClangAttrPCHRead(Records, OS);
15441227Sjdp    break;
15541227Sjdp  case GenClangAttrPCHWrite:
15641227Sjdp    EmitClangAttrPCHWrite(Records, OS);
15741227Sjdp    break;
15841227Sjdp  case GenClangAttrSpellingList:
15941227Sjdp    EmitClangAttrSpellingList(Records, OS);
16041227Sjdp    break;
16141227Sjdp  case GenClangAttrSpellingListIndex:
16241227Sjdp    EmitClangAttrSpellingListIndex(Records, OS);
16341227Sjdp    break;
16441227Sjdp  case GenClangAttrLateParsedList:
16541227Sjdp    EmitClangAttrLateParsedList(Records, OS);
16641227Sjdp    break;
16741227Sjdp  case GenClangAttrTemplateInstantiate:
16841227Sjdp    EmitClangAttrTemplateInstantiate(Records, OS);
16941227Sjdp    break;
17041227Sjdp  case GenClangAttrParsedAttrList:
17141227Sjdp    EmitClangAttrParsedAttrList(Records, OS);
17241227Sjdp    break;
17341227Sjdp  case GenClangAttrParsedAttrKinds:
17441227Sjdp    EmitClangAttrParsedAttrKinds(Records, OS);
17541227Sjdp    break;
17641227Sjdp  case GenClangAttrDump:
17741227Sjdp    EmitClangAttrDump(Records, OS);
17841227Sjdp    break;
17941227Sjdp  case GenClangDiagsDefs:
18041227Sjdp    EmitClangDiagsDefs(Records, OS, ClangComponent);
18141227Sjdp    break;
18241227Sjdp  case GenClangDiagGroups:
18341227Sjdp    EmitClangDiagGroups(Records, OS);
18441227Sjdp    break;
18541227Sjdp  case GenClangDiagsIndexName:
18641227Sjdp    EmitClangDiagsIndexName(Records, OS);
18741227Sjdp    break;
18841227Sjdp  case GenClangCommentNodes:
18941227Sjdp    EmitClangASTNodes(Records, OS, "Comment", "");
19041227Sjdp    break;
19141227Sjdp  case GenClangDeclNodes:
19241227Sjdp    EmitClangASTNodes(Records, OS, "Decl", "Decl");
19341227Sjdp    EmitClangDeclContext(Records, OS);
19441227Sjdp    break;
19541227Sjdp  case GenClangStmtNodes:
19641227Sjdp    EmitClangASTNodes(Records, OS, "Stmt", "");
19741227Sjdp    break;
19841227Sjdp  case GenClangSACheckers:
19941227Sjdp    EmitClangSACheckers(Records, OS);
20041227Sjdp    break;
20179476Smarkm  case GenClangCommentHTMLTags:
20241227Sjdp    EmitClangCommentHTMLTags(Records, OS);
20379476Smarkm    break;
20441227Sjdp  case GenClangCommentHTMLTagsProperties:
20579476Smarkm    EmitClangCommentHTMLTagsProperties(Records, OS);
20679476Smarkm    break;
20741227Sjdp  case GenClangCommentHTMLNamedCharacterReferences:
20841227Sjdp    EmitClangCommentHTMLNamedCharacterReferences(Records, OS);
20941227Sjdp    break;
21079476Smarkm  case GenClangCommentCommandInfo:
21141227Sjdp    EmitClangCommentCommandInfo(Records, OS);
21279476Smarkm    break;
21341227Sjdp  case GenClangCommentCommandList:
21479476Smarkm    EmitClangCommentCommandList(Records, OS);
21579476Smarkm    break;
21679476Smarkm  case GenOptParserDefs:
21779476Smarkm    EmitOptParser(Records, OS, true);
21879476Smarkm    break;
21979476Smarkm  case GenOptParserImpl:
22079476Smarkm    EmitOptParser(Records, OS, false);
22179476Smarkm    break;
22279476Smarkm  case GenArmNeon:
22379476Smarkm    EmitNeon(Records, OS);
22479476Smarkm    break;
22579476Smarkm  case GenArmNeonSema:
22679476Smarkm    EmitNeonSema(Records, OS);
22779476Smarkm    break;
22879476Smarkm  case GenArmNeonTest:
22979476Smarkm    EmitNeonTest(Records, OS);
23079476Smarkm    break;
23179476Smarkm  }
23279476Smarkm
23341227Sjdp  return false;
23479476Smarkm}
23541227Sjdp}
23679476Smarkm
23779476Smarkmint main(int argc, char **argv) {
23879476Smarkm  sys::PrintStackTraceOnErrorSignal();
23941227Sjdp  PrettyStackTraceProgram X(argc, argv);
24041227Sjdp  cl::ParseCommandLineOptions(argc, argv);
24141227Sjdp
24279476Smarkm  return TableGenMain(argv[0], &ClangTableGenMain);
24341227Sjdp}
24479476Smarkm