[cfe-commits] r160265 - in /cfe/trunk: include/clang/Tooling/CommandLineClangTool.h lib/Tooling/CMakeLists.txt lib/Tooling/CommandLineClangTool.cpp test/CMakeLists.txt test/Tooling/clang-ast-dump.cpp tools/CMakeLists.txt tools/Makefile tools/clan

Manuel Klimek klimek at google.com
Mon Jul 16 23:56:06 PDT 2012


On Tue, Jul 17, 2012 at 7:22 AM, Douglas Gregor <dgregor at apple.com> wrote:
>
> On Jul 16, 2012, at 5:46 AM, Alexander Kornienko <alexfh at google.com> wrote:
>
>> Author: alexfh
>> Date: Mon Jul 16 07:46:48 2012
>> New Revision: 160265
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=160265&view=rev
>> Log:
>> The new clang-ast-dump tool for selective AST dumping. Moved common command-line tool stuff to CommandLineClangTool
>
> I don't think this belongs in the Clang repository because:
>
>         1) It's built on a *debugging* option, the XML dumper, which is neither actively maintained nor complete enough to build any tool upon
>         2) It provides no value for users of Clang
>         3) It provides very little value for developers of Clang tools, since it does little more than clang + grep
>         4) It fails nearly all of the criteria for a Clang extension outlined in http://clang.llvm.org/get_involved.html
>
> I'll be happy to hear opinions to the contrary (Manuel?), but barring some killer argument for this feature, I'd like it reverted.

I'll provide an argument for why I think this belongs in clang
mainline, but it's also no sweat to pull it into the (hopefully soon
available) tooling repo.

There are 2 killer features for this vs. clang -ast-dump-xml:
- clang -ast-dump-xml + grep doesn't scale: outputting a whole AST in
text often produces > 20GB of output and takes a long, long time -
grepping just on the node names is really fast
- clang -ast-dump-xml requires the user to first get a correct -cc1
invocation, which is non-trivial for people who just write tools

Overall, a way to dump the AST is critical to writing clang tools,
especially while you're learning the AST. Being able to dump parts of
the AST of the source you want to work on makes it far easier to find
out why the AST looks the way it does at a certain place where your
refactoring doesn't work than trying to reproduce that with a minimal
source file that doesn't use any non-builtin includes. Many tool
writers are not hardcore C++ experts (the ones that are obviously
don't need the tool that much), and one of the goals for us is to make
writing C++ tools possible for normal people ;)

One thing that obviously needs to be addressed is what to do in
release mode. Independently of where we put this tool, I think having
a supported (we're going to support it ;) version of an ASTDumpXML
frontend action that works in release mode is important to us, so we
can build a tool and release it to our internal customers by default
in a release build. My proposal would be to change the builtin clang
version to completely not depend on it in release mode, as Alex
pointed out. Open to other ideas, though.

Please advice in how to proceed. As I said, migrating this into the
new repo is easy enough. Also, any changes you want to see to make it
more in line with the extension policy would be interesting for me, so
I can make better decisions on changes like this in the future (I
think most of the policy points are met, or are meant to be met (minus
us screwing up, but that's why we have reviews :), or not applicable).

Cheers,
/Manuel

> Sorry I couldn't chime in during the review; I just returned from a vacation during which I was not reading cfe-commits.
>
>         - Doug
>
>> Added:
>>    cfe/trunk/include/clang/Tooling/CommandLineClangTool.h
>>    cfe/trunk/lib/Tooling/CommandLineClangTool.cpp
>>    cfe/trunk/test/Tooling/clang-ast-dump.cpp
>>    cfe/trunk/tools/clang-ast-dump/
>>    cfe/trunk/tools/clang-ast-dump/CMakeLists.txt
>>    cfe/trunk/tools/clang-ast-dump/ClangASTDump.cpp
>>    cfe/trunk/tools/clang-ast-dump/Makefile
>> Modified:
>>    cfe/trunk/lib/Tooling/CMakeLists.txt
>>    cfe/trunk/test/CMakeLists.txt
>>    cfe/trunk/tools/CMakeLists.txt
>>    cfe/trunk/tools/Makefile
>>    cfe/trunk/tools/clang-check/ClangCheck.cpp
>>
>> Added: cfe/trunk/include/clang/Tooling/CommandLineClangTool.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Tooling/CommandLineClangTool.h?rev=160265&view=auto
>> ==============================================================================
>> --- cfe/trunk/include/clang/Tooling/CommandLineClangTool.h (added)
>> +++ cfe/trunk/include/clang/Tooling/CommandLineClangTool.h Mon Jul 16 07:46:48 2012
>> @@ -0,0 +1,80 @@
>> +//===- CommandLineClangTool.h - command-line clang tools driver -*- C++ -*-===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//  This file implements the CommandLineClangTool class used to run clang
>> +//  tools as separate command-line applications with a consistent common
>> +//  interface for handling compilation database and input files.
>> +//
>> +//  It provides a common subset of command-line options, common algorithm
>> +//  for locating a compilation database and source files, and help messages
>> +//  for the basic command-line interface.
>> +//
>> +//  It creates a CompilationDatabase, initializes a ClangTool and runs a
>> +//  user-specified FrontendAction over all TUs in which the given files are
>> +//  compiled.
>> +//
>> +//  This class uses the Clang Tooling infrastructure, see
>> +//    http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
>> +//  for details on setting it up with LLVM source tree.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMANDLINECLANGTOOL_H
>> +#define LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMANDLINECLANGTOOL_H
>> +
>> +#include "llvm/Support/CommandLine.h"
>> +#include "clang/Tooling/CompilationDatabase.h"
>> +
>> +namespace clang {
>> +
>> +namespace tooling {
>> +
>> +class CompilationDatabase;
>> +class FrontendActionFactory;
>> +
>> +/// \brief A common driver for command-line Clang tools.
>> +///
>> +/// Parses a common subset of command-line arguments, locates and loads a
>> +/// compilation commands database, runs a tool with user-specified action. It
>> +/// also contains a help message for the common command-line options.
>> +/// An example of usage:
>> +/// @code
>> +/// int main(int argc, const char **argv) {
>> +///   CommandLineClangTool Tool;
>> +///   cl::extrahelp MoreHelp("\nMore help text...");
>> +///   Tool.initialize(argc, argv);
>> +///   return Tool.run(newFrontendActionFactory<clang::SyntaxOnlyAction>());
>> +/// }
>> +/// @endcode
>> +///
>> +class CommandLineClangTool {
>> +public:
>> +  /// Sets up command-line options and help messages.
>> +  /// Add your own help messages after constructing this tool.
>> +  CommandLineClangTool();
>> +
>> +  /// Parses command-line, initializes a compilation database.
>> +  /// This method exits program in case of error.
>> +  void initialize(int argc, const char **argv);
>> +
>> +  /// Runs a clang tool with an action created by \c ActionFactory.
>> +  int run(FrontendActionFactory *ActionFactory);
>> +
>> +private:
>> +  llvm::OwningPtr<CompilationDatabase> Compilations;
>> +  llvm::cl::opt<std::string> BuildPath;
>> +  llvm::cl::list<std::string> SourcePaths;
>> +  llvm::cl::extrahelp MoreHelp;
>> +};
>> +
>> +} // namespace tooling
>> +
>> +} // namespace clang
>> +
>> +#endif  // LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMANDLINECLANGTOOL_H
>>
>> Modified: cfe/trunk/lib/Tooling/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Tooling/CMakeLists.txt?rev=160265&r1=160264&r2=160265&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Tooling/CMakeLists.txt (original)
>> +++ cfe/trunk/lib/Tooling/CMakeLists.txt Mon Jul 16 07:46:48 2012
>> @@ -1,6 +1,7 @@
>> set(LLVM_LINK_COMPONENTS support)
>>
>> add_clang_library(clangTooling
>> +  CommandLineClangTool.cpp
>>   CompilationDatabase.cpp
>>   Refactoring.cpp
>>   Tooling.cpp
>>
>> Added: cfe/trunk/lib/Tooling/CommandLineClangTool.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Tooling/CommandLineClangTool.cpp?rev=160265&view=auto
>> ==============================================================================
>> --- cfe/trunk/lib/Tooling/CommandLineClangTool.cpp (added)
>> +++ cfe/trunk/lib/Tooling/CommandLineClangTool.cpp Mon Jul 16 07:46:48 2012
>> @@ -0,0 +1,80 @@
>> +//===--- CommandLineClangTool.cpp - command-line clang tools driver -------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//  This file implements the CommandLineClangTool class used to run clang
>> +//  tools as separate command-line applications with a consistent common
>> +//  interface for handling compilation database and input files.
>> +//
>> +//  It provides a common subset of command-line options, common algorithm
>> +//  for locating a compilation database and source files, and help messages
>> +//  for the basic command-line interface.
>> +//
>> +//  It creates a CompilationDatabase, initializes a ClangTool and runs a
>> +//  user-specified FrontendAction over all TUs in which the given files are
>> +//  compiled.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "clang/Frontend/FrontendActions.h"
>> +#include "clang/Tooling/CommandLineClangTool.h"
>> +#include "clang/Tooling/Tooling.h"
>> +
>> +using namespace clang::tooling;
>> +using namespace llvm;
>> +
>> +static const char *MoreHelpText =
>> +    "\n"
>> +    "-p <build-path> is used to read a compile command database.\n"
>> +    "\n"
>> +    "\tFor example, it can be a CMake build directory in which a file named\n"
>> +    "\tcompile_commands.json exists (use -DCMAKE_EXPORT_COMPILE_COMMANDS=ON\n"
>> +    "\tCMake option to get this output). When no build path is specified,\n"
>> +    "\tclang-check will attempt to locate it automatically using all parent\n"
>> +    "\tpaths of the first input file. See:\n"
>> +    "\thttp://clang.llvm.org/docs/HowToSetupToolingForLLVM.html for an\n"
>> +    "\texample of setting up Clang Tooling on a source tree.\n"
>> +    "\n"
>> +    "<source0> ... specify the paths of source files. These paths are looked\n"
>> +    "\tup in the compile command database. If the path of a file is absolute,\n"
>> +    "\tit needs to point into CMake's source tree. If the path is relative,\n"
>> +    "\tthe current working directory needs to be in the CMake source tree and\n"
>> +    "\tthe file must be in a subdirectory of the current working directory.\n"
>> +    "\t\"./\" prefixes in the relative files will be automatically removed,\n"
>> +    "\tbut the rest of a relative path must be a suffix of a path in the\n"
>> +    "\tcompile command database.\n"
>> +    "\n";
>> +
>> +CommandLineClangTool::CommandLineClangTool() :
>> +    BuildPath("p", cl::desc("Build path"), cl::Optional),
>> +    SourcePaths(cl::Positional, cl::desc("<source0> [... <sourceN>]"),
>> +                cl::OneOrMore),
>> +    MoreHelp(MoreHelpText) {
>> +}
>> +
>> +void CommandLineClangTool::initialize(int argc, const char **argv) {
>> +  Compilations.reset(FixedCompilationDatabase::loadFromCommandLine(argc, argv));
>> +  cl::ParseCommandLineOptions(argc, argv);
>> +  if (!Compilations) {
>> +    std::string ErrorMessage;
>> +    if (!BuildPath.empty()) {
>> +      Compilations.reset(CompilationDatabase::autoDetectFromDirectory(
>> +                              BuildPath, ErrorMessage));
>> +    } else {
>> +      Compilations.reset(CompilationDatabase::autoDetectFromSource(
>> +                              SourcePaths[0], ErrorMessage));
>> +    }
>> +    if (!Compilations)
>> +      llvm::report_fatal_error(ErrorMessage);
>> +  }
>> +}
>> +
>> +int CommandLineClangTool::run(FrontendActionFactory *ActionFactory) {
>> +  ClangTool Tool(*Compilations, SourcePaths);
>> +  return Tool.run(ActionFactory);
>> +}
>>
>> Modified: cfe/trunk/test/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CMakeLists.txt?rev=160265&r1=160264&r2=160265&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/CMakeLists.txt (original)
>> +++ cfe/trunk/test/CMakeLists.txt Mon Jul 16 07:46:48 2012
>> @@ -31,7 +31,7 @@
>>   set(CLANG_TEST_DEPS
>>     clang clang-headers
>>     c-index-test diagtool arcmt-test c-arcmt-test
>> -    clang-check
>> +    clang-check clang-ast-dump
>>     llvm-dis llc opt FileCheck count not
>>     )
>>   set(CLANG_TEST_PARAMS
>> @@ -80,7 +80,7 @@
>>       COMMENT "Running Clang regression tests"
>>       DEPENDS clang clang-headers
>>               c-index-test diagtool arcmt-test c-arcmt-test
>> -              clang-check
>> +              clang-check clang-ast-dump
>>       )
>>     set_target_properties(check-clang PROPERTIES FOLDER "Clang tests")
>>   endif()
>>
>> Added: cfe/trunk/test/Tooling/clang-ast-dump.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/clang-ast-dump.cpp?rev=160265&view=auto
>> ==============================================================================
>> --- cfe/trunk/test/Tooling/clang-ast-dump.cpp (added)
>> +++ cfe/trunk/test/Tooling/clang-ast-dump.cpp Mon Jul 16 07:46:48 2012
>> @@ -0,0 +1,22 @@
>> +// RUN: clang-ast-dump "%t/test.cpp" -f test_namespace::TheClass::theMethod -- -c 2>&1|FileCheck %s
>> +// FIXME: Make the above easier.
>> +
>> +// CHECK: <CXXMethod ptr="0x{{[0-9a-f]+}}" name="theMethod" prototype="true">
>> +// CHECK:  <ParmVar ptr="0x{{[0-9a-f]+}}" name="x" initstyle="c">
>> +// CHECK: (CompoundStmt
>> +// CHECK-NEXT:   (ReturnStmt
>> +// CHECK-NEXT:     (BinaryOperator
>> +
>> +namespace test_namespace {
>> +
>> +class TheClass {
>> +public:
>> +  int theMethod(int x) {
>> +    return x + x;
>> +  }
>> +};
>> +
>> +}
>> +
>> +// FIXME: This is incompatible to -fms-compatibility.
>> +// XFAIL: win32
>>
>> Modified: cfe/trunk/tools/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/CMakeLists.txt?rev=160265&r1=160264&r2=160265&view=diff
>> ==============================================================================
>> --- cfe/trunk/tools/CMakeLists.txt (original)
>> +++ cfe/trunk/tools/CMakeLists.txt Mon Jul 16 07:46:48 2012
>> @@ -5,3 +5,4 @@
>> add_subdirectory(diagtool)
>> add_subdirectory(driver)
>> add_subdirectory(clang-check)
>> +add_subdirectory(clang-ast-dump)
>>
>> Modified: cfe/trunk/tools/Makefile
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/Makefile?rev=160265&r1=160264&r2=160265&view=diff
>> ==============================================================================
>> --- cfe/trunk/tools/Makefile (original)
>> +++ cfe/trunk/tools/Makefile Mon Jul 16 07:46:48 2012
>> @@ -9,7 +9,7 @@
>>
>> CLANG_LEVEL := ..
>> DIRS := driver libclang c-index-test arcmt-test c-arcmt-test diagtool \
>> -        clang-check
>> +        clang-check clang-ast-dump
>>
>> include $(CLANG_LEVEL)/../../Makefile.config
>>
>>
>> Added: cfe/trunk/tools/clang-ast-dump/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-ast-dump/CMakeLists.txt?rev=160265&view=auto
>> ==============================================================================
>> --- cfe/trunk/tools/clang-ast-dump/CMakeLists.txt (added)
>> +++ cfe/trunk/tools/clang-ast-dump/CMakeLists.txt Mon Jul 16 07:46:48 2012
>> @@ -0,0 +1,8 @@
>> +add_clang_executable(clang-ast-dump
>> +  ClangASTDump.cpp
>> +  )
>> +
>> +target_link_libraries(clang-ast-dump
>> +  clangTooling
>> +  clangBasic
>> +  )
>>
>> Added: cfe/trunk/tools/clang-ast-dump/ClangASTDump.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-ast-dump/ClangASTDump.cpp?rev=160265&view=auto
>> ==============================================================================
>> --- cfe/trunk/tools/clang-ast-dump/ClangASTDump.cpp (added)
>> +++ cfe/trunk/tools/clang-ast-dump/ClangASTDump.cpp Mon Jul 16 07:46:48 2012
>> @@ -0,0 +1,141 @@
>> +//===- tools/clang-ast-dump/ClangASTDump.cpp - Clang AST Dump tool --------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//  This file implements a clang-ast-dump tool that dumps specified parts
>> +//  of an AST of a number of translation units.
>> +//
>> +//  Run with '-help' for details.
>> +//
>> +//  This tool uses the Clang Tooling infrastructure, see
>> +//    http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
>> +//  for details on setting it up with LLVM source tree.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "llvm/Support/CommandLine.h"
>> +#include "clang/AST/ASTContext.h"
>> +#include "clang/AST/ASTConsumer.h"
>> +#include "clang/AST/RecursiveASTVisitor.h"
>> +#include "clang/Frontend/FrontendActions.h"
>> +#include "clang/Tooling/CommandLineClangTool.h"
>> +#include "clang/Tooling/Tooling.h"
>> +
>> +using namespace clang::tooling;
>> +using namespace llvm;
>> +
>> +cl::opt<std::string> FilterString(
>> +  "f",
>> +  cl::desc("Filter string"),
>> +  cl::Optional);
>> +
>> +cl::opt<bool> ListAll(
>> +  "l",
>> +  cl::desc("List all filterable nodes"),
>> +  cl::init(false),
>> +  cl::Optional);
>> +
>> +static const char *MoreHelpText =
>> +    "-f <filter-string> can be used to dump only AST declaration nodes having\n"
>> +    "\ta certain substring in a qualified name.\n"
>> +    "\n"
>> +    "-l \tlists qualified names of all filterable declaration nodes.\n"
>> +    "\n";
>> +
>> +namespace {
>> +
>> +using namespace clang;
>> +
>> +class SelectiveDumpVisitor :
>> +     public RecursiveASTVisitor<SelectiveDumpVisitor> {
>> +  typedef RecursiveASTVisitor<SelectiveDumpVisitor> base;
>> +public:
>> +  SelectiveDumpVisitor(const std::string &FilterString, bool ListAll)
>> +      : FilterString(FilterString), ListAll(ListAll) {}
>> +
>> +  ASTConsumer* newASTConsumer() {
>> +    return new DumpConsumer(this);
>> +  }
>> +
>> +  bool shouldWalkTypesOfTypeLocs() const { return false; }
>> +
>> +  void Run(TranslationUnitDecl *D) {
>> +    if (ListAll) {
>> +      llvm::outs().changeColor(llvm::raw_ostream::BLUE) <<
>> +          "Listing all filterable nodes:\n";
>> +      llvm::outs().resetColor();
>> +      TraverseDecl(D);
>> +      return;
>> +    }
>> +
>> +    if (FilterString.empty()) {
>> +      llvm::outs().changeColor(llvm::raw_ostream::BLUE) <<
>> +          "Dumping translation unit:\n";
>> +      llvm::outs().resetColor();
>> +      D->dumpXML(llvm::outs());
>> +      return;
>> +    }
>> +
>> +    TraverseDecl(D);
>> +  }
>> +
>> +  bool TraverseDecl(Decl *D) {
>> +    if (ListAll) {
>> +      std::string Name = getName(D);
>> +      if (!Name.empty())
>> +        llvm::outs() << Name << "\n";
>> +      return base::TraverseDecl(D);
>> +    }
>> +
>> +    if (filterMatches(D)) {
>> +      llvm::outs().changeColor(llvm::raw_ostream::BLUE) <<
>> +          "Dumping " << getName(D) << ":\n";
>> +      llvm::outs().resetColor();
>> +      D->dumpXML(llvm::outs());
>> +      return true;
>> +    }
>> +    return base::TraverseDecl(D);
>> +  }
>> +
>> +private:
>> +  std::string getName(Decl *D) {
>> +    if (isa<NamedDecl>(D))
>> +      return cast<NamedDecl>(D)->getQualifiedNameAsString();
>> +    return "";
>> +  }
>> +  bool filterMatches(Decl *D) {
>> +    return getName(D).find(FilterString) != std::string::npos;
>> +  }
>> +
>> +  class DumpConsumer : public ASTConsumer {
>> +  public:
>> +    DumpConsumer(SelectiveDumpVisitor *Visitor) : Visitor(Visitor) {}
>> +
>> +    virtual void HandleTranslationUnit(ASTContext &Context) {
>> +      Visitor->Context = &Context;
>> +      Visitor->Run(Context.getTranslationUnitDecl());
>> +    }
>> +
>> +  private:
>> +    SelectiveDumpVisitor *Visitor;
>> +  };
>> +
>> +  ASTContext *Context;
>> +  std::string FilterString;
>> +  bool ListAll;
>> +};
>> +
>> +} // namespace
>> +
>> +int main(int argc, const char **argv) {
>> +  CommandLineClangTool Tool;
>> +  cl::extrahelp MoreHelp(MoreHelpText);
>> +  Tool.initialize(argc, argv);
>> +  SelectiveDumpVisitor Dumper(FilterString, ListAll);
>> +  return Tool.run(newFrontendActionFactory(&Dumper));
>> +}
>>
>> Added: cfe/trunk/tools/clang-ast-dump/Makefile
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-ast-dump/Makefile?rev=160265&view=auto
>> ==============================================================================
>> --- cfe/trunk/tools/clang-ast-dump/Makefile (added)
>> +++ cfe/trunk/tools/clang-ast-dump/Makefile Mon Jul 16 07:46:48 2012
>> @@ -0,0 +1,23 @@
>> +##===- tools/clang-check/Makefile --------------------------*- Makefile -*-===##
>> +#
>> +#                     The LLVM Compiler Infrastructure
>> +#
>> +# This file is distributed under the University of Illinois Open Source
>> +# License. See LICENSE.TXT for details.
>> +#
>> +##===----------------------------------------------------------------------===##
>> +
>> +CLANG_LEVEL := ../..
>> +
>> +TOOLNAME = clang-ast-dump
>> +NO_INSTALL = 1
>> +
>> +# No plugins, optimize startup time.
>> +TOOL_NO_EXPORTS = 1
>> +
>> +LINK_COMPONENTS := support mc
>> +USEDLIBS = clangFrontend.a clangSerialization.a clangDriver.a \
>> +           clangTooling.a clangParse.a clangSema.a clangAnalysis.a \
>> +           clangEdit.a clangAST.a clangLex.a clangBasic.a
>> +
>> +include $(CLANG_LEVEL)/Makefile
>>
>> Modified: cfe/trunk/tools/clang-check/ClangCheck.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-check/ClangCheck.cpp?rev=160265&r1=160264&r2=160265&view=diff
>> ==============================================================================
>> --- cfe/trunk/tools/clang-check/ClangCheck.cpp (original)
>> +++ cfe/trunk/tools/clang-check/ClangCheck.cpp Mon Jul 16 07:46:48 2012
>> @@ -1,4 +1,4 @@
>> -//===- examples/Tooling/ClangCheck.cpp - Clang check tool -----------------===//
>> +//===- tools/clang-check/ClangCheck.cpp - Clang check tool ----------------===//
>> //
>> //                     The LLVM Compiler Infrastructure
>> //
>> @@ -10,75 +10,37 @@
>> //  This file implements a clang-check tool that runs the
>> //  clang::SyntaxOnlyAction over a number of translation units.
>> //
>> +//  This tool uses the Clang Tooling infrastructure, see
>> +//    http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
>> +//  for details on setting it up with LLVM source tree.
>> +//
>> //===----------------------------------------------------------------------===//
>>
>> #include "llvm/Support/CommandLine.h"
>> #include "clang/Frontend/FrontendActions.h"
>> -#include "clang/Tooling/CompilationDatabase.h"
>> +#include "clang/Tooling/CommandLineClangTool.h"
>> #include "clang/Tooling/Tooling.h"
>>
>> using namespace clang::tooling;
>> using namespace llvm;
>>
>> -cl::opt<std::string> BuildPath(
>> -  "p",
>> -  cl::desc("<build-path>"),
>> -  cl::Optional);
>> -
>> -cl::list<std::string> SourcePaths(
>> -  cl::Positional,
>> -  cl::desc("<source0> [... <sourceN>]"),
>> -  cl::OneOrMore);
>> -
>> -static cl::extrahelp MoreHelp(
>> -    "\n"
>> -    "<build-path> is used to read a compile command database.\n"
>> -    "\n"
>> -    "For example, it can be a CMake build directory in which a file named\n"
>> -    "compile_commands.json exists (use -DCMAKE_EXPORT_COMPILE_COMMANDS=ON\n"
>> -    "CMake option to get this output). When no build path is specified,\n"
>> -    "clang-check will attempt to locate it automatically using all parent\n"
>> -    "paths of the first input file.\n"
>> -    "\n"
>> -    "<source0> ... specify the paths of source files. These paths are looked\n"
>> -    "up in the compile command database. If the path of a file is absolute,\n"
>> -    "it needs to point into CMake's source tree. If the path is relative,\n"
>> -    "the current working directory needs to be in the CMake source tree and\n"
>> -    "the file must be in a subdirectory of the current working directory.\n"
>> -    "\"./\" prefixes in the relative files will be automatically removed,\n"
>> -    "but the rest of a relative path must be a suffix of a path in the\n"
>> -    "compile command database.\n"
>> -    "\n"
>> -    "For example, to use clang-check on all files in a subtree of the source\n"
>> -    "tree, use:\n"
>> -    "\n"
>> -    "  find path/in/subtree -name '*.cpp'|xargs clang-check\n"
>> +static const char *MoreHelpText =
>> +    "\tFor example, to run clang-check on all files in a subtree of the\n"
>> +    "\tsource tree, use:\n"
>>     "\n"
>> -    "or using a specific build path:\n"
>> +    "\t  find path/in/subtree -name '*.cpp'|xargs clang-check\n"
>>     "\n"
>> -    "  find path/in/subtree -name '*.cpp'|xargs clang-check -p build/path\n"
>> +    "\tor using a specific build path:\n"
>>     "\n"
>> -    "Note, that path/in/subtree and current directory should follow the\n"
>> -    "rules described above.\n"
>> +    "\t  find path/in/subtree -name '*.cpp'|xargs clang-check -p build/path\n"
>>     "\n"
>> -);
>> +    "\tNote, that path/in/subtree and current directory should follow the\n"
>> +    "\trules described above.\n"
>> +    "\n";
>>
>> int main(int argc, const char **argv) {
>> -  llvm::OwningPtr<CompilationDatabase> Compilations(
>> -    FixedCompilationDatabase::loadFromCommandLine(argc, argv));
>> -  cl::ParseCommandLineOptions(argc, argv);
>> -  if (!Compilations) {
>> -    std::string ErrorMessage;
>> -    if (!BuildPath.empty()) {
>> -      Compilations.reset(
>> -         CompilationDatabase::autoDetectFromDirectory(BuildPath, ErrorMessage));
>> -    } else {
>> -      Compilations.reset(CompilationDatabase::autoDetectFromSource(
>> -          SourcePaths[0], ErrorMessage));
>> -    }
>> -    if (!Compilations)
>> -      llvm::report_fatal_error(ErrorMessage);
>> -  }
>> -  ClangTool Tool(*Compilations, SourcePaths);
>> +  CommandLineClangTool Tool;
>> +  cl::extrahelp MoreHelp(MoreHelpText);
>> +  Tool.initialize(argc, argv);
>>   return Tool.run(newFrontendActionFactory<clang::SyntaxOnlyAction>());
>> }
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>



More information about the cfe-commits mailing list