24#include "llvm/IR/IntrinsicsAMDGPU.h"
40 if (!
F.isDeclaration())
43 while (RS.totalWeight() < IB.MinFunctionNum) {
44 Function *
F = IB.createFunctionDefinition(M);
47 mutate(*RS.getSelection(), IB);
62 return M.getInstructionCount() + M.size() + M.global_size() + M.alias_size();
66 std::vector<Type *> Types;
67 for (
const auto &Getter : AllowedTypes)
68 Types.push_back(Getter(M.getContext()));
73 for (
const auto &Strategy : Strategies)
74 RS.sample(Strategy.get(),
75 Strategy->getWeight(CurSize, MaxSize, RS.totalWeight()));
76 if (RS.totalWeight() == 0)
78 auto Strategy = RS.getSelection();
80 Strategy->mutate(M, IB);
98 std::vector<fuzzerop::OpDescriptor>
Ops;
108std::optional<fuzzerop::OpDescriptor>
111 return Op.SourcePreds[0].matches({}, Src);
145 End = std::prev(BB.
end());
160 if (Insts.
size() < 1)
166 auto InstsBefore =
ArrayRef(Insts).slice(0, IP);
167 auto InstsAfter =
ArrayRef(Insts).slice(IP);
171 Srcs.
push_back(IB.findOrCreateSource(BB, InstsBefore));
175 auto OpDesc = chooseOperation(Srcs[0], IB);
180 for (
const auto &Pred :
ArrayRef(OpDesc->SourcePreds).slice(1))
181 Srcs.
push_back(IB.findOrCreateSource(BB, InstsBefore, Srcs, Pred));
183 if (
Value *
Op = OpDesc->BuilderFunc(Srcs, Insts[IP]->getIterator())) {
185 IB.connectToSink(BB, InstsAfter,
Op);
190 uint64_t CurrentWeight) {
192 if (CurrentSize > MaxSize - 200)
193 return CurrentWeight ? CurrentWeight * 100 : 1;
196 int64_t Line = (-2 *
static_cast<int64_t
>(CurrentWeight)) *
197 (
static_cast<int64_t
>(MaxSize) -
198 static_cast<int64_t
>(CurrentSize) - 1000) /
210 if (Inst.isTerminator() || Inst.isEHPad() || Inst.isSwiftError() ||
220 mutate(*RS.getSelection(), IB);
243 if (Pred.matches({}, &*
I))
248 RS.sample(IB.newSource(*BB, InstsBefore, {}, Pred), 1);
256 SmallVector<std::function<void()>, 8> Modifications;
263 case Instruction::Add:
264 case Instruction::Mul:
265 case Instruction::Sub:
266 case Instruction::Shl:
267 Modifications.push_back(
269 Modifications.push_back(
272 case Instruction::ICmp:
276 Modifications.push_back(
281 case Instruction::GetElementPtr:
283 Modifications.push_back(
284 [
GEP]() {
GEP->setIsInBounds(!
GEP->isInBounds()); });
287 case Instruction::UDiv:
288 case Instruction::SDiv:
289 case Instruction::LShr:
290 case Instruction::AShr:
294 case Instruction::FCmp:
298 Modifications.push_back(
307 Modifications.push_back(
310 Modifications.push_back(
313 Modifications.push_back(
317 Modifications.push_back(
319 Modifications.push_back(
321 Modifications.push_back(
323 Modifications.push_back(
328 std::pair<int, int> NoneItem({-1, -1}), ShuffleItems(NoneItem);
330 case Instruction::SDiv:
331 case Instruction::UDiv:
332 case Instruction::SRem:
333 case Instruction::URem:
334 case Instruction::FDiv:
335 case Instruction::FRem: {
340 if (!
C->isNullValue()) {
341 ShuffleItems = {0, 1};
346 case Instruction::Select:
347 ShuffleItems = {1, 2};
349 case Instruction::Add:
350 case Instruction::Sub:
351 case Instruction::Mul:
352 case Instruction::Shl:
353 case Instruction::LShr:
354 case Instruction::AShr:
355 case Instruction::And:
356 case Instruction::Or:
357 case Instruction::Xor:
358 case Instruction::FAdd:
359 case Instruction::FSub:
360 case Instruction::FMul:
361 case Instruction::ICmp:
362 case Instruction::FCmp:
363 case Instruction::ShuffleVector:
364 ShuffleItems = {0, 1};
367 if (ShuffleItems != NoneItem) {
368 Modifications.push_back([&Inst, &ShuffleItems]() {
387 }
while (CasesTaken.
count(tmp) != 0);
403 auto IsUnsupportedTy = [](
Type *
T) {
404 return T->isMetadataTy() ||
T->isTokenTy();
407 if (IsUnsupportedTy(
F->getReturnType()) ||
408 any_of(
F->getFunctionType()->params(), IsUnsupportedTy)) {
418 Attribute::StructRet, Attribute::ByVal,
419 Attribute::InAlloca, Attribute::InReg,
420 Attribute::StackAlignment, Attribute::SwiftSelf,
421 Attribute::SwiftAsync, Attribute::SwiftError,
422 Attribute::Preallocated, Attribute::ByRef,
423 Attribute::ZExt, Attribute::SExt};
426 return A.hasAttribute(kind);
430 auto FuncAttrs =
F->getAttributes();
431 if (IsABIAttribute(FuncAttrs.getRetAttrs())) {
434 for (
size_t i = 0; i <
F->arg_size(); i++) {
435 if (IsABIAttribute(FuncAttrs.getParamAttrs(i))) {
447 if (
F->isIntrinsic() &&
F->getIntrinsicID() == Intrinsic::amdgcn_cs_chain) {
459 Functions.push_back(&
F);
466 F = IB.createFunctionDeclaration(*M);
471 if (!
F->arg_empty()) {
479 StringRef Name = isRetVoid ? nullptr :
"C";
481 Call->setCallingConv(
F->getCallingConv());
483 return isRetVoid ? nullptr :
Call;
488 if (Insts.
size() < 1)
494 auto InstsBefore =
ArrayRef(Insts).slice(0, IP);
495 auto InstsAfter =
ArrayRef(Insts).slice(IP);
500 for (
const auto &Pred :
ArrayRef(SourcePreds)) {
501 Srcs.push_back(IB.findOrCreateSource(BB, InstsBefore, Srcs, Pred));
504 if (
Value *
Op = BuilderFunc(Srcs, Insts[IP]->getIterator())) {
506 IB.connectToSink(BB, InstsAfter,
Op);
513 if (Insts.
size() < 1)
518 auto InstsBeforeSplit =
ArrayRef(Insts).slice(0, IP);
535 IB.findOrCreateSource(*Source, InstsBeforeSplit, {},
541 connectBlocksToSink({IfTrue, IfFalse}, Sink, IB);
547 return Ty->isIntegerTy();
549 assert(RS &&
"There is no integer type in all allowed types, is the "
551 Type *Ty = RS.getSelection();
554 uint64_t BitSize = IntTy->getBitWidth();
555 uint64_t MaxCaseVal =
556 (BitSize >= 64) ? (uint64_t)-1 : ((uint64_t)1 << BitSize) - 1;
558 Value *
Cond = IB.findOrCreateSource(*Source, InstsBeforeSplit, {},
562 NumCases = (NumCases > MaxCaseVal) ? MaxCaseVal + 1 : NumCases;
570 for (uint64_t i = 0; i < NumCases; i++) {
573 ConstantInt *OnValue = ConstantInt::get(IntTy, CaseVal);
574 Switch->addCase(OnValue, CaseBlock);
575 Blocks.push_back(CaseBlock);
579 connectBlocksToSink(Blocks, Sink, IB);
589 for (uint64_t i = 0; i < Blocks.
size(); i++) {
591 CFGToSink ToSink = (i == DirectSinkIdx)
592 ? CFGToSink::DirectSink
593 : static_cast<CFGToSink>(
uniform<uint64_t>(
594 IB.Rand, 0, CFGToSink::EndOfCFGToLink - 1));
599 case CFGToSink::Return: {
600 Type *RetTy =
F->getReturnType();
601 Value *RetValue =
nullptr;
608 case CFGToSink::DirectSink: {
612 case CFGToSink::SinkOrSelfLoop: {
621 case CFGToSink::EndOfCFGToLink:
631 Type *Ty = IB.randomType();
637 Value *Src = IncomingValues[Pred];
641 for (
auto I = Pred->begin();
I != Pred->end(); ++
I)
646 IncomingValues[Pred] = Src;
648 PHI->addIncoming(Src, Pred);
652 IB.connectToSink(BB, InstsAfter,
PHI);
663 if (Insts.
size() < 1)
669 auto InstsAfter =
ArrayRef(Insts).slice(Idx + 1);
672 if (!Ty->isVoidTy() && !Ty->isTokenTy())
674 IB.connectToSink(BB, InstsAfter, Inst);
680 std::map<size_t, Instruction *> AliveInsts;
681 std::map<Instruction *, size_t> AliveInstsLookup;
682 size_t InsertIdx = 0;
688 AliveInsts.insert({InsertIdx, &
I});
689 AliveInstsLookup.insert({&
I, InsertIdx++});
691 I.removeFromParent();
697 auto hasAliveParent = [&AliveInsts, &AliveInstsLookup](
size_t Index) {
698 for (
Value *O : AliveInsts[Index]->operands()) {
700 if (
P && AliveInstsLookup.count(
P))
708 auto getAliveChildren = [&AliveInstsLookup](
Instruction *
I) {
710 for (
Value *U :
I->users()) {
712 auto It = AliveInstsLookup.find(
P);
713 if (It != AliveInstsLookup.end())
714 Children.insert(It->second);
721 for (
const auto &[Index, Inst] : AliveInsts) {
722 if (!hasAliveParent(Index))
723 RootIndices.
insert(Index);
726 while (!RootIndices.
empty()) {
728 for (
size_t RootIdx : RootIndices)
729 RS.sample(RootIdx, 1);
730 size_t RootIdx = RS.getSelection();
732 RootIndices.erase(RootIdx);
734 AliveInsts.erase(RootIdx);
735 AliveInstsLookup.erase(Root);
738 for (
size_t Child : getAliveChildren(Root)) {
739 if (!hasAliveParent(Child)) {
740 RootIndices.insert(Child);
748 I->insertBefore(Terminator->getIterator());
757 return std::make_unique<Module>(
"M", Context);
764 if (
Error E = M.takeError()) {
768 return std::move(M.get());
777 if (Buf.size() > MaxSize)
779 memcpy(Dest, Buf.data(), Buf.size());
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Expand Atomic instructions
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static Instruction * getEffectiveTerminator(BasicBlock &BB)
static bool isUnsupportedFunction(Function *F)
Determines whether a function is unsupported by the current mutator's implementation.
static void eliminateDeadCode(Function &F)
static iterator_range< BasicBlock::iterator > getInsertionRange(BasicBlock &BB)
static BasicBlock::iterator getEndIterator(BasicBlock &BB)
static uint64_t getUniqueCaseValue(SmallSet< uint64_t, 4 > &CasesTaken, uint64_t MaxValue, RandomIRBuilder &IB)
Return a case value that is not already taken to make sure we don't have two cases with same value.
Module.h This file contains the declarations for the Module class.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
FunctionAnalysisManager FAM
This file defines the Pass Instrumentation classes that provide instrumentation points into the pass ...
SmallVector< MachineOperand, 4 > Cond
static ManagedStatic< cl::opt< uint64_t >, CreateSeed > Seed
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
This file defines the SmallSet class.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
This class holds the attributes for a particular argument, parameter, function, or return value.
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
LLVM Basic Block Representation.
iterator begin()
Instruction iterator methods.
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...
const Function * getParent() const
Return the enclosing method, or null if none.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
InstListType::iterator iterator
Instruction iterators...
bool isEHPad() const
Return true if this basic block is an exception handling block.
LLVM_ABI const CallInst * getTerminatingMustTailCall() const
Returns the call instruction marked 'musttail' prior to the terminating return instruction of this ba...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This class is the base class for the comparison instructions.
void setPredicate(Predicate P)
Set the predicate for this instruction to the specified value.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Conditional Branch instruction.
static CondBrInst * Create(Value *Cond, BasicBlock *IfTrue, BasicBlock *IfFalse, InsertPosition InsertBefore=nullptr)
This is the shared class of boolean and integer constants.
This is an important base class in LLVM.
Basic Dead Code Elimination pass.
Lightweight error class with error context and mandatory checking.
Class to represent function types.
ArrayRef< Type * > params() const
const BasicBlock & getEntryBlock() const
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
Module * getParent()
Get the module that this global value is contained inside of...
virtual void mutate(Module &M, RandomIRBuilder &IB)
LLVM_ABI void mutateModule(Module &M, int Seed, size_t MaxSize)
Mutate given module.
static LLVM_ABI size_t getModuleSize(const Module &M)
Calculate the size of module as the number of objects in it, i.e.
static std::vector< fuzzerop::OpDescriptor > getDefaultOps()
void mutate(Function &F, RandomIRBuilder &IB) override
void mutate(BasicBlock &BB, RandomIRBuilder &IB) override
void mutate(BasicBlock &BB, RandomIRBuilder &IB) override
void mutate(BasicBlock &BB, RandomIRBuilder &IB) override
uint64_t getWeight(size_t CurrentSize, size_t MaxSize, uint64_t CurrentWeight) override
Provide a weight to bias towards choosing this strategy for a mutation.
void mutate(Function &F, RandomIRBuilder &IB) override
void mutate(Instruction &Inst, RandomIRBuilder &IB) override
LLVM_ABI void setHasNoUnsignedWrap(bool b=true)
Set or clear the nuw flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI bool hasNoNaNs() const LLVM_READONLY
Determine whether the no-NaNs flag is set.
LLVM_ABI bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
LLVM_ABI bool hasNoInfs() const LLVM_READONLY
Determine whether the no-infs flag is set.
LLVM_ABI void setHasNoSignedZeros(bool B)
Set or clear the no-signed-zeros flag on this instruction, which must be an operator which supports t...
LLVM_ABI bool hasNoSignedZeros() const LLVM_READONLY
Determine whether the no-signed-zeros flag is set.
LLVM_ABI bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
LLVM_ABI void setHasAllowContract(bool B)
Set or clear the allow-contract flag on this instruction, which must be an operator which supports th...
LLVM_ABI void setHasNoSignedWrap(bool b=true)
Set or clear the nsw flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI void setHasNoNaNs(bool B)
Set or clear the no-nans flag on this instruction, which must be an operator which supports this flag...
LLVM_ABI void setHasApproxFunc(bool B)
Set or clear the approximate-math-functions flag on this instruction, which must be an operator which...
LLVM_ABI void setHasAllowReassoc(bool B)
Set or clear the reassociation flag on this instruction, which must be an operator which supports thi...
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI bool isExact() const LLVM_READONLY
Determine whether the exact flag is set.
bool isTerminator() const
LLVM_ABI bool hasAllowReciprocal() const LLVM_READONLY
Determine whether the allow-reciprocal flag is set.
LLVM_ABI void setHasNoInfs(bool B)
Set or clear the no-infs flag on this instruction, which must be an operator which supports this flag...
LLVM_ABI FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
LLVM_ABI bool hasApproxFunc() const LLVM_READONLY
Determine whether the approximate-math-functions flag is set.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
LLVM_ABI void setIsExact(bool b=true)
Set or clear the exact flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI void setHasAllowReciprocal(bool B)
Set or clear the allow-reciprocal flag on this instruction, which must be an operator which supports ...
LLVM_ABI bool hasAllowContract() const LLVM_READONLY
Determine whether the allow-contract flag is set.
LLVM_ABI void setFast(bool B)
Set or clear all fast-math-flags on this instruction, which must be an operator which supports this f...
LLVM_ABI bool hasAllowReassoc() const LLVM_READONLY
Determine whether the allow-reassociation flag is set.
Class to represent integer types.
A wrapper class for inspecting calls to intrinsic functions.
This is an important class for using LLVM in a threaded context.
static std::unique_ptr< MemoryBuffer > getMemBuffer(StringRef InputData, StringRef BufferName="", bool RequiresNullTerminator=true)
Open the specified memory range as a MemoryBuffer.
A Module instance is used to store all the information related to an LLVM module.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
Pseudo-analysis pass that exposes the PassInstrumentation to pass managers.
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t<!std::is_same_v< PassT, PassManager > > addPass(PassT &&Pass)
PreservedAnalyses run(IRUnitT &IR, AnalysisManagerT &AM, ExtraArgTs... ExtraArgs)
Run all of the passes in this manager over the given unit of IR.
static ReturnInst * Create(LLVMContext &C, Value *retVal=nullptr, InsertPosition InsertBefore=nullptr)
void mutate(BasicBlock &BB, RandomIRBuilder &IB) override
void mutate(Function &F, RandomIRBuilder &IB) override
A SetVector that performs no allocations if smaller than a certain size.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
void push_back(const T &Elt)
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.
static SwitchInst * Create(Value *Value, BasicBlock *Default, unsigned NumCases, InsertPosition InsertBefore=nullptr)
Analysis pass providing the TargetLibraryInfo.
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
bool isVoidTy() const
Return true if this is 'void'.
static UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
This function has undefined behavior.
void setOperand(unsigned i, Value *Val)
Value * getOperand(unsigned i) const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
const ParentTy * getParent() const
self_iterator getIterator()
A range adaptor for a pair of iterators.
A raw_ostream that writes to an std::string.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
static SourcePred onlyType(Type *Only)
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI void ReplaceInstWithInst(BasicBlock *BB, BasicBlock::iterator &BI, Instruction *I)
Replace the instruction specified by BI with the instruction specified by I.
LLVM_ABI void describeFuzzerIntOps(std::vector< fuzzerop::OpDescriptor > &Ops)
Getters for the default sets of operations, per general category.
LLVM_ABI Expected< std::unique_ptr< Module > > parseBitcodeFile(MemoryBufferRef Buffer, LLVMContext &Context, ParserCallbacks Callbacks={})
Read the specified bitcode file, returning the module.
LLVM_ABI void WriteBitcodeToFile(const Module &M, raw_ostream &Out, bool ShouldPreserveUseListOrder=false, const ModuleSummaryIndex *Index=nullptr, bool GenerateHash=false, ModuleHash *ModHash=nullptr)
Write the specified module to the specified raw output stream.
LLVM_ABI std::unique_ptr< Module > parseAndVerify(const uint8_t *Data, size_t Size, LLVMContext &Context)
Try to parse module and verify it.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
LLVM_ABI std::unique_ptr< Module > parseModule(const uint8_t *Data, size_t Size, LLVMContext &Context)
Fuzzer friendly interface for the llvm bitcode parser.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
auto pred_size(const MachineBasicBlock *BB)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
LLVM_ABI void describeFuzzerAggregateOps(std::vector< fuzzerop::OpDescriptor > &Ops)
LLVM_ABI size_t writeModule(const Module &M, uint8_t *Dest, size_t MaxSize)
Fuzzer friendly interface for the llvm bitcode printer.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
ReservoirSampler< ElT, GenT > makeSampler(GenT &RandGen, RangeT &&Items)
LLVM_ABI void describeFuzzerVectorOps(std::vector< fuzzerop::OpDescriptor > &Ops)
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...
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
DWARFExpression::Operation Op
LLVM_ABI void describeFuzzerFloatOps(std::vector< fuzzerop::OpDescriptor > &Ops)
PassManager< Function > FunctionPassManager
Convenience typedef for a pass manager over functions.
ArrayRef(const T &OneElt) -> ArrayRef< T >
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI void describeFuzzerControlFlowOps(std::vector< fuzzerop::OpDescriptor > &Ops)
auto predecessors(const MachineBasicBlock *BB)
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
LLVM_ABI void describeFuzzerPointerOps(std::vector< fuzzerop::OpDescriptor > &Ops)
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
@ End
Run the machine verifier once, at the end of the pipeline.
T uniform(GenT &Gen, T Min, T Max)
Return a uniformly distributed random value between Min and Max.
constexpr bool isCallableCC(CallingConv::ID CC)
LLVM_ABI bool verifyModule(const Module &M, raw_ostream *OS=nullptr, bool *BrokenDebugInfo=nullptr)
Check a module for errors.
A description of some operation we can build while fuzzing IR.