本文整理汇总了C++中ConstantExpr::getZExtValue方法的典型用法代码示例。如果您正苦于以下问题:C++ ConstantExpr::getZExtValue方法的具体用法?C++ ConstantExpr::getZExtValue怎么用?C++ ConstantExpr::getZExtValue使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ConstantExpr
的用法示例。
在下文中一共展示了ConstantExpr::getZExtValue方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: create
ref<Expr> BitfieldSimplifier::replaceWithConstant(ref<Expr> e, uint64_t value)
{
ConstantExpr *ce = dyn_cast<ConstantExpr>(e);
if(ce && ce->getZExtValue() == value)
return e;
// Remove kids from cache
unsigned numKids = e->getNumKids();
for(unsigned i = 0; i < numKids; ++i)
m_bitsInfoCache.erase(e->getKid(i));
// Remove e from cache
m_bitsInfoCache.erase(e);
return ConstantExpr::create(value & ~zeroMask(e->getWidth()), e->getWidth());
}
示例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){
//.........这里部分代码省略.........
示例4: constructActual
/** if *width_out!=1 then result is a bitvector,
otherwise it is a bool */
ExprHandle STPBuilder::constructActual(ref<Expr> e, int *width_out) {
int width;
if (!width_out) width_out = &width;
++stats::queryConstructs;
switch (e->getKind()) {
case Expr::Constant: {
ConstantExpr *CE = cast<ConstantExpr>(e);
*width_out = CE->getWidth();
// Coerce to bool if necessary.
if (*width_out == 1)
return CE->isTrue() ? getTrue() : getFalse();
// Fast path.
if (*width_out <= 32)
return bvConst32(*width_out, CE->getZExtValue(32));
if (*width_out <= 64)
return bvConst64(*width_out, CE->getZExtValue());
ref<ConstantExpr> Tmp = CE;
ExprHandle Res = bvConst64(64, Tmp->Extract(0, 64)->getZExtValue());
while (Tmp->getWidth() > 64) {
Tmp = Tmp->Extract(64, Tmp->getWidth()-64);
unsigned Width = std::min(64U, Tmp->getWidth());
Res = vc_bvConcatExpr(vc, bvConst64(Width,
Tmp->Extract(0, Width)->getZExtValue()),
Res);
}
return Res;
}
// Special
case Expr::NotOptimized: {
NotOptimizedExpr *noe = cast<NotOptimizedExpr>(e);
return construct(noe->src, width_out);
}
case Expr::Read: {
ReadExpr *re = cast<ReadExpr>(e);
assert(re && re->updates.root);
*width_out = re->updates.root->getRange();
return vc_readExpr(vc,
getArrayForUpdate(re->updates.root, re->updates.head),
construct(re->index, 0));
}
case Expr::Select: {
SelectExpr *se = cast<SelectExpr>(e);
ExprHandle cond = construct(se->cond, 0);
ExprHandle tExpr = construct(se->trueExpr, width_out);
ExprHandle fExpr = construct(se->falseExpr, width_out);
return vc_iteExpr(vc, cond, tExpr, fExpr);
}
case Expr::Concat: {
ConcatExpr *ce = cast<ConcatExpr>(e);
unsigned numKids = ce->getNumKids();
ExprHandle res = construct(ce->getKid(numKids-1), 0);
for (int i=numKids-2; i>=0; i--) {
res = vc_bvConcatExpr(vc, construct(ce->getKid(i), 0), res);
}
*width_out = ce->getWidth();
return res;
}
case Expr::Extract: {
ExtractExpr *ee = cast<ExtractExpr>(e);
ExprHandle src = construct(ee->expr, width_out);
*width_out = ee->getWidth();
if (*width_out==1) {
return bvBoolExtract(src, ee->offset);
} else {
return vc_bvExtract(vc, src, ee->offset + *width_out - 1, ee->offset);
}
}
// Casting
case Expr::ZExt: {
int srcWidth;
CastExpr *ce = cast<CastExpr>(e);
ExprHandle src = construct(ce->src, &srcWidth);
*width_out = ce->getWidth();
if (srcWidth==1) {
return vc_iteExpr(vc, src, bvOne(*width_out), bvZero(*width_out));
} else {
return vc_bvConcatExpr(vc, bvZero(*width_out-srcWidth), src);
}
}
case Expr::SExt: {
int srcWidth;
CastExpr *ce = cast<CastExpr>(e);
ExprHandle src = construct(ce->src, &srcWidth);
*width_out = ce->getWidth();
if (srcWidth==1) {
//.........这里部分代码省略.........
示例5: constructActual
/** if *et_out==etBV then result is a bitvector,
otherwise it is a bool */
ExprHandle STPBuilder::constructActual(ref<Expr> e, int *width_out, STPExprType *et_out) {
int width;
if (!width_out) width_out = &width;
++stats::queryConstructs;
switch (e->getKind()) {
case Expr::Constant: {
ConstantExpr *CE = cast<ConstantExpr>(e);
*width_out = CE->getWidth();
// Coerce to bool if necessary.
if (*width_out == 1 && (*et_out == etBOOL || *et_out == etDontCare)) {
*et_out = etBOOL;
return CE->isTrue() ? getTrue() : getFalse();
}
*et_out = etBV;
// Fast path.
if (*width_out <= 32)
return bvConst32(*width_out, CE->getZExtValue(32));
if (*width_out <= 64)
return bvConst64(*width_out, CE->getZExtValue());
ref<ConstantExpr> Tmp = CE;
ExprHandle Res = bvConst64(64, Tmp->Extract(0, 64)->getZExtValue());
while (Tmp->getWidth() > 64) {
Tmp = Tmp->Extract(64, Tmp->getWidth()-64);
unsigned Width = std::min(64U, Tmp->getWidth());
Res = vc_bvConcatExpr(vc, bvConst64(Width,
Tmp->Extract(0, Width)->getZExtValue()),
Res);
}
return Res;
}
// Special
case Expr::NotOptimized: {
NotOptimizedExpr *noe = cast<NotOptimizedExpr>(e);
return construct(noe->src, width_out, et_out);
}
case Expr::Read: {
ReadExpr *re = cast<ReadExpr>(e);
*width_out = 8;
*et_out = etBV;
return vc_readExpr(vc,
getArrayForUpdate(re->updates.root, re->updates.head),
construct(re->index, 0, etBV));
}
case Expr::Select: {
SelectExpr *se = cast<SelectExpr>(e);
ExprHandle cond = construct(se->cond, 0, etBOOL);
ExprHandle tExpr = construct(se->trueExpr, width_out, etBV);
ExprHandle fExpr = construct(se->falseExpr, width_out, etBV);
*et_out = etBV;
return vc_iteExpr(vc, cond, tExpr, fExpr);
}
case Expr::Concat: {
ConcatExpr *ce = cast<ConcatExpr>(e);
unsigned numKids = ce->getNumKids();
ExprHandle res = construct(ce->getKid(numKids-1), 0, etBV);
for (int i=numKids-2; i>=0; i--) {
res = vc_bvConcatExpr(vc, construct(ce->getKid(i), 0, etBV), res);
}
*width_out = ce->getWidth();
*et_out = etBV;
return res;
}
case Expr::Extract: {
ExtractExpr *ee = cast<ExtractExpr>(e);
ExprHandle src = construct(ee->expr, width_out, etBV);
*width_out = ee->getWidth();
*et_out = etBV;
return vc_bvExtract(vc, src, ee->offset + *width_out - 1, ee->offset);
}
// Casting
case Expr::ZExt: {
int srcWidth;
CastExpr *ce = cast<CastExpr>(e);
STPExprType src_rt = etDontCare;
ExprHandle src = construct(ce->src, &srcWidth, &src_rt);
*width_out = ce->getWidth();
*et_out = etBV;
if (src_rt==etBOOL) {
return vc_iteExpr(vc, src, bvOne(*width_out), bvZero(*width_out));
} else {
return vc_bvConcatExpr(vc, bvZero(*width_out-srcWidth), src);
}
}
case Expr::SExt: {
//.........这里部分代码省略.........
示例6: SerializeExpr
uint64_t ExprFrame::SerializeExpr(const ref<Expr> e) {
data::ExprNode *ser_expr_node = expr_data_->add_expr();
ser_expr_node->set_id(s_.next_id_++);
ser_expr_node->set_kind((data::ExprKind)e->getKind());
switch (e->getKind()) {
case Expr::Constant: {
ConstantExpr *ce = cast<ConstantExpr>(e);
assert(ce->getWidth() <= 64 && "FIXME");
ser_expr_node->set_value(ce->getZExtValue());
ser_expr_node->set_width(ce->getWidth());
break;
}
case Expr::NotOptimized: {
NotOptimizedExpr *noe = cast<NotOptimizedExpr>(e);
ser_expr_node->add_child_expr_id(GetOrSerializeExpr(noe->src));
break;
}
case Expr::Read: {
ReadExpr *re = cast<ReadExpr>(e);
ser_expr_node->add_child_expr_id(GetOrSerializeExpr(re->index));
if (re->updates.head) {
ExprSerializer::UpdateNodePosition un_pos = GetOrSerializeUpdateList(re->updates);
ser_expr_node->set_update_list_id(un_pos.first);
ser_expr_node->set_update_list_offset(un_pos.second);
}
ser_expr_node->set_array_id(GetOrSerializeArray(re->updates.root));
break;
}
case Expr::Select: {
SelectExpr *se = cast<SelectExpr>(e);
ser_expr_node->add_child_expr_id(GetOrSerializeExpr(se->cond));
ser_expr_node->add_child_expr_id(GetOrSerializeExpr(se->trueExpr));
ser_expr_node->add_child_expr_id(GetOrSerializeExpr(se->falseExpr));
break;
}
case Expr::Concat: {
ConcatExpr *ce = cast<ConcatExpr>(e);
for (unsigned i = 0; i < ce->getNumKids(); ++i) {
ser_expr_node->add_child_expr_id(GetOrSerializeExpr(ce->getKid(i)));
}
break;
}
case Expr::Extract: {
ExtractExpr *ee = cast<ExtractExpr>(e);
ser_expr_node->add_child_expr_id(GetOrSerializeExpr(ee->expr));
ser_expr_node->set_offset(ee->offset);
ser_expr_node->set_width(ee->getWidth());
break;
}
// Casting,
case Expr::ZExt:
case Expr::SExt: {
CastExpr *ce = cast<CastExpr>(e);
ser_expr_node->add_child_expr_id(GetOrSerializeExpr(ce->src));
ser_expr_node->set_width(ce->getWidth());
break;
}
// All subsequent kinds are binary.
// Arithmetic
case Expr::Add:
case Expr::Sub:
case Expr::Mul:
case Expr::UDiv:
case Expr::SDiv:
case Expr::URem:
case Expr::SRem: {
BinaryExpr *be = cast<BinaryExpr>(e);
ser_expr_node->add_child_expr_id(GetOrSerializeExpr(be->left));
ser_expr_node->add_child_expr_id(GetOrSerializeExpr(be->right));
break;
}
// Bit
case Expr::Not: {
NotExpr *ne = cast<NotExpr>(e);
ser_expr_node->add_child_expr_id(GetOrSerializeExpr(ne->expr));
break;
}
case Expr::And:
case Expr::Or:
case Expr::Xor:
case Expr::Shl:
case Expr::LShr:
case Expr::AShr: {
BinaryExpr *be = cast<BinaryExpr>(e);
ser_expr_node->add_child_expr_id(GetOrSerializeExpr(be->left));
ser_expr_node->add_child_expr_id(GetOrSerializeExpr(be->right));
break;
//.........这里部分代码省略.........