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