Hi, this is a variant of patch I tested and comitted after discussion on DECL_ARGUMENTS change. Basically ARGUMENTS are now part of a functio nbody and we need to stream them for thunks in order to be able to expand them. The patch also fixes misplaced pop_cfun in lto-streamer-in.c.
Bootstrapped/regtested x86_64-linux, comitted. * cgraphunit.c (expand_thunk): Get body before touching arguments. * lto-streamer-out.c: Stream thunks, too. * lto-streamer-in.c (input_function): Pop cfun here (lto_read_body): Instead of here. Index: cgraphunit.c =================================================================== --- cgraphunit.c (revision 202335) +++ cgraphunit.c (working copy) @@ -1433,7 +1433,11 @@ expand_thunk (struct cgraph_node *node) tree virtual_offset = NULL; tree alias = node->callees->callee->symbol.decl; tree thunk_fndecl = node->symbol.decl; - tree a = DECL_ARGUMENTS (thunk_fndecl); + tree a; + + if (in_lto_p) + cgraph_get_body (node); + a = DECL_ARGUMENTS (thunk_fndecl); current_function_decl = thunk_fndecl; Index: lto-streamer-out.c =================================================================== --- lto-streamer-out.c (revision 202335) +++ lto-streamer-out.c (working copy) @@ -1985,8 +1985,7 @@ lto_output (void) cgraph_node *node = dyn_cast <cgraph_node> (snode); if (node && lto_symtab_encoder_encode_body_p (encoder, node) - && !node->symbol.alias - && !node->thunk.thunk_p) + && !node->symbol.alias) { #ifdef ENABLE_CHECKING gcc_assert (!bitmap_bit_p (output, DECL_UID (node->symbol.decl))); Index: lto-streamer-in.c =================================================================== --- lto-streamer-in.c (revision 202335) +++ lto-streamer-in.c (working copy) @@ -998,6 +998,7 @@ input_function (tree fn_decl, struct dat free_dominance_info (CDI_DOMINATORS); free_dominance_info (CDI_POST_DOMINATORS); free (stmts); + pop_cfun (); } @@ -1086,8 +1087,6 @@ lto_read_body (struct lto_file_decl_data /* Restore decl state */ file_data->current_decl_state = file_data->global_decl_state; - - pop_cfun (); } lto_data_in_delete (data_in);