From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2065.outbound.protection.outlook.com [40.107.237.65]) by sourceware.org (Postfix) with ESMTPS id C45443858D28 for ; Fri, 5 Nov 2021 11:39:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org C45443858D28 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=i7ca5tJnG/ki3Q1/rjH9S3R2PMAU78SH83ZN9OTvBbM6lp6uKAZ+RKdaTrmmonqHs1oXiKSdUrqQ1AXfBlg5OMGbnZ54zI01hAM678FC9qvD1CqDIDmAJCPJvwKSbK0xZ2lvfNGgKE8asTx/M2IZJEA+kJQNj4Vjs4NtEtOj4Ecw6Lstw1yXGhKWyQpaQAjvRkYz33kRdzYLXyMWgT92qHxZeK/E8gvzjKZPzP0ouAcrIPEibNhoJSZsYwuCfB9jVw+68WxCknc/+YCicW8G3WIKZYLVd7YGAgM+g2RUFdkgT7XTnvr8MLs62/Mc1PluEuAqNiehPDDrusDd/zuQ+g== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=WHkOQdlS9+TISNnYTdrQDw5bkBDOWmTHGMlN7XLw0wQ=; b=SpxQPGVR2O3d7uIT2YvNrmg0GQ54PBhsip30rdvXAW6I68wgMhT8NoLWcPBzvnkBAGMhBG+o/SbbU4R2JPAhczmUXiewVp/QhhfjwpmUJZzEhP+rQgVksHhbZwqf1QepnB6FOdDT006C7TgQxy6czX1XiDXQ6iEPVqRBRRWvTRPnuF3QW9W7uNWa2YozGPLnLthEeZDk/1cY6U/jNnvY650ZBPrD1GuDxbkvOWxjWr+EnFl/lXhGG7abrYFwUszv6e12y1ZR/F5ILcMb8yNK9i9j2JXx0IB9kqi2tjISM8h09WufAzbe/rXkj9fhQhKqMILpiIJcZDkXPA3FHPycgg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=sourceware.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none Received: from MW4PR04CA0175.namprd04.prod.outlook.com (2603:10b6:303:85::30) by CH0PR12MB5281.namprd12.prod.outlook.com (2603:10b6:610:d4::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4669.13; Fri, 5 Nov 2021 11:39:26 +0000 Received: from CO1NAM11FT047.eop-nam11.prod.protection.outlook.com (2603:10b6:303:85:cafe::68) by MW4PR04CA0175.outlook.office365.com (2603:10b6:303:85::30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4669.11 via Frontend Transport; Fri, 5 Nov 2021 11:39:26 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; sourceware.org; dkim=none (message not signed) header.d=none;sourceware.org; dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; Received: from SATLEXMB04.amd.com (165.204.84.17) by CO1NAM11FT047.mail.protection.outlook.com (10.13.174.132) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.4669.10 via Frontend Transport; Fri, 5 Nov 2021 11:39:23 +0000 Received: from localhost.localdomain (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.15; Fri, 5 Nov 2021 06:39:21 -0500 From: Zoran Zaric To: Subject: [PATCH v4 17/28] Remove old computed struct value callbacks Date: Fri, 5 Nov 2021 11:38:38 +0000 Message-ID: <20211105113849.118800-18-zoran.zaric@amd.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211105113849.118800-1-zoran.zaric@amd.com> References: <20211105113849.118800-1-zoran.zaric@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB04.amd.com (10.181.40.145) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: e7851dd8-702a-4248-1683-08d9a050ea39 X-MS-TrafficTypeDiagnostic: CH0PR12MB5281: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:644; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 6Rh7nJiSuQqA30lVE5v2UyAVsrZsoMGwsmS/V+KgacWgk6WCVvTUr6wZmO6XGVn2mHXQ7Jv3r26KnUFaz1xL/X3Y8JyBilFc5ipCBYyUOZGWAwVTIiLtLNleemmMW5tJlhwVvG0cajklj6Dr++dVa0aWaqTEGxKPfie2uXsh0Paa3+/6ohm39BueFeanM+rrEIWxWp2L98W7w5Sjnr/YLJZd6c74xl95E4WVzcW9gSDZ9g694yXDkTlqrldHRkpeGH5PnUisD6b6EbrU6YsA/Lby/Wi1oalIOBrlGESy0OSQFW69wPujfmfJrmZ5bk8tBmXYU6lNaI6xFyMVe5wOZWCbBenAa/nUc0yPuwoRx+OZuDGgcLqbbjZLhmrrIwV/QvUg+CGzhGQNlquYBtneGyHiQaffNitCvCrpI9YGRAj7hfSaD3oueCWnpiVDCq96gIRaiWDpQzUP4vPjvt7HtNtcNK4fpG/yHuj+Ut+UzbItL7VQ3fSw+YtYSWx70hozVPmOJ+TqojLKNHgKZxXG4Hv8ozAmg6Ntv1N/ckhuGzlM5ArIWUMXEoYcvYbC0oC4srmUQcVOsj8L6S2iN0SQ8T3D70w1ga5ptiAC0zlf0x49/aiSJ2AGycKoU6G70CVoZGYdJvqD1WJvSLxBuPfw3nVbYQ9QUn8s00SPhtIFb0RHzVuM2jviXRSc/qfw5NqtWRKsyIhZSFCaNzwSQWUUOFokbYCakeGclMfuKkywyGo= X-Forefront-Antispam-Report: CIP:165.204.84.17; CTRY:US; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:SATLEXMB04.amd.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(4636009)(36840700001)(46966006)(336012)(186003)(16526019)(2906002)(8676002)(36756003)(47076005)(82310400003)(508600001)(2616005)(426003)(26005)(4326008)(81166007)(356005)(86362001)(6916009)(83380400001)(1076003)(8936002)(70586007)(6666004)(70206006)(36860700001)(30864003)(316002)(5660300002)(44832011)(36900700001); DIR:OUT; SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Nov 2021 11:39:23.5384 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e7851dd8-702a-4248-1683-08d9a050ea39 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17]; Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CO1NAM11FT047.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR12MB5281 X-Spam-Status: No, score=-12.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org 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: , X-List-Received-Date: Fri, 05 Nov 2021 11:39:30 -0000 From: Zoran Zaric 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 | 542 ---------------------------------------------- gdb/dwarf2/expr.h | 72 ------ 2 files changed, 614 deletions(-) diff --git a/gdb/dwarf2/expr.c b/gdb/dwarf2/expr.c index b77fe81eb50..08f56f070c6 100644 --- a/gdb/dwarf2/expr.c +++ b/gdb/dwarf2/expr.c @@ -2362,548 +2362,6 @@ gdb_value_to_dwarf_entry (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. */ - dwarf2_per_cu_data *per_cu = nullptr; - - /* 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. If CHECK_OPTIMIZED is true, then no - reading or writing is done; instead the return value of this - function is true if any piece is optimized out. When - CHECK_OPTIMIZED is true, FROM must be nullptr. */ - -static bool -rw_pieced_value (value *v, value *from, bool check_optimized) -{ - int i; - LONGEST offset = 0, max_offset; - gdb_byte *v_contents; - const gdb_byte *from_contents; - piece_closure *c - = (piece_closure *) value_computed_closure (v); - gdb::byte_vector buffer; - bool bits_big_endian = type_byte_order (value_type (v)) == BFD_ENDIAN_BIG; - - gdb_assert (!check_optimized || from == nullptr); - if (from != nullptr) - { - from_contents = value_contents (from).data (); - v_contents = nullptr; - } - 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")); - if (check_optimized) - v_contents = nullptr; - else - v_contents = value_contents_raw (v).data (); - from_contents = nullptr; - } - - ULONGEST 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 != nullptr - && (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++) - { - 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: - { - frame_info *frame = frame_find_by_id (c->frame_id); - 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 == nullptr) - { - /* Read mode. */ - read_from_register (frame, gdb_regnum, bits_to_skip / 8, - buffer, &optim, &unavail); - - if (optim) - { - if (check_optimized) - return true; - 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 && !check_optimized) - 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: - { - if (check_optimized) - break; - - 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 (check_optimized) - break; - - if (from != nullptr) - { - 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).data (), - bits_to_skip, - this_size_bits, bits_big_endian); - } - break; - - case DWARF_VALUE_LITERAL: - { - if (check_optimized) - break; - - if (from != nullptr) - { - 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 != nullptr) - { - 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: - if (check_optimized) - return true; - 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; - } - - return false; -} - -static void -read_pieced_value (value *v) -{ - rw_pieced_value (v, nullptr, false); -} - -static void -write_pieced_value (value *to, value *from) -{ - rw_pieced_value (to, from, false); -} - -static bool -is_optimized_out_pieced_value (value *v) -{ - return rw_pieced_value (v, nullptr, true); -} - -/* An implementation of an lval_funcs method to see whether a value is - a synthetic pointer. */ - -static int -check_pieced_synthetic_pointer (const value *value, LONGEST bit_offset, - int bit_length) -{ - piece_closure *c = (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++) - { - 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 value * -indirect_pieced_value (value *value) -{ - piece_closure *c - = (piece_closure *) value_computed_closure (value); - int i; - dwarf_expr_piece *piece = NULL; - - struct type *type = check_typedef (value_type (value)); - if (type->code () != TYPE_CODE_PTR) - return NULL; - - int bit_length = 8 * TYPE_LENGTH (type); - LONGEST 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++) - { - 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_info *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. */ - bfd_endian byte_order = gdbarch_byte_order (get_frame_arch (frame)); - LONGEST byte_offset - = extract_signed_integer (value_contents (value).data (), - 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 value * -coerce_pieced_ref (const 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 piece_closure *closure - = (piece_closure *) value_computed_closure (value); - 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 value *v) -{ - piece_closure *c = (piece_closure *) value_computed_closure (v); - - ++c->refc; - return c; -} - -static void -free_pieced_value_closure (value *v) -{ - piece_closure *c = (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, - is_optimized_out_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 4e74fed4f07..d39a9d9e50c 100644 --- a/gdb/dwarf2/expr.h +++ b/gdb/dwarf2/expr.h @@ -44,78 +44,6 @@ using dwarf_entry_up = std::unique_ptr; 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