type::Value ComparisonExpression::Evaluate( const AbstractTuple *tuple1, const AbstractTuple *tuple2, executor::ExecutorContext *context) const { PELOTON_ASSERT(children_.size() == 2); auto vl = children_[0]->Evaluate(tuple1, tuple2, context); auto vr = children_[1]->Evaluate(tuple1, tuple2, context); switch (exp_type_) { case (ExpressionType::COMPARE_EQUAL): return type::ValueFactory::GetBooleanValue(vl.CompareEquals(vr)); case (ExpressionType::COMPARE_NOTEQUAL): return type::ValueFactory::GetBooleanValue(vl.CompareNotEquals(vr)); case (ExpressionType::COMPARE_LESSTHAN): return type::ValueFactory::GetBooleanValue(vl.CompareLessThan(vr)); case (ExpressionType::COMPARE_GREATERTHAN): return type::ValueFactory::GetBooleanValue(vl.CompareGreaterThan(vr)); case (ExpressionType::COMPARE_LESSTHANOREQUALTO): return type::ValueFactory::GetBooleanValue(vl.CompareLessThanEquals(vr)); case (ExpressionType::COMPARE_GREATERTHANOREQUALTO): return type::ValueFactory::GetBooleanValue( vl.CompareGreaterThanEquals(vr)); case (ExpressionType::COMPARE_DISTINCT_FROM): { if (vl.IsNull() && vr.IsNull()) { return type::ValueFactory::GetBooleanValue(false); } else if (!vl.IsNull() && !vr.IsNull()) { return type::ValueFactory::GetBooleanValue(vl.CompareNotEquals(vr)); } return type::ValueFactory::GetBooleanValue(true); } default: throw Exception("Invalid comparison expression type."); } }
void CodeGenContext::GenerateDisassmTables() { std::map<std::string, std::map<llvm::APInt,std::string,myAPIntCompare> >::iterator tableIter; for (tableIter=disassemblyTable.begin();tableIter!=disassemblyTable.end();++tableIter) { llvm::APInt tableSize=tableIter->second.rbegin()->first; llvm::APInt tableSize32=tableSize.zextOrTrunc(32); // Create a global variable to indicate the max size of the table llvm::ConstantInt* const_int32_1 = getConstantInt(tableSize32+1); llvm::GlobalVariable* gvar_int32_DIS_max = makeGlobal(getIntType(32),true,llvm::GlobalValue::ExternalLinkage,const_int32_1,getSymbolPrefix()+"DIS_max_"+tableIter->first); // Create a global array to hold the table llvm::PointerType* PointerTy_5 = llvm::PointerType::get(getIntType(8), 0); llvm::ArrayType* ArrayTy_4 = llvm::ArrayType::get(PointerTy_5, tableSize.getLimitedValue()+1); llvm::ConstantPointerNull* const_ptr_13 = llvm::ConstantPointerNull::get(PointerTy_5); std::vector<llvm::Constant*> const_array_9_elems; std::map<llvm::APInt,std::string,myAPIntCompare>::iterator slot=tableIter->second.begin(); llvm::APInt trackingSlot(tableSize.getBitWidth(),"0",16); while (slot!=tableIter->second.end()) { if (CompareEquals(slot->first,trackingSlot)) { llvm::ArrayType* ArrayTy_0 = llvm::ArrayType::get(getIntType(8), slot->second.length()-1); llvm::Constant* const_array_9 = getString(slot->second); llvm::GlobalVariable* gvar_array__str = makeGlobal(ArrayTy_0,true,llvm::GlobalValue::PrivateLinkage,const_array_9,getSymbolPrefix()+".str"+trackingSlot.toString(16,false)); gvar_array__str->setAlignment(1); std::vector<llvm::Constant*> const_ptr_12_indices; llvm::ConstantInt* const_int64_13 = getConstantZero(64); const_ptr_12_indices.push_back(const_int64_13); const_ptr_12_indices.push_back(const_int64_13); llvm::Constant* const_ptr_12 = llvm::ConstantExpr::getGetElementPtr(nullptr,gvar_array__str, const_ptr_12_indices); const_array_9_elems.push_back(const_ptr_12); ++slot; } else { const_array_9_elems.push_back(const_ptr_13); } trackingSlot++; } llvm::Constant* const_array_9 = llvm::ConstantArray::get(ArrayTy_4, const_array_9_elems); llvm::GlobalVariable* gvar_array_table = makeGlobal(ArrayTy_4,true,llvm::GlobalValue::ExternalLinkage,const_array_9, getSymbolPrefix()+"DIS_"+tableIter->first); } }