]>
Commit | Line | Data |
---|---|---|
ba9703b0 XL |
1 | use super::super::*; |
2 | ||
29967ef6 XL |
3 | // Test target self-consistency and JSON encoding/decoding roundtrip. |
4 | pub(super) fn test_target(target: Target) { | |
5 | target.check_consistency(); | |
136023e0 | 6 | assert_eq!(Target::from_json(target.to_json()).map(|(j, _)| j), Ok(target)); |
ba9703b0 XL |
7 | } |
8 | ||
9 | impl Target { | |
10 | fn check_consistency(&self) { | |
923072b8 FG |
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"); | |
fc512014 | 15 | assert!(self.is_like_windows || !self.is_like_msvc); |
923072b8 | 16 | |
ba9703b0 | 17 | // Check that LLD with the given flavor is treated identically to the linker it emulates. |
f035d41b XL |
18 | // If your target really needs to deviate from the rules below, except it and document the |
19 | // reasons. | |
ba9703b0 XL |
20 | assert_eq!( |
21 | self.linker_flavor == LinkerFlavor::Msvc | |
22 | || self.linker_flavor == LinkerFlavor::Lld(LldFlavor::Link), | |
29967ef6 | 23 | self.lld_flavor == LldFlavor::Link, |
ba9703b0 | 24 | ); |
fc512014 | 25 | assert_eq!(self.is_like_msvc, self.lld_flavor == LldFlavor::Link); |
ba9703b0 | 26 | for args in &[ |
29967ef6 XL |
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, | |
ba9703b0 XL |
32 | ] { |
33 | assert_eq!( | |
34 | args.get(&LinkerFlavor::Msvc), | |
35 | args.get(&LinkerFlavor::Lld(LldFlavor::Link)), | |
36 | ); | |
37 | if args.contains_key(&LinkerFlavor::Msvc) { | |
29967ef6 | 38 | assert_eq!(self.lld_flavor, LldFlavor::Link); |
ba9703b0 XL |
39 | } |
40 | } | |
f035d41b | 41 | assert!( |
29967ef6 XL |
42 | (self.pre_link_objects_fallback.is_empty() |
43 | && self.post_link_objects_fallback.is_empty()) | |
44 | || self.crt_objects_fallback.is_some() | |
f035d41b | 45 | ); |
fc512014 XL |
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" | |
cdc7bbd5 | 58 | || self.llvm_target == "wasm64-unknown-unknown" |
fc512014 | 59 | || (self.env == "sgx" && self.vendor == "fortanix") |
ba9703b0 XL |
60 | } |
61 | } |