From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nick Duffek To: jimb@cygnus.com Cc: ezannoni@cygnus.com, gdb-patches@sources.redhat.com, taylor@candd.org Subject: Re: [RFA] findvar.c: support LOC_BASEREG[_ARG] on Harvard archs Date: Mon, 16 Jul 2001 14:35:00 -0000 Message-id: <200107161954.f6GJskB20239@rtl.cygnus.com> References: X-SW-Source: 2001-07/msg00388.html On 16-Jul-2001, Jim Blandy wrote: >The alternative would be to have that code call >value_from_register and then value_as_pointer, as is done for >LOC_REGPARM_ADDR, rather than banging the bits yourself with >get_saved_register and extract_address. Okay, here's an updated patch that uses value_from_register and value_as_pointer. >But if you are going to bang >the bits yourself, you do need to call POINTER_TO_ADDRESS. I don't think there's any applicable bit-banging here. >You should do similar things for LOC_INDIRECT, Aren't LOC_INDIRECT addresses from the symbol table and therefore already Harvard-adjusted? >LOC_REF_ARG, I think that architectures already handle this in their own FRAME_ARGS_ADDRESS implementations, so this would do double pointer translation. >LOC_THREAD_LOCAL_STATIC. Agreed. In fact, the code for LOC_THREAD_LOCAL_STATIC is identical to that for LOC_BASEREG_ARG, so I've just moved LOC_THREAD_LOCAL_STATIC to the LOC_BASEREG_ARG case in the appended patch. Nick Index: gdb/findvar.c =================================================================== diff -up gdb/findvar.c gdb/findvar.c --- gdb/findvar.c Mon Jul 16 15:52:10 2001 +++ gdb/findvar.c Mon Jul 16 15:51:58 2001 @@ -610,22 +610,15 @@ addresses have not been bound by the dyn case LOC_BASEREG: case LOC_BASEREG_ARG: - { - char *buf = (char*) alloca (MAX_REGISTER_RAW_SIZE); - get_saved_register (buf, NULL, NULL, frame, SYMBOL_BASEREG (var), - NULL); - addr = extract_address (buf, REGISTER_RAW_SIZE (SYMBOL_BASEREG (var))); - addr += SYMBOL_VALUE (var); - break; - } - case LOC_THREAD_LOCAL_STATIC: { - char *buf = (char*) alloca (MAX_REGISTER_RAW_SIZE); + value_ptr regval; - get_saved_register (buf, NULL, NULL, frame, SYMBOL_BASEREG (var), - NULL); - addr = extract_address (buf, REGISTER_RAW_SIZE (SYMBOL_BASEREG (var))); + regval = value_from_register (lookup_pointer_type (type), + SYMBOL_BASEREG (var), frame); + if (regval == NULL) + error ("Value of base register not available."); + addr = value_as_pointer (regval); addr += SYMBOL_VALUE (var); break; }