<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Aug 25, 2014 at 9:54 AM, Nick Kledzik <span dir="ltr"><<a href="mailto:kledzik@apple.com" target="_blank">kledzik@apple.com</a>></span> wrote:<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
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.<br>

<br>
~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.<br>
</blockquote><div><br></div><div>Thanks for the info!</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
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?<br>
</blockquote><div><br></div><div>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?</div>
</div></div></div>