[LLVMdev] How to tell whether a GlobalValue is user-defined

Nick Kledzik kledzik at apple.com
Wed Aug 27 14:46:09 PDT 2014


On Aug 27, 2014, at 1:58 PM, Rafael Espíndola <rafael.espindola at gmail.com> wrote:

>>> The literalN sections were developed long ago to support coalescing of
>>> unnamed constants like 9.897 in source code for architectures that could not
>>> embed large constants in instructions.  The linker could knew how to break
>>> up the section (e.g. __literal8 is always 8 byte chunks) and coalesce copies
>>> by content.
>>> 
>>> ~6 years ago we discovered that gcc would sometimes put user named
>>> constants into the literal sections (e.g. const double foo 9.897).  This was
>>> an issue because C language rules say &a != &b, but if ‘a’ and ‘b’ are the
>>> contain the same literal value from different translation units, the linker
>>> could merge them to the same address.  For whatever reason, we could not fix
>>> gcc, so we changed to linker to never coalesce items in literal sections if
>>> there was a (non ‘L’ and non ‘l’) symbol on it.
>> 
>> 
>> Thanks for the info!
> 
> +1
> 
>>> The current state of LLVM is that is it going out of its way to move
>>> “named” constants from __const section to __literalN section. But the only
>>> possible advantage to doing that is that the hopes that the linker might
>>> coalesce it.  But the linker won’t coalesce it because it is named.  So, is
>>> there a way to keep the named values in the __const section?
>> 
>> 
>> Right, LLVM has proven that the address of the data is insignificant, hence
>> it is "unnamed", and can be placed in a mergeable section. Is there any
>> reason not to change the linker to merge this stuff, if gcc is no longer
>> supported? We won't violate the semantics of C. Is there some immediate
>> problem with keeping the data in these sections?
> 
> 
> Agreed. If ld64 can drop support for .o produced by the old gcc that
> would be awesome. Failing that, what is really needed is
Because of static archives, the linker has to support old .o files for quite a while.   I also don’t know when clang starting getting this right.

Also, this seems like linker complexity for a very unlikely optimization (two named constants with same value).  If someone cares about this level of optimization, they can use LTO which will do all the constant merging in LLVM.  

> 
> LLVM should only put constants in mergeable sections only if (among
> other things) they require only symbols that start with 'l' or 'L'.
Not sure what you mean here. What is "requiring”?  Are we talking about this code in TargetLoweringObjectFileMachO::SelectSectionForGlobal()

 if (Kind.isMergeableConst()) {
    if (Kind.isMergeableConst4())
      return FourByteConstantSection;
    if (Kind.isMergeableConst8())
      return EightByteConstantSection;
    if (Kind.isMergeableConst16())
      return SixteenByteConstantSection;
  }

Can’t we just change the first ‘if’ to:

 if (Kind.isMergeableConst() && !GV.hasName()) {

That should leave any “named” constants in the __const section instead of moving them to the __literal section. (Though I don’t actually know if anonymous constants were given some name earlier so hasName() is useless at this point).

-Nick






More information about the llvm-dev mailing list