X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fframe.c;h=07fa2bc77d6e8d4d1cea0517fef9223f96045b4d;hb=d9f6d7f8b636a2b32004273143d72a77d82b40de;hp=a74deef7ed2b83278aa3ee5f27598d8d19d3adae;hpb=9ac86b52da268147b2565e4920357432bb7a34c3;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/frame.c b/gdb/frame.c index a74deef7ed..07fa2bc77d 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -1,6 +1,6 @@ /* Cache and manage frames for GDB, the GNU debugger. - Copyright (C) 1986-2017 Free Software Foundation, Inc. + Copyright (C) 1986-2018 Free Software Foundation, Inc. This file is part of GDB. @@ -34,7 +34,7 @@ #include "frame-base.h" #include "command.h" #include "gdbcmd.h" -#include "observer.h" +#include "observable.h" #include "objfiles.h" #include "gdbthread.h" #include "block.h" @@ -99,7 +99,7 @@ struct frame_info struct program_space *pspace; /* The frame's address space. */ - struct address_space *aspace; + const address_space *aspace; /* The frame's low-level unwinder and corresponding cache. The low-level unwinder is responsible for unwinding register values @@ -1017,14 +1017,13 @@ do_frame_register_read (void *src, int regnum, gdb_byte *buf) return REG_VALID; } -std::unique_ptr +std::unique_ptr frame_save_as_regcache (struct frame_info *this_frame) { - struct address_space *aspace = get_frame_address_space (this_frame); - std::unique_ptr regcache - (new struct regcache (get_frame_arch (this_frame), aspace)); + std::unique_ptr regcache + (new readonly_detached_regcache (get_frame_arch (this_frame), + do_frame_register_read, this_frame)); - regcache_save (regcache.get (), do_frame_register_read, this_frame); return regcache; } @@ -1058,7 +1057,7 @@ frame_pop (struct frame_info *this_frame) Save them in a scratch buffer so that there isn't a race between trying to extract the old values from the current regcache while at the same time writing new values into that same cache. */ - std::unique_ptr scratch + std::unique_ptr scratch = frame_save_as_regcache (prev_frame); /* FIXME: cagney/2003-03-16: It should be possible to tell the @@ -1069,9 +1068,8 @@ frame_pop (struct frame_info *this_frame) Unfortunately, they don't implement it. Their lack of a formal definition can lead to targets writing back bogus values (arguably a bug in the target code mind). */ - /* Now copy those saved registers into the current regcache. - Here, regcache_cpy() calls regcache_restore(). */ - regcache_cpy (get_current_regcache (), scratch.get ()); + /* Now copy those saved registers into the current regcache. */ + get_current_regcache ()->restore (scratch.get ()); /* We've made right mess of GDB's local state, just discard everything. */ @@ -1119,7 +1117,6 @@ frame_register_unwind (struct frame_info *frame, int regnum, /* Dispose of the new value. This prevents watchpoints from trying to watch the saved frame pointer. */ release_value (value); - value_free (value); } void @@ -1266,7 +1263,6 @@ frame_unwind_register_signed (struct frame_info *frame, int regnum) byte_order); release_value (value); - value_free (value); return r; } @@ -1301,7 +1297,6 @@ frame_unwind_register_unsigned (struct frame_info *frame, int regnum) byte_order); release_value (value); - value_free (value); return r; } @@ -1448,12 +1443,10 @@ get_frame_register_bytes (struct frame_info *frame, int regnum, if (*optimizedp || *unavailablep) { release_value (value); - value_free (value); return 0; } memcpy (myaddr, value_contents_all (value) + offset, curr_len); release_value (value); - value_free (value); } myaddr += curr_len; @@ -1502,7 +1495,6 @@ put_frame_register_bytes (struct frame_info *frame, int regnum, curr_len); put_frame_register (frame, regnum, value_contents_raw (value)); release_value (value); - value_free (value); } myaddr += curr_len; @@ -1521,7 +1513,7 @@ create_sentinel_frame (struct program_space *pspace, struct regcache *regcache) frame->level = -1; frame->pspace = pspace; - frame->aspace = get_regcache_aspace (regcache); + frame->aspace = regcache->aspace (); /* Explicitly initialize the sentinel frame's cache. Provide it with the underlying regcache. In the future additional information, such as the frame's thread will be added. */ @@ -1716,23 +1708,6 @@ select_frame (struct frame_info *fi) } } -#if GDB_SELF_TEST -struct frame_info * -create_test_frame (struct regcache *regcache) -{ - struct frame_info *this_frame = XCNEW (struct frame_info); - - sentinel_frame = create_sentinel_frame (NULL, regcache); - sentinel_frame->prev = this_frame; - sentinel_frame->prev_p = 1;; - this_frame->prev_arch.p = 1; - this_frame->prev_arch.arch = get_regcache_arch (regcache); - this_frame->next = sentinel_frame; - - return this_frame; -} -#endif - /* Create an arbitrary (i.e. address specified by user) or innermost frame. Always returns a non-NULL value. */ @@ -2242,7 +2217,7 @@ inside_main_func (struct frame_info *this_frame) returned. */ maddr = gdbarch_convert_from_func_ptr_addr (get_frame_arch (this_frame), BMSYMBOL_VALUE_ADDRESS (msymbol), - ¤t_target); + target_stack); return maddr == get_frame_func (this_frame); } @@ -2660,7 +2635,7 @@ frame_unwind_program_space (struct frame_info *this_frame) return this_frame->pspace; } -struct address_space * +const address_space * get_frame_address_space (struct frame_info *frame) { return frame->aspace; @@ -2881,11 +2856,9 @@ frame_stop_reason_symbol_string (enum unwind_stop_reason reason) /* Clean up after a failed (wrong unwinder) attempt to unwind past FRAME. */ -static void -frame_cleanup_after_sniffer (void *arg) +void +frame_cleanup_after_sniffer (struct frame_info *frame) { - struct frame_info *frame = (struct frame_info *) arg; - /* The sniffer should not allocate a prologue cache if it did not match this frame. */ gdb_assert (frame->prologue_cache == NULL); @@ -2910,30 +2883,29 @@ frame_cleanup_after_sniffer (void *arg) } /* Set FRAME's unwinder temporarily, so that we can call a sniffer. - Return a cleanup which should be called if unwinding fails, and - discarded if it succeeds. */ + If sniffing fails, the caller should be sure to call + frame_cleanup_after_sniffer. */ -struct cleanup * +void frame_prepare_for_sniffer (struct frame_info *frame, const struct frame_unwind *unwind) { gdb_assert (frame->unwind == NULL); frame->unwind = unwind; - return make_cleanup (frame_cleanup_after_sniffer, frame); } static struct cmd_list_element *set_backtrace_cmdlist; static struct cmd_list_element *show_backtrace_cmdlist; static void -set_backtrace_cmd (char *args, int from_tty) +set_backtrace_cmd (const char *args, int from_tty) { help_list (set_backtrace_cmdlist, "set backtrace ", all_commands, gdb_stdout); } static void -show_backtrace_cmd (char *args, int from_tty) +show_backtrace_cmd (const char *args, int from_tty) { cmd_show_list (show_backtrace_cmdlist, from_tty, ""); } @@ -2945,7 +2917,7 @@ _initialize_frame (void) frame_stash_create (); - observer_attach_target_changed (frame_observer_target_changed); + gdb::observers::target_changed.attach (frame_observer_target_changed); add_prefix_cmd ("backtrace", class_maintenance, set_backtrace_cmd, _("\ Set backtrace specific variables.\n\