This allows LLVM's LTO to internalize symbols that are not referenced
directly by regular objects. Naturally, this means we need to track
which symbols are referenced by regular objects. The approach taken here
is similar to LLD-COFF's: like the COFF port, we extend
SymbolTable::insert() to set the isVisibleToRegularObj bit. (LLD-ELF
relies on the Symbol constructor and Symbol::mergeProperties(), but
the Mach-O port does not have a mergeProperties() equivalent.)
From what I can tell, ld64 (which uses libLTO) doesn't do this
optimization at all. I'm not even sure libLTO provides a way to do this.
Not having ld64's behavior as a reference implementation is unfortunate;
instead, I am relying on LLD-ELF/COFF's behavior as references while
erring on the conservative side. In particular, LLD-MachO will only do
this optimization for executables right now.
We also don't attempt it when -flat_namespace is used -- otherwise
we'd need scan the symbol table to find matches for every un-namespaced
symbol reference, which is expensive.
internalize.ll is based off the LLD-ELF tests internalize-basic.ll and
internalize-undef.ll. Looks like @davide added some of LLD-ELF's internalize
tests, so adding him as a reviewer...
this allows us to access the *.internalize.bc files in our test