diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2017-02-07 06:17:17 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-02-07 06:17:17 -0800 |
commit | f5394b34d6140ec5da2e2e5bce0415e1929724bc (patch) | |
tree | 94b170597b30a470edde2c6999a6e2a52e3db9c2 /src/codegen/helpers.rs | |
parent | 7fa654c699b61250787e53a300357f0c58c55b18 (diff) | |
parent | 7fd707004b03a8110c6d82e82165f9e1a8ad6985 (diff) |
Auto merge of #468 - flier:padding-bytes, r=emilio
Improve struct alignment with padding bytes
I known, it is a little tricky or dirty solution, I have to do a lot of calculate for alignment.
For example
```c++
typedef struct {
long long __clang_max_align_nonce1
__attribute__((__aligned__(__alignof__(long long))));
long double __clang_max_align_nonce2
__attribute__((__aligned__(__alignof__(long double))));
} max_align_t;
```
will be generated as
```rust
pub struct _bindgen_ty_1 {
pub __clang_max_align_nonce1: ::std::os::raw::c_longlong,
_padding_0: u64,
pub __clang_max_align_nonce2: f64,
_padding_1: u64,
}
fn bindgen_test_layout__bindgen_ty_1() {
assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 32usize);
assert_eq! (0usize , unsafe {
& ( * ( 0 as * const _bindgen_ty_1 ) ) .
__clang_max_align_nonce1 as * const _ as usize });
assert_eq! (16usize , unsafe {
& ( * ( 0 as * const _bindgen_ty_1 ) ) .
__clang_max_align_nonce2 as * const _ as usize });
}
```
It may generate wrong layout when use template or multi virtual inheritance.
At least, it is a begining, pass all the test cases, and some [complex struct](https://github.com/servo/rust-bindgen/compare/master...flier:padding-bytes?expand=1#diff-eda352138aed047149ebeec72d19979d) in wild.
Diffstat (limited to 'src/codegen/helpers.rs')
0 files changed, 0 insertions, 0 deletions