This API change will enable final_start_function() to "consume" initial insns, and choose the first insn to be passed to final().
Many ports call final_start_function() and final() when creating thunks and whatnot, so they needed adjusting. for gcc/ChangeLog * output.h (final_start_function): Adjust. * final.c (final_start_function): Take pointer to FIRST. (rest_of_handle_final): Adjust. * config/aarch64/aarch64.c (aarch64_output_mi_thunk): Adjust. * config/alpha/alpha.c (alpha_output_mi_thunk_osf): Likewise. * config/arm/arm.c (arm_thumb1_mi_thunk): Likewise. (arm32_output_mi_thunk): Likewise. * config/cris/cris.c (cris_asm_output_mi_thunk): Likewise. * config/i386/i386.c (ix86_code_end): Likewise. (x86_output_mi_thunk): Likewise. * config/ia64/ia64.c (ia64_output_mi_thunk): Likewise. * config/m68k/m68k.c (m68k_output_mi_thunk): Likewise. * config/microblaze/microblaze.c (microblaze_asm_output_mi_thunk): Likewise. * config/mips/mips.c (mips_output_mi_thunk): Likewise. * config/nds32/nds32.c (nds32_asm_output_mi_thunk): Likewise. * config/nios2/nios2.c (nios2_asm_output_mi_thunk): Likewise. * config/pa/pa.c (pa_asm_output_mi_thunk): Likewise. * config/rs6000/rs6000.c (rs6000_output_mi_thunk): Likewise. (rs6000_code_end): Likewise. * config/s390/s390.c (s390_output_mi_thunk): Likewise. * config/sh/sh.c (sh_output_mi_thunk): Likewise. * config/sparc/sparc.c (sparc_output_mi_thunk): Likewise. * config/spu/spu.c (spu_output_mi_thunk): Likewise. * config/tilegx/tilegx.c (tilegx_output_mi_thunk): Likewise. * config/tilepro/tilepro.c (tilepro_asm_output_mi_thunk): Likewise. --- gcc/config/aarch64/aarch64.c | 2 +- gcc/config/alpha/alpha.c | 2 +- gcc/config/arm/arm.c | 5 +++-- gcc/config/cris/cris.c | 3 ++- gcc/config/i386/i386.c | 5 +++-- gcc/config/ia64/ia64.c | 2 +- gcc/config/m68k/m68k.c | 2 +- gcc/config/microblaze/microblaze.c | 2 +- gcc/config/mips/mips.c | 2 +- gcc/config/nds32/nds32.c | 3 ++- gcc/config/nios2/nios2.c | 2 +- gcc/config/pa/pa.c | 3 ++- gcc/config/rs6000/rs6000.c | 5 +++-- gcc/config/s390/s390.c | 3 ++- gcc/config/sh/sh.c | 2 +- gcc/config/sparc/sparc.c | 2 +- gcc/config/spu/spu.c | 3 ++- gcc/config/tilegx/tilegx.c | 2 +- gcc/config/tilepro/tilepro.c | 2 +- gcc/final.c | 9 ++++++--- gcc/output.h | 2 +- 21 files changed, 37 insertions(+), 26 deletions(-) diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 28c4e0e..51584f5 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -3936,7 +3936,7 @@ aarch64_output_mi_thunk (FILE *file, tree thunk ATTRIBUTE_UNUSED, insn = get_insns (); shorten_branches (insn); - final_start_function (insn, file, 1); + final_start_function (&insn, file, 1); final (insn, file, 1); final_end_function (); diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index e13c5f9..c158f7a 100644 --- a/gcc/config/alpha/alpha.c +++ b/gcc/config/alpha/alpha.c @@ -8461,7 +8461,7 @@ alpha_output_mi_thunk_osf (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED, assemble_start_function and assemble_end_function. */ insn = get_insns (); shorten_branches (insn); - final_start_function (insn, file, 1); + final_start_function (&insn, file, 1); final (insn, file, 1); final_end_function (); } diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index fa3e2fa..71a0d2d 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -26357,7 +26357,8 @@ arm_thumb1_mi_thunk (FILE *file, tree, HOST_WIDE_INT delta, if (mi_delta < 0) mi_delta = - mi_delta; - final_start_function (emit_barrier (), file, 1); + rtx_insn *first = emit_barrier (); + final_start_function (&first, file, 1); if (TARGET_THUMB1) { @@ -26534,7 +26535,7 @@ arm32_output_mi_thunk (FILE *file, tree, HOST_WIDE_INT delta, insn = get_insns (); shorten_branches (insn); - final_start_function (insn, file, 1); + final_start_function (&insn, file, 1); final (insn, file, 1); final_end_function (); diff --git a/gcc/config/cris/cris.c b/gcc/config/cris/cris.c index b57881a..376c1eb 100644 --- a/gcc/config/cris/cris.c +++ b/gcc/config/cris/cris.c @@ -2744,7 +2744,8 @@ cris_asm_output_mi_thunk (FILE *stream, tree funcdecl) { /* Make sure unwind info is emitted for the thunk if needed. */ - final_start_function (emit_barrier (), stream, 1); + rtx_insn *first = emit_barrier (); + final_start_function (&first, stream, 1); if (delta > 0) fprintf (stream, "\tadd%s " HOST_WIDE_INT_PRINT_DEC ",$%s\n", diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 1d88e4f..86320a7 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -12492,8 +12492,9 @@ ix86_code_end (void) emitting it directly; tell them we're a thunk, if they care. */ cfun->is_thunk = true; first_function_block_is_cold = false; + rtx_insn *first = emit_barrier (); /* Make sure unwind info is emitted for the thunk if needed. */ - final_start_function (emit_barrier (), asm_out_file, 1); + final_start_function (&first, asm_out_file, 1); /* Pad stack IP move with 4 instructions (two NOPs count as one instruction). */ @@ -42615,7 +42616,7 @@ x86_output_mi_thunk (FILE *file, tree, HOST_WIDE_INT delta, Note that use_thunk calls assemble_start_function et al. */ insn = get_insns (); shorten_branches (insn); - final_start_function (insn, file, 1); + final_start_function (&insn, file, 1); final (insn, file, 1); final_end_function (); } diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index 79c323f..2a05293 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -10944,7 +10944,7 @@ ia64_output_mi_thunk (FILE *file, tree thunk ATTRIBUTE_UNUSED, emit_all_insn_group_barriers (NULL); insn = get_insns (); shorten_branches (insn); - final_start_function (insn, file, 1); + final_start_function (&insn, file, 1); final (insn, file, 1); final_end_function (); diff --git a/gcc/config/m68k/m68k.c b/gcc/config/m68k/m68k.c index 8972665..3b656c7 100644 --- a/gcc/config/m68k/m68k.c +++ b/gcc/config/m68k/m68k.c @@ -5131,7 +5131,7 @@ m68k_output_mi_thunk (FILE *file, tree thunk ATTRIBUTE_UNUSED, /* Run just enough of rest_of_compilation. */ insn = get_insns (); split_all_insns_noflow (); - final_start_function (insn, file, 1); + final_start_function (&insn, file, 1); final (insn, file, 1); final_end_function (); diff --git a/gcc/config/microblaze/microblaze.c b/gcc/config/microblaze/microblaze.c index 2cdd240..9f862292 100644 --- a/gcc/config/microblaze/microblaze.c +++ b/gcc/config/microblaze/microblaze.c @@ -3233,7 +3233,7 @@ microblaze_asm_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED, "borrowed" from rs6000.c. */ insn = get_insns (); shorten_branches (insn); - final_start_function (insn, file, 1); + final_start_function (&insn, file, 1); final (insn, file, 1); final_end_function (); diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index d2737a6..7dcc835 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -19353,7 +19353,7 @@ mips_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED, split_all_insns_noflow (); mips16_lay_out_constants (true); shorten_branches (insn); - final_start_function (insn, file, 1); + final_start_function (&insn, file, 1); final (insn, file, 1); final_end_function (); diff --git a/gcc/config/nds32/nds32.c b/gcc/config/nds32/nds32.c index 14310de..478824f 100644 --- a/gcc/config/nds32/nds32.c +++ b/gcc/config/nds32/nds32.c @@ -1635,7 +1635,8 @@ nds32_asm_output_mi_thunk (FILE *file, tree thunk ATTRIBUTE_UNUSED, int this_regno; /* Make sure unwind info is emitted for the thunk if needed. */ - final_start_function (emit_barrier (), file, 1); + rtx_insn *first = emit_barrier (); + final_start_function (&first, file, 1); this_regno = (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function) ? 1 diff --git a/gcc/config/nios2/nios2.c b/gcc/config/nios2/nios2.c index 884b1dc..89600ee 100644 --- a/gcc/config/nios2/nios2.c +++ b/gcc/config/nios2/nios2.c @@ -4060,7 +4060,7 @@ nios2_asm_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED, assemble_start_function and assemble_end_function. */ insn = get_insns (); shorten_branches (insn); - final_start_function (insn, file, 1); + final_start_function (&insn, file, 1); final (insn, file, 1); final_end_function (); diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index 52f76cf..fd28213 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -8379,7 +8379,8 @@ pa_asm_output_mi_thunk (FILE *file, tree thunk_fndecl, HOST_WIDE_INT delta, xoperands[1] = XEXP (DECL_RTL (thunk_fndecl), 0); xoperands[2] = GEN_INT (delta); - final_start_function (emit_barrier (), file, 1); + rtx_insn *first = emit_barrier (); + final_start_function (&first, file, 1); /* Output the thunk. We know that the function is in the same translation unit (i.e., the same space) as the thunk, and that diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index f9aa13b..298f07a 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -29292,7 +29292,7 @@ rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED, assemble_start_function and assemble_end_function. */ insn = get_insns (); shorten_branches (insn); - final_start_function (insn, file, 1); + final_start_function (&insn, file, 1); final (insn, file, 1); final_end_function (); @@ -37758,7 +37758,8 @@ rs6000_code_end (void) init_function_start (decl); first_function_block_is_cold = false; /* Make sure unwind info is emitted for the thunk if needed. */ - final_start_function (emit_barrier (), asm_out_file, 1); + rtx_insn *first = emit_barrier (); + final_start_function (&first, asm_out_file, 1); fputs ("\tblr\n", asm_out_file); diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index deced95..ce98673 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -12872,7 +12872,8 @@ s390_output_mi_thunk (FILE *file, tree thunk ATTRIBUTE_UNUSED, int nonlocal = 0; /* Make sure unwind info is emitted for the thunk if needed. */ - final_start_function (emit_barrier (), file, 1); + rtx_insn *first = emit_barrier (); + final_start_function (&first, file, 1); /* Operand 0 is the target function. */ op[0] = XEXP (DECL_RTL (function), 0); diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index c31776f..875d931 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -10891,7 +10891,7 @@ sh_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED, sh_reorg (); shorten_branches (insns); - final_start_function (insns, file, 1); + final_start_function (&insns, file, 1); final (insns, file, 1); final_end_function (); diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index d494ecf2..5d92080 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -12074,7 +12074,7 @@ sparc_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED, assemble_start_function and assemble_end_function. */ insn = get_insns (); shorten_branches (insn); - final_start_function (insn, file, 1); + final_start_function (&insn, file, 1); final (insn, file, 1); final_end_function (); diff --git a/gcc/config/spu/spu.c b/gcc/config/spu/spu.c index b6d03d7..e005077 100644 --- a/gcc/config/spu/spu.c +++ b/gcc/config/spu/spu.c @@ -7020,7 +7020,8 @@ spu_output_mi_thunk (FILE *file, tree thunk ATTRIBUTE_UNUSED, rtx op[8]; /* Make sure unwind info is emitted for the thunk if needed. */ - final_start_function (emit_barrier (), file, 1); + rtx_insn *insn = emit_barrier (); + final_start_function (&insn, file, 1); /* Operand 0 is the target function. */ op[0] = XEXP (DECL_RTL (function), 0); diff --git a/gcc/config/tilegx/tilegx.c b/gcc/config/tilegx/tilegx.c index 81559ac..ac4a5ff 100644 --- a/gcc/config/tilegx/tilegx.c +++ b/gcc/config/tilegx/tilegx.c @@ -4998,7 +4998,7 @@ tilegx_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED, */ insn = get_insns (); shorten_branches (insn); - final_start_function (insn, file, 1); + final_start_function (&insn, file, 1); final (insn, file, 1); final_end_function (); diff --git a/gcc/config/tilepro/tilepro.c b/gcc/config/tilepro/tilepro.c index f03f067..34b68b8 100644 --- a/gcc/config/tilepro/tilepro.c +++ b/gcc/config/tilepro/tilepro.c @@ -4421,7 +4421,7 @@ tilepro_asm_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED, */ insn = get_insns (); shorten_branches (insn); - final_start_function (insn, file, 1); + final_start_function (&insn, file, 1); final (insn, file, 1); final_end_function (); diff --git a/gcc/final.c b/gcc/final.c index 401cfb6..15a301b 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -1770,9 +1770,11 @@ get_some_local_dynamic_name () test and compare insns. */ void -final_start_function (rtx_insn *first, FILE *file, +final_start_function (rtx_insn **firstp, FILE *file, int optimize_p ATTRIBUTE_UNUSED) { + rtx_insn *first = *firstp; + block_depth = 0; this_is_asm_operands = 0; @@ -4544,8 +4546,9 @@ rest_of_handle_final (void) variable_tracking_main (); assemble_start_function (current_function_decl, fnname); - final_start_function (get_insns (), asm_out_file, optimize); - final (get_insns (), asm_out_file, optimize); + rtx_insn *first = get_insns (); + final_start_function (&first, asm_out_file, optimize); + final (first, asm_out_file, optimize); if (flag_ipa_ra && !lookup_attribute ("noipa", DECL_ATTRIBUTES (current_function_decl))) collect_fn_hard_reg_usage (); diff --git a/gcc/output.h b/gcc/output.h index 7a93fa8..278315f 100644 --- a/gcc/output.h +++ b/gcc/output.h @@ -59,7 +59,7 @@ const char *get_some_local_dynamic_name (); for the new function. The label for the function and associated assembler pseudo-ops have already been output in `assemble_start_function'. */ -extern void final_start_function (rtx_insn *, FILE *, int); +extern void final_start_function (rtx_insn **, FILE *, int); /* Output assembler code for the end of a function. For clarity, args are same as those of `final_start_function' -- 2.9.5