19 int ArgC,
char *ArgV[]) {
20 std::vector<const char *> CLArgs;
21 CLArgs.push_back(ArgV[0]);
25 if (
StringRef(ArgV[
I++]) ==
"-ignore_remaining_args=1")
28 CLArgs.push_back(ArgV[
I++]);
35 std::vector<std::string> Args{std::string(ExecName)};
37 auto NameAndArgs = ExecName.
split(
"--");
38 if (NameAndArgs.second.empty())
42 NameAndArgs.second.split(Opts,
'-');
45 Args.push_back(
"-global-isel");
47 Args.push_back(
"-O0");
48 }
else if (Opt.starts_with(
"O")) {
49 Args.push_back(
"-" + Opt.str());
50 }
else if (
Triple(Opt).getArch()) {
51 Args.push_back(
"-mtriple=" + Opt.str());
53 errs() << ExecName <<
": Unknown option: " << Opt <<
".\n";
57 errs() << NameAndArgs.first <<
": Injected args:";
58 for (
int I = 1, E = Args.size();
I < E; ++
I)
59 errs() <<
" " << Args[
I];
62 std::vector<const char *> CLArgs;
63 CLArgs.reserve(Args.size());
64 for (std::string &S : Args)
65 CLArgs.push_back(S.c_str());
73 std::vector<std::string> Args{std::string(ExecName)};
75 auto NameAndArgs = ExecName.
split(
"--");
76 if (NameAndArgs.second.empty())
80 NameAndArgs.second.split(Opts,
'-');
82 if (Opt ==
"instcombine") {
83 Args.push_back(
"-passes=instcombine");
84 }
else if (Opt ==
"earlycse") {
85 Args.push_back(
"-passes=early-cse");
86 }
else if (Opt ==
"simplifycfg") {
87 Args.push_back(
"-passes=simplifycfg");
88 }
else if (Opt ==
"gvn") {
89 Args.push_back(
"-passes=gvn");
90 }
else if (Opt ==
"sccp") {
91 Args.push_back(
"-passes=sccp");
92 }
else if (Opt ==
"loop_predication") {
93 Args.push_back(
"-passes=loop-predication");
94 }
else if (Opt ==
"guard_widening") {
95 Args.push_back(
"-passes=guard-widening");
96 }
else if (Opt ==
"loop_rotate") {
97 Args.push_back(
"-passes=loop-rotate");
98 }
else if (Opt ==
"loop_unswitch") {
99 Args.push_back(
"-passes=loop(simple-loop-unswitch)");
100 }
else if (Opt ==
"loop_unroll") {
101 Args.push_back(
"-passes=unroll");
102 }
else if (Opt ==
"loop_vectorize") {
103 Args.push_back(
"-passes=loop-vectorize");
104 }
else if (Opt ==
"licm") {
105 Args.push_back(
"-passes=licm");
106 }
else if (Opt ==
"indvars") {
107 Args.push_back(
"-passes=indvars");
108 }
else if (Opt ==
"strength_reduce") {
109 Args.push_back(
"-passes=loop-reduce");
110 }
else if (Opt ==
"irce") {
111 Args.push_back(
"-passes=irce");
112 }
else if (Opt ==
"dse") {
113 Args.push_back(
"-passes=dse");
114 }
else if (Opt ==
"loop_idiom") {
115 Args.push_back(
"-passes=loop-idiom");
116 }
else if (Opt ==
"reassociate") {
117 Args.push_back(
"-passes=reassociate");
118 }
else if (Opt ==
"lower_matrix_intrinsics") {
119 Args.push_back(
"-passes=lower-matrix-intrinsics");
120 }
else if (Opt ==
"memcpyopt") {
121 Args.push_back(
"-passes=memcpyopt");
122 }
else if (Opt ==
"sroa") {
123 Args.push_back(
"-passes=sroa");
124 }
else if (
Triple(Opt).getArch()) {
125 Args.push_back(
"-mtriple=" + Opt.str());
127 errs() << ExecName <<
": Unknown option: " << Opt <<
".\n";
132 errs() << NameAndArgs.first <<
": Injected args:";
133 for (
int I = 1, E = Args.size();
I < E; ++
I)
134 errs() <<
" " << Args[
I];
137 std::vector<const char *> CLArgs;
138 CLArgs.reserve(Args.size());
139 for (std::string &S : Args)
140 CLArgs.push_back(S.c_str());
147 errs() <<
"*** This tool was not linked to libFuzzer.\n"
148 <<
"*** No fuzzing will be performed.\n";
149 if (
int RC =
Init(&ArgC, &ArgV)) {
150 errs() <<
"Initialization failed\n";
154 for (
int I = 1;
I < ArgC; ++
I) {
157 if (Arg ==
"-ignore_remaining_args=1")
164 if (std::error_code EC = BufOrErr.getError()) {
165 errs() <<
"Error reading file: " << Arg <<
": " << EC.message() <<
"\n";
168 std::unique_ptr<MemoryBuffer> Buf = std::move(BufOrErr.get());
169 errs() <<
"Running: " << Arg <<
" (" << Buf->getBufferSize() <<
" bytes)\n";
170 TestOne(
reinterpret_cast<const uint8_t *
>(Buf->getBufferStart()),
171 Buf->getBufferSize());
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFile(const Twine &Filename, bool IsText=false, bool RequiresNullTerminator=true, bool IsVolatile=false, std::optional< Align > Alignment=std::nullopt)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
Triple - Helper class for working with autoconf configuration names.
LLVM_ABI bool parseCommandLineOptions(LibraryOptionsContext &Context, ArrayRef< const char * > Args, StringRef Overview="", raw_ostream *Errs=nullptr, vfs::FileSystem *VFS=nullptr, const char *EnvVar=nullptr)
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI void handleExecNameEncodedOptimizerOpts(cl::LibraryOptionsContext &LibraryOptions, StringRef ExecName)
Handle optimizer options which are encoded in the executable name.
int(*)(const uint8_t *Data, size_t Size) FuzzerTestFun
LLVM_ABI int runFuzzerOnInputs(int ArgC, char *ArgV[], FuzzerTestFun TestOne, FuzzerInitFun Init=[](int *, char ***) { return 0;})
Runs a fuzz target on the inputs specified on the command line.
LLVM_ABI void handleExecNameEncodedBEOpts(cl::LibraryOptionsContext &LibraryOptions, StringRef ExecName)
Handle backend options that are encoded in the executable name.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
int(*)(int *argc, char ***argv) FuzzerInitFun
LLVM_ABI void parseFuzzerCLOpts(cl::LibraryOptionsContext &LibraryOptions, int ArgC, char *ArgV[])
Parse cl::opts from a fuzz target commandline.