Running an IR pass after all IR passes


I am finding it difficult to see how I can run an IR instrumentation pass after “all” IR passes.

I previously used opt to run my pass after linking all the llvm bitcode files and then ran llc.
I found out that llc runs some other Function passes which depend on the target.

For example, tail calls are only supported in x86 under some circumstances.

Then I tried lto and link time optimization. But I found it difficult to specify a flag option for my instrumentation pass.

Is there any way in llvm to run an IR pass after all IR passes?

Dear Rahman,

I think your best option is to modify the code in libLTO so that it runs your pass when you want it to run. I believe the file you want to modify is LTOCodeGenerator.cpp.

This does mean that passing options to your pass will be difficult or impossible. However, you can either hard-code the options you need or read them from an environment variable if there is no easy way to pass options to the libLTO.

If you want to go the llc route, then you'll need to modify the llc code so that it runs your pass instead of opt; sadly, I don't know off-hand where the code is that you would need to modify (it is either in llc or in some LLVM library somewhere). The only reason I discourage the llc route is because it is difficult to get whole-program bitcode files for large programs (e.g., Apache).


John Criswell

Thank you very much John.

With an environment variable I need to take some special care, but it looks like the only way to go.

FWIW you can pass flags to LTO by escaping it with the following when
invoking clang:


Or at least you used to be able to. That said, environment variables
can be a good fallback
for stubborn build systems that do things like strip unrecognized linker flags.


Dear Will,

Thank you,

–plugin-opt does not seem to work on my linux system. I have installed gold and configured and made LLVM under gold.