summaryrefslogtreecommitdiff
path: root/libbindgen/src/codegen/helpers.rs
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <emilio@crisal.io>2017-01-21 14:56:11 +0100
committerEmilio Cobos Álvarez <emilio@crisal.io>2017-01-21 16:25:12 +0100
commit30a4722622883459c87d5de7a5ffae37849805d1 (patch)
tree7fba4922781a022683e9c2491065329dae276c75 /libbindgen/src/codegen/helpers.rs
parente6a9291cb089da2a2b252f78658d125ffcd48802 (diff)
codegen: Avoid generating invalid Rust code when a struct is not properly aligned.
Diffstat (limited to 'libbindgen/src/codegen/helpers.rs')
-rw-r--r--libbindgen/src/codegen/helpers.rs24
1 files changed, 13 insertions, 11 deletions
diff --git a/libbindgen/src/codegen/helpers.rs b/libbindgen/src/codegen/helpers.rs
index c09f0071..78fd7b69 100644
--- a/libbindgen/src/codegen/helpers.rs
+++ b/libbindgen/src/codegen/helpers.rs
@@ -49,20 +49,22 @@ impl BlobTyBuilder {
}
pub fn build(self) -> P<ast::Ty> {
- use std::cmp;
+ let opaque = self.layout.opaque();
- let ty_name = match self.layout.align {
- 8 => "u64",
- 4 => "u32",
- 2 => "u16",
- 1 | _ => "u8",
- };
- let data_len = if ty_name == "u8" {
- self.layout.size
- } else {
- self.layout.size / cmp::max(self.layout.align, 1)
+ // FIXME(emilio, #412): We fall back to byte alignment, but there are
+ // some things that legitimately are more than 8-byte aligned.
+ //
+ // Eventually we should be able to `unwrap` here, but...
+ let ty_name = match opaque.known_rust_type_for_array() {
+ Some(ty) => ty,
+ None => {
+ warn!("Found unknown alignment on code generation!");
+ "u8"
+ }
};
+ let data_len = opaque.array_size().unwrap_or(self.layout.size);
+
let inner_ty = aster::AstBuilder::new().ty().path().id(ty_name).build();
if data_len == 1 {
inner_ty