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
I see --plugin-opt=opaque-pointers is being explicitly specified for some but not all tests. I suppose the reason you explicitly specify it is to make sure the tests pass even for builds where opaque pointers are disabled. If that's the case, why aren't you doing it consistently?