morehouse requested changes to this revision.
morehouse added inline comments.
This revision now requires changes to proceed.
================
Comment at: tools/clang-fuzzer/CMakeLists.txt:72
+ # Build the lllvm protobuf fuzzer
+ add_clang_executable(clang-llvm-proto-fuzzer
----------------
llvm
================
Comment at: tools/clang-fuzzer/CMakeLists.txt:83
clangFuzzerInitialize
clangHandleCXX
)
----------------
Maybe remove `clangHandleCXX` here, so you can use this variable for linking
`clang-llvm-proto-fuzzer`.
================
Comment at: tools/clang-fuzzer/handle-llvm/CMakeLists.txt:5
+ handle_llvm.cpp
+ )
----------------
There's fewer libraries linked here than in `handle-cxx/` (not saying this is
wrong, but it could be). Do you get link errors if you build
`clang-llvm-proto-fuzzer` with shared libraries?
================
Comment at: tools/clang-fuzzer/handle-llvm/\:31
+#include "llvm/Analysis/TargetLibraryInfo.h"
+#include "llvm/Support/raw_ostream.h"
+
----------------
Please sort includes alphabetically, with handle_llvm.h separate at the top.
================
Comment at: tools/clang-fuzzer/handle-llvm/\:42
+void InitializeEverything() {
+
+ InitializeAllTargets();
----------------
Nit: avoid empty lines at beginning or end of a `{}` block (here and below)
================
Comment at: tools/clang-fuzzer/handle-llvm/\:62
+ initializeScavengerTestPass(*Registry);
+
+}
----------------
Does this initialization need to happen every time the fuzzer generates a new
input, or can we call this from `LLVMFuzzerInitialize()` instead?
================
Comment at: tools/clang-fuzzer/handle-llvm/\:71
+ StringRef *ID = new StringRef("IR");
+ MemoryBufferRef *ir = new MemoryBufferRef(*IRString, *ID);
+
----------------
# Avoid using `new` when you could create the object on the stack instead.
This will prevent you from introducing memory leaks if you forget to call
`delete` later.
# I don't think you need to construct StringRefs or the MemoryBufferRef here.
Instead you can probably do `parseIR(MemoryBufferRef(S, "IR"), Err, ...)` below.
================
Comment at: tools/clang-fuzzer/handle-llvm/\:79
+ SMDiagnostic Err;
+ std::unique_ptr<Module> M;
+ Triple TheTriple;
----------------
I'd move the `unique_ptr` definition to the same line as `parseIR`.
================
Comment at: tools/clang-fuzzer/handle-llvm/\:81
+ Triple TheTriple;
+ TheTriple.setTriple(sys::getDefaultTargetTriple());
+
----------------
What's the point of wrapping `sys::getDefaultTargetTriple()` if we always
unwrap `TheTriple` below?
================
Comment at: tools/clang-fuzzer/handle-llvm/\:84
+ // Set the Module to include the the IR code to be compiled
+ M = parseIR(*ir, Err, Context, false);
+
----------------
What does `UpgradeDebugInfo=false` do here? The documentation warns about
setting this bool to false.
================
Comment at: tools/clang-fuzzer/handle-llvm/\:84
+ // Set the Module to include the the IR code to be compiled
+ M = parseIR(*ir, Err, Context, false);
+
----------------
morehouse wrote:
> What does `UpgradeDebugInfo=false` do here? The documentation warns about
> setting this bool to false.
What if `parseIR` returns nullptr?
================
Comment at: tools/clang-fuzzer/handle-llvm/\:88
+ std::string Error;
+ const Target *TheTarget = TargetRegistry::lookupTarget(TheTriple.getTriple(),
+ Error);
----------------
What if `lookupTarget` returns nullptr?
================
Comment at: tools/clang-fuzzer/handle-llvm/\:90
+ Error);
+ std::string CPUStr = getCPUStr(), FeaturesStr = getFeaturesStr();
+
----------------
Please separate to 2 statements.
================
Comment at: tools/clang-fuzzer/handle-llvm/\:98
+ switch(A[2]) {
+ case '0': OLvl = CodeGenOpt::None; break;
+ case '1': OLvl = CodeGenOpt::Less; break;
----------------
Fix indentation here.
================
Comment at: tools/clang-fuzzer/handle-llvm/\:101
+ case '2': OLvl = CodeGenOpt::Default; break;
+ case '3': OLvl = CodeGenOpt::Aggressive; break;
+ }
----------------
Maybe add a default case here with an error message?
================
Comment at: tools/clang-fuzzer/handle-llvm/\:104
+ }
+ }
+
----------------
It might make sense to move command line arg parsing to a helper function, and
then call that function closer to the top. That way if there's a bad argument
we can quit before doing all the IR parsing.
================
Comment at: tools/clang-fuzzer/handle-llvm/\:113
+
+ legacy::PassManager PM;
+ TargetLibraryInfoImpl TLII(Triple(M->getTargetTriple()));
----------------
Any reason not to use the newer PassManager?
================
Comment at: tools/clang-fuzzer/handle-llvm/\:127
+
+ LLVMTargetMachine &LLVMTM = static_cast<LLVMTargetMachine&>(*Target);
+ MachineModuleInfo *MMI = new MachineModuleInfo(&LLVMTM);
----------------
What's the reason for this cast? `MachineModuleInfo()` accepts `TargetMachine
*` as an argument.
================
Comment at: tools/clang-fuzzer/handle-llvm/\:130
+ Target->addPassesToEmitFile(PM, OS, nullptr, TargetMachine::CGFT_ObjectFile,
+ false, MMI);
+
----------------
Eventually you will want to save the outputs to do A/B runs. This is fine for
now though.
================
Comment at: tools/clang-fuzzer/handle-llvm/handle_llvm.cpp:14
+//===----------------------------------------------------------------------===//
+
+#include "llvm/IR/LLVMContext.h"
----------------
Apparently you created a file called `\` with the same text. Please remove
that file, and apply my comments there to this file instead.
================
Comment at: tools/clang-fuzzer/proto-to-llvm/loop_proto_to_llvm.cpp:57
+ std::string insn = ptr_var + " = getelementptr i32, i32* " + arr + ", i64
%ct\n";
+ os << insn;
+ return ptr_var;
----------------
Simpler to do `os << ptr_var << " = getelementptr" ...` (here and below)
================
Comment at: tools/clang-fuzzer/proto-to-llvm/loop_proto_to_llvm.cpp:71
+ return val_var;
+ }
+}
----------------
Is it still possible for the protobuf to not have a constant, a binOp, or a
varRef?
================
Comment at: tools/clang-fuzzer/proto-to-llvm/loop_proto_to_llvm.cpp:113
+std::ostream &operator<<(std::ostream &os, const AssignmentStatement &x) {
+ std::string ref = VarRefToString(os, x.varref());
+ std::string rv = RvalueToString(os, x.rvalue());
----------------
Nit: Maybe `var_ref` or `lvalue` would be more descriptive names.
================
Comment at: tools/clang-fuzzer/proto-to-llvm/loop_proto_to_llvm.cpp:114
+ std::string ref = VarRefToString(os, x.varref());
+ std::string rv = RvalueToString(os, x.rvalue());
+ std::string insns = "store i32 " + rv + ", i32* " + ref + "\n";
----------------
Might make for slightly faster IR if you do the rvalue first. Would at least
simplify register allocation.
Repository:
rC Clang
https://reviews.llvm.org/D48106
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits