@@ -1,3 +1,16 @@
+2019-06-24 Martin Uecker <martin.uecker@med.uni-goettingen.de>
+
+ * common.opt (flag_trampolines): Change default.
+ * calls.c (prepare_call_address): Remove check for
+ flag_trampolines. Decision is now made in FEs.
+ * defaults.h (FUNCTION_ALIGNMENT): Add test for flag_trampolines.
+ * tree-nested.c (convert_tramp_reference_op): Likewise.
+ * toplev.c (process_options): Add warning for -fno-trampolines on
+ unsupported targets.
+ * doc/invoke.texi (-fno-trampolines): Document support for C.
+ * doc/sourcebuild.texi (target attributes): Document new
+ "notrampolines" effective target keyword.
+
2019-06-22 Jeff Law <law@redhat.com>
* config/avr/avr.c (TARGET_BUILTIN_SETJMP_FRAME_VALUE): Remove.
@@ -1,3 +1,8 @@
+2019-06-24 Martin Uecker <martin.uecker@med.uni-goettingen.de>
+
+ * gcc-interface/trans.c (Attribute_to_gnu): Add check for
+ flag_trampolines.
+
2019-06-18 Arnaud Charlet <charlet@adacore.com>
PR ada/80590
@@ -2267,7 +2267,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;
/* Otherwise, we need to check that we are not violating the
@@ -5106,7 +5107,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)
by_descriptor = true;
}
else if (Nkind (Name (gnat_node)) == N_Attribute_Reference)
@@ -1,3 +1,9 @@
+2019-06-24 Martin Uecker <martin.uecker@med.uni-goettingen.de>
+
+ * c-typeck.c (function_to_pointer_conversion): If using descriptors
+ instead of trampolines, amend function address with
+ FUNC_ADDR_BY_DESCRIPTOR and calls with ALL_EXPR_BY_DESCRIPTOR.
+
2019-06-10 Jakub Jelinek <jakub@redhat.com>
* c-parser.c (c_parser_pragma): Reject PRAGMA_OMP_SCAN.
@@ -1914,7 +1914,14 @@ 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
+ && targetm.calls.custom_function_descriptors > 0
+ && flag_trampolines == 0)
+ FUNC_ADDR_BY_DESCRIPTOR (r) = 1;
+
+ return r;
}
/* Mark EXP as read, not just set, for set but not used -Wunused
@@ -3136,6 +3143,12 @@ 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
+ && targetm.calls.custom_function_descriptors > 0
+ && flag_trampolines == 0)
+ CALL_EXPR_BY_DESCRIPTOR (result) = 1;
+
/* If -Wnonnull warning has been diagnosed, avoid diagnosing it again
later. */
if (warned_p && TREE_CODE (result) == CALL_EXPR)
@@ -221,7 +221,7 @@ prepare_call_address (tree fndecl_or_type, rtx funexp, rtx static_chain_value,
{
/* If it's an indirect call by descriptor, generate code to perform
runtime identification of the pointer and load the descriptor. */
- if ((flags & ECF_BY_DESCRIPTOR) && !flag_trampolines)
+ if (flags & ECF_BY_DESCRIPTOR)
{
const int bit_val = targetm.calls.custom_function_descriptors;
rtx call_lab = gen_label_rtx ();
@@ -2554,7 +2554,7 @@ Common Report Var(flag_tracer) Optimization
Perform superblock formation via tail duplication.
ftrampolines
-Common Report Var(flag_trampolines) Init(0)
+Common Report Var(flag_trampolines) Init(-1)
For targets that normally need trampolines for nested functions, always
generate them instead of using descriptors.
@@ -1054,7 +1054,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
/* Force minimum alignment to be able to use the least significant bits
for distinguishing descriptor addresses from code addresses. */
#define FUNCTION_ALIGNMENT(ALIGN) \
- (lang_hooks.custom_function_descriptors \
+ (( lang_hooks.custom_function_descriptors \
+ || flag_trampolines == 0) \
&& targetm.calls.custom_function_descriptors > 0 \
? MAX ((ALIGN), \
2 * targetm.calls.custom_function_descriptors * BITS_PER_UNIT)\
@@ -14217,12 +14217,12 @@ made executable in order for the program to work properly.
basis to let the compiler avoid generating them, if it computes that this
is safe, and replace them with descriptors. Descriptors are made up of data
only, but the generated code must be prepared to deal with them. As of this
-writing, @option{-fno-trampolines} is enabled by default only for Ada.
+writing, @option{-fno-trampolines} is supported only for C and Ada and
+enabled by default only for Ada.
-Moreover, code compiled with @option{-ftrampolines} and code compiled with
-@option{-fno-trampolines} are not binary compatible if nested functions are
-present. This option must therefore be used on a program-wide basis and be
-manipulated with extreme care.
+@strong{Warning:} Code compiled with @option{-ftrampolines} and code compiled
+with @option{-fno-trampolines} are not binary compatible. This option must
+therefore be used on a program-wide basis and be manipulated with extreme care.
@item -fvisibility=@r{[}default@r{|}internal@r{|}hidden@r{|}protected@r{]}
@opindex fvisibility
@@ -2172,6 +2172,9 @@ Target supports Newlib.
GCC was configured with @code{--enable-newlib-nano-formatted-io}, which reduces
the code size of Newlib formatted I/O functions.
+@item notrampolines
+Target supports option @option{-fno-trampolines}.
+
@item pow10
Target provides @code{pow10} function.
@@ -1,3 +1,9 @@
+2019-06-24 Martin Uecker <martin.uecker@med.uni-goettingen.de>
+
+ * gcc.dg/trampoline-2.c: New test.
+ * lib/target-supports.exp
+ (check_effective_target_notrampolines): New.
+
2019-06-22 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/89782
new file mode 100644
@@ -0,0 +1,23 @@
+/* test that nested function work without trampolines for -fno-trampolines */
+/* Origin: Martin Uecker <martin.uecker@med.uni-goettingen.de> */
+/* { dg-require-effective-target notrampolines } */
+/* { dg-options "-std=gnu11 -O2 -Wtrampolines -fno-trampolines" } */
+
+static int p(void) { return +1; }
+static int m(void) { return -1; }
+static int z(void) { return 0; }
+
+typedef int (*funptr_t)(void);
+
+static int A(int k, funptr_t a1, funptr_t a2, funptr_t a3, funptr_t a4, funptr_t a5)
+{
+ int B(void) { return A(--k, B, a1, a2, a3, a4); }
+
+ return (k <= 0) ? (a4() + a5()) : (B());
+}
+
+int main(void)
+{
+ return (0 == A(5, p, m, m, p, z)) ? 0 : 1;
+}
+
@@ -937,6 +937,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"]
+}
+
# Return 1 if trapping arithmetic is available, 0 otherwise.
proc check_effective_target_trapping {} {
@@ -1699,6 +1699,12 @@ process_options (void)
flag_prefetch_loop_arrays = 0;
}
+ if (flag_trampolines == 0 && targetm.calls.custom_function_descriptors == -1)
+ {
+ warning_at (UNKNOWN_LOCATION, 0,
+ "-fno-trampolines not supported for this target");
+ }
+
/* This combination of options isn't handled for i386 targets and doesn't
make much sense anyway, so don't allow it. */
if (flag_prefetch_loop_arrays > 0 && optimize_size)
@@ -2558,7 +2558,7 @@ convert_tramp_reference_op (tree *tp, int *walk_subtrees, void *data)
continue;
/* Decide whether to generate a descriptor or a trampoline. */
- descr = FUNC_ADDR_BY_DESCRIPTOR (t) && !flag_trampolines;
+ descr = FUNC_ADDR_BY_DESCRIPTOR (t);
if (descr)
x = lookup_descr_for_decl (i, decl, INSERT);