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