@@ -877,24 +877,83 @@ bool ARM_blx_to_arm_mode(cs_struct *h, unsigned int id) {
877
877
878
878
}
879
879
880
- #if 0
881
-
880
+ #ifndef CAPSTONE_DIET
882
881
// map instruction to its characteristics
883
882
typedef struct insn_op {
884
- unsigned int eflags_update ; // how this instruction update status flags
885
- cs_ac_type operands [4 ];
883
+ uint8_t access [7 ];
886
884
} insn_op ;
887
885
888
886
static insn_op insn_ops [] = {
889
887
{
890
888
// NULL item
891
- 0 ,
892
889
{ 0 }
893
890
},
894
891
895
892
#include "ARMMappingInsnOp.inc"
896
893
};
897
894
895
+ // given internal insn id, return operand access info
896
+ uint8_t * ARM_get_op_access (cs_struct * h , unsigned int id )
897
+ {
898
+ int i = insn_find (insns , ARR_SIZE (insns ), id , & h -> insn_cache );
899
+ if (i != 0 ) {
900
+ return insn_ops [i ].access ;
901
+ }
902
+
903
+ return NULL ;
904
+ }
905
+
906
+ void ARM_reg_access (const cs_insn * insn ,
907
+ cs_regs regs_read , uint8_t * regs_read_count ,
908
+ cs_regs regs_write , uint8_t * regs_write_count )
909
+ {
910
+ uint8_t i ;
911
+ uint8_t read_count , write_count ;
912
+ cs_arm * arm = & (insn -> detail -> arm );
913
+
914
+ read_count = insn -> detail -> regs_read_count ;
915
+ write_count = insn -> detail -> regs_write_count ;
916
+
917
+ // implicit registers
918
+ memcpy (regs_read , insn -> detail -> regs_read , read_count * sizeof (insn -> detail -> regs_read [0 ]));
919
+ memcpy (regs_write , insn -> detail -> regs_write , write_count * sizeof (insn -> detail -> regs_write [0 ]));
920
+
921
+ // explicit registers
922
+ for (i = 0 ; i < arm -> op_count ; i ++ ) {
923
+ cs_arm_op * op = & (arm -> operands [i ]);
924
+ switch ((int )op -> type ) {
925
+ case ARM_OP_REG :
926
+ if ((op -> access & CS_AC_READ ) && !arr_exist (regs_read , read_count , op -> reg )) {
927
+ regs_read [read_count ] = op -> reg ;
928
+ read_count ++ ;
929
+ }
930
+ if ((op -> access & CS_AC_WRITE ) && !arr_exist (regs_write , write_count , op -> reg )) {
931
+ regs_write [write_count ] = op -> reg ;
932
+ write_count ++ ;
933
+ }
934
+ break ;
935
+ case ARM_OP_MEM :
936
+ // registers appeared in memory references always being read
937
+ if ((op -> mem .base != ARM_REG_INVALID ) && !arr_exist (regs_read , read_count , op -> mem .base )) {
938
+ regs_read [read_count ] = op -> mem .base ;
939
+ read_count ++ ;
940
+ }
941
+ if ((op -> mem .index != ARM_REG_INVALID ) && !arr_exist (regs_read , read_count , op -> mem .index )) {
942
+ regs_read [read_count ] = op -> mem .index ;
943
+ read_count ++ ;
944
+ }
945
+ if ((arm -> writeback ) && (op -> mem .base != ARM_REG_INVALID ) && !arr_exist (regs_write , write_count , op -> mem .base )) {
946
+ regs_write [write_count ] = op -> mem .base ;
947
+ write_count ++ ;
948
+ }
949
+ default :
950
+ break ;
951
+ }
952
+ }
953
+
954
+ * regs_read_count = read_count ;
955
+ * regs_write_count = write_count ;
956
+ }
898
957
#endif
899
958
900
959
#endif
0 commit comments