From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Taylor To: gdb-patches@sourceware.cygnus.com Subject: [RFA] parse_frame_specification (stack.c) Date: Mon, 05 Mar 2001 09:07:00 -0000 Message-id: <200103051707.MAA01373@texas.cygnus.com> X-SW-Source: 2001-03/msg00072.html [This is a revision of my previous patch. For most processors (specifically, those that use the default identity transformations for pointer -> address and address -> pointer), this patch is a no op.] In gdb, if you say: "frame " or "info frame " then you expect to either move up or down some number of frames or to get information on the frame having the specified "index". But, if for your gdb target, addresses and pointers are different, then the current code in parse_frame_specification will treat the number as a pointer and convert it to an address. So, if you have a Harvard architecture processor where a pointer of 0 (say) corresponds to a text address of 0x2000000 and a data address of 0x1000000, and you say frame 0 then gdb will try to move to frame 0x1000000. Assuming you don't have that many frames, it will then try to create a frame at address 0x1000000. Which, in my case, will generate an error... This fixes it so that frame 0 will do the right thing on such configurations. ChangeLog entry: * stack.c (parse_frame_specification): For one argument case, handle the situation where the argument is an integer, not an address -- arguably the most common case. This matters on targets where pointers and addresses are different. Index: stack.c =================================================================== RCS file: /cvs/src/src/gdb/stack.c,v retrieving revision 1.12 diff -c -r1.12 stack.c *** stack.c 2001/02/10 12:01:11 1.12 --- stack.c 2001/03/05 16:47:52 *************** *** 704,709 **** --- 704,710 ---- int numargs = 0; #define MAXARGS 4 CORE_ADDR args[MAXARGS]; + int level; if (frame_exp) { *************** *** 723,730 **** addr_string = savestring (frame_exp, p - frame_exp); { tmp_cleanup = make_cleanup (xfree, addr_string); ! args[numargs++] = parse_and_eval_address (addr_string); do_cleanups (tmp_cleanup); } --- 724,738 ---- addr_string = savestring (frame_exp, p - frame_exp); { + value_ptr vp; + tmp_cleanup = make_cleanup (xfree, addr_string); ! ! vp = parse_and_eval (addr_string); ! if (numargs == 0) ! level = value_as_long (vp); ! ! args[numargs++] = value_as_pointer (vp); do_cleanups (tmp_cleanup); } *************** *** 744,750 **** /* NOTREACHED */ case 1: { - int level = args[0]; struct frame_info *fid = find_relative_frame (get_current_frame (), &level); struct frame_info *tfid; --- 752,757 ----