diff options
author | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2016-03-24 06:01:17 +0100 |
---|---|---|
committer | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2016-03-24 06:01:17 +0100 |
commit | 0c1a82f0dd72a7343e078bc1bd867f112a418662 (patch) | |
tree | b4dad361967c43497b77bee7cc3624ae28601e27 | |
parent | 3bb3fe6d57ac55582ca2482ac865bff5193dbccf (diff) |
Add option to prevent bitfield method generation
-rw-r--r-- | src/bin/bindgen.rs | 4 | ||||
-rw-r--r-- | src/gen.rs | 34 | ||||
-rw-r--r-- | src/lib.rs | 7 |
3 files changed, 36 insertions, 9 deletions
diff --git a/src/bin/bindgen.rs b/src/bin/bindgen.rs index 9919da71..67ddc8a8 100644 --- a/src/bin/bindgen.rs +++ b/src/bin/bindgen.rs @@ -116,6 +116,10 @@ fn parse_args(args: &[String]) -> ParseResult { options.ignore_functions = true; ix += 1; } + "-no-bitfield-methods" => { + options.gen_bitfield_methods = false; + ix += 1; + } "-allow-unknown-types" => { options.fail_on_unknown_type = false; ix += 1; @@ -1028,13 +1028,15 @@ fn cstruct_to_rs(ctx: &mut GenCtx, name: &str, ci: CompInfo) -> Vec<P<ast::Item> continue; } - let mut offset: u32 = 0; - if let Some(ref bitfields) = f.bitfields { - for &(ref bf_name, bf_size) in bitfields.iter() { - setters.push(gen_bitfield_method(ctx, &f_name, bf_name, &f.ty, offset as usize, bf_size)); - offset += bf_size; + if ctx.options.gen_bitfield_methods { + let mut offset: u32 = 0; + if let Some(ref bitfields) = f.bitfields { + for &(ref bf_name, bf_size) in bitfields.iter() { + setters.push(gen_bitfield_method(ctx, &f_name, bf_name, &f.ty, offset as usize, bf_size)); + offset += bf_size; + } + setters.push(gen_fullbitfield_method(ctx, &f_name, &f.ty, bitfields)) } - setters.push(gen_fullbitfield_method(ctx, &f_name, &f.ty, bitfields)) } let mut bypass = false; @@ -1510,6 +1512,9 @@ fn cenum_to_rs(ctx: &mut GenCtx, fn gen_comp_methods(ctx: &mut GenCtx, data_field: &str, data_offset: usize, kind: CompKind, members: &[CompMember], extra: &mut Vec<P<ast::Item>>) -> Vec<ast::ImplItem> { + if !ctx.options.gen_bitfield_methods { + return vec![]; + } let mk_field_method = |ctx: &mut GenCtx, f: &FieldInfo, offset: usize| { // TODO: Implement bitfield accessors @@ -2208,14 +2213,25 @@ fn mk_test_fn(ctx: &GenCtx, name: &str, layout: &Layout) -> P<ast::Item> { } fn mk_opaque_struct(ctx: &GenCtx, name: &str, layout: &Layout) -> P<ast::Item> { - let size = layout.size; + let (size, ty_name) = if layout.size % 8 == 0 { + (layout.size / 8, "u64") + } else if layout.size % 4 == 0 { + (layout.size / 4, "u32") + } else if layout.size % 2 == 0 { + (layout.size / 2, "u16") + } else { + (layout.size, "u8") + }; + let struct_name = ctx.ext_cx.ident_of(name); + let ty_name = ctx.ext_cx.ident_of(ty_name); + let item = quote_item!(&ctx.ext_cx, #[repr(C)] #[derive(Copy, Clone, Debug)] - struct $struct_name { - _bindgen_opaque_blob: [u8; $size] + pub struct $struct_name { + _bindgen_opaque_blob: [$ty_name; $size] } ).unwrap(); item @@ -91,6 +91,11 @@ impl<'a> Builder<'a> { self } + pub fn no_bitfield_methods(&mut self) -> &mut Self { + self.options.gen_bitfield_methods = false; + self + } + pub fn rust_enums(&mut self, value: bool) -> &mut Self { self.options.rust_enums = value; self @@ -131,6 +136,7 @@ pub struct BindgenOptions { pub links: Vec<(String, LinkType)>, pub emit_ast: bool, pub ignore_functions: bool, + pub gen_bitfield_methods: bool, pub fail_on_unknown_type: bool, pub enable_cxx_namespaces: bool, pub rename_types: bool, @@ -150,6 +156,7 @@ impl Default for BindgenOptions { links: Vec::new(), emit_ast: false, ignore_functions: false, + gen_bitfield_methods: true, fail_on_unknown_type: true, rename_types: true, derive_debug: true, |