So, this is still a WIP but I'd like to discuss it to be sure we handle all the cases correctly.
- Similarly to what the gold plugin does, every time we see a new bitcode file we collect the set of the used global variables and for each symbol defined in the bitcode file make a decision to internalize it or not.
- The resolver tells us if a symbol is referenced from outside (this is pretty similar to what the gold linker does during symbol resolution, but they also take in account if a symbol is visible outside, which I plan to implement later). Note, I'm not sure the check added which check the flag is completely correct.
- Once we are done with this step, *in* the combined object, we actually perform the internalize step changing linkage for each GV previously collected.
Some comments:
In gold, the linker tells back to the plugin what's the resolution for a given symbol. WRT internalize, two resolutions are relevant:
-> PREVAILING_DEF_IRONLY (this is the prevailing definition of the symbol, with no references from regular objects)
-> PREVAILING_DEF_IRONLY_EXP (as above, but the symbol is exported to the dynamic symbol table)
We currently cover only the first case properly.
StringSet copies strings to its internal buffer. Is this what you want?
"Internalize" is a verb. I think you want to name it a noun.