VS: Fix mapping of -Qspectre- flag

The mapping for this flag was added by commit 43aa632f57 (VS: Populate
`-Qspectre-` flag table entry for v142, 2019-01-24, v3.14.0-rc1~74^2~7).
However, it did not do anything because the special logic added by
commit bb60ed6e72 (VS: Add flag table entry for -Qspectre, 2018-10-08,
v3.13.0-rc1~4^2) to move the `SpectreMitigation` element from
`ClCompile` to the top level only handled the presence of the setting
and not its value.  Extend the special logic to carry the value too.

Fixes: #19535
This commit is contained in:
Brad King
2019-07-30 11:05:04 -04:00
parent f43a7d76c7
commit f9b7c660d7
5 changed files with 50 additions and 5 deletions

View File

@@ -1229,8 +1229,11 @@ void cmVisualStudio10TargetGenerator::WriteMSToolConfigurationValues(
if (this->IPOEnabledConfigurations.count(config) > 0) {
e1.Element("WholeProgramOptimization", "true");
}
if (this->SpectreMitigationConfigurations.count(config) > 0) {
e1.Element("SpectreMitigation", "Spectre");
{
auto s = this->SpectreMitigation.find(config);
if (s != this->SpectreMitigation.end()) {
e1.Element("SpectreMitigation", s->second);
}
}
}
@@ -2760,8 +2763,8 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions(
}
}
if (clOptions.HasFlag("SpectreMitigation")) {
this->SpectreMitigationConfigurations.insert(configName);
if (const char* s = clOptions.GetFlag("SpectreMitigation")) {
this->SpectreMitigation[configName] = s;
clOptions.RemoveFlag("SpectreMitigation");
}

View File

@@ -215,7 +215,7 @@ private:
unsigned int NsightTegraVersion[4];
bool TargetCompileAsWinRT;
std::set<std::string> IPOEnabledConfigurations;
std::set<std::string> SpectreMitigationConfigurations;
std::map<std::string, std::string> SpectreMitigation;
cmGlobalVisualStudio10Generator* const GlobalGenerator;
cmLocalVisualStudio10Generator* const LocalGenerator;
std::set<std::string> CSharpCustomCommandNames;

View File

@@ -26,3 +26,7 @@ run_cmake(VsPackageReferences)
if(CMAKE_C_COMPILER_ID STREQUAL "MSVC" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.05)
run_cmake(VsJustMyCode)
endif()
if(CMAKE_C_COMPILER_ID STREQUAL "MSVC" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.20)
run_cmake(VsSpectreMitigation)
endif()

View File

@@ -0,0 +1,30 @@
macro(VsSpectreMitigation_check tgt spectre_expect)
set(vcProjectFile "${RunCMake_TEST_BINARY_DIR}/${tgt}.vcxproj")
if(NOT EXISTS "${vcProjectFile}")
set(RunCMake_TEST_FAILED "Project file ${tgt}.vcxproj does not exist.")
return()
endif()
set(HAVE_SpectreMitigation 0)
file(STRINGS "${vcProjectFile}" lines)
foreach(line IN LISTS lines)
if(line MATCHES "^ *<SpectreMitigation>([^<>]+)</SpectreMitigation>")
set(spectre_actual "${CMAKE_MATCH_1}")
if(NOT "${spectre_actual}" STREQUAL "${spectre_expect}")
set(RunCMake_TEST_FAILED "Project file ${tgt}.vcxproj has <SpectreMitigation> '${spectre_actual}', not '${spectre_expect}'.")
return()
endif()
set(HAVE_SpectreMitigation 1)
break()
endif()
endforeach()
if(NOT HAVE_SpectreMitigation AND NOT "${spectre_expect}" STREQUAL "")
set(RunCMake_TEST_FAILED "Project file ${tgt}.vcxproj does not have a <SpectreMitigation> field.")
return()
endif()
endmacro()
VsSpectreMitigation_check(SpectreMitigationOn-C "Spectre")
VsSpectreMitigation_check(SpectreMitigationOff-C "false")

View File

@@ -0,0 +1,8 @@
set(CMAKE_CONFIGURATION_TYPES Debug)
enable_language(C)
add_library(SpectreMitigationOn-C empty.c)
target_compile_options(SpectreMitigationOn-C PRIVATE -Qspectre)
add_library(SpectreMitigationOff-C empty.c)
target_compile_options(SpectreMitigationOff-C PRIVATE -Qspectre-)