From patchwork Sun Nov 4 20:48:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "Uecker, Martin" X-Patchwork-Id: 992790 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-488985-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=med.uni-goettingen.de Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="tFV+4+2P"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 42p7G55k4VzB6N2 for ; Mon, 5 Nov 2018 07:49:14 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:references:in-reply-to :content-type:content-id:content-transfer-encoding:mime-version; q=dns; s=default; b=kJN1h/dkiNXoy4MqlwWUxhAbtQu6dSc1SLHuXGw5lG2 Fv8j8XItl3jGSz8M23meNVgVVyhnlvdKWLAzbw6YYFupFI/c66zKndI5u44NY6lK 4cG5u+S99CQ9KSMRcHXhfEkt3yy2AdamxaYN3R5vFy4MC4pSkE0+QROPp3R2B+GE = DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:references:in-reply-to :content-type:content-id:content-transfer-encoding:mime-version; s=default; bh=7iqr/c37X+XY2yHBIqRPatUoeec=; b=tFV+4+2PBBOltjm2X 5g2ouO3wdx7WV1aUjTNyfzDF5g5HLHJfDltnPrboXlW+wq1m7jHrCSCX9SX3RNJu r+EZTVv8aXtIPabsY5SoxoUMg+WJbJ4z9hF3pI5tDmtuzW2l7MIXfBGizXXhtIfo EpYEeVzaMzywGvATPXO5znS4r4= Received: (qmail 43307 invoked by alias); 4 Nov 2018 20:49:06 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 43129 invoked by uid 89); 4 Nov 2018 20:48:51 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.2 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, MIME_BASE64_BLANKS, SPF_PASS autolearn=ham version=3.3.2 spammy=Decision, HX-Envelope-From:prvs, diagnosed, basis X-HELO: mail1.med.uni-goettingen.de Received: from mail1.med.uni-goettingen.de (HELO mail1.med.uni-goettingen.de) (134.76.103.230) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sun, 04 Nov 2018 20:48:47 +0000 Received: from umg-exc-3.ads.local.med.uni-goettingen.de ([10.76.100.70]:39198) by mail1.med.uni-goettingen.de with esmtps (TLSv1:DHE-RSA-AES256-SHA:256) (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1gJPJx-0002Ia-1Q; Sun, 04 Nov 2018 21:48:33 +0100 Received: from UMG-EXC-1.ads.local.med.uni-goettingen.de ([fe80::c97f:60fd:6a2d:e4b9]) by umg-exc-3.ads.local.med.uni-goettingen.de ([fe80::f513:fb91:9f16:b175%13]) with mapi id 14.03.0415.000; Sun, 4 Nov 2018 21:48:32 +0100 From: "Uecker, Martin" To: "joseph@codesourcery.com" CC: "gcc-patches@gcc.gnu.org" , "law@redhat.com" , "ebotcazou@adacore.com" Subject: [PATCH v3][C][ADA] use function descriptors instead of trampolines in C Date: Sun, 4 Nov 2018 20:48:31 +0000 Message-ID: <1541364511.30044.4.camel@med.uni-goettingen.de> References: <1534005653.22677.9.camel@med.uni-goettingen.de> <1534609978.14596.2.camel@med.uni-goettingen.de> <1534774021.5798.6.camel@med.uni-goettingen.de> <1534832264.15600.1.camel@med.uni-goettingen.de> <1534918133.4891.5.camel@med.uni-goettingen.de> In-Reply-To: Content-ID: <0876FFF5B7F68E4B937C9A2DA1048380@ads.local.med.uni-goettingen.de> MIME-Version: 1.0 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/ChangeLog b/gcc/ChangeLog index 5cf291da2d5..e75500c647a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2018-11-03  Martin Uecker   + + * common.opt (flag_trampolines): Change default. + * calls.c (prepare_call_address): Remove check for + flag_trampolines.  Decision is now made in FEs. + * 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. +  2018-11-02  Aaron Sawdey       * config/rs6000/rs6000-string.c (expand_strncmp_gpr_sequence): Pay diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 73666129f55..a7462edfc71 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2018-11-03  Martin Uecker   + + * gcc-interface/trans.c (Attribute_to_gnu): Add check for + flag_trampolines. +  2018-10-22  Eric Botcazou       * gcc-interface/utils.c (unchecked_convert): Use local variables for 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;           /* 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))   by_descriptor = true;      }    else if (Nkind (Name (gnat_node)) == N_Attribute_Reference) diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 708ef5d7da2..62823ccf5c7 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,10 @@ +2018-11-03  Martin Uecker   + + * c-objc-common.h: Define LANG_HOOKS_CUSTOM_FUNCTION_DESCRIPTORS. + * 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. +  2018-10-29  David Malcolm       * c-decl.c (implicit_decl_warning): Update "is there a suggestion" 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 */ 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;  }    /* 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 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; +    /* If -Wnonnull warning has been diagnosed, avoid diagnosing it again       later.  */    if (warned_p && TREE_CODE (result) == CALL_EXPR) diff --git a/gcc/calls.c b/gcc/calls.c index 8978d3b42fd..95ab7d8405b 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -230,7 +230,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 (); diff --git a/gcc/common.opt b/gcc/common.opt index 2971dc21b1f..8457c93edab 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -2487,7 +2487,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.   diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index e290128f535..ccf651c1354 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -13570,7 +13570,8 @@ 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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a4d50614537..9c4bce69bd9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-11-03  Martin Uecker   + + * gcc.dg/trampoline-2.c: New test. + * lib/target-supports.exp  + (check_effective_target_notrampolines): New. +  2018-11-02  Rainer Orth       * gcc.dg/compat/pr83487-1_y.c: Move dg-skip-if ... diff --git a/gcc/testsuite/gcc.dg/trampoline-2.c b/gcc/testsuite/gcc.dg/trampoline-2.c new file mode 100644 index 00000000000..06c1cf4f647 --- /dev/null +++ b/gcc/testsuite/gcc.dg/trampoline-2.c @@ -0,0 +1,23 @@ +/* test that nested function work without trampolines for -fno-trampolines */ +/* Origin: Martin Uecker */ +/* { 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; +} + 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"] +} +  # Return 1 if trapping arithmetic is available, 0 otherwise.    proc check_effective_target_trapping {} { diff --git a/gcc/toplev.c b/gcc/toplev.c index d7ea11abf53..33ded241a20 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1697,6 +1697,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) diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c index 4579b4c5839..e95c9aea051 100644 --- a/gcc/tree-nested.c +++ b/gcc/tree-nested.c @@ -2499,7 +2499,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);