1 //==-- handle_cxx.cpp - Helper function for Clang fuzzers ------------------==//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // Implements HandleCXX for use by the Clang fuzzers.
11 //===----------------------------------------------------------------------===//
13 #include "handle_cxx.h"
15 #include "clang/CodeGen/CodeGenAction.h"
16 #include "clang/Frontend/CompilerInstance.h"
17 #include "clang/Lex/PreprocessorOptions.h"
18 #include "clang/Tooling/Tooling.h"
19 #include "llvm/Option/Option.h"
21 using namespace clang
;
23 void clang_fuzzer::HandleCXX(const std::string
&S
,
25 const std::vector
<const char *> &ExtraArgs
) {
26 llvm::opt::ArgStringList CC1Args
;
27 CC1Args
.push_back("-cc1");
28 for (auto &A
: ExtraArgs
)
30 CC1Args
.push_back(FileName
);
32 llvm::IntrusiveRefCntPtr
<FileManager
> Files(
33 new FileManager(FileSystemOptions()));
34 IgnoringDiagConsumer Diags
;
35 IntrusiveRefCntPtr
<DiagnosticOptions
> DiagOpts
= new DiagnosticOptions();
36 DiagnosticsEngine
Diagnostics(
37 IntrusiveRefCntPtr
<clang::DiagnosticIDs
>(new DiagnosticIDs()), &*DiagOpts
,
39 std::unique_ptr
<clang::CompilerInvocation
> Invocation(
40 tooling::newInvocation(&Diagnostics
, CC1Args
, /*BinaryName=*/nullptr));
41 std::unique_ptr
<llvm::MemoryBuffer
> Input
=
42 llvm::MemoryBuffer::getMemBuffer(S
);
43 Invocation
->getPreprocessorOpts().addRemappedFile(FileName
,
45 std::unique_ptr
<tooling::ToolAction
> action(
46 tooling::newFrontendActionFactory
<clang::EmitObjAction
>());
47 std::shared_ptr
<PCHContainerOperations
> PCHContainerOps
=
48 std::make_shared
<PCHContainerOperations
>();
49 action
->runInvocation(std::move(Invocation
), Files
.get(), PCHContainerOps
,