On 11/4/18 1:48 PM, Uecker, Martin wrote: > Hi Joseph, > > here is a new version of this patch which adds a warning > for targets which do not support -fno-trampolines and > only runs the test case on architectures where this is > supported. It seems that documentation for this general > feature has improved in the meantime so I only mention > C as supported. > > > Best, > Martin > > diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c > index ce2d43f989e..b79f2373c63 100644 > --- a/gcc/ada/gcc-interface/trans.c > +++ b/gcc/ada/gcc-interface/trans.c > @@ -1753,7 +1753,8 @@ Attribute_to_gnu (Node_Id gnat_node, tree > *gnu_result_type_p, int attribute) > if ((attribute == Attr_Access > || attribute == Attr_Unrestricted_Access) > && targetm.calls.custom_function_descriptors > 0 > - && Can_Use_Internal_Rep (Etype (gnat_node))) > + && Can_Use_Internal_Rep (Etype (gnat_node)) > + && (flag_trampolines != 1)) > FUNC_ADDR_BY_DESCRIPTOR (gnu_expr) = 1; You've got an extraneous set of parenthesis around your flag_trampolines check. Please remove them.
> > /* Otherwise, we need to check that we are not violating the > @@ -4330,7 +4331,8 @@ Call_to_gnu (Node_Id gnat_node, tree > *gnu_result_type_p, tree gnu_target, > /* If the access type doesn't require foreign-compatible > representation, > be prepared for descriptors. */ > if (targetm.calls.custom_function_descriptors > 0 > - && Can_Use_Internal_Rep (Etype (Prefix (Name (gnat_node))))) > + && Can_Use_Internal_Rep (Etype (Prefix (Name (gnat_node)))) > + && (flag_trampolines != 1)) Similarly here. > diff --git a/gcc/c/c-objc-common.h b/gcc/c/c-objc-common.h > index 78e768c2366..ef039560eb9 100644 > --- a/gcc/c/c-objc-common.h > +++ b/gcc/c/c-objc-common.h > @@ -110,4 +110,7 @@ along with GCC; see the file COPYING3. If not see > > #undef LANG_HOOKS_TREE_INLINING_VAR_MOD_TYPE_P > #define LANG_HOOKS_TREE_INLINING_VAR_MOD_TYPE_P c_vla_unspec_p > + > +#undef LANG_HOOKS_CUSTOM_FUNCTION_DESCRIPTORS > +#define LANG_HOOKS_CUSTOM_FUNCTION_DESCRIPTORS true > #endif /* GCC_C_OBJC_COMMON */ I wonder if we even need the lang hook anymore. ISTM that a front-end that wants to use the function descriptors can just set FUNC_ADDR_BY_DESCRIPTOR and we'd use the function descriptor, else we'll use the trampoline. Thoughts? > diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c > index 9d09b8d65fd..afae9de41e7 100644 > --- a/gcc/c/c-typeck.c > +++ b/gcc/c/c-typeck.c > @@ -1912,7 +1912,13 @@ function_to_pointer_conversion (location_t loc, tree > exp) > if (TREE_NO_WARNING (orig_exp)) > TREE_NO_WARNING (exp) = 1; > > - return build_unary_op (loc, ADDR_EXPR, exp, false); > + tree r = build_unary_op (loc, ADDR_EXPR, exp, false); > + > + if ((TREE_CODE(r) == ADDR_EXPR) > + && (flag_trampolines == 0)) > + FUNC_ADDR_BY_DESCRIPTOR (r) = 1; > + > + return r; Extraneous parens here too. > } > > /* Mark EXP as read, not just set, for set but not used -Wunused > @@ -3134,6 +3140,11 @@ build_function_call_vec (location_t loc, > vec<location_t> arg_loc, > else > result = build_call_array_loc (loc, TREE_TYPE (fntype), > function, nargs, argarray); > + > + if ((TREE_CODE (result) == CALL_EXPR) > + && (flag_trampolines == 0)) > + CALL_EXPR_BY_DESCRIPTOR (result) = 1; > + And here too. > diff --git a/gcc/testsuite/lib/target-supports.exp > b/gcc/testsuite/lib/target-supports.exp > index fd74c04d092..a34e966b7c4 100644 > --- a/gcc/testsuite/lib/target-supports.exp > +++ b/gcc/testsuite/lib/target-supports.exp > @@ -916,6 +916,14 @@ proc check_effective_target_scheduling {} { > } "-fschedule-insns"] > } > > +# Return 1 if it is possible to use function descriptors instead of > trampolines, 0 otherwise. > + > +proc check_effective_target_notrampolines {} { > + return [check_no_compiler_messages notrampolines assembly { > + void foo (void) { } > + } "-fno-trampolines"] > +} > + I think this needs documenting in sourcebuild.texi. Look for "Effective-target" to find the appropriate section. Jeff