From patchwork Fri Jul 20 04:27:41 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 28516 Received: (qmail 14931 invoked by alias); 20 Jul 2018 04:28:20 -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 13871 invoked by uid 89); 20 Jul 2018 04:28:12 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.6 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=IMPORTANT, hacks X-HELO: gateway34.websitewelcome.com Received: from gateway34.websitewelcome.com (HELO gateway34.websitewelcome.com) (192.185.148.200) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 20 Jul 2018 04:28:05 +0000 Received: from cm15.websitewelcome.com (cm15.websitewelcome.com [100.42.49.9]) by gateway34.websitewelcome.com (Postfix) with ESMTP id 86B9542B569 for ; Thu, 19 Jul 2018 23:28:03 -0500 (CDT) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id gN1HfPxghbXuJgN1LfXQ53; Thu, 19 Jul 2018 23:28:02 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Sender:Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=BepNYnru/EOgY5q7MaN25vpu8ZBe3K+VbvWfJfU4dl8=; b=FBUOnCetm3gCzEFj+O/cQdXWv4 0eVHrieFTXUSI7xoLSrBRQjnilv+AlKfTdhnX3BRj+yYNRoQwKJK0O6TLMPCu97uAJXwnZlRkbHW6 zi2UkZsyltO7U53o97RePwwbq; Received: from 75-166-85-72.hlrn.qwest.net ([75.166.85.72]:39336 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.91) (envelope-from ) id 1fgN1G-003pgz-Qz; Thu, 19 Jul 2018 23:27:54 -0500 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFA v2 17/23] Move struct buildsym_compunit to buildsym.h Date: Thu, 19 Jul 2018 22:27:41 -0600 Message-Id: <20180720042747.18473-18-tom@tromey.com> In-Reply-To: <20180720042747.18473-1-tom@tromey.com> References: <20180720042747.18473-1-tom@tromey.com> This moves struct buildsym_compunit to buildsym.h. Now that the members are private, and it no longer affects any global state in buildsym.c, an instance can be used directly for symtab creation. gdb/ChangeLog 2018-07-19 Tom Tromey * buildsym.h (struct buildsym_compunit): Move from buildsym.c. * buildsym.c (struct buildsym_compunit): Move to buildsym.h. (buildsym_compunit::buildsym_compunit) (buildsym_compunit::~buildsym_compunit) (buildsym_compunit::get_macro_table): Define. --- gdb/ChangeLog | 8 ++ gdb/buildsym.c | 413 ++++++++++----------------------------------------------- gdb/buildsym.h | 288 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 365 insertions(+), 344 deletions(-) diff --git a/gdb/buildsym.c b/gdb/buildsym.c index eadc725588e..c9a5c408d0f 100644 --- a/gdb/buildsym.c +++ b/gdb/buildsym.c @@ -85,350 +85,6 @@ #include "stabsread.h" -/* Buildsym's counterpart to struct compunit_symtab. */ - -struct buildsym_compunit -{ - /* Start recording information about a primary source file (IOW, not an - included source file). - COMP_DIR is the directory in which the compilation unit was compiled - (or NULL if not known). */ - - buildsym_compunit (struct objfile *objfile_, const char *name, - const char *comp_dir_, enum language language_, - CORE_ADDR last_addr) - : objfile (objfile_), - m_last_source_file (name == nullptr ? nullptr : xstrdup (name)), - comp_dir (comp_dir_ == nullptr ? nullptr : xstrdup (comp_dir_)), - language (language_), - m_last_source_start_addr (last_addr) - { - /* Allocate the compunit symtab now. The caller needs it to allocate - non-primary symtabs. It is also needed by get_macro_table. */ - compunit_symtab = allocate_compunit_symtab (objfile, name); - - /* Build the subfile for NAME (the main source file) so that we can record - a pointer to it for later. - IMPORTANT: Do not allocate a struct symtab for NAME here. - It can happen that the debug info provides a different path to NAME than - DIRNAME,NAME. We cope with this in watch_main_source_file_lossage but - that only works if the main_subfile doesn't have a symtab yet. */ - start_subfile (name); - /* Save this so that we don't have to go looking for it at the end - of the subfiles list. */ - main_subfile = m_current_subfile; - } - - /* Reopen an existing compunit_symtab so that additional symbols can - be added to it. Arguments are as for the main constructor. CUST - is the expandable compunit_symtab to be reopened. */ - - buildsym_compunit (struct objfile *objfile_, const char *name, - const char *comp_dir_, enum language language_, - CORE_ADDR last_addr, struct compunit_symtab *cust) - : objfile (objfile_), - m_last_source_file (name == nullptr ? nullptr : xstrdup (name)), - comp_dir (comp_dir_ == nullptr ? nullptr : xstrdup (comp_dir_)), - compunit_symtab (cust), - language (language_), - m_last_source_start_addr (last_addr) - { - } - - ~buildsym_compunit () - { - struct subfile *subfile, *nextsub; - - if (m_pending_macros != nullptr) - free_macro_table (m_pending_macros); - - for (subfile = subfiles; - subfile != NULL; - subfile = nextsub) - { - nextsub = subfile->next; - xfree (subfile->name); - xfree (subfile->line_vector); - xfree (subfile); - } - - struct pending *next, *next1; - - for (next = m_file_symbols; next != NULL; next = next1) - { - next1 = next->next; - xfree ((void *) next); - } - - for (next = m_global_symbols; next != NULL; next = next1) - { - next1 = next->next; - xfree ((void *) next); - } - } - - void set_last_source_file (const char *name) - { - char *new_name = name == NULL ? NULL : xstrdup (name); - m_last_source_file.reset (new_name); - } - - const char *get_last_source_file () - { - return m_last_source_file.get (); - } - - struct macro_table *get_macro_table () - { - if (m_pending_macros == nullptr) - m_pending_macros = new_macro_table (&objfile->per_bfd->storage_obstack, - objfile->per_bfd->macro_cache, - compunit_symtab); - return m_pending_macros; - } - - struct macro_table *release_macros () - { - struct macro_table *result = m_pending_macros; - m_pending_macros = nullptr; - return result; - } - - /* This function is called to discard any pending blocks. */ - - void free_pending_blocks () - { - m_pending_block_obstack.clear (); - m_pending_blocks = nullptr; - } - - struct block *finish_block (struct symbol *symbol, - struct pending_block *old_blocks, - const struct dynamic_prop *static_link, - CORE_ADDR start, CORE_ADDR end); - - void record_block_range (struct block *block, - CORE_ADDR start, CORE_ADDR end_inclusive); - - void start_subfile (const char *name); - - void patch_subfile_names (struct subfile *subfile, const char *name); - - void push_subfile (); - - const char *pop_subfile (); - - void record_line (struct subfile *subfile, int line, CORE_ADDR pc); - - struct compunit_symtab *get_compunit_symtab () - { - return compunit_symtab; - } - - void set_last_source_start_addr (CORE_ADDR addr) - { - m_last_source_start_addr = addr; - } - - CORE_ADDR get_last_source_start_addr () - { - return m_last_source_start_addr; - } - - struct using_direct **get_local_using_directives () - { - return &m_local_using_directives; - } - - void set_local_using_directives (struct using_direct *new_local) - { - m_local_using_directives = new_local; - } - - struct using_direct **get_global_using_directives () - { - return &m_global_using_directives; - } - - bool outermost_context_p () const - { - return m_context_stack.empty (); - } - - struct context_stack *get_current_context_stack () - { - if (m_context_stack.empty ()) - return nullptr; - return &m_context_stack.back (); - } - - int get_context_stack_depth () const - { - return m_context_stack.size (); - } - - struct subfile *get_current_subfile () - { - return m_current_subfile; - } - - struct pending **get_local_symbols () - { - return &m_local_symbols; - } - - struct pending **get_file_symbols () - { - return &m_file_symbols; - } - - struct pending **get_global_symbols () - { - return &m_global_symbols; - } - - void record_debugformat (const char *format) - { - debugformat = format; - } - - void record_producer (const char *producer) - { - this->producer = producer; - } - - struct context_stack *push_context (int desc, CORE_ADDR valu); - - struct context_stack pop_context (); - - struct block *end_symtab_get_static_block (CORE_ADDR end_addr, - int expandable, int required); - - struct compunit_symtab *end_symtab_from_static_block - (struct block *static_block, int section, int expandable); - - struct compunit_symtab *end_symtab (CORE_ADDR end_addr, int section); - - struct compunit_symtab *end_expandable_symtab (CORE_ADDR end_addr, - int section); - - void augment_type_symtab (); - -private: - - void record_pending_block (struct block *block, struct pending_block *opblock); - - struct block *finish_block_internal (struct symbol *symbol, - struct pending **listhead, - struct pending_block *old_blocks, - const struct dynamic_prop *static_link, - CORE_ADDR start, CORE_ADDR end, - int is_global, int expandable); - - struct blockvector *make_blockvector (); - - void watch_main_source_file_lossage (); - - struct compunit_symtab *end_symtab_with_blockvector - (struct block *static_block, int section, int expandable); - - /* The objfile we're reading debug info from. */ - struct objfile *objfile; - - /* List of subfiles (source files). - Files are added to the front of the list. - This is important mostly for the language determination hacks we use, - which iterate over previously added files. */ - struct subfile *subfiles = nullptr; - - /* The subfile of the main source file. */ - struct subfile *main_subfile = nullptr; - - /* Name of source file whose symbol data we are now processing. This - comes from a symbol of type N_SO for stabs. For DWARF it comes - from the DW_AT_name attribute of a DW_TAG_compile_unit DIE. */ - gdb::unique_xmalloc_ptr m_last_source_file; - - /* E.g., DW_AT_comp_dir if DWARF. Space for this is malloc'd. */ - gdb::unique_xmalloc_ptr comp_dir; - - /* Space for this is not malloc'd, and is assumed to have at least - the same lifetime as objfile. */ - const char *producer = nullptr; - - /* Space for this is not malloc'd, and is assumed to have at least - the same lifetime as objfile. */ - const char *debugformat = nullptr; - - /* The compunit we are building. */ - struct compunit_symtab *compunit_symtab = nullptr; - - /* Language of this compunit_symtab. */ - enum language language; - - /* The macro table for the compilation unit whose symbols we're - currently reading. */ - struct macro_table *m_pending_macros = nullptr; - - /* True if symtab has line number info. This prevents an otherwise - empty symtab from being tossed. */ - bool m_have_line_numbers = false; - - /* Core address of start of text of current source file. This too - comes from the N_SO symbol. For Dwarf it typically comes from the - DW_AT_low_pc attribute of a DW_TAG_compile_unit DIE. */ - CORE_ADDR m_last_source_start_addr; - - /* Stack of subfile names. */ - std::vector m_subfile_stack; - - /* The "using" directives local to lexical context. */ - struct using_direct *m_local_using_directives = nullptr; - - /* Global "using" directives. */ - struct using_direct *m_global_using_directives = nullptr; - - /* The stack of contexts that are pushed by push_context and popped - by pop_context. */ - std::vector m_context_stack; - - struct subfile *m_current_subfile = nullptr; - - /* The mutable address map for the compilation unit whose symbols - we're currently reading. The symtabs' shared blockvector will - point to a fixed copy of this. */ - struct addrmap *m_pending_addrmap = nullptr; - - /* The obstack on which we allocate pending_addrmap. - If pending_addrmap is NULL, this is uninitialized; otherwise, it is - initialized (and holds pending_addrmap). */ - auto_obstack m_pending_addrmap_obstack; - - /* True if we recorded any ranges in the addrmap that are different - from those in the blockvector already. We set this to false when - we start processing a symfile, and if it's still false at the - end, then we just toss the addrmap. */ - bool m_pending_addrmap_interesting = false; - - /* An obstack used for allocating pending blocks. */ - auto_obstack m_pending_block_obstack; - - /* Pointer to the head of a linked list of symbol blocks which have - already been finalized (lexical contexts already closed) and which - are just waiting to be built into a blockvector when finalizing the - associated symtab. */ - struct pending_block *m_pending_blocks = nullptr; - - /* Pending static symbols and types at the top level. */ - struct pending *m_file_symbols = nullptr; - - /* Pending global functions and variables. */ - struct pending *m_global_symbols = nullptr; - - /* Pending symbols that are local to the lexical context. */ - struct pending *m_local_symbols = nullptr; -}; - /* The work-in-progress of the compunit we are building. This is created first, before any subfiles by start_symtab. */ @@ -454,6 +110,75 @@ static int compare_line_numbers (const void *ln1p, const void *ln2p); #define INITIAL_LINE_VECTOR_LENGTH 1000 +buildsym_compunit::buildsym_compunit (struct objfile *objfile_, + const char *name, + const char *comp_dir_, + enum language language_, + CORE_ADDR last_addr) + : objfile (objfile_), + m_last_source_file (name == nullptr ? nullptr : xstrdup (name)), + comp_dir (comp_dir_ == nullptr ? nullptr : xstrdup (comp_dir_)), + language (language_), + m_last_source_start_addr (last_addr) +{ + /* Allocate the compunit symtab now. The caller needs it to allocate + non-primary symtabs. It is also needed by get_macro_table. */ + compunit_symtab = allocate_compunit_symtab (objfile, name); + + /* Build the subfile for NAME (the main source file) so that we can record + a pointer to it for later. + IMPORTANT: Do not allocate a struct symtab for NAME here. + It can happen that the debug info provides a different path to NAME than + DIRNAME,NAME. We cope with this in watch_main_source_file_lossage but + that only works if the main_subfile doesn't have a symtab yet. */ + start_subfile (name); + /* Save this so that we don't have to go looking for it at the end + of the subfiles list. */ + main_subfile = m_current_subfile; +} + +buildsym_compunit::~buildsym_compunit () +{ + struct subfile *subfile, *nextsub; + + if (m_pending_macros != nullptr) + free_macro_table (m_pending_macros); + + for (subfile = subfiles; + subfile != NULL; + subfile = nextsub) + { + nextsub = subfile->next; + xfree (subfile->name); + xfree (subfile->line_vector); + xfree (subfile); + } + + struct pending *next, *next1; + + for (next = m_file_symbols; next != NULL; next = next1) + { + next1 = next->next; + xfree ((void *) next); + } + + for (next = m_global_symbols; next != NULL; next = next1) + { + next1 = next->next; + xfree ((void *) next); + } +} + +struct macro_table * +buildsym_compunit::get_macro_table () +{ + if (m_pending_macros == nullptr) + m_pending_macros = new_macro_table (&objfile->per_bfd->storage_obstack, + objfile->per_bfd->macro_cache, + compunit_symtab); + return m_pending_macros; +} + /* Maintain the lists of symbols and blocks. */ /* Add a symbol to one of the lists of symbols. */ diff --git a/gdb/buildsym.h b/gdb/buildsym.h index 220d7f48fe4..49086d33f55 100644 --- a/gdb/buildsym.h +++ b/gdb/buildsym.h @@ -108,6 +108,294 @@ struct context_stack }; +/* Buildsym's counterpart to struct compunit_symtab. */ + +struct buildsym_compunit +{ + /* Start recording information about a primary source file (IOW, not an + included source file). + COMP_DIR is the directory in which the compilation unit was compiled + (or NULL if not known). */ + + buildsym_compunit (struct objfile *objfile_, const char *name, + const char *comp_dir_, enum language language_, + CORE_ADDR last_addr); + + /* Reopen an existing compunit_symtab so that additional symbols can + be added to it. Arguments are as for the main constructor. CUST + is the expandable compunit_symtab to be reopened. */ + + buildsym_compunit (struct objfile *objfile_, const char *name, + const char *comp_dir_, enum language language_, + CORE_ADDR last_addr, struct compunit_symtab *cust) + : objfile (objfile_), + m_last_source_file (name == nullptr ? nullptr : xstrdup (name)), + comp_dir (comp_dir_ == nullptr ? nullptr : xstrdup (comp_dir_)), + compunit_symtab (cust), + language (language_), + m_last_source_start_addr (last_addr) + { + } + + ~buildsym_compunit (); + + DISABLE_COPY_AND_ASSIGN (buildsym_compunit); + + void set_last_source_file (const char *name) + { + char *new_name = name == NULL ? NULL : xstrdup (name); + m_last_source_file.reset (new_name); + } + + const char *get_last_source_file () + { + return m_last_source_file.get (); + } + + struct macro_table *get_macro_table (); + + struct macro_table *release_macros () + { + struct macro_table *result = m_pending_macros; + m_pending_macros = nullptr; + return result; + } + + /* This function is called to discard any pending blocks. */ + + void free_pending_blocks () + { + m_pending_block_obstack.clear (); + m_pending_blocks = nullptr; + } + + struct block *finish_block (struct symbol *symbol, + struct pending_block *old_blocks, + const struct dynamic_prop *static_link, + CORE_ADDR start, CORE_ADDR end); + + void record_block_range (struct block *block, + CORE_ADDR start, CORE_ADDR end_inclusive); + + void start_subfile (const char *name); + + void patch_subfile_names (struct subfile *subfile, const char *name); + + void push_subfile (); + + const char *pop_subfile (); + + void record_line (struct subfile *subfile, int line, CORE_ADDR pc); + + struct compunit_symtab *get_compunit_symtab () + { + return compunit_symtab; + } + + void set_last_source_start_addr (CORE_ADDR addr) + { + m_last_source_start_addr = addr; + } + + CORE_ADDR get_last_source_start_addr () + { + return m_last_source_start_addr; + } + + struct using_direct **get_local_using_directives () + { + return &m_local_using_directives; + } + + void set_local_using_directives (struct using_direct *new_local) + { + m_local_using_directives = new_local; + } + + struct using_direct **get_global_using_directives () + { + return &m_global_using_directives; + } + + bool outermost_context_p () const + { + return m_context_stack.empty (); + } + + struct context_stack *get_current_context_stack () + { + if (m_context_stack.empty ()) + return nullptr; + return &m_context_stack.back (); + } + + int get_context_stack_depth () const + { + return m_context_stack.size (); + } + + struct subfile *get_current_subfile () + { + return m_current_subfile; + } + + struct pending **get_local_symbols () + { + return &m_local_symbols; + } + + struct pending **get_file_symbols () + { + return &m_file_symbols; + } + + struct pending **get_global_symbols () + { + return &m_global_symbols; + } + + void record_debugformat (const char *format) + { + debugformat = format; + } + + void record_producer (const char *producer) + { + this->producer = producer; + } + + struct context_stack *push_context (int desc, CORE_ADDR valu); + + struct context_stack pop_context (); + + struct block *end_symtab_get_static_block (CORE_ADDR end_addr, + int expandable, int required); + + struct compunit_symtab *end_symtab_from_static_block + (struct block *static_block, int section, int expandable); + + struct compunit_symtab *end_symtab (CORE_ADDR end_addr, int section); + + struct compunit_symtab *end_expandable_symtab (CORE_ADDR end_addr, + int section); + + void augment_type_symtab (); + +private: + + void record_pending_block (struct block *block, struct pending_block *opblock); + + struct block *finish_block_internal (struct symbol *symbol, + struct pending **listhead, + struct pending_block *old_blocks, + const struct dynamic_prop *static_link, + CORE_ADDR start, CORE_ADDR end, + int is_global, int expandable); + + struct blockvector *make_blockvector (); + + void watch_main_source_file_lossage (); + + struct compunit_symtab *end_symtab_with_blockvector + (struct block *static_block, int section, int expandable); + + /* The objfile we're reading debug info from. */ + struct objfile *objfile; + + /* List of subfiles (source files). + Files are added to the front of the list. + This is important mostly for the language determination hacks we use, + which iterate over previously added files. */ + struct subfile *subfiles = nullptr; + + /* The subfile of the main source file. */ + struct subfile *main_subfile = nullptr; + + /* Name of source file whose symbol data we are now processing. This + comes from a symbol of type N_SO for stabs. For DWARF it comes + from the DW_AT_name attribute of a DW_TAG_compile_unit DIE. */ + gdb::unique_xmalloc_ptr m_last_source_file; + + /* E.g., DW_AT_comp_dir if DWARF. Space for this is malloc'd. */ + gdb::unique_xmalloc_ptr comp_dir; + + /* Space for this is not malloc'd, and is assumed to have at least + the same lifetime as objfile. */ + const char *producer = nullptr; + + /* Space for this is not malloc'd, and is assumed to have at least + the same lifetime as objfile. */ + const char *debugformat = nullptr; + + /* The compunit we are building. */ + struct compunit_symtab *compunit_symtab = nullptr; + + /* Language of this compunit_symtab. */ + enum language language; + + /* The macro table for the compilation unit whose symbols we're + currently reading. */ + struct macro_table *m_pending_macros = nullptr; + + /* True if symtab has line number info. This prevents an otherwise + empty symtab from being tossed. */ + bool m_have_line_numbers = false; + + /* Core address of start of text of current source file. This too + comes from the N_SO symbol. For Dwarf it typically comes from the + DW_AT_low_pc attribute of a DW_TAG_compile_unit DIE. */ + CORE_ADDR m_last_source_start_addr; + + /* Stack of subfile names. */ + std::vector m_subfile_stack; + + /* The "using" directives local to lexical context. */ + struct using_direct *m_local_using_directives = nullptr; + + /* Global "using" directives. */ + struct using_direct *m_global_using_directives = nullptr; + + /* The stack of contexts that are pushed by push_context and popped + by pop_context. */ + std::vector m_context_stack; + + struct subfile *m_current_subfile = nullptr; + + /* The mutable address map for the compilation unit whose symbols + we're currently reading. The symtabs' shared blockvector will + point to a fixed copy of this. */ + struct addrmap *m_pending_addrmap = nullptr; + + /* The obstack on which we allocate pending_addrmap. + If pending_addrmap is NULL, this is uninitialized; otherwise, it is + initialized (and holds pending_addrmap). */ + auto_obstack m_pending_addrmap_obstack; + + /* True if we recorded any ranges in the addrmap that are different + from those in the blockvector already. We set this to false when + we start processing a symfile, and if it's still false at the + end, then we just toss the addrmap. */ + bool m_pending_addrmap_interesting = false; + + /* An obstack used for allocating pending blocks. */ + auto_obstack m_pending_block_obstack; + + /* Pointer to the head of a linked list of symbol blocks which have + already been finalized (lexical contexts already closed) and which + are just waiting to be built into a blockvector when finalizing the + associated symtab. */ + struct pending_block *m_pending_blocks = nullptr; + + /* Pending static symbols and types at the top level. */ + struct pending *m_file_symbols = nullptr; + + /* Pending global functions and variables. */ + struct pending *m_global_symbols = nullptr; + + /* Pending symbols that are local to the lexical context. */ + struct pending *m_local_symbols = nullptr; +}; + /* The type of the record_line function. */ typedef void (record_line_ftype) (struct subfile *subfile, int line, CORE_ADDR pc);