22using namespace fuzzerop;
27 std::vector<BasicBlock *> ret;
36 ret.push_back(
Node->getBlock());
47 std::vector<BasicBlock *> ret;
54 ret.push_back(Child->getBlock());
56 while (
Idx < ret.size()) {
60 ret.push_back(Child->getBlock());
77std::pair<GlobalVariable *, bool>
85 bool DidCreate =
false;
89 RS.sample(
nullptr, 1);
94 auto TRS = makeSampler<Constant *>(
Rand);
101 M->getDataLayout().getDefaultGlobalsAddressSpace());
103 return {GV, DidCreate};
115 if (M && M->getTargetTriple().isAMDGCN()) {
118 if (pointerType && pointerType->getAddressSpace() == 8) {
140static std::pair<Instruction *, SmallVector<Instruction *>>
142 const Twine &LoadName) {
150 return std::make_pair(Load, NewInsts);
155 for (
auto it = NewInsts.
rbegin(); it != NewInsts.
rend(); ++it) {
156 (*it)->eraseFromParent();
164 bool allowConstant) {
165 auto MatchesPred = [&Srcs, &Pred](
Value *V) {
return Pred.
matches(Srcs, V); };
175 return RS.getSelection();
182 for (
uint64_t i = 0; i <
F->arg_size(); i++) {
183 Args.push_back(
F->getArg(i));
187 return RS.getSelection();
193 std::shuffle(Dominators.begin(), Dominators.end(),
Rand);
201 return RS.getSelection();
209 Type *Ty = GV->getValueType();
219 if (Pred.
matches(Srcs, LoadGV)) {
225 if (GV->use_empty()) {
226 GV->eraseFromParent();
232 return newSource(BB, Insts, Srcs, Pred, allowConstant);
245 bool allowConstant) {
247 auto RS = makeSampler<Value *>(
Rand);
255 if (
auto *
I = dyn_cast<Instruction>(
Ptr)) {
256 IP = ++
I->getIterator();
257 assert(IP != BB.
end() &&
"guaranteed by the findPointer");
260 Type *AccessTy = RS.getSelection()->getType();
263 auto [NewLoad, NewInsts] =
267 if (Pred.
matches(Srcs, NewLoad))
268 RS.sample(NewLoad, RS.totalWeight());
275 Value *newSrc = RS.getSelection();
279 if (!allowConstant && isa<Constant>(newSrc)) {
284 newSrc =
new LoadInst(Ty, Alloca,
"L",
287 newSrc =
new LoadInst(Ty, Alloca,
"L", &BB);
294 const Value *Replacement) {
298 switch (
I->getOpcode()) {
299 case Instruction::GetElementPtr:
300 case Instruction::ExtractElement:
301 case Instruction::ExtractValue:
307 case Instruction::InsertValue:
308 case Instruction::InsertElement:
309 case Instruction::ShuffleVector:
316 case Instruction::Switch:
317 case Instruction::Br:
321 case Instruction::Call:
322 case Instruction::Invoke:
323 case Instruction::CallBr: {
324 const Function *Callee = cast<CallBase>(
I)->getCalledFunction();
331 if (!Callee->getIntrinsicID() && OperandNo == 0)
333 return !Callee->hasParamAttribute(OperandNo, Attribute::ImmArg);
348 auto findSinkAndConnect =
350 auto RS = makeSampler<Use *>(
Rand);
351 for (
auto &
I : Instructions) {
352 for (
Use &U :
I->operands())
357 Use *Sink = RS.getSelection();
358 User *U = Sink->getUser();
359 unsigned OpNo = Sink->getOperandNo();
360 U->setOperand(OpNo, V);
361 return cast<Instruction>(U);
369 Sink = findSinkAndConnect(Insts);
375 std::shuffle(Dominators.begin(), Dominators.end(),
Rand);
378 if (isa<PointerType>(
I.getType())) {
388 std::shuffle(Dominatees.begin(), Dominatees.end(),
Rand);
390 std::vector<Instruction *> Instructions;
392 Instructions.push_back(&
I);
393 Sink = findSinkAndConnect(Instructions);
405 auto [GV, DidCreate] =
422 Type *Ty = V->getType();
438 if (Inst->isTerminator())
444 return RS.getSelection();
458 for (
uint64_t i = 0; i < ArgNum; i++) {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
Module.h This file contains the declarations for the Module class.
static bool isCompatibleReplacement(const Instruction *I, const Use &Operand, const Value *Replacement)
static Value * buildTargetLegalPtr(Module *M, Value *Ptr, InsertPosition IP, const Twine &Name, SmallVector< Instruction * > *NewInsts)
static void eraseNewInstructions(SmallVector< Instruction * > &NewInsts)
static std::pair< Instruction *, SmallVector< Instruction * > > buildTargetLegalLoad(Type *AccessTy, Value *Ptr, InsertPosition IP, Module *M, const Twine &LoadName)
static Instruction * buildTargetLegalStore(Value *Val, Value *Ptr, InsertPosition IP, Module *M)
static std::vector< BasicBlock * > getDominators(BasicBlock *BB)
Return a vector of Blocks that dominates this block, excluding current block.
static std::vector< BasicBlock * > getDominatees(BasicBlock *BB)
Return a vector of Blocks that is dominated by this block, excluding current block.
This class represents a conversion between pointers from one address space to another.
an instruction to allocate memory on the stack
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
const T & back() const
back - Get the last element.
LLVM Basic Block Representation.
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
const Function * getParent() const
Return the enclosing method, or null if none.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
LLVM_ABI const Module * getModule() const
Return the module owning the function this basic block belongs to, or nullptr if the function does no...
This is an important base class in LLVM.
A parsed version of the target data layout string in and methods for querying it.
iterator_range< iterator > children()
DomTreeNodeBase< NodeT > * getNode(const NodeT *BB) const
getNode - return the (Post)DominatorTree node for the specified basic block.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
Module * getParent()
Get the module that this global value is contained inside of...
LinkageTypes
An enumeration for the kinds of linkage for global values.
@ ExternalLinkage
Externally visible function.
This is an important class for using LLVM in a threaded context.
An instruction for reading from memory.
A Module instance is used to store all the information related to an LLVM module.
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
static ReturnInst * Create(LLVMContext &C, Value *retVal=nullptr, InsertPosition InsertBefore=nullptr)
void push_back(const T &Elt)
reverse_iterator rbegin()
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
bool isPointerTy() const
True if this is an instance of PointerType.
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
A Use represents the edge between a Value definition and its users.
LLVM_ABI unsigned getOperandNo() const
Return the operand # of this use in its User.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
A matcher/generator for finding suitable values for the next source in an operation's partially compl...
bool matches(ArrayRef< Value * > Cur, const Value *New)
Returns true if New is compatible for the argument after Cur.
std::vector< Constant * > generate(ArrayRef< Value * > Cur, ArrayRef< Type * > BaseTypes)
Generates a list of potential values for the argument after Cur.
self_iterator getIterator()
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
static SourcePred onlyType(Type *Only)
static SourcePred anyType()
This is an optimization pass for GlobalISel generic memory operations.
ReservoirSampler< ElT, GenT > makeSampler(GenT &RandGen, RangeT &&Items)
iterator_range< filter_iterator< detail::IterOfRange< RangeT >, PredicateT > > make_filter_range(RangeT &&Range, PredicateT Pred)
Convenience function that takes a range of elements and a predicate, and return a new filter_iterator...
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
T uniform(GenT &Gen, T Min, T Max)
Return a uniformly distributed random value between Min and Max.
LLVM_ABI Function * createFunctionDeclaration(Module &M, uint64_t ArgNum)
SmallVector< Type *, 16 > KnownTypes
LLVM_ABI std::pair< GlobalVariable *, bool > findOrCreateGlobalVariable(Module *M, ArrayRef< Value * > Srcs, fuzzerop::SourcePred Pred)
Find or create a global variable.
LLVM_ABI Value * findOrCreateSource(BasicBlock &BB, ArrayRef< Instruction * > Insts)
Find a "source" for some operation, which will be used in one of the operation's operands.
LLVM_ABI AllocaInst * createStackMemory(Function *F, Type *Ty, Value *Init=nullptr)
Create a stack memory at the head of the function, store Init to the memory if provided.
LLVM_ABI Instruction * newSink(BasicBlock &BB, ArrayRef< Instruction * > Insts, Value *V)
Create a user for V in BB.
LLVM_ABI Function * createFunctionDefinition(Module &M, uint64_t ArgNum)
LLVM_ABI Value * newSource(BasicBlock &BB, ArrayRef< Instruction * > Insts, ArrayRef< Value * > Srcs, fuzzerop::SourcePred Pred, bool allowConstant=true)
Create some Value suitable as a source for some operation.
LLVM_ABI Instruction * connectToSink(BasicBlock &BB, ArrayRef< Instruction * > Insts, Value *V)
Find a viable user for V in Insts, which should all be contained in BB.
@ SinkToInstInCurBlock
TODO: Also consider pointers in function argument.
LLVM_ABI Value * findPointer(BasicBlock &BB, ArrayRef< Instruction * > Insts)
LLVM_ABI Type * randomType()
Return a uniformly choosen type from AllowedTypes.