From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20518 invoked by alias); 6 Sep 2014 22:34:51 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 20507 invoked by uid 89); 6 Sep 2014 22:34:50 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-la0-f51.google.com Received: from mail-la0-f51.google.com (HELO mail-la0-f51.google.com) (209.85.215.51) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Sat, 06 Sep 2014 22:34:49 +0000 Received: by mail-la0-f51.google.com with SMTP id gi9so3687069lab.38 for ; Sat, 06 Sep 2014 15:34:45 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.112.62.229 with SMTP id b5mr18586009lbs.60.1410042885059; Sat, 06 Sep 2014 15:34:45 -0700 (PDT) Received: by 10.25.145.80 with HTTP; Sat, 6 Sep 2014 15:34:45 -0700 (PDT) In-Reply-To: <201408271221.s7RCL684028429@d06av02.portsmouth.uk.ibm.com> References: <201408271221.s7RCL684028429@d06av02.portsmouth.uk.ibm.com> Date: Sat, 06 Sep 2014 22:34:00 -0000 Message-ID: Subject: Re: [RFC] Use address_from_register in dwarf2-frame.c:read_addr_from_reg From: Andrew Pinski To: Ulrich Weigand Cc: "gdb-patches@sourceware.org" Content-Type: text/plain; charset=UTF-8 X-IsSubscribed: yes X-SW-Source: 2014-09/txt/msg00168.txt.bz2 On Wed, Aug 27, 2014 at 5:21 AM, Ulrich Weigand wrote: > Andrew Pinski wrote: > >> I think this patch broke MIPS64 n32 big-endian support. We assert here: >> gdb_assert (!gdbarch_convert_register_p (gdbarch, regnum, type)); >> >> The convert_register_p code for MIPS does: >> return (register_size (gdbarch, regnum) == 8 >> && regnum % num_regs > 0 && regnum % num_regs < 32 >> && TYPE_LENGTH (type) < 8); >> >> >> Since the register size is 8 byte wide (MIPS64) and the type length is >> 4 (pointer), we return true. In MIPS64, the registers are stored >> 64bits but pointers are 32bits. >> >> Here is the code that is used by mips_register_to_value: >> int len = TYPE_LENGTH (type); >> CORE_ADDR offset; >> >> offset = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ? 8 - len : 0; >> if (!get_frame_register_bytes (frame, regnum, offset, len, to, >> optimizedp, unavailablep)) >> return 0; >> >> *optimizedp = *unavailablep = 0; >> return 1; > > Huh, I wasn't aware of that conversion. Note that for the register_to_value > case, I don't actually see any difference to the default behavior; it's the > value_to_register routine that's really special (because of the sign-extension > in performs). > >> Is there a way to fix this in a target neutral way? (I might need a >> way like this for AARCH64 ILP32 also). > > I guess it isn't too hard to support gdbarch_convert_register_p in that > routine as well; I just didn't have any target to test on. > > Can you try whether something along the following lines works for you? Yes this works for me. Thanks, Andrew Pinski > > Bye, > Ulrich > > ChangeLog: > > * findvar.c (address_from_register): Handle targets requiring > a special conversion routine even for plain pointer types. > > diff --git a/gdb/findvar.c b/gdb/findvar.c > index 41887de..ba3dd4d 100644 > --- a/gdb/findvar.c > +++ b/gdb/findvar.c > @@ -764,11 +764,28 @@ address_from_register (int regnum, struct frame_info *frame) > would therefore abort in get_frame_id. However, since we only need > a temporary value that is never used as lvalue, we actually do not > really need to set its VALUE_FRAME_ID. Therefore, we re-implement > - the core of value_from_register, but use the null_frame_id. > + the core of value_from_register, but use the null_frame_id. */ > > - This works only if we do not require a special conversion routine, > - which is true for plain pointer types for all current targets. */ > - gdb_assert (!gdbarch_convert_register_p (gdbarch, regnum, type)); > + /* Some targets require a special conversion routine even for plain > + pointer types. Avoid constructing a value object in those cases. */ > + if (gdbarch_convert_register_p (gdbarch, regnum, type)) > + { > + gdb_byte *buf = alloca (TYPE_LENGTH (type)); > + int optim, unavail, ok; > + > + ok = gdbarch_register_to_value (gdbarch, frame, regnum, type, > + buf, &optim, &unavail); > + if (!ok) > + { > + /* This function is used while computing a location expression. > + Complain about the value being optimized out, rather than > + letting value_as_address complain about some random register > + the expression depends on not being saved. */ > + error_value_optimized_out (); > + } > + > + return unpack_long (type, buf); > + } > > value = gdbarch_value_from_register (gdbarch, type, regnum, null_frame_id); > read_frame_register_value (value, frame); > > -- > Dr. Ulrich Weigand > GNU/Linux compilers and toolchain > Ulrich.Weigand@de.ibm.com >