From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 4PXmJJz+PGA3JAAAWB0awg (envelope-from ) for ; Mon, 01 Mar 2021 09:47:56 -0500 Received: by simark.ca (Postfix, from userid 112) id 8C2DE1EF7C; Mon, 1 Mar 2021 09:47:56 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,MAILING_LIST_MULTI,MSGID_FROM_MTA_HEADER,RDNS_NONE, URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2 Received: from sourceware.org (unknown [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id F13981EF64 for ; Mon, 1 Mar 2021 09:47:54 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C0498393BC20; Mon, 1 Mar 2021 14:47:53 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C0498393BC20 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1614610073; bh=p5EUpYogD/h7HyKf0QbooGgtLHH9LB4Q8DTAMJcfgIM=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=Anr5mNu+7uJofio2t/sk+cnt2jzIU6C5WUz8J2NnWn99/SlA77/rwdcPOxlW1Ksso YAE0UAclZci4+Kc/aC04zP+1IVLlhWfBkfARKWoZFOPoIG+OOrJswZAV4Qs0wwFa6k +PaovxU+aNTaJQkRLxGVu9/wC2G36us2+6+28NsQ= Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2060.outbound.protection.outlook.com [40.107.237.60]) by sourceware.org (Postfix) with ESMTPS id 14581393BC27 for ; Mon, 1 Mar 2021 14:47:50 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 14581393BC27 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Ff+1poWpf2AHdvJTrjexRydMz2kgAUwKO9w51+yEP1Lx2WwlyV8GTAbkwvpKk2zW4/qAWDkKTw6GcL7OxCINjMmGqUhdIq6w0s334AE6+dBTN9dS/OrMdg1foJzXWs0OwPdmOYyT0mdhtfHmyAdC8E5Zvr04rGPCTQymPndIlGENbG8wsiKvk+r+Kqnr7a6fH+19K4N0gslWHyb49u7JW+xJGYOF+0/VWjkGSEEfmQ/O/edWTsUaJnm1J4ZpfPhc18IgW+yjyiY2OKOVslL9D7FimDaDJBMMRbMZbja1XXfTlOEL2beRh3i0D55A11/rGzPf+V5uP54NP9LewIE8Kw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=p5EUpYogD/h7HyKf0QbooGgtLHH9LB4Q8DTAMJcfgIM=; b=MxOxNb4lei5q9MXTmG0RU4h8uddm1Nn3slk6XsGeWRIboXrKe2xhkFdDNAV4FiuPgbQF9/BwEf/7JLcrMNDkoonAY1uCJcH2vb/kme9y0BXKr9KeoozTDGSAS7k2GJc4fkJ4EpzRrWrH+io9x66ldVeujB+sd8a3eBU0KJGlg0Aznfo7t8fY9tZEHmrSwjAnueGTQ4uIy/EjAxNLNMWEDFT0rpLXUW8o3C0xuxj0YIa/zfX6aB36A+dxfE8QQqrqwuNpcKVDLTGdH4ODbRxZEyFoelr2ABop12gcdk/Wy0+BYlPF57wedkYsd8Mw6BWLxwgViOBGKA7JAaKu6cbxUg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none Received: from DM6PR12MB2762.namprd12.prod.outlook.com (2603:10b6:5:45::15) by DM5PR12MB2342.namprd12.prod.outlook.com (2603:10b6:4:ba::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3890.28; Mon, 1 Mar 2021 14:47:46 +0000 Received: from DM6PR12MB2762.namprd12.prod.outlook.com ([fe80::31d8:f503:f7b2:f44]) by DM6PR12MB2762.namprd12.prod.outlook.com ([fe80::31d8:f503:f7b2:f44%3]) with mapi id 15.20.3868.033; Mon, 1 Mar 2021 14:47:46 +0000 To: gdb-patches@sourceware.org Subject: [PATCH 33/43] Remove old computed struct value callbacks Date: Mon, 1 Mar 2021 14:46:10 +0000 Message-Id: <20210301144620.103016-34-Zoran.Zaric@amd.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210301144620.103016-1-Zoran.Zaric@amd.com> References: <20210301144620.103016-1-Zoran.Zaric@amd.com> Content-Type: text/plain X-Originating-IP: [2a00:23c7:5a85:6801:b4ed:fe7b:8064:d4d] X-ClientProxiedBy: AM0PR04CA0073.eurprd04.prod.outlook.com (2603:10a6:208:be::14) To DM6PR12MB2762.namprd12.prod.outlook.com (2603:10b6:5:45::15) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from localhost.localdomain (2a00:23c7:5a85:6801:b4ed:fe7b:8064:d4d) by AM0PR04CA0073.eurprd04.prod.outlook.com (2603:10a6:208:be::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3890.19 via Frontend Transport; Mon, 1 Mar 2021 14:47:16 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: b478aa00-b602-4371-1278-08d8dcc0e8c8 X-MS-TrafficTypeDiagnostic: DM5PR12MB2342: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:644; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: G6sjIgrOay1JSInfy/s+d5AHU+x6GH4o+3j5URSObC9QaeSgwJ8862tuuvpAKTkt0oQ4QCfmrVmJE854Ol+qXPQFrqFQPi1dufPhKI6Q3ERzJHksTQYkSikHFjwCOAdjzhXmriOa6I9ss9nGqHcGURdlm6vSM3awRqnjazs3iicX0Blv5YRhAWXIIEC9wW4UjuZ90LTIYAJsLl5hL4rvs9uJOBRvUihV/DkAx5ibpILH0vlaAmYQUXZWayc9+GjszLR19atUQVLZsOAiK3uoJuhEhFmo3WqCuLTwWARcsHGOXaHtbjkLGRh6xPCR6Wb61MLwu0bKkus0dsgee5qhl+OWVRhkcxg9XT0l5b2QKBDgVQ2LVGa8i+/mZGxNEjjtJDwLA6MJQJr5bg24kTb1jv4pFABMwV5y56Ypevmdu5VLb0QGIk5hlnAGrlV3JvH0P1yBcZTwPYSujelotfqReXpRbx1fOVm0kez03xWaKOxfkxcYoY4Yt0rR0rDG3/urxSdPf0qR4H6kMlKQj94Xd6oR/3sQzLhn9s7liQJM/iOHwXr3ff1C39X+79cKa6ci9Pqtg/T7TIMhaZ0A03R/oA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM6PR12MB2762.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(366004)(346002)(396003)(376002)(39860400002)(136003)(6486002)(66476007)(4326008)(478600001)(66556008)(2906002)(66946007)(69590400012)(316002)(52116002)(6666004)(6916009)(2616005)(86362001)(16526019)(6512007)(36756003)(8676002)(8936002)(6506007)(30864003)(5660300002)(186003)(1076003)(83380400001); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?WXfyWEndTGgEa6WQFs0IvMLtd5bYvUJftli4R842o7UglrU0z6wUqcY5xWJO?= =?us-ascii?Q?f7qfexmu6H3i0xpZmOZWoV3RQJSGl2LxAf1NKT0Gk1kfSiEl/6+4CE9350Xu?= =?us-ascii?Q?36mTDLY4wglNseXFa3hNQQ2F5/NrhIqKkR8Hb1nisshnoV/+6aNUcdrAl2nF?= =?us-ascii?Q?iCo6WoG2bksFFnmJOfAqIsxZ1Mm1wLgz9ETcelJ+FORcYmcY+jOXLgpjQ04E?= =?us-ascii?Q?lpFLgFSEfpsBkJUqwoScAqJtMxFpGloAlCOFQhAUfGuVfXuyYUyg11wii3TB?= =?us-ascii?Q?uW5ObLnLgHOCFQlyC7bKBaUgixg/JwqPH8PGlOI5Rmnib0/NOvcAolJxs3m7?= =?us-ascii?Q?cUk+T7azbwa9614rfaTna49FahtGEo/ZAxGuMmoHP9Nh/tkwc5mk2dSwGHxU?= =?us-ascii?Q?2hQt4KNic/fTc5NJq9wg1R+N5MIPHJQzxgLkPq4ZzFy9IlQBnuhrKqbZaE7y?= =?us-ascii?Q?F2I9idVyLCTlhlClVdx2rCkVeqLJutHL95kwMbc46SHnKfJ2LlsehWuMMTVA?= =?us-ascii?Q?WwpmhkWsSSUEO5pDa2WemtIaXUid8TLsOpJm/lEZyDR1LOJ1vJdRF9gHhs74?= =?us-ascii?Q?D4Hs3B1uLTYL/LtNMV5+CQVmtyhU/aIbY/43SqztuYOmIPUc7PYYQTmQpVGc?= =?us-ascii?Q?ZcttTqBlJBAikHj+CZNUqJxgwIgP9T0XrYSXIyKAxt729rlTKYJxWb1PDWVe?= =?us-ascii?Q?Y2i7d7I4r+ILtOryy6cCmMm8ujNx1x/WhyipU2sOSYkLKuh837kwZLNq/fjX?= =?us-ascii?Q?U5XumJR89GZCWfh0PXRLC/50cWIDmvQ+XWjftrfdSlcsVWwEPdg6F8o1acz+?= =?us-ascii?Q?QFgeS1pqFu1ioV9HX7rPMFm4+E4D/rtjy4di6581SkWcc+pCMxIAUeMThL/o?= =?us-ascii?Q?MhbTY3vH0TYZJZRa2mbPnzWTlLgcERxEqderD1PO4OEYOAG+zolbuBGuZU94?= =?us-ascii?Q?JHANtYZYU10aawOc+LV9VrunCfcxFy5BR7/VRP+jFeQXcbUuGGJwB3yArsp3?= =?us-ascii?Q?+PL5uRITnrwtMhsng9PAvHsaxanpXMbHARcs8izJQdvtxBQhEnK6linMm7qs?= =?us-ascii?Q?bCpqePZUh2uDFGz+Kn0PkHe6kA1XeSiACF6SF6PJPXZ17QRjbYar0niEBbAJ?= =?us-ascii?Q?Akh2ew65BzizhVOpzcFtre2QTv9drfAoDa/dYrVwJIaVZEFm8t9bBoEetiog?= =?us-ascii?Q?UetpqubMdsWuBZsdJecyXVfI2ctsjvVocnfv5EegYa/Gv3donDyRSaMe7TrT?= =?us-ascii?Q?VHweY/hohxlzLsoD8LyfeWx8SBvtlTuQnHMhzLToR4PRr/uLcqdttgsf79zB?= =?us-ascii?Q?SyqIZ+BPrkrSPqFZ8KDWBmYwR+zCeZyfXWL9PuaT2w6/1a5KxMzfzgXCP0mP?= =?us-ascii?Q?1vxUETY/CmdAhf4SB1J9mmD5GzjY?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: b478aa00-b602-4371-1278-08d8dcc0e8c8 X-MS-Exchange-CrossTenant-AuthSource: DM6PR12MB2762.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Mar 2021 14:47:17.2981 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: u/EgbaJMAjk3+DOq/Z9doo20PiQj7l97HrbNplBzji/24zMjTH+GZUtlLm6yPvHFBeee3HAihEz8zKSFR4gUWg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR12MB2342 X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Zoran Zaric via Gdb-patches Reply-To: Zoran Zaric Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" After changing the DWARF stack to use the new DWARF entry based classes, the previous computed struct value callback infrastructure is not used anymore and can be removed. gdb/ChangeLog: * dwarf2/expr.c (struct piece_closure): Remove structure. (rw_pieced_value): Remove unused function. (read_pieced_value): Remove unused function. (write_pieced_value): Remove unused function. (check_pieced_synthetic_pointer): Remove unused function. (indirect_pieced_value): Remove unused function. (coerce_pieced_ref): Remove unused function. (copy_pieced_value_closure): Remove unused function. (free_pieced_value_closure): Remove unused function. * dwarf2/expr.h (class dwarf_entry): New declaration. (struct dwarf_expr_piece): Remove structure. (enum dwarf_value_location): Remove enumeration. --- gdb/dwarf2/expr.c | 519 ---------------------------------------------- gdb/dwarf2/expr.h | 72 ------- 2 files changed, 591 deletions(-) diff --git a/gdb/dwarf2/expr.c b/gdb/dwarf2/expr.c index d51366007ab..e45a7755ec5 100644 --- a/gdb/dwarf2/expr.c +++ b/gdb/dwarf2/expr.c @@ -2194,525 +2194,6 @@ gdb_value_to_dwarf_entry (struct gdbarch *arch, struct value *value) } } -struct piece_closure -{ - /* Reference count. */ - int refc = 0; - - /* The objfile from which this closure's expression came. */ - dwarf2_per_objfile *per_objfile = nullptr; - - /* The CU from which this closure's expression came. */ - struct dwarf2_per_cu_data *per_cu = NULL; - - /* The pieces describing this variable. */ - std::vector pieces; - - /* Frame ID of frame to which a register value is relative, used - only by DWARF_VALUE_REGISTER. */ - struct frame_id frame_id; -}; - -/* Read or write a pieced value V. If FROM != NULL, operate in "write - mode": copy FROM into the pieces comprising V. If FROM == NULL, - operate in "read mode": fetch the contents of the (lazy) value V by - composing it from its pieces. */ - -static void -rw_pieced_value (struct value *v, struct value *from) -{ - int i; - LONGEST offset = 0, max_offset; - ULONGEST bits_to_skip; - gdb_byte *v_contents; - const gdb_byte *from_contents; - struct piece_closure *c - = (struct piece_closure *) value_computed_closure (v); - gdb::byte_vector buffer; - bool bits_big_endian = type_byte_order (value_type (v)) == BFD_ENDIAN_BIG; - - if (from != NULL) - { - from_contents = value_contents (from); - v_contents = NULL; - } - else - { - if (value_type (v) != value_enclosing_type (v)) - internal_error (__FILE__, __LINE__, - _("Should not be able to create a lazy value with " - "an enclosing type")); - v_contents = value_contents_raw (v); - from_contents = NULL; - } - - bits_to_skip = 8 * value_offset (v); - if (value_bitsize (v)) - { - bits_to_skip += (8 * value_offset (value_parent (v)) - + value_bitpos (v)); - if (from != NULL - && (type_byte_order (value_type (from)) - == BFD_ENDIAN_BIG)) - { - /* Use the least significant bits of FROM. */ - max_offset = 8 * TYPE_LENGTH (value_type (from)); - offset = max_offset - value_bitsize (v); - } - else - max_offset = value_bitsize (v); - } - else - max_offset = 8 * TYPE_LENGTH (value_type (v)); - - /* Advance to the first non-skipped piece. */ - for (i = 0; i < c->pieces.size () && bits_to_skip >= c->pieces[i].size; i++) - bits_to_skip -= c->pieces[i].size; - - for (; i < c->pieces.size () && offset < max_offset; i++) - { - struct dwarf_expr_piece *p = &c->pieces[i]; - size_t this_size_bits, this_size; - - this_size_bits = p->size - bits_to_skip; - if (this_size_bits > max_offset - offset) - this_size_bits = max_offset - offset; - - switch (p->location) - { - case DWARF_VALUE_REGISTER: - { - struct frame_info *frame = frame_find_by_id (c->frame_id); - struct gdbarch *arch = get_frame_arch (frame); - int gdb_regnum = dwarf_reg_to_regnum_or_error (arch, p->v.regno); - ULONGEST reg_bits = 8 * register_size (arch, gdb_regnum); - int optim, unavail; - - if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG - && p->offset + p->size < reg_bits) - { - /* Big-endian, and we want less than full size. */ - bits_to_skip += reg_bits - (p->offset + p->size); - } - else - bits_to_skip += p->offset; - - this_size = bits_to_bytes (bits_to_skip, this_size_bits); - buffer.resize (this_size); - - if (from == NULL) - { - /* Read mode. */ - read_from_register (frame, gdb_regnum, bits_to_skip / 8, - buffer, &optim, &unavail); - - if (optim) - mark_value_bits_optimized_out (v, offset, this_size_bits); - if (unavail) - mark_value_bits_unavailable (v, offset, this_size_bits); - /* Only copy data if valid. */ - if (!optim && !unavail) - copy_bitwise (v_contents, offset, - buffer.data (), bits_to_skip % 8, - this_size_bits, bits_big_endian); - } - else - { - /* Write mode. */ - if (bits_to_skip % 8 != 0 || this_size_bits % 8 != 0) - { - /* Data is copied non-byte-aligned into the register. - Need some bits from original register value. */ - read_from_register (frame, gdb_regnum, bits_to_skip / 8, - buffer, &optim, &unavail); - if (optim) - throw_error (OPTIMIZED_OUT_ERROR, - _("Can't do read-modify-write to " - "update bitfield; containing word " - "has been optimized out")); - if (unavail) - throw_error (NOT_AVAILABLE_ERROR, - _("Can't do read-modify-write to " - "update bitfield; containing word " - "is unavailable")); - } - - copy_bitwise (buffer.data (), bits_to_skip % 8, - from_contents, offset, - this_size_bits, bits_big_endian); - write_to_register (frame, gdb_regnum, bits_to_skip / 8, - buffer, &optim, &unavail); - } - } - break; - - case DWARF_VALUE_MEMORY: - { - bits_to_skip += p->offset; - - CORE_ADDR start_addr = p->v.mem.addr + bits_to_skip / 8; - bool in_stack_memory = p->v.mem.in_stack_memory; - int unavail = 0; - - if (bits_to_skip % 8 == 0 && this_size_bits % 8 == 0 - && offset % 8 == 0) - { - /* Everything is byte-aligned; no buffer needed. */ - if (from != NULL) - write_to_memory (start_addr, (from_contents + offset / 8), - this_size_bits / 8, in_stack_memory, - &unavail); - else - read_from_memory (start_addr, (v_contents + offset / 8), - this_size_bits / 8, in_stack_memory, - &unavail); - } - else - { - this_size = bits_to_bytes (bits_to_skip, this_size_bits); - buffer.resize (this_size); - - if (from == NULL) - { - /* Read mode. */ - read_from_memory (start_addr, buffer.data (), - this_size, in_stack_memory, - &unavail); - if (!unavail) - copy_bitwise (v_contents, offset, - buffer.data (), bits_to_skip % 8, - this_size_bits, bits_big_endian); - } - else - { - /* Write mode. */ - if (bits_to_skip % 8 != 0 || this_size_bits % 8 != 0) - { - if (this_size <= 8) - { - /* Perform a single read for small sizes. */ - read_from_memory (start_addr, buffer.data (), - this_size, in_stack_memory, - &unavail); - } - else - { - /* Only the first and last bytes can possibly have - any bits reused. */ - read_from_memory (start_addr, buffer.data (), - 1, in_stack_memory, - &unavail); - if (!unavail) - read_from_memory (start_addr + this_size - 1, - &buffer[this_size - 1], 1, - in_stack_memory, &unavail); - } - } - - if (!unavail) - { - copy_bitwise (buffer.data (), bits_to_skip % 8, - from_contents, offset, - this_size_bits, bits_big_endian); - write_to_memory (start_addr, buffer.data (), - this_size, in_stack_memory, - &unavail); - } - } - } - - if (unavail) - { - if (from == NULL) - mark_value_bits_unavailable (v, (offset + bits_to_skip % 8), - this_size_bits); - else - throw_error (NOT_AVAILABLE_ERROR, - _("Can't do read-modify-write to " - "update bitfield; containing word " - "is unavailable")); - } - } - break; - - case DWARF_VALUE_STACK: - { - if (from != NULL) - { - mark_value_bits_optimized_out (v, offset, this_size_bits); - break; - } - - gdbarch *objfile_gdbarch = c->per_objfile->objfile->arch (); - ULONGEST stack_value_size_bits - = 8 * TYPE_LENGTH (value_type (p->v.value)); - - /* Use zeroes if piece reaches beyond stack value. */ - if (p->offset + p->size > stack_value_size_bits) - break; - - /* Piece is anchored at least significant bit end. */ - if (gdbarch_byte_order (objfile_gdbarch) == BFD_ENDIAN_BIG) - bits_to_skip += stack_value_size_bits - p->offset - p->size; - else - bits_to_skip += p->offset; - - copy_bitwise (v_contents, offset, - value_contents_all (p->v.value), - bits_to_skip, - this_size_bits, bits_big_endian); - } - break; - - case DWARF_VALUE_LITERAL: - { - if (from != NULL) - { - mark_value_bits_optimized_out (v, offset, this_size_bits); - break; - } - - ULONGEST literal_size_bits = 8 * p->v.literal.length; - size_t n = this_size_bits; - - /* Cut off at the end of the implicit value. */ - bits_to_skip += p->offset; - if (bits_to_skip >= literal_size_bits) - break; - if (n > literal_size_bits - bits_to_skip) - n = literal_size_bits - bits_to_skip; - - copy_bitwise (v_contents, offset, - p->v.literal.data, bits_to_skip, - n, bits_big_endian); - } - break; - - case DWARF_VALUE_IMPLICIT_POINTER: - if (from != NULL) - { - mark_value_bits_optimized_out (v, offset, this_size_bits); - break; - } - - /* These bits show up as zeros -- but do not cause the value to - be considered optimized-out. */ - break; - - case DWARF_VALUE_OPTIMIZED_OUT: - mark_value_bits_optimized_out (v, offset, this_size_bits); - break; - - default: - internal_error (__FILE__, __LINE__, _("invalid location type")); - } - - offset += this_size_bits; - bits_to_skip = 0; - } -} - -static void -read_pieced_value (struct value *v) -{ - rw_pieced_value (v, NULL); -} - -static void -write_pieced_value (struct value *to, struct value *from) -{ - rw_pieced_value (to, from); -} - -/* An implementation of an lval_funcs method to see whether a value is - a synthetic pointer. */ - -static int -check_pieced_synthetic_pointer (const struct value *value, LONGEST bit_offset, - int bit_length) -{ - struct piece_closure *c - = (struct piece_closure *) value_computed_closure (value); - int i; - - bit_offset += 8 * value_offset (value); - if (value_bitsize (value)) - bit_offset += value_bitpos (value); - - for (i = 0; i < c->pieces.size () && bit_length > 0; i++) - { - struct dwarf_expr_piece *p = &c->pieces[i]; - size_t this_size_bits = p->size; - - if (bit_offset > 0) - { - if (bit_offset >= this_size_bits) - { - bit_offset -= this_size_bits; - continue; - } - - bit_length -= this_size_bits - bit_offset; - bit_offset = 0; - } - else - bit_length -= this_size_bits; - - if (p->location != DWARF_VALUE_IMPLICIT_POINTER) - return 0; - } - - return 1; -} - -/* An implementation of an lval_funcs method to indirect through a - pointer. This handles the synthetic pointer case when needed. */ - -static struct value * -indirect_pieced_value (struct value *value) -{ - struct piece_closure *c - = (struct piece_closure *) value_computed_closure (value); - struct type *type; - struct frame_info *frame; - int i, bit_length; - LONGEST bit_offset; - struct dwarf_expr_piece *piece = NULL; - LONGEST byte_offset; - enum bfd_endian byte_order; - - type = check_typedef (value_type (value)); - if (type->code () != TYPE_CODE_PTR) - return NULL; - - bit_length = 8 * TYPE_LENGTH (type); - bit_offset = 8 * value_offset (value); - if (value_bitsize (value)) - bit_offset += value_bitpos (value); - - for (i = 0; i < c->pieces.size () && bit_length > 0; i++) - { - struct dwarf_expr_piece *p = &c->pieces[i]; - size_t this_size_bits = p->size; - - if (bit_offset > 0) - { - if (bit_offset >= this_size_bits) - { - bit_offset -= this_size_bits; - continue; - } - - bit_length -= this_size_bits - bit_offset; - bit_offset = 0; - } - else - bit_length -= this_size_bits; - - if (p->location != DWARF_VALUE_IMPLICIT_POINTER) - return NULL; - - if (bit_length != 0) - error (_("Invalid use of DW_OP_implicit_pointer")); - - piece = p; - break; - } - - gdb_assert (piece != NULL && c->per_cu != nullptr); - frame = get_selected_frame (_("No frame selected.")); - - /* This is an offset requested by GDB, such as value subscripts. - However, due to how synthetic pointers are implemented, this is - always presented to us as a pointer type. This means we have to - sign-extend it manually as appropriate. Use raw - extract_signed_integer directly rather than value_as_address and - sign extend afterwards on architectures that would need it - (mostly everywhere except MIPS, which has signed addresses) as - the later would go through gdbarch_pointer_to_address and thus - return a CORE_ADDR with high bits set on architectures that - encode address spaces and other things in CORE_ADDR. */ - byte_order = gdbarch_byte_order (get_frame_arch (frame)); - byte_offset = extract_signed_integer (value_contents (value), - TYPE_LENGTH (type), byte_order); - byte_offset += piece->v.ptr.offset; - - return indirect_synthetic_pointer (piece->v.ptr.die_sect_off, - byte_offset, c->per_cu, - c->per_objfile, frame, type); -} - -/* Implementation of the coerce_ref method of lval_funcs for synthetic C++ - references. */ - -static struct value * -coerce_pieced_ref (const struct value *value) -{ - struct type *type = check_typedef (value_type (value)); - - if (value_bits_synthetic_pointer (value, value_embedded_offset (value), - TARGET_CHAR_BIT * TYPE_LENGTH (type))) - { - const struct piece_closure *closure - = (struct piece_closure *) value_computed_closure (value); - struct frame_info *frame - = get_selected_frame (_("No frame selected.")); - - /* gdb represents synthetic pointers as pieced values with a single - piece. */ - gdb_assert (closure != NULL); - gdb_assert (closure->pieces.size () == 1); - - return indirect_synthetic_pointer - (closure->pieces[0].v.ptr.die_sect_off, - closure->pieces[0].v.ptr.offset, - closure->per_cu, closure->per_objfile, frame, type); - } - else - { - /* Else: not a synthetic reference; do nothing. */ - return NULL; - } -} - -static void * -copy_pieced_value_closure (const struct value *v) -{ - struct piece_closure *c - = (struct piece_closure *) value_computed_closure (v); - - ++c->refc; - return c; -} - -static void -free_pieced_value_closure (struct value *v) -{ - struct piece_closure *c - = (struct piece_closure *) value_computed_closure (v); - - --c->refc; - if (c->refc == 0) - { - for (dwarf_expr_piece &p : c->pieces) - if (p.location == DWARF_VALUE_STACK) - value_decref (p.v.value); - - delete c; - } -} - -/* Functions for accessing a variable described by DW_OP_piece. */ -static const struct lval_funcs pieced_value_funcs = { - read_pieced_value, - write_pieced_value, - indirect_pieced_value, - coerce_pieced_ref, - check_pieced_synthetic_pointer, - copy_pieced_value_closure, - free_pieced_value_closure -}; - /* Given context CTX, section offset SECT_OFF, and compilation unit data PER_CU, execute the "variable value" operation on the DIE found at SECT_OFF. */ diff --git a/gdb/dwarf2/expr.h b/gdb/dwarf2/expr.h index 2d24f4402db..3c404d8f83c 100644 --- a/gdb/dwarf2/expr.h +++ b/gdb/dwarf2/expr.h @@ -28,78 +28,6 @@ class dwarf_entry; struct dwarf2_per_objfile; -/* The location of a value. */ -enum dwarf_value_location -{ - /* The piece is in memory. - The value on the dwarf stack is its address. */ - DWARF_VALUE_MEMORY, - - /* The piece is in a register. - The value on the dwarf stack is the register number. */ - DWARF_VALUE_REGISTER, - - /* The piece is on the dwarf stack. */ - DWARF_VALUE_STACK, - - /* The piece is a literal. */ - DWARF_VALUE_LITERAL, - - /* The piece was optimized out. */ - DWARF_VALUE_OPTIMIZED_OUT, - - /* The piece is an implicit pointer. */ - DWARF_VALUE_IMPLICIT_POINTER -}; - -/* A piece of an object, as recorded by DW_OP_piece or DW_OP_bit_piece. */ -struct dwarf_expr_piece -{ - enum dwarf_value_location location; - - union - { - struct - { - /* This piece's address, for DWARF_VALUE_MEMORY pieces. */ - CORE_ADDR addr; - /* Non-zero if the piece is known to be in memory and on - the program's stack. */ - bool in_stack_memory; - } mem; - - /* The piece's register number, for DWARF_VALUE_REGISTER pieces. */ - int regno; - - /* The piece's literal value, for DWARF_VALUE_STACK pieces. */ - struct value *value; - - struct - { - /* A pointer to the data making up this piece, - for DWARF_VALUE_LITERAL pieces. */ - const gdb_byte *data; - /* The length of the available data. */ - ULONGEST length; - } literal; - - /* Used for DWARF_VALUE_IMPLICIT_POINTER. */ - struct - { - /* The referent DIE from DW_OP_implicit_pointer. */ - sect_offset die_sect_off; - /* The byte offset into the resulting data. */ - LONGEST offset; - } ptr; - } v; - - /* The length of the piece, in bits. */ - ULONGEST size; - /* The piece offset, in bits. */ - ULONGEST offset; -}; - - /* The expression evaluator works with a dwarf_expr_context, describing its current state and its callbacks. */ struct dwarf_expr_context -- 2.17.1