/* Build symbol tables in GDB's internal format - legacy APIs
   Copyright (C) 1986-2021 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef BUILDSYM_LEGACY_H
#define BUILDSYM_LEGACY_H

#include "buildsym.h"

/* This module provides definitions used for creating and adding to
   the symbol table.  These routines are called from various symbol-
   file-reading routines.  This file holds the legacy API, which
   relies on a global variable to work properly.  New or maintained
   symbol readers should use the builder API in buildsym.h.

   The basic way this module is used is as follows:

   scoped_free_pendings free_pending;
   cust = start_symtab (...);
   ... read debug info ...
   cust = end_symtab (...);

   The compunit symtab pointer ("cust") is returned from both start_symtab
   and end_symtab to simplify the debug info readers.

   dbxread.c and xcoffread.c use another variation:

   scoped_free_pendings free_pending;
   cust = start_symtab (...);
   ... read debug info ...
   cust = end_symtab (...);
   ... start_symtab + read + end_symtab repeated ...
*/

class scoped_free_pendings
{
public:

  scoped_free_pendings () = default;
  ~scoped_free_pendings ();

  DISABLE_COPY_AND_ASSIGN (scoped_free_pendings);
};

extern struct block *finish_block (struct symbol *symbol,
				   struct pending_block *old_blocks,
				   const struct dynamic_prop *static_link,
				   CORE_ADDR start,
				   CORE_ADDR end);

extern void record_block_range (struct block *,
				CORE_ADDR start, CORE_ADDR end_inclusive);

extern void start_subfile (const char *name);

extern void patch_subfile_names (struct subfile *subfile, const char *name);

extern void push_subfile ();

extern const char *pop_subfile ();

extern struct compunit_symtab *end_symtab (CORE_ADDR end_addr, int section);

extern struct context_stack *push_context (int desc, CORE_ADDR valu);

extern struct context_stack pop_context ();

extern void record_line (struct subfile *subfile, int line, CORE_ADDR pc);

extern struct compunit_symtab *start_symtab (struct objfile *objfile,
					     const char *name,
					     const char *comp_dir,
					     CORE_ADDR start_addr,
					     enum language language);

extern void restart_symtab (struct compunit_symtab *cust,
			    const char *name, CORE_ADDR start_addr);

/* Record the name of the debug format in the current pending symbol
   table.  FORMAT must be a string with a lifetime at least as long as
   the symtab's objfile.  */

extern void record_debugformat (const char *format);

/* Record the name of the debuginfo producer (usually the compiler) in
   the current pending symbol table.  PRODUCER must be a string with a
   lifetime at least as long as the symtab's objfile.  */

extern void record_producer (const char *producer);

/* Set the name of the last source file.  NAME is copied by this
   function.  */

extern void set_last_source_file (const char *name);

/* Fetch the name of the last source file.  */

extern const char *get_last_source_file (void);

/* Return the compunit symtab object.
   It is only valid to call this between calls to start_symtab and the
   end_symtab* functions.  */

extern struct compunit_symtab *buildsym_compunit_symtab (void);

/* Return the macro table.
   Initialize it if this is the first use.
   It is only valid to call this between calls to start_symtab and the
   end_symtab* functions.  */

extern struct macro_table *get_macro_table (void);

/* Set the last source start address.  Can only be used between
   start_symtab and end_symtab* calls.  */

extern void set_last_source_start_addr (CORE_ADDR addr);

/* Get the last source start address.  Can only be used between
   start_symtab and end_symtab* calls.  */

extern CORE_ADDR get_last_source_start_addr ();

/* Return the local using directives.  */

extern struct using_direct **get_local_using_directives ();

/* Set the list of local using directives.  */

extern void set_local_using_directives (struct using_direct *new_local);

/* Return the global using directives.  */

extern struct using_direct **get_global_using_directives ();

/* True if the context stack is empty.  */

extern bool outermost_context_p ();

/* Return the top of the context stack, or nullptr if there is an
   entry.  */

extern struct context_stack *get_current_context_stack ();

/* Return the context stack depth.  */

extern int get_context_stack_depth ();

/* Return the current subfile.  */

extern struct subfile *get_current_subfile ();

/* Return the local symbol list.  */

extern struct pending **get_local_symbols ();

/* Return the file symbol list.  */

extern struct pending **get_file_symbols ();

/* Return the global symbol list.  */

extern struct pending **get_global_symbols ();

/* Return the current buildsym_compunit.  */

extern struct buildsym_compunit *get_buildsym_compunit ();

#endif /* BUILDSYM_LEGACY_H */
