On Thu, Jul 07, 2011 at 03:14:02PM -0400, David Edelsohn wrote: > On Thu, Jul 7, 2011 at 11:53 AM, Richard Guenther > <richard.guent...@gmail.com> wrote: > > > Well, that's up to the target maintainers to decide, maybe > > -mno-nested-functions instead? > > Is -mno-nested-functions or -mno-nested-function-pointers too > C-centric or GCC-centric? I don't know what wording would be more > informative, but the functionality is available in Pascal, PL/I, Ada, > GCC extensions and other languages. We're open to suggestions. > > > The compiler certainly can't figure out in _all_ cases - but it should be > > able to handle > > most of the cases (with LTO even more cases) ok, no? > > -mno-r11 is an assertion to the compiler that no function calls > through pointers will require the static chain. However, I agree that > the compiler conservatively should be able to figure out some cases > itself, which would be a good enhancement.
I changed the switch to -mno-pointers-to-nested-functions as David requestion in private communications. [gcc] 2011-07-13 Michael Meissner <meiss...@linux.vnet.ibm.com> * config/rs6000/rs6000.opt (-mpointers-to-nested-functions): Rename -mr11. * config/rs6000/rs6000.c (rs6000_trampoline_init): Ditto. (rs6000_call_indirect_aix): Ditto. * config/rs6000/rs6000.md (call_indirect_aix<ptrsize>): Ditto. (call_indirect_aix<ptrsize>_internal): Ditto. (call_indirect_aix<ptrsize>_nor11): Ditto. (call_indirect_aix<ptrsize>_internal2): Ditto. (call_value_indirect_aix<ptrsize>): Ditto. (call_value_indirect_aix<ptrsize>_internal): Ditto. (call_value_indirect_aix<ptrsize>_nor11): Ditto. (call_value_indirect_aix<ptrsize>_internal2): Ditto. * doc/invoke.texi (RS/6000 and PowerPC Options): Ditto. [gcc/testsuite] 2011-07-13 Michael Meissner <meiss...@linux.vnet.ibm.com> * gcc.target/powerpc/no-r11-1.c: Change -mno-r11 to -mno-pointers-to-nested-functions. * gcc.target/powerpc/no-r11-2.c: Ditto. * gcc.target/powerpc/no-r11-3.c: Ditto. -- Michael Meissner, IBM 5 Technology Place Drive, M/S 2757, Westford, MA 01886-3141, USA meiss...@linux.vnet.ibm.com fax +1 (978) 399-6899
Index: gcc/config/rs6000/rs6000.opt =================================================================== --- gcc/config/rs6000/rs6000.opt (revision 176251) +++ gcc/config/rs6000/rs6000.opt (working copy) @@ -521,9 +521,9 @@ mxilinx-fpu Target Var(rs6000_xilinx_fpu) Save Specify Xilinx FPU. -mr11 -Target Report Var(TARGET_R11) Init(1) Save -Use/do not use r11 to hold the static link in calls. +mpointers-to-nested-functions +Target Report Var(TARGET_POINTERS_TO_NESTED_FUNCTIONS) Init(1) Save +Use/do not use r11 to hold the static link in calls to functions via pointers. msave-toc-indirect Target Undocumented Var(TARGET_SAVE_TOC_INDIRECT) Save Init(1) Index: gcc/config/rs6000/rs6000.c =================================================================== --- gcc/config/rs6000/rs6000.c (revision 176251) +++ gcc/config/rs6000/rs6000.c (working copy) @@ -24409,7 +24409,7 @@ rs6000_trampoline_init (rtx m_tramp, tre { rtx fnmem, fn_reg, toc_reg; - if (!TARGET_R11) + if (!TARGET_POINTERS_TO_NESTED_FUNCTIONS) error ("-mno-r11 must not be used if you have trampolines"); fnmem = gen_const_mem (Pmode, force_reg (Pmode, fnaddr)); @@ -27741,7 +27741,7 @@ rs6000_call_indirect_aix (rtx value, rtx stack_toc_offset = GEN_INT (TOC_SAVE_OFFSET_32BIT); func_toc_offset = GEN_INT (AIX_FUNC_DESC_TOC_32BIT); func_sc_offset = GEN_INT (AIX_FUNC_DESC_SC_32BIT); - if (TARGET_R11) + if (TARGET_POINTERS_TO_NESTED_FUNCTIONS) { call_func = gen_call_indirect_aix32bit; call_value_func = gen_call_value_indirect_aix32bit; @@ -27757,7 +27757,7 @@ rs6000_call_indirect_aix (rtx value, rtx stack_toc_offset = GEN_INT (TOC_SAVE_OFFSET_64BIT); func_toc_offset = GEN_INT (AIX_FUNC_DESC_TOC_64BIT); func_sc_offset = GEN_INT (AIX_FUNC_DESC_SC_64BIT); - if (TARGET_R11) + if (TARGET_POINTERS_TO_NESTED_FUNCTIONS) { call_func = gen_call_indirect_aix64bit; call_value_func = gen_call_value_indirect_aix64bit; @@ -27800,7 +27800,7 @@ rs6000_call_indirect_aix (rtx value, rtx func_toc_offset)); /* If we have a static chain, load it up. */ - if (TARGET_R11) + if (TARGET_POINTERS_TO_NESTED_FUNCTIONS) { func_sc_mem = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, Index: gcc/config/rs6000/rs6000.md =================================================================== --- gcc/config/rs6000/rs6000.md (revision 176251) +++ gcc/config/rs6000/rs6000.md (working copy) @@ -12386,7 +12386,7 @@ (define_insn_and_split "call_indirect_ai (use (match_operand:P 3 "memory_operand" "m,m")) (use (reg:P STATIC_CHAIN_REGNUM)) (clobber (reg:P LR_REGNO))] - "DEFAULT_ABI == ABI_AIX && TARGET_R11" + "DEFAULT_ABI == ABI_AIX && TARGET_POINTERS_TO_NESTED_FUNCTIONS" "#" "&& reload_completed" [(set (reg:P TOC_REGNUM) (match_dup 2)) @@ -12409,7 +12409,8 @@ (define_insn "*call_indirect_aix<ptrsize (use (match_operand:P 2 "memory_operand" "m,m")) (set (reg:P TOC_REGNUM) (match_dup 2)) (clobber (reg:P LR_REGNO))] - "DEFAULT_ABI == ABI_AIX && reload_completed && TARGET_R11" + "DEFAULT_ABI == ABI_AIX && reload_completed + && TARGET_POINTERS_TO_NESTED_FUNCTIONS" "b%T0l\;<ptrload> 2,%2" [(set_attr "type" "jmpreg") (set_attr "length" "8")]) @@ -12426,7 +12427,7 @@ (define_insn_and_split "call_indirect_ai (use (match_operand:P 2 "memory_operand" "m,m")) (use (match_operand:P 3 "memory_operand" "m,m")) (clobber (reg:P LR_REGNO))] - "DEFAULT_ABI == ABI_AIX && !TARGET_R11" + "DEFAULT_ABI == ABI_AIX && !TARGET_POINTERS_TO_NESTED_FUNCTIONS" "#" "&& reload_completed" [(set (reg:P TOC_REGNUM) (match_dup 2)) @@ -12447,7 +12448,8 @@ (define_insn "*call_indirect_aix<ptrsize (use (match_operand:P 2 "memory_operand" "m,m")) (set (reg:P TOC_REGNUM) (match_dup 2)) (clobber (reg:P LR_REGNO))] - "DEFAULT_ABI == ABI_AIX && reload_completed && !TARGET_R11" + "DEFAULT_ABI == ABI_AIX && reload_completed + && !TARGET_POINTERS_TO_NESTED_FUNCTIONS" "b%T0l\;<ptrload> 2,%2" [(set_attr "type" "jmpreg") (set_attr "length" "8")]) @@ -12466,7 +12468,7 @@ (define_insn_and_split "call_value_indir (use (match_operand:P 4 "memory_operand" "m,m")) (use (reg:P STATIC_CHAIN_REGNUM)) (clobber (reg:P LR_REGNO))] - "DEFAULT_ABI == ABI_AIX && TARGET_R11" + "DEFAULT_ABI == ABI_AIX && TARGET_POINTERS_TO_NESTED_FUNCTIONS" "#" "&& reload_completed" [(set (reg:P TOC_REGNUM) (match_dup 3)) @@ -12491,7 +12493,8 @@ (define_insn "*call_value_indirect_aix<p (use (match_operand:P 3 "memory_operand" "m,m")) (set (reg:P TOC_REGNUM) (match_dup 3)) (clobber (reg:P LR_REGNO))] - "DEFAULT_ABI == ABI_AIX && reload_completed && TARGET_R11" + "DEFAULT_ABI == ABI_AIX && reload_completed + && TARGET_POINTERS_TO_NESTED_FUNCTIONS" "b%T1l\;<ptrload> 2,%3" [(set_attr "type" "jmpreg") (set_attr "length" "8")]) @@ -12510,7 +12513,7 @@ (define_insn_and_split "call_value_indir (use (match_operand:P 3 "memory_operand" "m,m")) (use (match_operand:P 4 "memory_operand" "m,m")) (clobber (reg:P LR_REGNO))] - "DEFAULT_ABI == ABI_AIX && !TARGET_R11" + "DEFAULT_ABI == ABI_AIX && !TARGET_POINTERS_TO_NESTED_FUNCTIONS" "#" "&& reload_completed" [(set (reg:P TOC_REGNUM) (match_dup 3)) @@ -12533,7 +12536,8 @@ (define_insn "*call_value_indirect_aix<p (use (match_operand:P 3 "memory_operand" "m,m")) (set (reg:P TOC_REGNUM) (match_dup 3)) (clobber (reg:P LR_REGNO))] - "DEFAULT_ABI == ABI_AIX && reload_completed && !TARGET_R11" + "DEFAULT_ABI == ABI_AIX && reload_completed + && !TARGET_POINTERS_TO_NESTED_FUNCTIONS" "b%T1l\;<ptrload> 2,%3" [(set_attr "type" "jmpreg") (set_attr "length" "8")]) Index: gcc/testsuite/gcc.target/powerpc/no-r11-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/no-r11-1.c (revision 176251) +++ gcc/testsuite/gcc.target/powerpc/no-r11-1.c (working copy) @@ -1,6 +1,6 @@ /* { dg-do compile { target { powerpc*-*-* && lp64 } } } */ /* { dg-skip-if "" { *-*-darwin* } { "*" } { "" } } */ -/* { dg-options "-O2 -mno-r11" } */ +/* { dg-options "-O2 -mno-pointers-to-nested-functions" } */ int call_ptr (int (func) (void)) Index: gcc/testsuite/gcc.target/powerpc/no-r11-2.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/no-r11-2.c (revision 176251) +++ gcc/testsuite/gcc.target/powerpc/no-r11-2.c (working copy) @@ -1,6 +1,6 @@ /* { dg-do compile { target { powerpc*-*-* && lp64 } } } */ /* { dg-skip-if "" { *-*-darwin* } { "*" } { "" } } */ -/* { dg-options "-O2 -mr11" } */ +/* { dg-options "-O2 -mpointers-to-nested-functions" } */ int call_ptr (int (func) (void)) Index: gcc/testsuite/gcc.target/powerpc/no-r11-3.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/no-r11-3.c (revision 176251) +++ gcc/testsuite/gcc.target/powerpc/no-r11-3.c (working copy) @@ -1,6 +1,6 @@ /* { dg-do compile { target { powerpc*-*-* && lp64 } } } */ /* { dg-skip-if "" { *-*-darwin* } { "*" } { "" } } */ -/* { dg-options "-O2 -mno-r11" } */ +/* { dg-options "-O2 -mno-pointers-to-nested-functions" } */ extern void ext_call (int (func) (void));