First draft for exposing RegistersTracker to python

This commit is contained in:
angie 2022-06-11 19:43:05 -04:00
parent 37312b12ac
commit 739ba4cb63
7 changed files with 138 additions and 9 deletions

View File

@ -14,4 +14,21 @@ typedef struct RabbitizerRegistersTracker {
} RabbitizerRegistersTracker;
void RabbitizerRegistersTracker_init(RabbitizerRegistersTracker *self, const RabbitizerRegistersTracker *other);
void RabbitizerRegistersTracker_destroy(RabbitizerRegistersTracker *self);
bool RabbitizerRegistersTracker_moveRegisters(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr);
void RabbitizerRegistersTracker_overwriteRegisters(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset);
void RabbitizerRegistersTracker_unsetRegistersAfterFuncCall(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, const RabbitizerInstruction *prevInstr);
bool RabbitizerRegistersTracker_getAddressIfCanSetType(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset, int *dstAddress);
bool RabbitizerRegistersTracker_getJrInfo(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int *dstOffset, int *dstAddress);
// prevInstr can be NULL
void RabbitizerRegistersTracker_processLui(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, const RabbitizerInstruction *prevInstr, int instrOffset);
bool RabbitizerRegistersTracker_getLuiOffsetForConstant(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int *dstOffset);
void RabbitizerRegistersTracker_processConstant(RabbitizerRegistersTracker *self, int value, const RabbitizerInstruction *instr, int offset);
bool RabbitizerRegistersTracker_getLuiOffsetForLo(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset, int *dstOffset, bool *dstIsGp);
void RabbitizerRegistersTracker_processLo(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int value, int offset);
#endif

View File

@ -40,6 +40,7 @@ static ModuleAttributes rabbitizer_module_attributes[] = {
MODULE_ATTRIBUTE_ENUM(InstrCategory),
MODULE_ATTRIBUTE_ENUM(InstrId),
MODULE_ATTRIBUTE_TYPE(Instruction),
MODULE_ATTRIBUTE_TYPE(RegistersTracker),
};
static int rabbitizer_module_attributes_Ready(void) {

View File

@ -11,8 +11,17 @@
#include "enums/enums_utils.h"
#include "instructions/RabbitizerInstruction.h"
// TODO: clean up this...
typedef struct PyRabbitizerInstruction {
PyObject_HEAD
RabbitizerInstruction instr;
} PyRabbitizerInstruction;
extern RabbitizerEnumMetadata rabbitizer_enum_Abi_enumvalues[];
extern RabbitizerEnumMetadata rabbitizer_enum_InstrId_enumvalues[];
@ -25,6 +34,7 @@ extern PyTypeObject rabbitizer_global_config_TypeObject;
extern PyTypeObject rabbitizer_type_Enum_TypeObject;
extern PyTypeObject rabbitizer_type_Instruction_TypeObject;
extern PyTypeObject rabbitizer_type_RegistersTracker_TypeObject;
PyObject *rabbitizer_enum_Abi_Init(void);
PyObject *rabbitizer_enum_InstrCategory_Init(void);

View File

@ -3,13 +3,6 @@
#include "rabbitizer_module.h"
#include "instructions/RabbitizerInstruction.h"
typedef struct PyRabbitizerInstruction {
PyObject_HEAD
RabbitizerInstruction instr;
} PyRabbitizerInstruction;
extern PyTypeObject rabbitizer_type_Instruction_TypeObject;

View File

@ -0,0 +1,108 @@
/* SPDX-FileCopyrightText: © 2022 Decompollaborate */
/* SPDX-License-Identifier: MIT */
#include "rabbitizer_module.h"
#include "analysis/RabbitizerRegistersTracker.h"
typedef struct PyRabbitizerRegistersTracker {
PyObject_HEAD
RabbitizerRegistersTracker tracker;
} PyRabbitizerRegistersTracker;
static void rabbitizer_type_RegistersTracker_dealloc(PyRabbitizerRegistersTracker *self) {
RabbitizerRegistersTracker_destroy(&self->tracker);
Py_TYPE(self)->tp_free((PyObject *) self);
}
static int rabbitizer_type_RegistersTracker_init(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) {
static char *kwlist[] = { "other", NULL };
PyRabbitizerRegistersTracker *pyOther = NULL;
RabbitizerRegistersTracker *other = NULL;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O!", kwlist, &rabbitizer_type_RegistersTracker_TypeObject, &pyOther)) {
return -1;
}
if (pyOther != NULL) {
other = &pyOther->tracker;
}
RabbitizerRegistersTracker_init(&self->tracker, other);
return 0;
}
static PyObject *rabbitizer_type_RegistersTracker_moveRegisters(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) {
static char *kwlist[] = { "instr", NULL };
PyRabbitizerInstruction *instr;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr)) {
return NULL;
}
if (RabbitizerRegistersTracker_moveRegisters(&self->tracker, &instr->instr)) {
Py_RETURN_TRUE;
}
Py_RETURN_FALSE;
}
static PyObject *rabbitizer_type_RegistersTracker_overwriteRegisters(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) {
static char *kwlist[] = { "instr", "instrOffset", NULL };
PyRabbitizerInstruction *instr;
int instrOffset;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!i", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr, &instrOffset)) {
return NULL;
}
RabbitizerRegistersTracker_overwriteRegisters(&self->tracker, &instr->instr, instrOffset);
Py_RETURN_NONE;
}
static PyObject *rabbitizer_type_RegistersTracker_unsetRegistersAfterFuncCall(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) {
static char *kwlist[] = { "instr", "prevInstr", NULL };
PyRabbitizerInstruction *instr;
PyRabbitizerInstruction *prevInstr;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!O!", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr, &rabbitizer_type_Instruction_TypeObject, &prevInstr)) {
return NULL;
}
RabbitizerRegistersTracker_unsetRegistersAfterFuncCall(&self->tracker, &instr->instr, &prevInstr->instr);
Py_RETURN_NONE;
}
#define METHOD_NO_ARGS(name, docs) { #name, (PyCFunction)rabbitizer_type_RegistersTracker_##name, METH_NOARGS, PyDoc_STR(docs) }
#define METHOD_ARGS(name, docs) { #name, (PyCFunction)rabbitizer_type_RegistersTracker_##name, METH_VARARGS | METH_KEYWORDS, PyDoc_STR(docs) }
static PyMethodDef rabbitizer_type_RegistersTracker_methods[] = {
METHOD_ARGS(moveRegisters, ""),
METHOD_ARGS(overwriteRegisters, ""),
METHOD_ARGS(unsetRegistersAfterFuncCall, ""),
{ 0 },
};
PyTypeObject rabbitizer_type_RegistersTracker_TypeObject = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "rabbitizer.RegistersTracker",
.tp_doc = PyDoc_STR("RegistersTracker"),
.tp_basicsize = sizeof(PyRabbitizerRegistersTracker),
.tp_itemsize = 0,
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
.tp_new = PyType_GenericNew,
.tp_init = (initproc) rabbitizer_type_RegistersTracker_init,
.tp_dealloc = (destructor) rabbitizer_type_RegistersTracker_dealloc,
// .tp_repr = (reprfunc) rabbitizer_type_RegistersTracker_repr,
// .tp_str = (reprfunc) rabbitizer_type_RegistersTracker_str,
.tp_methods = rabbitizer_type_RegistersTracker_methods,
// .tp_getset = rabbitizer_type_RegistersTracker_getsetters,
};

View File

@ -8,7 +8,7 @@ setup(
ext_modules=[
Extension(
name="rabbitizer",
sources=["rabbitizer/rabbitizer_module.c", "rabbitizer/rabbitizer_submodule_Utils.c", "rabbitizer/rabbitizer_type_Instruction.c", "rabbitizer/rabbitizer_global_config.c",
sources=["rabbitizer/rabbitizer_module.c", "rabbitizer/rabbitizer_submodule_Utils.c", "rabbitizer/rabbitizer_type_Instruction.c", "rabbitizer/rabbitizer_global_config.c", "rabbitizer/rabbitizer_type_RegistersTracker.c",
"rabbitizer/enums/rabbitizer_type_Enum.c", "rabbitizer/enums/enums_utils.c", "rabbitizer/enums/rabbitizer_enum_InstrCategory.c", "rabbitizer/enums/rabbitizer_enum_InstrId.c", "rabbitizer/enums/rabbitizer_enum_Abi.c",
"src/instructions/RabbitizerInstruction/RabbitizerInstruction_Disassemble.c", "src/instructions/RabbitizerInstruction/RabbitizerInstruction_ProcessUniqueId.c", "src/instructions/RabbitizerInstruction/RabbitizerInstruction.c", "src/instructions/RabbitizerInstruction/RabbitizerInstruction_Examination.c",
"src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp.c", "src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp_ProcessUniqueId.c",

View File

@ -319,7 +319,7 @@ bool RabbitizerRegistersTracker_getLuiOffsetForLo(RabbitizerRegistersTracker *se
void RabbitizerRegistersTracker_processLo(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int value, int offset) {
RabbitizerTrackedRegisterState *stateDst;
if (!RabbitizerInstrDescriptor_modifiesRt(instr)) {
if (!RabbitizerInstrDescriptor_modifiesRt(instr->descriptor)) {
return;
}