X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=gcc%2Fmips-tfile.c;h=e71c9eea3b0b5288871db114a037d8c758fd390e;hb=6fed43773c9b0ce596dca5686f37ac3fc0fa11c0;hp=e354c9108f0bb127ef94e53393cb0501e8ac0f08;hpb=27b11d56b743098deb193d510b337ba22dc52e5c;p=msp430-gcc.git diff --git a/gcc/mips-tfile.c b/gcc/mips-tfile.c index e354c910..e71c9eea 100644 --- a/gcc/mips-tfile.c +++ b/gcc/mips-tfile.c @@ -2,15 +2,16 @@ contain debugging information specified by the GNU compiler in the form of comments (the mips assembler does not support assembly access to debug information). - Copyright (C) 1991, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2001 + Copyright (C) 1991, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2001, + 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Contributed by Michael Meissner (meissner@cygnus.com). - + This file is part of GCC. GCC 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 2, or (at your option) any later +Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY @@ -19,9 +20,8 @@ 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 GCC; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ +along with GCC; see the file COPYING3. If not see +. */ /* Here is a brief description of the MIPS ECOFF symbol table. The @@ -57,7 +57,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA The auxiliary table is a series of 32 bit integers, that are referenced as needed from the local symbol table. Unlike standard - COFF, the aux. information does not follow the symbol that uses + COFF, the aux. information does not follow the symbol that uses it, but rather is a separate table. In theory, this would allow the MIPS compilers to collapse duplicate aux. entries, but I've not noticed this happening with the 1.31 compiler suite. The different @@ -98,31 +98,31 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA array, pointer, function, etc. qualifiers. The current base types that I have documentation for are: - btNil -- undefined + btNil -- undefined btAdr -- address - integer same size as ptr - btChar -- character - btUChar -- unsigned character - btShort -- short - btUShort -- unsigned short - btInt -- int - btUInt -- unsigned int - btLong -- long - btULong -- unsigned long - btFloat -- float (real) - btDouble -- Double (real) - btStruct -- Structure (Record) - btUnion -- Union (variant) - btEnum -- Enumerated - btTypedef -- defined via a typedef isymRef - btRange -- subrange of int - btSet -- pascal sets - btComplex -- fortran complex - btDComplex -- fortran double complex - btIndirect -- forward or unnamed typedef - btFixedDec -- Fixed Decimal - btFloatDec -- Float Decimal - btString -- Varying Length Character String - btBit -- Aligned Bit String + btChar -- character + btUChar -- unsigned character + btShort -- short + btUShort -- unsigned short + btInt -- int + btUInt -- unsigned int + btLong -- long + btULong -- unsigned long + btFloat -- float (real) + btDouble -- Double (real) + btStruct -- Structure (Record) + btUnion -- Union (variant) + btEnum -- Enumerated + btTypedef -- defined via a typedef isymRef + btRange -- subrange of int + btSet -- pascal sets + btComplex -- fortran complex + btDComplex -- fortran double complex + btIndirect -- forward or unnamed typedef + btFixedDec -- Fixed Decimal + btFloatDec -- Float Decimal + btString -- Varying Length Character String + btBit -- Aligned Bit String btPicture -- Picture btVoid -- Void (MIPS cc revision >= 2.00) @@ -130,12 +130,12 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA current type qualifier fields I have documentation for are: - tqNil -- no more qualifiers - tqPtr -- pointer - tqProc -- procedure - tqArray -- array - tqFar -- 8086 far pointers - tqVol -- volatile + tqNil -- no more qualifiers + tqPtr -- pointer + tqProc -- procedure + tqArray -- array + tqFar -- 8086 far pointers + tqVol -- volatile The dense number table is used in the front ends, and disappears by @@ -163,7 +163,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA Each file table has offsets for where the line numbers, local strings, local symbols, and procedure table starts from within the - global tables, and the indexs are reset to 0 for each of those + global tables, and the indices are reset to 0 for each of those tables for the file. The procedure table contains the binary equivalents of the .ent @@ -244,7 +244,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA } Mips-tdump produces the following information: - + Global file header: magic number 0x162 # sections 2 @@ -253,12 +253,12 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA symbolic header size 96 optional header 56 flags 0x0 - + Symbolic header, magic number = 0x7009, vstamp = 1.31: - + Info Offset Number Bytes ==== ====== ====== ===== - + Line numbers 380 4 4 [13] Dense numbers 0 0 0 Procedures Tables 384 1 52 @@ -270,14 +270,14 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA File Tables 1008 2 144 Relative Files 0 0 0 External Symbols 1152 20 320 - + File #0, "hello2.c" - + Name index = 1 Readin = No Merge = No Endian = LITTLE Debug level = G2 Language = C Adr = 0x00000000 - + Info Start Number Size Offset ==== ===== ====== ==== ====== Local strings 0 15 15 784 @@ -287,7 +287,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA Procedures 0 1 52 384 Auxiliary symbols 0 14 56 628 Relative Files 0 0 0 0 - + There are 6 local symbols, starting at 436 Symbol# 0: "hello2.c" @@ -602,6 +602,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "config.h" #include "system.h" +#include "coretypes.h" +#include "tm.h" #include "version.h" #include "intl.h" @@ -609,6 +611,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #define saber_stop() #endif +/* Include getopt.h for the sake of getopt_long. */ +#include "getopt.h" + #ifndef __LINE__ #define __LINE__ 0 #endif @@ -631,13 +636,11 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA /* The following might be called from obstack or malloc, so they can't be static. */ -extern void pfatal_with_name - PARAMS ((const char *)) ATTRIBUTE_NORETURN; -extern void fancy_abort PARAMS ((void)) ATTRIBUTE_NORETURN; - void botch PARAMS ((const char *)) ATTRIBUTE_NORETURN; +extern void pfatal_with_name (const char *) ATTRIBUTE_NORETURN; +extern void botch (const char *) ATTRIBUTE_NORETURN; -extern void fatal PARAMS ((const char *format, ...)) ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN; -extern void error PARAMS ((const char *format, ...)) ATTRIBUTE_PRINTF_1; +extern void fatal (const char *format, ...) ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN; +extern void error (const char *format, ...) ATTRIBUTE_PRINTF_1; #ifndef MIPS_DEBUGGING_INFO @@ -649,7 +652,7 @@ static const char *progname; static const char *input_name; int -main () +main (void) { fprintf (stderr, "Mips-tfile should only be run on a MIPS computer!\n"); exit (1); @@ -664,11 +667,11 @@ main () #include -#ifndef CROSS_COMPILE +#ifndef CROSS_DIRECTORY_STRUCTURE #include #else #include "mips/a.out.h" -#endif /* CROSS_COMPILE */ +#endif /* CROSS_DIRECTORY_STRUCTURE */ #include "gstab.h" @@ -734,7 +737,7 @@ typedef enum st { st_StaticProc = stStaticProc, /* load time only static procs */ st_Constant = stConstant, /* const */ st_Str = stStr, /* string */ - st_Number = stNumber, /* pure number (ie. 4 NOR 2+2) */ + st_Number = stNumber, /* pure number (i.e. 4 NOR 2+2) */ st_Expr = stExpr, /* 2+2 vs. 4 */ st_Type = stType, /* post-coercion SER */ st_Max = stMax /* max type+1 */ @@ -893,13 +896,10 @@ enum alloc_type { pages. On systems with a BSD malloc that define USE_MALLOC, the MAX_CLUSTER_PAGES should be 1 less than a power of two, since malloc adds its overhead, and rounds up to the next power of 2. Pages are - linked together via a linked list. - - If PAGE_SIZE is > 4096, the string length in the shash_t structure - can't be represented (assuming there are strings > 4096 bytes). */ + linked together via a linked list. */ #ifndef PAGE_SIZE -#define PAGE_SIZE 4096 /* size of varray pages */ +#define PAGE_SIZE 32768 /* size of varray pages */ #endif #define PAGE_USIZE ((Size_t) PAGE_SIZE) @@ -948,6 +948,13 @@ typedef struct varray { OBJECTS_PER_PAGE (type), /* objects_last_page */ \ } +#define INITIALIZE_VARRAY(x,type) \ +do { \ + (x)->object_size = sizeof (type); \ + (x)->objects_per_page = OBJECTS_PER_PAGE (type); \ + (x)->objects_last_page = OBJECTS_PER_PAGE (type); \ +} while (0) + /* Master type for indexes within the symbol table. */ typedef unsigned long symint_t; @@ -1064,90 +1071,8 @@ typedef struct efdr { } efdr_t; /* Pre-initialized extended file structure. */ -static efdr_t init_file = -{ - { /* FDR structure */ -#ifdef __alpha - 0, /* adr: memory address of beginning of file */ - 0, /* cbLineOffset: byte offset from header for this file ln's */ - 0, /* cbLine: size of lines for this file */ - 0, /* cbSs: number of bytes in the ss */ - 0, /* rss: file name (of source, if known) */ - 0, /* issBase: file's string space */ - 0, /* isymBase: beginning of symbols */ - 0, /* csym: count file's of symbols */ - 0, /* ilineBase: file's line symbols */ - 0, /* cline: count of file's line symbols */ - 0, /* ioptBase: file's optimization entries */ - 0, /* copt: count of file's optimization entries */ - 0, /* ipdFirst: start of procedures for this file */ - 0, /* cpd: count of procedures for this file */ - 0, /* iauxBase: file's auxiliary entries */ - 0, /* caux: count of file's auxiliary entries */ - 0, /* rfdBase: index into the file indirect table */ - 0, /* crfd: count file indirect entries */ - langC, /* lang: language for this file */ - 1, /* fMerge: whether this file can be merged */ - 0, /* fReadin: true if read in (not just created) */ -#ifdef HOST_WORDS_BIG_ENDIAN - 1, /* fBigendian: if 1, compiled on big endian machine */ -#else - 0, /* fBigendian: if 1, compiled on big endian machine */ -#endif - 0, /* fTrim: whether the symbol table was trimmed */ - GLEVEL_2, /* glevel: level this file was compiled with */ - 0, /* reserved: reserved for future use */ -#else - 0, /* adr: memory address of beginning of file */ - 0, /* rss: file name (of source, if known) */ - 0, /* issBase: file's string space */ - 0, /* cbSs: number of bytes in the ss */ - 0, /* isymBase: beginning of symbols */ - 0, /* csym: count file's of symbols */ - 0, /* ilineBase: file's line symbols */ - 0, /* cline: count of file's line symbols */ - 0, /* ioptBase: file's optimization entries */ - 0, /* copt: count of file's optimization entries */ - 0, /* ipdFirst: start of procedures for this file */ - 0, /* cpd: count of procedures for this file */ - 0, /* iauxBase: file's auxiliary entries */ - 0, /* caux: count of file's auxiliary entries */ - 0, /* rfdBase: index into the file indirect table */ - 0, /* crfd: count file indirect entries */ - langC, /* lang: language for this file */ - 1, /* fMerge: whether this file can be merged */ - 0, /* fReadin: true if read in (not just created) */ -#ifdef HOST_WORDS_BIG_ENDIAN - 1, /* fBigendian: if 1, compiled on big endian machine */ -#else - 0, /* fBigendian: if 1, compiled on big endian machine */ -#endif - GLEVEL_2, /* glevel: level this file was compiled with */ - 0, /* reserved: reserved for future use */ - 0, /* cbLineOffset: byte offset from header for this file ln's */ - 0, /* cbLine: size of lines for this file */ -#endif - }, - - (FDR *) 0, /* orig_fdr: original file header pointer */ - (char *) 0, /* name: pointer to filename */ - 0, /* name_len: length of filename */ - 0, /* void_type: ptr to aux node for void type */ - 0, /* int_type: ptr to aux node for int type */ - (scope_t *) 0, /* cur_scope: current scope being processed */ - 0, /* file_index: current file # */ - 0, /* nested_scopes: # nested scopes */ - INIT_VARRAY (char), /* strings: local string varray */ - INIT_VARRAY (SYMR), /* symbols: local symbols varray */ - INIT_VARRAY (PDR), /* procs: procedure varray */ - INIT_VARRAY (AUXU), /* aux_syms: auxiliary symbols varray */ - - (struct efdr *) 0, /* next_file: next file structure */ - - (shash_t **) 0, /* shash_head: string hash table */ - { 0 }, /* thash_head: type hash table */ -}; - +static int init_file_initialized = 0; +static efdr_t init_file; static efdr_t *first_file; /* first file descriptor */ static efdr_t **last_file_ptr = &first_file; /* file descriptor tail */ @@ -1568,8 +1493,8 @@ static SYMR *cur_oproc_begin = (SYMR *) 0; /* original proc. sym begin info * static SYMR *cur_oproc_end = (SYMR *) 0; /* original proc. sym end info */ static PDR *cur_oproc_ptr = (PDR *) 0; /* current original procedure*/ static thead_t *cur_tag_head = (thead_t *) 0;/* current tag head */ -static long file_offset = 0; /* current file offset */ -static long max_file_offset = 0; /* maximum file offset */ +static unsigned long file_offset = 0; /* current file offset */ +static unsigned long max_file_offset = 0; /* maximum file offset */ static FILE *object_stream = (FILE *) 0; /* file desc. to output .o */ static FILE *obj_in_stream = (FILE *) 0; /* file desc. to input .o */ static char *progname = (char *) 0; /* program name for errors */ @@ -1581,8 +1506,9 @@ static char *cur_line_ptr = (char *) 0; /* ptr within current line */ static unsigned cur_line_nbytes = 0; /* # bytes for current line */ static unsigned cur_line_alloc = 0; /* # bytes total in buffer */ static long line_number = 0; /* current input line number */ -static int debug = 0; /* trace functions */ -static int version = 0; /* print version # */ +static int debug = 0; /* trace functions */ +static int version = 0; /* print version # */ +static int verbose = 0; static int had_errors = 0; /* != 0 if errors were found */ static int rename_output = 0; /* != 0 if rename output file*/ static int delete_input = 0; /* != 0 if delete input after done */ @@ -1603,107 +1529,64 @@ static const char stabs_symbol[] = STABS_SYMBOL; #define STATIC static #endif -STATIC int out_of_bounds PARAMS ((symint_t, symint_t, const char *, int)); - -STATIC shash_t *hash_string PARAMS ((const char *, - Ptrdiff_t, - shash_t **, - symint_t *)); - -STATIC symint_t add_string PARAMS ((varray_t *, - shash_t **, - const char *, - const char *, - shash_t **)); - -STATIC symint_t add_local_symbol - PARAMS ((const char *, - const char *, - st_t, - sc_t, - symint_t, - symint_t)); - -STATIC symint_t add_ext_symbol PARAMS ((EXTR *, - int)); - -STATIC symint_t add_aux_sym_symint - PARAMS ((symint_t)); - -STATIC symint_t add_aux_sym_rndx - PARAMS ((int, symint_t)); - -STATIC symint_t add_aux_sym_tir PARAMS ((type_info_t *, - hash_state_t, - thash_t **)); - -STATIC tag_t * get_tag PARAMS ((const char *, - const char *, - symint_t, - bt_t)); - -STATIC void add_unknown_tag PARAMS ((tag_t *)); - -STATIC void add_procedure PARAMS ((const char *, - const char *)); - -STATIC void add_file PARAMS ((const char *, - const char *)); - -STATIC void add_bytes PARAMS ((varray_t *, - char *, - Size_t)); - -STATIC void add_varray_page PARAMS ((varray_t *)); - -STATIC void update_headers PARAMS ((void)); - -STATIC void write_varray PARAMS ((varray_t *, off_t, const char *)); -STATIC void write_object PARAMS ((void)); -STATIC const char *st_to_string PARAMS ((st_t)); -STATIC const char *sc_to_string PARAMS ((sc_t)); -STATIC char *read_line PARAMS ((void)); -STATIC void parse_input PARAMS ((void)); -STATIC void mark_stabs PARAMS ((const char *)); -STATIC void parse_begin PARAMS ((const char *)); -STATIC void parse_bend PARAMS ((const char *)); -STATIC void parse_def PARAMS ((const char *)); -STATIC void parse_end PARAMS ((const char *)); -STATIC void parse_ent PARAMS ((const char *)); -STATIC void parse_file PARAMS ((const char *)); -STATIC void parse_stabs_common - PARAMS ((const char *, const char *, const char *)); -STATIC void parse_stabs PARAMS ((const char *)); -STATIC void parse_stabn PARAMS ((const char *)); -STATIC page_t *read_seek PARAMS ((Size_t, off_t, const char *)); -STATIC void copy_object PARAMS ((void)); - -STATIC void catch_signal PARAMS ((int)) ATTRIBUTE_NORETURN; -STATIC page_t *allocate_page PARAMS ((void)); - -STATIC page_t *allocate_multiple_pages - PARAMS ((Size_t)); - -STATIC void free_multiple_pages - PARAMS ((page_t *, Size_t)); +STATIC int out_of_bounds (symint_t, symint_t, const char *, int); +STATIC shash_t *hash_string (const char *, Ptrdiff_t, shash_t **, symint_t *); +STATIC symint_t add_string (varray_t *, shash_t **, const char *, const char *, + shash_t **); +STATIC symint_t add_local_symbol (const char *, const char *, st_t, sc_t, + symint_t, symint_t); +STATIC symint_t add_ext_symbol (EXTR *, int); +STATIC symint_t add_aux_sym_symint (symint_t); +STATIC symint_t add_aux_sym_rndx (int, symint_t); +STATIC symint_t add_aux_sym_tir (type_info_t *, hash_state_t, thash_t **); +STATIC tag_t * get_tag (const char *, const char *, symint_t, bt_t); +STATIC void add_unknown_tag (tag_t *); +STATIC void add_procedure (const char *, const char *); +STATIC void initialize_init_file (void); +STATIC void add_file (const char *, const char *); +STATIC void add_bytes (varray_t *, char *, Size_t); +STATIC void add_varray_page (varray_t *); +STATIC void update_headers (void); +STATIC void write_varray (varray_t *, off_t, const char *); +STATIC void write_object (void); +STATIC const char *st_to_string (st_t); +STATIC const char *sc_to_string (sc_t); +STATIC char *read_line (void); +STATIC void parse_input (void); +STATIC void mark_stabs (const char *); +STATIC void parse_begin (const char *); +STATIC void parse_bend (const char *); +STATIC void parse_def (const char *); +STATIC void parse_end (const char *); +STATIC void parse_ent (const char *); +STATIC void parse_file (const char *); +STATIC void parse_stabs_common (const char *, const char *, const char *); +STATIC void parse_stabs (const char *); +STATIC void parse_stabn (const char *); +STATIC page_t *read_seek (Size_t, off_t, const char *); +STATIC void copy_object (void); + +STATIC void catch_signal (int) ATTRIBUTE_NORETURN; +STATIC page_t *allocate_page (void); +STATIC page_t *allocate_multiple_pages (Size_t); +STATIC void free_multiple_pages (page_t *, Size_t); #ifndef MALLOC_CHECK -STATIC page_t *allocate_cluster - PARAMS ((Size_t)); +STATIC page_t *allocate_cluster (Size_t); #endif -STATIC forward_t *allocate_forward PARAMS ((void)); -STATIC scope_t *allocate_scope PARAMS ((void)); -STATIC shash_t *allocate_shash PARAMS ((void)); -STATIC tag_t *allocate_tag PARAMS ((void)); -STATIC thash_t *allocate_thash PARAMS ((void)); -STATIC thead_t *allocate_thead PARAMS ((void)); -STATIC vlinks_t *allocate_vlinks PARAMS ((void)); +STATIC forward_t *allocate_forward (void); +STATIC scope_t *allocate_scope (void); +STATIC shash_t *allocate_shash (void); +STATIC tag_t *allocate_tag (void); +STATIC thash_t *allocate_thash (void); +STATIC thead_t *allocate_thead (void); +STATIC vlinks_t *allocate_vlinks (void); -STATIC void free_forward PARAMS ((forward_t *)); -STATIC void free_scope PARAMS ((scope_t *)); -STATIC void free_tag PARAMS ((tag_t *)); -STATIC void free_thead PARAMS ((thead_t *)); +STATIC void free_forward (forward_t *); +STATIC void free_scope (scope_t *); +STATIC void free_tag (tag_t *); +STATIC void free_thead (thead_t *); extern char *optarg; extern int optind; @@ -1717,7 +1600,7 @@ extern int opterr; typedef struct _pseudo_ops { const char *const name; /* pseudo-op in ascii */ const int len; /* length of name to compare */ - void (*const func) PARAMS ((const char *)); /* function to handle line */ + void (*const func) (const char *); /* function to handle line */ } pseudo_ops_t; static const pseudo_ops_t pseudo_ops[] = { @@ -1734,18 +1617,26 @@ static const pseudo_ops_t pseudo_ops[] = { { "#@stabs", sizeof("#@stabs")-1, mark_stabs }, }; + +/* Command line options for getopt_long. */ + +static const struct option options[] = +{ + { "version", 0, 0, 'V' }, + { "verbose", 0, 0, 'v' }, + { 0, 0, 0, 0 } +}; /* Add a page to a varray object. */ STATIC void -add_varray_page (vp) - varray_t *vp; /* varray to add page to */ +add_varray_page (varray_t *vp) { vlinks_t *new_links = allocate_vlinks (); #ifdef MALLOC_CHECK if (vp->object_size > 1) - new_links->datum = (page_t *) xcalloc (1, vp->object_size); + new_links->datum = xcalloc (1, vp->object_size); else #endif new_links->datum = allocate_page (); @@ -1772,11 +1663,8 @@ add_varray_page (vp) #define HASHBITS 30 STATIC shash_t * -hash_string (text, hash_len, hash_tbl, ret_hash_index) - const char *text; /* ptr to text to hash */ - Ptrdiff_t hash_len; /* length of the text */ - shash_t **hash_tbl; /* hash table */ - symint_t *ret_hash_index; /* ptr to store hash index */ +hash_string (const char *text, Ptrdiff_t hash_len, shash_t **hash_tbl, + symint_t *ret_hash_index) { unsigned long hi; Ptrdiff_t i; @@ -1804,16 +1692,15 @@ hash_string (text, hash_len, hash_tbl, ret_hash_index) /* Add a string (and null pad) to one of the string tables. A - consequence of hashing strings, is that we don't let strings - cross page boundaries. The extra nulls will be ignored. */ + consequence of hashing strings, is that we don't let strings cross + page boundaries. The extra nulls will be ignored. VP is a string + virtual array, HASH_TBL a pointer to the hash table, the string + starts at START and the position one byte after the string is given + with END_P1, the resulting hash pointer is returned in RET_HASH. */ STATIC symint_t -add_string (vp, hash_tbl, start, end_p1, ret_hash) - varray_t *vp; /* string virtual array */ - shash_t **hash_tbl; /* ptr to hash table */ - const char *start; /* 1st byte in string */ - const char *end_p1; /* 1st byte after string */ - shash_t **ret_hash; /* return hash pointer */ +add_string (varray_t *vp, shash_t **hash_tbl, const char *start, + const char *end_p1, shash_t **ret_hash) { Ptrdiff_t len = end_p1 - start; shash_t *hash_ptr; @@ -1858,16 +1745,14 @@ add_string (vp, hash_tbl, start, end_p1, ret_hash) } -/* Add a local symbol. */ +/* Add a local symbol. The symbol string starts at STR_START and the + first byte after it is marked by STR_END_P1. The symbol has type + TYPE and storage class STORAGE and value VALUE. INDX is an index + to local/aux. symbols. */ STATIC symint_t -add_local_symbol (str_start, str_end_p1, type, storage, value, indx) - const char *str_start; /* first byte in string */ - const char *str_end_p1; /* first byte after string */ - st_t type; /* symbol type */ - sc_t storage; /* storage class */ - symint_t value; /* value of symbol */ - symint_t indx; /* index to local/aux. syms */ +add_local_symbol (const char *str_start, const char *str_end_p1, st_t type, + sc_t storage, symint_t value, symint_t indx) { symint_t ret; SYMR *psym; @@ -2036,12 +1921,11 @@ add_local_symbol (str_start, str_end_p1, type, storage, value, indx) } -/* Add an external symbol. */ +/* Add an external symbol with symbol pointer ESYM and file index + IFD. */ STATIC symint_t -add_ext_symbol (esym, ifd) - EXTR *esym; /* symbol pointer */ - int ifd; /* file index */ +add_ext_symbol (EXTR *esym, int ifd) { const char *str_start; /* first byte in string */ const char *str_end_p1; /* first byte after string */ @@ -2093,8 +1977,7 @@ add_ext_symbol (esym, ifd) /* Add an auxiliary symbol (passing a symint). */ STATIC symint_t -add_aux_sym_symint (aux_word) - symint_t aux_word; /* auxiliary information word */ +add_aux_sym_symint (symint_t aux_word) { AUXU *aux_ptr; efdr_t *file_ptr = cur_file_ptr; @@ -2113,9 +1996,7 @@ add_aux_sym_symint (aux_word) /* Add an auxiliary symbol (passing a file/symbol index combo). */ STATIC symint_t -add_aux_sym_rndx (file_index, sym_index) - int file_index; - symint_t sym_index; +add_aux_sym_rndx (int file_index, symint_t sym_index) { AUXU *aux_ptr; efdr_t *file_ptr = cur_file_ptr; @@ -2136,10 +2017,7 @@ add_aux_sym_rndx (file_index, sym_index) type qualifiers). */ STATIC symint_t -add_aux_sym_tir (t, state, hash_tbl) - type_info_t *t; /* current type information */ - hash_state_t state; /* whether to hash type or not */ - thash_t **hash_tbl; /* pointer to hash table to use */ +add_aux_sym_tir (type_info_t *t, hash_state_t state, thash_t **hash_tbl) { AUXU *aux_ptr; efdr_t *file_ptr = cur_file_ptr; @@ -2223,7 +2101,7 @@ add_aux_sym_tir (t, state, hash_tbl) ret = vp->num_allocated++; /* Add bitfield length if it exists. - + NOTE: Mips documentation claims bitfield goes at the end of the AUX record, but the DECstation compiler emits it here. (This would only make a difference for enum bitfields.) @@ -2298,11 +2176,11 @@ add_aux_sym_tir (t, state, hash_tbl) /* Add a tag to the tag table (unless it already exists). */ STATIC tag_t * -get_tag (tag_start, tag_end_p1, indx, basic_type) - const char *tag_start; /* 1st byte of tag name */ - const char *tag_end_p1; /* 1st byte after tag name */ - symint_t indx; /* index of tag start block */ - bt_t basic_type; /* bt_Struct, bt_Union, or bt_Enum */ +get_tag (const char *tag_start, /* 1st byte of tag name */ + const char *tag_end_p1, /* 1st byte after tag name */ + symint_t indx, /* index of tag start block */ + bt_t basic_type) /* bt_Struct, bt_Union, or bt_Enum */ + { shash_t *hash_ptr; tag_t *tag_ptr; @@ -2350,8 +2228,7 @@ get_tag (tag_start, tag_end_p1, indx, basic_type) /* Add an unknown {struct, union, enum} tag. */ STATIC void -add_unknown_tag (ptag) - tag_t *ptag; /* pointer to tag information */ +add_unknown_tag (tag_t *ptag) { shash_t *hash_ptr = ptag->hash_ptr; char *name_start = hash_ptr->string; @@ -2410,9 +2287,8 @@ add_unknown_tag (ptag) this procedure, use that to initialize the current PDR. */ STATIC void -add_procedure (func_start, func_end_p1) - const char *func_start; /* 1st byte of func name */ - const char *func_end_p1; /* 1st byte after func name */ +add_procedure (const char *func_start, /* 1st byte of func name */ + const char *func_end_p1) /* 1st byte after func name */ { PDR *new_proc_ptr; efdr_t *file_ptr = cur_file_ptr; @@ -2471,14 +2347,49 @@ add_procedure (func_start, func_end_p1) } +/* Initialize the init_file structure. */ + +STATIC void +initialize_init_file (void) +{ + union { + unsigned char c[4]; + int i; + } endian_test; + + memset (&init_file, 0, sizeof (init_file)); + + init_file.fdr.lang = langC; + init_file.fdr.fMerge = 1; + init_file.fdr.glevel = GLEVEL_2; + + /* mips-tfile doesn't attempt to perform byte swapping and always writes + out integers in its native ordering. For cross-compilers, this need + not be the same as either the host or the target. The simplest thing + to do is skip the configury and perform an introspective test. */ + /* ??? Despite the name, mips-tfile is currently only used on alpha/Tru64 + and would/may require significant work to be used in cross-compiler + configurations, so we could simply admit defeat and hard code this as + little-endian, i.e. init_file.fdr.fBigendian = 0. */ + endian_test.i = 1; + if (endian_test.c[3]) + init_file.fdr.fBigendian = 1; + + INITIALIZE_VARRAY (&init_file.strings, char); + INITIALIZE_VARRAY (&init_file.symbols, SYMR); + INITIALIZE_VARRAY (&init_file.procs, PDR); + INITIALIZE_VARRAY (&init_file.aux_syms, AUXU); + + init_file_initialized = 1; +} + /* Add a new filename, and set up all of the file relative virtual arrays (strings, symbols, aux syms, etc.). Record where the current file structure lives. */ STATIC void -add_file (file_start, file_end_p1) - const char *file_start; /* first byte in string */ - const char *file_end_p1; /* first byte after string */ +add_file (const char *file_start, /* first byte in string */ + const char *file_end_p1) /* first byte after string */ { static char zero_bytes[2] = { '\0', '\0' }; @@ -2509,6 +2420,9 @@ add_file (file_start, file_end_p1) if (file_desc.objects_last_page == file_desc.objects_per_page) add_varray_page (&file_desc); + if (! init_file_initialized) + initialize_init_file (); + file_ptr = cur_file_ptr = &file_desc.last->datum->file[ file_desc.objects_last_page++ ]; *file_ptr = init_file; @@ -2556,10 +2470,9 @@ add_file (file_start, file_end_p1) /* Add a stream of random bytes to a varray. */ STATIC void -add_bytes (vp, input_ptr, nitems) - varray_t *vp; /* virtual array to add too */ - char *input_ptr; /* start of the bytes */ - Size_t nitems; /* # items to move */ +add_bytes (varray_t *vp, /* virtual array to add too */ + char *input_ptr, /* start of the bytes */ + Size_t nitems) /* # items to move */ { Size_t move_items; Size_t move_bytes; @@ -2595,8 +2508,7 @@ add_bytes (vp, input_ptr, nitems) /* Convert storage class to string. */ STATIC const char * -sc_to_string (storage_class) - sc_t storage_class; +sc_to_string (sc_t storage_class) { switch (storage_class) { @@ -2633,8 +2545,7 @@ sc_to_string (storage_class) /* Convert symbol type to string. */ STATIC const char * -st_to_string (symbol_type) - st_t symbol_type; +st_to_string (st_t symbol_type) { switch (symbol_type) { @@ -2670,7 +2581,7 @@ st_to_string (symbol_type) semi-colon, and return each logical line independently. */ STATIC char * -read_line () +read_line (void) { static int line_split_p = 0; int string_p = 0; @@ -2746,8 +2657,7 @@ read_line () which gives the location of the start of the block. */ STATIC void -parse_begin (start) - const char *start; /* start of directive */ +parse_begin (const char *start) { const char *end_p1; /* end of label */ int ch; @@ -2798,8 +2708,7 @@ parse_begin (start) which gives the location of the end of the block. */ STATIC void -parse_bend (start) - const char *start; /* start of directive */ +parse_bend (const char *start) { const char *end_p1; /* end of label */ int ch; @@ -2857,8 +2766,7 @@ parse_bend (start) .tag specify a tag for a struct, union, or enum. */ STATIC void -parse_def (name_start) - const char *name_start; /* start of directive */ +parse_def (const char *name_start) { const char *dir_start; /* start of current directive*/ const char *dir_end_p1; /* end+1 of current directive*/ @@ -2923,7 +2831,7 @@ parse_def (name_start) && memcmp (dir_start, ".endef", sizeof (".endef")-1) == 0) break; - /* Pick up the subdirective now */ + /* Pick up the subdirective now. */ for (dir_end_p1 = dir_start+1; (ch = *dir_end_p1) != ' ' && ch != '\t'; dir_end_p1++) @@ -2948,7 +2856,8 @@ parse_def (name_start) { int ch2; arg_number = strtol (arg_start, (char **) &arg_end_p1, 0); - if (arg_end_p1 != arg_start || (ch2 = *arg_end_p1 != ';') || ch2 != ',') + /* It's only a number if followed by ';' or ','. */ + if (arg_end_p1 != arg_start && (((ch2 = *arg_end_p1) == ';') || ch2 == ',')) arg_was_number++; } @@ -3004,7 +2913,7 @@ parse_def (name_start) { int ch2; arg_number = strtol (arg_start, (char **) &arg_end_p1, 0); - if (arg_end_p1 != arg_start || (ch2 = *arg_end_p1 != ';') || ch2 != ',') + if (arg_end_p1 != arg_start && (((ch2 = *arg_end_p1) == ';') || ch2 == ',')) arg_was_number++; if (t_ptr == &temp_array[0]) @@ -3078,7 +2987,7 @@ parse_def (name_start) { int ch2; arg_number = strtol (arg_start, (char **) &arg_end_p1, 0); - if (arg_end_p1 != arg_start || (ch2 = *arg_end_p1 != ';') || ch2 != ',') + if (arg_end_p1 != arg_start && (((ch2 = *arg_end_p1) == ';') || ch2 == ',')) arg_was_number++; if (t_ptr == &temp_array[0]) @@ -3177,7 +3086,7 @@ parse_def (name_start) class, symbol type, etc. */ else { - shash_t *orig_hash_ptr; /* hash within orig sym table*/ + shash_t *orig_hash_ptr; /* hash within orig sym table*/ shash_t *ext_hash_ptr; /* hash within ext. sym table*/ ext_hash_ptr = hash_string (arg_start, @@ -3384,7 +3293,7 @@ parse_def (name_start) value, indx); - /* deal with struct, union, and enum tags. */ + /* Deal with struct, union, and enum tags. */ if (symbol_type == st_Block) { /* Create or update the tag information. */ @@ -3432,8 +3341,7 @@ bomb_out: /* Parse .end directives. */ STATIC void -parse_end (start) - const char *start; /* start of directive */ +parse_end (const char *start) { const char *start_func, *end_func_p1; int ch; @@ -3495,8 +3403,7 @@ parse_end (start) /* Parse .ent directives. */ STATIC void -parse_ent (start) - const char *start; /* start of directive */ +parse_ent (const char *start) { const char *start_func, *end_func_p1; int ch; @@ -3533,8 +3440,7 @@ parse_ent (start) /* Parse .file directives. */ STATIC void -parse_file (start) - const char *start; /* start of directive */ +parse_file (const char *start) { char *p; char *start_name, *end_name_p1; @@ -3561,8 +3467,7 @@ parse_file (start) /* Make sure the @stabs symbol is emitted. */ static void -mark_stabs (start) - const char *start ATTRIBUTE_UNUSED; /* Start of directive (ignored) */ +mark_stabs (const char *start ATTRIBUTE_UNUSED) { if (!stabs_seen) { @@ -3606,10 +3511,9 @@ mark_stabs (start) value a numeric value or an address. */ STATIC void -parse_stabs_common (string_start, string_end, rest) - const char *string_start; /* start of string or NULL */ - const char *string_end; /* end+1 of string or NULL */ - const char *rest; /* rest of the directive. */ +parse_stabs_common (const char *string_start, /* start of string or NULL */ + const char *string_end, /* end+1 of string or NULL */ + const char *rest) /* rest of the directive. */ { efdr_t *save_file_ptr = cur_file_ptr; symint_t code; @@ -3805,8 +3709,7 @@ parse_stabs_common (string_start, string_end, rest) STATIC void -parse_stabs (start) - const char *start; /* start of directive */ +parse_stabs (const char *start) { const char *end = strchr (start+1, '"'); @@ -3821,8 +3724,7 @@ parse_stabs (start) STATIC void -parse_stabn (start) - const char *start; /* start of directive */ +parse_stabn (const char *start) { parse_stabs_common ((const char *) 0, (const char *) 0, start); } @@ -3832,7 +3734,7 @@ parse_stabn (start) if needed. */ STATIC void -parse_input () +parse_input (void) { char *p; Size_t i; @@ -3852,7 +3754,7 @@ parse_input () while ((p = read_line ()) != (char *) 0) { - /* Skip leading blanks */ + /* Skip leading blanks. */ while (ISSPACE ((unsigned char)*p)) p++; @@ -3895,7 +3797,7 @@ parse_input () to write out the .T file. */ STATIC void -update_headers () +update_headers (void) { symint_t i; efdr_t *file_ptr; @@ -3951,7 +3853,7 @@ update_headers () hash_ptr = hash_string (str, (Ptrdiff_t) len, &file_ptr->shash_head[0], - (symint_t *) 0); + (symint_t *) 0); if (hash_ptr == (shash_t *) 0) { (void) add_local_symbol (str, str + len, @@ -4081,10 +3983,9 @@ update_headers () /* Write out a varray at a given location. */ STATIC void -write_varray (vp, offset, str) - varray_t *vp; /* virtual array */ - off_t offset; /* offset to write varray to */ - const char *str; /* string to print out when tracing */ +write_varray (varray_t *vp, /* virtual array */ + off_t offset, /* offset to write varray to */ + const char *str) /* string to print out when tracing */ { int num_write, sys_write; vlinks_t *ptr; @@ -4093,14 +3994,11 @@ write_varray (vp, offset, str) return; if (debug) - { - fputs ("\twarray\tvp = ", stderr); - fprintf (stderr, HOST_PTR_PRINTF, (PTR) vp); - fprintf (stderr, ", offset = %7lu, size = %7lu, %s\n", - (unsigned long) offset, vp->num_allocated * vp->object_size, str); - } - - if (file_offset != offset + fprintf (stderr, "\twarray\tvp = %p, offset = %7lu, size = %7lu, %s\n", + (void *) vp, (unsigned long) offset, + vp->num_allocated * vp->object_size, str); + + if (file_offset != (unsigned long) offset && fseek (object_stream, (long) offset, SEEK_SET) < 0) pfatal_with_name (object_name); @@ -4110,7 +4008,7 @@ write_varray (vp, offset, str) ? vp->objects_last_page * vp->object_size : vp->objects_per_page * vp->object_size; - sys_write = fwrite ((PTR) ptr->datum, 1, num_write, object_stream); + sys_write = fwrite (ptr->datum, 1, num_write, object_stream); if (sys_write <= 0) pfatal_with_name (object_name); @@ -4128,21 +4026,18 @@ write_varray (vp, offset, str) /* Write out the symbol table in the object file. */ STATIC void -write_object () +write_object (void) { int sys_write; efdr_t *file_ptr; off_t offset; if (debug) - { - fputs ("\n\twrite\tvp = ", stderr); - fprintf (stderr, HOST_PTR_PRINTF, (PTR) &symbolic_header); - fprintf (stderr, ", offset = %7u, size = %7lu, %s\n", - 0, (unsigned long) sizeof (symbolic_header), "symbolic header"); - } + fprintf (stderr, "\n\twrite\tvp = %p, offset = %7u, size = %7lu, %s\n", + (void *) &symbolic_header, 0, + (unsigned long) sizeof (symbolic_header), "symbolic header"); - sys_write = fwrite ((PTR) &symbolic_header, + sys_write = fwrite (&symbolic_header, 1, sizeof (symbolic_header), object_stream); @@ -4163,20 +4058,16 @@ write_object () { long sys_write; - if (file_offset != symbolic_header.cbLineOffset + if (file_offset != (unsigned long) symbolic_header.cbLineOffset && fseek (object_stream, symbolic_header.cbLineOffset, SEEK_SET) != 0) pfatal_with_name (object_name); if (debug) - { - fputs ("\twrite\tvp = ", stderr); - fprintf (stderr, HOST_PTR_PRINTF, (PTR) &orig_linenum); - fprintf (stderr, ", offset = %7lu, size = %7lu, %s\n", - (long) symbolic_header.cbLineOffset, - (long) symbolic_header.cbLine, "Line numbers"); - } + fprintf (stderr, "\twrite\tvp = %p, offset = %7lu, size = %7lu, %s\n", + (void *) &orig_linenum, (long) symbolic_header.cbLineOffset, + (long) symbolic_header.cbLine, "Line numbers"); - sys_write = fwrite ((PTR) orig_linenum, + sys_write = fwrite (orig_linenum, 1, symbolic_header.cbLine, object_stream); @@ -4198,20 +4089,16 @@ write_object () long sys_write; long num_write = symbolic_header.ioptMax * sizeof (OPTR); - if (file_offset != symbolic_header.cbOptOffset + if (file_offset != (unsigned long) symbolic_header.cbOptOffset && fseek (object_stream, symbolic_header.cbOptOffset, SEEK_SET) != 0) pfatal_with_name (object_name); if (debug) - { - fputs ("\twrite\tvp = ", stderr); - fprintf (stderr, HOST_PTR_PRINTF, (PTR) &orig_opt_syms); - fprintf (stderr, ", offset = %7lu, size = %7lu, %s\n", - (long) symbolic_header.cbOptOffset, - num_write, "Optimizer symbols"); - } + fprintf (stderr, "\twrite\tvp = %p, offset = %7lu, size = %7lu, %s\n", + (void *) &orig_opt_syms, (long) symbolic_header.cbOptOffset, + num_write, "Optimizer symbols"); - sys_write = fwrite ((PTR) orig_opt_syms, + sys_write = fwrite (orig_opt_syms, 1, num_write, object_stream); @@ -4285,7 +4172,7 @@ write_object () if (symbolic_header.ifdMax > 0) /* file tables */ { offset = symbolic_header.cbFdOffset; - if (file_offset != offset + if (file_offset != (unsigned long) offset && fseek (object_stream, (long) offset, SEEK_SET) < 0) pfatal_with_name (object_name); @@ -4295,13 +4182,9 @@ write_object () file_ptr = file_ptr->next_file) { if (debug) - { - fputs ("\twrite\tvp = ", stderr); - fprintf (stderr, HOST_PTR_PRINTF, (PTR) &file_ptr->fdr); - fprintf (stderr, ", offset = %7lu, size = %7lu, %s\n", - file_offset, (unsigned long) sizeof (FDR), - "File header"); - } + fprintf (stderr, "\twrite\tvp = %p, offset = %7lu, size = %7lu, %s\n", + (void *) &file_ptr->fdr, file_offset, + (unsigned long) sizeof (FDR), "File header"); sys_write = fwrite (&file_ptr->fdr, 1, @@ -4326,18 +4209,14 @@ write_object () long sys_write; symint_t num_write = symbolic_header.crfd * sizeof (symint_t); - if (file_offset != symbolic_header.cbRfdOffset + if (file_offset != (unsigned long) symbolic_header.cbRfdOffset && fseek (object_stream, symbolic_header.cbRfdOffset, SEEK_SET) != 0) pfatal_with_name (object_name); if (debug) - { - fputs ("\twrite\tvp = ", stderr); - fprintf (stderr, HOST_PTR_PRINTF, (PTR) &orig_rfds); - fprintf (stderr, ", offset = %7lu, size = %7lu, %s\n", - (long) symbolic_header.cbRfdOffset, - num_write, "Relative file descriptors"); - } + fprintf (stderr, "\twrite\tvp = %p, offset = %7lu, size = %7lu, %s\n", + (void *) &orig_rfds, (long) symbolic_header.cbRfdOffset, + num_write, "Relative file descriptors"); sys_write = fwrite (orig_rfds, 1, @@ -4367,10 +4246,9 @@ write_object () /* Read some bytes at a specified location, and return a pointer. */ STATIC page_t * -read_seek (size, offset, str) - Size_t size; /* # bytes to read */ - off_t offset; /* offset to read at */ - const char *str; /* name for tracing */ +read_seek (Size_t size, /* # bytes to read */ + off_t offset, /* offset to read at */ + const char *str) /* name for tracing */ { page_t *ptr; long sys_read = 0; @@ -4386,12 +4264,12 @@ read_seek (size, offset, str) #ifndef MALLOC_CHECK ptr = allocate_multiple_pages ((size + PAGE_USIZE - 1) / PAGE_USIZE); #else - ptr = (page_t *) xcalloc (1, size); + ptr = xcalloc (1, size); #endif /* If we need to seek, and the distance is nearby, just do some reads, to speed things up. */ - if (file_offset != offset) + if (file_offset != (unsigned long) offset) { symint_t difference = offset - file_offset; @@ -4413,7 +4291,7 @@ read_seek (size, offset, str) pfatal_with_name (obj_in_name); } - sys_read = fread ((PTR) ptr, 1, size, obj_in_stream); + sys_read = fread (ptr, 1, size, obj_in_stream); if (sys_read <= 0) pfatal_with_name (obj_in_name); @@ -4437,7 +4315,7 @@ read_seek (size, offset, str) symbol table. */ STATIC void -copy_object () +copy_object (void) { char buffer[ PAGE_SIZE ]; int sys_read; @@ -4456,7 +4334,7 @@ copy_object () || fseek (obj_in_stream, 0L, SEEK_SET) != 0) pfatal_with_name (obj_in_name); - sys_read = fread ((PTR) &orig_file_header, + sys_read = fread (&orig_file_header, 1, sizeof (struct filehdr), obj_in_stream); @@ -4483,7 +4361,7 @@ copy_object () if (fseek (obj_in_stream, (long) orig_file_header.f_symptr, SEEK_SET) != 0) pfatal_with_name (input_name); - sys_read = fread ((PTR) &orig_sym_hdr, + sys_read = fread (&orig_sym_hdr, 1, sizeof (orig_sym_hdr), obj_in_stream); @@ -4499,7 +4377,7 @@ copy_object () /* Read in each of the sections if they exist in the object file. - We read things in in the order the mips assembler creates the + We read things in the order the mips assembler creates the sections, so in theory no extra seeks are done. For simplicity sake, round each read up to a page boundary, @@ -4508,68 +4386,68 @@ copy_object () file_offset = orig_file_header.f_symptr + sizeof (struct filehdr); if (orig_sym_hdr.cbLine > 0) /* line numbers */ - orig_linenum = (char *) read_seek ((Size_t) orig_sym_hdr.cbLine, + orig_linenum = (char *) read_seek (orig_sym_hdr.cbLine, orig_sym_hdr.cbLineOffset, "Line numbers"); if (orig_sym_hdr.ipdMax > 0) /* procedure tables */ - orig_procs = (PDR *) read_seek ((Size_t) orig_sym_hdr.ipdMax * sizeof (PDR), + orig_procs = (PDR *) read_seek (orig_sym_hdr.ipdMax * sizeof (PDR), orig_sym_hdr.cbPdOffset, "Procedure tables"); if (orig_sym_hdr.isymMax > 0) /* local symbols */ - orig_local_syms = (SYMR *) read_seek ((Size_t) orig_sym_hdr.isymMax * sizeof (SYMR), + orig_local_syms = (SYMR *) read_seek (orig_sym_hdr.isymMax * sizeof (SYMR), orig_sym_hdr.cbSymOffset, "Local symbols"); if (orig_sym_hdr.iauxMax > 0) /* aux symbols */ - orig_aux_syms = (AUXU *) read_seek ((Size_t) orig_sym_hdr.iauxMax * sizeof (AUXU), + orig_aux_syms = (AUXU *) read_seek (orig_sym_hdr.iauxMax * sizeof (AUXU), orig_sym_hdr.cbAuxOffset, "Aux. symbols"); if (orig_sym_hdr.issMax > 0) /* local strings */ - orig_local_strs = (char *) read_seek ((Size_t) orig_sym_hdr.issMax, + orig_local_strs = (char *) read_seek (orig_sym_hdr.issMax, orig_sym_hdr.cbSsOffset, "Local strings"); if (orig_sym_hdr.issExtMax > 0) /* external strings */ - orig_ext_strs = (char *) read_seek ((Size_t) orig_sym_hdr.issExtMax, + orig_ext_strs = (char *) read_seek (orig_sym_hdr.issExtMax, orig_sym_hdr.cbSsExtOffset, "External strings"); if (orig_sym_hdr.ifdMax > 0) /* file tables */ - orig_files = (FDR *) read_seek ((Size_t) orig_sym_hdr.ifdMax * sizeof (FDR), + orig_files = (FDR *) read_seek (orig_sym_hdr.ifdMax * sizeof (FDR), orig_sym_hdr.cbFdOffset, "File tables"); if (orig_sym_hdr.crfd > 0) /* relative file descriptors */ - orig_rfds = (symint_t *) read_seek ((Size_t) orig_sym_hdr.crfd * sizeof (symint_t), + orig_rfds = (symint_t *) read_seek (orig_sym_hdr.crfd * sizeof (symint_t), orig_sym_hdr.cbRfdOffset, "Relative file descriptors"); if (orig_sym_hdr.issExtMax > 0) /* external symbols */ - orig_ext_syms = (EXTR *) read_seek ((Size_t) orig_sym_hdr.iextMax * sizeof (EXTR), + orig_ext_syms = (EXTR *) read_seek (orig_sym_hdr.iextMax * sizeof (EXTR), orig_sym_hdr.cbExtOffset, "External symbols"); if (orig_sym_hdr.idnMax > 0) /* dense numbers */ { - orig_dense = (DNR *) read_seek ((Size_t) orig_sym_hdr.idnMax * sizeof (DNR), + orig_dense = (DNR *) read_seek (orig_sym_hdr.idnMax * sizeof (DNR), orig_sym_hdr.cbDnOffset, "Dense numbers"); - add_bytes (&dense_num, (char *) orig_dense, (Size_t) orig_sym_hdr.idnMax); + add_bytes (&dense_num, (char *) orig_dense, orig_sym_hdr.idnMax); } if (orig_sym_hdr.ioptMax > 0) /* opt symbols */ - orig_opt_syms = (OPTR *) read_seek ((Size_t) orig_sym_hdr.ioptMax * sizeof (OPTR), + orig_opt_syms = (OPTR *) read_seek (orig_sym_hdr.ioptMax * sizeof (OPTR), orig_sym_hdr.cbOptOffset, "Optimizer symbols"); - /* Abort if the symbol table is not last. */ - if (max_file_offset != stat_buf.st_size) + /* The symbol table should be last. */ + if (max_file_offset != (unsigned long) stat_buf.st_size) fatal ("symbol table is not last (symbol table ends at %ld, .o ends at %ld", max_file_offset, (long) stat_buf.st_size); @@ -4623,7 +4501,7 @@ copy_object () for (es = 0; es < orig_sym_hdr.iextMax; es++) { EXTR *eptr = orig_ext_syms + es; - unsigned ifd = eptr->ifd; + int ifd = eptr->ifd; (void) add_ext_symbol (eptr, ((long) ifd < orig_sym_hdr.ifdMax) ? remap_file_number[ ifd ] : ifd ); @@ -4781,7 +4659,7 @@ copy_object () num_write = (remaining <= (int) sizeof (buffer)) ? remaining : (int) sizeof (buffer); - sys_read = fread ((PTR) buffer, 1, num_write, obj_in_stream); + sys_read = fread (buffer, 1, num_write, obj_in_stream); if (sys_read <= 0) pfatal_with_name (obj_in_name); @@ -4806,12 +4684,10 @@ copy_object () /* Ye olde main program. */ -extern int main PARAMS ((int, char **)); +extern int main (int, char **); int -main (argc, argv) - int argc; - char **argv; +main (int argc, char **argv) { int iflag = 0; char *p = strrchr (argv[0], '/'); @@ -4854,7 +4730,7 @@ main (argc, argv) void_type_info = type_info_init; void_type_info.basic_type = bt_Void; - while ((option = getopt (argc, argv, "d:i:I:o:v")) != EOF) + while ((option = getopt_long (argc, argv, "d:i:I:o:v", options, NULL)) != -1) switch (option) { default: @@ -4874,7 +4750,7 @@ main (argc, argv) else rename_output = 1; - /* fall through to 'i' case. */ + /* Fall through to 'i' case. */ case 'i': if (obj_in_name == (char *) 0) @@ -4894,10 +4770,24 @@ main (argc, argv) break; case 'v': + verbose++; + break; + + case 'V': version++; break; } + if (version) + { + printf (_("mips-tfile %s%s\n"), pkgversion_string, version_string); + fputs ("Copyright (C) 2010 Free Software Foundation, Inc.\n", stdout); + fputs (_("This is free software; see the source for copying conditions. There is NO\n\ +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"), + stdout); + exit (0); + } + if (obj_in_name == (char *) 0 && optind <= argc - 2) obj_in_name = argv[--argc]; @@ -4913,7 +4803,19 @@ main (argc, argv) delete_input = 1; } - if (object_name == (char *) 0 || had_errors || optind != argc - 1) + if (optind != argc - 1) + had_errors++; + + if (verbose || had_errors) + { + fprintf (stderr, _("mips-tfile (GCC) %s"), version_string); +#ifdef TARGET_VERSION + TARGET_VERSION; +#endif + fputc ('\n', stderr); + } + + if (object_name == (char *) 0 || had_errors) { fprintf (stderr, _("Calling Sequence:\n")); fprintf (stderr, _("\tmips-tfile [-d ] [-v] [-i ] -o (or)\n")); @@ -4928,16 +4830,6 @@ main (argc, argv) return 1; } - - if (version) - { - fprintf (stderr, _("mips-tfile version %s"), version_string); -#ifdef TARGET_VERSION - TARGET_VERSION; -#endif - fputc ('\n', stderr); - } - if (obj_in_name == (char *) 0) obj_in_name = object_name; @@ -5028,8 +4920,7 @@ main (argc, argv) /* Catch a signal and exit without dumping core. */ STATIC void -catch_signal (signum) - int signum; +catch_signal (int signum) { (void) signal (signum, SIG_DFL); /* just in case... */ fatal ("%s", strsignal (signum)); @@ -5039,8 +4930,7 @@ catch_signal (signum) Also include a system error message based on `errno'. */ void -pfatal_with_name (msg) - const char *msg; +pfatal_with_name (const char *msg) { int save_errno = errno; /* just in case.... */ if (line_number > 0) @@ -5058,16 +4948,15 @@ pfatal_with_name (msg) } -/* Procedure to abort with an out of bounds error message. It has +/* Procedure to die with an out of bounds error message. It has type int, so it can be used with an ?: expression within the ORIG_xxx macros, but the function never returns. */ static int -out_of_bounds (indx, max, str, prog_line) - symint_t indx; /* index that is out of bounds */ - symint_t max; /* maximum index */ - const char *str; /* string to print out */ - int prog_line; /* line number within mips-tfile.c */ +out_of_bounds (symint_t indx, /* index that is out of bounds */ + symint_t max, /* maximum index */ + const char *str, /* string to print out */ + int prog_line) /* line number within mips-tfile.c */ { if (indx < max) /* just in case */ return 0; @@ -5088,10 +4977,9 @@ out_of_bounds (indx, max, str, prog_line) #ifdef USE_MALLOC STATIC page_t * -allocate_cluster (npages) - Size_t npages; +allocate_cluster (Size_t npages) { - page_t *value = (page_t *) xcalloc (npages, PAGE_USIZE); + page_t *value = xcalloc (npages, PAGE_USIZE); if (debug > 3) fprintf (stderr, "\talloc\tnpages = %d, value = 0x%.8x\n", npages, value); @@ -5102,8 +4990,7 @@ allocate_cluster (npages) #else /* USE_MALLOC */ STATIC page_t * -allocate_cluster (npages) - Size_t npages; +allocate_cluster (Size_t npages) { page_t *ptr = (page_t *) sbrk (0); /* current sbreak */ unsigned long offset = ((unsigned long) ptr) & (PAGE_SIZE - 1); @@ -5120,12 +5007,8 @@ allocate_cluster (npages) pfatal_with_name ("allocate_cluster"); if (debug > 3) - { - fprintf (stderr, "\talloc\tnpages = %lu, value = ", - (unsigned long) npages); - fprintf (stderr, HOST_PTR_PRINTF, (PTR) ptr); - fputs ("\n", stderr); - } + fprintf (stderr, "\talloc\tnpages = %lu, value = %p\n", + (unsigned long) npages, (void *) ptr); return ptr; } @@ -5142,8 +5025,7 @@ static unsigned pages_left = 0; /* Allocate some pages (which is initialized to 0). */ STATIC page_t * -allocate_multiple_pages (npages) - Size_t npages; +allocate_multiple_pages (Size_t npages) { #ifndef MALLOC_CHECK if (pages_left == 0 && npages < MAX_CLUSTER_PAGES) @@ -5163,7 +5045,7 @@ allocate_multiple_pages (npages) return allocate_cluster (npages); #else /* MALLOC_CHECK */ - return (page_t *) xcalloc (npages, PAGE_SIZE); + return xcalloc (npages, PAGE_SIZE); #endif /* MALLOC_CHECK */ } @@ -5172,9 +5054,7 @@ allocate_multiple_pages (npages) /* Release some pages. */ STATIC void -free_multiple_pages (page_ptr, npages) - page_t *page_ptr; - Size_t npages; +free_multiple_pages (page_t *page_ptr, Size_t npages) { #ifndef MALLOC_CHECK if (pages_left == 0) @@ -5194,7 +5074,7 @@ free_multiple_pages (page_ptr, npages) the free pages is done right after an allocate. */ #else /* MALLOC_CHECK */ - free ((char *) page_ptr); + free (page_ptr); #endif /* MALLOC_CHECK */ } @@ -5203,7 +5083,7 @@ free_multiple_pages (page_ptr, npages) /* Allocate one page (which is initialized to 0). */ STATIC page_t * -allocate_page () +allocate_page (void) { #ifndef MALLOC_CHECK if (pages_left == 0) @@ -5216,7 +5096,7 @@ allocate_page () return cluster_ptr++; #else /* MALLOC_CHECK */ - return (page_t *) xcalloc (1, PAGE_SIZE); + return xcalloc (1, PAGE_SIZE); #endif /* MALLOC_CHECK */ } @@ -5225,7 +5105,7 @@ allocate_page () /* Allocate scoping information. */ STATIC scope_t * -allocate_scope () +allocate_scope (void) { scope_t *ptr; static scope_t initial_scope; @@ -5252,7 +5132,7 @@ allocate_scope () } #else - ptr = (scope_t *) xmalloc (sizeof (scope_t)); + ptr = xmalloc (sizeof (scope_t)); #endif @@ -5264,8 +5144,7 @@ allocate_scope () /* Free scoping information. */ STATIC void -free_scope (ptr) - scope_t *ptr; +free_scope (scope_t *ptr) { alloc_counts[ (int) alloc_type_scope ].total_free++; @@ -5274,7 +5153,7 @@ free_scope (ptr) alloc_counts[ (int) alloc_type_scope ].free_list.f_scope = ptr; #else - free ((PTR) ptr); + free (ptr); #endif } @@ -5283,7 +5162,7 @@ free_scope (ptr) /* Allocate links for pages in a virtual array. */ STATIC vlinks_t * -allocate_vlinks () +allocate_vlinks (void) { vlinks_t *ptr; static vlinks_t initial_vlinks; @@ -5303,7 +5182,7 @@ allocate_vlinks () alloc_counts[ (int) alloc_type_vlinks ].unallocated = unallocated; #else - ptr = (vlinks_t *) xmalloc (sizeof (vlinks_t)); + ptr = xmalloc (sizeof (vlinks_t)); #endif @@ -5316,7 +5195,7 @@ allocate_vlinks () /* Allocate string hash buckets. */ STATIC shash_t * -allocate_shash () +allocate_shash (void) { shash_t *ptr; static shash_t initial_shash; @@ -5336,7 +5215,7 @@ allocate_shash () alloc_counts[ (int) alloc_type_shash ].unallocated = unallocated; #else - ptr = (shash_t *) xmalloc (sizeof (shash_t)); + ptr = xmalloc (sizeof (shash_t)); #endif @@ -5349,7 +5228,7 @@ allocate_shash () /* Allocate type hash buckets. */ STATIC thash_t * -allocate_thash () +allocate_thash (void) { thash_t *ptr; static thash_t initial_thash; @@ -5369,7 +5248,7 @@ allocate_thash () alloc_counts[ (int) alloc_type_thash ].unallocated = unallocated; #else - ptr = (thash_t *) xmalloc (sizeof (thash_t)); + ptr = xmalloc (sizeof (thash_t)); #endif @@ -5382,7 +5261,7 @@ allocate_thash () /* Allocate structure, union, or enum tag information. */ STATIC tag_t * -allocate_tag () +allocate_tag (void) { tag_t *ptr; static tag_t initial_tag; @@ -5409,7 +5288,7 @@ allocate_tag () } #else - ptr = (tag_t *) xmalloc (sizeof (tag_t)); + ptr = xmalloc (sizeof (tag_t)); #endif @@ -5421,8 +5300,7 @@ allocate_tag () /* Free scoping information. */ STATIC void -free_tag (ptr) - tag_t *ptr; +free_tag (tag_t *ptr) { alloc_counts[ (int) alloc_type_tag ].total_free++; @@ -5431,7 +5309,7 @@ free_tag (ptr) alloc_counts[ (int) alloc_type_tag ].free_list.f_tag = ptr; #else - free ((PTR) ptr); + free (ptr); #endif } @@ -5440,7 +5318,7 @@ free_tag (ptr) /* Allocate forward reference to a yet unknown tag. */ STATIC forward_t * -allocate_forward () +allocate_forward (void) { forward_t *ptr; static forward_t initial_forward; @@ -5467,7 +5345,7 @@ allocate_forward () } #else - ptr = (forward_t *) xmalloc (sizeof (forward_t)); + ptr = xmalloc (sizeof (forward_t)); #endif @@ -5479,8 +5357,7 @@ allocate_forward () /* Free scoping information. */ STATIC void -free_forward (ptr) - forward_t *ptr; +free_forward (forward_t *ptr) { alloc_counts[ (int) alloc_type_forward ].total_free++; @@ -5489,7 +5366,7 @@ free_forward (ptr) alloc_counts[ (int) alloc_type_forward ].free_list.f_forward = ptr; #else - free ((PTR) ptr); + free (ptr); #endif } @@ -5498,7 +5375,7 @@ free_forward (ptr) /* Allocate head of type hash list. */ STATIC thead_t * -allocate_thead () +allocate_thead (void) { thead_t *ptr; static thead_t initial_thead; @@ -5525,7 +5402,7 @@ allocate_thead () } #else - ptr = (thead_t *) xmalloc (sizeof (thead_t)); + ptr = xmalloc (sizeof (thead_t)); #endif @@ -5537,8 +5414,7 @@ allocate_thead () /* Free scoping information. */ STATIC void -free_thead (ptr) - thead_t *ptr; +free_thead (thead_t *ptr) { alloc_counts[ (int) alloc_type_thead ].total_free++; @@ -5547,7 +5423,7 @@ free_thead (ptr) alloc_counts[ (int) alloc_type_thead ].free_list.f_thead = ptr; #else - free ((PTR) ptr); + free (ptr); #endif } @@ -5555,14 +5431,14 @@ free_thead (ptr) #endif /* MIPS_DEBUGGING_INFO */ -/* Output an error message and exit */ +/* Output an error message and exit. */ -/*VARARGS*/ void -fatal VPARAMS ((const char *format, ...)) +fatal (const char *format, ...) { - VA_OPEN (ap, format); - VA_FIXEDARG (ap, const char *, format); + va_list ap; + + va_start (ap, format); if (line_number > 0) fprintf (stderr, "%s, %s:%ld ", progname, input_name, line_number); @@ -5570,7 +5446,7 @@ fatal VPARAMS ((const char *format, ...)) fprintf (stderr, "%s:", progname); vfprintf (stderr, format, ap); - VA_CLOSE (ap); + va_end (ap); fprintf (stderr, "\n"); if (line_number > 0) fprintf (stderr, "line:\t%s\n", cur_line_start); @@ -5579,12 +5455,12 @@ fatal VPARAMS ((const char *format, ...)) exit (1); } -/*VARARGS*/ void -error VPARAMS ((const char *format, ...)) +error (const char *format, ...) { - VA_OPEN (ap, format); - VA_FIXEDARG (ap, char *, format); + va_list ap; + + va_start (ap, format); if (line_number > 0) fprintf (stderr, "%s, %s:%ld ", progname, input_name, line_number); @@ -5597,18 +5473,17 @@ error VPARAMS ((const char *format, ...)) fprintf (stderr, "line:\t%s\n", cur_line_start); had_errors++; - VA_CLOSE (ap); + va_end (ap); saber_stop (); } -/* More 'friendly' abort that prints the line and file. - config.h can #define abort fancy_abort if you like that sort of thing. */ +/* More 'friendly' abort that prints the line and file. */ void -fancy_abort () +fancy_abort (const char *file, int line, const char *func) { - fatal ("internal abort"); + fatal ("abort in %s, at %s:%d", func, file, line); } @@ -5616,8 +5491,7 @@ fancy_abort () it calls this function to report clobberage. */ void -botch (s) - const char *s; +botch (const char *s) { fatal ("%s", s); }