/* Definitions for symbol-reading containing "stabs", for GDB.
   Copyright (C) 1992-2025 Free Software Foundation, Inc.
   Contributed by Cygnus Support.  Written by John Gilmore.

   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 GDB_GDB_STABS_H
#define GDB_GDB_STABS_H

/* During initial symbol reading, we need to have a structure to keep
   track of which psymtabs have which bincls in them.  This structure
   is used during reading to setup the list of dependencies within each
   partial symbol table.  */
struct legacy_psymtab;

struct header_file_location
{
  header_file_location (const char *name_, int instance_,
			legacy_psymtab *pst_)
    : name (name_),
      instance (instance_),
      pst (pst_)
  {
  }

  const char *name;		/* Name of header file */
  int instance;			/* See above */
  legacy_psymtab *pst;	/* Partial symtab that has the
				   BINCL/EINCL defs for this file.  */
};

/* This file exists to hold the common definitions required of most of
   the symbol-readers that end up using stabs.  The common use of
   these `symbol-type-specific' customizations of the generic data
   structures makes the stabs-oriented symbol readers able to call
   each others' functions as required.  */

struct stabsread_context {
  /* Remember what we deduced to be the source language of this psymtab.  */
  enum language psymtab_language = language_unknown;

  /* The size of each symbol in the symbol file (in external form).
     This is set by dbx_symfile_read when building psymtabs, and by
     dbx_psymtab_to_symtab when building symtabs.  */
  unsigned symbol_size = 0;

  /* This is the offset of the symbol table in the executable file.  */
  unsigned symbol_table_offset = 0;

  /* This is the offset of the string table in the executable file.  */
  unsigned string_table_offset = 0;

  /* For elf+stab executables, the n_strx field is not a simple index
     into the string table.  Instead, each .o file has a base offset in
     the string table, and the associated symbols contain offsets from
     this base.  The following two variables contain the base offset for
     the current and next .o files.  */
  unsigned int file_string_table_offset = 0;

  /* .o and NLM files contain unrelocated addresses which are based at
     0.  When non-zero, this flag disables some of the special cases for
     Solaris elf+stab text addresses at location 0.  */
  int symfile_relocatable = 0;

  /* When set, we are processing a .o file compiled by sun acc.  This is
     misnamed; it refers to all stabs-in-elf implementations which use
     N_UNDF the way Sun does, including Solaris gcc.  Hopefully all
     stabs-in-elf implementations ever invented will choose to be
     compatible.  */
  unsigned char processing_acc_compilation = 0;

  /* The lowest text address we have yet encountered.  This is needed
     because in an a.out file, there is no header field which tells us
     what address the program is actually going to be loaded at, so we
     need to make guesses based on the symbols (which *are* relocated to
     reflect the address it will be loaded at).  */
  unrelocated_addr lowest_text_address;

  /* Non-zero if there is any line number info in the objfile.  Prevents
     dbx_end_psymtab from discarding an otherwise empty psymtab.  */
  int has_line_numbers = 0;

  /* The list of bincls.  */
  std::vector<struct header_file_location> bincl_list;

  /* Name of last function encountered.  Used in Solaris to approximate
     object file boundaries.  */
  const char *last_function_name = nullptr;

  /* The address in memory of the string table of the object file we are
     reading (which might not be the "main" object file, but might be a
     shared library or some other dynamically loaded thing).  This is
     set by read_dbx_symtab when building psymtabs, and by
     read_ofile_symtab when building symtabs, and is used only by
     next_symbol_text.  FIXME: If that is true, we don't need it when
     building psymtabs, right?  */
  char *stringtab_global = nullptr;

  /* These variables are used to control fill_symbuf when the stabs
     symbols are not contiguous (as may be the case when a COFF file is
     linked using --split-by-reloc).  */
  const std::vector<asection *> *symbuf_sections;
  size_t sect_idx = 0;
  unsigned int symbuf_left = 0;
  unsigned int symbuf_read = 0;

  /* This variable stores a global stabs buffer, if we read stabs into
     memory in one chunk in order to process relocations.  */
  bfd_byte *stabs_data = nullptr;
};


/* Information is passed among various dbxread routines for accessing
   symbol files.  A pointer to this structure is kept in the objfile,
   using the dbx_objfile_data_key.  */

struct dbx_symfile_info
  {
    ~dbx_symfile_info ();

    CORE_ADDR text_addr = 0;	/* Start of text section */
    int text_size = 0;		/* Size of text section */
    int symcount = 0;		/* How many symbols are there in the file */
    char *stringtab = nullptr;		/* The actual string table */
    int stringtab_size = 0;		/* Its size */
    file_ptr symtab_offset = 0;	/* Offset in file to symbol table */
    int symbol_size = 0;		/* Bytes in a single symbol */

    stabsread_context ctx; /* Context for the symfile being read.  */

    /* See stabsread.h for the use of the following.  */
    struct header_file *header_files = nullptr;
    int n_header_files = 0;
    int n_allocated_header_files = 0;

    /* Pointers to BFD sections.  These are used to speed up the building of
       minimal symbols.  */
    asection *text_section = nullptr;
    asection *data_section = nullptr;
    asection *bss_section = nullptr;

    /* Pointer to the separate ".stab" section, if there is one.  */
    asection *stab_section = nullptr;
  };

/* The tag used to find the DBX info attached to an objfile.  This is
   global because it is referenced by several modules.  */
extern const registry<objfile>::key<dbx_symfile_info> dbx_objfile_data_key;

#define DBX_SYMFILE_INFO(o)	(dbx_objfile_data_key.get (o))
#define DBX_TEXT_ADDR(o)	(DBX_SYMFILE_INFO(o)->text_addr)
#define DBX_TEXT_SIZE(o)	(DBX_SYMFILE_INFO(o)->text_size)
#define DBX_SYMCOUNT(o)		(DBX_SYMFILE_INFO(o)->symcount)
#define DBX_STRINGTAB(o)	(DBX_SYMFILE_INFO(o)->stringtab)
#define DBX_STRINGTAB_SIZE(o)	(DBX_SYMFILE_INFO(o)->stringtab_size)
#define DBX_SYMTAB_OFFSET(o)	(DBX_SYMFILE_INFO(o)->symtab_offset)
#define DBX_SYMBOL_SIZE(o)	(DBX_SYMFILE_INFO(o)->symbol_size)
#define DBX_TEXT_SECTION(o)	(DBX_SYMFILE_INFO(o)->text_section)
#define DBX_DATA_SECTION(o)	(DBX_SYMFILE_INFO(o)->data_section)
#define DBX_BSS_SECTION(o)	(DBX_SYMFILE_INFO(o)->bss_section)
#define DBX_STAB_SECTION(o)	(DBX_SYMFILE_INFO(o)->stab_section)

#endif /* GDB_GDB_STABS_H */
