GlobalVariable I inserted gets removed by LTO

Hello llvm-dev@

I have a pass that puts a global constant data array into the module. And another pass that gets runned by lld during LTO stage.

When I look at bytecode files corresponding to source TUs produced by clang -flto, I can see GVs inserted by my pass #1. However, when pass #2 gets to run, these GV’s are gone.

I figured out that passing -mllvm -compute-dead=0 to the linker fixes the problem, but I’m not sure if it is right thing to do. Ideally, I’d like to trick LTO to ignore only mine GVs during compute-dead analysis.

I even tried creating another function that “uses” created GV, but it also got deleted.

Any hints?

Thanks in advance.

You should add your GVs to the llvm.used variable or the llvm.compiler.used variable (see https://llvm.org/docs/LangRef.html#the-llvm-used-global-variable). Otherwise it looks globally dead to the linker and LTO. Look at existingcalls to llvm::appendToUsed for examples.

Teresa

You should add your GVs to the llvm.used variable or the llvm.compiler.used variable (see https://llvm.org/docs/LangRef.html#the-llvm-used-global-variable). Otherwise it looks globally dead to the linker and LTO. Look at existingcalls to llvm::appendToUsed for examples.

Teresa

Thank you, that worked!