From patchwork Sun Feb 25 16:32:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 26047 Received: (qmail 52308 invoked by alias); 25 Feb 2018 16:47:09 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 52295 invoked by uid 89); 25 Feb 2018 16:47:09 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_SOFTFAIL autolearn=ham version=3.3.2 spammy=Releases, removable X-HELO: barracuda.ebox.ca Received: from barracuda.ebox.ca (HELO barracuda.ebox.ca) (96.127.255.19) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sun, 25 Feb 2018 16:47:06 +0000 X-ASG-Debug-ID: 1519576369-0c856e618ae39c0001-fS2M51 Received: from smtp.ebox.ca (smtp.electronicbox.net [96.127.255.82]) by barracuda.ebox.ca with ESMTP id 7Z6LpggzIUpI7bj0 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sun, 25 Feb 2018 11:32:49 -0500 (EST) X-Barracuda-Envelope-From: simon.marchi@polymtl.ca X-Barracuda-RBL-Trusted-Forwarder: 96.127.255.82 Received: from simark.lan (192-222-251-162.qc.cable.ebox.net [192.222.251.162]) by smtp.ebox.ca (Postfix) with ESMTP id 83F67441D80; Sun, 25 Feb 2018 11:32:49 -0500 (EST) From: Simon Marchi X-Barracuda-Effective-Source-IP: 192-222-251-162.qc.cable.ebox.net[192.222.251.162] X-Barracuda-Apparent-Source-IP: 192.222.251.162 X-Barracuda-RBL-IP: 192.222.251.162 To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH 2/5] C++ify program_space Date: Sun, 25 Feb 2018 11:32:44 -0500 X-ASG-Orig-Subj: [PATCH 2/5] C++ify program_space Message-Id: <20180225163247.20157-2-simon.marchi@polymtl.ca> In-Reply-To: <20180225163247.20157-1-simon.marchi@polymtl.ca> References: <20180225163247.20157-1-simon.marchi@polymtl.ca> X-Barracuda-Connect: smtp.electronicbox.net[96.127.255.82] X-Barracuda-Start-Time: 1519576369 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://96.127.255.19:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 14168 X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using global scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=8.0 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.48309 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-IsSubscribed: yes This patch makes program_space a C++ object by adding a constructor/destructor, giving default values to fields, and using new/delete. gdb/ChangeLog: * progspace.h (struct program_space): Add constructor and destructor, initialize fields. (add_program_space): Remove. * progspace.c (add_program_space): Rename to... (program_space::program_space): ... this. (release_program_space): Rename to... (program_space::~program_space): ... this. (delete_program_space): Use delete to delete program_space. (initialize_progspace): Use new to allocate program_space. * inferior.c (add_inferior_with_spaces): Likewise. (clone_inferior_command): Likewise. * infrun.c (follow_fork_inferior): Likewise. (handle_vfork_child_exec_or_exit): Likewise. --- gdb/inferior.c | 4 +- gdb/infrun.c | 8 +-- gdb/progspace.c | 41 ++++++--------- gdb/progspace.h | 155 ++++++++++++++++++++++++++++---------------------------- 4 files changed, 98 insertions(+), 110 deletions(-) diff --git a/gdb/inferior.c b/gdb/inferior.c index 880f25df0e..c88a23c241 100644 --- a/gdb/inferior.c +++ b/gdb/inferior.c @@ -784,7 +784,7 @@ add_inferior_with_spaces (void) doesn't really return a new address space; otherwise, it really does. */ aspace = maybe_new_address_space (); - pspace = add_program_space (aspace); + pspace = new program_space (aspace); inf = add_inferior (0); inf->pspace = pspace; inf->aspace = pspace->aspace; @@ -928,7 +928,7 @@ clone_inferior_command (const char *args, int from_tty) doesn't really return a new address space; otherwise, it really does. */ aspace = maybe_new_address_space (); - pspace = add_program_space (aspace); + pspace = new program_space (aspace); inf = add_inferior (0); inf->pspace = pspace; inf->aspace = pspace->aspace; diff --git a/gdb/infrun.c b/gdb/infrun.c index c663908568..5aeafef08b 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -511,7 +511,7 @@ holding the child stopped. Try \"set detach-on-fork\" or \ else { child_inf->aspace = new_address_space (); - child_inf->pspace = add_program_space (child_inf->aspace); + child_inf->pspace = new program_space (child_inf->aspace); child_inf->removable = 1; set_current_program_space (child_inf->pspace); clone_program_space (child_inf->pspace, parent_inf->pspace); @@ -630,7 +630,7 @@ holding the child stopped. Try \"set detach-on-fork\" or \ else { child_inf->aspace = new_address_space (); - child_inf->pspace = add_program_space (child_inf->aspace); + child_inf->pspace = new program_space (child_inf->aspace); child_inf->removable = 1; child_inf->symfile_flags = SYMFILE_NO_READ; set_current_program_space (child_inf->pspace); @@ -986,7 +986,7 @@ handle_vfork_child_exec_or_exit (int exec) { /* We're staying attached to the parent, so, really give the child a new address space. */ - inf->pspace = add_program_space (maybe_new_address_space ()); + inf->pspace = new program_space (maybe_new_address_space ()); inf->aspace = inf->pspace->aspace; inf->removable = 1; set_current_program_space (inf->pspace); @@ -1020,7 +1020,7 @@ handle_vfork_child_exec_or_exit (int exec) program space resets breakpoints). */ inf->aspace = NULL; inf->pspace = NULL; - pspace = add_program_space (maybe_new_address_space ()); + pspace = new program_space (maybe_new_address_space ()); set_current_program_space (pspace); inf->removable = 1; inf->symfile_flags = SYMFILE_NO_READ; diff --git a/gdb/progspace.c b/gdb/progspace.c index 08a8a7a88e..f6da7e7da2 100644 --- a/gdb/progspace.c +++ b/gdb/progspace.c @@ -109,30 +109,21 @@ init_address_spaces (void) /* Adds a new empty program space to the program space list, and binds it to ASPACE. Returns the pointer to the new object. */ -struct program_space * -add_program_space (struct address_space *aspace) +program_space::program_space (address_space *aspace_) +: num (++last_program_space_num), aspace (aspace_) { - struct program_space *pspace; - - pspace = XCNEW (struct program_space); - - pspace->num = ++last_program_space_num; - pspace->aspace = aspace; - - program_space_alloc_data (pspace); + program_space_alloc_data (this); if (program_spaces == NULL) - program_spaces = pspace; + program_spaces = this; else { struct program_space *last; for (last = program_spaces; last->next != NULL; last = last->next) ; - last->next = pspace; + last->next = this; } - - return pspace; } /* Releases program space PSPACE, and all its contents (shared @@ -141,26 +132,24 @@ add_program_space (struct address_space *aspace) is the current program space, since there should always be a program space. */ -static void -release_program_space (struct program_space *pspace) +program_space::~program_space () { - gdb_assert (pspace != current_program_space); + gdb_assert (this != current_program_space); scoped_restore_current_program_space restore_pspace; - set_current_program_space (pspace); + set_current_program_space (this); - breakpoint_program_space_exit (pspace); + breakpoint_program_space_exit (this); no_shared_libraries (NULL, 0); exec_close (); free_all_objfiles (); if (!gdbarch_has_shared_address_space (target_gdbarch ())) - free_address_space (pspace->aspace); - clear_section_table (&pspace->target_sections); - clear_program_space_solib_cache (pspace); + free_address_space (this->aspace); + clear_section_table (&this->target_sections); + clear_program_space_solib_cache (this); /* Discard any data modules have associated with the PSPACE. */ - program_space_free_data (pspace); - xfree (pspace); + program_space_free_data (this); } /* Copies program space SRC to DEST. Copies the main executable file, @@ -235,7 +224,7 @@ delete_program_space (struct program_space *pspace) ss = *ss_link; } - release_program_space (pspace); + delete pspace; } /* Prints the list of program spaces and their details on UIOUT. If @@ -433,5 +422,5 @@ initialize_progspace (void) modules have done that. Do this before initialize_current_architecture, because that accesses exec_bfd, which in turn dereferences current_program_space. */ - current_program_space = add_program_space (new_address_space ()); + current_program_space = new program_space (new_address_space ()); } diff --git a/gdb/progspace.h b/gdb/progspace.h index 73929c9e96..c64209c5df 100644 --- a/gdb/progspace.h +++ b/gdb/progspace.h @@ -135,80 +135,83 @@ DEF_VEC_P (so_list_ptr); /* The program space structure. */ struct program_space - { - /* Pointer to next in linked list. */ - struct program_space *next; - - /* Unique ID number. */ - int num; - - /* The main executable loaded into this program space. This is - managed by the exec target. */ - - /* The BFD handle for the main executable. */ - bfd *ebfd; - /* The last-modified time, from when the exec was brought in. */ - long ebfd_mtime; - /* Similar to bfd_get_filename (exec_bfd) but in original form given - by user, without symbolic links and pathname resolved. - It needs to be freed by xfree. It is not NULL iff EBFD is not NULL. */ - char *pspace_exec_filename; - - /* The address space attached to this program space. More than one - program space may be bound to the same address space. In the - traditional unix-like debugging scenario, this will usually - match the address space bound to the inferior, and is mostly - used by the breakpoints module for address matches. If the - target shares a program space for all inferiors and breakpoints - are global, then this field is ignored (we don't currently - support inferiors sharing a program space if the target doesn't - make breakpoints global). */ - struct address_space *aspace; - - /* True if this program space's section offsets don't yet represent - the final offsets of the "live" address space (that is, the - section addresses still require the relocation offsets to be - applied, and hence we can't trust the section addresses for - anything that pokes at live memory). E.g., for qOffsets - targets, or for PIE executables, until we connect and ask the - target for the final relocation offsets, the symbols we've used - to set breakpoints point at the wrong addresses. */ - int executing_startup; - - /* True if no breakpoints should be inserted in this program - space. */ - int breakpoints_not_allowed; - - /* The object file that the main symbol table was loaded from - (e.g. the argument to the "symbol-file" or "file" command). */ - struct objfile *symfile_object_file; - - /* All known objfiles are kept in a linked list. This points to - the head of this list. */ - struct objfile *objfiles; - - /* The set of target sections matching the sections mapped into - this program space. Managed by both exec_ops and solib.c. */ - struct target_section_table target_sections; - - /* List of shared objects mapped into this space. Managed by - solib.c. */ - struct so_list *so_list; - - /* Number of calls to solib_add. */ - unsigned solib_add_generation; - - /* When an solib is added, it is also added to this vector. This - is so we can properly report solib changes to the user. */ - VEC (so_list_ptr) *added_solibs; - - /* When an solib is removed, its name is added to this vector. - This is so we can properly report solib changes to the user. */ - VEC (char_ptr) *deleted_solibs; - - /* Per pspace data-pointers required by other GDB modules. */ - REGISTRY_FIELDS; - }; +{ + program_space (address_space *aspace_); + ~program_space (); + + /* Pointer to next in linked list. */ + struct program_space *next = NULL; + + /* Unique ID number. */ + int num = 0; + + /* The main executable loaded into this program space. This is + managed by the exec target. */ + + /* The BFD handle for the main executable. */ + bfd *ebfd = NULL; + /* The last-modified time, from when the exec was brought in. */ + long ebfd_mtime = 0; + /* Similar to bfd_get_filename (exec_bfd) but in original form given + by user, without symbolic links and pathname resolved. + It needs to be freed by xfree. It is not NULL iff EBFD is not NULL. */ + char *pspace_exec_filename = NULL; + + /* The address space attached to this program space. More than one + program space may be bound to the same address space. In the + traditional unix-like debugging scenario, this will usually + match the address space bound to the inferior, and is mostly + used by the breakpoints module for address matches. If the + target shares a program space for all inferiors and breakpoints + are global, then this field is ignored (we don't currently + support inferiors sharing a program space if the target doesn't + make breakpoints global). */ + struct address_space *aspace = NULL; + + /* True if this program space's section offsets don't yet represent + the final offsets of the "live" address space (that is, the + section addresses still require the relocation offsets to be + applied, and hence we can't trust the section addresses for + anything that pokes at live memory). E.g., for qOffsets + targets, or for PIE executables, until we connect and ask the + target for the final relocation offsets, the symbols we've used + to set breakpoints point at the wrong addresses. */ + int executing_startup = 0; + + /* True if no breakpoints should be inserted in this program + space. */ + int breakpoints_not_allowed = 0; + + /* The object file that the main symbol table was loaded from + (e.g. the argument to the "symbol-file" or "file" command). */ + struct objfile *symfile_object_file = NULL; + + /* All known objfiles are kept in a linked list. This points to + the head of this list. */ + struct objfile *objfiles = NULL; + + /* The set of target sections matching the sections mapped into + this program space. Managed by both exec_ops and solib.c. */ + struct target_section_table target_sections {}; + + /* List of shared objects mapped into this space. Managed by + solib.c. */ + struct so_list *so_list = NULL; + + /* Number of calls to solib_add. */ + unsigned int solib_add_generation = 0; + + /* When an solib is added, it is also added to this vector. This + is so we can properly report solib changes to the user. */ + VEC (so_list_ptr) *added_solibs = NULL; + + /* When an solib is removed, its name is added to this vector. + This is so we can properly report solib changes to the user. */ + VEC (char_ptr) *deleted_solibs = NULL; + + /* Per pspace data-pointers required by other GDB modules. */ + REGISTRY_FIELDS {}; +}; /* An address space. It is used for comparing if pspaces/inferior/threads see the same address space and for @@ -243,10 +246,6 @@ extern struct program_space *current_program_space; #define ALL_PSPACES(pspace) \ for ((pspace) = program_spaces; (pspace) != NULL; (pspace) = (pspace)->next) -/* Add a new empty program space, and assign ASPACE to it. Returns the - pointer to the new object. */ -extern struct program_space *add_program_space (struct address_space *aspace); - /* Remove a program space from the program spaces list and release it. It is an error to call this function while PSPACE is the current program space. */ extern void delete_program_space (struct program_space *pspace);