@@ -61,23 +61,24 @@ pub trait CallingConvention: Sync {
61
61
fn implicitly_defined_registers ( & self ) -> Vec < RegisterId > ;
62
62
fn are_argument_registers_used_for_var_args ( & self ) -> bool ;
63
63
64
+ // Register-list/class based API with default implementations
64
65
// Register-list/class based API with default implementations
65
66
fn register_argument_classes ( & self ) -> Vec < u32 > {
66
- Vec :: new ( )
67
+ vec ! [ ]
67
68
}
68
-
69
+
69
70
fn register_argument_class_lists ( & self , _class_id : u32 ) -> Vec < u32 > {
70
- Vec :: new ( )
71
+ vec ! [ ]
71
72
}
72
-
73
+
73
74
fn register_argument_lists ( & self ) -> Vec < u32 > {
74
- Vec :: new ( )
75
+ vec ! [ ]
75
76
}
76
-
77
+
77
78
fn register_argument_list_regs ( & self , _reg_list_id : u32 ) -> Vec < RegisterId > {
78
- Vec :: new ( )
79
+ vec ! [ ]
79
80
}
80
-
81
+
81
82
fn register_argument_list_kind ( & self , _reg_list_id : u32 ) -> RegisterListKind {
82
83
RegisterListKind :: IntegerSemantics
83
84
}
@@ -354,10 +355,7 @@ where
354
355
} )
355
356
}
356
357
357
- extern "C" fn cb_register_argument_lists < C > (
358
- ctxt : * mut c_void ,
359
- count : * mut usize ,
360
- ) -> * mut u32
358
+ extern "C" fn cb_register_argument_lists < C > ( ctxt : * mut c_void , count : * mut usize ) -> * mut u32
361
359
where
362
360
C : CallingConvention ,
363
361
{
@@ -408,8 +406,12 @@ where
408
406
ffi_wrap ! ( "CallingConvention::register_argument_list_kind" , unsafe {
409
407
let ctxt = & * ( ctxt as * mut CustomCallingConventionContext <C >) ;
410
408
match ctxt. cc. register_argument_list_kind( reg_list_id) {
411
- RegisterListKind :: IntegerSemantics => BNRegisterListKind :: REGISTER_LIST_KIND_INTEGER_SEMANTICS ,
412
- RegisterListKind :: FloatSemantics => BNRegisterListKind :: REGISTER_LIST_KIND_FLOAT_SEMANTICS ,
409
+ RegisterListKind :: IntegerSemantics => {
410
+ BNRegisterListKind :: REGISTER_LIST_KIND_INTEGER_SEMANTICS
411
+ }
412
+ RegisterListKind :: FloatSemantics => {
413
+ BNRegisterListKind :: REGISTER_LIST_KIND_FLOAT_SEMANTICS
414
+ }
413
415
}
414
416
} )
415
417
}
@@ -789,8 +791,12 @@ impl CallingConvention for CoreCallingConvention {
789
791
unsafe {
790
792
let kind = BNGetRegisterArgumentListKind ( self . handle , reg_list_id) ;
791
793
match kind {
792
- BNRegisterListKind :: REGISTER_LIST_KIND_INTEGER_SEMANTICS => RegisterListKind :: IntegerSemantics ,
793
- BNRegisterListKind :: REGISTER_LIST_KIND_FLOAT_SEMANTICS => RegisterListKind :: FloatSemantics ,
794
+ BNRegisterListKind :: REGISTER_LIST_KIND_INTEGER_SEMANTICS => {
795
+ RegisterListKind :: IntegerSemantics
796
+ }
797
+ BNRegisterListKind :: REGISTER_LIST_KIND_FLOAT_SEMANTICS => {
798
+ RegisterListKind :: FloatSemantics
799
+ }
794
800
}
795
801
}
796
802
}
@@ -940,6 +946,12 @@ pub struct ConventionBuilder<A: Architecture> {
940
946
941
947
arch_handle : A :: Handle ,
942
948
_arch : PhantomData < * const A > ,
949
+
950
+ register_argument_classes : Vec < u32 > ,
951
+ register_argument_class_lists : Vec < u32 > ,
952
+ register_argument_lists : Vec < u32 > ,
953
+ register_argument_list_regs : Vec < RegisterId > ,
954
+ register_argument_list_kind : RegisterListKind ,
943
955
}
944
956
945
957
macro_rules! bool_arg {
@@ -984,6 +996,44 @@ macro_rules! reg {
984
996
} ;
985
997
}
986
998
999
+ macro_rules! u32_list {
1000
+ ( $name: ident) => {
1001
+ pub fn $name( mut self , ids: & [ u32 ] ) -> Self {
1002
+ self . $name = ids. to_vec( ) ;
1003
+ self
1004
+ }
1005
+ } ;
1006
+ }
1007
+
1008
+ macro_rules! reg_list_simple {
1009
+ ( $name: ident) => {
1010
+ pub fn $name( mut self , regs: & [ & str ] ) -> Self {
1011
+ {
1012
+ // FIXME NLL
1013
+ let arch = self . arch_handle. borrow( ) ;
1014
+ let arch_regs: Vec <RegisterId > = regs
1015
+ . iter( )
1016
+ . filter_map( |& r| arch. register_by_name( r) )
1017
+ . map( |r| r. id( ) )
1018
+ . collect( ) ;
1019
+
1020
+ self . $name = arch_regs;
1021
+ }
1022
+
1023
+ self
1024
+ }
1025
+ } ;
1026
+ }
1027
+
1028
+ macro_rules! list_kind {
1029
+ ( $name: ident) => {
1030
+ pub fn $name( mut self , kind: RegisterListKind ) -> Self {
1031
+ self . $name = kind;
1032
+ self
1033
+ }
1034
+ } ;
1035
+ }
1036
+
987
1037
impl < A : Architecture > ConventionBuilder < A > {
988
1038
pub fn new ( arch : & A ) -> Self {
989
1039
Self {
@@ -1009,6 +1059,12 @@ impl<A: Architecture> ConventionBuilder<A> {
1009
1059
1010
1060
arch_handle : arch. handle ( ) ,
1011
1061
_arch : PhantomData ,
1062
+
1063
+ register_argument_classes : Vec :: new ( ) ,
1064
+ register_argument_class_lists : Vec :: new ( ) ,
1065
+ register_argument_lists : Vec :: new ( ) ,
1066
+ register_argument_list_regs : Vec :: new ( ) ,
1067
+ register_argument_list_kind : RegisterListKind :: IntegerSemantics ,
1012
1068
}
1013
1069
}
1014
1070
@@ -1032,6 +1088,12 @@ impl<A: Architecture> ConventionBuilder<A> {
1032
1088
1033
1089
bool_arg ! ( are_argument_registers_used_for_var_args) ;
1034
1090
1091
+ u32_list ! ( register_argument_classes) ;
1092
+ u32_list ! ( register_argument_class_lists) ;
1093
+ u32_list ! ( register_argument_lists) ;
1094
+ reg_list_simple ! ( register_argument_list_regs) ;
1095
+ list_kind ! ( register_argument_list_kind) ;
1096
+
1035
1097
pub fn register ( self , name : & str ) -> Ref < CoreCallingConvention > {
1036
1098
let arch = self . arch_handle . clone ( ) ;
1037
1099
register_calling_convention ( arch. borrow ( ) , name, self )
@@ -1094,6 +1156,26 @@ impl<A: Architecture> CallingConvention for ConventionBuilder<A> {
1094
1156
fn are_argument_registers_used_for_var_args ( & self ) -> bool {
1095
1157
self . are_argument_registers_used_for_var_args
1096
1158
}
1159
+
1160
+ fn register_argument_classes ( & self ) -> Vec < u32 > {
1161
+ self . register_argument_classes . clone ( )
1162
+ }
1163
+
1164
+ fn register_argument_class_lists ( & self , _class_id : u32 ) -> Vec < u32 > {
1165
+ self . register_argument_class_lists . clone ( )
1166
+ }
1167
+
1168
+ fn register_argument_lists ( & self ) -> Vec < u32 > {
1169
+ self . register_argument_lists . clone ( )
1170
+ }
1171
+
1172
+ fn register_argument_list_regs ( & self , _reg_list_id : u32 ) -> Vec < RegisterId > {
1173
+ self . register_argument_list_regs . clone ( )
1174
+ }
1175
+
1176
+ fn register_argument_list_kind ( & self , _reg_list_id : u32 ) -> RegisterListKind {
1177
+ self . register_argument_list_kind
1178
+ }
1097
1179
}
1098
1180
1099
1181
unsafe impl < A : Architecture > Send for ConventionBuilder < A > { }
0 commit comments