/* external.h  -- External COFF structures

   Copyright (C) 2001-2025 Free Software Foundation, Inc.

   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, write to the Free Software
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

#ifndef COFF_EXTERNAL_H
#define COFF_EXTERNAL_H

#ifndef DO_NOT_DEFINE_FILHDR

#define FILHDR	struct external_filehdr
#define FILHSZ	20

struct external_filehdr
{
  char f_magic[2];	/* magic number			*/
  char f_nscns[2];	/* number of sections		*/
  char f_timdat[4];	/* time & date stamp		*/
  char f_symptr[4];	/* file pointer to symtab	*/
  char f_nsyms[4];	/* number of symtab entries	*/
  char f_opthdr[2];	/* sizeof(optional hdr)		*/
  char f_flags[2];	/* flags			*/
};
#endif

#ifndef DO_NOT_DEFINE_AOUTHDR

#define AOUTHDRSZ 28
#define AOUTSZ 28

typedef struct external_aouthdr
{
  char magic[2];	/* type of file				*/
  char vstamp[2];	/* version stamp			*/
  char tsize[4];	/* text size in bytes, padded to FW bdry*/
  char dsize[4];	/* initialized data "  "		*/
  char bsize[4];	/* uninitialized data "   "		*/
  char entry[4];	/* entry pt.				*/
  char text_start[4];	/* base of text used for this file	*/
  char data_start[4];	/* base of data used for this file	*/
} ATTRIBUTE_PACKED
AOUTHDR;

#define AOUTHDRSZ64 24

typedef struct external_aouthdr64
{
  char magic[2];	/* Type of file.			*/
  char vstamp[2];	/* Version stamp.			*/
  char tsize[4];	/* Text size in bytes, padded to FW bdry*/
  char dsize[4];	/* Initialized data "  ".		*/
  char bsize[4];	/* Uninitialized data "   ".		*/
  char entry[4];	/* Entry pt.				*/
  char text_start[4];	/* Base of text used for this file.	*/
}
AOUTHDR64;

#endif /* not DO_NOT_DEFINE_AOUTHDR */

#ifndef DO_NOT_DEFINE_SCNHDR

#define SCNHDR	struct external_scnhdr
#define SCNHSZ	40

struct external_scnhdr
{
  char s_name[8];	/* section name				*/
  char s_paddr[4];	/* physical address, aliased s_nlib	*/
  char s_vaddr[4];	/* virtual address			*/
  char s_size[4];	/* section size				*/
  char s_scnptr[4];	/* file ptr to raw data for section	*/
  char s_relptr[4];	/* file ptr to relocation		*/
  char s_lnnoptr[4];	/* file ptr to line numbers		*/
  char s_nreloc[2];	/* number of relocation entries		*/
  char s_nlnno[2];	/* number of line number entries	*/
  char s_flags[4];	/* flags				*/
};

/* Names of "special" sections.  */

#define _TEXT	 ".text"
#define _DATA	 ".data"
#define _BSS	 ".bss"
#define _COMMENT ".comment"
#define _LIB     ".lib"
#endif /* not DO_NOT_DEFINE_SCNHDR */

#ifndef DO_NOT_DEFINE_LINENO

#ifndef L_LNNO_SIZE
#error  L_LNNO_SIZE needs to be defined
#endif

#define LINENO	struct external_lineno
#define LINESZ	(4 + L_LNNO_SIZE)

/* 1 line number entry for every "breakpointable" source line in a section.
   Line numbers are grouped on a per function basis; first entry in a function
   grouping will have l_lnno = 0 and in place of physical address will be the
   symbol table index of the function name.  */
struct external_lineno
{
  union
  {
    char l_symndx[4];	/* function name symbol index, iff l_lnno == 0*/
    char l_paddr[4];	/* (physical) address of line number	*/
  } l_addr;

  char l_lnno[L_LNNO_SIZE];	/* line number		*/
};

#if L_LNNO_SIZE == 4
#define GET_LINENO_LNNO(abfd, ext)      H_GET_32 (abfd,      (ext->l_lnno))
#define PUT_LINENO_LNNO(abfd, val, ext) H_PUT_32 (abfd, val, (ext->l_lnno))
#endif
#if L_LNNO_SIZE == 2
#define GET_LINENO_LNNO(abfd, ext)      H_GET_16 (abfd,      (ext->l_lnno))
#define PUT_LINENO_LNNO(abfd, val, ext) H_PUT_16 (abfd, val, (ext->l_lnno))
#endif

#endif /* not DO_NOT_DEFINE_LINENO */

#ifndef DO_NOT_DEFINE_SYMENT

#define E_SYMNMLEN	8	/* # characters in a symbol name	*/
#define SYMESZ	18

typedef struct external_syment
{
  union
  {
    char e_name[E_SYMNMLEN];

    struct
    {
      char e_zeroes[4];
      char e_offset[4];
    } e;
  } e;

  char e_value[4];
  char e_scnum[2];
  char e_type[2];
  char e_sclass[1];
  char e_numaux[1];
} ATTRIBUTE_PACKED
SYMENT;

#ifndef N_BTMASK
#define N_BTMASK	0xf
#endif

#ifndef N_TMASK
#define N_TMASK		0x30
#endif

#ifndef N_BTSHFT
#define N_BTSHFT	4
#endif

#ifndef N_TSHIFT
#define N_TSHIFT	2
#endif

#endif /* not DO_NOT_DEFINE_SYMENT */

#ifndef DO_NOT_DEFINE_AUXENT

#define E_FILNMLEN	14	/* # characters in a file name		*/
#define E_DIMNUM	4	/* # array dimensions in auxiliary entry */
#define AUXESZ	18

typedef union external_auxent
{
  struct
  {
    char x_tagndx[4];		/* str, un, or enum tag indx */

    union
    {
      struct
      {
	char  x_lnno[2]; /* declaration line number */
	char  x_size[2]; /* str/union/array size */
      } x_lnsz;

      char x_fsize[4];	/* size of function */

    } x_misc;

    union
    {
      struct		/* if ISFCN, tag, or .bb */
      {
	char x_lnnoptr[4];	/* ptr to fcn line # */
	char x_endndx[4];	/* entry ndx past block end */
      } x_fcn;

      struct		/* if ISARY, up to 4 dimen. */
      {
	char x_dimen[E_DIMNUM][2];
      } x_ary;

    } x_fcnary;

    char x_tvndx[2];	/* tv index */

  } x_sym;

  union
  {
    /* Make x_fname the full auxent size, so that if coff/pe.h
       redefines E_FILNMLEN from 14 to 18 we don't trigger sanitisers
       accessing x_fname.  Beware use of sizeof (x_file.x_fname).  */
    char x_fname[AUXESZ];

    struct
    {
      char x_zeroes[4];
      char x_offset[4];
    } x_n;

  } x_file;

  struct
  {
    char x_scnlen[4];	/* section length */
    char x_nreloc[2];	/* # relocation entries */
    char x_nlinno[2];	/* # line numbers */
#ifdef INCLUDE_COMDAT_FIELDS_IN_AUXENT
    char x_checksum[4];		/* section COMDAT checksum		*/
    char x_associated[2];	/* COMDAT associated section index	*/
    char x_comdat[1];		/* COMDAT selection number		*/
#endif
  } x_scn;

  /* info about .tv section (in auxent of symbol .tv).  */
  struct
  {
    char x_tvfill[4];	/* tv fill value */
    char x_tvlen[2];	/* length of .tv */
    char x_tvran[2][2];	/* tv range */
  } x_tv;
} ATTRIBUTE_PACKED
AUXENT;

#endif /* not DO_NOT_DEFINE_AUXENT */

#endif /* COFF_EXTERNAL_H */
