This is the mail archive of the
mailing list for the GCC project.
Re: Link-time optimzation
- From: Ian Lance Taylor <ian at airs dot com>
- To: gcc mailing list <gcc at gcc dot gnu dot org>
- Date: 16 Nov 2005 21:53:23 -0800
- Subject: Re: Link-time optimzation
- References: <437BB214.firstname.lastname@example.org>
Mark Mitchell <email@example.com> writes:
Section 2.2.1 (Variables and Functions) mentions C++ inline functions.
It should also mention gcc's C language "extern inline" functions.
The same section should consider common symbols. These appear as
uninitialized definitions. Common symbols should normally be merged.
Obviously the text referring to GNU attributes will need to be
expanded. Some cases are not obvious; e.g., longcall.
In section 3.3 (Assembler) I'll note that the PowerPC XCOFF assembler
supports a .rename directive, which could be easily be made available
for all targets.
I'll also note that for non-GNU targets, we must be able to use the
native assembler. Therefore, it may not always be possible to keep
symbol names the same as source code names. That will have to be an
option, fortunately one that only affects debugging information.
In section 3.4 (Linker) I have the same comment: for non-GNU targets,
the native linker is sometimes required, so modifying the linker
should not be a requirement. And the exact handling of .a files is
surprisingly target dependent, so while it would be easy to code an
archive searcher in gcc, it would be tedious, though doable, to get it
right for all platforms.
Conversely, I don't know much we are going to care about speed here,
but I assume that we are going to care a bit. For the linker to
determine which files to pull in from an archive, it is going to have
to read the symbol tables of all the input objects, and it is going to
have to read the archive symbol table, and it is going to have to read
the symbols table of each object included from an archive. It will
have to build a symbol hash table as it goes along. This isn't fast;
it's a significant component of link time. Since the compiler is also
going to have to build a symbol hash table, it is going to be faster
to have the compiler search the archive symbol table and decide which
objects to pull in. Searching an archive symbol table isn't hard; the
target dependencies come in when deciding which objects to include.
In section 3.5 (Driver), although you don't discuss it, we are going
to want the driver to know whether you are generating a relocateable
object, a shared library, or an executable. When generating a shared
library, we are going to want the driver to know the set of exported
symbols. When generating an executable, we are going to want to know
which symbols are referenced by shared libraries included in the link.
We are going to want to know these things so that we can do things
like global dead code elimination and global parameter simplification
(i.e., function only called with certain parameters) even when linking
against shared libraries for which we do not have the source.
Link time optimization will still be useful if we don't know any of
this stuff, but it is clear that people are going to want the
optimizations which require it. So we should plan for it from the
Section 4.2 (Executable Representation) describes the GVM as a stack
machine, and mentions load, store, duplicate, and swap operations.
But it also discusses having registers which correspond to GIMPLE
local variables. The way I put this together is that a MODIFY_EXPR
which sets a local variable, say, will be converted to something that
computes the expression using a stack and then assigns the value to a
register. It's easy to see how to convert such a MODIFY_EXPR into a
stack machine and back. But it's not easy to see why that stack
machine is going to need, e.g, a swap operation. There is no GIMPLE
swap operator. So I may still be confused about something.