1 //===- TableGen.cpp - Top-Level TableGen implementation for Clang ---------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains the main function for Clang's TableGen.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "TableGenBackends.h" // Declares all backends.
15 #include "llvm/Support/CommandLine.h"
16 #include "llvm/Support/PrettyStackTrace.h"
17 #include "llvm/Support/Signals.h"
18 #include "llvm/TableGen/Error.h"
19 #include "llvm/TableGen/Main.h"
20 #include "llvm/TableGen/Record.h"
21 
22 using namespace llvm;
23 using namespace clang;
24 
25 enum ActionType {
26   GenClangAttrClasses,
27   GenClangAttrImpl,
28   GenClangAttrList,
29   GenClangAttrPCHRead,
30   GenClangAttrPCHWrite,
31   GenClangAttrSpellingList,
32   GenClangAttrSpellingListIndex,
33   GenClangAttrLateParsedList,
34   GenClangAttrTemplateInstantiate,
35   GenClangAttrParsedAttrList,
36   GenClangAttrParsedAttrKinds,
37   GenClangAttrDump,
38   GenClangDiagsDefs,
39   GenClangDiagGroups,
40   GenClangDiagsIndexName,
41   GenClangCommentNodes,
42   GenClangDeclNodes,
43   GenClangStmtNodes,
44   GenClangSACheckers,
45   GenClangCommentHTMLTags,
46   GenClangCommentHTMLTagsProperties,
47   GenClangCommentCommandInfo,
48   GenOptParserDefs, GenOptParserImpl,
49   GenArmNeon,
50   GenArmNeonSema,
51   GenArmNeonTest
52 };
53 
54 namespace {
55   cl::opt<ActionType>
56   Action(cl::desc("Action to perform:"),
57          cl::values(clEnumValN(GenOptParserDefs, "gen-opt-parser-defs",
58                                "Generate option definitions"),
59                     clEnumValN(GenOptParserImpl, "gen-opt-parser-impl",
60                                "Generate option parser implementation"),
61                     clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",
62                                "Generate clang attribute clases"),
63                     clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",
64                                "Generate clang attribute implementations"),
65                     clEnumValN(GenClangAttrList, "gen-clang-attr-list",
66                                "Generate a clang attribute list"),
67                     clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read",
68                                "Generate clang PCH attribute reader"),
69                     clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write",
70                                "Generate clang PCH attribute writer"),
71                     clEnumValN(GenClangAttrSpellingList,
72                                "gen-clang-attr-spelling-list",
73                                "Generate a clang attribute spelling list"),
74                     clEnumValN(GenClangAttrSpellingListIndex,
75                                "gen-clang-attr-spelling-index",
76                                "Generate a clang attribute spelling index"),
77                     clEnumValN(GenClangAttrLateParsedList,
78                                "gen-clang-attr-late-parsed-list",
79                                "Generate a clang attribute LateParsed list"),
80                     clEnumValN(GenClangAttrTemplateInstantiate,
81                                "gen-clang-attr-template-instantiate",
82                                "Generate a clang template instantiate code"),
83                     clEnumValN(GenClangAttrParsedAttrList,
84                                "gen-clang-attr-parsed-attr-list",
85                                "Generate a clang parsed attribute list"),
86                     clEnumValN(GenClangAttrParsedAttrKinds,
87                                "gen-clang-attr-parsed-attr-kinds",
88                                "Generate a clang parsed attribute kinds"),
89                     clEnumValN(GenClangAttrDump, "gen-clang-attr-dump",
90                                "Generate clang attribute dumper"),
91                     clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",
92                                "Generate Clang diagnostics definitions"),
93                     clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups",
94                                "Generate Clang diagnostic groups"),
95                     clEnumValN(GenClangDiagsIndexName,
96                                "gen-clang-diags-index-name",
97                                "Generate Clang diagnostic name index"),
98                     clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes",
99                                "Generate Clang AST comment nodes"),
100                     clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes",
101                                "Generate Clang AST declaration nodes"),
102                     clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes",
103                                "Generate Clang AST statement nodes"),
104                     clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers",
105                                "Generate Clang Static Analyzer checkers"),
106                     clEnumValN(GenClangCommentHTMLTags,
107                                "gen-clang-comment-html-tags",
108                                "Generate efficient matchers for HTML tag "
109                                "names that are used in documentation comments"),
110                     clEnumValN(GenClangCommentHTMLTagsProperties,
111                                "gen-clang-comment-html-tags-properties",
112                                "Generate efficient matchers for HTML tag "
113                                "properties"),
114                     clEnumValN(GenClangCommentCommandInfo,
115                                "gen-clang-comment-command-info",
116                                "Generate list of commands that are used in "
117                                "documentation comments"),
118                     clEnumValN(GenArmNeon, "gen-arm-neon",
119                                "Generate arm_neon.h for clang"),
120                     clEnumValN(GenArmNeonSema, "gen-arm-neon-sema",
121                                "Generate ARM NEON sema support for clang"),
122                     clEnumValN(GenArmNeonTest, "gen-arm-neon-test",
123                                "Generate ARM NEON tests for clang"),
124                     clEnumValEnd));
125 
126   cl::opt<std::string>
127   ClangComponent("clang-component",
128                  cl::desc("Only use warnings from specified component"),
129                  cl::value_desc("component"), cl::Hidden);
130 
131 bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
132   switch (Action) {
133   case GenClangAttrClasses:
134     EmitClangAttrClass(Records, OS);
135     break;
136   case GenClangAttrImpl:
137     EmitClangAttrImpl(Records, OS);
138     break;
139   case GenClangAttrList:
140     EmitClangAttrList(Records, OS);
141     break;
142   case GenClangAttrPCHRead:
143     EmitClangAttrPCHRead(Records, OS);
144     break;
145   case GenClangAttrPCHWrite:
146     EmitClangAttrPCHWrite(Records, OS);
147     break;
148   case GenClangAttrSpellingList:
149     EmitClangAttrSpellingList(Records, OS);
150     break;
151   case GenClangAttrSpellingListIndex:
152     EmitClangAttrSpellingListIndex(Records, OS);
153     break;
154   case GenClangAttrLateParsedList:
155     EmitClangAttrLateParsedList(Records, OS);
156     break;
157   case GenClangAttrTemplateInstantiate:
158     EmitClangAttrTemplateInstantiate(Records, OS);
159     break;
160   case GenClangAttrParsedAttrList:
161     EmitClangAttrParsedAttrList(Records, OS);
162     break;
163   case GenClangAttrParsedAttrKinds:
164     EmitClangAttrParsedAttrKinds(Records, OS);
165     break;
166   case GenClangAttrDump:
167     EmitClangAttrDump(Records, OS);
168     break;
169   case GenClangDiagsDefs:
170     EmitClangDiagsDefs(Records, OS, ClangComponent);
171     break;
172   case GenClangDiagGroups:
173     EmitClangDiagGroups(Records, OS);
174     break;
175   case GenClangDiagsIndexName:
176     EmitClangDiagsIndexName(Records, OS);
177     break;
178   case GenClangCommentNodes:
179     EmitClangASTNodes(Records, OS, "Comment", "");
180     break;
181   case GenClangDeclNodes:
182     EmitClangASTNodes(Records, OS, "Decl", "Decl");
183     EmitClangDeclContext(Records, OS);
184     break;
185   case GenClangStmtNodes:
186     EmitClangASTNodes(Records, OS, "Stmt", "");
187     break;
188   case GenClangSACheckers:
189     EmitClangSACheckers(Records, OS);
190     break;
191   case GenClangCommentHTMLTags:
192     EmitClangCommentHTMLTags(Records, OS);
193     break;
194   case GenClangCommentHTMLTagsProperties:
195     EmitClangCommentHTMLTagsProperties(Records, OS);
196     break;
197   case GenClangCommentCommandInfo:
198     EmitClangCommentCommandInfo(Records, OS);
199     break;
200   case GenOptParserDefs:
201     EmitOptParser(Records, OS, true);
202     break;
203   case GenOptParserImpl:
204     EmitOptParser(Records, OS, false);
205     break;
206   case GenArmNeon:
207     EmitNeon(Records, OS);
208     break;
209   case GenArmNeonSema:
210     EmitNeonSema(Records, OS);
211     break;
212   case GenArmNeonTest:
213     EmitNeonTest(Records, OS);
214     break;
215   }
216 
217   return false;
218 }
219 }
220 
221 int main(int argc, char **argv) {
222   sys::PrintStackTraceOnErrorSignal();
223   PrettyStackTraceProgram X(argc, argv);
224   cl::ParseCommandLineOptions(argc, argv);
225 
226   return TableGenMain(argv[0], &ClangTableGenMain);
227 }
228