]> git.proxmox.com Git - rustc.git/blob - compiler/rustc_target/src/spec/tests/tests_impl.rs
New upstream version 1.63.0+dfsg1
[rustc.git] / compiler / rustc_target / src / spec / tests / tests_impl.rs
1 use super::super::*;
2
3 // Test target self-consistency and JSON encoding/decoding roundtrip.
4 pub(super) fn test_target(target: Target) {
5 target.check_consistency();
6 assert_eq!(Target::from_json(target.to_json()).map(|(j, _)| j), Ok(target));
7 }
8
9 impl Target {
10 fn check_consistency(&self) {
11 assert_eq!(self.is_like_osx, self.vendor == "apple");
12 assert_eq!(self.is_like_solaris, self.os == "solaris" || self.os == "illumos");
13 assert_eq!(self.is_like_windows, self.os == "windows" || self.os == "uefi");
14 assert_eq!(self.is_like_wasm, self.arch == "wasm32" || self.arch == "wasm64");
15 assert!(self.is_like_windows || !self.is_like_msvc);
16
17 // Check that LLD with the given flavor is treated identically to the linker it emulates.
18 // If your target really needs to deviate from the rules below, except it and document the
19 // reasons.
20 assert_eq!(
21 self.linker_flavor == LinkerFlavor::Msvc
22 || self.linker_flavor == LinkerFlavor::Lld(LldFlavor::Link),
23 self.lld_flavor == LldFlavor::Link,
24 );
25 assert_eq!(self.is_like_msvc, self.lld_flavor == LldFlavor::Link);
26 for args in &[
27 &self.pre_link_args,
28 &self.late_link_args,
29 &self.late_link_args_dynamic,
30 &self.late_link_args_static,
31 &self.post_link_args,
32 ] {
33 assert_eq!(
34 args.get(&LinkerFlavor::Msvc),
35 args.get(&LinkerFlavor::Lld(LldFlavor::Link)),
36 );
37 if args.contains_key(&LinkerFlavor::Msvc) {
38 assert_eq!(self.lld_flavor, LldFlavor::Link);
39 }
40 }
41 assert!(
42 (self.pre_link_objects_fallback.is_empty()
43 && self.post_link_objects_fallback.is_empty())
44 || self.crt_objects_fallback.is_some()
45 );
46 // Keep the default "unknown" vendor instead.
47 assert_ne!(self.vendor, "");
48 if !self.can_use_os_unknown() {
49 // Keep the default "none" for bare metal targets instead.
50 assert_ne!(self.os, "unknown");
51 }
52 }
53
54 // Add your target to the whitelist if it has `std` library
55 // and you certainly want "unknown" for the OS name.
56 fn can_use_os_unknown(&self) -> bool {
57 self.llvm_target == "wasm32-unknown-unknown"
58 || self.llvm_target == "wasm64-unknown-unknown"
59 || (self.env == "sgx" && self.vendor == "fortanix")
60 }
61 }