diff options
| -rw-r--r-- | clang/include/clang/Tooling/Tooling.h | 6 | ||||
| -rw-r--r-- | clang/lib/Tooling/Tooling.cpp | 2 | ||||
| -rw-r--r-- | clang/tools/clang-fuzzer/ClangFuzzer.cpp | 21 | 
3 files changed, 23 insertions, 6 deletions
diff --git a/clang/include/clang/Tooling/Tooling.h b/clang/include/clang/Tooling/Tooling.h index 393cc1deace..30f327f3768 100644 --- a/clang/include/clang/Tooling/Tooling.h +++ b/clang/include/clang/Tooling/Tooling.h @@ -40,6 +40,7 @@  #include "clang/Tooling/CompilationDatabase.h"  #include "llvm/ADT/StringMap.h"  #include "llvm/ADT/Twine.h" +#include "llvm/Option/Option.h"  #include <memory>  #include <string>  #include <vector> @@ -383,6 +384,11 @@ inline std::unique_ptr<FrontendActionFactory> newFrontendActionFactory(  /// \param File Either an absolute or relative path.  std::string getAbsolutePath(StringRef File); +/// \brief Creates a \c CompilerInvocation. +clang::CompilerInvocation *newInvocation( +    clang::DiagnosticsEngine *Diagnostics, +    const llvm::opt::ArgStringList &CC1Args); +  } // end namespace tooling  } // end namespace clang diff --git a/clang/lib/Tooling/Tooling.cpp b/clang/lib/Tooling/Tooling.cpp index 60371fb5e0e..e100003cee8 100644 --- a/clang/lib/Tooling/Tooling.cpp +++ b/clang/lib/Tooling/Tooling.cpp @@ -90,7 +90,7 @@ static const llvm::opt::ArgStringList *getCC1Arguments(  }  /// \brief Returns a clang build invocation initialized from the CC1 flags. -static clang::CompilerInvocation *newInvocation( +clang::CompilerInvocation *newInvocation(      clang::DiagnosticsEngine *Diagnostics,      const llvm::opt::ArgStringList &CC1Args) {    assert(!CC1Args.empty() && "Must at least contain the program name!"); diff --git a/clang/tools/clang-fuzzer/ClangFuzzer.cpp b/clang/tools/clang-fuzzer/ClangFuzzer.cpp index 3c50f81303a..b24531976cd 100644 --- a/clang/tools/clang-fuzzer/ClangFuzzer.cpp +++ b/clang/tools/clang-fuzzer/ClangFuzzer.cpp @@ -16,17 +16,28 @@  #include "clang/Tooling/Tooling.h"  #include "clang/Frontend/FrontendActions.h"  #include "clang/Frontend/CompilerInstance.h" +#include "llvm/Option/Option.h"  using namespace clang;  extern "C" void TestOneInput(uint8_t *data, size_t size) {    std::string s((const char *)data, size); +  llvm::opt::ArgStringList CC1Args; +  CC1Args.push_back("-cc1"); +  CC1Args.push_back("test.cc");    llvm::IntrusiveRefCntPtr<FileManager> Files(        new FileManager(FileSystemOptions())); -  tooling::ToolInvocation Invocation({"clang", "-c", "test.cc"}, -                                     new clang::SyntaxOnlyAction, Files.get());    IgnoringDiagConsumer Diags; -  Invocation.setDiagnosticConsumer(&Diags); -  Invocation.mapVirtualFile("test.cc", s); -  Invocation.run(); +  IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions(); +  DiagnosticsEngine Diagnostics( +      IntrusiveRefCntPtr<clang::DiagnosticIDs>(new DiagnosticIDs()), &*DiagOpts, +      &Diags, false); +  std::unique_ptr<clang::CompilerInvocation> Invocation( +      tooling::newInvocation(&Diagnostics, CC1Args)); +  std::unique_ptr<llvm::MemoryBuffer> Input = +      llvm::MemoryBuffer::getMemBuffer(s); +  Invocation->getPreprocessorOpts().addRemappedFile("test.cc", Input.release()); +  std::unique_ptr<tooling::ToolAction> action( +      tooling::newFrontendActionFactory<clang::SyntaxOnlyAction>()); +  action->runInvocation(Invocation.release(), Files.get(), &Diags);  }  | 

