| //! Test if compilation with has-thread-local=false works, and if the output |
| //! has indeed no fast TLS variables. |
| |
| //@ only-apple |
| |
| use run_make_support::serde_json::{self, Value}; |
| use run_make_support::{cargo, llvm_nm, rfs, rustc}; |
| |
| fn main() { |
| let output = |
| rustc().print("target-spec-json").args(["-Z", "unstable-options"]).run().stdout_utf8(); |
| |
| let mut target_json: Value = serde_json::from_str(&output).unwrap(); |
| let has_thread_local = &mut target_json["has-thread-local"]; |
| assert!(matches!(has_thread_local, Value::Bool(true)), "{:?}", has_thread_local); |
| *has_thread_local = Value::Bool(false); |
| |
| let out_path = "t.json"; |
| rfs::write(out_path, serde_json::to_string(&target_json).unwrap()); |
| |
| cargo() |
| .args([ |
| "b", |
| "--manifest-path", |
| "tls_test/Cargo.toml", |
| "--target", |
| "t.json", |
| "-Zbuild-std=std,core,panic_abort", |
| ]) |
| .run(); |
| |
| // If a binary has any fast TLS variables, it should also contain the symbols |
| // __tlv_bootstrap and __tlv_atexit. We don't want them. |
| let output = llvm_nm().arg("tls_test/target/t/debug/tls_test").run().stdout_utf8(); |
| assert!(!output.contains("_tlv_bootstrap")); |
| assert!(!output.contains("_tlv_atexit")); |
| } |