TLS initializers, for example constructors of thread-local variables, don't necessarily get called. If a thread was created before a module is loaded, the module's TLS initializers are not executed for this particular thread.
This is why Microsoft added support for dynamic TLS initialization. Before every use of thread-local variables, a check is added that runs the module's TLS initializers on-demand.
To do this, the method __dyn_tls_on_demand_init gets called. Internally, it simply calls __dyn_tls_init.
No additional TLS initializer that sets the guard needs to be emitted, as the guard always gets set by __dyn_tls_init.
The guard is also checked again within __dyn_tls_init. This makes our check redundant, however, as Microsoft's compiler also emits this check, the behaviour is adopted here.
Should this depend on the MSVC compatibility version?