From 9be35f82c1abf2ecbab489bca9eca138ea648312 Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Sat, 27 Jul 2019 01:33:01 +0300 Subject: tests: Move run-pass tests without naming conflicts to ui --- src/test/ui/thinlto/all-crates.rs | 8 ++++++ src/test/ui/thinlto/auxiliary/dylib.rs | 6 +++++ src/test/ui/thinlto/auxiliary/msvc-imp-present.rs | 11 ++++++++ .../ui/thinlto/auxiliary/thin-lto-inlines-aux.rs | 7 +++++ src/test/ui/thinlto/dylib-works.rs | 9 +++++++ src/test/ui/thinlto/msvc-imp-present.rs | 22 ++++++++++++++++ src/test/ui/thinlto/thin-lto-inlines.rs | 30 ++++++++++++++++++++++ src/test/ui/thinlto/thin-lto-inlines2.rs | 28 ++++++++++++++++++++ src/test/ui/thinlto/weak-works.rs | 28 ++++++++++++++++++++ 9 files changed, 149 insertions(+) create mode 100644 src/test/ui/thinlto/all-crates.rs create mode 100644 src/test/ui/thinlto/auxiliary/dylib.rs create mode 100644 src/test/ui/thinlto/auxiliary/msvc-imp-present.rs create mode 100644 src/test/ui/thinlto/auxiliary/thin-lto-inlines-aux.rs create mode 100644 src/test/ui/thinlto/dylib-works.rs create mode 100644 src/test/ui/thinlto/msvc-imp-present.rs create mode 100644 src/test/ui/thinlto/thin-lto-inlines.rs create mode 100644 src/test/ui/thinlto/thin-lto-inlines2.rs create mode 100644 src/test/ui/thinlto/weak-works.rs (limited to 'src/test/ui/thinlto') 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(); +} -- cgit 1.4.1-3-g733a5