@@ -8,7 +8,7 @@ use binaryninja::segment::{SegmentBuilder, SegmentFlags};
88use binaryninja:: symbol:: { SymbolBuilder , SymbolType } ;
99use binaryninja:: types:: {
1010 BaseStructure , EnumerationBuilder , MemberAccess , MemberScope , NamedTypeReference ,
11- NamedTypeReferenceClass , StructureBuilder , StructureMember , StructureType , Type , TypeBuilder ,
11+ NamedTypeReferenceClass , StructureBuilder , StructureMember , Type , TypeBuilder ,
1212} ;
1313use std:: collections:: HashMap ;
1414use std:: num:: NonZeroUsize ;
@@ -442,53 +442,12 @@ impl DeviceMapper {
442442
443443 let type_builder = match & register. fields {
444444 Some ( fields) => {
445- // Separate bitfields from regular fields.
446- let ( fields, bitfield_items) : ( Vec < _ > , Vec < _ > ) =
447- fields. iter ( ) . partition ( |f| {
448- byte_aligned ( f. bit_range . width ) && byte_aligned ( f. bit_range . offset )
449- } ) ;
450-
451445 for field in fields {
452446 let field_member = self . field_member ( field) ;
453447 let overwrites = true ; // TODO: Handle overwrites?
454448 register_struct. insert_member ( field_member, overwrites) ;
455449 }
456450
457- if self . settings . add_bitfields {
458- // The bitfield items need to be coalesced to a map of byte offset to vec of fields.
459- let mut bitfield_map: HashMap < u64 , Vec < & Field > > = HashMap :: new ( ) ;
460-
461- // Sort bitfields by their offset
462- let mut sorted_bitfields = bitfield_items. iter ( ) . collect :: < Vec < _ > > ( ) ;
463- sorted_bitfields. sort_by_key ( |f| f. bit_range . offset ) ;
464-
465- // Group bitfields by overlapping bit offsets
466- let mut current_bit_start = 0 ;
467- let mut current_bit_end = 0 ;
468- for field in sorted_bitfields {
469- let bit_start = field. bit_range . offset ;
470- let byte_start = bit_start / 8 ;
471- let current_byte_start = current_bit_start / 8 ;
472- if current_byte_start != byte_start && current_bit_end < bit_start {
473- // Make a new bitfield, only if the current field is in a new byte.
474- current_bit_start = bit_start;
475- }
476- current_bit_end = bit_start + field. bit_range . width ;
477- bitfield_map
478- . entry ( current_bit_start as u64 )
479- . or_insert_with ( Vec :: new)
480- . push ( field) ;
481- }
482-
483- for ( bit_start, fields) in bitfield_map {
484- // Add each bitfield to the structure!
485- let byte_start = bit_start / 8 ;
486- let bitfield_member = self . bitfield_member ( byte_start, fields) ;
487- let overwrites = true ; // TODO: Handle overwrites?
488- register_struct. insert_member ( bitfield_member, overwrites) ;
489- }
490- }
491-
492451 TypeBuilder :: structure ( & register_struct. finalize ( ) )
493452 }
494453 None if register. derived_from . is_some ( ) => {
@@ -559,43 +518,14 @@ impl DeviceMapper {
559518 }
560519 }
561520
562- pub fn bitfield_member ( & self , byte_offset : u64 , fields : Vec < & Field > ) -> StructureMember {
563- let field_ty = self . bitfield_type ( byte_offset, fields) ;
564- // TODO: Create bitfield name from the fields?
565- let field_name = format ! ( "bitfield_0x{:x}" , byte_offset) ;
566- // TODO: This should be like 120 confidence?
567- let conf_field_ty = Conf :: new ( field_ty, MAX_CONFIDENCE ) ;
568- StructureMember :: new (
569- conf_field_ty,
570- field_name,
571- byte_offset,
572- MemberAccess :: PublicAccess ,
573- MemberScope :: NoScope ,
574- )
575- }
576-
577- pub fn bitfield_type ( & self , byte_offset : u64 , fields : Vec < & Field > ) -> Ref < Type > {
578- let mut union_builder = StructureBuilder :: new ( ) ;
579- union_builder. structure_type ( StructureType :: UnionStructureType ) ;
580- for field in fields {
581- let mut field_member = self . field_member ( field) ;
582- // Field members are relative to the union member, so we must remove the union member offset
583- // from the field member offset to make it relative to the union member.
584- field_member. offset -= byte_offset;
585- let overwrites = false ; // TODO: Handle overwrites?
586- union_builder. insert_member ( field_member, overwrites) ;
587- }
588- Type :: structure ( & union_builder. finalize ( ) )
589- }
590-
591521 pub fn field_member ( & self , field : & Field ) -> StructureMember {
592522 let field_ty = self . field_type ( field) ;
593523 let conf_field_ty = Conf :: new ( field_ty, MAX_CONFIDENCE ) ;
594- let byte_offset = field. bit_offset ( ) / 8 ;
595- StructureMember :: new (
524+ StructureMember :: new_bitfield (
596525 conf_field_ty,
597526 field. name . to_owned ( ) ,
598- byte_offset as u64 ,
527+ field. bit_offset ( ) as u64 ,
528+ field. bit_width ( ) as u8 ,
599529 MemberAccess :: PublicAccess ,
600530 MemberScope :: NoScope ,
601531 )
@@ -633,7 +563,6 @@ impl DeviceMapper {
633563 }
634564
635565 pub fn single_field_int_type ( & self , field : & FieldInfo ) -> Ref < Type > {
636- // TODO: Binary Ninja is unable to handle bit fields, so we abuse unions.
637566 // Get the closest 8-bit aligned integer and use that.
638567 let width = field. bit_width ( ) ;
639568 let byte_aligned_width = byte_width ( width) ;
0 commit comments