Skip to content

Commit

Permalink
Allow multiple calls in same instrumentation point.
Browse files Browse the repository at this point in the history
Adds register SP to be recovered by BPatch_registerExpr.
  • Loading branch information
Sasha Nicolas (zeroah) committed Oct 17, 2019
1 parent b7c9eee commit 4f06480
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 18 deletions.
34 changes: 20 additions & 14 deletions dyninstAPI/src/BPatch_addressSpace.C
Original file line number Diff line number Diff line change
Expand Up @@ -1021,25 +1021,34 @@ void BPatch_addressSpace::init_registers()
{
if(registers_.size()) return;
std::vector<AddressSpace *> as;

getAS(as);
assert(as.size());

registerSpace *rs = registerSpace::getRegisterSpace(as[0]);

for (unsigned i = 0; i < rs->realRegs().size(); i++) {
// Let's do just GPRs for now
registerSlot *regslot = rs->realRegs()[i];
registers_.push_back(BPatch_register(regslot->name, regslot->number));
// Let's do just GPRs for now
registerSlot *regslot = rs->realRegs()[i];
registers_.push_back(BPatch_register(regslot->name, regslot->number));
}

// Temporary override: also return EFLAGS though it's certainly not a
#if defined(arch_x86) || defined(arch_x86_64)
for (unsigned i = 0; i < rs->SPRs().size(); ++i) {
if (rs->SPRs()[i]->name == "eflags") {
registers_.push_back(BPatch_register(rs->SPRs()[i]->name,
rs->SPRs()[i]->number));
}
if (rs->SPRs()[i]->name == "eflags") {
registers_.push_back(BPatch_register(rs->SPRs()[i]->name,
rs->SPRs()[i]->number));
}
}
#endif
// add sp to be available too
#if defined(arch_aarch64)
for (unsigned i = 0; i < rs->SPRs().size(); ++i) {
if (rs->SPRs()[i]->name == "sp") {
registers_.push_back(BPatch_register(rs->SPRs()[i]->name,
rs->SPRs()[i]->number));
}
}
#endif
}
Expand All @@ -1048,9 +1057,6 @@ bool BPatch_addressSpace::getRegisters(std::vector<BPatch_register> &regs) {
init_registers();
regs = registers_;
return true;

regs = registers_;
return true;
}
BPatch_addressSpace::register_iter BPatch_addressSpace::getRegisters_begin()
{
Expand Down
6 changes: 2 additions & 4 deletions dyninstAPI/src/inst-aarch64.C
Original file line number Diff line number Diff line change
Expand Up @@ -600,8 +600,6 @@ Register EmitterAARCH64::emitCall(opCode op,
bool noCost,
func_instance *callee)
{
//#sasha This function implementation is experimental.

if (op != callOp) {
cerr << "ERROR: emitCall with op == " << op << endl;
}
Expand All @@ -622,7 +620,6 @@ Register EmitterAARCH64::emitCall(opCode op,

vector<int> savedRegs;

// save r0-r7
for(size_t id = 0; id < gen.rs()->numGPRs(); id++)
{
registerSlot *reg = gen.rs()->GPRs()[id];
Expand All @@ -646,6 +643,8 @@ Register EmitterAARCH64::emitCall(opCode op,
Register reg = REG_NULL;
if (gen.rs()->allocateSpecificRegister(gen, registerSpace::r0 + id, true))
reg = registerSpace::r0 + id;
if(reg==REG_NULL)
reg = registerSpace::r0 + id;

Address unnecessary = ADDR_NULL;
if (!operands[id]->generateCode_phase2(gen, false, unnecessary, reg))
Expand Down Expand Up @@ -689,7 +688,6 @@ Register EmitterAARCH64::emitCall(opCode op,
* Restoring registers
*/

// r7-r0
for (signed int ui = savedRegs.size()-1; ui >= 0; ui--) {
insnCodeGen::restoreRegister(gen, registerSpace::r0 + savedRegs[ui],
2*GPRSIZE_64, insnCodeGen::Post);
Expand Down

0 comments on commit 4f06480

Please sign in to comment.