summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <ecoal95@gmail.com>2016-03-24 06:01:17 +0100
committerEmilio Cobos Álvarez <ecoal95@gmail.com>2016-03-24 06:01:17 +0100
commit0c1a82f0dd72a7343e078bc1bd867f112a418662 (patch)
treeb4dad361967c43497b77bee7cc3624ae28601e27
parent3bb3fe6d57ac55582ca2482ac865bff5193dbccf (diff)
Add option to prevent bitfield method generation
-rw-r--r--src/bin/bindgen.rs4
-rw-r--r--src/gen.rs34
-rw-r--r--src/lib.rs7
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;
diff --git a/src/gen.rs b/src/gen.rs
index 53a9d97c..bdf80264 100644
--- a/src/gen.rs
+++ b/src/gen.rs
@@ -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
diff --git a/src/lib.rs b/src/lib.rs
index 32f8cec0..f8a392c3 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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,