diff options
Diffstat (limited to 'gas/config/obj-bout.h')
-rw-r--r-- | gas/config/obj-bout.h | 288 |
1 files changed, 137 insertions, 151 deletions
diff --git a/gas/config/obj-bout.h b/gas/config/obj-bout.h index 278fcc4..f51b878 100644 --- a/gas/config/obj-bout.h +++ b/gas/config/obj-bout.h @@ -19,42 +19,40 @@ to the Free Software Foundation, 59 Temple Place - Suite 330, Cambridge, MA 02139, USA. */ -/* - * This file is a modified version of 'a.out.h'. It is to be used in all GNU - * tools modified to support the i80960 b.out format (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. - */ +/* This file is a modified version of 'a.out.h'. It is to be used in all GNU + tools modified to support the i80960 b.out format (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 OBJ_BOUT 1 @@ -69,46 +67,44 @@ extern const segT N_TYPE_seg[]; #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 */ + 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. */ #ifndef DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE -#define DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE (BMAGIC) -#endif /* DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE */ - -/* 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). - */ +#define DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE BMAGIC +#endif + +/* 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 a_relaxable; /* Contains enough info to relax */ - }; +{ + /* 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 a_relaxable; /* Contains enough info to relax. */ +}; #define EXEC_BYTES_SIZE (10 * 4 + 4 * 1) -#define N_BADMAG(x) (((x).a_magic)!=BMAGIC) +#define N_BADMAG(x) (((x).a_magic) != BMAGIC) #define N_TXTOFF(x) EXEC_BYTES_SIZE #define N_DATOFF(x) ( N_TXTOFF(x) + (x).a_text ) #define N_TROFF(x) ( N_DATOFF(x) + (x).a_data ) @@ -116,72 +112,66 @@ struct exec #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 - */ +/* A single entry in the symbol table. */ struct nlist { union { char *n_name; struct nlist *n_next; - long n_strx; /* Index into string table */ + long n_strx; /* Index into string table. */ } n_un; - unsigned char n_type; /* See below */ - char n_other; /* Used in i80960 support -- see below */ + unsigned char n_type; /* See below. */ + char n_other; /* Used in i80960 support -- see below. */ short n_desc; unsigned long n_value; }; typedef struct nlist obj_symbol_type; -/* 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 */ +/* 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 */ +#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. */ #ifndef CUSTOM_RELOC_FORMAT struct relocation_info { - int r_address; /* File address of item to be relocated */ + int r_address; /* File address of item to be relocated. */ unsigned - r_index:24, /* Index of symbol on which relocation is based*/ + r_index:24, /* Index of symbol 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. - */ + 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 */ + 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. */ }; #endif /* CUSTOM_RELOC_FORMAT */ -/* - * Macros to extract information from a symbol table entry. - * This syntactic indirection allows independence regarding a.out or coff. - * The argument (s) of all these macros is a pointer to a symbol table entry. - */ +/* Macros to extract information from a symbol table entry. + This syntactic indirection allows independence regarding a.out or coff. + The argument (s) of all these macros is a pointer to a symbol table entry. */ -/* Predicates */ -/* True if the symbol is external */ +/* Predicates. */ +/* True if the symbol is external. */ #define S_IS_EXTERNAL(s) ((s)->sy_symbol.n_type & N_EXT) -/* True if symbol has been defined, ie is in N_{TEXT,DATA,BSS,ABS} or N_EXT */ +/* True if symbol has been defined, ie is in N_{TEXT,DATA,BSS,ABS} or N_EXT. */ #define S_IS_DEFINED(s) ((S_GET_TYPE(s) != N_UNDF) || (S_GET_DESC(s) != 0)) /* Return true for symbols that should not be reduced to section @@ -195,9 +185,9 @@ struct relocation_info #define S_IS_REGISTER(s) ((s)->sy_symbol.n_type == N_REGISTER) -/* True if a debug special symbol entry */ +/* True if a debug special symbol entry. */ #define S_IS_DEBUG(s) ((s)->sy_symbol.n_type & N_STAB) -/* True if a symbol is local symbol name */ +/* True if a symbol is local symbol name. */ #define S_IS_LOCAL(s) \ ((S_GET_NAME (s) \ && !S_IS_DEBUG (s) \ @@ -207,52 +197,53 @@ struct relocation_info || (flag_strip_local_absolute \ && !S_IS_EXTERNAL(s) \ && S_GET_SEGMENT(s) == absolute_section)) -/* True if a symbol is not defined in this file */ +/* True if a symbol is not defined in this file. */ #define S_IS_EXTERN(s) ((s)->sy_symbol.n_type & N_EXT) -/* True if the symbol has been generated because of a .stabd directive */ +/* True if the symbol has been generated because of a .stabd directive. */ #define S_IS_STABD(s) (S_GET_NAME(s) == NULL) -/* Accessors */ -/* The name of the symbol */ +/* Accessors. */ +/* The name of the symbol. */ #define S_GET_NAME(s) ((s)->sy_symbol.n_un.n_name) -/* The pointer to the string table */ +/* The pointer to the string table. */ #define S_GET_OFFSET(s) ((s)->sy_symbol.n_un.n_strx) -/* The type of the symbol */ +/* The type of the symbol. */ #define S_GET_TYPE(s) ((s)->sy_symbol.n_type & N_TYPE) -/* The numeric value of the segment */ +/* The numeric value of the segment. */ #define S_GET_SEGMENT(s) (N_TYPE_seg[S_GET_TYPE(s)]) -/* The n_other expression value */ +/* The n_other expression value. */ #define S_GET_OTHER(s) ((s)->sy_symbol.n_other) -/* The n_desc expression value */ +/* The n_desc expression value. */ #define S_GET_DESC(s) ((s)->sy_symbol.n_desc) -/* Modifiers */ -/* Assume that a symbol cannot be simultaneously in more than on segment */ -/* set segment */ -#define S_SET_SEGMENT(s,seg) ((s)->sy_symbol.n_type &= ~N_TYPE,(s)->sy_symbol.n_type|=SEGMENT_TO_SYMBOL_TYPE(seg)) -/* The symbol is external */ +/* Modifiers. */ +/* Assume that a symbol cannot be simultaneously in more than on segment. */ +/* Set segment. */ +#define S_SET_SEGMENT(s,seg) ((s)->sy_symbol.n_type &= ~N_TYPE,(s)->sy_symbol.n_type |= SEGMENT_TO_SYMBOL_TYPE (seg)) +/* The symbol is external. */ #define S_SET_EXTERNAL(s) ((s)->sy_symbol.n_type |= N_EXT) -/* The symbol is not external */ +/* The symbol is not external. */ #define S_CLEAR_EXTERNAL(s) ((s)->sy_symbol.n_type &= ~N_EXT) -/* Set the name of the symbol */ +/* Set the name of the symbol. */ #define S_SET_NAME(s,v) ((s)->sy_symbol.n_un.n_name = (v)) -/* Set the offset in the string table */ +/* Set the offset in the string table. */ #define S_SET_OFFSET(s,v) ((s)->sy_symbol.n_un.n_strx = (v)) -/* Set the n_other expression value */ +/* Set the n_other expression value. */ #define S_SET_OTHER(s,v) ((s)->sy_symbol.n_other = (v)) -/* Set the n_desc expression value */ +/* Set the n_desc expression value. */ #define S_SET_DESC(s,v) ((s)->sy_symbol.n_desc = (v)) -/* Set the n_type value */ +/* Set the n_type value. */ #define S_SET_TYPE(s,v) ((s)->sy_symbol.n_type = (v)) -/* File header macro and type definition */ +/* File header macro and type definition. */ -#define H_GET_FILE_SIZE(h) (EXEC_BYTES_SIZE + \ - H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \ - H_GET_SYMBOL_TABLE_SIZE(h) + \ - H_GET_TEXT_RELOCATION_SIZE(h) + \ - H_GET_DATA_RELOCATION_SIZE(h) + \ - (h)->string_table_size) +#define H_GET_FILE_SIZE(h) (EXEC_BYTES_SIZE \ + + H_GET_TEXT_SIZE (h) \ + + H_GET_DATA_SIZE(h) \ + + H_GET_SYMBOL_TABLE_SIZE (h) \ + + H_GET_TEXT_RELOCATION_SIZE (h) \ + + H_GET_DATA_RELOCATION_SIZE (h) \ + + (h)->string_table_size) #define H_GET_HEADER_SIZE(h) EXEC_BYTES_SIZE #define H_GET_TEXT_SIZE(h) ((h)->header.a_text) @@ -268,10 +259,10 @@ struct relocation_info #ifdef EXEC_MACHINE_TYPE #define H_GET_MACHINE_TYPE(h) ((h)->header.a_machtype) -#endif /* EXEC_MACHINE_TYPE */ +#endif /* EXEC_MACHINE_TYPE. */ #ifdef EXEC_VERSION #define H_GET_VERSION(h) ((h)->header.a_version) -#endif /* EXEC_VERSION */ +#endif /* EXEC_VERSION. */ #define H_SET_TEXT_SIZE(h,v) ((h)->header.a_text = (v)) #define H_SET_DATA_SIZE(h,v) ((h)->header.a_data = (v)) @@ -290,20 +281,20 @@ struct relocation_info #define H_SET_STRING_SIZE(h,v) ((h)->string_table_size = (v)) #ifdef EXEC_MACHINE_TYPE #define H_SET_MACHINE_TYPE(h,v) ((h)->header.a_machtype = (v)) -#endif /* EXEC_MACHINE_TYPE */ +#endif /* EXEC_MACHINE_TYPE. */ #ifdef EXEC_VERSION #define H_SET_VERSION(h,v) ((h)->header.a_version = (v)) -#endif /* EXEC_VERSION */ +#endif /* EXEC_VERSION. */ typedef struct { - struct exec header; /* a.out header */ - long string_table_size; /* names + '\0' + sizeof (int) */ + struct exec header; /* a.out header. */ + long string_table_size; /* names + '\0' + sizeof (int). */ } object_headers; -/* unused hooks. */ +/* Unused hooks. */ #define OBJ_EMIT_LINENO(a, b, c) {;} #define obj_pre_write_hook(a) {;} @@ -313,14 +304,9 @@ object_headers; #define host_number_to_chars number_to_chars_littleendian #endif -#if __STDC__ struct fix; -#endif -extern void tc_aout_fix_to_chars PARAMS ((char *where, - struct fix *fixP, - relax_addressT segment_address)); -extern void tc_bout_fix_to_chars PARAMS ((char *where, - struct fix *fixP, - relax_addressT segment_address)); + +extern void tc_aout_fix_to_chars (char *, struct fix *, relax_addressT); +extern void tc_bout_fix_to_chars (char *, struct fix *, relax_addressT); #define AOUT_STABS |