------- Comment #5 from rguenth at gcc dot gnu dot org  2010-05-16 10:58 -------
(In reply to comment #2)
> OK, here's what's going wrong:
> 
> The LTO design is such that EH is only enabled if we encounter a function with
> an EH personality.
> 
> With -fwhopr we process one translation unit at a time, so when we look at
> 20081109_1.C we only see foo(int).
> 
> Before my patch foo(int) contained an ERT_MUST_NOT_THROW region, so we 
> required
> the C++ personality function.  After my patch, it contains an ERT_CLEANUP
> region instead, which doesn't require the C++ personality function
> 
> So cgraph doesn't set DECL_FUNCTION_PERSONALITY, so lto1 doesn't think that 
> foo
> needs EH, so it never sets flag_exceptions, so we don't get unwind 
> information,
> so the throw can't unwind through foo.
> 
> There seem to be two issues here:
> 1) lto1 incorrectly thinks foo doesn't need EH.
> 2) -fwhopr means that lto1 can make different decisions about EH for different
> translation units, so things blow up when linked together.
> 
> With #2 fixed, #1 isn't as big a problem--but it could still be an issue if we
> aren't compiling the entire program, i.e. a shared library wants to throw from
> a callback.  If anything we call can throw, we need unwind information and
> should turn on -fexceptions.

2) should be fixed by deciding on EH info at WPA stage (and not re-deciding
at LTRANS stage for every translation unit).

The current way of detecting whether to init EH is somewhat of a hack, and
there is no convenient place to store such overall properties (no, the
current option saving/restoring machiner is not it).


-- 

rguenth at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |hubicka at gcc dot gnu dot
                   |                            |org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44150

Reply via email to