summaryrefslogtreecommitdiffstats
path: root/llvm/lib/FuzzMutate/OpDescriptor.cpp
diff options
context:
space:
mode:
authorJustin Bogner <mail@justinbogner.com>2017-08-21 22:57:06 +0000
committerJustin Bogner <mail@justinbogner.com>2017-08-21 22:57:06 +0000
commit7d449d31a4d2fe393e32be7c478c18b16b301428 (patch)
tree6deed6bee8fd3f5cc1ce4b77505a53f51326009a /llvm/lib/FuzzMutate/OpDescriptor.cpp
parent4056e80719317ec1719dde7c2b08d1720a4ad2a4 (diff)
downloadbcm5719-llvm-7d449d31a4d2fe393e32be7c478c18b16b301428.tar.gz
bcm5719-llvm-7d449d31a4d2fe393e32be7c478c18b16b301428.zip
Re-apply "Introduce FuzzMutate library"
Same as r311392 with some fixes for library dependencies. Thanks to Chapuni for helping work those out! Original commit message: This introduces the FuzzMutate library, which provides structured fuzzing for LLVM IR, as described in my EuroLLVM 2017 talk. Most of the basic mutators to inject and delete IR are provided, with support for most basic operations. llvm-svn: 311402
Diffstat (limited to 'llvm/lib/FuzzMutate/OpDescriptor.cpp')
-rw-r--r--llvm/lib/FuzzMutate/OpDescriptor.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/llvm/lib/FuzzMutate/OpDescriptor.cpp b/llvm/lib/FuzzMutate/OpDescriptor.cpp
new file mode 100644
index 00000000000..1c5d8f606ae
--- /dev/null
+++ b/llvm/lib/FuzzMutate/OpDescriptor.cpp
@@ -0,0 +1,38 @@
+//===-- OpDescriptor.cpp --------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/FuzzMutate/OpDescriptor.h"
+#include "llvm/IR/Constants.h"
+
+using namespace llvm;
+using namespace fuzzerop;
+
+void fuzzerop::makeConstantsWithType(Type *T, std::vector<Constant *> &Cs) {
+ if (auto *IntTy = dyn_cast<IntegerType>(T)) {
+ uint64_t W = IntTy->getBitWidth();
+ Cs.push_back(ConstantInt::get(IntTy, APInt::getMaxValue(W)));
+ Cs.push_back(ConstantInt::get(IntTy, APInt::getMinValue(W)));
+ Cs.push_back(ConstantInt::get(IntTy, APInt::getSignedMaxValue(W)));
+ Cs.push_back(ConstantInt::get(IntTy, APInt::getSignedMinValue(W)));
+ Cs.push_back(ConstantInt::get(IntTy, APInt::getOneBitSet(W, W / 2)));
+ } else if (T->isFloatingPointTy()) {
+ auto &Ctx = T->getContext();
+ auto &Sem = T->getFltSemantics();
+ Cs.push_back(ConstantFP::get(Ctx, APFloat::getZero(Sem)));
+ Cs.push_back(ConstantFP::get(Ctx, APFloat::getLargest(Sem)));
+ Cs.push_back(ConstantFP::get(Ctx, APFloat::getSmallest(Sem)));
+ } else
+ Cs.push_back(UndefValue::get(T));
+}
+
+std::vector<Constant *> fuzzerop::makeConstantsWithType(Type *T) {
+ std::vector<Constant *> Result;
+ makeConstantsWithType(T, Result);
+ return Result;
+}
OpenPOWER on IntegriCloud