-
Notifications
You must be signed in to change notification settings - Fork 13.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Append missing padding after last field of struct
This patch fixes issue #13186. When generating constant expression for enum, it is possible that alignment of expression may be not equal to alignment of type. In that case space after last struct field must be padded to match size of value and size of struct. This commit adds that padding. See detailed explanation in src/test/run-pass/trans-tag-static-padding.rs
- Loading branch information
1 parent
ecc774f
commit 7fefc1c
Showing
2 changed files
with
104 additions
and
12 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT | ||
// file at the top-level directory of this distribution and at | ||
// http://rust-lang.org/COPYRIGHT. | ||
// | ||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | ||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | ||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | ||
// option. This file may not be copied, modified, or distributed | ||
// except according to those terms. | ||
|
||
|
||
// Issue #13186 | ||
|
||
// For simplicity of explanations assuming code is compiled for x86_64 | ||
// Linux ABI. | ||
|
||
// Size of TestOption<u64> is 16, and alignment of TestOption<u64> is 8. | ||
// Size of u8 is 1, and alignment of u8 is 1. | ||
// So size of Request is 24, and alignment of Request must be 8: | ||
// the maximum alignment of its fields. | ||
// Last 7 bytes of Request struct are not occupied by any fields. | ||
|
||
|
||
enum TestOption<T> { | ||
TestNone, | ||
TestSome(T), | ||
} | ||
|
||
pub struct Request { | ||
foo: TestOption<u64>, | ||
bar: u8, | ||
} | ||
|
||
fn default_instance() -> &'static Request { | ||
static instance: Request = Request { | ||
// LLVM does not allow to specify alignment of expressions, thus | ||
// alignment of `foo` in constant is 1, not 8. | ||
foo: TestNone, | ||
bar: 17, | ||
// Space after last field is not occupied by any data, but it is | ||
// reserved to make struct aligned properly. If compiler does | ||
// not insert padding after last field when emitting constant, | ||
// size of struct may be not equal to size of struct, and | ||
// compiler crashes in internal assertion check. | ||
}; | ||
&'static instance | ||
} | ||
|
||
fn non_default_instance() -> &'static Request { | ||
static instance: Request = Request { | ||
foo: TestSome(0x1020304050607080), | ||
bar: 19, | ||
}; | ||
&'static instance | ||
} | ||
|
||
pub fn main() { | ||
match default_instance() { | ||
&Request { foo: TestNone, bar: 17 } => {}, | ||
_ => fail!(), | ||
}; | ||
match non_default_instance() { | ||
&Request { foo: TestSome(0x1020304050607080), bar: 19 } => {}, | ||
_ => fail!(), | ||
}; | ||
} |
7fefc1c
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
saw approval from pcwalton
at stepancheg@7fefc1c
7fefc1c
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
merging stepancheg/rust/align = 7fefc1c into auto
7fefc1c
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
stepancheg/rust/align = 7fefc1c merged ok, testing candidate = fd625dd
7fefc1c
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
all tests pass:
success: http://buildbot.rust-lang.org/builders/auto-mac-32-opt/builds/5593
success: http://buildbot.rust-lang.org/builders/auto-mac-64-opt/builds/5589
success: http://buildbot.rust-lang.org/builders/auto-mac-64-nopt-c/builds/4683
success: http://buildbot.rust-lang.org/builders/auto-mac-64-nopt-t/builds/4695
success: http://buildbot.rust-lang.org/builders/auto-linux-32-opt/builds/5691
success: http://buildbot.rust-lang.org/builders/auto-linux-32-nopt-c/builds/4779
success: http://buildbot.rust-lang.org/builders/auto-linux-32-nopt-t/builds/4787
success: http://buildbot.rust-lang.org/builders/auto-linux-64-opt/builds/5693
success: http://buildbot.rust-lang.org/builders/auto-linux-64-nopt-c/builds/4778
success: http://buildbot.rust-lang.org/builders/auto-linux-64-nopt-t/builds/4784
success: http://buildbot.rust-lang.org/builders/auto-linux-64-x-android/builds/4846
success: http://buildbot.rust-lang.org/builders/auto-linux-64-x-android-t/builds/2580
success: http://buildbot.rust-lang.org/builders/auto-win-32-opt/builds/5686
success: http://buildbot.rust-lang.org/builders/auto-win-32-nopt-c/builds/4782
success: http://buildbot.rust-lang.org/builders/auto-win-32-nopt-t/builds/4797
7fefc1c
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fast-forwarding master to auto = fd625dd