From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id pkb8I3uh+mg6HAUAWB0awg (envelope-from ) for ; Thu, 23 Oct 2025 17:43:23 -0400 Authentication-Results: simark.ca; dkim=pass (2048-bit key; secure) header.d=imcan.dev header.i=@imcan.dev header.a=rsa-sha256 header.s=google header.b=L8IAwZEv; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 82D581E057; Thu, 23 Oct 2025 17:43:23 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED autolearn=ham autolearn_force=no version=4.0.1 Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 688301E057 for ; Thu, 23 Oct 2025 17:43:22 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 00D0D3857B9B for ; Thu, 23 Oct 2025 21:43:21 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 00D0D3857B9B Authentication-Results: sourceware.org; dkim=pass (2048-bit key, secure) header.d=imcan.dev header.i=@imcan.dev header.a=rsa-sha256 header.s=google header.b=L8IAwZEv Received: from mail-pj1-x102d.google.com (mail-pj1-x102d.google.com [IPv6:2607:f8b0:4864:20::102d]) by sourceware.org (Postfix) with ESMTPS id 159C93858CDA for ; Thu, 23 Oct 2025 21:42:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 159C93858CDA Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=imcan.dev Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=imcan.dev ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 159C93858CDA Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::102d ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1761255756; cv=none; b=Y/+Q1FdvrUjfl9109AhIgrpiMZTtZ/PpRG9drPociv9wRDIPGB/WycTk8HVZmvv5nOTFl2Sa/mqLZ2VQkwvSKv+J13eQA1lV2EtZVhrv5aCgme4Zw0S2jYRQ9OAOz59XHWYpZfcVhEuUtzVFs9IHzywcUHT8VfXC2ylgzncfIuE= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1761255756; c=relaxed/simple; bh=ZT+sUll5bsar3qpTDuwGn288IdhajEDbnvhQbR+xyGg=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=upDidD57GpbrTg41smRfVPohEmC8agwNzV3eDznV/lHnM2UXjifnpZmQ9s+/CCHyhZ4MMkHbKaIudQ7Gc21oNyIU349hXEsZ1+8MaZaXp5vKBUmQ3lLB4OqlcjJ3kmnU8IrQiBAxSmFsWEpQh2VGny6ds2h0GlHLQJLnhU4mq5I= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 159C93858CDA Received: by mail-pj1-x102d.google.com with SMTP id 98e67ed59e1d1-33badfbbc48so1790604a91.2 for ; Thu, 23 Oct 2025 14:42:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=imcan.dev; s=google; t=1761255755; x=1761860555; darn=sourceware.org; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:from:to:cc:subject:date:message-id:reply-to; bh=lf0jfYIvrtsMzGxJeVCgn/82HJiZlgr5bE717OakoIE=; b=L8IAwZEvkdNG3tHPXxpLqj87o0hAx+BBhsRTa4FWmpV3a8WofAK0nzX3ZBlUAXYRgW T6CnE/TxpKXeZBUIbDLJ7MNq6RhgYNJ6Fxsao3UPm89hvdKSRhgQo82C3RLRRjZ2LO3G 9pNDoLlABipZfxTV5nrzpwXqiwNRk7mRSczhUus1gV/wLkMYjFERoJqMWaRuTASjZZeg 2iMZEQ0btmpaDQtKZG947X5IlmMJd3AjbGpUDWCU63rii0Z9b34FnZCk3W1EX+WwUCrv qvTw++mYvzoeJK7mf4WMtj1yq1cPHUkUMUzCPjE5VTSDymJnTnKBa5CWEIv1yo4dgzTD NTPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761255755; x=1761860555; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=lf0jfYIvrtsMzGxJeVCgn/82HJiZlgr5bE717OakoIE=; b=nA4NFqd2Fl9nm256YJfOs/RJ1mzGK57fLyO7DrWyIRSSdyiU90ydlajPMbnnvUUZw9 9Yx9BXQoKqzSxpwG0/DnjV+Cy5p2+lD7FMXGR2nVaCVwBQTHaZo+q+O3YZB2xqFv3OLy feuJW2jFrxVahnwI5v+0NoMGNglgAvoc6ol3VKpJnZR7QtEh1g2o//Or0TKGgoVpTPft HyxNrQx0V/HDEWRbAMCcxD7d8UVcThzozzP1bgxEY/FEIcqQrwWfSedZBWVKlRXvNHWx MiOs06Hs4eYPYonjhcUFRD2UwoImWQqhSLX9yvogvHhlJd28DxeTJwPoSxt5P0NkcBMO Wm0A== X-Gm-Message-State: AOJu0YwjxWSZYPOfLle7VrOeTrQOWQh+0Nd9gFv/+PtjSB1/zskES5Sl knyuI+sNowrulxmwiI7Rm5DiUoY0sdNg+JMWsuVmEDVrAqU1KL8bVt+zlUdxnHcwRruUIAU7+F+ RQGm6+aA= X-Gm-Gg: ASbGncsJeowtYa+mt7cpgBfBjwzdWNZr904XMpzSnnfbqVjXY8XvDhga4ePQueIlp1e J9e9son7MGasKWf/fJWilJnQrGj3cZTWrZQF5+RI28rYIJ87mDfDBRacJGRaixZNgUD3wWz4Ak1 KU6algj2B9ujzAj00PfEND1R9Avbl2He9c7HnlthL/Ze8c2553Ez2gINP8Gff7pHWVY4lk7iKtg /K0EkduluASjLdD6IT8XkEQYufkwSqEneKGWfkLyMvyX6/IxLSSl4ePjXTuyAIQrPhnzWJaL4NB lYr8rWYVZ5m1tAcNCyTJvYfP39l68NIKmvNwcX3Nj/ExesNKpsq0K8dcTKdkSBURdFEW4evrOmw ajgON2Pxm3u6qdo3SpNB6dIr2KOOYKaCNrbGJd6likW7cUGZSPacwl5vCYck6ufGcnTIGDKMZN4 k9JRDZk+Kr5PZvxXhlcEBH674A23y9hcPoUIf45sJ/4oHKpEd66/nviPIiuKYBOnSUvPEWjVPgg VNb+3DQpfpTKtA99Sod7Y6+bkmG01sbLU/Rfy9pwS0Rp/Y= X-Google-Smtp-Source: AGHT+IHv8/BaNoqRgBb9pas2JiCBZDKGlblceOMDBOVVhbemHZ+xfaIYgyPuHA9MYTM0sCaCcn8MLg== X-Received: by 2002:a17:90b:3d87:b0:32b:96fa:5f46 with SMTP id 98e67ed59e1d1-33bcf86bcd7mr30458263a91.5.1761255754616; Thu, 23 Oct 2025 14:42:34 -0700 (PDT) Received: from dhcp-128-189-202-102.ubcsecure.wireless.ubc.ca (dhcp-128-189-202-102.ubcsecure.wireless.ubc.ca. [128.189.202.102]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-33dfb7d6b54sm3996894a91.4.2025.10.23.14.42.33 for (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Thu, 23 Oct 2025 14:42:34 -0700 (PDT) From: Can Acar To: gdb-patches@sourceware.org Subject: [PATCH] Fix: Sign extensions for DW_FORM_addrx were never considered Date: Thu, 23 Oct 2025 14:42:26 -0700 Message-ID: <20251023214230.13646-1-canacar@imcan.dev> X-Mailer: git-send-email 2.50.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org DW_FORM_addr is converted (sign-extended) to a signed value when the dwarf size is less than the size of unrelocated_addr, if the target architecture "naturally" sign extends an address (bfd.c). However, the same handling was not done for DW_FORM_addrx. This meant that for example, trying to `list` a function with an address >= 0x80000000 on (some?) 32-bit mips targets, when that address was encoded using DW_FORM_addrx, was broken. This patch fixes this issue by plumbing read_addr_index_1 into unit_head::read_address, which is the function used to extract information from DW_FORM_addr, and so it handles this case correctly. --- gdb/dwarf2/read.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 955893c5f0c..e83d6ca38ae 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -15350,12 +15350,14 @@ dwarf2_per_objfile::read_line_string (const gdb_byte *buf, static unrelocated_addr read_addr_index_1 (dwarf2_per_objfile *per_objfile, unsigned int addr_index, - std::optional addr_base, int addr_size) + std::optional addr_base, unit_head *cu_header) { struct objfile *objfile = per_objfile->objfile; bfd *abfd = objfile->obfd.get (); const gdb_byte *info_ptr; ULONGEST addr_base_or_zero = addr_base.has_value () ? *addr_base : 0; + unsigned int ignore_bytes_read; + unsigned char addr_size = cu_header->addr_size; per_objfile->per_bfd->addr.read (objfile); if (per_objfile->per_bfd->addr.buffer == NULL) @@ -15368,10 +15370,7 @@ read_addr_index_1 (dwarf2_per_objfile *per_objfile, unsigned int addr_index, objfile_name (objfile)); info_ptr = (per_objfile->per_bfd->addr.buffer + addr_base_or_zero + addr_index * addr_size); - if (addr_size == 4) - return (unrelocated_addr) bfd_get_32 (abfd, info_ptr); - else - return (unrelocated_addr) bfd_get_64 (abfd, info_ptr); + return cu_header->read_address(abfd, info_ptr, &ignore_bytes_read); } /* Given index ADDR_INDEX in .debug_addr, fetch the value. */ @@ -15380,7 +15379,7 @@ static unrelocated_addr read_addr_index (struct dwarf2_cu *cu, unsigned int addr_index) { return read_addr_index_1 (cu->per_objfile, addr_index, - cu->addr_base, cu->header.addr_size); + cu->addr_base, &cu->header); } /* Given a pointer to an leb128 value, fetch the value from .debug_addr. */ @@ -15403,9 +15402,9 @@ dwarf2_read_addr_index (dwarf2_per_cu *per_cu, dwarf2_per_objfile *per_objfile, { struct dwarf2_cu *cu = per_objfile->get_cu (per_cu); std::optional addr_base; - int addr_size; + unit_head *cu_header; - /* We need addr_base and addr_size. + /* We need addr_base and header (only some fields of which are used later). If we don't have PER_CU->cu, we have to get it. Nasty, but the alternative is storing the needed info in PER_CU, which at this point doesn't seem justified: it's not clear how frequently @@ -15424,17 +15423,17 @@ dwarf2_read_addr_index (dwarf2_per_cu *per_cu, dwarf2_per_objfile *per_objfile, if (cu != NULL) { addr_base = cu->addr_base; - addr_size = cu->header.addr_size; + cu_header = &cu->header; } else { cutu_reader reader (*per_cu, *per_objfile, nullptr, nullptr, false, language_minimal); addr_base = reader.cu ()->addr_base; - addr_size = reader.cu ()->header.addr_size; + cu_header = &reader.cu ()->header; } - return read_addr_index_1 (per_objfile, addr_index, addr_base, addr_size); + return read_addr_index_1 (per_objfile, addr_index, addr_base, cu_header); } /* Given a DW_FORM_GNU_str_index value STR_INDEX, fetch the string. -- 2.50.1 (Apple Git-155)