Merge topic 'vs-spectre-off'

f9b7c660d7 VS: Fix mapping of `-Qspectre-` flag

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !3629
This commit is contained in:
Brad King 2019-07-31 15:41:22 +00:00 committed by Kitware Robot
commit cb88632790
5 changed files with 50 additions and 5 deletions

View File

@ -1235,8 +1235,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);
}
}
}
@ -2766,8 +2769,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

@ -28,3 +28,7 @@ run_cmake(VsDpiAwareBadParam)
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-)