Skip to content

gcc 16.x speculative devirtualization is problematic (ArchLinux 2026.07.01, Fedora 44...) #44

Description

@m0rb

gcc's -fdevirtualize-speculatively is on by default with optimization levels >= 2 and generates direct references to vtables of derived types

Fedora 44 and Arch bork almost exactly the same way:

[673/678] Linking CXX executable /home/morb/build/Prey2006/output/linux/prey06
FAILED: [code=1] /home/morb/build/Prey2006/output/linux/prey06
: && /usr/bin/c++ -Werror=dangling-reference -Woverloaded-virtual -Wno-class-memaccess -Wno-c++20-compat -O2 -g -DNDEBUG -g -O3 -ffp-contract=off -fomit-frame-pointer -fno-math-errno -fno-trapping-math -Wl,--dependency-file=CMakeFiles/prey06.dir/link.d CMakeFiles/prey06.dir/aas/AASFile.cpp.o CMakeFiles/prey06.dir/aas/AASFile_optimize.cpp.o CMakeFiles/prey06.dir/aas/AASFile_sample.cpp.o CMakeFiles/prey06.dir/aas/AASFileManager.cpp.o CMakeFiles/prey06.dir/renderer/Cinematic.cpp.o CMakeFiles/prey06.dir/renderer/DeviceContext.cpp.o CMakeFiles/prey06.dir/renderer/GuiModel.cpp.o CMakeFiles/prey06.dir/renderer/Image_files.cpp.o CMakeFiles/prey06.dir/renderer/Image_init.cpp.o CMakeFiles/prey06.dir/renderer/Image_load.cpp.o CMakeFiles/prey06.dir/renderer/Image_process.cpp.o CMakeFiles/prey06.dir/renderer/Image_program.cpp.o CMakeFiles/prey06.dir/renderer/Interaction.cpp.o CMakeFiles/prey06.dir/renderer/Material.cpp.o CMakeFiles/prey06.dir/renderer/MegaTexture.cpp.o CMakeFiles/prey06.dir/renderer/Model.cpp.o CMakeFiles/prey06.dir/renderer/ModelDecal.cpp.o CMakeFiles/prey06.dir/renderer/ModelManager.cpp.o CMakeFiles/prey06.dir/renderer/ModelOverlay.cpp.o CMakeFiles/prey06.dir/renderer/Model_beam.cpp.o CMakeFiles/prey06.dir/renderer/Model_hhBeam.cpp.o CMakeFiles/prey06.dir/renderer/Model_ase.cpp.o CMakeFiles/prey06.dir/renderer/Model_liquid.cpp.o CMakeFiles/prey06.dir/renderer/Model_lwo.cpp.o CMakeFiles/prey06.dir/renderer/Model_md3.cpp.o CMakeFiles/prey06.dir/renderer/Model_md5.cpp.o CMakeFiles/prey06.dir/renderer/Model_prt.cpp.o CMakeFiles/prey06.dir/renderer/Model_sprite.cpp.o CMakeFiles/prey06.dir/renderer/RenderEntity.cpp.o CMakeFiles/prey06.dir/renderer/RenderSystem.cpp.o CMakeFiles/prey06.dir/renderer/RenderSystem_init.cpp.o CMakeFiles/prey06.dir/renderer/RenderWorld.cpp.o CMakeFiles/prey06.dir/renderer/RenderWorld_demo.cpp.o CMakeFiles/prey06.dir/renderer/RenderWorld_load.cpp.o CMakeFiles/prey06.dir/renderer/RenderWorld_portals.cpp.o CMakeFiles/prey06.dir/renderer/stblib_impls.c.o CMakeFiles/prey06.dir/renderer/VertexCache.cpp.o CMakeFiles/prey06.dir/renderer/draw_arb2.cpp.o CMakeFiles/prey06.dir/renderer/draw_common.cpp.o CMakeFiles/prey06.dir/renderer/tr_backend.cpp.o CMakeFiles/prey06.dir/renderer/tr_deform.cpp.o CMakeFiles/prey06.dir/renderer/tr_font.cpp.o CMakeFiles/prey06.dir/renderer/tr_guisurf.cpp.o CMakeFiles/prey06.dir/renderer/tr_light.cpp.o CMakeFiles/prey06.dir/renderer/tr_lightrun.cpp.o CMakeFiles/prey06.dir/renderer/tr_main.cpp.o CMakeFiles/prey06.dir/renderer/tr_orderIndexes.cpp.o CMakeFiles/prey06.dir/renderer/tr_polytope.cpp.o CMakeFiles/prey06.dir/renderer/tr_render.cpp.o CMakeFiles/prey06.dir/renderer/tr_rendertools.cpp.o CMakeFiles/prey06.dir/renderer/tr_shadowbounds.cpp.o CMakeFiles/prey06.dir/renderer/tr_stencilshadow.cpp.o CMakeFiles/prey06.dir/renderer/tr_subview.cpp.o CMakeFiles/prey06.dir/renderer/tr_trace.cpp.o CMakeFiles/prey06.dir/renderer/tr_trisurf.cpp.o CMakeFiles/prey06.dir/renderer/tr_mikktspace.cpp.o CMakeFiles/prey06.dir/renderer/tr_turboshadow.cpp.o CMakeFiles/prey06.dir/libs/mikktspace/mikktspace.c.o CMakeFiles/prey06.dir/framework/CVarSystem.cpp.o CMakeFiles/prey06.dir/framework/CmdSystem.cpp.o CMakeFiles/prey06.dir/framework/Common.cpp.o CMakeFiles/prey06.dir/framework/Compressor.cpp.o CMakeFiles/prey06.dir/framework/Console.cpp.o CMakeFiles/prey06.dir/framework/ConsoleHistory.cpp.o CMakeFiles/prey06.dir/framework/DemoFile.cpp.o CMakeFiles/prey06.dir/framework/DeclAF.cpp.o CMakeFiles/prey06.dir/framework/DeclEntityDef.cpp.o CMakeFiles/prey06.dir/framework/DeclFX.cpp.o CMakeFiles/prey06.dir/framework/DeclManager.cpp.o CMakeFiles/prey06.dir/framework/DeclParticle.cpp.o CMakeFiles/prey06.dir/framework/DeclPreyBeam.cpp.o CMakeFiles/prey06.dir/framework/DeclSkin.cpp.o CMakeFiles/prey06.dir/framework/DeclTable.cpp.o CMakeFiles/prey06.dir/framework/Dhewm3SettingsMenu.cpp.o CMakeFiles/prey06.dir/framework/Dhewm3ServerBrowserMenu.cpp.o CMakeFiles/prey06.dir/framework/EditField.cpp.o CMakeFiles/prey06.dir/framework/EventLoop.cpp.o CMakeFiles/prey06.dir/framework/File.cpp.o CMakeFiles/prey06.dir/framework/FileSystem.cpp.o CMakeFiles/prey06.dir/framework/KeyInput.cpp.o CMakeFiles/prey06.dir/framework/UsercmdGen.cpp.o CMakeFiles/prey06.dir/framework/Session_menu.cpp.o CMakeFiles/prey06.dir/framework/Session.cpp.o CMakeFiles/prey06.dir/framework/async/AsyncClient.cpp.o CMakeFiles/prey06.dir/framework/async/AsyncNetwork.cpp.o CMakeFiles/prey06.dir/framework/async/AsyncServer.cpp.o CMakeFiles/prey06.dir/framework/async/MasterServerList.cpp.o CMakeFiles/prey06.dir/framework/async/MsgChannel.cpp.o CMakeFiles/prey06.dir/framework/async/NetworkSystem.cpp.o CMakeFiles/prey06.dir/framework/async/ServerScan.cpp.o CMakeFiles/prey06.dir/framework/miniz/miniz.c.o CMakeFiles/prey06.dir/framework/minizip/ioapi.c.o CMakeFiles/prey06.dir/framework/minizip/unzip.cpp.o CMakeFiles/prey06.dir/cm/CollisionModel_contacts.cpp.o CMakeFiles/prey06.dir/cm/CollisionModel_contents.cpp.o CMakeFiles/prey06.dir/cm/CollisionModel_debug.cpp.o CMakeFiles/prey06.dir/cm/CollisionModel_files.cpp.o CMakeFiles/prey06.dir/cm/CollisionModel_load.cpp.o CMakeFiles/prey06.dir/cm/CollisionModel_rotate.cpp.o CMakeFiles/prey06.dir/cm/CollisionModel_trace.cpp.o CMakeFiles/prey06.dir/cm/CollisionModel_translate.cpp.o CMakeFiles/prey06.dir/tools/compilers/dmap/dmap.cpp.o CMakeFiles/prey06.dir/tools/compilers/dmap/facebsp.cpp.o CMakeFiles/prey06.dir/tools/compilers/dmap/leakfile.cpp.o CMakeFiles/prey06.dir/tools/compilers/dmap/map.cpp.o CMakeFiles/prey06.dir/tools/compilers/dmap/optimize.cpp.o CMakeFiles/prey06.dir/tools/compilers/dmap/output.cpp.o CMakeFiles/prey06.dir/tools/compilers/dmap/portals.cpp.o CMakeFiles/prey06.dir/tools/compilers/dmap/shadowopt3.cpp.o CMakeFiles/prey06.dir/tools/compilers/dmap/tritjunction.cpp.o CMakeFiles/prey06.dir/tools/compilers/dmap/tritools.cpp.o CMakeFiles/prey06.dir/tools/compilers/dmap/ubrush.cpp.o CMakeFiles/prey06.dir/tools/compilers/dmap/usurface.cpp.o CMakeFiles/prey06.dir/tools/compilers/aas/AASBuild.cpp.o CMakeFiles/prey06.dir/tools/compilers/aas/AASBuild_file.cpp.o CMakeFiles/prey06.dir/tools/compilers/aas/AASBuild_gravity.cpp.o CMakeFiles/prey06.dir/tools/compilers/aas/AASBuild_ledge.cpp.o CMakeFiles/prey06.dir/tools/compilers/aas/AASBuild_merge.cpp.o CMakeFiles/prey06.dir/tools/compilers/aas/AASCluster.cpp.o CMakeFiles/prey06.dir/tools/compilers/aas/AASReach.cpp.o CMakeFiles/prey06.dir/tools/compilers/aas/Brush.cpp.o CMakeFiles/prey06.dir/tools/compilers/aas/BrushBSP.cpp.o CMakeFiles/prey06.dir/tools/compilers/roqvq/NSBitmapImageRep.cpp.o CMakeFiles/prey06.dir/tools/compilers/roqvq/codec.cpp.o CMakeFiles/prey06.dir/tools/compilers/roqvq/roq.cpp.o CMakeFiles/prey06.dir/tools/compilers/roqvq/roqParam.cpp.o CMakeFiles/prey06.dir/tools/compilers/renderbump/renderbump.cpp.o CMakeFiles/prey06.dir/tools/compilers/matbuild/matbuild.cpp.o CMakeFiles/prey06.dir/sound/snd_cache.cpp.o CMakeFiles/prey06.dir/sound/snd_decoder.cpp.o CMakeFiles/prey06.dir/sound/snd_efxfile.cpp.o CMakeFiles/prey06.dir/sound/snd_emitter.cpp.o CMakeFiles/prey06.dir/sound/snd_reverb.cpp.o CMakeFiles/prey06.dir/sound/snd_shader.cpp.o CMakeFiles/prey06.dir/sound/snd_system.cpp.o CMakeFiles/prey06.dir/sound/snd_wavefile.cpp.o CMakeFiles/prey06.dir/sound/snd_world.cpp.o CMakeFiles/prey06.dir/sound/stbvorbis_impl.c.o CMakeFiles/prey06.dir/ui/BindWindow.cpp.o CMakeFiles/prey06.dir/ui/ChoiceWindow.cpp.o CMakeFiles/prey06.dir/ui/EditWindow.cpp.o CMakeFiles/prey06.dir/ui/FieldWindow.cpp.o CMakeFiles/prey06.dir/ui/GuiScript.cpp.o CMakeFiles/prey06.dir/ui/ListGUI.cpp.o CMakeFiles/prey06.dir/ui/ListWindow.cpp.o CMakeFiles/prey06.dir/ui/MarkerWindow.cpp.o CMakeFiles/prey06.dir/ui/RegExp.cpp.o CMakeFiles/prey06.dir/ui/RenderWindow.cpp.o CMakeFiles/prey06.dir/ui/SimpleWindow.cpp.o CMakeFiles/prey06.dir/ui/SliderWindow.cpp.o CMakeFiles/prey06.dir/ui/TabContainerWindow.cpp.o CMakeFiles/prey06.dir/ui/TabWindow.cpp.o CMakeFiles/prey06.dir/ui/BackgroundImage.cpp.o CMakeFiles/prey06.dir/ui/ButtonWindow.cpp.o CMakeFiles/prey06.dir/ui/SuperWindow.cpp.o CMakeFiles/prey06.dir/ui/UserInterface.cpp.o CMakeFiles/prey06.dir/ui/Window.cpp.o CMakeFiles/prey06.dir/ui/Winvar.cpp.o CMakeFiles/prey06.dir/sys/cpu.cpp.o CMakeFiles/prey06.dir/sys/threads.cpp.o CMakeFiles/prey06.dir/sys/events.cpp.o CMakeFiles/prey06.dir/sys/sys_local.cpp.o CMakeFiles/prey06.dir/sys/posix/posix_net.cpp.o CMakeFiles/prey06.dir/sys/posix/posix_main.cpp.o CMakeFiles/prey06.dir/sys/linux/main.cpp.o CMakeFiles/prey06.dir/sys/glimp.cpp.o CMakeFiles/prey06.dir/libs/imgui/backends/imgui_impl_sdl2.cpp.o CMakeFiles/prey06.dir/libs/imgui/backends/imgui_impl_opengl2.cpp.o CMakeFiles/prey06.dir/libs/imgui/imgui.cpp.o CMakeFiles/prey06.dir/libs/imgui/imgui_draw.cpp.o CMakeFiles/prey06.dir/libs/imgui/imgui_tables.cpp.o CMakeFiles/prey06.dir/libs/imgui/imgui_widgets.cpp.o CMakeFiles/prey06.dir/libs/imgui/imgui_demo.cpp.o CMakeFiles/prey06.dir/libs/ImGuiColorTextEdit/TextEditor.cpp.o CMakeFiles/prey06.dir/sys/sys_imgui.cpp.o CMakeFiles/prey06.dir/sys/imgui_savestyle.cpp.o CMakeFiles/prey06.dir/tools/imgui/ImGuiTools.cpp.o CMakeFiles/prey06.dir/tools/imgui/util/ImGui_IdWidgets.cpp.o CMakeFiles/prey06.dir/tools/imgui/util/SyntaxRichEditCtrl.cpp.o CMakeFiles/prey06.dir/tools/imgui/util/TreeCtrl.cpp.o CMakeFiles/prey06.dir/tools/imgui/util/PathTreeCtrl.cpp.o CMakeFiles/prey06.dir/tools/imgui/util/RegistryOptions.cpp.o CMakeFiles/prey06.dir/tools/imgui/afeditor/AfEditor.cpp.o CMakeFiles/prey06.dir/tools/imgui/afeditor/AfBodyEditor.cpp.o CMakeFiles/prey06.dir/tools/imgui/afeditor/AfConstraintEditor.cpp.o CMakeFiles/prey06.dir/tools/imgui/afeditor/AfPropertyEditor.cpp.o CMakeFiles/prey06.dir/tools/imgui/lighteditor/LightEditor.cpp.o CMakeFiles/prey06.dir/tools/imgui/soundeditor/SoundEditor.cpp.o CMakeFiles/prey06.dir/tools/imgui/particleeditor/ParticleEditor.cpp.o CMakeFiles/prey06.dir/tools/imgui/scripteditor/ScriptEditor.cpp.o CMakeFiles/prey06.dir/tools/imgui/decleditor/DeclBrowser.cpp.o CMakeFiles/prey06.dir/tools/imgui/decleditor/DeclEditor.cpp.o CMakeFiles/prey06.dir/tools/imgui/decleditor/DeclNew.cpp.o CMakeFiles/prey06.dir/tools/imgui/materialeditor/MaterialEditor.cpp.o CMakeFiles/prey06.dir/tools/imgui/materialeditor/MaterialDef.cpp.o CMakeFiles/prey06.dir/tools/imgui/materialeditor/ConsoleView.cpp.o CMakeFiles/prey06.dir/tools/imgui/materialeditor/MaterialModifier.cpp.o CMakeFiles/prey06.dir/tools/imgui/materialeditor/MaterialDoc.cpp.o CMakeFiles/prey06.dir/tools/imgui/materialeditor/MaterialDocManager.cpp.o CMakeFiles/prey06.dir/tools/imgui/materialeditor/MaterialView.cpp.o CMakeFiles/prey06.dir/tools/imgui/materialeditor/MaterialEditView.cpp.o CMakeFiles/prey06.dir/tools/imgui/materialeditor/MaterialTreeView.cpp.o CMakeFiles/prey06.dir/tools/imgui/materialeditor/MaterialPropTreeView.cpp.o CMakeFiles/prey06.dir/tools/imgui/materialeditor/MaterialPreviewPropView.cpp.o CMakeFiles/prey06.dir/tools/imgui/materialeditor/MaterialPreviewView.cpp.o CMakeFiles/prey06.dir/tools/imgui/materialeditor/StageView.cpp.o CMakeFiles/prey06.dir/tools/imgui/materialeditor/MEOptions.cpp.o CMakeFiles/prey06.dir/tools/imgui/materialeditor/MEMainFrame.cpp.o CMakeFiles/prey06.dir/tools/imgui/materialeditor/FindDialog.cpp.o CMakeFiles/prey06.dir/tools/edit_stub.cpp.o CMakeFiles/prey06.dir/tools/debugger/DebuggerBreakpoint.cpp.o CMakeFiles/prey06.dir/tools/debugger/DebuggerServer.cpp.o CMakeFiles/prey06.dir/tools/debugger/DebuggerScript.cpp.o CMakeFiles/prey06.dir/tools/debugger/debugger.cpp.o -o /home/morb/build/Prey2006/output/linux/prey06  libidlib.a  /usr/lib64/libopenal.so  -lSDL2  -ldl  -lrt  -lgcc_s_asneeded  -lgcc_s_asneeded && :
/usr/bin/ld.bfd: CMakeFiles/prey06.dir/renderer/Material.cpp.o: in function `hhProfilerGraph::~hhProfilerGraph()':
/home/morb/build/Prey2006/neo/renderer/Cinematic.h:119:(.text+0x404): undefined reference to `vtable for hhProfilerGraph'
/usr/bin/ld.bfd: /home/morb/build/Prey2006/neo/renderer/Cinematic.h:119:(.text+0x4114): undefined reference to `vtable for hhProfilerGraph'
/usr/bin/ld.bfd: /home/morb/build/Prey2006/neo/renderer/Cinematic.h:119:(.text._ZN15hhProfilerGraphD0Ev[_ZN15hhProfilerGraphD5Ev]+0x7): undefined reference to `vtable for hhProfilerGraph'
/usr/bin/ld.bfd: CMakeFiles/prey06.dir/renderer/Material.cpp.o: in function `hhProfilerGraph::~hhProfilerGraph()':
/home/morb/build/Prey2006/neo/renderer/Cinematic.h:119:(.text._ZN15hhProfilerGraphD2Ev[_ZN15hhProfilerGraphD5Ev]+0x3): undefined reference to `vtable for hhProfilerGraph'
/usr/bin/ld.bfd: CMakeFiles/prey06.dir/renderer/RenderSystem_init.cpp.o: in function `hhProfilerGraph::~hhProfilerGraph()':
/home/morb/build/Prey2006/neo/renderer/Cinematic.h:119:(.text+0x1333): undefined reference to `vtable for hhProfilerGraph'
/usr/bin/ld.bfd: CMakeFiles/prey06.dir/renderer/RenderSystem_init.cpp.o:/home/morb/build/Prey2006/neo/renderer/Cinematic.h:119: more undefined references to `vtable for hhProfilerGraph' follow
collect2: error: ld returned 1 exit status
[676/678] Building CXX object CMakeFiles/prey06ded.dir/ui/Window.cpp.o
ninja: build stopped: subcommand failed.

A current workaround is for users to add -fno-devirtualize-speculatively to their CXXFLAGS (i.e. cmake -B build neo -DCMAKE_CXX_FLAGS="-fno-devirtualize-speculatively")

Eventually this will require attention as more users out there will have newer compiler suites / toolchains with aggressive optimizations.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions