For other ABIs, -msingle-pic-base makes gcc omit loading of the PIC register in function prologues. This patch makes the option affect ELFv2 too.
I wrote a patch like this during the initial ELFv2 effort, but there were many more important patches to push and this one somehow got dropped. Dusted off and retested at the request of powerpc64 kernel people who'd like an option to disable ELFv2 global entry code for the kernel. OK mainline? * config/rs6000/rs6000.c (rs6000_emit_prologue): Don't set r2_setup_needed when TARGET_SINGLE_PIC_BASE. (rs6000_output_mi_thunk): Likewise. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index ae456ff..023f622 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -24118,13 +24118,13 @@ rs6000_emit_prologue (void) #define NOT_INUSE(R) do {} while (0) #endif - if (DEFAULT_ABI == ABI_ELFv2) + if (DEFAULT_ABI == ABI_ELFv2 + && !TARGET_SINGLE_PIC_BASE) { cfun->machine->r2_setup_needed = df_regs_ever_live_p (TOC_REGNUM); /* With -mminimal-toc we may generate an extra use of r2 below. */ - if (!TARGET_SINGLE_PIC_BASE - && TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0) + if (TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0) cfun->machine->r2_setup_needed = true; } @@ -26800,7 +26800,8 @@ rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED, /* Ensure we have a global entry point for the thunk. ??? We could avoid that if the target routine doesn't need a global entry point, but we do not know whether this is the case at this point. */ - if (DEFAULT_ABI == ABI_ELFv2) + if (DEFAULT_ABI == ABI_ELFv2 + && !TARGET_SINGLE_PIC_BASE) cfun->machine->r2_setup_needed = true; /* Run just enough of rest_of_compilation to get the insns emitted. -- Alan Modra Australia Development Lab, IBM