-
Notifications
You must be signed in to change notification settings - Fork 702
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
codegen: Avoid generating invalid Rust code when a struct is not prop…
…erly aligned.
- Loading branch information
Showing
5 changed files
with
211 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
136 changes: 136 additions & 0 deletions
136
libbindgen/tests/expectations/tests/16-byte-alignment.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,136 @@ | ||
/* automatically generated by rust-bindgen */ | ||
|
||
|
||
#![allow(non_snake_case)] | ||
|
||
|
||
#[repr(C)] | ||
pub struct __BindgenUnionField<T>(::std::marker::PhantomData<T>); | ||
impl <T> __BindgenUnionField<T> { | ||
#[inline] | ||
pub fn new() -> Self { __BindgenUnionField(::std::marker::PhantomData) } | ||
#[inline] | ||
pub unsafe fn as_ref(&self) -> &T { ::std::mem::transmute(self) } | ||
#[inline] | ||
pub unsafe fn as_mut(&mut self) -> &mut T { ::std::mem::transmute(self) } | ||
} | ||
impl <T> ::std::default::Default for __BindgenUnionField<T> { | ||
#[inline] | ||
fn default() -> Self { Self::new() } | ||
} | ||
impl <T> ::std::clone::Clone for __BindgenUnionField<T> { | ||
#[inline] | ||
fn clone(&self) -> Self { Self::new() } | ||
} | ||
impl <T> ::std::marker::Copy for __BindgenUnionField<T> { } | ||
impl <T> ::std::fmt::Debug for __BindgenUnionField<T> { | ||
fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { | ||
fmt.write_str("__BindgenUnionField") | ||
} | ||
} | ||
#[repr(C)] | ||
#[derive(Debug, Copy)] | ||
pub struct rte_ipv4_tuple { | ||
pub src_addr: u32, | ||
pub dst_addr: u32, | ||
pub __bindgen_anon_1: rte_ipv4_tuple__bindgen_ty_1, | ||
} | ||
#[repr(C)] | ||
#[derive(Debug, Copy)] | ||
pub struct rte_ipv4_tuple__bindgen_ty_1 { | ||
pub __bindgen_anon_1: __BindgenUnionField<rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1>, | ||
pub sctp_tag: __BindgenUnionField<u32>, | ||
pub bindgen_union_field: u32, | ||
} | ||
#[repr(C)] | ||
#[derive(Debug, Copy)] | ||
pub struct rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1 { | ||
pub dport: u16, | ||
pub sport: u16, | ||
} | ||
#[test] | ||
fn bindgen_test_layout_rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1() { | ||
assert_eq!(::std::mem::size_of::<rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1>() | ||
, 4usize); | ||
assert_eq!(::std::mem::align_of::<rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1>() | ||
, 2usize); | ||
} | ||
impl Clone for rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1 { | ||
fn clone(&self) -> Self { *self } | ||
} | ||
#[test] | ||
fn bindgen_test_layout_rte_ipv4_tuple__bindgen_ty_1() { | ||
assert_eq!(::std::mem::size_of::<rte_ipv4_tuple__bindgen_ty_1>() , | ||
4usize); | ||
assert_eq!(::std::mem::align_of::<rte_ipv4_tuple__bindgen_ty_1>() , | ||
4usize); | ||
} | ||
impl Clone for rte_ipv4_tuple__bindgen_ty_1 { | ||
fn clone(&self) -> Self { *self } | ||
} | ||
#[test] | ||
fn bindgen_test_layout_rte_ipv4_tuple() { | ||
assert_eq!(::std::mem::size_of::<rte_ipv4_tuple>() , 12usize); | ||
assert_eq!(::std::mem::align_of::<rte_ipv4_tuple>() , 4usize); | ||
} | ||
impl Clone for rte_ipv4_tuple { | ||
fn clone(&self) -> Self { *self } | ||
} | ||
#[repr(C)] | ||
#[derive(Debug, Copy)] | ||
pub struct rte_ipv6_tuple { | ||
pub src_addr: [u8; 16usize], | ||
pub dst_addr: [u8; 16usize], | ||
pub __bindgen_anon_1: rte_ipv6_tuple__bindgen_ty_1, | ||
} | ||
#[repr(C)] | ||
#[derive(Debug, Copy)] | ||
pub struct rte_ipv6_tuple__bindgen_ty_1 { | ||
pub __bindgen_anon_1: __BindgenUnionField<rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1>, | ||
pub sctp_tag: __BindgenUnionField<u32>, | ||
pub bindgen_union_field: u32, | ||
} | ||
#[repr(C)] | ||
#[derive(Debug, Copy)] | ||
pub struct rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1 { | ||
pub dport: u16, | ||
pub sport: u16, | ||
} | ||
#[test] | ||
fn bindgen_test_layout_rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1() { | ||
assert_eq!(::std::mem::size_of::<rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1>() | ||
, 4usize); | ||
assert_eq!(::std::mem::align_of::<rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1>() | ||
, 2usize); | ||
} | ||
impl Clone for rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1 { | ||
fn clone(&self) -> Self { *self } | ||
} | ||
#[test] | ||
fn bindgen_test_layout_rte_ipv6_tuple__bindgen_ty_1() { | ||
assert_eq!(::std::mem::size_of::<rte_ipv6_tuple__bindgen_ty_1>() , | ||
4usize); | ||
assert_eq!(::std::mem::align_of::<rte_ipv6_tuple__bindgen_ty_1>() , | ||
4usize); | ||
} | ||
impl Clone for rte_ipv6_tuple__bindgen_ty_1 { | ||
fn clone(&self) -> Self { *self } | ||
} | ||
#[test] | ||
fn bindgen_test_layout_rte_ipv6_tuple() { | ||
assert_eq!(::std::mem::size_of::<rte_ipv6_tuple>() , 36usize); | ||
assert_eq!(::std::mem::align_of::<rte_ipv6_tuple>() , 4usize); | ||
} | ||
impl Clone for rte_ipv6_tuple { | ||
fn clone(&self) -> Self { *self } | ||
} | ||
#[repr(C)] | ||
#[derive(Copy)] | ||
pub struct rte_thash_tuple { | ||
pub v4: __BindgenUnionField<rte_ipv4_tuple>, | ||
pub v6: __BindgenUnionField<rte_ipv6_tuple>, | ||
pub bindgen_union_field: [u8; 48usize], | ||
} | ||
impl Clone for rte_thash_tuple { | ||
fn clone(&self) -> Self { *self } | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
|
||
typedef unsigned char uint8_t; | ||
typedef unsigned short uint16_t; | ||
typedef unsigned int uint32_t; | ||
|
||
struct rte_ipv4_tuple { | ||
uint32_t src_addr; | ||
uint32_t dst_addr; | ||
union { | ||
struct { | ||
uint16_t dport; | ||
uint16_t sport; | ||
}; | ||
uint32_t sctp_tag; | ||
}; | ||
}; | ||
|
||
struct rte_ipv6_tuple { | ||
uint8_t src_addr[16]; | ||
uint8_t dst_addr[16]; | ||
union { | ||
struct { | ||
uint16_t dport; | ||
uint16_t sport; | ||
}; | ||
uint32_t sctp_tag; | ||
}; | ||
}; | ||
|
||
union rte_thash_tuple { | ||
struct rte_ipv4_tuple v4; | ||
struct rte_ipv6_tuple v6; | ||
} __attribute__((aligned(16))); |