msvc: Fix TLS destructors

Just like the original article our Windows TLS support is based on predicted,
this symbol must be linked in on MSVC to pull in the necessary support for TLS
variables. This commit fixes a number of unit tests which require that TLS
destructors are run.
This commit is contained in:
Alex Crichton 2015-06-29 23:28:39 -07:00
parent 91c22b6302
commit ae0eb675db
2 changed files with 7 additions and 2 deletions

View File

@ -151,6 +151,7 @@
#![cfg_attr(windows, feature(str_utf16))]
#![cfg_attr(test, feature(float_from_str_radix, range_inclusive, float_extras))]
#![cfg_attr(test, feature(test, rustc_private, float_consts))]
#![cfg_attr(target_env = "msvc", feature(link_args))]
// Don't link to std. We are std.
#![no_std]

View File

@ -221,8 +221,8 @@ unsafe fn unregister_dtor(key: Key) -> bool {
//
// # The article mentions crazy stuff about "/INCLUDE"?
//
// It sure does! This seems to work for now, so maybe we'll just run into
// that if we start linking with msvc?
// It sure does! We include it below for MSVC targets, but it look like for GNU
// targets we don't require it.
#[link_section = ".CRT$XLB"]
#[linkage = "external"]
@ -231,6 +231,10 @@ pub static p_thread_callback: unsafe extern "system" fn(LPVOID, DWORD,
LPVOID) =
on_tls_callback;
#[cfg(target_env = "msvc")]
#[link_args = "/INCLUDE:_tls_used"]
extern {}
#[allow(warnings)]
unsafe extern "system" fn on_tls_callback(h: LPVOID,
dwReason: DWORD,