public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* Re: [lto] C++. streaming, front-end specific tree nodes, IR types, and assembler names
       [not found] <8a0e66f0808010033s39e22020q1bf4ed0ed9bee71e@mail.gmail.com>
@ 2008-08-01 13:26 ` Diego Novillo
  2008-08-01 14:53   ` Mark Mitchell
  2008-08-01 15:33   ` Michael Matz
  0 siblings, 2 replies; 6+ messages in thread
From: Diego Novillo @ 2008-08-01 13:26 UTC (permalink / raw)
  To: Bill Maddox; +Cc: gcc, Jason Merrill, Mark Mitchell

[ Moved to gcc@gcc.gnu.org ]

On Fri, Aug 1, 2008 at 03:33, Bill Maddox <maddox@google.com> wrote:

> I am continuing to make progress with the LTO streamer on C++ code,
> and finding a considerable amount  of front-end specific crud hanging
> off of the GIMPLE, particularly related to templates.  This is not
> surprising given the current strategy for generating debug information
> (late, in the back-end).   The LTO IR must be language-independent,
> hower, and the current short-term plan of record, as I understand it,
> is to strip out left-over front-end specific parts of the tree in
> tree.c:free_lang_specifics, accepting that this will break debug info
> generation until a satisfactory alternative is devised.

Yes.  That coupled with early debug info emission in the FE.

>
> Finding that DECL_CONTEXT might include portions of what looked like
> template definitions, and surmising that  lexical nesting was a
> language artifact that should no longer be of significance beyond the
> front-end, I attempted to clear DECL_CONTEXT in free_lang_specifics.
> This resulted in an assertion failure in
> cp/mangle.c:write_unscoped_name.  It appears that the name mangling
> code, as one would expect, is very interested in such nesting, and
> examines DECL_CONTEXT in multiple locations.  None of this would be of
> any consequence if the name mangling were complete upon entry to the
> middle-end, but it can in fact be invoked via a langhook from
> DECL_ASSEMBLER_NAME.  Setting the assembler name is performed lazily
> in the back-end, requiring nesting relationships reflected in
> DECL_CONTEXT to be preserved to this point.
>
> My assertion is that the langhook must go, and that mangled names
> should be generated before invoking the middle-end.  Given the baroque
> treatment of the assembler name, however, I don't think it will be
> sufficient simply to make a pass over the declarations in
> free_lang_specifics setting the assembler name.
>
> Any advice from someone who deeply understands this stuff?

I can't claim any kind of knowledge of the C++ FE, but from the
point of view of the middle end, I would prefer if all the names
are decided right before, or during gimplification.

FE folks, any reason why we couldn't set assembler name as the FE
hands off the function to the gimplifier?  In principle,
free_lang_specifics would be a good place for it, I think.


Diego.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [lto] C++. streaming, front-end specific tree nodes, IR types,  and assembler names
  2008-08-01 13:26 ` [lto] C++. streaming, front-end specific tree nodes, IR types, and assembler names Diego Novillo
@ 2008-08-01 14:53   ` Mark Mitchell
  2008-08-01 22:56     ` Bill Maddox
  2008-08-03  7:28     ` Chris Lattner
  2008-08-01 15:33   ` Michael Matz
  1 sibling, 2 replies; 6+ messages in thread
From: Mark Mitchell @ 2008-08-01 14:53 UTC (permalink / raw)
  To: Diego Novillo; +Cc: Bill Maddox, gcc, Jason Merrill

Diego Novillo wrote:

>> My assertion is that the langhook must go, and that mangled names
>> should be generated before invoking the middle-end.  Given the baroque
>> treatment of the assembler name, however, I don't think it will be
>> sufficient simply to make a pass over the declarations in
>> free_lang_specifics setting the assembler name.
>>
>> Any advice from someone who deeply understands this stuff?

That's certain the only choice if we're going to throw away DECL_CONTEXT 
(and lots of other information).  However, the reason that names are 
mangled lazily is that it was a significant compile-time performance 
improvement.  There are *tons* of functions in the typical C++ 
translation unit when you start #includ'ing big headers.  Typically, 
thought many of them reference one-another, only a few definitions are 
actually output.  They reference other functions whose definitions are 
not emitted, but not that many.  So, you'd like to avoid mangling all of 
them.

My concern is that the path we're heading towards is:

1. C++ front end generates all function bodies, including instantiating 
all templates that might be needed, mangles all names that might be 
needed, and precomputes all debug info that might be needed, and then 
hands the whole mess off to the gimplifier.

2. Middle-end builds call graphs, etc., and throws out 99.5% of the 
functions and debug info, after deciding it's not needed.  (Note, for 
example, that mangled names are typically not needed for inline functions.)

That's going to make -flto slow.  If we do it in a way that affects 
normal -O0 compilation, this would be a bad thing.  Maybe we should 
consider a strategy where the front-end data structures live until the 
point of LTO output, so that we can compute what we need at that point, 
based only on what we are going to output.  (And for DECL_COMDAT things, 
we should be outputting LTO information only if actually referenced.)

-- 
Mark Mitchell
CodeSourcery
mark@codesourcery.com
(650) 331-3385 x713

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [lto] C++. streaming, front-end specific tree nodes, IR types,  and assembler names
  2008-08-01 13:26 ` [lto] C++. streaming, front-end specific tree nodes, IR types, and assembler names Diego Novillo
  2008-08-01 14:53   ` Mark Mitchell
@ 2008-08-01 15:33   ` Michael Matz
  1 sibling, 0 replies; 6+ messages in thread
From: Michael Matz @ 2008-08-01 15:33 UTC (permalink / raw)
  To: Bill Maddox; +Cc: Diego Novillo, gcc, Jason Merrill, Mark Mitchell

Hi Bill,

On Fri, 1 Aug 2008, Diego Novillo wrote:

> > Finding that DECL_CONTEXT might include portions of what looked like
> > template definitions, and surmising that  lexical nesting was a
> > language artifact that should no longer be of significance beyond the
> > front-end, I attempted to clear DECL_CONTEXT in free_lang_specifics.
> > This resulted in an assertion failure in
> > cp/mangle.c:write_unscoped_name.  It appears that the name mangling
> > code, as one would expect, is very interested in such nesting, and
> > examines DECL_CONTEXT in multiple locations.  None of this would be of
> > any consequence if the name mangling were complete upon entry to the
> > middle-end, but it can in fact be invoked via a langhook from
> > DECL_ASSEMBLER_NAME.  Setting the assembler name is performed lazily
> > in the back-end, requiring nesting relationships reflected in
> > DECL_CONTEXT to be preserved to this point.
> >
> > My assertion is that the langhook must go, and that mangled names
> > should be generated before invoking the middle-end.  Given the baroque
> > treatment of the assembler name, however, I don't think it will be
> > sufficient simply to make a pass over the declarations in
> > free_lang_specifics setting the assembler name.
> >
> > Any advice from someone who deeply understands this stuff?

See also my patch from 
http://gcc.gnu.org/ml/gcc-patches/2008-03/msg00349.html that had to deal 
with the same problem.  It indeed simply sets the asm name from 
free_lang_specifics (see set_asm_name() in there).  One issue is to watch 
out for string memory, one potentially generates names for decls that 
later are thrown away.  I found this to be only a minor issue with 
tramp3d, though.


Ciao,
Michael.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [lto] C++. streaming, front-end specific tree nodes, IR types, and assembler names
  2008-08-01 14:53   ` Mark Mitchell
@ 2008-08-01 22:56     ` Bill Maddox
  2008-08-02  2:34       ` Mark Mitchell
  2008-08-03  7:28     ` Chris Lattner
  1 sibling, 1 reply; 6+ messages in thread
From: Bill Maddox @ 2008-08-01 22:56 UTC (permalink / raw)
  To: Mark Mitchell; +Cc: Diego Novillo, gcc, Jason Merrill

On Fri, Aug 1, 2008 at 7:53 AM, Mark Mitchell <mark@codesourcery.com> wrote:

> That's going to make -flto slow.  If we do it in a way that affects normal
> -O0 compilation, this would be a bad thing.  Maybe we should consider a
> strategy where the front-end data structures live until the point of LTO
> output, so that we can compute what we need at that point, based only on
> what we are going to output.  (And for DECL_COMDAT things, we should be
> outputting LTO information only if actually referenced.)

Before free_lang_specifics was added, I dropped some of the tree while
streaming it out.  The advantage of this is that it doesn't trash the
FE-specfic info for the currently-running compilation, so that debug
info should be good for object code emitted during a -flto compile and
linked normally.

To move toward a language-independent IR, however, it is good hygiene
to strip this stuff so we aren't fooling ourselves.  When the lto IR
is streamed back in, lto1 will pick up the compilation more or less at
the point where it stood when the IR was written out, and proactively
cleaning the tree in free_lang_specifics will help us to anticipate
problems further along in the pipeline that might presently be masked
in our testing of lto1 by other streamer failures.

I agree that doing early name mangling at streamout time, only for the
declarations that are actually referenced and must be streamed out,
could be a huge win in the presence of large but sparsely-used header
files. I will try a few experiments here.  I'm not terribly
comfortable with aggressively cleaning the tree in free_lang_specifics
until we've clarified a GIMPLE type system and a plan for adjusting
early-generated debug info to reflect middle-end optimization.

--Bill

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [lto] C++. streaming, front-end specific tree nodes, IR types,  and assembler names
  2008-08-01 22:56     ` Bill Maddox
@ 2008-08-02  2:34       ` Mark Mitchell
  0 siblings, 0 replies; 6+ messages in thread
From: Mark Mitchell @ 2008-08-02  2:34 UTC (permalink / raw)
  To: Bill Maddox; +Cc: Diego Novillo, gcc, Jason Merrill

Bill Maddox wrote:

> To move toward a language-independent IR, however, it is good hygiene
> to strip this stuff so we aren't fooling ourselves.

Yes, the question is just when to do the stripping.  My point is that 
stripping early implies that the FE must generate everything you might 
ever want early and that is quite possibly expensive.

> I'm not terribly
> comfortable with aggressively cleaning the tree in free_lang_specifics
> until we've clarified a GIMPLE type system and a plan for adjusting
> early-generated debug info to reflect middle-end optimization.

That's kinda what I think too.  I'm we're approaching this as "throw 
everything away, see what breaks, fix it" and that seems like a risky 
method for such a major change.  If we go down this path and don't like 
it, it will be hard to back out.

The only thing actually required for LTO to work is that we not use FE 
callbacks to interpret the intermediate.  There's no inherent reason all 
the FE-specific data has to be freed.  So, we do have to mangle names 
before we write out LTO information (since we won't have an FE to mangle 
them for us later), but we don't necessarily have to do that at the 
point of GIMPLE-fication.

In fact, if we have big pieces of tree that are swapped out (e.g., PCH), 
running around freeing bits of them is probably going to slow things 
down, rather than speed them up.  In the case of PCH, we're going to be 
touching disk.  Maybe we should just not write the data out to the LTO 
file, rather than trying to free it early.  If you like, have a 
free-it-early mode for error-checking (to make sure that we aren't 
relying on that data) in the same way that we have an always-collect 
mode for GC (to make sure we're not depending on things not being 
collected).

-- 
Mark Mitchell
CodeSourcery
mark@codesourcery.com
(650) 331-3385 x713

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [lto] C++. streaming, front-end specific tree nodes, IR types, and assembler names
  2008-08-01 14:53   ` Mark Mitchell
  2008-08-01 22:56     ` Bill Maddox
@ 2008-08-03  7:28     ` Chris Lattner
  1 sibling, 0 replies; 6+ messages in thread
From: Chris Lattner @ 2008-08-03  7:28 UTC (permalink / raw)
  To: Mark Mitchell; +Cc: Diego Novillo, Bill Maddox, gcc, Jason Merrill

On Aug 1, 2008, at 7:53 AM, Mark Mitchell wrote:
> My concern is that the path we're heading towards is:

...

> 2. Middle-end builds call graphs, etc., and throws out 99.5% of the  
> functions and debug info, after deciding it's not needed.  (Note,  
> for example, that mangled names are typically not needed for inline  
> functions.)

Note that you often still need the mangled form of a symbol name when  
inlined if -g is present.

-Chris

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2008-08-03  7:28 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <8a0e66f0808010033s39e22020q1bf4ed0ed9bee71e@mail.gmail.com>
2008-08-01 13:26 ` [lto] C++. streaming, front-end specific tree nodes, IR types, and assembler names Diego Novillo
2008-08-01 14:53   ` Mark Mitchell
2008-08-01 22:56     ` Bill Maddox
2008-08-02  2:34       ` Mark Mitchell
2008-08-03  7:28     ` Chris Lattner
2008-08-01 15:33   ` Michael Matz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).