DynamoRIO / DynamoRIO/dynamorio

Add new whole-instr register iterator

Open
#6,717 0 comments 0 reactions 1 assignee Claimed by @edeiana View on GitHub
Component-IR Type-Feature
Dominant language
C
Stars
3.2k
Forks
629
Avg merge
2d 15h
Merged PRs (30d)
31

Description

Currently we don't have a way to iterate over the register operands of an instr_t directly.
To do so, we have to:
1) obtain the number of src (`instr_num_srcs()`) and dst (`instr_num_dsts()`) operands;
2) iterate over and obtain the operand (with `instr_get_src()` and `instr_get_dst()`);
3) obtain the number of registers of every operand with `opnd_num_regs_used()`;
4) iterate over and obtain the `reg_id_t` register with `opnd_get_reg_used()`.

We find this operation common enough to warrant its own APIs in core/ir/instr_shared.c to avoid code duplication.

Since we still want to distinguish between source register operands and destination register operands of an instr_t, we'd want the following 4 APIs:
```
uint instr_num_src_reg(instr_t *instr);
uint instr_num_dst_reg(instr_t *instr);
reg_id_t instr_get_src_reg(instr_t *instr, uint index);
reg_id_t instr_get_dst_reg(instr_t *instr, uint index);
```

Note that registers in destination operands that are memory references are still being read, hence they should be counted among the source register operands of an instruction.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.