133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar//===-- ClangFuzzer.cpp - Fuzz Clang --------------------------------------===//
233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar//
333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar//
533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// License. See LICENSE.TXT for details.
733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar//
833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar///
1033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar/// \file
1133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar/// \brief This file implements a function that runs Clang on a single
1233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar///  input. This function is then linked into the Fuzzer library.
1333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar///
1433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
1533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar
1633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar#include "clang/Tooling/Tooling.h"
1733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar#include "clang/Frontend/FrontendActions.h"
1833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar#include "clang/Frontend/CompilerInstance.h"
1933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar#include "llvm/Option/Option.h"
2033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar
2133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarusing namespace clang;
2233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar
2333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarextern "C" void TestOneInput(uint8_t *data, size_t size) {
2433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  std::string s((const char *)data, size);
2533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  llvm::opt::ArgStringList CC1Args;
2633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  CC1Args.push_back("-cc1");
2733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  CC1Args.push_back("test.cc");
2833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  llvm::IntrusiveRefCntPtr<FileManager> Files(
2933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar      new FileManager(FileSystemOptions()));
3033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  IgnoringDiagConsumer Diags;
3133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
3233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  DiagnosticsEngine Diagnostics(
3333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar      IntrusiveRefCntPtr<clang::DiagnosticIDs>(new DiagnosticIDs()), &*DiagOpts,
3433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar      &Diags, false);
3533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  std::unique_ptr<clang::CompilerInvocation> Invocation(
3633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar      tooling::newInvocation(&Diagnostics, CC1Args));
3733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  std::unique_ptr<llvm::MemoryBuffer> Input =
3833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar      llvm::MemoryBuffer::getMemBuffer(s);
3933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  Invocation->getPreprocessorOpts().addRemappedFile("test.cc", Input.release());
4033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  std::unique_ptr<tooling::ToolAction> action(
4133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar      tooling::newFrontendActionFactory<clang::SyntaxOnlyAction>());
4233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  action->runInvocation(Invocation.release(), Files.get(), &Diags);
4333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar}
44