forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of rust-lang#104679 - dvdhrm:rw/dso, r=petrochenkov
codegen-llvm: never combine DSOLocal and DllImport Prevent DllImport from being attached to DSOLocal definitions in the LLVM IR. The combination makes no sense, since definitions local to the compilation unit will never be imported from external objects. Additionally, LLVM will refuse the IR if it encounters the combination (introduced in [1]): ``` if (GV.hasDLLImportStorageClass()) Assert(!GV.isDSOLocal(), "GlobalValue with DLLImport Storage is dso_local!", &GV); ``` Right now, codegen-llvm will only apply DllImport to constants and rely on call-stubs for functions. Hence, we simply extend the codegen of constants to skip DllImport for any local definitions. This was discovered when switching the EFI targets to the static relocation model [2]. With this fixed, we can start another attempt at this. [1] https://smlnj-gitlab.cs.uchicago.edu/manticore/llvm/commit/509132b368efed10bbdad825403f45e9cf1d6e38 [2] rust-lang#101656
- Loading branch information
Showing
3 changed files
with
46 additions
and
6 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,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; |
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,25 @@ | ||
// Verify linkage of external symbols in the static relocation model. | ||
// | ||
// compile-flags: -O -C relocation-model=static | ||
// aux-build: extern_decl.rs | ||
|
||
#![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 | ||
} | ||
} |