Merge pull request #426 from shuffle2/xsave-workaround-fix

Redo commit 932945d480
Fixes crashes from running on hardware with FMA3 support and software which doesn't support it.
This commit is contained in:
shuffle2 2014-05-27 13:59:50 -07:00
commit 3d21c6777e
2 changed files with 30 additions and 26 deletions

View File

@ -2,21 +2,13 @@
// Licensed under GPLv2 // Licensed under GPLv2
// Refer to the license.txt file included. // Refer to the license.txt file included.
#if defined(_WIN32) && defined(_ARCH_64) #if defined(_WIN32) && defined(_M_X86_64)
#include <math.h> #include <math.h>
#include <Windows.h> #include <Windows.h>
// This puts the rest of this translation unit into a segment which is void EnableXSaveWorkaround()
// initialized by the CRT *before* any of the other code (including C++
// static initializers).
#pragma warning(disable : 4075)
#pragma init_seg(".CRT$XCB")
struct EnableXSaveWorkaround
{ {
EnableXSaveWorkaround()
{
// Some Windows environments may have hardware support for AVX/FMA, // Some Windows environments may have hardware support for AVX/FMA,
// but the OS does not support it. The CRT math library does not support // but the OS does not support it. The CRT math library does not support
// this scenario, so we have to manually tell it not to use FMA3 // this scenario, so we have to manually tell it not to use FMA3
@ -28,13 +20,20 @@ struct EnableXSaveWorkaround
{ {
_set_FMA3_enable(0); _set_FMA3_enable(0);
} }
} }
// Create a segment which is recognized by the linker to be part of the CRT
// initialization. XI* = C startup, XC* = C++ startup. "A" placement is reserved
// for system use. Thus, the earliest we can get is XIB (C startup is before
// C++).
#pragma section(".CRT$XIB", read)
// Place a symbol in the special segment, make it have C linkage so that
// referencing it doesn't require ugly decorated names.
// Use /include:XSaveWorkaround linker flag to enable this.
extern "C" {
__declspec(allocate(".CRT$XIB"))
decltype(&EnableXSaveWorkaround) XSaveWorkaround = EnableXSaveWorkaround;
}; };
static EnableXSaveWorkaround enableXSaveWorkaround;
// N.B. Any code after this will still be in the .CRT$XCB segment. Please just
// do not append any code here unless it is intended to be executed before
// static initializers.
#endif #endif

View File

@ -106,6 +106,11 @@
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
</Link> </Link>
<!--Link Base:Application-->
<Link Condition="'$(ConfigurationType)'=='Application'">
<!--See Common/EnableXSaveWorkaround.cpp-->
<ForceSymbolReferences>XSaveWorkaround</ForceSymbolReferences>
</Link>
<Lib> <Lib>
<TreatLibWarningAsErrors>true</TreatLibWarningAsErrors> <TreatLibWarningAsErrors>true</TreatLibWarningAsErrors>
<LinkTimeCodeGeneration Condition="'$(DolphinRelease)'=='true'">true</LinkTimeCodeGeneration> <LinkTimeCodeGeneration Condition="'$(DolphinRelease)'=='true'">true</LinkTimeCodeGeneration>