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