blob: 1eb369077e1cbdd59e3af45a097ae6379616e4d4 [file] [log] [blame]
Alexander Kornienkod7166b02012-08-22 20:52:52 +00001//===--- tools/clang-check/ClangCheck.cpp - Clang check tool --------------===//
Manuel Klimekcb971c62012-04-04 12:07:46 +00002//
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 implements a clang-check tool that runs the
11// clang::SyntaxOnlyAction over a number of translation units.
12//
Alexander Kornienkodea8fba2012-07-16 12:46:48 +000013// This tool uses the Clang Tooling infrastructure, see
14// http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
15// for details on setting it up with LLVM source tree.
16//
Manuel Klimekcb971c62012-04-04 12:07:46 +000017//===----------------------------------------------------------------------===//
18
Alexander Kornienko48464702012-08-13 10:50:08 +000019#include "clang/AST/ASTConsumer.h"
20#include "clang/Driver/OptTable.h"
21#include "clang/Driver/Options.h"
22#include "clang/Frontend/ASTConsumers.h"
Alexander Kornienkod7166b02012-08-22 20:52:52 +000023#include "clang/Tooling/CommonOptionsParser.h"
Manuel Klimekcb971c62012-04-04 12:07:46 +000024#include "clang/Tooling/Tooling.h"
Alexander Kornienkod7166b02012-08-22 20:52:52 +000025#include "llvm/Support/CommandLine.h"
Manuel Klimekcb971c62012-04-04 12:07:46 +000026
Alexander Kornienko48464702012-08-13 10:50:08 +000027using namespace clang::driver;
Manuel Klimekcb971c62012-04-04 12:07:46 +000028using namespace clang::tooling;
29using namespace llvm;
30
Alexander Kornienko6fbe9822012-08-24 00:39:14 +000031static cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage);
Alexander Kornienkod7166b02012-08-22 20:52:52 +000032static cl::extrahelp MoreHelp(
Alexander Kornienkodea8fba2012-07-16 12:46:48 +000033 "\tFor example, to run clang-check on all files in a subtree of the\n"
34 "\tsource tree, use:\n"
Alexander Kornienko140d5132012-07-12 14:34:23 +000035 "\n"
Alexander Kornienkodea8fba2012-07-16 12:46:48 +000036 "\t find path/in/subtree -name '*.cpp'|xargs clang-check\n"
Alexander Kornienko140d5132012-07-12 14:34:23 +000037 "\n"
Alexander Kornienkodea8fba2012-07-16 12:46:48 +000038 "\tor using a specific build path:\n"
Alexander Kornienko140d5132012-07-12 14:34:23 +000039 "\n"
Alexander Kornienkodea8fba2012-07-16 12:46:48 +000040 "\t find path/in/subtree -name '*.cpp'|xargs clang-check -p build/path\n"
Alexander Kornienko140d5132012-07-12 14:34:23 +000041 "\n"
Alexander Kornienkodea8fba2012-07-16 12:46:48 +000042 "\tNote, that path/in/subtree and current directory should follow the\n"
43 "\trules described above.\n"
Alexander Kornienkod7166b02012-08-22 20:52:52 +000044 "\n"
45);
46
47static OwningPtr<OptTable> Options(createDriverOptTable());
48static cl::opt<bool> ASTDump(
49 "ast-dump",
50 cl::desc(Options->getOptionHelpText(options::OPT_ast_dump)));
51static cl::opt<bool> ASTList(
52 "ast-list",
53 cl::desc(Options->getOptionHelpText(options::OPT_ast_list)));
54static cl::opt<bool> ASTPrint(
55 "ast-print",
56 cl::desc(Options->getOptionHelpText(options::OPT_ast_print)));
57static cl::opt<std::string> ASTDumpFilter(
58 "ast-dump-filter",
59 cl::desc(Options->getOptionHelpText(options::OPT_ast_dump_filter)));
Alexander Kornienko140d5132012-07-12 14:34:23 +000060
Alexander Kornienkoc80ca022012-09-07 22:44:34 +000061// Anonymous namespace here causes problems with gcc <= 4.4 on MacOS:
62// http://llvm.org/bugs/show_bug.cgi?id=13777
63// namespace {
Alexander Kornienko48464702012-08-13 10:50:08 +000064class ActionFactory {
65public:
Alexander Kornienko48464702012-08-13 10:50:08 +000066 clang::ASTConsumer *newASTConsumer() {
67 if (ASTList)
68 return clang::CreateASTDeclNodeLister();
69 if (ASTDump)
70 return clang::CreateASTDumper(ASTDumpFilter);
71 if (ASTPrint)
72 return clang::CreateASTPrinter(&llvm::outs(), ASTDumpFilter);
73 return new clang::ASTConsumer();
74 }
Alexander Kornienko48464702012-08-13 10:50:08 +000075};
Alexander Kornienkoc80ca022012-09-07 22:44:34 +000076// }
Alexander Kornienko48464702012-08-13 10:50:08 +000077
Manuel Klimek30318e62012-04-18 07:41:50 +000078int main(int argc, const char **argv) {
Alexander Kornienko48464702012-08-13 10:50:08 +000079 ActionFactory Factory;
Alexander Kornienkod7166b02012-08-22 20:52:52 +000080 CommonOptionsParser OptionsParser(argc, argv);
81 ClangTool Tool(OptionsParser.GetCompilations(),
82 OptionsParser.GetSourcePathList());
Alexander Kornienko48464702012-08-13 10:50:08 +000083 return Tool.run(newFrontendActionFactory(&Factory));
Manuel Klimekcb971c62012-04-04 12:07:46 +000084}