LTO code may end up mixing bitcode files from various sources varying in their use of opaque pointer types. The current strategy to decide between opaque / typed pointers upon the first bitcode file loaded does not work here, since we could be loading a non-opaque bitcode file first and would then be unable to load any files with opaque pointer types later.
This enables/disables opaque pointers immediately when creating an LLVMContext for LTO. Opaque pointers are enabled by default.
- Adds an lto::Config::OpaquePointer option and enforces an upfront decision between the two modes.
- Adds -opaque-pointers/-no-opaque-pointers options to the gold plugin and lld; enabled by default.
- Adds an -lto-opaque-pointers/-lto-opaque-pointers=0 option to the llvm-lto2 tool.
- Changes the clang driver to pass -plugin-opt=no-opaque-pointers to the linker in LTO modes when clang was configured with opaque pointers disabled.
This fixes https://github.com/llvm/llvm-project/issues/55377
The default should be true here and for the LLD/LLVMgold flags, to match the Clang default and upcoming LLVM default. It's also the conservative option, because OpaquePointers=true will work fine with typed bitcode, but not the other way around. As this change disables the auto-detection, leaving the default to off would be a big footgun for anyone invoking LTO through the linker rather than the clang driver.