diff options
| author | bors <bors@rust-lang.org> | 2019-07-27 19:27:36 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2019-07-27 19:27:36 +0000 |
| commit | c798dffac9dc8c82374db48f5b474690cc6e9686 (patch) | |
| tree | 42d3f81ee0df278440f33b6ac0f6a37dae32fa32 /src/test/ui/thinlto | |
| parent | a5e7bb3e2bae3e8d31c10de66e91cdcea42a97df (diff) | |
| parent | f1c8673ae7584e0c1e53c554ba61b7bf831edf90 (diff) | |
| download | rust-c798dffac9dc8c82374db48f5b474690cc6e9686.tar.gz rust-c798dffac9dc8c82374db48f5b474690cc6e9686.zip | |
Auto merge of #63029 - petrochenkov:rpass, r=Centril
Move run-pass tests to ui This is the second attempt at doing https://github.com/rust-lang/rust/pull/53994 (which was previously reverted in https://github.com/rust-lang/rust/pull/54530). The issue with inability to run the test suite in a faster way (https://github.com/rust-lang/rust/issues/54047) that motivated the revert was recently addressed by https://github.com/rust-lang/rust/pull/61755. r? @Centril
Diffstat (limited to 'src/test/ui/thinlto')
| -rw-r--r-- | src/test/ui/thinlto/all-crates.rs | 8 | ||||
| -rw-r--r-- | src/test/ui/thinlto/auxiliary/dylib.rs | 6 | ||||
| -rw-r--r-- | src/test/ui/thinlto/auxiliary/msvc-imp-present.rs | 11 | ||||
| -rw-r--r-- | src/test/ui/thinlto/auxiliary/thin-lto-inlines-aux.rs | 7 | ||||
| -rw-r--r-- | src/test/ui/thinlto/dylib-works.rs | 9 | ||||
| -rw-r--r-- | src/test/ui/thinlto/msvc-imp-present.rs | 22 | ||||
| -rw-r--r-- | src/test/ui/thinlto/thin-lto-inlines.rs | 30 | ||||
| -rw-r--r-- | src/test/ui/thinlto/thin-lto-inlines2.rs | 28 | ||||
| -rw-r--r-- | src/test/ui/thinlto/weak-works.rs | 28 |
9 files changed, 149 insertions, 0 deletions
diff --git a/src/test/ui/thinlto/all-crates.rs b/src/test/ui/thinlto/all-crates.rs new file mode 100644 index 00000000000..e910b2a9f96 --- /dev/null +++ b/src/test/ui/thinlto/all-crates.rs @@ -0,0 +1,8 @@ +// run-pass + +// compile-flags: -Clto=thin +// no-prefer-dynamic + +fn main() { + println!("hello!"); +} diff --git a/src/test/ui/thinlto/auxiliary/dylib.rs b/src/test/ui/thinlto/auxiliary/dylib.rs new file mode 100644 index 00000000000..e8b7f8f9f47 --- /dev/null +++ b/src/test/ui/thinlto/auxiliary/dylib.rs @@ -0,0 +1,6 @@ +// compile-flags: -Z thinlto -C codegen-units=8 + +#[inline] +pub fn foo(b: u8) { + b.to_string(); +} diff --git a/src/test/ui/thinlto/auxiliary/msvc-imp-present.rs b/src/test/ui/thinlto/auxiliary/msvc-imp-present.rs new file mode 100644 index 00000000000..933af050a6a --- /dev/null +++ b/src/test/ui/thinlto/auxiliary/msvc-imp-present.rs @@ -0,0 +1,11 @@ +// no-prefer-dynamic +// compile-flags: -Z thinlto -C codegen-units=8 -C prefer-dynamic + +#![crate_type = "rlib"] +#![crate_type = "dylib"] + +pub static A: u32 = 43; + +pub mod a { + pub static A: u32 = 43; +} diff --git a/src/test/ui/thinlto/auxiliary/thin-lto-inlines-aux.rs b/src/test/ui/thinlto/auxiliary/thin-lto-inlines-aux.rs new file mode 100644 index 00000000000..5fd3f1996dd --- /dev/null +++ b/src/test/ui/thinlto/auxiliary/thin-lto-inlines-aux.rs @@ -0,0 +1,7 @@ +// no-prefer-dynamic + +#![crate_type = "rlib"] + +pub fn bar() -> u32 { + 3 +} diff --git a/src/test/ui/thinlto/dylib-works.rs b/src/test/ui/thinlto/dylib-works.rs new file mode 100644 index 00000000000..9e0782b590e --- /dev/null +++ b/src/test/ui/thinlto/dylib-works.rs @@ -0,0 +1,9 @@ +// run-pass + +// aux-build:dylib.rs + +extern crate dylib; + +fn main() { + dylib::foo(1); +} diff --git a/src/test/ui/thinlto/msvc-imp-present.rs b/src/test/ui/thinlto/msvc-imp-present.rs new file mode 100644 index 00000000000..5498afb2937 --- /dev/null +++ b/src/test/ui/thinlto/msvc-imp-present.rs @@ -0,0 +1,22 @@ +// run-pass + +// aux-build:msvc-imp-present.rs +// compile-flags: -Z thinlto -C codegen-units=8 +// no-prefer-dynamic + +// On MSVC we have a "hack" where we emit symbols that look like `_imp_$name` +// for all exported statics. This is done because we apply `dllimport` to all +// imported constants and this allows everything to actually link correctly. +// +// The ThinLTO passes aggressively remove symbols if they can, and this test +// asserts that the ThinLTO passes don't remove these compiler-generated +// `_imp_*` symbols. The external library that we link in here is compiled with +// ThinLTO and multiple codegen units and has a few exported constants. Note +// that we also namely compile the library as both a dylib and an rlib, but we +// link the rlib to ensure that we assert those generated symbols exist. + +extern crate msvc_imp_present as bar; + +fn main() { + println!("{}", bar::A); +} diff --git a/src/test/ui/thinlto/thin-lto-inlines.rs b/src/test/ui/thinlto/thin-lto-inlines.rs new file mode 100644 index 00000000000..dca7918077e --- /dev/null +++ b/src/test/ui/thinlto/thin-lto-inlines.rs @@ -0,0 +1,30 @@ +// run-pass + +// compile-flags: -Z thinlto -C codegen-units=8 -O +// ignore-emscripten can't inspect instructions on emscripten + +// We want to assert here that ThinLTO will inline across codegen units. There's +// not really a great way to do that in general so we sort of hack around it by +// praying two functions go into separate codegen units and then assuming that +// if inlining *doesn't* happen the first byte of the functions will differ. + +pub fn foo() -> u32 { + bar::bar() +} + +mod bar { + pub fn bar() -> u32 { + 3 + } +} + +fn main() { + println!("{} {}", foo(), bar::bar()); + + unsafe { + let foo = foo as usize as *const u8; + let bar = bar::bar as usize as *const u8; + + assert_eq!(*foo, *bar); + } +} diff --git a/src/test/ui/thinlto/thin-lto-inlines2.rs b/src/test/ui/thinlto/thin-lto-inlines2.rs new file mode 100644 index 00000000000..1eb29657c70 --- /dev/null +++ b/src/test/ui/thinlto/thin-lto-inlines2.rs @@ -0,0 +1,28 @@ +// run-pass + +// compile-flags: -C codegen-units=8 -O -C lto=thin +// aux-build:thin-lto-inlines-aux.rs +// no-prefer-dynamic +// ignore-emscripten can't inspect instructions on emscripten + +// We want to assert here that ThinLTO will inline across codegen units. There's +// not really a great way to do that in general so we sort of hack around it by +// praying two functions go into separate codegen units and then assuming that +// if inlining *doesn't* happen the first byte of the functions will differ. + +extern crate thin_lto_inlines_aux as bar; + +pub fn foo() -> u32 { + bar::bar() +} + +fn main() { + println!("{} {}", foo(), bar::bar()); + + unsafe { + let foo = foo as usize as *const u8; + let bar = bar::bar as usize as *const u8; + + assert_eq!(*foo, *bar); + } +} diff --git a/src/test/ui/thinlto/weak-works.rs b/src/test/ui/thinlto/weak-works.rs new file mode 100644 index 00000000000..163a3870248 --- /dev/null +++ b/src/test/ui/thinlto/weak-works.rs @@ -0,0 +1,28 @@ +// run-pass + +// compile-flags: -C codegen-units=8 -Z thinlto +// ignore-windows + +#![feature(linkage)] + +pub mod foo { + #[linkage = "weak"] + #[no_mangle] + pub extern "C" fn FOO() -> i32 { + 0 + } +} + +mod bar { + extern "C" { + fn FOO() -> i32; + } + + pub fn bar() -> i32 { + unsafe { FOO() } + } +} + +fn main() { + bar::bar(); +} |
