r203052 - Construct GlobalValues with the correct linkage instead of using setLinkage.

Nick Kledzik kledzik at apple.com
Thu Mar 6 12:35:20 PST 2014


On Mar 6, 2014, at 11:40 AM, Rafael Espíndola <rafael.espindola at gmail.com> wrote:

>> weak-def tells the linker the content can be merged/coalesced by name.
>> The ‘l’ symbol prefix tells the linker the not add the symbol name to the final output.
>> This combination really only make sense for visibility=hidden symbols (which they were).
> 
> OK. Lets try to figure out the correct way to represent this at the
> LLVM IR. Some extra questions:
> 
> * Is the merge required to happen or it is just an optimization?
It is an optimization to reduce duplicate copies of objc data structures.
The merge has always happened before, I don’t know if there is anything
in the runtime that relies on that.  But it is a big space savings, so we
would not want to lose this.

> * Is it legal to merge by value?
I’m not sure how well defined “by-value” means when the content is data
with pointers to other objects (which might be merged).  We side stepped
that by giving is a unique name that can be used to merge by-name.

> * Is it legal to drop the symbol if it is not used in a translation unit?
Drop the symbol name or the content too?  Many of these are in 
non-dead-strip sections because their existence has meaning to the objc
runtime.

> * Is the content guaranteed to be the same in every TU?
The objc compiler makes names that imply the content regardless of TU.


> 
> And some observations
> 
> * Using private is currently the only direct way to hide a symbol
> (other than manually applying the 'l' prefix).
> * Using private, linker_private, linker_private_weak or internal is at
> least undesirable. If llvm renames the symbol during IR link, it
> prevents the linker from doing the merge. It might also be incorrect
> if the merge is required to happen or if it is illegal to merge by
> content.
> * The merge by name property at the IR level is only provided by weak,
> linkonce, weak_odr and linkonce_odr, so they do look to be the best
> candidates.
> 
> Since no IR linkage maps directly to what we want, the two options seem to be
> * Keep using an explicit 'l' prefix and one of (linkonce|weak)(_odr|),
> but document why.
> * Add a new linkage that the same as the selected
> (linkonce|weak)(_odr|), but adds the 'l' prefix.
> 
> Given how specific this is, I would probably go with the first option.
Isn’t that what was done before (explicit name)?

This is another reason that the exist big LinkageTypes enumeration does  not
scale.  There is a bunch of independent dimensions (‘l’ prefix is one dimension).
The LinkageTypes is a smattering of common points in N-dimension space.
Each time we find a need for a new point needed, adding it requires finding
all uses of LinkageTypes and updating them.

-Nick



More information about the cfe-commits mailing list