MemcpyInstCreate (弃用,可作为了解最基础处理思路)

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)));
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值