Index: config/i386/i386.c =================================================================== --- config/i386/i386.c (revision 241222) +++ config/i386/i386.c (working copy) @@ -50833,6 +50833,9 @@ ix86_addr_space_zero_address_valid (addr #undef TARGET_HARD_REGNO_SCRATCH_OK #define TARGET_HARD_REGNO_SCRATCH_OK ix86_hard_regno_scratch_ok +#undef TARGET_CUSTOM_FUNCTION_DESCRIPTORS +#define TARGET_CUSTOM_FUNCTION_DESCRIPTORS 1 + struct gcc_target targetm = TARGET_INITIALIZER; #include "gt-i386.h" Index: config/i386/i386.h =================================================================== --- config/i386/i386.h (revision 241222) +++ config/i386/i386.h (working copy) @@ -2666,9 +2666,6 @@ extern void debug_dispatch_window (int); #define TARGET_SUPPORTS_WIDE_INT 1 -/* Use custom descriptors instead of trampolines when possible. */ -#define TARGET_CUSTOM_FUNCTION_DESCRIPTORS 1 - /* Local variables: version-control: t Index: config/ia64/ia64.c =================================================================== --- config/ia64/ia64.c (revision 241222) +++ config/ia64/ia64.c (working copy) @@ -649,6 +649,9 @@ static const struct attribute_spec ia64_ #undef TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P #define TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P ia64_attribute_takes_identifier_p +#undef TARGET_CUSTOM_FUNCTION_DESCRIPTORS +#define TARGET_CUSTOM_FUNCTION_DESCRIPTORS 0 + struct gcc_target targetm = TARGET_INITIALIZER; /* Returns TRUE iff the target attribute indicated by ATTR_ID takes a plain Index: config/ia64/ia64.h =================================================================== --- config/ia64/ia64.h (revision 241222) +++ config/ia64/ia64.h (working copy) @@ -1715,7 +1715,4 @@ struct GTY(()) machine_function /* Switch on code for querying unit reservations. */ #define CPU_UNITS_QUERY 1 -/* IA-64 already uses descriptors for its standard calling sequence. */ -#define TARGET_CUSTOM_FUNCTION_DESCRIPTORS 0 - /* End of ia64.h */ Index: config/rs6000/rs6000.c =================================================================== --- config/rs6000/rs6000.c (revision 241222) +++ config/rs6000/rs6000.c (working copy) @@ -1867,6 +1867,9 @@ static const struct attribute_spec rs600 #undef TARGET_OPTAB_SUPPORTED_P #define TARGET_OPTAB_SUPPORTED_P rs6000_optab_supported_p + +#undef TARGET_CUSTOM_FUNCTION_DESCRIPTORS +#define TARGET_CUSTOM_FUNCTION_DESCRIPTORS 1 /* Processor table. */ @@ -4862,6 +4865,10 @@ rs6000_option_override_internal (bool gl Linux and Darwin ABIs at the moment. For now, only AIX is fixed. */ if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN) targetm.calls.split_complex_arg = NULL; + + /* The AIX and ELFv1 ABIs define standard function descriptors. */ + if (DEFAULT_ABI == ABI_AIX) + targetm.calls.custom_function_descriptors = 0; } /* Initialize rs6000_cost with the appropriate target costs. */ Index: config/rs6000/rs6000.h =================================================================== --- config/rs6000/rs6000.h (revision 241222) +++ config/rs6000/rs6000.h (working copy) @@ -2922,9 +2922,6 @@ extern GTY(()) tree rs6000_builtin_decls #define TARGET_SUPPORTS_WIDE_INT 1 -/* Use custom descriptors instead of trampolines if not AIX or ELFv1. */ -#define TARGET_CUSTOM_FUNCTION_DESCRIPTORS (DEFAULT_ABI != ABI_AIX) - #if (GCC_VERSION >= 3000) #pragma GCC poison TARGET_FLOAT128 OPTION_MASK_FLOAT128 MASK_FLOAT128 #endif Index: config/sparc/sparc.c =================================================================== --- config/sparc/sparc.c (revision 241222) +++ config/sparc/sparc.c (working copy) @@ -866,6 +866,9 @@ char sparc_hard_reg_printed[8]; #undef TARGET_FIXED_CONDITION_CODE_REGS #define TARGET_FIXED_CONDITION_CODE_REGS sparc_fixed_condition_code_regs +#undef TARGET_CUSTOM_FUNCTION_DESCRIPTORS +#define TARGET_CUSTOM_FUNCTION_DESCRIPTORS 1 + struct gcc_target targetm = TARGET_INITIALIZER; /* Return the memory reference contained in X if any, zero otherwise. */ Index: config/sparc/sparc.h =================================================================== --- config/sparc/sparc.h (revision 241222) +++ config/sparc/sparc.h (working copy) @@ -1813,6 +1813,3 @@ extern int sparc_indent_opcode; #define SPARC_LOW_FE_EXCEPT_VALUES 0 #define TARGET_SUPPORTS_WIDE_INT 1 - -/* Use custom descriptors instead of trampolines when possible. */ -#define TARGET_CUSTOM_FUNCTION_DESCRIPTORS 1 Index: testsuite/gcc.dg/Wtrampolines.c =================================================================== --- testsuite/gcc.dg/Wtrampolines.c (revision 241222) +++ testsuite/gcc.dg/Wtrampolines.c (working copy) @@ -28,7 +28,7 @@ void foo (void) double a (int k, pfun x1, pfun x2, pfun x3, pfun x4, pfun x5) { - double b (void) /* { dg-warning "trampoline generated for nested function 'b'" } */ + double b (void) /* { dg-warning "trampoline generated for nested function 'b'" "standard descriptors" { xfail ia64-*-* powerpc64-*-* } } */ { k = k - 1; return a (k, b, x1, x2, x3, x4 ); Index: testsuite/gnat.dg/trampoline4.adb =================================================================== --- testsuite/gnat.dg/trampoline4.adb (revision 241222) +++ testsuite/gnat.dg/trampoline4.adb (working copy) @@ -1,6 +1,6 @@ -- { dg-do compile { target *-*-linux* } } -- { dg-options "-ftrampolines -gnatws" } --- { dg-skip-if "native descriptors" { ia64-*-* powerpc64-*-* } } +-- { dg-skip-if "standard descriptors" { ia64-*-* powerpc64-*-* } } procedure Trampoline4 is