<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 10 June 2014 06:14, Sasa Stankovic <span dir="ltr"><<a href="mailto:Sasa.Stankovic@imgtec.com" target="_blank">Sasa.Stankovic@imgtec.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class="">> Presumably the reason that UseSmallSection is disabled for Linux is that LLVM is assuming that it might be being used with Gold?<br>


<br>
</div>It isn't related to Gold because apart from PNaCl, MIPS Gold is not used anywhere else; MIPS Gold isn't even committed to the FSF binutils - the patch is still in review on binutils mailing list.<br>
<br>
I suppose that the reason why it's disabled in Linux is because gp-relative addressing can only address 64K area (MIPS has 16-bit load/store offsets). That's probably why it's never used for PIC code (both Linux and non-Linux), because in PIC code .got section is also accessed using gp-relative addressing, so that leaves even less space for data items to be accessed using gp-relative addressing.</blockquote>

<div><br></div><div>Yes, that explanation makes a lot of sense.</div><div><br></div><div>The sdata section is a rather curious feature.  It seems to be based on the assumption that if some variables are each individually small, the total size of those variables (across all .o files) will be less than 64k.  This assumption is... optimistic. :-)</div>

<div><br></div><div>Would it make sense to turn off use of sdata by default, and have it only enabled by a compiler flag or llc flag?  That would be cleaner and is not very difficult to do.  It should come with a warning like "this is an optimisation that might cause moderate-sized programs to fail to link".</div>

<div><br></div><div>BTW, have you looked at the GlobalMerge pass (lib/Transforms/Scalar/GlobalMerge.cpp)?  That is used on ARM and gives a similar kind of optimisation to the MIPS sdata section.  It will reuse the computation of a base address within the data segment for multiple variables, rather than computing a data segment address for each variable that's referenced.  GlobalMerge is a more robust way of doing this optimisation than sdata, though it only works when the referenced variables are within the same compilation unit being compiled by llc.</div>

<div><br></div><div>Cheers,</div><div>Mark</div><div><br></div></div></div></div>