Skip to content

Commit

Permalink
Update implemenation to use MultiRegisterAST
Browse files Browse the repository at this point in the history
Update existing implementation to use MultiRegisterAST.
Fix assumptions about number of operands when creating assignment
in AbslocInterface and split them into individual registers in
RoseInsnFactory for symbolic execution.
  • Loading branch information
bbiiggppiigg committed Apr 30, 2024
1 parent f589bae commit dcba26b
Show file tree
Hide file tree
Showing 5 changed files with 604 additions and 497 deletions.
67 changes: 35 additions & 32 deletions dataflowAPI/src/AbslocInterface.C
Original file line number Diff line number Diff line change
Expand Up @@ -526,11 +526,12 @@ void AssignmentConverter::convert(const Instruction &I,
//
std::vector<Operand> operands;
I.getOperands(operands);
assert(operands.size() == 3);
RegisterAST::Ptr lowpc_reg = boost::dynamic_pointer_cast<RegisterAST>(operands[0].getValue());
RegisterAST::Ptr highpc_reg = boost::dynamic_pointer_cast<RegisterAST>(operands[1].getValue());
AbsRegion lowpc_dst = AbsRegion(lowpc_reg->getID()) ;
AbsRegion highpc_dst = AbsRegion(highpc_reg->getID()) ;
assert(operands.size() == 2);
MultiRegisterAST::Ptr pc_reg = boost::dynamic_pointer_cast<MultiRegisterAST>(operands[0].getValue());
const std::vector<RegisterAST::Ptr> & pc_regasts = pc_reg->getRegs();
AbsRegion lowpc_dst = AbsRegion(pc_regasts[0]->getID()) ;
AbsRegion highpc_dst = AbsRegion(pc_regasts[1]->getID()) ;


//AbsRegion pc = AbsRegion(Absloc::makePC(func->isrc()->getArch()));
AbsRegion pc = AbsRegion(Absloc(addr));
Expand Down Expand Up @@ -565,11 +566,11 @@ void AssignmentConverter::convert(const Instruction &I,

std::vector<Operand> operands;
I.getOperands(operands);
assert(operands.size() == 3);
RegisterAST::Ptr lowpc_reg = boost::dynamic_pointer_cast<RegisterAST>(operands[0].getValue());
RegisterAST::Ptr highpc_reg = boost::dynamic_pointer_cast<RegisterAST>(operands[1].getValue());
AbsRegion lowpc_src = AbsRegion(lowpc_reg->getID()) ;
AbsRegion highpc_src = AbsRegion(highpc_reg->getID()) ;
assert(operands.size() == 2);
MultiRegisterAST::Ptr pc_reg = boost::dynamic_pointer_cast<MultiRegisterAST>(operands[0].getValue());
const std::vector<RegisterAST::Ptr> & pc_regasts = pc_reg->getRegs();
AbsRegion lowpc_src = AbsRegion(pc_regasts[0]->getID()) ;
AbsRegion highpc_src = AbsRegion(pc_regasts[1]->getID()) ;

pcA->addInput(lowpc_src);
pcA->addInput(highpc_src);
Expand All @@ -581,12 +582,15 @@ void AssignmentConverter::convert(const Instruction &I,
case amdgpu_gfx940_op_S_SWAPPC_B64: {
std::vector<Operand> operands;
I.getOperands(operands);
assert(operands.size() == 6);
assert(operands.size() == 4);

MultiRegisterAST::Ptr pc_src_regs = boost::dynamic_pointer_cast<MultiRegisterAST>(operands[1].getValue());
const std::vector<RegisterAST::Ptr> & pc_src_regasts = pc_src_regs->getRegs();
AbsRegion pc_src_low = AbsRegion(pc_src_regasts[0]->getID()) ;
AbsRegion pc_src_hi = AbsRegion(pc_src_regasts[1]->getID()) ;

RegisterAST::Ptr new_pc_value_low = boost::dynamic_pointer_cast<RegisterAST>(operands[2].getValue());
RegisterAST::Ptr new_pc_value_high = boost::dynamic_pointer_cast<RegisterAST>(operands[3].getValue());
AbsRegion new_pc_reg_low = AbsRegion(new_pc_value_low->getID()) ;
AbsRegion new_pc_reg_high = AbsRegion(new_pc_value_high->getID()) ;


AbsRegion pc = AbsRegion(Absloc::makePC(func->isrc()->getArch()));

Assignment::Ptr pcA = Assignment::makeAssignment(I,
Expand All @@ -595,34 +599,33 @@ void AssignmentConverter::convert(const Instruction &I,
block,
pc);

pcA->addInput(new_pc_reg_low);
pcA->addInput(new_pc_reg_high);
pcA->addInput(pc_src_low);
pcA->addInput(pc_src_hi);
assignments.push_back(pcA);

/*
RegisterAST::Ptr backup_pc_low = boost::dynamic_pointer_cast<RegisterAST>(operands[0].getValue());
RegisterAST::Ptr backup_pc_high = boost::dynamic_pointer_cast<RegisterAST>(operands[1].getValue());
AbsRegion backup_pc_low_reg = AbsRegion(backup_pc_low->getID()) ;
AbsRegion backup_pc_high_reg = AbsRegion(backup_pc_high->getID()) ;
MultiRegisterAST::Ptr pc_dst_regs = boost::dynamic_pointer_cast<MultiRegisterAST>(operands[0].getValue());
const std::vector<RegisterAST::Ptr> & pc_dst_regasts = pc_dst_regs->getRegs();
AbsRegion pc_dst_low = AbsRegion(pc_dst_regasts[0]->getID()) ;
AbsRegion pc_dst_hi = AbsRegion(pc_dst_regasts[1]->getID()) ;

Assignment::Ptr backup_pc_lowA = Assignment::makeAssignment(I,

Assignment::Ptr pcA_lo = Assignment::makeAssignment(I,
addr,
func,
block,
backup_pc_low_reg);
backup_pc_lowA->addInput(pc);
pc_dst_low);

Assignment::Ptr backup_pc_highA = Assignment::makeAssignment(I,
Assignment::Ptr pcA_hi = Assignment::makeAssignment(I,
addr,
func,
block,
backup_pc_high_reg);
backup_pc_highA->addInput(pc);
*/
pc_dst_hi);

assignments.push_back(pcA);
//assignments.push_back(backup_pc_lowA);
//assignments.push_back(backup_pc_highA);

pcA_lo->addInput(pc);
pcA_hi->addInput(pc);
assignments.push_back(pcA_lo);
assignments.push_back(pcA_hi);

break;
}
Expand Down
33 changes: 30 additions & 3 deletions dataflowAPI/src/RoseInsnFactory.C
Original file line number Diff line number Diff line change
Expand Up @@ -437,21 +437,48 @@ void RoseInsnAMDGPUFactory::massageOperands(const Instruction &insn,
case amdgpu_gfx908_op_S_SWAPPC_B64:
case amdgpu_gfx90a_op_S_SWAPPC_B64:
case amdgpu_gfx940_op_S_SWAPPC_B64: {
assert(operands.size() == 6);
assert(operands.size() == 4);
operands.resize(6);
operands[5] = operands[3];
operands[4] = operands[2];
MultiRegisterAST::Ptr src_regs = boost::dynamic_pointer_cast<MultiRegisterAST>(operands[1].getValue());
const std::vector<RegisterAST::Ptr> & src_reg_asts = src_regs->getRegs();
operands[3] = Operand(src_reg_asts[1]);
operands[2] = Operand(src_reg_asts[0]);
MultiRegisterAST::Ptr dst_regs = boost::dynamic_pointer_cast<MultiRegisterAST>(operands[0].getValue());
const std::vector<RegisterAST::Ptr> & dst_reg_asts = dst_regs->getRegs();
operands[1] = Operand(dst_reg_asts[1]);
operands[0] = Operand(dst_reg_asts[0]);


break;
}
case amdgpu_gfx908_op_S_SETPC_B64:
case amdgpu_gfx90a_op_S_SETPC_B64:
case amdgpu_gfx940_op_S_SETPC_B64: {
assert(operands.size() == 3);
assert(operands.size() == 2);
operands.resize(3);
operands[2] = operands[1];
MultiRegisterAST::Ptr src_regs = boost::dynamic_pointer_cast<MultiRegisterAST>(operands[0].getValue());
const std::vector<RegisterAST::Ptr> & src_reg_asts = src_regs->getRegs();
operands[1] = Operand(src_reg_asts[1]);
operands[0] = Operand(src_reg_asts[0]);

break;

}
case amdgpu_gfx908_op_S_GETPC_B64:
case amdgpu_gfx90a_op_S_GETPC_B64:
case amdgpu_gfx940_op_S_GETPC_B64: {
assert(operands.size() == 3);
assert(operands.size() == 2);
operands.resize(3);

operands[2] = Operand(InstructionAPI::Immediate::makeImmediate(Result(u64,_addr+4)),false,false);
MultiRegisterAST::Ptr dst_regs = boost::dynamic_pointer_cast<MultiRegisterAST>(operands[0].getValue());
const std::vector<RegisterAST::Ptr> & dst_reg_asts = dst_regs->getRegs();
operands[1] = Operand(dst_reg_asts[1]);
operands[0] = Operand(dst_reg_asts[0]);

break;
}
default:
Expand Down

0 comments on commit dcba26b

Please sign in to comment.