summaryrefslogtreecommitdiff
path: root/rust/src/architecture.rs
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2024-08-01 17:03:39 -0400
committerMason Reed <mason@vector35.com>2024-12-14 13:37:40 -0500
commitb34ddd03f71c8637a80a264a3ea757b8295d482b (patch)
treeb1cbe1ce59e16a98d6dfa21975ce1661d80e9f38 /rust/src/architecture.rs
parent121c16592476754800b00a3b51595f4799944d04 (diff)
Pass length to free flag conditions list callback and remove libc from rust api
Allows language bindings like rust to free conditions lists sanely
Diffstat (limited to 'rust/src/architecture.rs')
-rw-r--r--rust/src/architecture.rs141
1 files changed, 84 insertions, 57 deletions
diff --git a/rust/src/architecture.rs b/rust/src/architecture.rs
index e91925b7..027af77f 100644
--- a/rust/src/architecture.rs
+++ b/rust/src/architecture.rs
@@ -1941,19 +1941,23 @@ where
None => BnString::new("invalid_flag_group").into_raw(),
}
}
-
+
extern "C" fn cb_registers_full_width<A>(ctxt: *mut c_void, count: *mut usize) -> *mut u32
where
A: 'static + Architecture<Handle = CustomArchitectureHandle<A>> + Send + Sync,
{
let custom_arch = unsafe { &*(ctxt as *mut A) };
- let mut regs = custom_arch.registers_full_width();
+ let mut regs: Vec<_> = custom_arch
+ .registers_full_width()
+ .iter()
+ .map(|r| r.id())
+ .collect();
// SAFETY: `count` is an out parameter
unsafe { *count = regs.len() };
let regs_ptr = regs.as_mut_ptr();
mem::forget(regs);
- regs_ptr as *mut _
+ regs_ptr
}
extern "C" fn cb_registers_all<A>(ctxt: *mut c_void, count: *mut usize) -> *mut u32
@@ -1961,13 +1965,13 @@ where
A: 'static + Architecture<Handle = CustomArchitectureHandle<A>> + Send + Sync,
{
let custom_arch = unsafe { &*(ctxt as *mut A) };
- let mut regs = custom_arch.registers_all();
+ let mut regs: Vec<_> = custom_arch.registers_all().iter().map(|r| r.id()).collect();
// SAFETY: `count` is an out parameter
unsafe { *count = regs.len() };
let regs_ptr = regs.as_mut_ptr();
mem::forget(regs);
- regs_ptr as *mut _
+ regs_ptr
}
extern "C" fn cb_registers_global<A>(ctxt: *mut c_void, count: *mut usize) -> *mut u32
@@ -1975,13 +1979,17 @@ where
A: 'static + Architecture<Handle = CustomArchitectureHandle<A>> + Send + Sync,
{
let custom_arch = unsafe { &*(ctxt as *mut A) };
- let mut regs = custom_arch.registers_global();
+ let mut regs: Vec<_> = custom_arch
+ .registers_global()
+ .iter()
+ .map(|r| r.id())
+ .collect();
// SAFETY: `count` is an out parameter
unsafe { *count = regs.len() };
let regs_ptr = regs.as_mut_ptr();
mem::forget(regs);
- regs_ptr as *mut _
+ regs_ptr
}
extern "C" fn cb_registers_system<A>(ctxt: *mut c_void, count: *mut usize) -> *mut u32
@@ -1989,13 +1997,17 @@ where
A: 'static + Architecture<Handle = CustomArchitectureHandle<A>> + Send + Sync,
{
let custom_arch = unsafe { &*(ctxt as *mut A) };
- let mut regs = custom_arch.registers_system();
+ let mut regs: Vec<_> = custom_arch
+ .registers_system()
+ .iter()
+ .map(|r| r.id())
+ .collect();
// SAFETY: `count` is an out parameter
unsafe { *count = regs.len() };
let regs_ptr = regs.as_mut_ptr();
mem::forget(regs);
- regs_ptr as *mut _
+ regs_ptr
}
extern "C" fn cb_flags<A>(ctxt: *mut c_void, count: *mut usize) -> *mut u32
@@ -2003,13 +2015,13 @@ where
A: 'static + Architecture<Handle = CustomArchitectureHandle<A>> + Send + Sync,
{
let custom_arch = unsafe { &*(ctxt as *mut A) };
- let mut flags = custom_arch.flags();
+ let mut flags: Vec<_> = custom_arch.flags().iter().map(|f| f.id()).collect();
// SAFETY: `count` is an out parameter
unsafe { *count = flags.len() };
- let regs_ptr = flags.as_mut_ptr();
+ let flags_ptr = flags.as_mut_ptr();
mem::forget(flags);
- regs_ptr as *mut _
+ flags_ptr
}
extern "C" fn cb_flag_write_types<A>(ctxt: *mut c_void, count: *mut usize) -> *mut u32
@@ -2017,13 +2029,17 @@ where
A: 'static + Architecture<Handle = CustomArchitectureHandle<A>> + Send + Sync,
{
let custom_arch = unsafe { &*(ctxt as *mut A) };
- let mut flag_writes = custom_arch.flag_write_types();
+ let mut flag_writes: Vec<_> = custom_arch
+ .flag_write_types()
+ .iter()
+ .map(|f| f.id())
+ .collect();
// SAFETY: `count` is an out parameter
unsafe { *count = flag_writes.len() };
- let regs_ptr = flag_writes.as_mut_ptr();
+ let flags_ptr = flag_writes.as_mut_ptr();
mem::forget(flag_writes);
- regs_ptr as *mut _
+ flags_ptr
}
extern "C" fn cb_semantic_flag_classes<A>(ctxt: *mut c_void, count: *mut usize) -> *mut u32
@@ -2031,13 +2047,13 @@ where
A: 'static + Architecture<Handle = CustomArchitectureHandle<A>> + Send + Sync,
{
let custom_arch = unsafe { &*(ctxt as *mut A) };
- let mut flag_classes = custom_arch.flag_classes();
+ let mut flag_classes: Vec<_> = custom_arch.flag_classes().iter().map(|f| f.id()).collect();
// SAFETY: `count` is an out parameter
unsafe { *count = flag_classes.len() };
- let regs_ptr = flag_classes.as_mut_ptr();
+ let flags_ptr = flag_classes.as_mut_ptr();
mem::forget(flag_classes);
- regs_ptr as *mut _
+ flags_ptr
}
extern "C" fn cb_semantic_flag_groups<A>(ctxt: *mut c_void, count: *mut usize) -> *mut u32
@@ -2045,13 +2061,13 @@ where
A: 'static + Architecture<Handle = CustomArchitectureHandle<A>> + Send + Sync,
{
let custom_arch = unsafe { &*(ctxt as *mut A) };
- let mut flag_groups = custom_arch.flag_groups();
+ let mut flag_groups: Vec<_> = custom_arch.flag_groups().iter().map(|f| f.id()).collect();
// SAFETY: `count` is an out parameter
unsafe { *count = flag_groups.len() };
- let regs_ptr = flag_groups.as_mut_ptr();
+ let flags_ptr = flag_groups.as_mut_ptr();
mem::forget(flag_groups);
- regs_ptr as *mut _
+ flags_ptr
}
extern "C" fn cb_flag_role<A>(ctxt: *mut c_void, flag: u32, class: u32) -> BNFlagRole
@@ -2081,13 +2097,17 @@ where
{
let custom_arch = unsafe { &*(ctxt as *mut A) };
let class = custom_arch.flag_class_from_id(class);
- let mut flags = custom_arch.flags_required_for_flag_condition(cond, class);
+ let mut flags: Vec<_> = custom_arch
+ .flags_required_for_flag_condition(cond, class)
+ .iter()
+ .map(|f| f.id())
+ .collect();
// SAFETY: `count` is an out parameter
unsafe { *count = flags.len() };
- let regs_ptr = flags.as_mut_ptr();
+ let flags_ptr = flags.as_mut_ptr();
mem::forget(flags);
- regs_ptr as *mut _
+ flags_ptr
}
extern "C" fn cb_flags_required_for_semantic_flag_group<A>(
@@ -2101,13 +2121,13 @@ where
let custom_arch = unsafe { &*(ctxt as *mut A) };
if let Some(group) = custom_arch.flag_group_from_id(group) {
- let mut flags = group.flags_required();
-
+ let mut flags: Vec<_> = group.flags_required().iter().map(|f| f.id()).collect();
+
// SAFETY: `count` is an out parameter
unsafe { *count = flags.len() };
- let regs_ptr = flags.as_mut_ptr();
+ let flags_ptr = flags.as_mut_ptr();
mem::forget(flags);
- regs_ptr as *mut _
+ flags_ptr
} else {
unsafe {
*count = 0;
@@ -2128,23 +2148,19 @@ where
if let Some(group) = custom_arch.flag_group_from_id(group) {
let flag_conditions = group.flag_conditions();
+ let mut flags = flag_conditions
+ .iter()
+ .map(|(&class, &condition)| BNFlagConditionForSemanticClass {
+ semanticClass: class.id(),
+ condition,
+ })
+ .collect::<Vec<_>>();
- unsafe {
- let allocation_size =
- mem::size_of::<BNFlagConditionForSemanticClass>() * flag_conditions.len();
- let result = libc::malloc(allocation_size) as *mut BNFlagConditionForSemanticClass;
- let out_slice = slice::from_raw_parts_mut(result, flag_conditions.len());
-
- for (i, (class, cond)) in flag_conditions.iter().enumerate() {
- let out = out_slice.get_unchecked_mut(i);
-
- out.semanticClass = class.id();
- out.condition = *cond;
- }
-
- *count = flag_conditions.len();
- result
- }
+ // SAFETY: `count` is an out parameter
+ unsafe { *count = flags.len() };
+ let flags_ptr = flags.as_mut_ptr();
+ mem::forget(flags);
+ flags_ptr
} else {
unsafe {
*count = 0;
@@ -2156,11 +2172,17 @@ where
extern "C" fn cb_free_flag_conditions_for_semantic_flag_group<A>(
_ctxt: *mut c_void,
conds: *mut BNFlagConditionForSemanticClass,
+ count: usize,
) where
A: 'static + Architecture<Handle = CustomArchitectureHandle<A>> + Send + Sync,
{
+ if conds.is_null() {
+ return;
+ }
+
unsafe {
- libc::free(conds as *mut _);
+ let flags_ptr = ptr::slice_from_raw_parts_mut(conds, count);
+ let _flags = Box::from_raw(flags_ptr);
}
}
@@ -2175,13 +2197,14 @@ where
let custom_arch = unsafe { &*(ctxt as *mut A) };
if let Some(write_type) = custom_arch.flag_write_from_id(write_type) {
- let mut written = write_type.flags_written();
-
+ let mut flags_written: Vec<_> =
+ write_type.flags_written().iter().map(|f| f.id()).collect();
+
// SAFETY: `count` is an out parameter
- unsafe { *count = written.len() };
- let regs_ptr = written.as_mut_ptr();
- mem::forget(written);
- regs_ptr as *mut _
+ unsafe { *count = flags_written.len() };
+ let flags_ptr = flags_written.as_mut_ptr();
+ mem::forget(flags_written);
+ flags_ptr
} else {
unsafe {
*count = 0;
@@ -2387,13 +2410,17 @@ where
A: 'static + Architecture<Handle = CustomArchitectureHandle<A>> + Send + Sync,
{
let custom_arch = unsafe { &*(ctxt as *mut A) };
- let mut regs = custom_arch.register_stacks();
+ let mut regs: Vec<_> = custom_arch
+ .register_stacks()
+ .iter()
+ .map(|r| r.id())
+ .collect();
// SAFETY: Passed in to be written
unsafe { *count = regs.len() };
let regs_ptr = regs.as_mut_ptr();
mem::forget(regs);
- regs_ptr as *mut _
+ regs_ptr
}
extern "C" fn cb_reg_stack_info<A>(
@@ -2449,13 +2476,13 @@ where
A: 'static + Architecture<Handle = CustomArchitectureHandle<A>> + Send + Sync,
{
let custom_arch = unsafe { &*(ctxt as *mut A) };
- let mut intrinsics = custom_arch.intrinsics();
-
+ let mut intrinsics: Vec<_> = custom_arch.intrinsics().iter().map(|i| i.id()).collect();
+
// SAFETY: Passed in to be written
unsafe { *count = intrinsics.len() };
- let regs_ptr = intrinsics.as_mut_ptr();
+ let intrinsics_ptr = intrinsics.as_mut_ptr();
mem::forget(intrinsics);
- regs_ptr as *mut _
+ intrinsics_ptr
}
extern "C" fn cb_intrinsic_inputs<A>(