Skip to content

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 cmakes ./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?

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information