本文整理汇总了C++中ConstantExpr::getAPValue方法的典型用法代码示例。如果您正苦于以下问题:C++ ConstantExpr::getAPValue方法的具体用法?C++ ConstantExpr::getAPValue怎么用?C++ ConstantExpr::getAPValue使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ConstantExpr
的用法示例。
在下文中一共展示了ConstantExpr::getAPValue方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: apValue
/**
* 将ConstantExpr转换为对应的Constant类型
*/
Constant* Transfer::expr2Constant(Expr* expr, Type* type) {
Constant* param = NULL;
if (type->isIntegerTy()) {
ConstantExpr* constantExpr = dyn_cast<ConstantExpr>(expr);
param = ConstantInt::get(type, constantExpr->getAPValue());
} else if (type->isFloatTy()) {
ConstantExpr* constantExpr = dyn_cast<ConstantExpr>(expr);
APFloat apValue(APFloat::IEEEsingle, constantExpr->getAPValue());
param = ConstantFP::get(type->getContext(), apValue);
} else if (type->isDoubleTy()) {
ConstantExpr* constantExpr = dyn_cast<ConstantExpr>(expr);
APFloat apValue(APFloat::IEEEdouble, constantExpr->getAPValue());
param = ConstantFP::get(type->getContext(), apValue);
} else if (type->isPointerTy()) {
ConstantExpr* constantExpr = dyn_cast<ConstantExpr>(expr);
param = ConstantInt::get(
Type::getIntNTy(type->getContext(),
Context::get().getPointerWidth()),
constantExpr->getAPValue());
} else {
assert(0 && "not support type");
}
return param;
}
示例2: getOrMakeExpr
z3::expr Z3Builder::makeExpr(ref<Expr> e) {
++stats::queryConstructs;
switch (e->getKind()) {
case Expr::Constant: {
ConstantExpr *CE = cast<ConstantExpr>(e);
unsigned width = CE->getWidth();
if (width == 1)
return context_.bool_val(CE->isTrue());
if (width <= 64)
return context_.bv_val((__uint64)CE->getZExtValue(), width);
// This is slower than concatenating 64-bit extractions, like STPBuilder
// does, but the assumption is that it's quite infrequent.
// TODO: Log these transformations.
llvm::SmallString<32> const_repr;
CE->getAPValue().toStringUnsigned(const_repr, 10);
return context_.bv_val(const_repr.c_str(), width);
}
case Expr::NotOptimized: {
NotOptimizedExpr *noe = cast<NotOptimizedExpr>(e);
return getOrMakeExpr(noe->src);
}
case Expr::Read: {
return makeReadExpr(cast<ReadExpr>(e));
}
case Expr::Select: {
SelectExpr *se = cast<SelectExpr>(e);
// XXX: A bug in Clang prevents us from using z3::ite
return z3::to_expr(context_, Z3_mk_ite(context_,
getOrMakeExpr(se->cond),
getOrMakeExpr(se->trueExpr),
getOrMakeExpr(se->falseExpr)));
}
case Expr::Concat: {
ConcatExpr *ce = cast<ConcatExpr>(e);
unsigned numKids = ce->getNumKids();
z3::expr res = getOrMakeExpr(ce->getKid(numKids-1));
for (int i = numKids - 2; i >= 0; --i) {
res = z3::to_expr(context_,
Z3_mk_concat(context_, getOrMakeExpr(ce->getKid(i)), res));
}
return res;
}
case Expr::Extract: {
ExtractExpr *ee = cast<ExtractExpr>(e);
z3::expr src = getOrMakeExpr(ee->expr);
if (ee->getWidth() == 1) {
return z3::to_expr(context_, Z3_mk_extract(context_,
ee->offset, ee->offset, src)) == context_.bv_val(1, 1);
} else {
return z3::to_expr(context_, Z3_mk_extract(context_,
ee->offset + ee->getWidth() - 1, ee->offset, src));
}
}
// Casting
case Expr::ZExt: {
CastExpr *ce = cast<CastExpr>(e);
z3::expr src = getOrMakeExpr(ce->src);
if (src.is_bool()) {
// XXX: A bug in Clang prevents us from using z3::ite
return z3::to_expr(context_, Z3_mk_ite(context_,
src,
context_.bv_val(1, ce->getWidth()),
context_.bv_val(0, ce->getWidth())));
} else {
return z3::to_expr(context_, Z3_mk_zero_ext(context_,
ce->getWidth() - src.get_sort().bv_size(), src));
}
}
case Expr::SExt: {
CastExpr *ce = cast<CastExpr>(e);
z3::expr src = getOrMakeExpr(ce->src);
if (src.is_bool()) {
return z3::to_expr(context_, Z3_mk_ite(context_,
src,
context_.bv_val(1, ce->getWidth()),
context_.bv_val(0, ce->getWidth())));
} else {
return z3::to_expr(context_, Z3_mk_sign_ext(context_,
ce->getWidth() - src.get_sort().bv_size(), src));
}
}
// Arithmetic
case Expr::Add: {
AddExpr *ae = cast<AddExpr>(e);
//.........这里部分代码省略.........
示例3: resValue
z3::expr KQuery2Z3::eachExprToZ3(ref<Expr> &ele) {
z3::expr res = z3_ctx.bool_val(true);
switch (ele->getKind()) {
case Expr::Constant: {
ConstantExpr *ce = cast<ConstantExpr>(ele);
Expr::Width width = ce->getWidth();
if (ele.get()->isFloat) {
//float point number
//in z3 there is no difference between float and double
//they are all real value.
double temp = 1.0;
if (width == 32) {
llvm::APFloat resValue(llvm::APFloat::IEEEsingle,
ce->getAPValue());
temp = resValue.convertToFloat(); //the real float number,how to establish expr of z3
} else if (width == 64) {
llvm::APFloat resValue(llvm::APFloat::IEEEdouble,
ce->getAPValue());
temp = resValue.convertToDouble(); // the real double number.
}
Fraction frac;
getFraction(temp, frac);
// std::stringstream ss;
// ss << temp;
// std::cerr << "frac.num = " << frac.num << " "
// << "frac.den = " << frac.den << std::endl;
// res = z3_ctx.real_val(ss.str().c_str());
res = z3_ctx.real_val(frac.num, frac.den);
// std::cerr << "float point value = " << res << std::endl;
} else {
if (width == Expr::Bool) {
if (ce->isTrue()) {
//that is true
res = z3_ctx.bool_val(true);
} else {
//that is false
res = z3_ctx.bool_val(false);
}
} else if (width != Expr::Fl80) {
int temp = ce->getZExtValue();
// std::cerr << "temp = " << temp << std::endl;
#if INT_ARITHMETIC
res = z3_ctx.int_val(temp);
#else
res = z3_ctx.bv_val(temp, BIT_WIDTH);
#endif
// std::cerr << res;
} else {
assert(0 && "The Fl80 out, value bit number extends 64");
}
}
return res;
}
case Expr::NotOptimized: {
assert(0 && "don't handle NotOptimized expression");
return res;
}
case Expr::Read: {
//type char
ReadExpr *re = cast<ReadExpr>(ele);
assert(re && re->updates.root);
const std::string varName = re->updates.root->name;
if (re->getWidth() == Expr::Bool) {
res = z3_ctx.bool_const(varName.c_str());
} else {
#if INT_ARITHMETIC
res = z3_ctx.constant(varName.c_str(), z3_ctx.int_sort());
#else
res = z3_ctx.constant(varName.c_str(), z3_ctx.bv_sort(BIT_WIDTH));
#endif
}
return res;
}
case Expr::Select: {
SelectExpr *se = cast<SelectExpr>(ele);
z3::expr cond = eachExprToZ3(se->cond);
z3::expr tExpr = eachExprToZ3(se->trueExpr);
z3::expr fExpr = eachExprToZ3(se->falseExpr);
res = z3::ite(cond, tExpr, fExpr);
return res;
}
case Expr::Concat: {
ConcatExpr *ce = cast<ConcatExpr>(ele);
ReadExpr *re = NULL;
if (ce->getKid(0)->getKind() == Expr::Read)
re = cast<ReadExpr>(ce->getKid(0));
else if (ce->getKid(1)->getKind() == Expr::Read)
re = cast<ReadExpr>(ce->getKid(1));
else if (ce->getKid(1)->getKind() == Expr::Concat){
//.........这里部分代码省略.........