On Fri, Jan 29, 2016 at 11:38 AM, Alan Modra <amo...@gmail.com> wrote: > Since 4c4a180d, LTO has turned off flag_pic when linking a fixed > position executable. This results in flag_pic being zero in > rs6000_file_start, and no definition of ".LCTOC1". > > However, when we get to actually emitting code, flag_pic may be on > again, and references made to ".LCTOC1". How flag_pic comes to be > enabled again is quite a story. It goes like this.. If a function is > compiled with -fPIC then sysv4.h SUBTARGET_OVERRIDE_OPTIONS will set > TARGET_RELOCATABLE. Conversely, if TARGET_RELOCATABLE is set and > flag_pic is zero, then SUBTARGET_OVERRIDE_OPTIONS will set flag_pic=2. > It also happens that TARGET_RELOCATABLE is a bit in rs6000_isa_flags, > which is handled by rs6000_function_specific_save and > rs6000_function_specific_restore. That last fact means lto streaming > keeps track of the state of TARGET_RELOCATABLE for functions, and when > options are restored for a given function we'll set flag_pic=2 if the > function was originally compiled with -fPIC. That's bad because it > defeats the purpose of the 4c4a180d lto change, resulting in worse > optimization of ppc32 executables. What's more, we don't seem to turn > off flag_pic once it is on. > > We should really untangle the flag_pic/TARGET_RELOCATABLE mess, but > that change is probably a little dangerous for stage4. Instead, this > patch removes the toc symbol initialization from file_start and does > so when the first item is emitted to the toc, or after the function > epilogue in the cases where we emit code to initialize a toc pointer > but don't actually use it (-O0 mostly, I think). > > Bootstrapped and regression tested powerpc64-linux biarch with all > languages enabled. OK to apply? > > PR target/68662 > * config/rs6000/rs6000.c (need_toc_init): New var, set it > whenever toc_label_name used. > (rs6000_file_start): Don't set up toc section here, > (rs6000_output_function_epilogue): do so here instead, > (rs6000_xcoff_file_start): and here. > * config/rs6000/rs6000.md (load_toc_aix_si): Set need_toc_init. > (load_toc_aix_di): Likewise.
This is okay as an interim fix for GCC 6. Thanks, David