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