/* IBM RS/6000 "XCOFF64" file definitions for BFD.
   Copyright (C) 2000-2021 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.  */

/********************** FILE HEADER **********************/

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[8];	/* file pointer to symtab 	*/
  char f_opthdr[2];	/* sizeof(optional hdr)		*/
  char f_flags[2];	/* flags			*/
  char f_nsyms[4];	/* number of symtab entries	*/
};

/* IBM RS/6000.  */
#define U803XTOCMAGIC 0757	/* Aix 4.3 64-bit XCOFF */
#define	U64_TOCMAGIC  0767	/* AIX 5+ 64-bit XCOFF */
#define BADMAG(x) ((x).f_magic != U803XTOCMAGIC && (x).f_magic != U64_TOCMAGIC)

#define	FILHDR	struct external_filehdr
#define	FILHSZ	24

/********************** AOUT "OPTIONAL HEADER" **********************/

typedef struct
{
  unsigned char magic[2];		/* type of file			*/
  unsigned char vstamp[2];		/* version stamp		*/
  unsigned char o_debugger[4];		/* reserved			*/
  unsigned char text_start[8];		/* base of text used for this file */
  unsigned char data_start[8];		/* base of data used for this file */
  unsigned char o_toc[8];		/* address of TOC */
  unsigned char o_snentry[2];		/* section number of entry point */
  unsigned char o_sntext[2];		/* section number of .text section */
  unsigned char o_sndata[2];		/* section number of .data section */
  unsigned char o_sntoc[2];		/* section number of TOC */
  unsigned char o_snloader[2];		/* section number of .loader section */
  unsigned char o_snbss[2];		/* section number of .bss section */
  unsigned char o_algntext[2];		/* .text alignment */
  unsigned char o_algndata[2];		/* .data alignment */
  unsigned char o_modtype[2];		/* module type (??) */
  unsigned char o_cputype[2];		/* cpu type */
  unsigned char o_textpsize[1]; 	/* text page size */
  unsigned char o_datapsize[1]; 	/* data page size */
  unsigned char o_stackpsize[1];	/* stack page size */
  unsigned char o_flags[1];		/* Flags and TLS alignment */
  unsigned char tsize[8];		/* text size bytes, padded to FW bdry */
  unsigned char dsize[8];		/* initialized data "  "	*/
  unsigned char bsize[8];		/* uninitialized data "	  "	*/
  unsigned char entry[8];		/* entry pt.			*/
  unsigned char o_maxstack[8];		/* max stack size (??)		*/
  unsigned char o_maxdata[8];		/* max data size (??)		*/
  unsigned char o_sntdata[2];		/* section number of .tdata section */
  unsigned char o_sntbss[2];		/* section number of .tbss section */
  unsigned char o_x64flags[2];		/* XCOFF64 flags */
  unsigned char o_resv3[10];		/* reserved			*/
}
AOUTHDR;

#define AOUTSZ 120
#define SMALL_AOUTSZ (0)
#define AOUTHDRSZ 72

/********************** SECTION HEADER **********************/

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

#define	SCNHDR	struct external_scnhdr

#define	SCNHSZ	72

/********************** LINE NUMBERS **********************/

/* 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[8];	/* (physical) address of line number	*/
  } l_addr;

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

#define	LINENO	struct external_lineno

#define	LINESZ	12

/********************** SYMBOLS **********************/

#define E_SYMNMLEN	8	/* # characters in a symbol name	*/
#define E_FILNMLEN	14	/* # characters in a file name		*/
#define E_DIMNUM	4	/* # array dimensions in auxiliary entry */

struct external_syment 
{
  char e_value[8];
  char e_offset[4];
  char e_scnum[2];
  char e_type[2];
  char e_sclass[1];
  char e_numaux[1];
};

#define N_BTMASK	(017)
#define N_TMASK		(060)
#define N_BTSHFT	(4)
#define N_TSHIFT	(2)

union external_auxent
{
  struct {
    char x_lnno[4]; 	/* declaration line number */
    char x_pad[13];
    char x_auxtype[1];
  } x_sym;

  struct {
    char x_lnnoptr[8];/* ptr to fcn line */
    char x_fsize[4];	 /* size of function */
    char x_endndx[4];	 /* entry ndx past block end */
    char x_pad[1];
    char x_auxtype[1];
  } x_fcn;

  struct {
    union {
      char x_fname[E_FILNMLEN];
      struct {
	char x_zeroes[4];
	char x_offset[4];
	char x_pad[6];
      } x_n;
    } x_n;
    unsigned char x_ftype[1];
    unsigned char x_resv[2];
    char x_auxtype[1];
  } x_file;

  struct {
    char x_exptr[8];
    char x_fsize[4];
    char x_endndx[4];
    char x_pad[1];
    char x_auxtype[1];
  } x_except;

  struct {
    char x_scnlen_lo[4];
    char x_parmhash[4];
    char x_snhash[2];
    char x_smtyp[1];
    char x_smclas[1];
    char x_scnlen_hi[4];
    char x_pad[1];
    char x_auxtype[1];
  } x_csect;

  struct {
    char x_scnlen[8];
    char x_nreloc[8];
    char x_pad[1];
    char x_auxtype[1];
  } x_sect;
};

#define	SYMENT	struct external_syment
#define	SYMESZ	18	
#define	AUXENT	union external_auxent
#define	AUXESZ	18
#define DBXMASK 0x80		/* for dbx storage mask */
#define SYMNAME_IN_DEBUG(symptr) ((symptr)->n_sclass & DBXMASK)

/* Values for auxtype field in XCOFF64, taken from AIX 4.3 sym.h.  */
#define _AUX_EXCEPT     255
#define _AUX_FCN        254
#define _AUX_SYM        253
#define _AUX_FILE       252
#define _AUX_CSECT      251
#define _AUX_SECT       250

/********************** RELOCATION DIRECTIVES **********************/

struct external_reloc
{
  char r_vaddr[8];
  char r_symndx[4];
  char r_size[1];
  char r_type[1];
};

#define RELOC struct external_reloc
#define RELSZ 14

#define DEFAULT_DATA_SECTION_ALIGNMENT 4
#define DEFAULT_BSS_SECTION_ALIGNMENT 4
#define DEFAULT_TEXT_SECTION_ALIGNMENT 4
/* For new sections we havn't heard of before */
#define DEFAULT_SECTION_ALIGNMENT 4

/* The ldhdr structure.  This appears at the start of the .loader
   section.  */

struct external_ldhdr
{
  bfd_byte l_version[4];
  bfd_byte l_nsyms[4];
  bfd_byte l_nreloc[4];
  bfd_byte l_istlen[4];
  bfd_byte l_nimpid[4];
  bfd_byte l_stlen[4];
  bfd_byte l_impoff[8];
  bfd_byte l_stoff[8];
  bfd_byte l_symoff[8];
  bfd_byte l_rldoff[8];
};
#define LDHDRSZ (56)

struct external_ldsym
{
  bfd_byte l_value[8];
  bfd_byte l_offset[4];
  bfd_byte l_scnum[2];
  bfd_byte l_smtype[1];
  bfd_byte l_smclas[1];
  bfd_byte l_ifile[4];
  bfd_byte l_parm[4];
};

#define LDSYMSZ (24)

struct external_ldrel
{
  bfd_byte l_vaddr[8];
  bfd_byte l_rtype[2];
  bfd_byte l_rsecnm[2];
  bfd_byte l_symndx[4];
};

#define LDRELSZ (16)

struct external_exceptab
{
  union {
    bfd_byte e_symndx[4];
    bfd_byte e_paddr[8];
  } e_addr;
  bfd_byte e_lang[1];
  bfd_byte e_reason[1];
};

#define EXCEPTSZ (10)
