diff options
| author | David Rheinsberg <david.rheinsberg@gmail.com> | 2022-11-22 11:12:26 +0100 |
|---|---|---|
| committer | David Rheinsberg <david.rheinsberg@gmail.com> | 2022-11-29 11:21:16 +0100 |
| commit | 7b9e1a95f0ca35bde8af529639dde501a0280425 (patch) | |
| tree | 9901f90c51985d0d6ae64ee4f3bc0d272f471852 | |
| parent | a0771bdabbd23738e73a7745d1b224d53db8c826 (diff) | |
| download | rust-7b9e1a95f0ca35bde8af529639dde501a0280425.tar.gz rust-7b9e1a95f0ca35bde8af529639dde501a0280425.zip | |
test/codegen: test inter-crate linkage with static relocation
Add a codegen-test that verifies inter-crate linkage with the static relocation model. We expect all symbols that are part of a rust compilation to end up in the same DSO, thus we expect `dso_local` annotations.
| -rw-r--r-- | src/test/codegen/auxiliary/extern_decl.rs | 11 | ||||
| -rw-r--r-- | src/test/codegen/static-relocation-model-msvc.rs | 26 |
2 files changed, 37 insertions, 0 deletions
diff --git a/src/test/codegen/auxiliary/extern_decl.rs b/src/test/codegen/auxiliary/extern_decl.rs new file mode 100644 index 00000000000..edc48351869 --- /dev/null +++ b/src/test/codegen/auxiliary/extern_decl.rs @@ -0,0 +1,11 @@ +// Auxiliary crate that exports a function and static. Both always +// evaluate to `71`. We force mutability on the static to prevent +// it from being inlined as constant. + +#![crate_type = "lib"] + +#[no_mangle] +pub fn extern_fn() -> u8 { unsafe { extern_static } } + +#[no_mangle] +pub static mut extern_static: u8 = 71; diff --git a/src/test/codegen/static-relocation-model-msvc.rs b/src/test/codegen/static-relocation-model-msvc.rs new file mode 100644 index 00000000000..b2afc7deb67 --- /dev/null +++ b/src/test/codegen/static-relocation-model-msvc.rs @@ -0,0 +1,26 @@ +// Verify linkage of external symbols in the static relocation model on MSVC. +// +// compile-flags: -O -C relocation-model=static +// aux-build: extern_decl.rs +// only-x86_64-pc-windows-msvc + +#![crate_type = "rlib"] + +extern crate extern_decl; + +// The `extern_decl` definitions are imported from a statically linked rust +// crate, thus they are expected to be marked `dso_local` without `dllimport`. +// +// The `access_extern()` symbol is from this compilation unit, thus we expect +// it to be marked `dso_local` as well, given the static relocation model. +// +// CHECK: @extern_static = external dso_local local_unnamed_addr global i8 +// CHECK: define dso_local i8 @access_extern() {{.*}} +// CHECK: declare dso_local i8 @extern_fn() {{.*}} + +#[no_mangle] +pub fn access_extern() -> u8 { + unsafe { + extern_decl::extern_fn() + extern_decl::extern_static + } +} |
