diff options
Diffstat (limited to 'src/test/ui/sepcomp')
-rw-r--r-- | src/test/ui/sepcomp/auxiliary/sepcomp-extern-lib.rs | 4 | ||||
-rw-r--r-- | src/test/ui/sepcomp/auxiliary/sepcomp_cci_lib.rs | 6 | ||||
-rw-r--r-- | src/test/ui/sepcomp/auxiliary/sepcomp_lib.rs | 21 | ||||
-rw-r--r-- | src/test/ui/sepcomp/sepcomp-cci.rs | 33 | ||||
-rw-r--r-- | src/test/ui/sepcomp/sepcomp-extern.rs | 33 | ||||
-rw-r--r-- | src/test/ui/sepcomp/sepcomp-fns-backwards.rs | 33 | ||||
-rw-r--r-- | src/test/ui/sepcomp/sepcomp-fns.rs | 30 | ||||
-rw-r--r-- | src/test/ui/sepcomp/sepcomp-lib-lto.rs | 19 | ||||
-rw-r--r-- | src/test/ui/sepcomp/sepcomp-lib.rs | 16 | ||||
-rw-r--r-- | src/test/ui/sepcomp/sepcomp-statics.rs | 31 | ||||
-rw-r--r-- | src/test/ui/sepcomp/sepcomp-unwind.rs | 35 |
11 files changed, 261 insertions, 0 deletions
diff --git a/src/test/ui/sepcomp/auxiliary/sepcomp-extern-lib.rs b/src/test/ui/sepcomp/auxiliary/sepcomp-extern-lib.rs new file mode 100644 index 000000000..73fb5e8f3 --- /dev/null +++ b/src/test/ui/sepcomp/auxiliary/sepcomp-extern-lib.rs @@ -0,0 +1,4 @@ +#[no_mangle] +pub extern "C" fn foo() -> usize { + 1234 +} diff --git a/src/test/ui/sepcomp/auxiliary/sepcomp_cci_lib.rs b/src/test/ui/sepcomp/auxiliary/sepcomp_cci_lib.rs new file mode 100644 index 000000000..64e34a56d --- /dev/null +++ b/src/test/ui/sepcomp/auxiliary/sepcomp_cci_lib.rs @@ -0,0 +1,6 @@ +#[inline] +pub fn cci_fn() -> usize { + 1200 +} + +pub const CCI_CONST: usize = 34; diff --git a/src/test/ui/sepcomp/auxiliary/sepcomp_lib.rs b/src/test/ui/sepcomp/auxiliary/sepcomp_lib.rs new file mode 100644 index 000000000..1536228c2 --- /dev/null +++ b/src/test/ui/sepcomp/auxiliary/sepcomp_lib.rs @@ -0,0 +1,21 @@ +// compile-flags: -C codegen-units=3 --crate-type=rlib,dylib -g + +pub mod a { + pub fn one() -> usize { + 1 + } +} + +pub mod b { + pub fn two() -> usize { + 2 + } +} + +pub mod c { + use a::one; + use b::two; + pub fn three() -> usize { + one() + two() + } +} diff --git a/src/test/ui/sepcomp/sepcomp-cci.rs b/src/test/ui/sepcomp/sepcomp-cci.rs new file mode 100644 index 000000000..02bbab30e --- /dev/null +++ b/src/test/ui/sepcomp/sepcomp-cci.rs @@ -0,0 +1,33 @@ +// run-pass +// compile-flags: -C codegen-units=3 +// aux-build:sepcomp_cci_lib.rs + +// Test accessing cross-crate inlined items from multiple compilation units. + + +extern crate sepcomp_cci_lib; +use sepcomp_cci_lib::{cci_fn, CCI_CONST}; + +fn call1() -> usize { + cci_fn() + CCI_CONST +} + +mod a { + use sepcomp_cci_lib::{cci_fn, CCI_CONST}; + pub fn call2() -> usize { + cci_fn() + CCI_CONST + } +} + +mod b { + use sepcomp_cci_lib::{cci_fn, CCI_CONST}; + pub fn call3() -> usize { + cci_fn() + CCI_CONST + } +} + +fn main() { + assert_eq!(call1(), 1234); + assert_eq!(a::call2(), 1234); + assert_eq!(b::call3(), 1234); +} diff --git a/src/test/ui/sepcomp/sepcomp-extern.rs b/src/test/ui/sepcomp/sepcomp-extern.rs new file mode 100644 index 000000000..6323bf664 --- /dev/null +++ b/src/test/ui/sepcomp/sepcomp-extern.rs @@ -0,0 +1,33 @@ +// run-pass +// compile-flags: -C codegen-units=3 +// aux-build:sepcomp-extern-lib.rs + +// Test accessing external items from multiple compilation units. + +extern crate sepcomp_extern_lib; + +extern "C" { + fn foo() -> usize; +} + +fn call1() -> usize { + unsafe { foo() } +} + +mod a { + pub fn call2() -> usize { + unsafe { ::foo() } + } +} + +mod b { + pub fn call3() -> usize { + unsafe { ::foo() } + } +} + +fn main() { + assert_eq!(call1(), 1234); + assert_eq!(a::call2(), 1234); + assert_eq!(b::call3(), 1234); +} diff --git a/src/test/ui/sepcomp/sepcomp-fns-backwards.rs b/src/test/ui/sepcomp/sepcomp-fns-backwards.rs new file mode 100644 index 000000000..f56769e2b --- /dev/null +++ b/src/test/ui/sepcomp/sepcomp-fns-backwards.rs @@ -0,0 +1,33 @@ +// run-pass +#![allow(dead_code)] +// compile-flags: -C codegen-units=3 + +// Test references to items that haven't been codegened yet. + +// Generate some code in the first compilation unit before declaring any +// modules. This ensures that the first module doesn't go into the same +// compilation unit as the top-level module. + +fn pad() -> usize { 0 } + +mod b { + pub fn three() -> usize { + ::one() + ::a::two() + } +} + +mod a { + pub fn two() -> usize { + ::one() + ::one() + } +} + +fn one() -> usize { + 1 +} + +fn main() { + assert_eq!(one(), 1); + assert_eq!(a::two(), 2); + assert_eq!(b::three(), 3); +} diff --git a/src/test/ui/sepcomp/sepcomp-fns.rs b/src/test/ui/sepcomp/sepcomp-fns.rs new file mode 100644 index 000000000..a432c8960 --- /dev/null +++ b/src/test/ui/sepcomp/sepcomp-fns.rs @@ -0,0 +1,30 @@ +// run-pass +// compile-flags: -C codegen-units=3 + +// Test basic separate compilation functionality. The functions should be able +// to call each other even though they will be placed in different compilation +// units. + +// Generate some code in the first compilation unit before declaring any +// modules. This ensures that the first module doesn't go into the same +// compilation unit as the top-level module. + +fn one() -> usize { 1 } + +mod a { + pub fn two() -> usize { + ::one() + ::one() + } +} + +mod b { + pub fn three() -> usize { + ::one() + ::a::two() + } +} + +fn main() { + assert_eq!(one(), 1); + assert_eq!(a::two(), 2); + assert_eq!(b::three(), 3); +} diff --git a/src/test/ui/sepcomp/sepcomp-lib-lto.rs b/src/test/ui/sepcomp/sepcomp-lib-lto.rs new file mode 100644 index 000000000..51a572899 --- /dev/null +++ b/src/test/ui/sepcomp/sepcomp-lib-lto.rs @@ -0,0 +1,19 @@ +// run-pass +// Check that we can use `-C lto` when linking against libraries that were +// separately compiled. + +// aux-build:sepcomp_lib.rs +// compile-flags: -C lto -g +// ignore-asmjs wasm2js does not support source maps yet +// no-prefer-dynamic + +extern crate sepcomp_lib; +use sepcomp_lib::a::one; +use sepcomp_lib::b::two; +use sepcomp_lib::c::three; + +fn main() { + assert_eq!(one(), 1); + assert_eq!(two(), 2); + assert_eq!(three(), 3); +} diff --git a/src/test/ui/sepcomp/sepcomp-lib.rs b/src/test/ui/sepcomp/sepcomp-lib.rs new file mode 100644 index 000000000..728dc078b --- /dev/null +++ b/src/test/ui/sepcomp/sepcomp-lib.rs @@ -0,0 +1,16 @@ +// run-pass +// aux-build:sepcomp_lib.rs + +// Test linking against a library built with -C codegen-units > 1 + + +extern crate sepcomp_lib; +use sepcomp_lib::a::one; +use sepcomp_lib::b::two; +use sepcomp_lib::c::three; + +fn main() { + assert_eq!(one(), 1); + assert_eq!(two(), 2); + assert_eq!(three(), 3); +} diff --git a/src/test/ui/sepcomp/sepcomp-statics.rs b/src/test/ui/sepcomp/sepcomp-statics.rs new file mode 100644 index 000000000..5457c8a0a --- /dev/null +++ b/src/test/ui/sepcomp/sepcomp-statics.rs @@ -0,0 +1,31 @@ +// run-pass +#![allow(dead_code)] +// compile-flags: -C codegen-units=3 + +// Test references to static items across compilation units. + + +fn pad() -> usize { 0 } + +const ONE: usize = 1; + +mod b { + // Separate compilation always switches to the LLVM module with the fewest + // instructions. Make sure we have some instructions in this module so + // that `a` and `b` don't go into the same compilation unit. + fn pad() -> usize { 0 } + + pub static THREE: usize = ::ONE + ::a::TWO; +} + +mod a { + fn pad() -> usize { 0 } + + pub const TWO: usize = ::ONE + ::ONE; +} + +fn main() { + assert_eq!(ONE, 1); + assert_eq!(a::TWO, 2); + assert_eq!(b::THREE, 3); +} diff --git a/src/test/ui/sepcomp/sepcomp-unwind.rs b/src/test/ui/sepcomp/sepcomp-unwind.rs new file mode 100644 index 000000000..a59e25a27 --- /dev/null +++ b/src/test/ui/sepcomp/sepcomp-unwind.rs @@ -0,0 +1,35 @@ +// run-pass +// needs-unwind +#![allow(dead_code)] +// compile-flags: -C codegen-units=3 +// ignore-emscripten no threads support + +// Test unwinding through multiple compilation units. + +// According to acrichto, in the distant past `ld -r` (which is used during +// linking when codegen-units > 1) was known to produce object files with +// damaged unwinding tables. This may be related to GNU binutils bug #6893 +// ("Partial linking results in corrupt .eh_frame_hdr"), but I'm not certain. +// In any case, this test should let us know if enabling parallel codegen ever +// breaks unwinding. + + +use std::thread; + +fn pad() -> usize { 0 } + +mod a { + pub fn f() { + panic!(); + } +} + +mod b { + pub fn g() { + ::a::f(); + } +} + +fn main() { + thread::spawn(move|| { ::b::g() }).join().unwrap_err(); +} |