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.
Auto merge of rust-lang#60260 - videolabs:rust_uwp2, r=alexcrichton
Add support for UWP targets Hi, This pull request aims at adding support for UWP (Universal Windows Apps) platform. A few notes: - This requires a very recent mingw-w64 version (containing this commit and the previous related ones: mirror/mingw-w64@e8c433c#diff-eefdfbfe9cec5f4ebab88c9a64d423a9) - This was tested using LLVM/clang rather than gcc, and so far it assumes that LLVM/clang will be the native compiler. This is mostly due to the fact that the support for exceptions/stack unwinding for UWP got much more attention in libunwind - The "uwp" part of the target needs support for it in the `cc-rs` & `backtrace-rs` crates. I'll create the MR there right after I submit this one and will link everything together, but I'm not sure what's the correct way of dealing with external dependencies in the context of rust - Enabling import libraries and copying them across stages requires a change in cargo, for which I'll open a MR right after I submit this one as well - The i686 stack unwinding is unsupported for now, because LLVM assumes SjLj, while rust seems to assume SEH will be used. I'm unsure how to fix this Also, this is my first encounter with rust, so please bear with my code, it might not feel so idiomatic or even correct :) I'm pretty sure there's a way of doing things in a cleaner way when it comes to win/c.rs, maybe having a UWP & desktop specific modules, and import those conditionally? It doesn't feel right to sprinkle `#[cfg(...)]` all over the place Off course, I'll gladly update anything you see fit (to the extent of my abilities/knowledge :) )! Thanks,
- Loading branch information
Showing
20 changed files
with
529 additions
and
117 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
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,27 @@ | ||
use crate::spec::{LinkerFlavor, Target, TargetResult}; | ||
|
||
pub fn target() -> TargetResult { | ||
let mut base = super::windows_uwp_base::opts(); | ||
base.cpu = "pentium4".to_string(); | ||
base.max_atomic_width = Some(64); | ||
base.eliminate_frame_pointer = false; // Required for backtraces | ||
|
||
// Mark all dynamic libraries and executables as compatible with the larger 4GiB address | ||
// space available to x86 Windows binaries on x86_64. | ||
base.pre_link_args | ||
.get_mut(&LinkerFlavor::Gcc).unwrap().push("-Wl,--large-address-aware".to_string()); | ||
|
||
Ok(Target { | ||
llvm_target: "i686-pc-windows-gnu".to_string(), | ||
target_endian: "little".to_string(), | ||
target_pointer_width: "32".to_string(), | ||
target_c_int_width: "32".to_string(), | ||
data_layout: "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32".to_string(), | ||
arch: "x86".to_string(), | ||
target_os: "windows".to_string(), | ||
target_env: "gnu".to_string(), | ||
target_vendor: "uwp".to_string(), | ||
linker_flavor: LinkerFlavor::Gcc, | ||
options: base, | ||
}) | ||
} |
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,64 @@ | ||
use crate::spec::{LinkArgs, LinkerFlavor, TargetOptions}; | ||
use std::default::Default; | ||
|
||
pub fn opts() -> TargetOptions { | ||
let mut pre_link_args = LinkArgs::new(); | ||
pre_link_args.insert(LinkerFlavor::Gcc, vec![ | ||
// Tell GCC to avoid linker plugins, because we are not bundling | ||
// them with Windows installer, and Rust does its own LTO anyways. | ||
"-fno-use-linker-plugin".to_string(), | ||
|
||
// Always enable DEP (NX bit) when it is available | ||
"-Wl,--nxcompat".to_string(), | ||
]); | ||
|
||
let mut late_link_args = LinkArgs::new(); | ||
late_link_args.insert(LinkerFlavor::Gcc, vec![ | ||
//"-lwinstorecompat".to_string(), | ||
//"-lmingwex".to_string(), | ||
//"-lwinstorecompat".to_string(), | ||
"-lwinstorecompat".to_string(), | ||
"-lruntimeobject".to_string(), | ||
"-lsynchronization".to_string(), | ||
"-lvcruntime140_app".to_string(), | ||
"-lucrt".to_string(), | ||
"-lwindowsapp".to_string(), | ||
"-lmingwex".to_string(), | ||
"-lmingw32".to_string(), | ||
]); | ||
|
||
TargetOptions { | ||
// FIXME(#13846) this should be enabled for windows | ||
function_sections: false, | ||
linker: Some("gcc".to_string()), | ||
dynamic_linking: true, | ||
executables: false, | ||
dll_prefix: String::new(), | ||
dll_suffix: ".dll".to_string(), | ||
exe_suffix: ".exe".to_string(), | ||
staticlib_prefix: "lib".to_string(), | ||
staticlib_suffix: ".a".to_string(), | ||
no_default_libraries: true, | ||
target_family: Some("windows".to_string()), | ||
is_like_windows: true, | ||
allows_weak_linkage: false, | ||
pre_link_args, | ||
pre_link_objects_exe: vec![ | ||
"rsbegin.o".to_string(), // Rust compiler runtime initialization, see rsbegin.rs | ||
], | ||
pre_link_objects_dll: vec![ | ||
"rsbegin.o".to_string(), | ||
], | ||
late_link_args, | ||
post_link_objects: vec![ | ||
"rsend.o".to_string(), | ||
], | ||
custom_unwind_resume: true, | ||
abi_return_struct_as_int: true, | ||
emit_debug_gdb_scripts: false, | ||
requires_uwtable: true, | ||
limit_rdylib_exports: false, | ||
|
||
.. Default::default() | ||
} | ||
} |
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,22 @@ | ||
use crate::spec::{LinkerFlavor, Target, TargetResult}; | ||
|
||
pub fn target() -> TargetResult { | ||
let mut base = super::windows_uwp_base::opts(); | ||
base.cpu = "x86-64".to_string(); | ||
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string()); | ||
base.max_atomic_width = Some(64); | ||
|
||
Ok(Target { | ||
llvm_target: "x86_64-pc-windows-gnu".to_string(), | ||
target_endian: "little".to_string(), | ||
target_pointer_width: "64".to_string(), | ||
target_c_int_width: "32".to_string(), | ||
data_layout: "e-m:w-i64:64-f80:128-n8:16:32:64-S128".to_string(), | ||
arch: "x86_64".to_string(), | ||
target_os: "windows".to_string(), | ||
target_env: "gnu".to_string(), | ||
target_vendor: "uwp".to_string(), | ||
linker_flavor: LinkerFlavor::Gcc, | ||
options: base, | ||
}) | ||
} |
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
Oops, something went wrong.