SgAsmIntegerValueExpression::SgAsmIntegerValueExpression(const Sawyer::Container::BitVector &bv, SgAsmType *type) : p_baseNode(NULL) { ASSERT_not_null(type); ASSERT_require2(bv.size()==type->get_nBits(), "value width (" + StringUtility::plural(bv.size(), "bits") + ") does not match type width (" + StringUtility::plural(type->get_nBits(), "bits") + ")"); set_type(type); p_bitVector = bv; }
std::string RiscOperators::commentForVariable(const BaseSemantics::SValuePtr &addr, const std::string &accessMode, size_t byteNumber, size_t nBytes) const { std::string varComment = "first " + accessMode + " at "; if (pathInsnIndex_ != (size_t)(-1)) varComment += "path position #" + StringUtility::numberToString(pathInsnIndex_) + ", "; varComment += "instruction " + unparseInstructionWithAddress(currentInstruction()); // Sometimes we can save useful information about the address. if (nBytes != 1) { SymbolicExpr::Ptr addrExpr = SValue::promote(addr)->get_expression(); if (SymbolicExpr::LeafPtr addrLeaf = addrExpr->isLeafNode()) { if (addrLeaf->isNumber()) { varComment += "\n"; if (nBytes > 1) { varComment += StringUtility::numberToString(byteNumber) + " of " + StringUtility::numberToString(nBytes) + " bytes starting "; } varComment += "at address " + addrLeaf->toString(); } } else if (SymbolicExpr::InteriorPtr addrINode = addrExpr->isInteriorNode()) { if (addrINode->getOperator() == SymbolicExpr::OP_ADD && addrINode->nChildren() == 2 && addrINode->child(0)->isLeafNode() && addrINode->child(0)->isLeafNode()->isVariable() && addrINode->child(1)->isLeafNode() && addrINode->child(1)->isLeafNode()->isNumber()) { SymbolicExpr::LeafPtr base = addrINode->child(0)->isLeafNode(); SymbolicExpr::LeafPtr offset = addrINode->child(1)->isLeafNode(); varComment += "\n"; if (nBytes > 1) { varComment += StringUtility::numberToString(byteNumber) + " of " + StringUtility::numberToString(nBytes) + " bytes starting "; } varComment += "at address "; if (base->comment().empty()) { varComment = base->toString(); } else { varComment += base->comment(); } Sawyer::Container::BitVector tmp = offset->bits(); if (tmp.get(tmp.size()-1)) { varComment += " - 0x" + tmp.negate().toHex(); } else { varComment += " + 0x" + tmp.toHex(); } } } } return varComment; }