From patchwork Wed Nov 7 23:10:06 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joel Brobecker X-Patchwork-Id: 30071 Received: (qmail 92924 invoked by alias); 7 Nov 2018 23:10:21 -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 92909 invoked by uid 89); 7 Nov 2018 23:10:20 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=Hx-languages-length:2796, 425, pck.adb, UD:pck.adb X-HELO: rock.gnat.com Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 07 Nov 2018 23:10:18 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 3497456103; Wed, 7 Nov 2018 18:10:17 -0500 (EST) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id g854tklz8aQz; Wed, 7 Nov 2018 18:10:17 -0500 (EST) Received: from tron.gnat.com (tron.gnat.com [205.232.38.10]) by rock.gnat.com (Postfix) with ESMTP id 2512956102; Wed, 7 Nov 2018 18:10:17 -0500 (EST) Received: by tron.gnat.com (Postfix, from userid 4233) id 095243517; Wed, 7 Nov 2018 18:10:17 -0500 (EST) From: Joel Brobecker To: gdb-patches@sourceware.org Cc: Alan Hayward Subject: [RFA] (AArch64) wrong value returned by "finish" for HFA Date: Wed, 7 Nov 2018 18:10:06 -0500 Message-Id: <1541632206-143680-1-git-send-email-brobecker@adacore.com> Hello, Consider the gdb.ada/array_return.exp testcase, and in particular, consider the following code... type Small_Float_Vector is array (1 .. 2) of Float; function Create_Small_Float_Vector return Small_Float_Vector is begin return (others => 4.25); end Create_Small_Float_Vector; ... which declares a type which is an array with 2 floats in it (floats are 4 bytes on AArch64), trying to get GDB to print the return value from that function does not work: (gdb) fin Run till exit from #0 pck.create_small_float_vector () at /[...]/pck.adb:15 0x000000000000062c in p () at /[...]/p.adb:11 11 Vector := Create_Small_Float_Vector; Value returned is $1 = (4.25, 0.0) ^^^ ||| We expected the value shown to be: (gdb) fin Run till exit from #0 pck.create_small_float_vector () at /[...]/pck.adb:15 0x000000000000062c in p () at /[...]/p.adb:11 11 Vector := Create_Small_Float_Vector; Value returned is $1 = (4.25, 4.25) Because the return type is an HFA, it is returned via the first two SIMD registers. However, what happens is that the current implementation fails to realize that this is an HFA, and therefore fetches the return value from the wrong location. And the reason why it fails to realize this is because it thinks that our array has 8 elements (HFAs have a maximum of 4). Looking at aapcs_is_vfp_call_or_return_candidate_1, where this is determined, we can easily see why (looks like a thinko): | case TYPE_CODE_ARRAY: | [...] | struct type *target_type = TYPE_TARGET_TYPE (type); | int count = aapcs_is_vfp_call_or_return_candidate_1 | (target_type, fundamental_type); | | if (count == -1) | return count; | !! -> | count *= TYPE_LENGTH (type); | return count; Here, we first determine the count for one element of our array, and so we should then be multiplying that count by the number of elements in our array (2 in our case). But instead, we multiply it by the total size (8). As a result, we do not classify the return type as an HFA, and thus pick the wrong location for fetching the return value. gdb/ChangeLog: * aarch64-tdep.c (aapcs_is_vfp_call_or_return_candidate_1): return the correct count for potential HFAs. Tested on aarch64-linux, fixes: array_return.exp: value printed by finish of Create_Small_Float_Vector OK to commit? Thank you, diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index 0211930..51f1632 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -1212,7 +1212,7 @@ aapcs_is_vfp_call_or_return_candidate_1 (struct type *type, if (count == -1) return count; - count *= TYPE_LENGTH (type); + count *= (TYPE_LENGTH (type) / TYPE_LENGTH (target_type)); return count; } }