From 30a4722622883459c87d5de7a5ffae37849805d1 Mon Sep 17 00:00:00 2001 From: Emilio Cobos Álvarez Date: Sat, 21 Jan 2017 14:56:11 +0100 Subject: codegen: Avoid generating invalid Rust code when a struct is not properly aligned. --- libbindgen/src/codegen/helpers.rs | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) (limited to 'libbindgen/src/codegen/helpers.rs') 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 { - 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 -- cgit v1.2.3