From 6fad5e740a5a6ae59efe1ceed8b05d0c9a7cda0e Mon Sep 17 00:00:00 2001 From: Angie Date: Fri, 14 Oct 2022 18:49:59 -0300 Subject: [PATCH] InstrCategory.fromStr --- .../instructions/RabbitizerInstrCategory.h | 32 +++++++++++++++++++ include/instructions/RabbitizerInstruction.h | 12 +------ rabbitizer/InstrCategory.pyi | 3 ++ .../enums/rabbitizer_enum_InstrCategory.c | 27 ++++++++++++++++ setup.py | 2 +- src/instructions/RabbitizerInstrCategory.c | 31 ++++++++++++++++++ 6 files changed, 95 insertions(+), 12 deletions(-) create mode 100644 include/instructions/RabbitizerInstrCategory.h create mode 100644 src/instructions/RabbitizerInstrCategory.c diff --git a/include/instructions/RabbitizerInstrCategory.h b/include/instructions/RabbitizerInstrCategory.h new file mode 100644 index 0000000..0fe8c33 --- /dev/null +++ b/include/instructions/RabbitizerInstrCategory.h @@ -0,0 +1,32 @@ +/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ +/* SPDX-License-Identifier: MIT */ + +#ifndef RABBITIZER_INSTRCATEGORY_H +#define RABBITIZER_INSTRCATEGORY_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + + +#define RABBITIZER_DEF_INSTR_CATEGORY(name) RABBITIZER_INSTRCAT_##name + +typedef enum RabbitizerInstrCategory { + #include "instructions/InstrCategory.inc" + + RABBITIZER_DEF_INSTR_CATEGORY(MAX), +} RabbitizerInstrCategory; + +#undef RABBITIZER_DEF_INSTR_CATEGORY + +extern const char *const RabbitizerInstrCategory_Names[]; + +RabbitizerInstrCategory RabbitizerInstrCategory_fromStr(const char *name); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/instructions/RabbitizerInstruction.h b/include/instructions/RabbitizerInstruction.h index d0c78b6..ba2f0eb 100644 --- a/include/instructions/RabbitizerInstruction.h +++ b/include/instructions/RabbitizerInstruction.h @@ -13,23 +13,13 @@ #include "RabbitizerInstrId.h" #include "RabbitizerInstrDescriptor.h" +#include "RabbitizerInstrCategory.h" #ifdef __cplusplus extern "C" { #endif -#define RABBITIZER_DEF_INSTR_CATEGORY(name) RABBITIZER_INSTRCAT_##name - -typedef enum RabbitizerInstrCategory { - #include "instructions/InstrCategory.inc" - - RABBITIZER_DEF_INSTR_CATEGORY(MAX), -} RabbitizerInstrCategory; - -#undef RABBITIZER_DEF_INSTR_CATEGORY - - typedef struct RabbitizerInstruction { uint32_t word; uint32_t _mandatorybits; diff --git a/rabbitizer/InstrCategory.pyi b/rabbitizer/InstrCategory.pyi index 7d4b7e5..366af3f 100644 --- a/rabbitizer/InstrCategory.pyi +++ b/rabbitizer/InstrCategory.pyi @@ -13,3 +13,6 @@ class InstrCategory: RSP: Enum R5900: Enum MAX: Enum + + @staticmethod + def fromStr(name: str | None) -> Enum|None: ... diff --git a/rabbitizer/enums/rabbitizer_enum_InstrCategory.c b/rabbitizer/enums/rabbitizer_enum_InstrCategory.c index fbc94dd..4c533b0 100644 --- a/rabbitizer/enums/rabbitizer_enum_InstrCategory.c +++ b/rabbitizer/enums/rabbitizer_enum_InstrCategory.c @@ -16,7 +16,34 @@ RabbitizerEnumMetadata rabbitizer_enum_InstrCategory_enumvalues[] = { #undef RABBITIZER_DEF_INSTR_CATEGORY + +static PyObject *rabbitizer_enum_InstrCategory_fromStr(UNUSED PyObject *self, PyObject *args, PyObject *kwds) { + static char *kwlist[] = { "name", NULL }; + const char *name = NULL; + RabbitizerInstrCategory instrCategory; + PyObject *ret; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "z", kwlist, &name)) { + return NULL; + } + + instrCategory = RabbitizerInstrCategory_fromStr(name); + if ((int)instrCategory < 0) { + Py_RETURN_NONE; + } + + ret = rabbitizer_enum_InstrCategory_enumvalues[instrCategory].instance; + Py_INCREF(ret); + return ret; +} + + +#define METHOD_NO_ARGS(name, docs) { #name, (PyCFunction) rabbitizer_enum_InstrCategory_##name, METH_NOARGS, PyDoc_STR(docs) } +#define METHOD_ARGS(name, docs) { #name, (PyCFunction) rabbitizer_enum_InstrCategory_##name, METH_VARARGS | METH_KEYWORDS, PyDoc_STR(docs) } + static PyMethodDef rabbitizer_enum_InstrCategory_methods[] = { + METHOD_ARGS(fromStr, ""), + { 0 }, }; diff --git a/setup.py b/setup.py index 207f26b..51554e0 100644 --- a/setup.py +++ b/setup.py @@ -15,7 +15,7 @@ setup( "src/instructions/RabbitizerInstructionCpu/RabbitizerInstructionCpu_OperandType.c", "src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp.c", "src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp_ProcessUniqueId.c", "src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp_OperandType.c", "src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900.c", "src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900_ProcessUniqueId.c", "src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900_OperandType.c", - "src/instructions/RabbitizerInstrDescriptor.c", "src/instructions/RabbitizerInstrId.c", "src/instructions/RabbitizerRegister.c", "src/instructions/RabbitizerInstrSuffix.c", + "src/instructions/RabbitizerInstrDescriptor.c", "src/instructions/RabbitizerInstrId.c", "src/instructions/RabbitizerRegister.c", "src/instructions/RabbitizerInstrSuffix.c", "src/instructions/RabbitizerInstrCategory.c", "src/analysis/RabbitizerTrackedRegisterState.c", "src/analysis/RabbitizerRegistersTracker.c", "src/analysis/RabbitizerLoPairingInfo.c", "src/common/Utils.c", "src/common/RabbitizerVersion.c", "src/common/RabbitizerConfig.c"], include_dirs=["include", "rabbitizer"], diff --git a/src/instructions/RabbitizerInstrCategory.c b/src/instructions/RabbitizerInstrCategory.c new file mode 100644 index 0000000..f14899b --- /dev/null +++ b/src/instructions/RabbitizerInstrCategory.c @@ -0,0 +1,31 @@ +/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ +/* SPDX-License-Identifier: MIT */ + +#include "instructions/RabbitizerInstrCategory.h" + +//#include +#include + + +#define RABBITIZER_DEF_INSTR_CATEGORY(name) [RABBITIZER_INSTRCAT_##name] = #name + +const char *const RabbitizerInstrCategory_Names[] = { +#include "instructions/InstrCategory.inc" +}; + +#undef RABBITIZER_DEF_INSTR_CATEGORY + + +RabbitizerInstrCategory RabbitizerInstrCategory_fromStr(const char *name) { + if (name == NULL) { + return -2; + } + + for (size_t i = 0; i < RABBITIZER_INSTRCAT_MAX; i++) { + if (strcmp(RabbitizerInstrCategory_Names[i], name) == 0) { + return i; + } + } + + return -1; +}