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); } |