MemcpyInstCreate code illustration
MemcpyInstCreate
(通过传递过来的src_value、dest_value和需替换的instr生成它的sub value的memcpyInst语句)
void RemoveStruct::MemcpyInstCreate(Value *dest_val,Value *src_val, IntrinsicInst *instr) {
//确定dest_val和src_val存在global_value树中
if (struct_tree_manager_->FindValue(dest_val) && struct_tree_manager_->FindValue(src_val) ) {
// 找到value在树对应的tree node,通过tree node继续找到其children node
StructTreeManager::TreeNode* dest_node = struct_tree_manager_->FindTreeNode(dest_val);
StructTreeManager::TreeNode* src_node = struct_tree_manager_->FindTreeNode(src_val);
vector<Value*> dest_children = struct_tree_manager_->getValueChildren(dest_node);
vector<Value*> src_children = struct_tree_manager_->getValueChildren(src_node);
// 由于memcpyInst中的前两个变量必为i8*
Type *eight = Type::getInt8PtrTy(module_->getContext());
assert (dest_children.size() == src_children.size());
Function *call = instr->getCalledFunction();
// instr_len为了确保global分解sub value的len总和等于global的len
int instr_len = 0;
for (int i = 0; i < dest_children.size(); i++) {
BitCastInst *dest = new BitCastInst(dest_children.at(i), eight, "", instr);
BitCastInst *src = new BitCastInst(src_children.at(i), eight, "", instr);
vector<Value *> IdxList;
IdxList.push_back(dest);
IdxList.push_back(src);
int val_len = 0;
ValueArrangeWidth(src->getOperand(0)->getType()->getPointerElementType(), val_len);
assert(val_len % 8 == 0);
// 通过ValueArrangeWidth得到value的len,并须将其转为字节
IdxList.push_back(ConstantInt::get(Type::getInt64Ty(module_->getContext()), val_len / 8));
instr_len += val_len / 8;
IdxList.push_back(instr->getOperand(3));
IdxList.push_back(instr->getOperand(4));
ArrayRef<Value*> list(IdxList);
llvm::CallInst *callI = CallInst::Create(call, list, "",instr);
}
assert(instr_len == getValueLength(instr->getOperand(2)));
}
}