aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xinclude/a.out.sun4.h19
-rwxr-xr-xinclude/a.out.vax.h20
-rwxr-xr-xinclude/ar.h24
-rwxr-xr-xinclude/bcs88kcoff.h296
-rw-r--r--include/bfd.h855
-rw-r--r--include/bout.h168
-rwxr-xr-xinclude/coff-i960.h414
-rwxr-xr-xinclude/coff-m88k.h298
-rw-r--r--include/ieee.h128
-rw-r--r--include/oasys.h117
-rw-r--r--include/obstack.h416
-rwxr-xr-xinclude/reloc.h38
-rwxr-xr-xinclude/sysdep.h110
13 files changed, 2903 insertions, 0 deletions
diff --git a/include/a.out.sun4.h b/include/a.out.sun4.h
new file mode 100755
index 0000000..0c89c2a
--- /dev/null
+++ b/include/a.out.sun4.h
@@ -0,0 +1,19 @@
+/* SPARC-specific values for a.out files */
+
+#define PAGE_SIZE 0x02000 /* 8K. aka NBPG in <sys/param.h> */
+/* Note that some SPARCs have 4K pages, some 8K, some others. */
+#define SEGMENT_SIZE PAGE_SIZE
+#define TEXT_START_ADDR PAGE_SIZE /* Location 0 is not accessible */
+
+#define N_BADMAG(x) \
+ (N_MAGIC(x) != OMAGIC && N_MAGIC(x) != NMAGIC \
+ && N_MAGIC(x) != ZMAGIC)
+
+
+#define N_TXTOFF(x) ( (N_MAGIC((x)) == ZMAGIC) ? 0 : sizeof(struct exec) )
+#define N_DATOFF(x) ( N_TXTOFF(x) + (x).a_text )
+#define N_TRELOFF(x) ( N_DATOFF(x) + (x).a_data )
+#define N_DRELOFF(x) ( N_TRELOFF(x) + (x).a_trsize )
+#define N_SYMOFF(x) ( N_DRELOFF(x) + (x).a_drsize )
+#define N_STROFF(x) ( N_SYMOFF(x) + (x).a_syms )
+
diff --git a/include/a.out.vax.h b/include/a.out.vax.h
new file mode 100755
index 0000000..4ece018
--- /dev/null
+++ b/include/a.out.vax.h
@@ -0,0 +1,20 @@
+/* VAX-specific definitions for a.out file header fields. */
+
+#define PAGE_SIZE 512 /* aka NBPG in <sys/param.h> */
+#define SEGMENT_SIZE PAGE_SIZE /* rounding between text/data ??! */
+#define TEXT_START_ADDR 0 /* Text start address: see
+ <machine/vmparam.h> USRTEXT. */
+#define STACK_END_ADDR 0x80000000-(14+14)*PAGE_SIZE /* see
+ <machine/vmparam.h> USRSTACK. */
+
+#define N_BADMAG(x) \
+ (N_MAGIC(x) != OMAGIC && N_MAGIC(x) != NMAGIC \
+ && N_MAGIC(x) != ZMAGIC)
+
+
+#define N_TXTOFF(x) ( (N_MAGIC((x)) == ZMAGIC) ? 1024 : EXEC_BYTES_SIZE )
+#define N_DATOFF(x) ( N_TXTOFF(x) + (x).a_text )
+#define N_TRELOFF(x) ( N_DATOFF(x) + (x).a_data )
+#define N_DRELOFF(x) ( N_TRELOFF(x) + (x).a_trsize )
+#define N_SYMOFF(x) ( N_DRELOFF(x) + (x).a_drsize )
+#define N_STROFF(x) ( N_SYMOFF(x) + (x).a_syms )
diff --git a/include/ar.h b/include/ar.h
new file mode 100755
index 0000000..2bca46d
--- /dev/null
+++ b/include/ar.h
@@ -0,0 +1,24 @@
+/* archive file definition for GNU software */
+
+/* So far this is correct for BSDish archives. Don't forget that
+ files must begin on an even byte boundary. */
+
+#ifndef __GNU_AR_H__
+#define __GNU_AR_H__
+
+#define ARMAG "!<arch>\n" /* For COFF and a.out archives */
+#define ARMAGB "!<bout>\n" /* For b.out archives */
+#define SARMAG 8
+#define ARFMAG "`\n"
+
+struct ar_hdr {
+ char ar_name[16]; /* name of this member */
+ char ar_date[12]; /* file mtime */
+ char ar_uid[6]; /* owner uid; printed as decimal */
+ char ar_gid[6]; /* owner gid; printed as decimal */
+ char ar_mode[8]; /* file mode, printed as octal */
+ char ar_size[10]; /* file size, printed as decimal */
+ char ar_fmag[2]; /* should contain ARFMAG */
+};
+
+#endif /* __GNU_AR_H__ */
diff --git a/include/bcs88kcoff.h b/include/bcs88kcoff.h
new file mode 100755
index 0000000..ca7ef83
--- /dev/null
+++ b/include/bcs88kcoff.h
@@ -0,0 +1,296 @@
+/*** coff information for 88k bcs */
+
+/********************** FILE HEADER **********************/
+
+struct filehdr {
+ unsigned short f_magic; /* magic number */
+ unsigned short f_nscns; /* number of sections */
+ long f_timdat; /* time & date stamp */
+ long f_symptr; /* file pointer to symtab */
+ long f_nsyms; /* number of symtab entries */
+ unsigned short f_opthdr; /* sizeof(optional hdr) */
+ unsigned short f_flags; /* flags */
+};
+
+/* Bits for f_flags:
+ * F_RELFLG relocation info stripped from file
+ * F_EXEC file is executable (no unresolved externel references)
+ * F_LNNO line nunbers stripped from file
+ * F_LSYMS local symbols stripped from file
+ * F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax)
+ */
+#define F_RELFLG 0000001
+#define F_EXEC 0000002
+#define F_LNNO 0000004
+#define F_LSYMS 0000010
+#define F_AR32WR 0000400
+
+
+#define MC88MAGIC 0555 /* 88k BCS executable */
+#define MC88DMAGIC 0541 /* DG/UX executable */
+
+
+#define MC88BADMAG(x) (((x).f_magic!=MC88MAGIC) && ((x).f_magic!=MC88DMAGIC))
+
+#define FILHDR struct filehdr
+#define FILHSZ sizeof(FILHDR)
+
+
+/********************** AOUT "OPTIONAL HEADER" **********************/
+
+
+#define PAGEMAGIC3 0414 /* Split i&d, zero mapped */
+typedef struct aouthdr {
+ short magic; /* type of file */
+ short vstamp; /* version stamp */
+ unsigned long tsize; /* text size in bytes, padded to FW bdry*/
+ unsigned long dsize; /* initialized data " " */
+ unsigned long bsize; /* uninitialized data " " */
+
+ unsigned long entry; /* entry pt. */
+ unsigned long text_start; /* base of text used for this file */
+ unsigned long data_start; /* base of data used for this file */
+
+} AOUTHDR;
+
+
+/* compute size of a header */
+
+#define AOUTSZ (sizeof(AOUTHDR))
+
+/********************** STORAGE CLASSES **********************/
+
+#define C_EFCN -1 /* physical end of function */
+#define C_NULL 0
+#define C_AUTO 1 /* automatic variable */
+#define C_EXT 2 /* external symbol */
+#define C_STAT 3 /* static */
+#define C_REG 4 /* register variable */
+#define C_EXTDEF 5 /* external definition */
+#define C_LABEL 6 /* label */
+#define C_ULABEL 7 /* undefined label */
+#define C_MOS 8 /* member of structure */
+#define C_ARG 9 /* function argument */
+#define C_STRTAG 10 /* structure tag */
+#define C_MOU 11 /* member of union */
+#define C_UNTAG 12 /* union tag */
+#define C_TPDEF 13 /* type definition */
+#define C_USTATIC 14 /* undefined static */
+#define C_ENTAG 15 /* enumeration tag */
+#define C_MOE 16 /* member of enumeration */
+#define C_REGPARM 17 /* register parameter */
+#define C_FIELD 18 /* bit field */
+#define C_BLOCK 100 /* ".bb" or ".eb" */
+#define C_FCN 101 /* ".bf" or ".ef" */
+#define C_EOS 102 /* end of structure */
+#define C_FILE 103 /* file name */
+#define C_LINE 104 /* line # reformatted as symbol table entry */
+#define C_ALIAS 105 /* duplicate tag */
+#define C_HIDDEN 106 /* ext symbol in dmert public lib */
+#define C_SHADOW 107 /* shadow symbol */
+#define C_VERSION 108 /* coff version symbol */
+
+
+/********************** SECTION HEADER **********************/
+
+struct scnhdr {
+ char s_name[8]; /* section name */
+ long s_paddr; /* physical address, aliased s_nlib */
+ long s_vaddr; /* virtual address */
+ long s_size; /* section size */
+ long s_scnptr; /* file ptr to raw data for section */
+ long s_relptr; /* file ptr to relocation */
+ long s_lnnoptr; /* file ptr to line numbers */
+ long s_nreloc; /* number of relocation entries */
+ long s_nlnno; /* number of line number entries*/
+ long s_flags; /* flags */
+};
+
+/*
+ * names of "special" sections
+ */
+#define _TEXT ".text"
+#define _DATA ".data"
+#define _BSS ".bss"
+
+/*
+ * s_flags "type"
+ */
+#define STYP_TEXT 0x20 /* section contains text only */
+#define STYP_DATA 0x40 /* section contains data only */
+#define STYP_BSS 0x80 /* section contains bss only */
+
+#define SCNHDR struct scnhdr
+#define SCNHSZ sizeof(SCNHDR)
+
+
+/********************** 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 lineno{
+ union {
+ long l_symndx; /* function name symbol index, iff l_lnno == 0*/
+ long l_paddr; /* (physical) address of line number */
+ } l_addr;
+
+ long l_lnno;
+
+};
+
+#define LINENO struct lineno
+#define LINESZ sizeof(LINENO)
+
+
+/********************** SYMBOLS **********************/
+
+#define SYMNMLEN 8 /* # characters in a symbol name */
+#define FILNMLEN 14 /* # characters in a file name */
+#define DIMNUM 4 /* # array dimensions in auxiliary entry */
+
+
+struct syment {
+ union {
+ char _n_name[SYMNMLEN]; /* old COFF version */
+ struct {
+ long _n_zeroes; /* new == 0 */
+ long _n_offset; /* offset into string table */
+ } _n_n;
+ char *_n_nptr[2]; /* allows for overlaying */
+ } _n;
+ long n_value; /* value of symbol */
+ short n_scnum; /* section number */
+ unsigned short n_type; /* type and derived type */
+ char n_sclass; /* storage class */
+ char n_numaux; /* number of aux. entries */
+ char pad2[2]; /* force alignment */
+};
+
+#define n_name _n._n_name
+#define n_zeroes _n._n_n._n_zeroes
+#define n_offset _n._n_n._n_offset
+
+/*
+ * Relocatable symbols have number of the section in which they are defined,
+ * or one of the following:
+ */
+#define N_UNDEF 0 /* undefined symbol */
+#define N_ABS -1 /* value of symbol is absolute */
+#define N_DEBUG -2 /* debugging symbol -- symbol value is meaningless */
+
+/*
+ * Type of a symbol, in low 4 bits of the word
+ */
+#define T_NULL 0
+#define T_VOID 1 /* function argument (only used by compiler) */
+#define T_CHAR 2 /* character */
+#define T_SHORT 3 /* short integer */
+#define T_INT 4 /* integer */
+#define T_LONG 5 /* long integer */
+#define T_FLOAT 6 /* floating point */
+#define T_DOUBLE 7 /* double word */
+#define T_STRUCT 8 /* structure */
+#define T_UNION 9 /* union */
+#define T_ENUM 10 /* enumeration */
+#define T_MOE 11 /* member of enumeration*/
+#define T_UCHAR 12 /* unsigned character */
+#define T_USHORT 13 /* unsigned short */
+#define T_UINT 14 /* unsigned integer */
+#define T_ULONG 15 /* unsigned long */
+
+
+
+/*
+ * derived types
+ */
+#define DT_NON 0
+#define DT_PTR 1 /* pointer */
+#define DT_FCN 2 /* function */
+#define DT_ARY 3 /* array */
+
+#define N_BTMASK 017
+#define N_TMASK 060
+#define N_BTSHFT 4
+#define N_TSHIFT 2
+
+#define BTYPE(x) ((x) & N_BTMASK)
+
+
+#define ISPTR(x) (((x) & N_TMASK) == (DT_PTR << N_BTSHFT))
+#define ISFCN(x) (((x) & N_TMASK) == (DT_FCN << N_BTSHFT))
+#define ISARY(x) (((x) & N_TMASK) == (DT_ARY << N_BTSHFT))
+
+#define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))
+
+union auxent {
+ struct {
+ long x_tagndx; /* str, un, or enum tag indx */
+ union {
+ struct {
+ unsigned long x_lnno; /* declaration line number */
+ unsigned long x_size; /* str/union/array size */
+ } x_lnsz;
+ long x_fsize; /* size of function */
+ } x_misc;
+ union {
+ struct { /* if ISFCN, tag, or .bb */
+ long x_lnnoptr; /* ptr to fcn line # */
+ long x_endndx; /* entry ndx past block end */
+ } x_fcn;
+ struct { /* if ISARY, up to 4 dimen. */
+ unsigned short x_dimen[DIMNUM];
+ } x_ary;
+ } x_fcnary;
+ unsigned short x_tvndx; /* tv index */
+ } x_sym;
+
+ union {
+ char x_fname[FILNMLEN];
+ struct {
+ long x_zeroes;
+ long x_offset;
+ } x_n;
+ } x_file;
+
+ struct {
+ long x_scnlen; /* section length */
+ unsigned long x_nreloc; /* # relocation entries */
+ unsigned long x_nlinno; /* # line numbers */
+ } x_scn;
+
+
+};
+
+#define SYMENT struct syment
+#define SYMESZ sizeof(SYMENT)
+#define AUXENT union auxent
+#define AUXESZ sizeof(AUXENT)
+
+
+/********************** RELOCATION DIRECTIVES **********************/
+
+struct reloc {
+ long r_vaddr; /* Virtual address of reference */
+ long r_symndx; /* Index into symbol table */
+ unsigned short r_type; /* Relocation type */
+ unsigned short r_offset;/* Hi 16 bits of constant */
+};
+
+/* Only values of r_type GNU/88k cares about */
+#define R_PCR16L 128
+#define R_PCR26L 129
+#define R_VRT16 130
+#define R_HVRT16 131
+#define R_LVRT16 132
+#define R_VRT32 133
+
+
+
+
+#define RELOC struct reloc
+#define RELSZ sizeof(RELOC)
+
+#define DEFAULT_SECTION_ALIGNMENT 8 /* double word */
diff --git a/include/bfd.h b/include/bfd.h
new file mode 100644
index 0000000..5161a54
--- /dev/null
+++ b/include/bfd.h
@@ -0,0 +1,855 @@
+ /* A -*- C -*- header file for the bfd library */
+
+/*** bfd.h -- The only header file required by users of the bfd library */
+
+/* Copyright (C) 1990, 1991 Free Software Foundation, Inc.
+
+This file is part of BFD, the Binary File Diddler.
+
+BFD 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 1, or (at your option)
+any later version.
+
+BFD 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 BFD; see the file COPYING. If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* $Id$ */
+
+/* executable_object_p is gone -- you can check the bfd flags and call
+ access() yourself */
+
+#ifndef __BFD_H_SEEN__
+#define __BFD_H_SEEN__
+
+#include "ansidecl.h"
+#include "obstack.h"
+
+/* Make it easier to declare prototypes (puts conditional here) */
+#ifndef PROTO
+# if __STDC__
+# define PROTO(type, name, arglist) type name arglist
+# else
+# define PROTO(type, name, arglist) type name ()
+# endif
+#endif
+
+#define BFD_VERSION "1.9"
+/* forward declaration */
+typedef struct _bfd_struct bfd;
+
+/* I'm sure this is going to break something and someone is going to
+ force me to change it. */
+typedef enum boolean {false, true} boolean;
+/* FIXME-SOON: I hate it when types are invented for things that
+ already have types. In this case, zero and non-zero are so common
+ that true vs false makes me stop and read code each time I want to
+ know if they mean true there was an error or true the function did
+ something. I can't fix this particularly quickly, so I'll just
+ skirt the issue for now. This WILL change soon. */
+#define BFD_SUCCESS (true)
+#define BFD_FAILURE (false)
+
+/* Try to avoid breaking stuff */
+typedef long int file_ptr;
+
+/* This is used to refer to locations inside a section's rawdata */
+typedef unsigned long int rawdata_offset;
+
+typedef unsigned long bfd_vma;
+typedef unsigned long bfd_offset;
+
+typedef unsigned int flagword; /* 32 bits of flags */
+
+/** File formats */
+
+typedef enum bfd_format {
+ bfd_unknown = 0, /* file format is unknown */
+ bfd_object, /* linker/assember/compiler output */
+ bfd_archive, /* object archive file */
+ bfd_core, /* core dump */
+ bfd_type_end} /* marks the end; don't use it! */
+ bfd_format;
+
+/* Object file flag values */
+#define NO_FLAGS 0
+#define HAS_RELOC 001
+#define EXEC_P 002
+#define HAS_LINENO 004
+#define HAS_DEBUG 010
+#define HAS_SYMS 020
+#define HAS_LOCALS 040
+#define DYNAMIC 0100
+#define WP_TEXT 0200
+#define D_PAGED 0400
+
+/* This enum gives the object file's CPU architecture, in a global sense.
+ E.g. what processor family does it belong to? There is another field,
+ which indicates what processor within the family is in use. */
+enum bfd_architecture {
+ bfd_arch_unknown, /* File arch not known */
+ bfd_arch_obscure, /* File arch known, not one of these */
+ bfd_arch_m68k, /* Motorola 68xxx */
+ bfd_arch_vax, /* DEC Vax */
+ bfd_arch_i960, /* Intel 960 */
+#define bfd_mach_i960_core 0
+#define bfd_mach_i960_kb_sb 1
+#define bfd_mach_i960_mc 2
+#define bfd_mach_i960_xa 3
+#define bfd_mach_i960_ca 4
+#define bfd_mach_i960_ka_sa 5
+
+ bfd_arch_a29k, /* AMD 29000 */
+ bfd_arch_sparc, /* Sun (SPARC International) SPARC */
+ bfd_arch_mips, /* MIPS Rxxxx */
+ bfd_arch_i386, /* Intel 386 */
+ bfd_arch_ns32k, /* National Semiconductor 32xxx */
+ bfd_arch_tahoe, /* CCI/Harris Tahoe */
+ bfd_arch_i860, /* Intel 860 */
+ bfd_arch_romp, /* IBM ROMP RS/6000 */
+ bfd_arch_alliant, /* Alliant */
+ bfd_arch_convex, /* Convex */
+ bfd_arch_m88k, /* Motorola 88xxx */
+ bfd_arch_pyramid, /* Pyramid Technology */
+ bfd_arch_h8_300, /* Hitachi H8/300 */
+ bfd_arch_last,
+};
+
+/* symbols and relocation */
+
+typedef unsigned long symindex;
+
+#define BFD_NO_MORE_SYMBOLS ((symindex) ~0)
+
+typedef enum {bfd_symclass_unknown = 0,
+ bfd_symclass_fcommon, /* fortran common symbols */
+ bfd_symclass_global, /* global symbol, what a surprise */
+ bfd_symclass_debugger, /* some debugger symbol */
+ bfd_symclass_undefined /* none known */
+ } symclass;
+
+typedef unsigned long symvalue; /* someday they may be 64-bit qtys */
+typedef int symtype; /* Who knows, yet? */
+typedef int bfd_size_type;
+/* Symbol cache classifications: (Bfd-Symbol-Flag_FOOBAR) */
+#define BSF_NO_FLAGS 0x00
+#define BSF_LOCAL 0x01 /* bfd_symclass_unknown */
+#define BSF_GLOBAL 0x02 /* bfd_symclass_global */
+#define BSF_IMPORT 0x04
+#define BSF_EXPORT 0x08
+#define BSF_UNDEFINED 0x10 /* bfd_symclass_undefined */
+#define BSF_FORT_COMM 0x20 /* bfd_symclass_fcommon */
+#define BSF_DEBUGGING 0x40 /* bfd_symclass_debugger */
+#define BSF_ABSOLUTE 0x80
+#define BSF_KEEP 0x10000
+#define BSF_WARNING 0x20000
+#define BSF_KEEP_G 0x80000
+#define BSF_WEAK 0x100000
+#define BSF_CTOR 0x200000 /* Symbol is a con/destructor */
+#define BSF_FAKE 0x400000 /* SYmbol doesn't really exist */
+#define BSF_OLD_COMMON 0x800000 /* Symbol used to be common,
+ but now is allocated */
+/* If symbol is fort_comm, then value is size, and this is the */
+/* contents */
+#define BFD_FORT_COMM_DEFAULT_VALUE 0
+
+/* in some files the type of a symbol sometimes alters its location
+ * in an output file - ie in coff a ISFCN symbol which is also C_EXT
+ * symbol appears where it was declared and not at the end of a section.
+ * This bit is set by the target bfd part to convey this information.
+ */
+#define BSF_NOT_AT_END 0x40000
+
+
+/* general purpose part of a symbol
+ * target specific parts will be found in libcoff.h, liba.out.h etc
+ */
+typedef struct symbol_cache_entry
+{
+ struct _bfd_struct *the_bfd; /* Just a way to find out host type */
+ CONST char *name;
+ symvalue value;
+ flagword flags;
+ struct sec_struct *section;
+ PTR udata; /* Target-specific stuff */
+} asymbol;
+
+#define bfd_get_section(x) ((x)->section)
+#define bfd_get_output_section(x) ((x)->section->output_section)
+#define bfd_set_section(x,y) ((x)->section) = (y)
+#define bfd_asymbol_base(x) ((x)->section?((x)->section->vma):0)
+#define bfd_asymbol_value(x) (bfd_asymbol_base(x) + x->value)
+#define bfd_asymbol_name(x) ((x)->name)
+
+
+/* This is a type pun with struct ranlib on purpose! */
+typedef struct {
+ char *name;
+ file_ptr file_offset; /* look here to find the file */
+} carsym; /* to make these you call a carsymogen */
+
+/* Relocation stuff */
+
+/* Either: sym will point to a symbol and isextern will be 0, *OR*
+ sym will be NULL and isextern will be a symbol type (eg N_TEXT)
+ which means the location should be relocated relative to the
+ segment origin. This is because we won't necessarily have a symbol
+ which is guaranteed to point to the segment origin. */
+
+typedef enum {
+ bfd_reloc_ok,
+ bfd_reloc_overflow,
+ bfd_reloc_outofrange,
+ bfd_reloc_continue,
+ bfd_reloc_notsupported,
+ bfd_reloc_other,
+ bfd_reloc_undefined,
+ bfd_reloc_dangerous}
+ bfd_reloc_status_enum_type;
+
+typedef CONST struct rint_struct {
+ unsigned int type;
+ unsigned int rightshift;
+ unsigned int size;
+ unsigned int bitsize;
+ boolean pc_relative;
+ unsigned int bitpos;
+
+ boolean absolute;
+ boolean complain_on_overflow;
+ bfd_reloc_status_enum_type (*special_function)();
+ char *name;
+ boolean partial_inplace;
+/* Two mask fields,
+ the src_mask is used to select what parts of the read in data are to
+ be used in the relocation sum. Eg, if this was an 8 bit bit of data
+ which we read and relocated, this would be 0x000000ff. When we have
+ relocs which have an addend, such as sun4 extended relocs, the value
+ in the offset part of a relocating field is garbage so we never use
+ it. In this case the mask would be 0x00000000.
+
+ The dst_mask is what parts of the instruction are replaced into the
+ instruction. In most cases src_mask == dst_mask, except in the above
+ special case, where dst_mask would be 0x000000ff, and src_mask would
+ be 0x00000000.
+*/
+ unsigned int src_mask; /* What things to take from the source */
+ unsigned int dst_mask; /* What things to put into the dest */
+
+ /* Does a pc rel offset already have the offset of the jump from the
+ beginnining of the module in place - eg on the sun3, a pcrel
+ instruction always has a negative number in place, containing the
+ displacement from the beginning of the module. 88k bcs has a zero
+ in there, so you have to work out the offset yourself. */
+ boolean pcrel_offset;
+} reloc_howto_type;
+
+#define HOWTO(CODE, RT,SIZE,BITSIZE, PCREL, BITPOS, ABS, OVERFLOW, SF, NAME, INPLACE, MASKSRC, MASKDST, PCRELDONE) \
+{(unsigned)CODE,RT,SIZE,BITSIZE, PCREL, BITPOS,ABS,OVERFLOW,SF,NAME,INPLACE,MASKSRC,MASKDST,PCRELDONE}
+
+typedef unsigned char bfd_byte;
+
+typedef struct reloc_cache_entry
+{
+ /* A pointer into the canonicalized table for the symbol */
+ asymbol **sym_ptr_ptr;
+
+ rawdata_offset address; /* offset in section */
+ bfd_vma addend; /* addend for relocation value */
+ struct sec_struct *section; /* if sym is null this is the section */
+ reloc_howto_type *howto;
+
+} arelent;
+
+typedef struct relent_chain_struct {
+ arelent relent;
+ struct relent_chain_struct *next;
+} arelent_chain;
+
+/* Used in generating armaps. Perhaps just a forward definition would do? */
+struct orl { /* output ranlib */
+ char **name; /* symbol name */
+ file_ptr pos; /* element number or file position */
+ int namidx; /* index into string table */
+};
+
+
+
+/* Linenumber stuff */
+typedef struct lineno_cache_entry {
+ unsigned int line_number; /* Linenumber from start of function*/
+ union {
+ asymbol *sym; /* Function name */
+ unsigned long offset; /* Offset into section */
+ } u;
+} alent;
+
+/* object and core file sections */
+
+/* Section flag definitions */
+#define SEC_NO_FLAGS 000
+#define SEC_ALLOC 001
+#define SEC_LOAD 002
+#define SEC_RELOC 004
+#define SEC_BALIGN 010
+#define SEC_READONLY 020
+#define SEC_CODE 040
+#define SEC_DATA 0100
+#define SEC_ROM 0200
+#define SEC_CONSTRUCTOR 0400
+#define SEC_HAS_CONTENTS (0x200)
+
+typedef struct sec_struct
+{
+ CONST char *name;
+ struct sec_struct *next;
+ flagword flags;
+
+ bfd_vma vma;
+ bfd_size_type size;
+
+ /* The output_offset is the indent into the output section of
+ this section. If this is the first section to go into
+ an output section, this value will be 0...
+ */
+ bfd_vma output_offset;
+ struct sec_struct *output_section;
+ unsigned int alignment_power; /* eg 4 aligns to 2^4*/
+
+ arelent *relocation; /* for input files */
+ arelent **orelocation; /* for output files */
+
+ unsigned reloc_count;
+ file_ptr filepos; /* File position of section data */
+ file_ptr rel_filepos; /* File position of relocation info */
+ file_ptr line_filepos;
+ struct user_section_struct *userdata;
+ struct lang_output_section_struct *otheruserdata;
+ int index; /* Which section is it 0..nth */
+ alent *lineno;
+ unsigned int lineno_count;
+
+ /* When a section is being output, this value changes as more
+ * linenumbers are written out */
+ file_ptr moving_line_filepos;
+
+ /* what the section number is in the target world */
+ unsigned int target_index;
+
+ PTR used_by_bfd;
+
+ /* If this is a constructor section then here is a list of relents
+ */
+ arelent_chain *constructor_chain;
+} asection;
+
+#define align_power(addr, align) \
+ ( ((addr) + ((1<<(align))-1)) & (-1 << (align)))
+
+
+
+typedef struct sec_struct *sec_ptr;
+
+#define bfd_section_name(bfd, ptr) ((ptr)->name)
+#define bfd_section_size(bfd, ptr) ((ptr)->size)
+#define bfd_section_vma(bfd, ptr) ((ptr)->vma)
+#define bfd_section_alignment(bfd, ptr) ((ptr)->alignment_power)
+#define bfd_get_section_flags(bfd, ptr) ((ptr)->flags)
+#define bfd_get_section_userdata(bfd, ptr) ((ptr)->userdata)
+
+#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (val)), true)
+#define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),true)
+#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),true)
+struct stat;
+
+/** Error handling */
+
+typedef enum {no_error = 0, system_call_error, invalid_target,
+ wrong_format, invalid_operation, no_memory,
+ no_symbols, no_relocation_info,
+ no_more_archived_files, malformed_archive,
+ symbol_not_found, file_not_recognized,
+ file_ambiguously_recognized, no_contents,
+ bfd_error_nonrepresentable_section,
+ invalid_error_code} bfd_ec;
+
+extern bfd_ec bfd_error;
+
+typedef struct {
+ PROTO(void,(* nonrepresentable_section ),(CONST bfd *CONST abfd,
+ CONST char *CONST name));
+} bfd_error_vector_type;
+
+PROTO (char *, bfd_errmsg, ());
+PROTO (void, bfd_perror, (CONST char *message));
+
+
+typedef enum
+{
+ bfd_print_symbol_name_enum,
+ bfd_print_symbol_type_enum,
+ bfd_print_symbol_all_enum,
+} bfd_print_symbol_enum_type;
+
+
+/* The BFD target structure.
+
+ This structure is how to find out everything BFD knows about a target.
+ It includes things like its byte order, name, what routines to call
+ to do various operations, etc.
+
+ Every BFD points to a target structure with its "xvec" member. */
+
+/* Shortcut for declaring fields which are prototyped function pointers,
+ while avoiding anguish on compilers that don't support protos. */
+
+#define SDEF(ret, name, arglist) PROTO(ret,(*name),arglist)
+#define SDEF_FMT(ret, name, arglist) PROTO(ret,(*name[bfd_type_end]),arglist)
+
+/* These macros are used to dispatch to functions through the bfd_target
+ vector. They are used in a number of macros further down in bfd.h,
+ and are also used when calling various routines by hand inside the
+ bfd implementation. The "arglist" argument must be parenthesized;
+ it contains all the arguments to the called function. */
+
+#define BFD_SEND(bfd, message, arglist) ((*((bfd)->xvec->message)) arglist)
+/* For operations which index on the bfd format */
+#define BFD_SEND_FMT(bfd, message, arglist) \
+ (((bfd)->xvec->message[(int)((bfd)->format)]) arglist)
+
+/* FIXME, these names should be rationalised with the names of the entry points
+ which call them. Too bad we can't have one macro to define them both! */
+typedef struct bfd_target
+{
+ /* identifies the kind of target, eg SunOS4, Ultrix, etc */
+ char *name;
+
+ /* This is bogus. Anything that can be told from the "flavour"
+ by some user program should be an independent attribute that can
+ be queried instead. FIXME. -- gnu@cygnus.com */
+ enum target_flavour_enum {
+ bfd_target_aout_flavour_enum,
+ bfd_target_coff_flavour_enum,
+ bfd_target_ieee_flavour_enum,
+ bfd_target_oasys_flavour_enum,
+ bfd_target_srec_flavour_enum} flavour;
+
+ boolean byteorder_big_p; /* Order of bytes in data sections */
+ boolean header_byteorder_big_p; /* Order of bytes in header */
+
+ flagword object_flags; /* these are the ones that may be set */
+ flagword section_flags; /* ditto */
+
+ char ar_pad_char; /* filenames in archives padded w/this char */
+ unsigned short ar_max_namelen; /* this could be a char too! */
+
+ /* Byte swapping for data */
+ /* Note that these don't take bfd as first arg. Certain other handlers
+ could do the same. */
+ SDEF (long, bfd_getxlong, (bfd_byte *));
+ SDEF (void, bfd_putxlong, (unsigned long, bfd_byte *));
+ SDEF (short, bfd_getxshort, (bfd_byte *));
+ SDEF (void, bfd_putxshort, (int, bfd_byte *));
+
+ /* Byte swapping for headers */
+ SDEF (long, bfd_h_getxlong, (bfd_byte *));
+ SDEF (void, bfd_h_putxlong, (unsigned long, bfd_byte *));
+ SDEF (short, bfd_h_getxshort, (bfd_byte *));
+ SDEF (void, bfd_h_putxshort, (int, bfd_byte *));
+
+ /* Format-dependent */
+ SDEF_FMT (struct bfd_target *, _bfd_check_format, (bfd *));/* file fmt or 0 */
+ SDEF_FMT (boolean, _bfd_set_format, (bfd *)); /* make it an object file. */
+
+ /* All these are defined in JUMP_TABLE */
+ /* Core files */
+ SDEF (char *, _core_file_failing_command, (bfd *));
+ SDEF (int, _core_file_failing_signal, (bfd *));
+ SDEF (boolean, _core_file_matches_executable_p, (bfd *, bfd *));
+
+ /* Archives */
+ SDEF (boolean, _bfd_slurp_armap, (bfd *));
+ SDEF (boolean, _bfd_slurp_extended_name_table, (bfd *));
+ SDEF (void, _bfd_truncate_arname, (bfd *, CONST char *, char *));
+ SDEF (boolean, write_armap, (bfd *arch, unsigned int elength,
+ struct orl *map, int orl_count, int
+ stridx));
+
+ /* All the standard stuff */
+ SDEF (boolean, _close_and_cleanup, (bfd *)); /* free any allocated data */
+ SDEF (boolean, _bfd_set_section_contents, (bfd *, sec_ptr, PTR,
+ file_ptr, int));
+ SDEF (boolean, _bfd_get_section_contents, (bfd *, sec_ptr, PTR,
+ file_ptr, int));
+ SDEF (boolean, _new_section_hook, (bfd *, sec_ptr));
+
+ /* Symbols and relocation */
+ SDEF (unsigned int, _get_symtab_upper_bound, (bfd *));
+ SDEF (unsigned int, _bfd_canonicalize_symtab, (bfd *, asymbol **));
+ SDEF (unsigned int, _get_reloc_upper_bound, (bfd *, sec_ptr));
+ SDEF (unsigned int, _bfd_canonicalize_reloc, (bfd *, sec_ptr, arelent **,
+ asymbol**));
+
+ /* FIXME: For steve -- clean up later */
+ SDEF (asymbol *, _bfd_make_empty_symbol, (bfd *));
+ SDEF (void, _bfd_print_symbol, (bfd *, PTR, asymbol *,
+ bfd_print_symbol_enum_type));
+ SDEF(alent *, _get_lineno, (bfd *, asymbol *));
+
+ /* This should perhaps be format-dependent, I don't know yet. -gnu */
+ SDEF (boolean, _bfd_set_arch_mach, (bfd *, enum bfd_architecture,
+ unsigned long));
+
+ SDEF (bfd *, openr_next_archived_file, (bfd *arch, bfd *prev));
+ SDEF (boolean, _bfd_find_nearest_line,
+ (bfd *abfd, asection *section, asymbol **symbols,bfd_vma offset,
+ CONST char **file, CONST char **func, unsigned int *line));
+ SDEF (int, _bfd_stat_arch_elt, (bfd *, struct stat *));
+ SDEF (int, _bfd_sizeof_headers, (bfd *, boolean));
+} bfd_target;
+
+/* The code that implements targets can initialize a jump table with this
+ macro. It must name all its routines the same way (a prefix plus
+ the standard routine suffix), or it must #define the routines that
+ are not so named, before calling JUMP_TABLE in the initializer. */
+
+/* Semi-portable string concatenation in cpp */
+#ifndef CAT
+#ifdef __STDC__
+#define CAT(a,b) a##b
+#else
+#define CAT(a,b) a/**/b
+#endif
+#endif
+
+#define JUMP_TABLE(NAME)\
+CAT(NAME,_core_file_failing_command),\
+CAT(NAME,_core_file_failing_signal),\
+CAT(NAME,_core_file_matches_executable_p),\
+CAT(NAME,_slurp_armap),\
+CAT(NAME,_slurp_extended_name_table),\
+CAT(NAME,_truncate_arname),\
+CAT(NAME,_write_armap),\
+CAT(NAME,_close_and_cleanup), \
+CAT(NAME,_set_section_contents),\
+CAT(NAME,_get_section_contents),\
+CAT(NAME,_new_section_hook),\
+CAT(NAME,_get_symtab_upper_bound),\
+CAT(NAME,_get_symtab),\
+CAT(NAME,_get_reloc_upper_bound),\
+CAT(NAME,_canonicalize_reloc),\
+CAT(NAME,_make_empty_symbol),\
+CAT(NAME,_print_symbol),\
+CAT(NAME,_get_lineno),\
+CAT(NAME,_set_arch_mach),\
+CAT(NAME,_openr_next_archived_file),\
+CAT(NAME,_find_nearest_line),\
+CAT(NAME,_generic_stat_arch_elt),\
+CAT(NAME,_sizeof_headers)
+
+/* User program access to BFD facilities */
+
+extern CONST short _bfd_host_big_endian;
+#define HOST_BYTE_ORDER_BIG_P (*(char *)&_bfd_host_big_endian)
+
+/* The bfd itself */
+
+#define bfd_get_filename(abfd) ((abfd)->filename)
+#define bfd_get_format(abfd) ((abfd)->format)
+#define bfd_get_target(abfd) ((abfd)->xvec->name)
+#define bfd_get_file_flags(abfd) ((abfd)->flags)
+#define bfd_applicable_file_flags(abfd) ((abfd)->xvec->object_flags)
+#define bfd_applicable_section_flags(abfd) ((abfd)->xvec->section_flags)
+#define bfd_my_archive(abfd) ((abfd)->my_archive);
+#define bfd_has_map(abfd) ((abfd)->has_armap)
+#define bfd_header_twiddle_required(abfd) \
+ ((((abfd)->xvec->header_byteorder_big_p) \
+ != (boolean)HOST_BYTE_ORDER_BIG_P) ? true:false)
+
+#define bfd_valid_reloc_types(abfd) ((abfd)->xvec->valid_reloc_types)
+#define bfd_usrdata(abfd) ((abfd)->usrdata)
+
+#define bfd_get_start_address(abfd) ((abfd)->start_address)
+#define bfd_get_symcount(abfd) ((abfd)->symcount)
+#define bfd_get_outsymbols(abfd) ((abfd)->outsymbols)
+#define bfd_count_sections(abfd) ((abfd)->section_count)
+#define bfd_get_architecture(abfd) ((abfd)->obj_arch)
+#define bfd_get_machine(abfd) ((abfd)->obj_machine)
+
+/* Finally! The BFD struct itself. This contains the major data about
+ the file, and contains pointers to the rest of the data.
+
+ To avoid dragging too many header files into every file that
+ includes bfd.h, IOSTREAM has been declared as a "char *", and MTIME
+ as a "long". Their correct types, to which they are cast when used,
+ are "FILE *" and "time_t". If these had been declared as structs
+ rather than typedefs, we wouldn't have this problem. */
+
+struct _bfd_struct
+{
+
+ CONST char *filename; /* could be null; filename user opened with */
+ bfd_target *xvec; /* operation jump table */
+ char *iostream; /* stdio FILE *, unless an archive element */
+
+ boolean cacheable; /* iostream can be closed if desired */
+ struct _bfd_struct *lru_prev; /* Used for file caching */
+ struct _bfd_struct *lru_next; /* Used for file caching */
+ file_ptr where; /* Where the file was when closed */
+ boolean opened_once;
+ boolean mtime_set; /* Flag indicating mtime is available */
+ long mtime; /* File modified time */
+ int ifd; /* for output files, channel we locked. */
+ bfd_format format;
+ enum bfd_direction {no_direction = 0,
+ read_direction = 1,
+ write_direction = 2,
+ both_direction = 3} direction;
+
+ flagword flags; /* format_specific */
+/*
+Currently my_archive is tested before adding origin to anything. I
+believe that this can become always an add of origin, with origin set
+to 0 for non archive files
+*/
+
+ file_ptr origin; /* for archive contents */
+ boolean output_has_begun; /* cf bfd_set_section_size */
+ asection *sections; /* Pointer to linked list of sections */
+ unsigned int section_count; /* The number of sections */
+
+ /* Some object file stuff */
+ bfd_vma start_address; /* for object files only, of course */
+ unsigned int symcount; /* used for input and output */
+ asymbol **outsymbols; /* symtab for output bfd */
+ enum bfd_architecture obj_arch; /* Architecture of object machine, eg m68k */
+ unsigned long obj_machine; /* Particular machine within arch, e.g. 68010 */
+
+ /* Archive stuff. strictly speaking we don't need all three bfd* vars,
+ but doing so would allow recursive archives! */
+ PTR arelt_data; /* needed if this came from an archive */
+ struct _bfd_struct *my_archive; /* if this is an archive element */
+ struct _bfd_struct *next; /* output chain pointer */
+ struct _bfd_struct *archive_head; /* for output archive */
+ boolean has_armap; /* if an arch; has it an armap? */
+
+ PTR tdata; /* target-specific storage */
+ PTR usrdata; /* application-specific storage */
+
+ /* Should probably be enabled here always, so that library may be changed
+ to switch this on and off, while user code may remain unchanged */
+#ifdef BFD_LOCKS
+ struct flock *lock;
+ char *actual_name; /* for output files, name given to open() */
+#endif
+
+ /* Where all the allocated stuff under this BFD goes */
+ struct obstack memory;
+};
+
+PROTO(PTR, bfd_alloc, (bfd *abfd, size_t size));
+PROTO(PTR, bfd_zalloc,(bfd *abfd, size_t size));
+PROTO(PTR, bfd_realloc,(bfd *abfd, PTR orig, size_t new));
+PROTO(size_t, bfd_alloc_size,(bfd *abfd));
+/* FIXME, these are broken! bfd_free references "Y" which is not a parameter.
+ bfd_release frees the mentioned object AND EVERYTHING AFTER IT IN THE
+ OBSTACK! -- gnu@cygnus.com */
+#define bfd_free(x) (obstack_free(&(x->memory),y))
+#define bfd_release(x,y) (obstack_free(&(x->memory),y))
+PROTO (char *, bfd_printable_arch_mach,(enum bfd_architecture, unsigned long));
+PROTO (char *, bfd_format_string, (bfd_format format));
+
+PROTO (char**, bfd_target_list, ());
+PROTO (bfd *, bfd_openr, (CONST char *filename, CONST char *target));
+PROTO (bfd *, bfd_fdopenr, (CONST char *filename, CONST char *target, int fd));
+PROTO (bfd *, bfd_openw, (CONST char *filename, CONST char *target));
+PROTO (bfd *, bfd_create, (CONST char *filename, CONST bfd *abfd));
+PROTO (boolean, bfd_close, (bfd *abfd));
+PROTO (long, bfd_get_mtime, (bfd *abfd));
+PROTO (bfd *, bfd_openr_next_archived_file, (bfd *obfd, bfd *last_file));
+PROTO (boolean, bfd_set_archive_head, (bfd *output_archive, bfd *new_head));
+PROTO (boolean, bfd_check_format, (bfd *abfd, bfd_format format));
+PROTO (boolean, bfd_set_format, (bfd *abfd, bfd_format format));
+PROTO (char *, bfd_core_file_failing_command, (bfd *abfd));
+PROTO (int, bfd_core_file_failing_signal, (bfd *abfd));
+PROTO (boolean, core_file_matches_executable_p, (bfd *core_bfd, bfd *exec_bfd));
+PROTO (sec_ptr, bfd_get_section_by_name, (bfd *abfd, CONST char *name));
+PROTO (void, bfd_map_over_sections, (bfd *abfd, void (*operation)(),
+ PTR user_storage));
+PROTO (sec_ptr, bfd_make_section, (bfd *abfd, CONST char *CONST name));
+PROTO (boolean, bfd_set_section_flags, (bfd *abfd, sec_ptr section,
+ flagword flags));
+PROTO (boolean, bfd_set_file_flags, (bfd *abfd, flagword flags));
+PROTO (boolean, bfd_arch_compatible, (bfd *abfd, bfd *bbfd,
+ enum bfd_architecture *res_arch,
+ unsigned long *res_machine));
+
+PROTO (boolean, bfd_set_section_size, (bfd *abfd, sec_ptr ptr,
+ unsigned long val));
+PROTO (boolean, bfd_get_section_contents, (bfd *abfd, sec_ptr section,
+ PTR location,
+ file_ptr offset, int count));
+PROTO (boolean, bfd_set_section_contents, (bfd *abfd, sec_ptr section,
+ PTR location,
+ file_ptr offset, int count));
+
+PROTO (unsigned long, bfd_get_next_mapent, (bfd *abfd, symindex prev, carsym **entry));
+PROTO (bfd *, bfd_get_elt_at_index, (bfd *abfd, int index));
+PROTO (boolean, bfd_set_symtab, (bfd *abfd, asymbol **location,
+ unsigned int symcount));
+PROTO (unsigned int, get_reloc_upper_bound, (bfd *abfd, sec_ptr asect));
+PROTO (unsigned int, bfd_canonicalize_reloc, (bfd *abfd, sec_ptr asect,
+ arelent **location,
+ asymbol **canon));
+PROTO (void, bfd_set_reloc, (bfd *abfd, sec_ptr asect, arelent **location,
+ unsigned int count));
+PROTO (boolean, bfd_set_start_address, (bfd *,bfd_vma));
+
+PROTO (void, bfd_print_symbol_vandf, (PTR, asymbol *));
+PROTO (bfd_reloc_status_enum_type, bfd_perform_relocation,
+ (bfd *, arelent*, PTR, asection *, bfd*));
+
+PROTO (bfd_vma, bfd_log2, (bfd_vma));
+#define bfd_symbol_same_target(abfd, symbol) \
+( ( ((symbol)->the_bfd->xvec) == (abfd)->xvec) ? true:false)
+
+PROTO(boolean, bfd_scan_arch_mach,(CONST char *, enum bfd_architecture *,
+ unsigned long *));
+
+/* For speed we turn calls to these interface routines directly into
+ jumps through the transfer vector. This makes error-checking somewhat
+ confusing; the user basically has to read the documentation since there
+ are no longer prototypes, only declarations in the xfer vector (which
+ should be enough for some compilers).
+
+ To bad the preprocessor is too dumb to allow us to clean this up with
+ a macro. */
+
+#define bfd_set_arch_mach(abfd, arch, mach) \
+ BFD_SEND (abfd, _bfd_set_arch_mach, (abfd, arch, mach))
+
+#define bfd_sizeof_headers(abfd, reloc) \
+ BFD_SEND (abfd, _bfd_sizeof_headers, (abfd, reloc))
+
+#define bfd_symbol_value(abfd, idx) \
+ BFD_SEND (abfd, _bfd_symbol_value, (abfd, idx))
+
+#define bfd_symbol_name(abfd, idx) \
+ BFD_SEND (abfd, _bfd_symbol_name, (abfd, idx))
+
+
+#define bfd_get_first_symbol(abfd) \
+ BFD_SEND (abfd, _bfd_get_first_symbol, (abfd))
+
+#define bfd_get_next_symbol(abfd, oidx) \
+ BFD_SEND (abfd, _bfd_get_next_symbol, (abfd, oidx))
+
+#define bfd_classify_symbol(abfd, idx) \
+ BFD_SEND (abfd, _bfd_classify_symbol, (abfd, idx))
+
+#define bfd_symbol_hasclass(abfd, idx, class) \
+ BFD_SEND (abfd, _bfd_symbol_hasclass, (abfd, idx, class))
+
+#define get_symtab_upper_bound(abfd) \
+ BFD_SEND (abfd, _get_symtab_upper_bound, (abfd))
+
+#define bfd_canonicalize_symtab(abfd, location) \
+ BFD_SEND (abfd, _bfd_canonicalize_symtab, (abfd, location))
+
+
+#define bfd_make_empty_symbol(abfd) \
+ BFD_SEND (abfd, _bfd_make_empty_symbol, (abfd))
+
+#define bfd_print_symbol(abfd, file, symbol, how) \
+ BFD_SEND (abfd, _bfd_print_symbol, (abfd, file, symbol, how))
+
+#define bfd_get_lineno(abfd, symbol) \
+ BFD_SEND (abfd, _get_lineno, (abfd, symbol))
+
+#define bfd_stat_arch_elt(abfd, buf) \
+ BFD_SEND(abfd, _bfd_stat_arch_elt, (abfd, buf))
+
+#define bfd_find_nearest_line(abfd, section, symbols, offset,filename_ptr, func, line_ptr) \
+BFD_SEND (abfd, _bfd_find_nearest_line, (abfd, section,symbols, offset, filename_ptr, func, line_ptr))
+
+
+/* Some byte-swapping i/o operations */
+#define LONG_SIZE 4
+#define SHORT_SIZE 2
+#define BYTE_SIZE 1
+#define bfd_putchar(abfd, val, ptr) (*((char *)ptr) = (char)val)
+#define bfd_getchar(abfd, ptr) (*((char *)ptr))
+
+#define bfd_putlong(abfd, val, ptr) BFD_SEND(abfd, bfd_putxlong, (val,ptr))
+#define bfd_getlong(abfd, ptr) BFD_SEND(abfd, bfd_getxlong, (ptr))
+
+#define bfd_putshort(abfd, val, ptr) BFD_SEND(abfd, bfd_putxshort, (val,ptr))
+#define bfd_getshort(abfd, ptr) BFD_SEND(abfd, bfd_getxshort, (ptr))
+
+#define bfd_h_putchar(abfd, val, ptr) bfd_putchar (abfd, val, ptr)
+#define bfd_h_getchar(abfd, ptr) bfd_getchar (abfd, ptr)
+
+#define bfd_h_putlong(abfd, val, ptr) BFD_SEND(abfd, bfd_h_putxlong, (val, (bfd_byte *) ptr))
+#define bfd_h_getlong(abfd, ptr) BFD_SEND(abfd, bfd_h_getxlong, ((bfd_byte *) ptr))
+
+#define bfd_h_putshort(abfd, val, ptr) BFD_SEND(abfd, bfd_h_putxshort,(val,ptr))
+#define bfd_h_getshort(abfd, ptr) BFD_SEND(abfd, bfd_h_getxshort,(ptr))
+
+/* General purpose one fits all. The do { } while (0) makes a single
+ statement out of it, for use in things like nested if-statements.
+
+ USE OF THESE MACROS IS DISCOURAGED. THEY ASSUME THAT THE HOST AND
+ TARGET FIELD ALIGNMENT AND SIZES ARE THE SAME. TARGET STRUCTS SHOULD
+ BE MODELED AS BYTE ARRAYS INSTEAD, TO AVOID THESE ASSUMPTIONS. */
+
+#define bfd_h_put_x(abfd, val, ptr) \
+ do { \
+ if (sizeof(*(ptr)) == LONG_SIZE) \
+ bfd_h_putlong (abfd, val, (bfd_byte*)(ptr));\
+ else if (sizeof(*(ptr)) == SHORT_SIZE) \
+ bfd_h_putshort (abfd, val, (bfd_byte *)(ptr));\
+ else if (sizeof(*(ptr)) == BYTE_SIZE) \
+ bfd_h_putchar (abfd, val, (bfd_byte *)(ptr));\
+ else abort(); } while (0)
+
+#define bfd_h_get_x(abfd, ptr) \
+ ((sizeof(*(ptr))==LONG_SIZE) ? bfd_h_getlong (abfd, (bfd_byte *)(ptr)):\
+ (sizeof(*(ptr))==SHORT_SIZE) ? bfd_h_getshort(abfd, (bfd_byte *)(ptr)):\
+ (sizeof(*(ptr))==BYTE_SIZE) ? bfd_h_getchar (abfd, (bfd_byte *)(ptr)):\
+ (abort(),1) )
+
+#ifdef GNU960
+
+#define BFD_COFF_FORMAT bfd_target_coff_flavour_enum
+#define BFD_BOUT_FORMAT bfd_target_aout_flavour_enum
+
+/*
+ * Return nonzero iff specified bfd is for big-endian target
+ */
+#define BFD_BIG_ENDIAN_FILE_P(abfd) \
+ ((abfd)->xvec->header_byteorder_big_p == true)
+
+/*
+ * Return nonzero iff specified bfd is for coff target
+ */
+#define BFD_COFF_FILE_P(abfd) ((abfd)->xvec->flavour == BFD_COFF_FORMAT)
+
+/*
+ * The names of the only targets the GNU/960 release cares about
+ */
+#define BFD_BIG_COFF_TARG "coff-Intel-big"
+#define BFD_LITTLE_COFF_TARG "coff-Intel-little"
+#define BFD_BIG_BOUT_TARG "b.out.big"
+#define BFD_LITTLE_BOUT_TARG "b.out.little"
+
+extern PROTO (char *, bfd_make_targ_name,( enum target_flavour_enum format, int bigendian));
+
+#endif /* GNU960 */
+
+#endif /* __BFD_H_SEEN__ */
diff --git a/include/bout.h b/include/bout.h
new file mode 100644
index 0000000..b0d4fb2
--- /dev/null
+++ b/include/bout.h
@@ -0,0 +1,168 @@
+/* $Id$
+ *
+ * This file is a modified version of 'a.out.h'. It is to be used in all
+ * GNU tools modified to support the i80960 (or tools that operate on
+ * object files created by such tools).
+ *
+ * All i80960 development is done in a CROSS-DEVELOPMENT environment. I.e.,
+ * object code is generated on, and executed under the direction of a symbolic
+ * debugger running on, a host system. We do not want to be subject to the
+ * vagaries of which host it is or whether it supports COFF or a.out format,
+ * or anything else. We DO want to:
+ *
+ * o always generate the same format object files, regardless of host.
+ *
+ * o have an 'a.out' header that we can modify for our own purposes
+ * (the 80960 is typically an embedded processor and may require
+ * enhanced linker support that the normal a.out.h header can't
+ * accommodate).
+ *
+ * As for byte-ordering, the following rules apply:
+ *
+ * o Text and data that is actually downloaded to the target is always
+ * in i80960 (little-endian) order.
+ *
+ * o All other numbers (in the header, symbols, relocation directives)
+ * are in host byte-order: object files CANNOT be lifted from a
+ * little-end host and used on a big-endian (or vice versa) without
+ * modification.
+ * ==> THIS IS NO LONGER TRUE USING BFD. WE CAN GENERATE ANY BYTE ORDER
+ * FOR THE HEADER, AND READ ANY BYTE ORDER. PREFERENCE WOULD BE TO
+ * USE LITTLE-ENDIAN BYTE ORDER THROUGHOUT, REGARDLESS OF HOST. <==
+ *
+ * o The downloader ('comm960') takes care to generate a pseudo-header
+ * with correct (i80960) byte-ordering before shipping text and data
+ * off to the NINDY monitor in the target systems. Symbols and
+ * relocation info are never sent to the target.
+ */
+
+
+#define BMAGIC 0415
+/* We don't accept the following (see N_BADMAG macro).
+ * They're just here so GNU code will compile.
+ */
+#define OMAGIC 0407 /* old impure format */
+#define NMAGIC 0410 /* read-only text */
+#define ZMAGIC 0413 /* demand load format */
+
+/* FILE HEADER
+ * All 'lengths' are given as a number of bytes.
+ * All 'alignments' are for relinkable files only; an alignment of
+ * 'n' indicates the corresponding segment must begin at an
+ * address that is a multiple of (2**n).
+ */
+struct exec {
+ /* Standard stuff */
+ unsigned long a_magic; /* Identifies this as a b.out file */
+ unsigned long a_text; /* Length of text */
+ unsigned long a_data; /* Length of data */
+ unsigned long a_bss; /* Length of runtime uninitialized data area */
+ unsigned long a_syms; /* Length of symbol table */
+ unsigned long a_entry; /* Runtime start address */
+ unsigned long a_trsize; /* Length of text relocation info */
+ unsigned long a_drsize; /* Length of data relocation info */
+
+ /* Added for i960 */
+ unsigned long a_tload; /* Text runtime load address */
+ unsigned long a_dload; /* Data runtime load address */
+ unsigned char a_talign; /* Alignment of text segment */
+ unsigned char a_dalign; /* Alignment of data segment */
+ unsigned char a_balign; /* Alignment of bss segment */
+ unsigned char unused; /* (Just to make struct size a multiple of 4) */
+};
+
+#define N_BADMAG(x) (((x).a_magic)!=BMAGIC)
+#define N_TXTOFF(x) ( sizeof(struct exec) )
+#define N_DATOFF(x) ( N_TXTOFF(x) + (x).a_text )
+#define N_TROFF(x) ( N_DATOFF(x) + (x).a_data )
+#define N_DROFF(x) ( N_TROFF(x) + (x).a_trsize )
+#define N_SYMOFF(x) ( N_DROFF(x) + (x).a_drsize )
+#define N_STROFF(x) ( N_SYMOFF(x) + (x).a_syms )
+
+/* A single entry in the symbol table
+ */
+struct nlist {
+ union {
+ char *n_name;
+ struct nlist *n_next;
+ long n_strx; /* Index into string table */
+ } n_un;
+ unsigned char n_type; /* See below */
+ char n_other; /* Used in i80960 support -- see below */
+ short n_desc;
+ unsigned long n_value;
+};
+
+
+/* Legal values of n_type
+ */
+#define N_UNDF 0 /* Undefined symbol */
+#define N_ABS 2 /* Absolute symbol */
+#define N_TEXT 4 /* Text symbol */
+#define N_DATA 6 /* Data symbol */
+#define N_BSS 8 /* BSS symbol */
+#define N_FN 31 /* Filename symbol */
+
+#define N_EXT 1 /* External symbol (OR'd in with one of above) */
+#define N_TYPE 036 /* Mask for all the type bits */
+#define N_STAB 0340 /* Mask for all bits used for SDB entries */
+
+/* MEANING OF 'n_other'
+ *
+ * If non-zero, the 'n_other' fields indicates either a leaf procedure or
+ * a system procedure, as follows:
+ *
+ * 1 <= n_other <= 32 :
+ * The symbol is the entry point to a system procedure.
+ * 'n_value' is the address of the entry, as for any other
+ * procedure. The system procedure number (which can be used in
+ * a 'calls' instruction) is (n_other-1). These entries come from
+ * '.sysproc' directives.
+ *
+ * n_other == N_CALLNAME
+ * the symbol is the 'call' entry point to a leaf procedure.
+ * The *next* symbol in the symbol table must be the corresponding
+ * 'bal' entry point to the procedure (see following). These
+ * entries come from '.leafproc' directives in which two different
+ * symbols are specified (the first one is represented here).
+ *
+ *
+ * n_other == N_BALNAME
+ * the symbol is the 'bal' entry point to a leaf procedure.
+ * These entries result from '.leafproc' directives in which only
+ * one symbol is specified, or in which the same symbol is
+ * specified twice.
+ *
+ * Note that an N_CALLNAME entry *must* have a corresponding N_BALNAME entry,
+ * but not every N_BALNAME entry must have an N_CALLNAME entry.
+ */
+#define N_CALLNAME (-1)
+#define N_BALNAME (-2)
+#define IS_CALLNAME(x) (N_CALLNAME == (int)(x))
+#define IS_BALNAME(x) (N_BALNAME == (int)(x))
+#define IS_OTHER(x) ((x)>0 && (x) <=32)
+
+struct relocation_info {
+ int r_address; /* File address of item to be relocated */
+ unsigned
+ r_symbolnum:24,/* Index of symbol on which relocation is based,
+ * if r_extern is set. Otherwise set to
+ * either N_TEXT, N_DATA, or N_BSS to
+ * indicate section on which relocation is
+ * based.
+ */
+ r_pcrel:1, /* 1 => relocate PC-relative; else absolute
+ * On i960, pc-relative implies 24-bit
+ * address, absolute implies 32-bit.
+ */
+ r_length:2, /* Number of bytes to relocate:
+ * 0 => 1 byte
+ * 1 => 2 bytes
+ * 2 => 4 bytes -- only value used for i960
+ */
+ r_extern:1,
+ r_bsr:1, /* Something for the GNU NS32K assembler */
+ r_disp:1, /* Something for the GNU NS32K assembler */
+ r_callj:1, /* 1 if relocation target is an i960 'callj' */
+ nuthin:1; /* Unused */
+};
diff --git a/include/coff-i960.h b/include/coff-i960.h
new file mode 100755
index 0000000..cac9d11
--- /dev/null
+++ b/include/coff-i960.h
@@ -0,0 +1,414 @@
+/*** coff information for 80960. Origins: Intel corp, natch. */
+
+/* NOTE: Tagentries (cf TAGBITS) are not used by the 960 */
+
+/********************** FILE HEADER **********************/
+
+struct filehdr {
+ unsigned short f_magic; /* magic number */
+ unsigned short f_nscns; /* number of sections */
+ long f_timdat; /* time & date stamp */
+ long f_symptr; /* file pointer to symtab */
+ long f_nsyms; /* number of symtab entries */
+ unsigned short f_opthdr; /* sizeof(optional hdr) */
+ unsigned short f_flags; /* flags */
+};
+
+/* Bits for f_flags:
+ * F_RELFLG relocation info stripped from file
+ * F_EXEC file is executable (no unresolved external references)
+ * F_LNNO line numbers stripped from file
+ * F_LSYMS local symbols stripped from file
+ * F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax)
+ */
+
+#define F_RELFLG (0x0001)
+#define F_EXEC (0x0002)
+#define F_LNNO (0x0004)
+#define F_LSYMS (0x0008)
+#define F_AR32WR (0x0010)
+
+/*
+ * Intel 80960 (I960) processor flags.
+ * F_I960TYPE == mask for processor type field.
+ */
+
+#define F_I960TYPE (0xf000)
+#define F_I960CORE (0x1000)
+#define F_I960KB (0x2000)
+#define F_I960SB (0x2000)
+#define F_I960MC (0x3000)
+#define F_I960XA (0x4000)
+#define F_I960CA (0x5000)
+#define F_I960KA (0x6000)
+#define F_I960SA (0x6000)
+
+ /*
+ * i80960 Magic Numbers
+ */
+
+#define I960ROMAGIC (0x160) /* read-only text segments */
+#define I960RWMAGIC (0x161) /* read-write text segments */
+
+#define I960BADMAG(x) (((x).f_magic!=I960ROMAGIC) && ((x).f_magic!=I960RWMAGIC))
+
+#define FILHDR struct filehdr
+#define FILHSZ sizeof(FILHDR)
+
+
+/********************** AOUT "OPTIONAL HEADER" **********************/
+
+typedef struct {
+ unsigned long phys_addr;
+ unsigned long bitarray;
+} TAGBITS;
+
+
+/* These appear to be used only by exec(2). I don't know who cares
+ about them in a cross development environment. In any case, this
+ is my collection after researching the issue for a few hours.
+ Apparently, most have these have remained essentially unchanged
+ since v7 days, although a few new ones have been added. xoxorich.
+ Could we have a little more teleology please? -- Gumby */
+
+#define BAD0MAGIC (0401) /* (?) "lpd (UNIX/RT)" */
+#define BAD1MAGIC (0405) /* (?) overlay */
+#define OMAGIC (0407) /* old impure format. data immediately
+ follows text. both sections are rw. */
+#define NMAGIC (0410) /* split i&d, read-only text */
+#define A_MAGIC3 (0411) /* (?) "separated I&D" */
+#define ZMAGIC (0413) /* like NMAGIC, but demand loaded */
+#define PAGEMAGIC2 (0414) /* (?) like ZMAGIC, but address zero
+ explicitly unmapped. */ /* */
+#define REGMAGIC (0414) /* (?) a PAGEMAGIC2 alias? */
+#define PAGEMAGIC3 (0415) /* (?) like ZMAGIC, but address zero mapped. */
+#define A_MAGIC5 (0437) /* (?) "system overlay, separated I&D" */
+#define SASMAGIC (010000) /* (?) "Single Address Space" */
+#define MASMAGIC (020000) /* (?) "Multiple (separate I/D) Addr. Spaces" */
+typedef struct aouthdr {
+ short magic; /* type of file */
+ short vstamp; /* version stamp */
+ unsigned long tsize; /* text size in bytes, padded to FW bdry*/
+ unsigned long dsize; /* initialized data " " */
+ unsigned long bsize; /* uninitialized data " " */
+#if U3B
+ unsigned long dum1;
+ unsigned long dum2; /* pad to entry point */
+#endif
+ unsigned long entry; /* entry pt. */
+ unsigned long text_start; /* base of text used for this file */
+ unsigned long data_start; /* base of data used for this file */
+ unsigned long tagentries; /* number of tag entries to follow */
+} AOUTHDR;
+
+/* return a pointer to the tag bits array */
+
+#define TAGPTR(aout) ((TAGBITS *) (&(aout.tagentries)+1))
+
+/* compute size of a header */
+
+/*#define AOUTSZ(aout) (sizeof(AOUTHDR)+(aout.tagentries*sizeof(TAGBITS)))*/
+#define AOUTSZ (sizeof(AOUTHDR))
+
+
+/********************** STORAGE CLASSES **********************/
+
+#define C_EFCN -1 /* physical end of function */
+#define C_NULL 0
+#define C_AUTO 1 /* automatic variable */
+#define C_EXT 2 /* external symbol */
+#define C_STAT 3 /* static */
+#define C_REG 4 /* register variable */
+#define C_EXTDEF 5 /* external definition */
+#define C_LABEL 6 /* label */
+#define C_ULABEL 7 /* undefined label */
+#define C_MOS 8 /* member of structure */
+#define C_ARG 9 /* function argument */
+#define C_STRTAG 10 /* structure tag */
+#define C_MOU 11 /* member of union */
+#define C_UNTAG 12 /* union tag */
+#define C_TPDEF 13 /* type definition */
+#define C_USTATIC 14 /* undefined static */
+#define C_ENTAG 15 /* enumeration tag */
+#define C_MOE 16 /* member of enumeration */
+#define C_REGPARM 17 /* register parameter */
+#define C_FIELD 18 /* bit field */
+/* #define C_REGARG 19 */ /* My guess - but Intel specific*/
+#define C_AUTOARG 19 /* auto argument */
+#define C_LASTENT 20 /* dummy entry (end of block) */
+#define C_BLOCK 100 /* ".bb" or ".eb" */
+#define C_FCN 101 /* ".bf" or ".ef" */
+#define C_EOS 102 /* end of structure */
+#define C_FILE 103 /* file name */
+#define C_LINE 104 /* line # reformatted as symbol table entry */
+#define C_ALIAS 105 /* duplicate tag */
+#define C_HIDDEN 106 /* ext symbol in dmert public lib */
+
+ /* New storage classes for 80960 */
+
+/* C_LEAFPROC is obsolete. Use C_LEAFEXT or C_LEAFSTAT */
+#define C_LEAFPROC 108 /* Leaf procedure, "call" via BAL */
+
+#define C_SCALL 107 /* Procedure reachable via system call */
+#define C_LEAFEXT 108 /* External leaf */
+#define C_LEAFSTAT 113 /* Static leaf */
+#define C_OPTVAR 109 /* Optimized variable */
+#define C_DEFINE 110 /* Preprocessor #define */
+#define C_PRAGMA 111 /* Advice to compiler or linker */
+#define C_SEGMENT 112 /* 80960 segment name */
+
+/********************** SECTION HEADER **********************/
+
+struct scnhdr {
+ char s_name[8]; /* section name */
+ long s_paddr; /* physical address, aliased s_nlib */
+ long s_vaddr; /* virtual address */
+ long s_size; /* section size */
+ long s_scnptr; /* file ptr to raw data for section */
+ long s_relptr; /* file ptr to relocation */
+ long s_lnnoptr; /* file ptr to line numbers */
+ unsigned short s_nreloc; /* number of relocation entries */
+ unsigned short s_nlnno; /* number of line number entries*/
+ long s_flags; /* flags */
+ unsigned long s_align; /* section alignment */
+};
+
+/*
+ * names of "special" sections
+ */
+#define _TEXT ".text"
+#define _DATA ".data"
+#define _BSS ".bss"
+
+/*
+ * s_flags "type"
+ */
+#define STYP_REG (0x0000) /* "regular": allocated, relocated, loaded */
+#define STYP_DSECT (0x0001) /* "dummy": relocated only*/
+#define STYP_NOLOAD (0x0002) /* "noload": allocated, relocated, not loaded */
+#define STYP_GROUP (0x0004) /* "grouped": formed of input sections */
+#define STYP_PAD (0x0008) /* "padding": not allocated, not relocated, loaded */
+#define STYP_COPY (0x0010) /* "copy": for decision function used by field update; not allocated, not relocated,
+ loaded; reloc & lineno entries processed normally */
+#define STYP_TEXT (0x0020) /* section contains text only */
+#define S_SHRSEG (0x0020) /* In 3b Update files (output of ogen), sections which appear in SHARED segments of the Pfile
+ will have the S_SHRSEG flag set by ogen, to inform dufr that updating 1 copy of the proc. will
+ update all process invocations. */
+#define STYP_DATA (0x0040) /* section contains data only */
+#define STYP_BSS (0x0080) /* section contains bss only */
+#define S_NEWFCN (0x0100) /* In a minimal file or an update file, a new function (as compared with a replaced function) */
+#define STYP_INFO (0x0200) /* comment: not allocated not relocated, not loaded */
+#define STYP_OVER (0x0400) /* overlay: relocated not allocated or loaded */
+#define STYP_LIB (0x0800) /* for .lib: same as INFO */
+#define STYP_MERGE (0x2000) /* merge section -- combines with text, data or bss sections only */
+#define STYP_REVERSE_PAD (0x4000) /* section will be padded with no-op instructions wherever padding is necessary and there is a
+ word of contiguous bytes beginning on a word boundary. */
+
+#define SCNHDR struct scnhdr
+#define SCNHSZ sizeof(SCNHDR)
+
+
+/********************** 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 lineno {
+ union {
+ long l_symndx; /* function name symbol index, iff l_lnno == 0*/
+ long l_paddr; /* (physical) address of line number */
+ } l_addr;
+ unsigned short l_lnno; /* line number */
+ char padding[2]; /* force alignment */
+};
+
+#define LINENO struct lineno
+#define LINESZ sizeof(LINENO)
+
+
+/********************** SYMBOLS **********************/
+
+#define SYMNMLEN 8 /* # characters in a symbol name */
+#define FILNMLEN 14 /* # characters in a file name */
+#define DIMNUM 4 /* # array dimensions in auxiliary entry */
+
+struct syment {
+ union {
+ char _n_name[SYMNMLEN]; /* old COFF version */
+ struct {
+ long _n_zeroes; /* new == 0 */
+ long _n_offset; /* offset into string table */
+ } _n_n;
+ char *_n_nptr[2]; /* allows for overlaying */
+ } _n;
+ long n_value; /* value of symbol */
+ short n_scnum; /* section number */
+ unsigned short n_flags; /* copy of flags from filhdr */
+ unsigned long n_type; /* type and derived type */
+ char n_sclass; /* storage class */
+ char n_numaux; /* number of aux. entries */
+ char pad2[2]; /* force alignment */
+};
+
+#define n_name _n._n_name
+#define n_ptr _n._n_nptr[1]
+#define n_zeroes _n._n_n._n_zeroes
+#define n_offset _n._n_n._n_offset
+
+/*
+ * Relocatable symbols have number of the section in which they are defined,
+ * or one of the following:
+ */
+#define N_UNDEF ((short)0) /* undefined symbol */
+#define N_ABS ((short)-1) /* value of symbol is absolute */
+#define N_DEBUG ((short)-2) /* debugging symbol -- value is meaningless */
+#define N_TV ((short)-3) /* indicates symbol needs preload transfer vector */
+#define P_TV ((short)-4) /* indicates symbol needs postload transfer vector*/
+
+/*
+ * Type of a symbol, in low 4 bits of the word
+ */
+#define T_NULL 0
+#define T_VOID 1 /* function argument (only used by compiler) */
+#define T_CHAR 2 /* character */
+#define T_SHORT 3 /* short integer */
+#define T_INT 4 /* integer */
+#define T_LONG 5 /* long integer */
+#define T_FLOAT 6 /* floating point */
+#define T_DOUBLE 7 /* double word */
+#define T_STRUCT 8 /* structure */
+#define T_UNION 9 /* union */
+#define T_ENUM 10 /* enumeration */
+#define T_MOE 11 /* member of enumeration*/
+#define T_UCHAR 12 /* unsigned character */
+#define T_USHORT 13 /* unsigned short */
+#define T_UINT 14 /* unsigned integer */
+#define T_ULONG 15 /* unsigned long */
+#define T_LNGDBL 16 /* long double */
+
+/*
+ * derived types, in n_type
+*/
+#define DT_NON (0) /* no derived type */
+#define DT_PTR (1) /* pointer */
+#define DT_FCN (2) /* function */
+#define DT_ARY (3) /* array */
+
+#define N_BTMASK (0x1f)
+#define N_TMASK (0x60)
+#define N_BTSHFT (5)
+#define N_TSHIFT (2)
+
+#define BTYPE(x) ((x) & N_BTMASK)
+
+#define ISPTR(x) (((x) & N_TMASK) == (DT_PTR << N_BTSHFT))
+#define ISFCN(x) (((x) & N_TMASK) == (DT_FCN << N_BTSHFT))
+#define ISARY(x) (((x) & N_TMASK) == (DT_ARY << N_BTSHFT))
+
+#define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))
+
+union auxent {
+ struct {
+ long x_tagndx; /* str, un, or enum tag indx */
+ union {
+ struct {
+ unsigned short x_lnno; /* declaration line number */
+ unsigned short x_size; /* str/union/array size */
+ } x_lnsz;
+ long x_fsize; /* size of function */
+ } x_misc;
+ union {
+ struct { /* if ISFCN, tag, or .bb */
+ long x_lnnoptr; /* ptr to fcn line # */
+ long x_endndx; /* entry ndx past block end */
+ } x_fcn;
+ struct { /* if ISARY, up to 4 dimen. */
+ unsigned short x_dimen[DIMNUM];
+ } x_ary;
+ } x_fcnary;
+ unsigned short x_tvndx; /* tv index */
+ } x_sym;
+
+ union {
+ char x_fname[FILNMLEN];
+ struct {
+ long x_zeroes;
+ long x_offset;
+ } x_n;
+ } x_file;
+
+ struct {
+ long x_scnlen; /* section length */
+ unsigned short x_nreloc; /* # relocation entries */
+ unsigned short x_nlinno; /* # line numbers */
+ } x_scn;
+
+ struct {
+ long x_tvfill; /* tv fill value */
+ unsigned short x_tvlen; /* length of .tv */
+ unsigned short x_tvran[2]; /* tv range */
+ } x_tv; /* info about .tv section (in auxent of symbol .tv)) */
+
+ /******************************************
+ * I960-specific *2nd* aux. entry formats
+ ******************************************/
+ struct {
+/* This is a very old typo that keeps getting propagated. */
+#define x_stdindx x_stindx
+ long x_stindx; /* sys. table entry */
+ } x_sc; /* system call entry */
+
+ struct {
+ unsigned long x_balntry; /* BAL entry point */
+ } x_bal; /* BAL-callable function */
+
+ struct {
+ unsigned long x_timestamp; /* time stamp */
+ char x_idstring[20]; /* producer identity string */
+ } x_ident; /* Producer ident info */
+
+ char a[sizeof(struct syment)]; /* force auxent/syment sizes to match */
+};
+
+#define SYMENT struct syment
+#define SYMESZ sizeof(SYMENT)
+#define AUXENT union auxent
+#define AUXESZ sizeof(AUXENT)
+
+#if VAX || I960
+# define _ETEXT "_etext"
+#else
+# define _ETEXT "etext"
+#endif
+
+/********************** RELOCATION DIRECTIVES **********************/
+
+struct reloc {
+ long r_vaddr; /* Virtual address of reference */
+ long r_symndx; /* Index into symbol table */
+ unsigned short r_type; /* Relocation type */
+ char pad[2]; /* Unused */
+};
+
+/* Relevent values for r_type and i960. Would someone please document them */
+
+#define R_RELLONG (0x11) /* Direct 32-bit relocation */
+#define R_IPRSHORT (0x18)
+#define R_IPRMED (0x19) /* 24-bit ip-relative relocation */
+#define R_IPRLONG (0x1a)
+#define R_OPTCALL (0x1b) /* 32-bit optimizable call (leafproc/sysproc) */
+#define R_OPTCALLX (0x1c) /* 64-bit optimizable call (leafproc/sysproc) */
+#define R_GETSEG (0x1d)
+#define R_GETPA (0x1e)
+#define R_TAGWORD (0x1f)
+
+#define RELOC struct reloc
+#define RELSZ sizeof(RELOC)
+
+#define DEFAULT_DATA_SECTION_ALIGNMENT 4
+#define DEFAULT_BSS_SECTION_ALIGNMENT 4
+#define DEFAULT_TEXT_SECTION_ALIGNMENT 16
+/* For new sections we havn't heard of before */
+#define DEFAULT_SECTION_ALIGNMENT 4
diff --git a/include/coff-m88k.h b/include/coff-m88k.h
new file mode 100755
index 0000000..1a1d5d8
--- /dev/null
+++ b/include/coff-m88k.h
@@ -0,0 +1,298 @@
+/*** coff information for 88k bcs */
+
+/********************** FILE HEADER **********************/
+
+struct filehdr {
+ unsigned short f_magic; /* magic number */
+ unsigned short f_nscns; /* number of sections */
+ long f_timdat; /* time & date stamp */
+ long f_symptr; /* file pointer to symtab */
+ long f_nsyms; /* number of symtab entries */
+ unsigned short f_opthdr; /* sizeof(optional hdr) */
+ unsigned short f_flags; /* flags */
+};
+
+/* Bits for f_flags:
+ * F_RELFLG relocation info stripped from file
+ * F_EXEC file is executable (no unresolved externel references)
+ * F_LNNO line nunbers stripped from file
+ * F_LSYMS local symbols stripped from file
+ * F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax)
+ */
+#define F_RELFLG 0000001
+#define F_EXEC 0000002
+#define F_LNNO 0000004
+#define F_LSYMS 0000010
+#define F_AR32WR 0x100
+#define F_AR32W 0x200
+
+#define MC88MAGIC 0540 /* 88k BCS executable */
+#define MC88DMAGIC 0541 /* DG/UX executable */
+#define MC88OMAGIC 0555 /* Object file */
+
+#define MC88BADMAG(x) (((x).f_magic!=MC88MAGIC) &&((x).f_magic!=MC88DMAGIC) && ((x).f_magic != MC88OMAGIC))
+
+#define FILHDR struct filehdr
+#define FILHSZ sizeof(FILHDR)
+
+
+/********************** AOUT "OPTIONAL HEADER" **********************/
+
+
+#define PAGEMAGIC3 0414 /* Split i&d, zero mapped */
+#define PAGEMAGICBCS 0413
+
+typedef struct aouthdr {
+ short magic; /* type of file */
+ short vstamp; /* version stamp */
+ unsigned long tsize; /* text size in bytes, padded to FW bdry*/
+ unsigned long dsize; /* initialized data " " */
+ unsigned long bsize; /* uninitialized data " " */
+
+ unsigned long entry; /* entry pt. */
+ unsigned long text_start; /* base of text used for this file */
+ unsigned long data_start; /* base of data used for this file */
+
+} AOUTHDR;
+
+
+/* compute size of a header */
+
+#define AOUTSZ (sizeof(AOUTHDR))
+
+/********************** STORAGE CLASSES **********************/
+
+#define C_EFCN -1 /* physical end of function */
+#define C_NULL 0
+#define C_AUTO 1 /* automatic variable */
+#define C_EXT 2 /* external symbol */
+#define C_STAT 3 /* static */
+#define C_REG 4 /* register variable */
+#define C_EXTDEF 5 /* external definition */
+#define C_LABEL 6 /* label */
+#define C_ULABEL 7 /* undefined label */
+#define C_MOS 8 /* member of structure */
+#define C_ARG 9 /* function argument */
+#define C_STRTAG 10 /* structure tag */
+#define C_MOU 11 /* member of union */
+#define C_UNTAG 12 /* union tag */
+#define C_TPDEF 13 /* type definition */
+#define C_USTATIC 14 /* undefined static */
+#define C_ENTAG 15 /* enumeration tag */
+#define C_MOE 16 /* member of enumeration */
+#define C_REGPARM 17 /* register parameter */
+#define C_FIELD 18 /* bit field */
+#define C_BLOCK 100 /* ".bb" or ".eb" */
+#define C_FCN 101 /* ".bf" or ".ef" */
+#define C_EOS 102 /* end of structure */
+#define C_FILE 103 /* file name */
+#define C_LINE 104 /* line # reformatted as symbol table entry */
+#define C_ALIAS 105 /* duplicate tag */
+#define C_HIDDEN 106 /* ext symbol in dmert public lib */
+#define C_SHADOW 107 /* shadow symbol */
+#define C_VERSION 108 /* coff version symbol */
+
+
+/********************** SECTION HEADER **********************/
+
+struct scnhdr {
+ char s_name[8]; /* section name */
+ long s_paddr; /* physical address, aliased s_nlib */
+ long s_vaddr; /* virtual address */
+ long s_size; /* section size */
+ long s_scnptr; /* file ptr to raw data for section */
+ long s_relptr; /* file ptr to relocation */
+ long s_lnnoptr; /* file ptr to line numbers */
+ long s_nreloc; /* number of relocation entries */
+ long s_nlnno; /* number of line number entries*/
+ long s_flags; /* flags */
+};
+
+/*
+ * names of "special" sections
+ */
+#define _TEXT ".text"
+#define _DATA ".data"
+#define _BSS ".bss"
+
+/*
+ * s_flags "type"
+ */
+#define STYP_TEXT 0x20 /* section contains text only */
+#define STYP_DATA 0x40 /* section contains data only */
+#define STYP_BSS 0x80 /* section contains bss only */
+
+#define SCNHDR struct scnhdr
+#define SCNHSZ sizeof(SCNHDR)
+
+
+/********************** 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 lineno{
+ union {
+ long l_symndx; /* function name symbol index, iff l_lnno == 0*/
+ long l_paddr; /* (physical) address of line number */
+ } l_addr;
+
+ long l_lnno;
+
+};
+
+#define LINENO struct lineno
+#define LINESZ sizeof(LINENO)
+
+
+/********************** SYMBOLS **********************/
+
+#define SYMNMLEN 8 /* # characters in a symbol name */
+#define FILNMLEN 14 /* # characters in a file name */
+#define DIMNUM 4 /* # array dimensions in auxiliary entry */
+
+
+struct syment {
+ union {
+ char _n_name[SYMNMLEN]; /* old COFF version */
+ struct {
+ long _n_zeroes; /* new == 0 */
+ long _n_offset; /* offset into string table */
+ } _n_n;
+ char *_n_nptr[2]; /* allows for overlaying */
+ } _n;
+ long n_value; /* value of symbol */
+ short n_scnum; /* section number */
+ unsigned short n_type; /* type and derived type */
+ char n_sclass; /* storage class */
+ char n_numaux; /* number of aux. entries */
+ char pad2[2]; /* force alignment */
+};
+
+#define n_name _n._n_name
+#define n_zeroes _n._n_n._n_zeroes
+#define n_offset _n._n_n._n_offset
+
+/*
+ * Relocatable symbols have number of the section in which they are defined,
+ * or one of the following:
+ */
+#define N_UNDEF 0 /* undefined symbol */
+#define N_ABS -1 /* value of symbol is absolute */
+#define N_DEBUG -2 /* debugging symbol -- symbol value is meaningless */
+
+/*
+ * Type of a symbol, in low 4 bits of the word
+ */
+#define T_NULL 0
+#define T_VOID 1 /* function argument (only used by compiler) */
+#define T_CHAR 2 /* character */
+#define T_SHORT 3 /* short integer */
+#define T_INT 4 /* integer */
+#define T_LONG 5 /* long integer */
+#define T_FLOAT 6 /* floating point */
+#define T_DOUBLE 7 /* double word */
+#define T_STRUCT 8 /* structure */
+#define T_UNION 9 /* union */
+#define T_ENUM 10 /* enumeration */
+#define T_MOE 11 /* member of enumeration*/
+#define T_UCHAR 12 /* unsigned character */
+#define T_USHORT 13 /* unsigned short */
+#define T_UINT 14 /* unsigned integer */
+#define T_ULONG 15 /* unsigned long */
+
+
+
+/*
+ * derived types
+ */
+#define DT_NON 0
+#define DT_PTR 1 /* pointer */
+#define DT_FCN 2 /* function */
+#define DT_ARY 3 /* array */
+
+#define N_BTMASK 017
+#define N_TMASK 060
+#define N_BTSHFT 4
+#define N_TSHIFT 2
+
+#define BTYPE(x) ((x) & N_BTMASK)
+
+
+#define ISPTR(x) (((x) & N_TMASK) == (DT_PTR << N_BTSHFT))
+#define ISFCN(x) (((x) & N_TMASK) == (DT_FCN << N_BTSHFT))
+#define ISARY(x) (((x) & N_TMASK) == (DT_ARY << N_BTSHFT))
+
+#define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))
+
+union auxent {
+ struct {
+ long x_tagndx; /* str, un, or enum tag indx */
+ union {
+ struct {
+ unsigned long x_lnno; /* declaration line number */
+ unsigned long x_size; /* str/union/array size */
+ } x_lnsz;
+ long x_fsize; /* size of function */
+ } x_misc;
+ union {
+ struct { /* if ISFCN, tag, or .bb */
+ long x_lnnoptr; /* ptr to fcn line # */
+ long x_endndx; /* entry ndx past block end */
+ } x_fcn;
+ struct { /* if ISARY, up to 4 dimen. */
+ unsigned short x_dimen[DIMNUM];
+ } x_ary;
+ } x_fcnary;
+ unsigned short x_tvndx; /* tv index */
+ } x_sym;
+
+ union {
+ char x_fname[FILNMLEN];
+ struct {
+ long x_zeroes;
+ long x_offset;
+ } x_n;
+ } x_file;
+
+ struct {
+ long x_scnlen; /* section length */
+ unsigned long x_nreloc; /* # relocation entries */
+ unsigned long x_nlinno; /* # line numbers */
+ } x_scn;
+
+
+};
+
+#define SYMENT struct syment
+#define SYMESZ 20
+#define AUXENT union auxent
+#define AUXESZ 20
+
+
+/********************** RELOCATION DIRECTIVES **********************/
+
+struct reloc {
+ long r_vaddr; /* Virtual address of reference */
+ long r_symndx; /* Index into symbol table */
+ unsigned short r_type; /* Relocation type */
+ unsigned short r_offset;/* Hi 16 bits of constant */
+};
+
+/* Only values of r_type GNU/88k cares about */
+#define R_PCR16L 128
+#define R_PCR26L 129
+#define R_VRT16 130
+#define R_HVRT16 131
+#define R_LVRT16 132
+#define R_VRT32 133
+
+
+
+
+#define RELOC struct reloc
+#define RELSZ sizeof(RELOC)
+
+#define DEFAULT_SECTION_ALIGNMENT 8 /* double word */
diff --git a/include/ieee.h b/include/ieee.h
new file mode 100644
index 0000000..08ebd01
--- /dev/null
+++ b/include/ieee.h
@@ -0,0 +1,128 @@
+#define N_W_VARIABLES 8
+#define Module_Beginning 0xe0
+
+typedef struct {
+ char *processor;
+ char *module_name;
+} ieee_module_begin_type;
+
+#define Address_Descriptor 0xec
+typedef struct {
+bfd_vma number_of_bits_mau;
+ bfd_vma number_of_maus_in_address;
+
+ unsigned char byte_order;
+#define IEEE_LITTLE 0xcc
+#define IEEE_BIG 0xcd
+} ieee_address_descriptor_type;
+
+typedef union {
+ file_ptr offset[N_W_VARIABLES];
+ struct {
+ file_ptr extension_record;
+ file_ptr environmental_record;
+ file_ptr section_part;
+ file_ptr external_part;
+ file_ptr debug_information_part;
+ file_ptr data_part;
+ file_ptr trailer_part;
+ file_ptr me_record;
+ } r;
+} ieee_w_variable_type;
+
+
+
+
+
+typedef enum
+{
+ ieee_number_start_enum = 0x00,
+ ieee_number_end_enum=0x7f,
+ ieee_number_repeat_start_enum = 0x80,
+ ieee_number_repeat_end_enum = 0x88,
+ ieee_number_repeat_4_enum = 0x84,
+ ieee_number_repeat_3_enum = 0x83,
+ ieee_number_repeat_2_enum = 0x82,
+ ieee_number_repeat_1_enum = 0x81,
+ ieee_module_beginning_enum = 0xe0,
+ ieee_module_end_enum = 0xe1,
+ ieee_extension_length_1_enum = 0xde,
+ ieee_extension_length_2_enum = 0xdf,
+ ieee_section_type_enum = 0xe6,
+ ieee_section_alignment_enum = 0xe7,
+ ieee_external_symbol_enum = 0xe8,
+ ieee_attribute_record_enum = 0xf1c9,
+ ieee_comma = 0x90,
+ ieee_external_reference_enum = 0xe9,
+ ieee_set_current_section_enum = 0xe5,
+ ieee_address_descriptor_enum = 0xec,
+ ieee_load_constant_bytes_enum = 0xed,
+ ieee_load_with_relocation_enum = 0xe4,
+
+ ieee_variable_A_enum = 0xc1,
+ ieee_variable_B_enum = 0xc2,
+ ieee_variable_C_enum = 0xc3,
+ ieee_variable_D_enum = 0xc4,
+ ieee_variable_E_enum = 0xc5,
+ ieee_variable_F_enum = 0xc6,
+ ieee_variable_G_enum = 0xc7,
+ ieee_variable_H_enum = 0xc8,
+ ieee_variable_I_enum = 0xc9,
+ ieee_variable_J_enum = 0xca,
+ ieee_variable_K_enum = 0xcb,
+ ieee_variable_L_enum = 0xcc,
+ ieee_variable_M_enum = 0xcd,
+ ieee_variable_N_enum = 0xce,
+ ieee_variable_O_enum = 0xcf,
+ ieee_variable_P_enum = 0xd0,
+ ieee_variable_Q_enum = 0xd1,
+ ieee_variable_R_enum = 0xd2,
+ ieee_variable_S_enum = 0xd3,
+ ieee_variable_T_enum = 0xd4,
+ ieee_variable_U_enum = 0xd5,
+ ieee_variable_V_enum = 0xd6,
+ ieee_variable_W_enum = 0xd7,
+ ieee_variable_X_enum = 0xd8,
+ ieee_variable_Y_enum = 0xd9,
+ ieee_variable_Z_enum = 0xda,
+ ieee_function_plus_enum = 0xa5,
+ ieee_function_minus_enum = 0xa6,
+ ieee_function_signed_open_b_enum = 0xba,
+ ieee_function_signed_close_b_enum = 0xbb,
+
+ ieee_function_unsigned_open_b_enum = 0xbc,
+ ieee_function_unsigned_close_b_enum = 0xbd,
+
+ ieee_function_either_open_b_enum = 0xbe,
+ ieee_function_either_close_b_enum = 0xbf,
+ ieee_record_seperator_enum = 0xdb,
+
+ ieee_e2_first_byte_enum = 0xe2,
+ ieee_section_size_enum = 0xe2d3,
+ ieee_physical_region_size_enum = 0xe2c1,
+ ieee_region_base_address_enum = 0xe2c2,
+ ieee_mau_size_enum = 0xe2c6,
+ ieee_m_value_enum = 0xe2cd,
+ ieee_section_base_address_enum = 0xe2cc,
+ ieee_section_offset_enum = 0xe2d2,
+ ieee_value_starting_address_enum = 0xe2c7,
+ ieee_assign_value_to_variable_enum = 0xe2d7,
+ ieee_set_current_pc_enum = 0xe2d0,
+ ieee_value_record_enum = 0xe2c9,
+ ieee_weak_external_reference_enum= 0xf4,
+
+} ieee_record_enum_type;
+
+
+typedef struct {
+ unsigned int section_index;
+ unsigned int section_type;
+ char *section_name;
+ unsigned int parent_section_index;
+ unsigned int sibling_section_index;
+ unsigned int context_index;
+} ieee_section_type;
+#define IEEE_REFERENCE_BASE 11
+#define IEEE_PUBLIC_BASE 32
+#define IEEE_SECTION_NUMBER_BASE 1
+
diff --git a/include/oasys.h b/include/oasys.h
new file mode 100644
index 0000000..642f752
--- /dev/null
+++ b/include/oasys.h
@@ -0,0 +1,117 @@
+
+/* **** */
+
+
+typedef struct {
+ int32_type version;
+ char create_date[12];
+ char revision_date[12];
+ uint32_type mod_count;
+ uint32_type mod_tbl_offset;
+ uint32_type sym_tbl_size;
+ uint32_type sym_count;
+ uint32_type sym_tbl_offset;
+ uint32_type xref_count;
+ uint32_type xref_lst_offset;
+} oasys_archive_header_type;
+
+typedef struct {
+ int32_type mod_number;
+ char mod_date[12];
+ int32_type mod_size;
+ int32_type dep_count;
+ int32_type depee_count;
+ int32_type sect_count;
+ int32_type file_offset;
+ int32_type mod_name_length;
+} oasys_module_table_type;
+
+
+typedef enum {
+ oasys_record_is_end_enum = 0,
+ oasys_record_is_data_enum = 1,
+ oasys_record_is_symbol_enum = 2,
+ oasys_record_is_header_enum = 3,
+ oasys_record_is_named_section_enum = 4,
+ oasys_record_is_com_enum = 5,
+ oasys_record_is_debug_enum = 6,
+ oasys_record_is_section_enum = 7,
+ oasys_record_is_debug_file_enum = 8,
+ oasys_record_is_module_enum = 9,
+ oasys_record_is_local_enum = 10
+} oasys_record_enum_type;
+
+
+
+typedef struct {
+ uint8_type length;
+ int8_type check_sum;
+ int8_type type;
+ int8_type fill;
+} oasys_record_header_type;
+
+typedef struct {
+ oasys_record_header_type header;
+ uint8e_type relb;
+ uint8e_type addr[4];
+ uint8e_type data[256];
+} oasys_data_record_type;
+
+typedef struct {
+ oasys_record_header_type header;
+ int8_type version_number;
+ int8_type rev_number;
+ char module_name[26-6];
+ char description[64-26];
+} oasys_header_record_type;
+
+#define OASYS_VERSION_NUMBER 0
+#define OASYS_REV_NUMBER 0
+typedef struct {
+ oasys_record_header_type header;
+ int8e_type relb;
+ int8e_type value[4];
+ int8e_type refno[2];
+ char name[64];
+} oasys_symbol_record_type;
+
+typedef int8e_type relocation_byte;
+
+#define RELOCATION_PCREL_BIT 0x80
+#define RELOCATION_32BIT_BIT 0x40
+#define RELOCATION_TYPE_BITS 0x30
+#define RELOCATION_TYPE_ABS 0x00
+#define RELOCATION_TYPE_REL 0x10
+#define RELOCATION_TYPE_UND 0x20
+#define RELOCATION_TYPE_COM 0x30
+#define RELOCATION_SECT_BITS 0x0f
+
+typedef struct
+{
+ oasys_record_header_type header;
+ uint8e_type relb;
+ int8_type value[4];
+ int8_type vma[4];
+ int8_type fill[3];
+} oasys_section_record_type;
+
+typedef struct {
+ oasys_record_header_type header;
+ uint8e_type relb;
+ int8e_type entry[4];
+ int8e_type fill[2];
+ int8e_type zero;
+} oasys_end_record_type;
+
+
+#define OASYS_MAX_SEC_COUNT 16
+typedef union
+{
+ oasys_record_header_type header;
+ oasys_data_record_type data;
+ oasys_section_record_type section;
+ oasys_symbol_record_type symbol;
+ oasys_header_record_type first;
+ oasys_end_record_type end;
+ uint8e_type pad[256];
+} oasys_record_union_type;
diff --git a/include/obstack.h b/include/obstack.h
new file mode 100644
index 0000000..2e80c9c
--- /dev/null
+++ b/include/obstack.h
@@ -0,0 +1,416 @@
+/* obstack.h - object stack macros
+ Copyright (C) 1988 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 1, 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, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* Summary:
+
+All the apparent functions defined here are macros. The idea
+is that you would use these pre-tested macros to solve a
+very specific set of problems, and they would run fast.
+Caution: no side-effects in arguments please!! They may be
+evaluated MANY times!!
+
+These macros operate a stack of objects. Each object starts life
+small, and may grow to maturity. (Consider building a word syllable
+by syllable.) An object can move while it is growing. Once it has
+been "finished" it never changes address again. So the "top of the
+stack" is typically an immature growing object, while the rest of the
+stack is of mature, fixed size and fixed address objects.
+
+These routines grab large chunks of memory, using a function you
+supply, called `obstack_chunk_alloc'. On occasion, they free chunks,
+by calling `obstack_chunk_free'. You must define them and declare
+them before using any obstack macros.
+
+Each independent stack is represented by a `struct obstack'.
+Each of the obstack macros expects a pointer to such a structure
+as the first argument.
+
+One motivation for this package is the problem of growing char strings
+in symbol tables. Unless you are "fascist pig with a read-only mind"
+[Gosper's immortal quote from HAKMEM item 154, out of context] you
+would not like to put any arbitrary upper limit on the length of your
+symbols.
+
+In practice this often means you will build many short symbols and a
+few long symbols. At the time you are reading a symbol you don't know
+how long it is. One traditional method is to read a symbol into a
+buffer, realloc()ating the buffer every time you try to read a symbol
+that is longer than the buffer. This is beaut, but you still will
+want to copy the symbol from the buffer to a more permanent
+symbol-table entry say about half the time.
+
+With obstacks, you can work differently. Use one obstack for all symbol
+names. As you read a symbol, grow the name in the obstack gradually.
+When the name is complete, finalize it. Then, if the symbol exists already,
+free the newly read name.
+
+The way we do this is to take a large chunk, allocating memory from
+low addresses. When you want to build a symbol in the chunk you just
+add chars above the current "high water mark" in the chunk. When you
+have finished adding chars, because you got to the end of the symbol,
+you know how long the chars are, and you can create a new object.
+Mostly the chars will not burst over the highest address of the chunk,
+because you would typically expect a chunk to be (say) 100 times as
+long as an average object.
+
+In case that isn't clear, when we have enough chars to make up
+the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed)
+so we just point to it where it lies. No moving of chars is
+needed and this is the second win: potentially long strings need
+never be explicitly shuffled. Once an object is formed, it does not
+change its address during its lifetime.
+
+When the chars burst over a chunk boundary, we allocate a larger
+chunk, and then copy the partly formed object from the end of the old
+chunk to the beginning of the new larger chunk. We then carry on
+accreting characters to the end of the object as we normally would.
+
+A special macro is provided to add a single char at a time to a
+growing object. This allows the use of register variables, which
+break the ordinary 'growth' macro.
+
+Summary:
+ We allocate large chunks.
+ We carve out one object at a time from the current chunk.
+ Once carved, an object never moves.
+ We are free to append data of any size to the currently
+ growing object.
+ Exactly one object is growing in an obstack at any one time.
+ You can run one obstack per control block.
+ You may have as many control blocks as you dare.
+ Because of the way we do it, you can `unwind' a obstack
+ back to a previous state. (You may remove objects much
+ as you would with a stack.)
+*/
+
+
+/* Don't do the contents of this file more than once. */
+
+#ifndef __OBSTACKS__
+#define __OBSTACKS__
+
+/* We use subtraction of (char *)0 instead of casting to int
+ because on word-addressable machines a simple cast to int
+ may ignore the byte-within-word field of the pointer. */
+
+#ifndef __PTR_TO_INT
+#define __PTR_TO_INT(P) ((P) - (char *)0)
+#endif
+
+#ifndef __INT_TO_PTR
+#define __INT_TO_PTR(P) ((P) + (char *)0)
+#endif
+
+struct _obstack_chunk /* Lives at front of each chunk. */
+{
+ char *limit; /* 1 past end of this chunk */
+ struct _obstack_chunk *prev; /* address of prior chunk or NULL */
+ char contents[4]; /* objects begin here */
+};
+
+struct obstack /* control current object in current chunk */
+{
+ long chunk_size; /* preferred size to allocate chunks in */
+ struct _obstack_chunk* chunk; /* address of current struct obstack_chunk */
+ char *object_base; /* address of object we are building */
+ char *next_free; /* where to add next char to current object */
+ char *chunk_limit; /* address of char after current chunk */
+ int temp; /* Temporary for some macros. */
+ int alignment_mask; /* Mask of alignment for each object. */
+#ifdef __STDC__
+ void *(*chunkfun) (); /* User's fcn to allocate a chunk. */
+#else
+ char *(*chunkfun) (); /* User's fcn to allocate a chunk. */
+#endif
+ void (*freefun) (); /* User's function to free a chunk. */
+};
+
+#ifdef __STDC__
+
+/* Do the function-declarations after the structs
+ but before defining the macros. */
+
+void obstack_init (struct obstack *obstack);
+
+void * obstack_alloc (struct obstack *obstack, int size);
+
+void * obstack_copy (struct obstack *obstack, void *address, int size);
+void * obstack_copy0 (struct obstack *obstack, void *address, int size);
+
+void obstack_free (struct obstack *obstack, void *block);
+
+void obstack_blank (struct obstack *obstack, int size);
+
+void obstack_grow (struct obstack *obstack, void *data, int size);
+void obstack_grow0 (struct obstack *obstack, void *data, int size);
+
+void obstack_1grow (struct obstack *obstack, int data_char);
+void obstack_ptr_grow (struct obstack *obstack, void *data);
+void obstack_int_grow (struct obstack *obstack, int data);
+
+void * obstack_finish (struct obstack *obstack);
+
+int obstack_object_size (struct obstack *obstack);
+
+int obstack_room (struct obstack *obstack);
+void obstack_1grow_fast (struct obstack *obstack, int data_char);
+void obstack_ptr_grow_fast (struct obstack *obstack, void *data);
+void obstack_int_grow_fast (struct obstack *obstack, int data);
+void obstack_blank_fast (struct obstack *obstack, int size);
+
+void * obstack_base (struct obstack *obstack);
+void * obstack_next_free (struct obstack *obstack);
+int obstack_alignment_mask (struct obstack *obstack);
+int obstack_chunk_size (struct obstack *obstack);
+
+#endif /* __STDC__ */
+
+/* Non-ANSI C cannot really support alternative functions for these macros,
+ so we do not declare them. */
+
+/* Pointer to beginning of object being allocated or to be allocated next.
+ Note that this might not be the final address of the object
+ because a new chunk might be needed to hold the final size. */
+
+#define obstack_base(h) ((h)->object_base)
+
+/* Size for allocating ordinary chunks. */
+
+#define obstack_chunk_size(h) ((h)->chunk_size)
+
+/* Pointer to next byte not yet allocated in current chunk. */
+
+#define obstack_next_free(h) ((h)->next_free)
+
+/* Mask specifying low bits that should be clear in address of an object. */
+
+#define obstack_alignment_mask(h) ((h)->alignment_mask)
+
+#define obstack_init(h) \
+ _obstack_begin ((h), 0, 0, obstack_chunk_alloc, obstack_chunk_free)
+
+#define obstack_begin(h, size) \
+ _obstack_begin ((h), (size), 0, obstack_chunk_alloc, obstack_chunk_free)
+
+#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar)
+
+#define obstack_blank_fast(h,n) ((h)->next_free += (n))
+
+#if defined (__GNUC__) && defined (__STDC__)
+
+/* For GNU C, if not -traditional,
+ we can define these macros to compute all args only once
+ without using a global variable.
+ Also, we can avoid using the `temp' slot, to make faster code. */
+
+#define obstack_object_size(OBSTACK) \
+ ({ struct obstack *__o = (OBSTACK); \
+ (unsigned) (__o->next_free - __o->object_base); })
+
+#define obstack_room(OBSTACK) \
+ ({ struct obstack *__o = (OBSTACK); \
+ (unsigned) (__o->chunk_limit - __o->next_free); })
+
+#define obstack_grow(OBSTACK,where,length) \
+({ struct obstack *__o = (OBSTACK); \
+ int __len = (length); \
+ ((__o->next_free + __len > __o->chunk_limit) \
+ ? _obstack_newchunk (__o, __len) : 0); \
+ bcopy (where, __o->next_free, __len); \
+ __o->next_free += __len; \
+ (void) 0; })
+
+#define obstack_grow0(OBSTACK,where,length) \
+({ struct obstack *__o = (OBSTACK); \
+ int __len = (length); \
+ ((__o->next_free + __len + 1 > __o->chunk_limit) \
+ ? _obstack_newchunk (__o, __len + 1) : 0), \
+ bcopy (where, __o->next_free, __len), \
+ __o->next_free += __len, \
+ *(__o->next_free)++ = 0; \
+ (void) 0; })
+
+#define obstack_1grow(OBSTACK,datum) \
+({ struct obstack *__o = (OBSTACK); \
+ ((__o->next_free + 1 > __o->chunk_limit) \
+ ? _obstack_newchunk (__o, 1) : 0), \
+ *(__o->next_free)++ = (datum); \
+ (void) 0; })
+
+/* These assume that the obstack alignment is good enough for pointers or ints,
+ and that the data added so far to the current object
+ shares that much alignment. */
+
+#define obstack_ptr_grow(OBSTACK,datum) \
+({ struct obstack *__o = (OBSTACK); \
+ ((__o->next_free + sizeof (void *) > __o->chunk_limit) \
+ ? _obstack_newchunk (__o, sizeof (void *)) : 0), \
+ *(*(void ***)&__o->next_free)++ = ((void *)datum); \
+ (void) 0; })
+
+#define obstack_int_grow(OBSTACK,datum) \
+({ struct obstack *__o = (OBSTACK); \
+ ((__o->next_free + sizeof (int) > __o->chunk_limit) \
+ ? _obstack_newchunk (__o, sizeof (int)) : 0), \
+ *(*(int **)&__o->next_free)++ = ((int)datum); \
+ (void) 0; })
+
+#define obstack_ptr_grow_fast(h,aptr) (*(*(void ***)&(h)->next_free)++ = (void *)aptr)
+#define obstack_int_grow_fast(h,aint) (*(*(int **)&(h)->next_free)++ = (int)aint)
+
+#define obstack_blank(OBSTACK,length) \
+({ struct obstack *__o = (OBSTACK); \
+ int __len = (length); \
+ ((__o->chunk_limit - __o->next_free < __len) \
+ ? _obstack_newchunk (__o, __len) : 0); \
+ __o->next_free += __len; \
+ (void) 0; })
+
+#define obstack_alloc(OBSTACK,length) \
+({ struct obstack *__h = (OBSTACK); \
+ obstack_blank (__h, (length)); \
+ obstack_finish (__h); })
+
+#define obstack_copy(OBSTACK,where,length) \
+({ struct obstack *__h = (OBSTACK); \
+ obstack_grow (__h, (where), (length)); \
+ obstack_finish (__h); })
+
+#define obstack_copy0(OBSTACK,where,length) \
+({ struct obstack *__h = (OBSTACK); \
+ obstack_grow0 (__h, (where), (length)); \
+ obstack_finish (__h); })
+
+#define obstack_finish(OBSTACK) \
+({ struct obstack *__o = (OBSTACK); \
+ void *value = (void *) __o->object_base; \
+ __o->next_free \
+ = __INT_TO_PTR ((__PTR_TO_INT (__o->next_free)+__o->alignment_mask)\
+ & ~ (__o->alignment_mask)); \
+ ((__o->next_free - (char *)__o->chunk \
+ > __o->chunk_limit - (char *)__o->chunk) \
+ ? (__o->next_free = __o->chunk_limit) : 0); \
+ __o->object_base = __o->next_free; \
+ value; })
+
+#define obstack_free(OBSTACK, OBJ) \
+({ struct obstack *__o = (OBSTACK); \
+ void *__obj = (OBJ); \
+ if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit) \
+ __o->next_free = __o->object_base = __obj; \
+ else (obstack_free) (__o, __obj); })
+
+#else /* not __GNUC__ or not __STDC__ */
+
+#define obstack_object_size(h) \
+ (unsigned) ((h)->next_free - (h)->object_base)
+
+#define obstack_room(h) \
+ (unsigned) ((h)->chunk_limit - (h)->next_free)
+
+#define obstack_grow(h,where,length) \
+( (h)->temp = (length), \
+ (((h)->next_free + (h)->temp > (h)->chunk_limit) \
+ ? _obstack_newchunk ((h), (h)->temp) : 0), \
+ bcopy (where, (h)->next_free, (h)->temp), \
+ (h)->next_free += (h)->temp)
+
+#define obstack_grow0(h,where,length) \
+( (h)->temp = (length), \
+ (((h)->next_free + (h)->temp + 1 > (h)->chunk_limit) \
+ ? _obstack_newchunk ((h), (h)->temp + 1) : 0), \
+ bcopy (where, (h)->next_free, (h)->temp), \
+ (h)->next_free += (h)->temp, \
+ *((h)->next_free)++ = 0)
+
+#define obstack_1grow(h,datum) \
+( (((h)->next_free + 1 > (h)->chunk_limit) \
+ ? _obstack_newchunk ((h), 1) : 0), \
+ *((h)->next_free)++ = (datum))
+
+#define obstack_ptr_grow(h,datum) \
+( (((h)->next_free + sizeof (char *) > (h)->chunk_limit) \
+ ? _obstack_newchunk ((h), sizeof (char *)) : 0), \
+ *(*(char ***)&(h)->next_free)++ = ((char *)datum))
+
+#define obstack_int_grow(h,datum) \
+( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \
+ ? _obstack_newchunk ((h), sizeof (int)) : 0), \
+ *(*(int **)&(h)->next_free)++ = ((int)datum))
+
+#define obstack_ptr_grow_fast(h,aptr) (*(*(char ***)&(h)->next_free)++ = (char *)aptr)
+#define obstack_int_grow_fast(h,aint) (*(*(int **)&(h)->next_free)++ = (int)aint)
+
+#define obstack_blank(h,length) \
+( (h)->temp = (length), \
+ (((h)->chunk_limit - (h)->next_free < (h)->temp) \
+ ? _obstack_newchunk ((h), (h)->temp) : 0), \
+ (h)->next_free += (h)->temp)
+
+#define obstack_alloc(h,length) \
+ (obstack_blank ((h), (length)), obstack_finish ((h)))
+
+#define obstack_copy(h,where,length) \
+ (obstack_grow ((h), (where), (length)), obstack_finish ((h)))
+
+#define obstack_copy0(h,where,length) \
+ (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
+
+#define obstack_finish(h) \
+( (h)->temp = __PTR_TO_INT ((h)->object_base), \
+ (h)->next_free \
+ = __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask) \
+ & ~ ((h)->alignment_mask)), \
+ (((h)->next_free - (char *)(h)->chunk \
+ > (h)->chunk_limit - (char *)(h)->chunk) \
+ ? ((h)->next_free = (h)->chunk_limit) : 0), \
+ (h)->object_base = (h)->next_free, \
+ __INT_TO_PTR ((h)->temp))
+
+#ifdef __STDC__
+#define obstack_free(h,obj) \
+( (h)->temp = (char *)(obj) - (char *) (h)->chunk, \
+ (((h)->temp >= 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
+ ? (int) ((h)->next_free = (h)->object_base \
+ = (h)->temp + (char *) (h)->chunk) \
+ : ((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0)))
+#else
+#define obstack_free(h,obj) \
+( (h)->temp = (char *)(obj) - (char *) (h)->chunk, \
+ (((h)->temp >= 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
+ ? (int) ((h)->next_free = (h)->object_base \
+ = (h)->temp + (char *) (h)->chunk) \
+ : (int) _obstack_free ((h), (h)->temp + (char *) (h)->chunk)))
+#endif
+
+#endif /* not __GNUC__ or not __STDC__ */
+
+/* Declare the external functions we use; they are in obstack.c. */
+
+#ifdef __STDC__
+ extern int _obstack_newchunk (struct obstack *h, int length);
+ extern int _obstack_free (struct obstack *h, void *obj);
+ extern void _obstack_begin (struct obstack *h, int size, int alignment,
+ void *(*chunkfun) (), void (*freefun) ());
+#else
+ extern int _obstack_newchunk ();
+ extern int _obstack_free ();
+ extern void _obstack_begin ();
+#endif
+
+#endif /* not __OBSTACKS__ */
+
diff --git a/include/reloc.h b/include/reloc.h
new file mode 100755
index 0000000..b8e46a5
--- /dev/null
+++ b/include/reloc.h
@@ -0,0 +1,38 @@
+/* Relocation types for a.out files using reloc_info_extended
+ (SPARC and AMD 29000). */
+
+#ifndef _RELOC_H_READ_
+#define _RELOC_H_READ_ 1
+
+enum reloc_type
+{
+ RELOC_8, RELOC_16, RELOC_32, /* simple relocations */
+ RELOC_DISP8, RELOC_DISP16, RELOC_DISP32, /* pc-rel displacement */
+ RELOC_WDISP30, RELOC_WDISP22,
+ RELOC_HI22, RELOC_22,
+ RELOC_13, RELOC_LO10,
+ RELOC_SFA_BASE, RELOC_SFA_OFF13,
+ RELOC_BASE10, RELOC_BASE13, RELOC_BASE22, /* P.I.C. (base-relative) */
+ RELOC_PC10, RELOC_PC22, /* for some sort of pc-rel P.I.C. (?) */
+ RELOC_JMP_TBL, /* P.I.C. jump table */
+ RELOC_SEGOFF16, /* reputedly for shared libraries somehow */
+ RELOC_GLOB_DAT, RELOC_JMP_SLOT, RELOC_RELATIVE,
+
+/* 29K relocation types */
+ RELOC_JUMPTARG, RELOC_CONST, RELOC_CONSTH,
+
+ NO_RELOC
+};
+
+#define RELOC_TYPE_NAMES \
+"8", "16", "32", "DISP8", \
+"DISP16", "DISP32", "WDISP30", "WDISP22", \
+"HI22", "22", "13", "LO10", \
+"SFA_BASE", "SFAOFF13", "BASE10", "BASE13", \
+"BASE22", "PC10", "PC22", "JMP_TBL", \
+"SEGOFF16", "GLOB_DAT", "JMP_SLOT", "RELATIVE", \
+"JUMPTARG", "CONST", "CONSTH", \
+"NO_RELOC", \
+"XXX_28", "XXX_29", "XXX_30", "XXX_31"
+
+#endif /* _RELOC_H_READ_ */
diff --git a/include/sysdep.h b/include/sysdep.h
new file mode 100755
index 0000000..25996d81
--- /dev/null
+++ b/include/sysdep.h
@@ -0,0 +1,110 @@
+/* Copyright (C) 1990, 1991 Free Software Foundation, Inc.
+
+This file is part of BFD, the Binary File Diddler.
+
+BFD 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 1, or (at your option)
+any later version.
+
+BFD 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 BFD; see the file COPYING. If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* $Id$ */
+
+/* All the system include files boiled into one place.
+
+ One day, everyone will have the same set of include files..
+
+ This is ugly, but if you can think of a better way of doing this,
+ tell me. steve@cygnus.com
+
+*/
+
+
+
+#ifndef _SYSDEP_H
+#define _SYSDEP_H
+
+/*
+ The including makefile must define HOST_SYS to be one of these.
+ Each combination of Machine and OS (and maybe OS Version) must
+ have a different number.
+ */
+
+#define SUN4_SYS 2
+#define POSIX_SYS 3
+#define AIX_SYS 4
+#define VAX_ULTRIX_SYS 5
+#define i386_SYSV_SYS 6
+#define SUN3_SYS 7
+#define UNKNOWN_SYS 8
+#define DGUX_SYS 9
+#define DEC3100_SYS 10
+#define HP9000_SYS 11
+
+#include <ansidecl.h>
+
+#if __STDC__
+#define PROTO(type, name, arglist) type name arglist
+#else
+#define PROTO(type, name, arglist) type name ()
+#define NO_STDARG
+#endif
+
+#ifndef HOST_SYS
+#define HOST_SYS = Hey_you_HOST_SYS_has_not_been_defined.
+#endif
+
+#if HOST_SYS==SUN4_SYS
+#define HOST_IS_SUN4 1
+#include <sys/h-sun4.h>
+#endif
+
+#if HOST_SYS==DGUX_SYS
+#include <sys/h-dgux.h>
+#endif
+
+#if HOST_SYS==POSIX_SYS
+#define HOST_IS_POSIX 1
+#endif
+
+#if HOST_SYS==AIX_SYS
+#define HOST_IS_AIX 1
+#include <sys/h-rs6000.h>
+#endif
+
+#if HOST_SYS==VAX_ULTRIX_SYS
+#define HOST_IS_VAX_ULTRIX 1
+#include <sys/h-vaxult.h>
+#endif
+
+#if HOST_SYS==i386_SYSV_SYS
+#define HOST_IS_i386_SYSV 1
+#define USG
+#include <sys/h-i386v.h>
+#endif
+
+#if HOST_SYS==SUN3_SYS
+#define HOST_IS_SUN3 1
+#include <sys/h-sun3.h>
+#endif
+
+#if HOST_SYS==DEC3100_SYS
+#define HOST_IS_DEC3100 1
+#include <sys/h-dec3100.h>
+#endif
+
+#if HOST_SYS==HP9000_SYS
+#define HOST_IS_HP9000 1
+#define USG
+#include <sys/h-hp9000.h>
+#endif
+
+#endif