Hi, this patch makes cgrpahunit to output all thunks and aliases after the function, not before. Outputting before leads to better code layout and we might omit tailjump when thunk is just one, but it breaks one pass assembler and comdat group symbols.
This is the easiest fix and I will play with that incrementally - at the moment I would like to push the bugs realed to aliases down so I can finally proceed on the rest of alias reorg (i.e. elimination of alias pairs from backend) Bootstrapped/regtested and comitted. Honza Index: ChangeLog =================================================================== --- ChangeLog (revision 180052) +++ ChangeLog (working copy) @@ -1,3 +1,10 @@ +2011-10-15 Jan Hubicka <j...@suse.cz> + + PR target/48668 + PR target/50689 + * cgraphunit.c (cgraph_expand_function): Expand thunks and alises + after function body. + 2011-10-15 Richard Henderson <r...@redhat.com> * tree-vect-slp.c: Include langhooks.h. Index: cgraphunit.c =================================================================== --- cgraphunit.c (revision 180052) +++ cgraphunit.c (working copy) @@ -1798,7 +1798,6 @@ cgraph_expand_function (struct cgraph_no announce_function (decl); node->process = 0; - assemble_thunks_and_aliases (node); gcc_assert (node->lowered); /* Generate RTL for the body of DECL. */ @@ -1808,6 +1807,14 @@ cgraph_expand_function (struct cgraph_no gcc_assert (TREE_ASM_WRITTEN (decl)); current_function_decl = NULL; gcc_assert (!cgraph_preserve_function_body_p (node)); + + /* It would make a lot more sense to output thunks before function body to get more + forward and lest backwarding jumps. This is however would need solving problem + with comdats. See PR48668. Also aliases must come after function itself to + make one pass assemblers, like one on AIX happy. See PR 50689. + FIXME: Perhaps thunks should be move before function IFF they are not in comdat + groups. */ + assemble_thunks_and_aliases (node); cgraph_release_function_body (node); /* Eliminate all call edges. This is important so the GIMPLE_CALL no longer points to the dead function body. */