bootstrap build fails on fresh gcc-16 due to more aggressive devirtualization
gcc-16
from current master
added more aggressive devirtualization mode in https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=9ee937b2f92a930eb5407260a56e5fe0fa137e85 (instead of speculating to one possible target gcc
now considers three targets by default). I think it's a reasonable change.
The problem is that cmake
s ./bootstrap
script does not use all of cmake
.cxx
source files at build time, but does use quite a few header files (without corresponding .cxx
files).
As a result the bootstrap build on gcc-16
fails as:
$ mkdir build && cd build && ../bootstrap && make
...
g++ -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 -DCMAKE_BOOTSTRAP -DCMake_HAVE_CXX_MAKE_UNIQUE=1 -DCMake_HAVE_CXX_FILESYSTEM=1 -I/mnt/archive/big/git/CMake/build/Bootstrap.cmk -I/mnt/archive/big/git/CMake/Source -I/mnt/archive/big/git/CMake/Source/LexerParser -I/mnt/archive/big/git/CMake/Utilities/std -I/mnt/archive/big/git/CMake/Utilities cmAddCompileDefinitionsCommand.o cmAddCustomCommandCommand.o cmAddCustomTargetCommand.o cmAddDefinitionsCommand.o cmAddDependenciesCommand.o cmAddExecutableCommand.o cmAddLibraryCommand.o cmAddSubDirectoryCommand.o cmAddTestCommand.o cmArgumentParser.o cmBinUtilsLinker.o cmBinUtilsLinuxELFGetRuntimeDependenciesTool.o cmBinUtilsLinuxELFLinker.o cmBinUtilsLinuxELFObjdumpGetRuntimeDependenciesTool.o cmBinUtilsMacOSMachOGetRuntimeDependenciesTool.o cmBinUtilsMacOSMachOLinker.o cmBinUtilsMacOSMachOOToolGetRuntimeDependenciesTool.o cmBinUtilsWindowsPEGetRuntimeDependenciesTool.o cmBinUtilsWindowsPEDumpbinGetRuntimeDependenciesTool.o cmBinUtilsWindowsPELinker.o cmBinUtilsWindowsPEObjdumpGetRuntimeDependenciesTool.o cmBlockCommand.o cmBreakCommand.o cmBuildCommand.o cmBuildDatabase.o cmCMakeLanguageCommand.o cmCMakeMinimumRequired.o cmList.o cmCMakePath.o cmCMakePathCommand.o cmCMakePolicyCommand.o cmCPackPropertiesGenerator.o cmCacheManager.o cmCommands.o cmCommonTargetGenerator.o cmComputeComponentGraph.o cmComputeLinkDepends.o cmComputeLinkInformation.o cmComputeTargetDepends.o cmConditionEvaluator.o cmConfigureFileCommand.o cmContinueCommand.o cmCoreTryCompile.o cmCreateTestSourceList.o cmCryptoHash.o cmCustomCommand.o cmCustomCommandGenerator.o cmCustomCommandLines.o cmCxxModuleMapper.o cmCxxModuleUsageEffects.o cmDefinePropertyCommand.o cmDefinitions.o cmDocumentationFormatter.o cmELF.o cmEnableLanguageCommand.o cmEnableTestingCommand.o cmEvaluatedTargetProperty.o cmExecProgramCommand.o cmExecuteProcessCommand.o cmExpandedCommandArgument.o cmExperimental.o cmExportBuildCMakeConfigGenerator.o cmExportBuildFileGenerator.o cmExportCMakeConfigGenerator.o cmExportFileGenerator.o cmExportInstallCMakeConfigGenerator.o cmExportInstallFileGenerator.o cmExportSet.o cmExportTryCompileFileGenerator.o cmExprParserHelper.o cmExternalMakefileProjectGenerator.o cmFileCommand.o cmFileCommand_ReadMacho.o cmFileCopier.o cmFileInstaller.o cmFileSet.o cmFileTime.o cmFileTimeCache.o cmFileTimes.o cmFindBase.o cmFindCommon.o cmFindFileCommand.o cmFindLibraryCommand.o cmFindPackageCommand.o cmFindPackageStack.o cmFindPathCommand.o cmFindProgramCommand.o cmForEachCommand.o cmFunctionBlocker.o cmFunctionCommand.o cmFSPermissions.o cmGeneratedFileStream.o cmGenExContext.o cmGenExEvaluation.o cmGeneratorExpression.o cmGeneratorExpressionDAGChecker.o cmGeneratorExpressionEvaluationFile.o cmGeneratorExpressionEvaluator.o cmGeneratorExpressionLexer.o cmGeneratorExpressionNode.o cmGeneratorExpressionParser.o cmGeneratorTarget.o cmGeneratorTarget_CompatibleInterface.o cmGeneratorTarget_IncludeDirectories.o cmGeneratorTarget_Link.o cmGeneratorTarget_LinkDirectories.o cmGeneratorTarget_Options.o cmGeneratorTarget_Sources.o cmGeneratorTarget_TargetPropertyEntry.o cmGeneratorTarget_TransitiveProperty.o cmGetCMakePropertyCommand.o cmGetDirectoryPropertyCommand.o cmGetFilenameComponentCommand.o cmGetPipes.o cmGetPropertyCommand.o cmGetSourceFilePropertyCommand.o cmGetTargetPropertyCommand.o cmGetTestPropertyCommand.o cmGlobalCommonGenerator.o cmGlobalGenerator.o cmGlobVerificationManager.o cmHexFileConverter.o cmIfCommand.o cmImportedCxxModuleInfo.o cmIncludeCommand.o cmIncludeGuardCommand.o cmIncludeDirectoryCommand.o cmIncludeRegularExpressionCommand.o cmInstallCMakeConfigExportGenerator.o cmInstallCommand.o cmInstallCommandArguments.o cmInstallCxxModuleBmiGenerator.o cmInstallDirectoryGenerator.o cmInstallExportGenerator.o cmInstallFileSetGenerator.o cmInstallFilesCommand.o cmInstallFilesGenerator.o cmInstallGenerator.o cmInstallGetRuntimeDependenciesGenerator.o cmInstallImportedRuntimeArtifactsGenerator.o cmInstallRuntimeDependencySet.o cmInstallRuntimeDependencySetGenerator.o cmInstallScriptGenerator.o cmInstallSubdirectoryGenerator.o cmInstallTargetGenerator.o cmInstallTargetsCommand.o cmInstalledFile.o cmJSONHelpers.o cmJSONState.o cmLDConfigLDConfigTool.o cmLDConfigTool.o cmLinkDirectoriesCommand.o cmLinkItem.o cmLinkItemGraphVisitor.o cmLinkLineComputer.o cmLinkLineDeviceComputer.o cmListCommand.o cmListFileCache.o cmLocalCommonGenerator.o cmLocalGenerator.o cmMSVC60LinkLineComputer.o cmMacroCommand.o cmMakeDirectoryCommand.o cmMakefile.o cmMarkAsAdvancedCommand.o cmMathCommand.o cmMessageCommand.o cmMessenger.o cmNewLineStyle.o cmOSXBundleGenerator.o cmOptionCommand.o cmOrderDirectories.o cmObjectLocation.o cmOutputConverter.o cmParseArgumentsCommand.o cmPathLabel.o cmPathResolver.o cmPolicies.o cmProcessOutput.o cmProjectCommand.o cmValue.o cmPropertyDefinition.o cmPropertyMap.o cmGccDepfileLexerHelper.o cmGccDepfileReader.o cmReturnCommand.o cmPackageInfoReader.o cmPlaceholderExpander.o cmPlistParser.o cmRulePlaceholderExpander.o cmRuntimeDependencyArchive.o cmScriptGenerator.o cmSearchPath.o cmSeparateArgumentsCommand.o cmSetCommand.o cmSetDirectoryPropertiesCommand.o cmSetPropertyCommand.o cmSetSourceFilesPropertiesCommand.o cmSetTargetPropertiesCommand.o cmSetTestsPropertiesCommand.o cmSiteNameCommand.o cmSourceFile.o cmSourceFileLocation.o cmStandardLevelResolver.o cmState.o cmStateDirectory.o cmStateSnapshot.o cmStdIoConsole.o cmStdIoInit.o cmStdIoStream.o cmStdIoTerminal.o cmString.o cmStringAlgorithms.o cmStringReplaceHelper.o cmStringCommand.o cmSubcommandTable.o cmSubdirCommand.o cmSystemTools.o cmTarget.o cmTargetCompileDefinitionsCommand.o cmTargetCompileFeaturesCommand.o cmTargetCompileOptionsCommand.o cmTargetIncludeDirectoriesCommand.o cmTargetLinkLibrariesCommand.o cmTargetLinkOptionsCommand.o cmTargetPrecompileHeadersCommand.o cmTargetPropCommandBase.o cmTargetPropertyComputer.o cmTargetSourcesCommand.o cmTargetTraceDependencies.o cmTest.o cmTestGenerator.o cmTimestamp.o cmTransformDepfile.o cmTryCompileCommand.o cmTryRunCommand.o cmUnsetCommand.o cmUVHandlePtr.o cmUVProcessChain.o cmVersion.o cmWhileCommand.o cmWindowsRegistry.o cmWorkingDirectory.o cmXcFramework.o cmake.o cmakemain.o cmcmd.o cm_fileno.o cmDepends.o cmDependsC.o cmDependsCompiler.o cmGlobalUnixMakefileGenerator3.o cmLocalUnixMakefileGenerator3.o cmMakefileExecutableTargetGenerator.o cmMakefileLibraryTargetGenerator.o cmMakefileTargetGenerator.o cmMakefileUtilityTargetGenerator.o cmProcessTools.o cm_utf8.o fs_path.o string_view.o cmExprLexer.o cmExprParser.o cmGccDepfileLexer.o cmListFileLexer.o Directory.o EncodingCXX.o FStream.o Glob.o RegularExpression.o Status.o SystemTools.o EncodingC.o ProcessUNIX.o String.o System.o uv-src-strscpy.c.o uv-src-strtok.c.o uv-src-timer.c.o uv-src-uv-common.c.o uv-src-unix-cmake-bootstrap.c.o uv-src-unix-core.c.o uv-src-unix-fs.c.o uv-src-unix-loop.c.o uv-src-unix-loop-watcher.c.o uv-src-unix-no-fsevents.c.o uv-src-unix-pipe.c.o uv-src-unix-poll.c.o uv-src-unix-posix-hrtime.c.o uv-src-unix-posix-poll.c.o uv-src-unix-process.c.o uv-src-unix-signal.c.o uv-src-unix-stream.c.o uv-src-unix-tcp.c.o uv-src-unix-tty.c.o rhash-librhash-algorithms.c.o rhash-librhash-byte_order.c.o rhash-librhash-hex.c.o rhash-librhash-md5.c.o rhash-librhash-rhash.c.o rhash-librhash-sha1.c.o rhash-librhash-sha256.c.o rhash-librhash-sha3.c.o rhash-librhash-sha512.c.o rhash-librhash-util.c.o jsoncpp-src-lib_json-json_reader.cpp.o jsoncpp-src-lib_json-json_value.cpp.o jsoncpp-src-lib_json-json_writer.cpp.o -ldl -lrt -o cmake
ld: cmake.o: in function `cmake::CreateGlobalGenerator(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
cmake.cxx:(.text+0xb334): undefined reference to `cmGlobalGhsMultiGenerator::cmGlobalGhsMultiGenerator(cmake*)'
ld: cmake.o: in function `cmake::AppendGlobalGeneratorsDocumentation(std::vector<cmDocumentationEntry, std::allocator<cmDocumentationEntry> >&)':
cmake.cxx:(.text+0x10449): undefined reference to `cmGlobalGhsMultiGenerator::GetDocumentation()'
ld: cmake.o: in function `cmGlobalGeneratorSimpleFactory<cmGlobalGhsMultiGenerator>::GetDocumentation() const':
cmake.cxx:(.text._ZNK30cmGlobalGeneratorSimpleFactoryI25cmGlobalGhsMultiGeneratorE16GetDocumentationEv[_ZNK30cmGlobalGeneratorSimpleFactoryI25cmGlobalGhsMultiGeneratorE16GetDocumentationEv]+0x1a): undefined reference to `cmGlobalGhsMultiGenerator::GetDocumentation()'
ld: cmake.o: in function `cmGlobalGeneratorSimpleFactory<cmGlobalGhsMultiGenerator>::CreateGlobalGenerator(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cmake*) const':
cmake.cxx:(.text._ZNK30cmGlobalGeneratorSimpleFactoryI25cmGlobalGhsMultiGeneratorE21CreateGlobalGeneratorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP5cmake[_ZNK30cmGlobalGeneratorSimpleFactoryI25cmGlobalGhsMultiGeneratorE21CreateGlobalGeneratorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEP5cmake]+0x10e): undefined reference to `cmGlobalGhsMultiGenerator::cmGlobalGhsMultiGenerator(cmake*)'
collect2: error: ld returned 1 exit status
make: *** [Makefile:2: cmake] Error 1 shuffle=2303559880
The build succeeds if I inject into build process the --param=max-devirt-targets=1
build flag.
What would be a reasonable fix here? Should cmake
use more aggressive #ifdef
in ./bootstrap
mode to avoid looking at the headers without the method implementations to prevent devirtualizer from speculating on them?