I found the fix for making this patch work on the mainline as well. It turns out that Daniel J.'s patch that verifies that the pc and function address are in the same section trips up for the ia64 printf calls. I had added a check in examine_prologue which caught this problem and recognized that the cfm didn't match up so we should treat the function as frameless. The fix is simply to set the cache frameless flag on by default. This corresponds to the new examine_prologue() logic which assumes frameless until proven otherwise. Now, when frame_func_unwind() returns 0 when it finds the pc and the function it is supposed to be in are in different sections, the cache will be marked frameless and I will correctly look at current register values rather than depend on the cache. I have resubmitted the patch including the one line change. -- Jeff J. J. Johnston wrote: > The accompanying patch, which is quite extensive, removes all but one > deprecated > interface in ia64-tdep.c and switches to Andrew's new frame model. At > present, this > patch is working for gdb-6.0. There is some regression on the main > branch but it > theoretically should be working the same. I need to do some > investigation as to what is causing > the failure. > > I will attempt to describe a brief overview of changes: > > 1. removal/replacement of deprecated interfaces > 2. movement of gr32-gr127, p0-p63, and nat0-nat127 registers to > pseudo-register > area (these registers are always calculated and they are not raw > registers). > 3. change in bsp definition - bsp register and cached bsp value are > always kept > as eof (end-of-frame). What used to be reported to the user as bsp > is actually > the bof (beginning-of-frame) and a new pseudo-register "bof" value > has been created. > 4. new frame model - removed/integrated old frame code into new frame > model > 5. added verification check in examine_prologue to verify cfm register > matches > the cfm for the prologue being examined. If not, we assume the > routine is frameless. > This handles a few problematic glibc scenarios whereby a jump is > made to a stub which > gdb thinks is in the middle of a function. > 6. specify ia64 floating-point type and add conversion routines via > gdbarch_value_to_register(), > and gdbarch_register_to_value(). > > With the changes, running the gdb.base testsuite (ignoring dump.exp), > the results change from: > > === gdb Summary === > > # of expected passes 5168 > # of unexpected failures 44 > # of unexpected successes 2 > # of expected failures 12 > # of known failures 1 > # of unresolved testcases 15 > # of unsupported tests 1 > > to: > > === gdb Summary === > > # of expected passes 5197 > # of unexpected failures 28 > # of unexpected successes 2 > # of expected failures 12 > # of known failures 1 > # of unresolved testcases 1 > # of unsupported tests 1 > > The new code also clears up a major failure in callfuncs.exp that causes > an infinite > backtrace loop to occur which exhausts memory. > > 2003-07-30 Jeff Johnston > > * ia64-tdep.c (pseudo_regs): New enum that lists gr32-gr127, p0-p63, > bof, > and nat0-nat127 as pseudo-registers. > (ia64_frame_cache): New struct used to cache frame info. > (ia64_register_reggroup_p): New routine used to override default > register grouping so registers without names are still saved and > restored. > (ia64_dwarf_reg_to_regnum): New routine to map gr32-gr127 to their > pseudo > values. > (ia64_pseudo_register_read): New routine to read pseudo-registers. > (ia64_pseudo_register_write): New routine to write pseudo-registers. > (ia64_alloc_frame_cache): New routine to create a new ia64_frame_cache. > (examine_prologue): Change prototype to add next_frame pointer. > Assume frameless until otherwise proven. Verify that the cfm for > current frame matches the cfm that should occur for the prologues alloc > insn and if equal, mark as not frameless. At end of routine, > if not frameless, calculate registers for the previous frame and store > in the cache, if a cache is provided. > (ia64_skip_prologue): Use new prototype when calling examine_prologue > and pass 0 for next_frame. > (ia64_store_return_value): Change to use convert_typed_floating() > instead of calling ia64_convert_to_raw(). > (ia64_extract_return_value): Change to use convert_typed_floating() > instead of calling ia64_convert_to_virtual(). > (ia64_frame_cache): New routine to support new frame model. > (ia64_frame_this_id, ia64_frame_prev_register): Ditto. > (ia64_frame_sniffer): Ditto. > (ia64_sigtramp_frame_init_saved_regs): Ditto. > (ia64_sigtramp_frame_cache, ia64_sigtramp_frame_this_id): Ditto. > (ia64_sigtramp_frame_prev_register): Ditto. > (ia64_sigtramp_frame_sniffer): Ditto. > (ia64_frame_base_address): Ditto. > (ia64_extract_struct_value_address): Change to issue error message. > (ia64_frame_align): New routine to align sp. > (ia64_push_dummy_call): New routine based on ia64_push_arguments(). > (ia64_push_arguments): Removed. Logic moved to ia64_push_dummy_call(). > (ia64_push_return_address): Ditto. > (ia64_unwind_dummy_id): New function. > (ia64_unwind_pc): Ditto. > (ia64_convert_register_p): Ditto. > (ia64_register_to_value): Ditto. > (ia64_value_to_register): Ditto. > (ia64_pop_frame, ia64_pop_frame_regular): Removed. > (ia64_register_byte, ia64_register_raw_size): Ditto. > (ia64_register_virtual_size, ia64_register_virtual_byte): Ditto. > (ia64_saved_pc_after_call): Ditto. > (ia64_frame_chain, ia64_frame_saved_pc): Ditto. > (ia64_frame_init_saved_regs, ia64_get_saved_register): Ditto. > (ia64_register_convertible, ia64_register_convert_to_virtual): Ditto. > (ia64_register_convert_to_raw): Ditto. > (ia64_store_struct_return, ia64_call_dummy_words): Ditto. > (ia64_init_extra_frame_info): Ditto. > (ia64_frame_args_address, ia64_frame_locals_address): Ditto. > (ia64_gdbarch_init): Remove registering of deprecated functions that > are no longer used. Add registration of new gdbarch functions. > Remove registering deprecated_write_sp. Replace > set_gdbarch_register_virtual_type() with set_gdbarch_register_type(). > Delete set_gdbarch_deprecated_register_convertible(), > set_gdbarch_deprecated_register_convert_to_virtual(), and > set_gdbarch_deprecated_register_convert_to_raw() calls. Remove > set_gdbarch_deprecated_register_size(), > set_gdbarch_deprecated_register_bytes(), > set_gdbarch_deprecated_register_byte(), > set_gdbarch_deprecated_register_raw_size(), > set_gdbarch_deprecated_max_register_raw_size(), > set_gdbarch_deprecated_register_virtual_size(), > and set_gdbarch_deprecated_max_register_virtual_size() calls. > Replace set_gdbarch_deprecated_extract_return_value() with > set_gdbarch_extract_return_value(). Remove calls to: > set_gdbarch_deprecated_saved_pc_after_call(); > set_gdbarch_deprecated_frame_chain(), > set_gdbarch_deprecated_frame_saved_pc(), > set_gdbarch_deprecated_frame_init_saved_regs(), > set_gdbarch_deprecated_get_saved_register(), > set_gdbarch_deprecated_call_dummy_words(), > set_gdbarch_deprecated_sizeof_call_dummy_words(), > set_gdbarch_deprecated_init_extra_frame_info(), > set_gdbarch_deprecated_frame_args_address(), > set_gdbarch_deprecated_frame_locals_address(), > and set_gdbarch_deprecated_dummy_write_sp(). > Add set_gdbarch_convert_register_p(), > set_gdbarch_register_to_value(), > set_gdbarch_value_to_register(), > set_gdbarch_push_dummy_call(), > set_gdbarch_frame_align(), > set_gdbarch_unwind_dummy_id(), > set_gdbarch_unwind_pc(), > frame_unwind_append_sniffer(), > frame_unwind_append_sniffer(), > frame_base_set_default(), > > >