This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug lto/55102] New: The options -flto and -On do not behave as described in GCC docs
- From: "d.g.gorbachev at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Sat, 27 Oct 2012 19:27:38 +0000
- Subject: [Bug lto/55102] New: The options -flto and -On do not behave as described in GCC docs
- Auto-submitted: auto-generated
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55102
Bug #: 55102
Summary: The options -flto and -On do not behave as described
in GCC docs
Classification: Unclassified
Product: gcc
Version: 4.8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: lto
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: d.g.gorbachev@gmail.com
> Additionally, the optimization flags used to compile
> individual files are not necessarily related to those
> used at link time. For instance,
>
> gcc -c -O0 -flto foo.c
> gcc -c -O0 -flto bar.c
> gcc -o myprog -flto -O3 foo.o bar.o
>
> This produces individual object files with unoptimized
> assembler code, but the resulting binary myprog is
> optimized at -O3. If, instead, the final binary is
> generated without -flto, then myprog is not optimized.
In fact, when you use -O3 when linking the .o files, it is already too late,
the resulting binary will not be fully optimized. You need to compile the .c
files with at least -O1. Thus, there is a bug either in GCC itself or in the
documentation.
====== 8< ======
int foo(void)
{
return 0;
}
int main(void)
{
return foo();
}
====== >8 ======
$ gcc -flto -O0 -c foo.c -o foo-O0.o
$ gcc -flto -O1 -c foo.c -o foo-O1.o
$ gcc -flto -O0 foo-O0.o -o prog-O0-O0
$ gcc -flto -O3 foo-O0.o -o prog-O0-O3
$ gcc -flto -O0 foo-O1.o -o prog-O1-O0
$ gcc -flto -O3 foo-O1.o -o prog-O1-O3
$ nm -A prog-O0-O0 prog-O0-O3 prog-O1-O0 prog-O1-O3 | grep foo
prog-O0-O0:080483f0 t foo.2337
prog-O0-O3:080483f0 t foo.2337
prog-O1-O0:080483f0 t foo.2337
GCC 4.6 gives a slight different result:
$ nm -A prog-O0-O0 prog-O0-O3 prog-O1-O0 prog-O1-O3 | grep foo
prog-O0-O0:08048381 t foo.1988
prog-O0-O3:08048380 t foo.1988
(GCC 4.5 crashes.)