From patchwork Thu Oct 11 14:49:03 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Hayward X-Patchwork-Id: 29706 Received: (qmail 60122 invoked by alias); 11 Oct 2018 14:49:20 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 59933 invoked by uid 89); 11 Oct 2018 14:49:19 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy=8888 X-HELO: EUR03-VE1-obe.outbound.protection.outlook.com Received: from mail-eopbgr50071.outbound.protection.outlook.com (HELO EUR03-VE1-obe.outbound.protection.outlook.com) (40.107.5.71) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 11 Oct 2018 14:49:16 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector1-arm-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=a8CBnbAgub+f6NMo/UtE6OP4C7ZtnL/qzfqNb5JzSSI=; b=CCjIsWhNobQHndBmj9nvlGoUQqxkGDsE3FrJcEspnS+5RklNK8VV5OgH4xruqNeoZ/9I8Bs2qFqYYqxcoc4sG5DPv6MfmD+Mge1vJE10/1FlbpuIsyTuodDxuHm+JipwFKMLpAvcj3h1o6BdfWGmHK6VrY84jPpPUzBIBhJFCdc= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Alan.Hayward@arm.com; Received: from C02TF0U7HF1T.manchester.arm.com (217.140.106.32) by DB6PR0802MB2133.eurprd08.prod.outlook.com (2603:10a6:4:83::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1228.24; Thu, 11 Oct 2018 14:49:09 +0000 From: Alan Hayward To: gdb-patches@sourceware.org Cc: nd@arm.com, Alan Hayward Subject: [PATCH v3 1/3] Use enum for return method for dummy calls Date: Thu, 11 Oct 2018 15:49:03 +0100 Message-Id: <20181011144905.66908-2-alan.hayward@arm.com> In-Reply-To: <20181011144905.66908-1-alan.hayward@arm.com> References: <20181011144905.66908-1-alan.hayward@arm.com> MIME-Version: 1.0 Return-Path: alan.hayward@arm.com Received-SPF: None (protection.outlook.com: arm.com does not designate permitted sender hosts) X-IsSubscribed: yes In call_function_by_hand_dummy, struct_return and hidden_first_param_p are used to represent a single concept. Replace with an enum. gdb/ChangeLog: 2018-10-11 Alan Hayward * gdbarch.sh (enum function_call_return_method): Add enum. * gdbarch.h: Regenerate. * infcall.c (call_function_by_hand_dummy): Replace vars with enum. --- gdb/gdbarch.h | 17 +++++++++++++++++ gdb/gdbarch.sh | 17 +++++++++++++++++ gdb/infcall.c | 29 +++++++++++------------------ 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h index fc2f1a84a1..5f9cf481fb 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -102,6 +102,23 @@ typedef void (iterate_over_regset_sections_cb) (const char *sect_name, int supply_size, int collect_size, const struct regset *regset, const char *human_name, void *cb_data); +/* For a function call, are we returning a value using a normal value return + or a structure return - passing a hidden argument pointing to storage. + There are two cases: language-mandated structure return and target ABI + structure return. The language version is handled by passing the return + location as the first parameter to the function, even preceding "this". + This is different from the target ABI version, which is target-specific; for + instance, on ia64 the first argument is passed in out0 but the hidden + structure return pointer would normally be passed in r8. */ + +enum function_call_return_method +{ + return_method_normal = 0, /* Standard value return. */ + return_method_struct, /* target ABI structure return. */ + return_method_hidden_param /* Return hidden in first param. */ +}; + + /* The following are pre-initialized by GDBARCH. */ diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index 670ac30c03..940f10e4d3 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -1327,6 +1327,23 @@ typedef int (iterate_over_objfiles_in_search_order_cb_ftype) typedef void (iterate_over_regset_sections_cb) (const char *sect_name, int supply_size, int collect_size, const struct regset *regset, const char *human_name, void *cb_data); + +/* For a function call, are we returning a value using a normal value return + or a structure return - passing a hidden argument pointing to storage. + There are two cases: language-mandated structure return and target ABI + structure return. The language version is handled by passing the return + location as the first parameter to the function, even preceding "this". + This is different from the target ABI version, which is target-specific; for + instance, on ia64 the first argument is passed in out0 but the hidden + structure return pointer would normally be passed in r8. */ + +enum function_call_return_method +{ + return_method_normal = 0, /* Standard value return. */ + return_method_struct, /* target ABI structure return. */ + return_method_hidden_param /* Return hidden in first param. */ +}; + EOF # function typedef's diff --git a/gdb/infcall.c b/gdb/infcall.c index 96d43704fa..0c875ea4b9 100644 --- a/gdb/infcall.c +++ b/gdb/infcall.c @@ -719,7 +719,7 @@ call_function_by_hand_dummy (struct value *function, { CORE_ADDR sp; struct type *target_values_type; - unsigned char struct_return = 0, hidden_first_param_p = 0; + function_call_return_method return_method = return_method_normal; CORE_ADDR struct_addr = 0; CORE_ADDR real_pc; CORE_ADDR bp_addr; @@ -876,20 +876,11 @@ call_function_by_hand_dummy (struct value *function, values_type = check_typedef (values_type); - /* Are we returning a value using a structure return (passing a - hidden argument pointing to storage) or a normal value return? - There are two cases: language-mandated structure return and - target ABI structure return. The variable STRUCT_RETURN only - describes the latter. The language version is handled by passing - the return location as the first parameter to the function, - even preceding "this". This is different from the target - ABI version, which is target-specific; for instance, on ia64 - the first argument is passed in out0 but the hidden structure - return pointer would normally be passed in r8. */ + /* Are we returning a value using a structure return? */ if (gdbarch_return_in_first_hidden_param_p (gdbarch, values_type)) { - hidden_first_param_p = 1; + return_method = return_method_hidden_param; /* Tell the target specific argument pushing routine not to expect a value. */ @@ -897,7 +888,8 @@ call_function_by_hand_dummy (struct value *function, } else { - struct_return = using_struct_return (gdbarch, function, values_type); + if (using_struct_return (gdbarch, function, values_type)) + return_method = return_method_struct; target_values_type = values_type; } @@ -1020,7 +1012,7 @@ call_function_by_hand_dummy (struct value *function, is being evaluated is OK because the thread is stopped until the expression is completely evaluated. */ - if (struct_return || hidden_first_param_p + if (return_method != return_method_normal || (stack_temporaries && class_or_union_p (values_type))) { if (gdbarch_inner_than (gdbarch, 1, 2)) @@ -1046,7 +1038,7 @@ call_function_by_hand_dummy (struct value *function, } std::vector new_args; - if (hidden_first_param_p) + if (return_method == return_method_hidden_param) { /* Add the new argument to the front of the argument list. */ new_args.push_back @@ -1060,8 +1052,9 @@ call_function_by_hand_dummy (struct value *function, presumably, the ABI code knows where, in the call dummy, the return address should be pointed. */ sp = gdbarch_push_dummy_call (gdbarch, function, get_current_regcache (), - bp_addr, nargs, args, - sp, struct_return, struct_addr); + bp_addr, nargs, args, sp, + (return_method == return_method_struct), + struct_addr); /* Set up a frame ID for the dummy frame so we can pass it to set_momentary_breakpoint. We need to give the breakpoint a frame @@ -1157,7 +1150,7 @@ call_function_by_hand_dummy (struct value *function, sm = new_call_thread_fsm (current_ui, command_interp (), gdbarch, function, values_type, - struct_return || hidden_first_param_p, + return_method != return_method_normal, struct_addr); e = run_inferior_call (sm, call_thread.get (), real_pc);