Initial revision

This commit is contained in:
John Gilmore 1991-04-25 04:20:11 +00:00
parent a6ac0c5998
commit a07cc61341
13 changed files with 2903 additions and 0 deletions

19
include/a.out.sun4.h Executable file
View File

@ -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 )

20
include/a.out.vax.h Executable file
View File

@ -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 )

24
include/ar.h Executable file
View File

@ -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__ */

296
include/bcs88kcoff.h Executable file
View File

@ -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 */

855
include/bfd.h Normal file
View File

@ -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__ */

168
include/bout.h Normal file
View File

@ -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 */
};

414
include/coff-i960.h Executable file
View File

@ -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

298
include/coff-m88k.h Executable file
View File

@ -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 */

128
include/ieee.h Normal file
View File

@ -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

117
include/oasys.h Normal file
View File

@ -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;

416
include/obstack.h Normal file
View File

@ -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__ */

38
include/reloc.h Executable file
View File

@ -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_ */

110
include/sysdep.h Executable file
View File

@ -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