• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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   GenClangAttrExprArgsList,
28   GenClangAttrImpl,
29   GenClangAttrList,
30   GenClangAttrPCHRead,
31   GenClangAttrPCHWrite,
32   GenClangAttrSpellingList,
33   GenClangAttrSpellingListIndex,
34   GenClangAttrLateParsedList,
35   GenClangAttrTemplateInstantiate,
36   GenClangAttrParsedAttrList,
37   GenClangAttrParsedAttrKinds,
38   GenClangAttrDump,
39   GenClangDiagsDefs,
40   GenClangDiagGroups,
41   GenClangDiagsIndexName,
42   GenClangCommentNodes,
43   GenClangDeclNodes,
44   GenClangStmtNodes,
45   GenClangSACheckers,
46   GenClangCommentHTMLTags,
47   GenClangCommentHTMLTagsProperties,
48   GenClangCommentHTMLNamedCharacterReferences,
49   GenClangCommentCommandInfo,
50   GenClangCommentCommandList,
51   GenArmNeon,
52   GenArmNeonSema,
53   GenArmNeonTest
54 };
55 
56 namespace {
57   cl::opt<ActionType>
58   Action(cl::desc("Action to perform:"),
59          cl::values(clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",
60                                "Generate clang attribute clases"),
61                     clEnumValN(GenClangAttrExprArgsList,
62                                "gen-clang-attr-expr-args-list",
63                                "Generate a clang attribute expression "
64                                "arguments list"),
65                     clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",
66                                "Generate clang attribute implementations"),
67                     clEnumValN(GenClangAttrList, "gen-clang-attr-list",
68                                "Generate a clang attribute list"),
69                     clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read",
70                                "Generate clang PCH attribute reader"),
71                     clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write",
72                                "Generate clang PCH attribute writer"),
73                     clEnumValN(GenClangAttrSpellingList,
74                                "gen-clang-attr-spelling-list",
75                                "Generate a clang attribute spelling list"),
76                     clEnumValN(GenClangAttrSpellingListIndex,
77                                "gen-clang-attr-spelling-index",
78                                "Generate a clang attribute spelling index"),
79                     clEnumValN(GenClangAttrLateParsedList,
80                                "gen-clang-attr-late-parsed-list",
81                                "Generate a clang attribute LateParsed list"),
82                     clEnumValN(GenClangAttrTemplateInstantiate,
83                                "gen-clang-attr-template-instantiate",
84                                "Generate a clang template instantiate code"),
85                     clEnumValN(GenClangAttrParsedAttrList,
86                                "gen-clang-attr-parsed-attr-list",
87                                "Generate a clang parsed attribute list"),
88                     clEnumValN(GenClangAttrParsedAttrKinds,
89                                "gen-clang-attr-parsed-attr-kinds",
90                                "Generate a clang parsed attribute kinds"),
91                     clEnumValN(GenClangAttrDump, "gen-clang-attr-dump",
92                                "Generate clang attribute dumper"),
93                     clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",
94                                "Generate Clang diagnostics definitions"),
95                     clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups",
96                                "Generate Clang diagnostic groups"),
97                     clEnumValN(GenClangDiagsIndexName,
98                                "gen-clang-diags-index-name",
99                                "Generate Clang diagnostic name index"),
100                     clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes",
101                                "Generate Clang AST comment nodes"),
102                     clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes",
103                                "Generate Clang AST declaration nodes"),
104                     clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes",
105                                "Generate Clang AST statement nodes"),
106                     clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers",
107                                "Generate Clang Static Analyzer checkers"),
108                     clEnumValN(GenClangCommentHTMLTags,
109                                "gen-clang-comment-html-tags",
110                                "Generate efficient matchers for HTML tag "
111                                "names that are used in documentation comments"),
112                     clEnumValN(GenClangCommentHTMLTagsProperties,
113                                "gen-clang-comment-html-tags-properties",
114                                "Generate efficient matchers for HTML tag "
115                                "properties"),
116                     clEnumValN(GenClangCommentHTMLNamedCharacterReferences,
117                                "gen-clang-comment-html-named-character-references",
118                                "Generate function to translate named character "
119                                "references to UTF-8 sequences"),
120                     clEnumValN(GenClangCommentCommandInfo,
121                                "gen-clang-comment-command-info",
122                                "Generate command properties for commands that "
123                                "are used in documentation comments"),
124                     clEnumValN(GenClangCommentCommandList,
125                                "gen-clang-comment-command-list",
126                                "Generate list of commands that are used in "
127                                "documentation comments"),
128                     clEnumValN(GenArmNeon, "gen-arm-neon",
129                                "Generate arm_neon.h for clang"),
130                     clEnumValN(GenArmNeonSema, "gen-arm-neon-sema",
131                                "Generate ARM NEON sema support for clang"),
132                     clEnumValN(GenArmNeonTest, "gen-arm-neon-test",
133                                "Generate ARM NEON tests for clang"),
134                     clEnumValEnd));
135 
136   cl::opt<std::string>
137   ClangComponent("clang-component",
138                  cl::desc("Only use warnings from specified component"),
139                  cl::value_desc("component"), cl::Hidden);
140 
ClangTableGenMain(raw_ostream & OS,RecordKeeper & Records)141 bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
142   switch (Action) {
143   case GenClangAttrClasses:
144     EmitClangAttrClass(Records, OS);
145     break;
146   case GenClangAttrExprArgsList:
147     EmitClangAttrExprArgsList(Records, OS);
148     break;
149   case GenClangAttrImpl:
150     EmitClangAttrImpl(Records, OS);
151     break;
152   case GenClangAttrList:
153     EmitClangAttrList(Records, OS);
154     break;
155   case GenClangAttrPCHRead:
156     EmitClangAttrPCHRead(Records, OS);
157     break;
158   case GenClangAttrPCHWrite:
159     EmitClangAttrPCHWrite(Records, OS);
160     break;
161   case GenClangAttrSpellingList:
162     EmitClangAttrSpellingList(Records, OS);
163     break;
164   case GenClangAttrSpellingListIndex:
165     EmitClangAttrSpellingListIndex(Records, OS);
166     break;
167   case GenClangAttrLateParsedList:
168     EmitClangAttrLateParsedList(Records, OS);
169     break;
170   case GenClangAttrTemplateInstantiate:
171     EmitClangAttrTemplateInstantiate(Records, OS);
172     break;
173   case GenClangAttrParsedAttrList:
174     EmitClangAttrParsedAttrList(Records, OS);
175     break;
176   case GenClangAttrParsedAttrKinds:
177     EmitClangAttrParsedAttrKinds(Records, OS);
178     break;
179   case GenClangAttrDump:
180     EmitClangAttrDump(Records, OS);
181     break;
182   case GenClangDiagsDefs:
183     EmitClangDiagsDefs(Records, OS, ClangComponent);
184     break;
185   case GenClangDiagGroups:
186     EmitClangDiagGroups(Records, OS);
187     break;
188   case GenClangDiagsIndexName:
189     EmitClangDiagsIndexName(Records, OS);
190     break;
191   case GenClangCommentNodes:
192     EmitClangASTNodes(Records, OS, "Comment", "");
193     break;
194   case GenClangDeclNodes:
195     EmitClangASTNodes(Records, OS, "Decl", "Decl");
196     EmitClangDeclContext(Records, OS);
197     break;
198   case GenClangStmtNodes:
199     EmitClangASTNodes(Records, OS, "Stmt", "");
200     break;
201   case GenClangSACheckers:
202     EmitClangSACheckers(Records, OS);
203     break;
204   case GenClangCommentHTMLTags:
205     EmitClangCommentHTMLTags(Records, OS);
206     break;
207   case GenClangCommentHTMLTagsProperties:
208     EmitClangCommentHTMLTagsProperties(Records, OS);
209     break;
210   case GenClangCommentHTMLNamedCharacterReferences:
211     EmitClangCommentHTMLNamedCharacterReferences(Records, OS);
212     break;
213   case GenClangCommentCommandInfo:
214     EmitClangCommentCommandInfo(Records, OS);
215     break;
216   case GenClangCommentCommandList:
217     EmitClangCommentCommandList(Records, OS);
218     break;
219   case GenArmNeon:
220     EmitNeon(Records, OS);
221     break;
222   case GenArmNeonSema:
223     EmitNeonSema(Records, OS);
224     break;
225   case GenArmNeonTest:
226     EmitNeonTest(Records, OS);
227     break;
228   }
229 
230   return false;
231 }
232 }
233 
main(int argc,char ** argv)234 int main(int argc, char **argv) {
235   sys::PrintStackTraceOnErrorSignal();
236   PrettyStackTraceProgram X(argc, argv);
237   cl::ParseCommandLineOptions(argc, argv);
238 
239   return TableGenMain(argv[0], &ClangTableGenMain);
240 }
241