brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · 6ec70d9 Raw
61 lines · cpp
1//===-- OpDescriptor.cpp --------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/FuzzMutate/OpDescriptor.h"10#include "llvm/IR/Constants.h"11#include "llvm/Support/CommandLine.h"12 13using namespace llvm;14using namespace fuzzerop;15 16static cl::opt<bool> UseUndef("use-undef",17                              cl::desc("Use undef when generating programs."),18                              cl::init(false));19 20void fuzzerop::makeConstantsWithType(Type *T, std::vector<Constant *> &Cs) {21  if (auto *IntTy = dyn_cast<IntegerType>(T)) {22    uint64_t W = IntTy->getBitWidth();23    Cs.push_back(ConstantInt::get(IntTy, 0));24    Cs.push_back(ConstantInt::get(IntTy, 1));25    Cs.push_back(ConstantInt::get(IntTy, 42));26    Cs.push_back(ConstantInt::get(IntTy, APInt::getMaxValue(W)));27    Cs.push_back(ConstantInt::get(IntTy, APInt::getMinValue(W)));28    Cs.push_back(ConstantInt::get(IntTy, APInt::getSignedMaxValue(W)));29    Cs.push_back(ConstantInt::get(IntTy, APInt::getSignedMinValue(W)));30    Cs.push_back(ConstantInt::get(IntTy, APInt::getOneBitSet(W, W / 2)));31  } else if (T->isFloatingPointTy()) {32    auto &Ctx = T->getContext();33    auto &Sem = T->getFltSemantics();34    Cs.push_back(ConstantFP::get(Ctx, APFloat::getZero(Sem)));35    Cs.push_back(ConstantFP::get(Ctx, APFloat(Sem, 1)));36    Cs.push_back(ConstantFP::get(Ctx, APFloat(Sem, 42)));37    Cs.push_back(ConstantFP::get(Ctx, APFloat::getLargest(Sem)));38    Cs.push_back(ConstantFP::get(Ctx, APFloat::getSmallest(Sem)));39    Cs.push_back(ConstantFP::get(Ctx, APFloat::getInf(Sem)));40    Cs.push_back(ConstantFP::get(Ctx, APFloat::getNaN(Sem)));41  } else if (VectorType *VecTy = dyn_cast<VectorType>(T)) {42    std::vector<Constant *> EleCs;43    Type *EltTy = VecTy->getElementType();44    makeConstantsWithType(EltTy, EleCs);45    ElementCount EC = VecTy->getElementCount();46    for (Constant *Elt : EleCs) {47      Cs.push_back(ConstantVector::getSplat(EC, Elt));48    }49  } else {50    if (UseUndef)51      Cs.push_back(UndefValue::get(T));52    Cs.push_back(PoisonValue::get(T));53  }54}55 56std::vector<Constant *> fuzzerop::makeConstantsWithType(Type *T) {57  std::vector<Constant *> Result;58  makeConstantsWithType(T, Result);59  return Result;60}61