Issue with LTO/-fwhole-program

David Brown david.brown@hesbynett.no
Sun Jun 13 22:49:00 GMT 2010


Dave Korn wrote:
> On 13/06/2010 20:55, Ian Lance Taylor wrote:
>> David Brown <david@westcontrol.com> writes:
>>
>>> If -flto were to activate the -fno-common flag, would that then catch 
>>> these potential problems with a linker error?
>> We could perhaps do that for C/C++ code, but Fortran relies on common 
>> symbols.
> 
> Well we shouldn't do it for plain C either, or at the very least should make
> it depend on the -std= option in effect, but since the code is entirely valid
> and legitimate C, I think we should acknowledge this is a weakness in our
> compiler. The original testcase is a perfectly straightforward bit of C89;
> there are two compatible tentative declarations of a variable of type int
> called "v". We don't want to have to argue that one is in fact a variable of
> type "int compiled with LTO" in order to back-justify some argument that they
> are not the same and this example violates some (vague and not
> standard-specified) C equivalent of the ODR.
> 
>     cheers,
>       DaveK
> 

I agree that banning common symbols is not a complete solution.  But 
perhaps it may be a partial solution until some more complete solution 
is found and implemented?

How about having a warning flag -Wcommon-lto which will produce a 
warning if LTO is used along with common data, and which is enabled by 
default by -flto?  For code that does not use common symbols, everything 
works as expected and the user gets LTO'ed code.  But if the code /does/ 
use common symbols, you get a warning that the code may be incorrect if 
a common symbol is declared in both LTO and non-LTO object files.  It is 
then up to the user to ignore the warning, or fix the common symbols.

This is not a complete fix - ideally, LTO should work fine even with 
common symbols.  And failing that, the warning (or error) message should 
only come if there really is a conflict, rather than just a potential 
conflict.  But I would think that a check like this is a relatively 
simple feature, and would add an extra level of safety to LTO.

Incidentally, the original poster used -fwhole-program.  Is this 
conflict only an issue when the -fwhole-program flag is used?  If that's 
the case, then the warning could be conditional on that flag too, 
meaning even rarer circumstances when false positives would be issued.

David



More information about the Gcc mailing list