module passes that eliminate unused global symbols

My module contains one function that calls a handful of functions in another module (which contains a huge collection of functions). The goal is to make the module 'self-contained', i.e. no calls across module boundaries, and as minimal as possible, i.e. it does not contain any function which is not called directly or indirectly from the original function. So, I linked in the callee module to the caller module and ran the internalize pass to filter/mark the non-external global symbols. Is this a good first step towards the goal? How can I eliminate unused global symbols or make the module minimal (with the existing (trunk) passes)? Ideally only the (directly or indirectly) referenced symbols survive. Is this possible or do I need to develop such passes?


Internalize and GlobalDCE should be what you need.

I compile my library to bytecode and then declare all my functions as linkonce ( and then use llvm-link to produce a minimal module, which works pretty well for me.