emmettneyman created this revision.
emmettneyman added reviewers: morehouse, kcc.
Herald added a subscriber: cfe-commits.
Extended `cxx_loop_proto` to have multiple for loops. Modified
`loop_proto_to_llvm` and `loop_proto_to_cxx` to handle the new protos. In
`loop_proto_to_llvm`, I only translate the first ten loops from the protobuf
into IR. This will keep down the runtime of each fuzzer run.
Repository:
rC Clang
https://reviews.llvm.org/D50670
Files:
clang/tools/clang-fuzzer/cxx_loop_proto.proto
clang/tools/clang-fuzzer/proto-to-cxx/loop_proto_to_cxx.cpp
clang/tools/clang-fuzzer/proto-to-llvm/loop_proto_to_llvm.cpp
Index: clang/tools/clang-fuzzer/proto-to-llvm/loop_proto_to_llvm.cpp
===================================================================
--- clang/tools/clang-fuzzer/proto-to-llvm/loop_proto_to_llvm.cpp
+++ clang/tools/clang-fuzzer/proto-to-llvm/loop_proto_to_llvm.cpp
@@ -30,11 +30,21 @@
std::string StateSeqToString(std::ostream &os, const StatementSeq &x);
// Counter variable to generate new LLVM IR variable names and wrapper function
-std::string get_var() {
+static std::string get_var() {
static int ctr = 0;
return "%var" + std::to_string(ctr++);
}
+static int loop_ctr = 0;
+
+static std::string get_loop_num() {
+ return std::to_string(loop_ctr);
+}
+
+static void new_loop() {
+ loop_ctr++;
+}
+
// Proto to LLVM.
std::string ConstToString(const Const &x) {
@@ -54,7 +64,8 @@
break;
}
std::string ptr_var = get_var();
- os << ptr_var << " = getelementptr inbounds i32, i32* " << arr << ", i64 %ct\n";
+ os << ptr_var << " = getelementptr inbounds i32, i32* " << arr
+ << ", i64 %ct_" << get_loop_num() << "\n";
return ptr_var;
}
std::string RvalueToString(std::ostream &os, const Rvalue &x) {
@@ -122,25 +133,50 @@
}
return os;
}
-std::ostream &operator<<(std::ostream &os, const LoopFunction &x) {
- return os << "target triple = \"x86_64-unknown-linux-gnu\"\n"
- << "define void @foo(i32* %a, i32* %b, i32* %c, i64 %s) {\n"
- << "%1 = icmp sgt i64 %s, 0\n"
- << "br i1 %1, label %start, label %end\n"
- << "start:\n"
- << "br label %loop\n"
- << "end:\n"
- << "ret void\n"
- << "loop:\n"
- << " %ct = phi i64 [ %ctnew, %loop ], [ 0, %start ]\n"
+std::ostream &operator<<(std::ostream &os, const Loop &x) {
+ new_loop();
+ std::string lnum = get_loop_num();
+ std::string next_lnum = std::to_string(stoi(lnum) + 1);
+ if (!lnum.compare("1")) {
+ os << "%cmp_" << lnum << " = icmp sgt i64 %s, 0\n"
+ << "br i1 %cmp_" << lnum << ", label %loop_start_" << lnum
+ << ", label %end\n";
+ }
+ return os << "loop_start_" << lnum << ":\n"
+ << "br label %loop_" << lnum << "\n"
+ << "loop_end_" << lnum << ":\n"
+ << "%cmp_" << next_lnum << " = icmp sgt i64 %s, 0\n"
+ << "br i1 %cmp_" << next_lnum << ", label %loop_start_" << next_lnum
+ << ", label %end\n"
+ << "loop_" << lnum << ":\n"
+ << " %ct_" << lnum << " = phi i64 [ %ctnew_" << lnum
+ << ", %loop_" << lnum << " ], [ 0, %loop_start_" << lnum << " ]\n"
<< x.statements()
- << "%ctnew = add i64 %ct, 1\n"
- << "%j = icmp eq i64 %ctnew, %s\n"
- << "br i1 %j, label %end, label %loop, !llvm.loop !0\n}\n"
- << "!0 = distinct !{!0, !1, !2}\n"
- << "!1 = !{!\"llvm.loop.vectorize.enable\", i1 true}\n"
- << "!2 = !{!\"llvm.loop.vectorize.width\", i32 " << kArraySize
- << "}\n";
+ << "%ctnew_" << lnum << " = add i64 %ct_" << lnum << ", 1\n"
+ << "%j_" << lnum << " = icmp eq i64 %ctnew_" << lnum << ", %s\n"
+ << "br i1 %j_" << lnum << ", label %loop_end_" << lnum
+ << ", label %loop_" << lnum << ", !llvm.loop !0\n";
+
+}
+std::ostream &operator<<(std::ostream &os, const LoopFunction &x) {
+ os << "target triple = \"x86_64-unknown-linux-gnu\"\n"
+ << "define void @foo(i32* %a, i32* %b, i32* %c, i64 %s) {\n";
+ for (auto &lp : x.loops()) {
+ os << lp;
+ // No matter how many loops the protobuf has, only translate 10 of them
+ if (!get_loop_num().compare("10"))
+ break;
+ }
+ new_loop();
+ std::string lnum = get_loop_num();
+ os << "loop_start_" << lnum << ":\n"
+ << "br label %end\n"
+ << "end:\n"
+ << "ret void\n}\n"
+ << "!0 = distinct !{!0, !1, !2}\n"
+ << "!1 = !{!\"llvm.loop.vectorize.enable\", i1 true}\n"
+ << "!2 = !{!\"llvm.loop.vectorize.width\", i32 " << kArraySize << "}\n";
+ return os;
}
// ---------------------------------
Index: clang/tools/clang-fuzzer/proto-to-cxx/loop_proto_to_cxx.cpp
===================================================================
--- clang/tools/clang-fuzzer/proto-to-cxx/loop_proto_to_cxx.cpp
+++ clang/tools/clang-fuzzer/proto-to-cxx/loop_proto_to_cxx.cpp
@@ -108,10 +108,15 @@
os << st;
return os;
}
+std::ostream &operator<<(std::ostream &os, const Loop &x){
+ return os << "for (int i=0; i<s; i++){\n"
+ << x.statements() << "}\n";
+}
std::ostream &operator<<(std::ostream &os, const LoopFunction &x) {
- return os << "void foo(int *a, int *b, int *__restrict__ c, size_t s) {\n"
- << "for (int i=0; i<s; i++){\n"
- << x.statements() << "}\n}\n";
+ os << "void foo(int *a, int *b, int *__restrict__ c, size_t s) {\n";
+ for (auto &lp : x.loops())
+ os << lp;
+ return os << "}\n";
}
// ---------------------------------
Index: clang/tools/clang-fuzzer/cxx_loop_proto.proto
===================================================================
--- clang/tools/clang-fuzzer/cxx_loop_proto.proto
+++ clang/tools/clang-fuzzer/cxx_loop_proto.proto
@@ -73,8 +73,12 @@
repeated Statement statements = 1;
}
-message LoopFunction {
+message Loop {
required StatementSeq statements = 1;
}
+message LoopFunction {
+ repeated Loop loops = 1;
+}
+
package clang_fuzzer;
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits