1*e4b17023SJohn Marino /* Read and manage MIPS symbol tables from object modules.
2*e4b17023SJohn Marino Copyright (C) 1991, 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2003, 2004,
3*e4b17023SJohn Marino 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
4*e4b17023SJohn Marino Contributed by hartzell@boulder.colorado.edu,
5*e4b17023SJohn Marino Rewritten by meissner@osf.org.
6*e4b17023SJohn Marino
7*e4b17023SJohn Marino This file is part of GCC.
8*e4b17023SJohn Marino
9*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify it under
10*e4b17023SJohn Marino the terms of the GNU General Public License as published by the Free
11*e4b17023SJohn Marino Software Foundation; either version 3, or (at your option) any later
12*e4b17023SJohn Marino version.
13*e4b17023SJohn Marino
14*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15*e4b17023SJohn Marino WARRANTY; without even the implied warranty of MERCHANTABILITY or
16*e4b17023SJohn Marino FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17*e4b17023SJohn Marino for more details.
18*e4b17023SJohn Marino
19*e4b17023SJohn Marino You should have received a copy of the GNU General Public License
20*e4b17023SJohn Marino along with GCC; see the file COPYING3. If not see
21*e4b17023SJohn Marino <http://www.gnu.org/licenses/>. */
22*e4b17023SJohn Marino
23*e4b17023SJohn Marino #include "config.h"
24*e4b17023SJohn Marino #include "system.h"
25*e4b17023SJohn Marino #include "version.h"
26*e4b17023SJohn Marino #ifdef index
27*e4b17023SJohn Marino #undef index
28*e4b17023SJohn Marino #endif
29*e4b17023SJohn Marino #include <a.out.h>
30*e4b17023SJohn Marino
31*e4b17023SJohn Marino /* Include getopt.h for the sake of getopt_long. */
32*e4b17023SJohn Marino #include "getopt.h"
33*e4b17023SJohn Marino
34*e4b17023SJohn Marino /* Macros for mips-tfile.c to encapsulate stabs in ECOFF, and for
35*e4b17023SJohn Marino mips-tdump.c to print them out.
36*e4b17023SJohn Marino
37*e4b17023SJohn Marino These must match the corresponding definitions in gdb/mipsread.c.
38*e4b17023SJohn Marino Unfortunately, gcc and gdb do not currently share any directories. */
39*e4b17023SJohn Marino
40*e4b17023SJohn Marino #define CODE_MASK 0x8F300
41*e4b17023SJohn Marino #define MIPS_IS_STAB(sym) (((sym)->index & 0xFFF00) == CODE_MASK)
42*e4b17023SJohn Marino #define MIPS_MARK_STAB(code) ((code)+CODE_MASK)
43*e4b17023SJohn Marino #define MIPS_UNMARK_STAB(code) ((code)-CODE_MASK)
44*e4b17023SJohn Marino
45*e4b17023SJohn Marino #define uchar unsigned char
46*e4b17023SJohn Marino #define ushort unsigned short
47*e4b17023SJohn Marino #define uint unsigned int
48*e4b17023SJohn Marino #define ulong unsigned long
49*e4b17023SJohn Marino
50*e4b17023SJohn Marino
51*e4b17023SJohn Marino /* Redefinition of storage classes as an enumeration for better
52*e4b17023SJohn Marino debugging. */
53*e4b17023SJohn Marino
54*e4b17023SJohn Marino #ifndef stStaParam
55*e4b17023SJohn Marino #define stStaParam 16 /* Fortran static parameters */
56*e4b17023SJohn Marino #endif
57*e4b17023SJohn Marino
58*e4b17023SJohn Marino #ifndef btVoid
59*e4b17023SJohn Marino #define btVoid 26 /* void basic type */
60*e4b17023SJohn Marino #endif
61*e4b17023SJohn Marino
62*e4b17023SJohn Marino typedef enum sc {
63*e4b17023SJohn Marino sc_Nil = scNil, /* no storage class */
64*e4b17023SJohn Marino sc_Text = scText, /* text symbol */
65*e4b17023SJohn Marino sc_Data = scData, /* initialized data symbol */
66*e4b17023SJohn Marino sc_Bss = scBss, /* un-initialized data symbol */
67*e4b17023SJohn Marino sc_Register = scRegister, /* value of symbol is register number */
68*e4b17023SJohn Marino sc_Abs = scAbs, /* value of symbol is absolute */
69*e4b17023SJohn Marino sc_Undefined = scUndefined, /* who knows? */
70*e4b17023SJohn Marino sc_CdbLocal = scCdbLocal, /* variable's value is IN se->va.?? */
71*e4b17023SJohn Marino sc_Bits = scBits, /* this is a bit field */
72*e4b17023SJohn Marino sc_CdbSystem = scCdbSystem, /* var's value is IN CDB's address space */
73*e4b17023SJohn Marino sc_RegImage = scRegImage, /* register value saved on stack */
74*e4b17023SJohn Marino sc_Info = scInfo, /* symbol contains debugger information */
75*e4b17023SJohn Marino sc_UserStruct = scUserStruct, /* addr in struct user for current process */
76*e4b17023SJohn Marino sc_SData = scSData, /* load time only small data */
77*e4b17023SJohn Marino sc_SBss = scSBss, /* load time only small common */
78*e4b17023SJohn Marino sc_RData = scRData, /* load time only read only data */
79*e4b17023SJohn Marino sc_Var = scVar, /* Var parameter (fortran,pascal) */
80*e4b17023SJohn Marino sc_Common = scCommon, /* common variable */
81*e4b17023SJohn Marino sc_SCommon = scSCommon, /* small common */
82*e4b17023SJohn Marino sc_VarRegister = scVarRegister, /* Var parameter in a register */
83*e4b17023SJohn Marino sc_Variant = scVariant, /* Variant record */
84*e4b17023SJohn Marino sc_SUndefined = scSUndefined, /* small undefined(external) data */
85*e4b17023SJohn Marino sc_Init = scInit, /* .init section symbol */
86*e4b17023SJohn Marino sc_Max = scMax /* Max storage class+1 */
87*e4b17023SJohn Marino } sc_t;
88*e4b17023SJohn Marino
89*e4b17023SJohn Marino /* Redefinition of symbol type. */
90*e4b17023SJohn Marino
91*e4b17023SJohn Marino typedef enum st {
92*e4b17023SJohn Marino st_Nil = stNil, /* Nuthin' special */
93*e4b17023SJohn Marino st_Global = stGlobal, /* external symbol */
94*e4b17023SJohn Marino st_Static = stStatic, /* static */
95*e4b17023SJohn Marino st_Param = stParam, /* procedure argument */
96*e4b17023SJohn Marino st_Local = stLocal, /* local variable */
97*e4b17023SJohn Marino st_Label = stLabel, /* label */
98*e4b17023SJohn Marino st_Proc = stProc, /* " " Procedure */
99*e4b17023SJohn Marino st_Block = stBlock, /* beginning of block */
100*e4b17023SJohn Marino st_End = stEnd, /* end (of anything) */
101*e4b17023SJohn Marino st_Member = stMember, /* member (of anything - struct/union/enum */
102*e4b17023SJohn Marino st_Typedef = stTypedef, /* type definition */
103*e4b17023SJohn Marino st_File = stFile, /* file name */
104*e4b17023SJohn Marino st_RegReloc = stRegReloc, /* register relocation */
105*e4b17023SJohn Marino st_Forward = stForward, /* forwarding address */
106*e4b17023SJohn Marino st_StaticProc = stStaticProc, /* load time only static procs */
107*e4b17023SJohn Marino st_StaParam = stStaParam, /* Fortran static parameters */
108*e4b17023SJohn Marino st_Constant = stConstant, /* const */
109*e4b17023SJohn Marino #ifdef stStruct
110*e4b17023SJohn Marino st_Struct = stStruct, /* struct */
111*e4b17023SJohn Marino st_Union = stUnion, /* union */
112*e4b17023SJohn Marino st_Enum = stEnum, /* enum */
113*e4b17023SJohn Marino #endif
114*e4b17023SJohn Marino st_Str = stStr, /* string */
115*e4b17023SJohn Marino st_Number = stNumber, /* pure number (i.e. 4 NOR 2+2) */
116*e4b17023SJohn Marino st_Expr = stExpr, /* 2+2 vs. 4 */
117*e4b17023SJohn Marino st_Type = stType, /* post-coercion SER */
118*e4b17023SJohn Marino st_Max = stMax /* max type+1 */
119*e4b17023SJohn Marino } st_t;
120*e4b17023SJohn Marino
121*e4b17023SJohn Marino /* Redefinition of type qualifiers. */
122*e4b17023SJohn Marino
123*e4b17023SJohn Marino typedef enum tq {
124*e4b17023SJohn Marino tq_Nil = tqNil, /* bt is what you see */
125*e4b17023SJohn Marino tq_Ptr = tqPtr, /* pointer */
126*e4b17023SJohn Marino tq_Proc = tqProc, /* procedure */
127*e4b17023SJohn Marino tq_Array = tqArray, /* duh */
128*e4b17023SJohn Marino tq_Far = tqFar, /* longer addressing - 8086/8 land */
129*e4b17023SJohn Marino tq_Vol = tqVol, /* volatile */
130*e4b17023SJohn Marino tq_Max = tqMax /* Max type qualifier+1 */
131*e4b17023SJohn Marino } tq_t;
132*e4b17023SJohn Marino
133*e4b17023SJohn Marino /* Redefinition of basic types. */
134*e4b17023SJohn Marino
135*e4b17023SJohn Marino typedef enum bt {
136*e4b17023SJohn Marino bt_Nil = btNil, /* undefined */
137*e4b17023SJohn Marino bt_Adr = btAdr, /* address - integer same size as pointer */
138*e4b17023SJohn Marino bt_Char = btChar, /* character */
139*e4b17023SJohn Marino bt_UChar = btUChar, /* unsigned character */
140*e4b17023SJohn Marino bt_Short = btShort, /* short */
141*e4b17023SJohn Marino bt_UShort = btUShort, /* unsigned short */
142*e4b17023SJohn Marino bt_Int = btInt, /* int */
143*e4b17023SJohn Marino bt_UInt = btUInt, /* unsigned int */
144*e4b17023SJohn Marino bt_Long = btLong, /* long */
145*e4b17023SJohn Marino bt_ULong = btULong, /* unsigned long */
146*e4b17023SJohn Marino bt_Float = btFloat, /* float (real) */
147*e4b17023SJohn Marino bt_Double = btDouble, /* Double (real) */
148*e4b17023SJohn Marino bt_Struct = btStruct, /* Structure (Record) */
149*e4b17023SJohn Marino bt_Union = btUnion, /* Union (variant) */
150*e4b17023SJohn Marino bt_Enum = btEnum, /* Enumerated */
151*e4b17023SJohn Marino bt_Typedef = btTypedef, /* defined via a typedef, isymRef points */
152*e4b17023SJohn Marino bt_Range = btRange, /* subrange of int */
153*e4b17023SJohn Marino bt_Set = btSet, /* pascal sets */
154*e4b17023SJohn Marino bt_Complex = btComplex, /* fortran complex */
155*e4b17023SJohn Marino bt_DComplex = btDComplex, /* fortran double complex */
156*e4b17023SJohn Marino bt_Indirect = btIndirect, /* forward or unnamed typedef */
157*e4b17023SJohn Marino bt_FixedDec = btFixedDec, /* Fixed Decimal */
158*e4b17023SJohn Marino bt_FloatDec = btFloatDec, /* Float Decimal */
159*e4b17023SJohn Marino bt_String = btString, /* Varying Length Character String */
160*e4b17023SJohn Marino bt_Bit = btBit, /* Aligned Bit String */
161*e4b17023SJohn Marino bt_Picture = btPicture, /* Picture */
162*e4b17023SJohn Marino bt_Void = btVoid, /* void */
163*e4b17023SJohn Marino bt_Max = btMax /* Max basic type+1 */
164*e4b17023SJohn Marino } bt_t;
165*e4b17023SJohn Marino
166*e4b17023SJohn Marino /* Redefinition of the language codes. */
167*e4b17023SJohn Marino
168*e4b17023SJohn Marino typedef enum lang {
169*e4b17023SJohn Marino lang_C = langC,
170*e4b17023SJohn Marino lang_Pascal = langPascal,
171*e4b17023SJohn Marino lang_Fortran = langFortran,
172*e4b17023SJohn Marino lang_Assembler = langAssembler,
173*e4b17023SJohn Marino lang_Machine = langMachine,
174*e4b17023SJohn Marino lang_Nil = langNil,
175*e4b17023SJohn Marino lang_Ada = langAda,
176*e4b17023SJohn Marino lang_Pl1 = langPl1,
177*e4b17023SJohn Marino lang_Cobol = langCobol
178*e4b17023SJohn Marino } lang_t;
179*e4b17023SJohn Marino
180*e4b17023SJohn Marino /* Redefinition of the debug level codes. */
181*e4b17023SJohn Marino
182*e4b17023SJohn Marino typedef enum glevel {
183*e4b17023SJohn Marino glevel_0 = GLEVEL_0,
184*e4b17023SJohn Marino glevel_1 = GLEVEL_1,
185*e4b17023SJohn Marino glevel_2 = GLEVEL_2,
186*e4b17023SJohn Marino glevel_3 = GLEVEL_3
187*e4b17023SJohn Marino } glevel_t;
188*e4b17023SJohn Marino
189*e4b17023SJohn Marino
190*e4b17023SJohn Marino /* Keep track of the active scopes. */
191*e4b17023SJohn Marino typedef struct scope {
192*e4b17023SJohn Marino struct scope *prev; /* previous scope */
193*e4b17023SJohn Marino ulong open_sym; /* symbol opening scope */
194*e4b17023SJohn Marino sc_t sc; /* storage class */
195*e4b17023SJohn Marino st_t st; /* symbol type */
196*e4b17023SJohn Marino } scope_t;
197*e4b17023SJohn Marino
198*e4b17023SJohn Marino struct filehdr global_hdr; /* a.out header */
199*e4b17023SJohn Marino
200*e4b17023SJohn Marino int errors = 0; /* # of errors */
201*e4b17023SJohn Marino int want_aux = 0; /* print aux table */
202*e4b17023SJohn Marino int want_line = 0; /* print line numbers */
203*e4b17023SJohn Marino int want_rfd = 0; /* print relative file desc's */
204*e4b17023SJohn Marino int want_scope = 0; /* print scopes for every symbol */
205*e4b17023SJohn Marino int tfile = 0; /* no global header file */
206*e4b17023SJohn Marino int version = 0; /* print version # */
207*e4b17023SJohn Marino int verbose = 0;
208*e4b17023SJohn Marino int tfile_fd; /* file descriptor of .T file */
209*e4b17023SJohn Marino off_t tfile_offset; /* current offset in .T file */
210*e4b17023SJohn Marino scope_t *cur_scope = 0; /* list of active scopes */
211*e4b17023SJohn Marino scope_t *free_scope = 0; /* list of freed scopes */
212*e4b17023SJohn Marino HDRR sym_hdr; /* symbolic header */
213*e4b17023SJohn Marino char *l_strings; /* local strings */
214*e4b17023SJohn Marino char *e_strings; /* external strings */
215*e4b17023SJohn Marino SYMR *l_symbols; /* local symbols */
216*e4b17023SJohn Marino EXTR *e_symbols; /* external symbols */
217*e4b17023SJohn Marino LINER *lines; /* line numbers */
218*e4b17023SJohn Marino DNR *dense_nums; /* dense numbers */
219*e4b17023SJohn Marino OPTR *opt_symbols; /* optimization symbols */
220*e4b17023SJohn Marino AUXU *aux_symbols; /* Auxiliary symbols */
221*e4b17023SJohn Marino char *aux_used; /* map of which aux syms are used */
222*e4b17023SJohn Marino FDR *file_desc; /* file tables */
223*e4b17023SJohn Marino ulong *rfile_desc; /* relative file tables */
224*e4b17023SJohn Marino PDR *proc_desc; /* procedure tables */
225*e4b17023SJohn Marino
226*e4b17023SJohn Marino /* Forward reference for functions. */
227*e4b17023SJohn Marino static void *read_seek (void *, size_t, off_t, const char *);
228*e4b17023SJohn Marino static void read_tfile (void);
229*e4b17023SJohn Marino static void print_global_hdr (struct filehdr *);
230*e4b17023SJohn Marino static void print_sym_hdr (HDRR *);
231*e4b17023SJohn Marino static void print_file_desc (FDR *, int);
232*e4b17023SJohn Marino static void print_symbol (SYMR *, int, const char *, AUXU *, int, FDR *);
233*e4b17023SJohn Marino static void print_aux (AUXU, int, int);
234*e4b17023SJohn Marino static void emit_aggregate (char *, AUXU, AUXU, const char *, FDR *);
235*e4b17023SJohn Marino static const char *st_to_string (st_t);
236*e4b17023SJohn Marino static const char *sc_to_string (sc_t);
237*e4b17023SJohn Marino static const char *glevel_to_string (glevel_t);
238*e4b17023SJohn Marino static const char *lang_to_string (lang_t);
239*e4b17023SJohn Marino static const char *type_to_string (AUXU *, int, FDR *);
240*e4b17023SJohn Marino
241*e4b17023SJohn Marino extern char *optarg;
242*e4b17023SJohn Marino extern int optind;
243*e4b17023SJohn Marino extern int opterr;
244*e4b17023SJohn Marino
245*e4b17023SJohn Marino /* Create a table of debugging stab-codes and corresponding names. */
246*e4b17023SJohn Marino
247*e4b17023SJohn Marino #define __define_stab(NAME, CODE, STRING) {(int)CODE, STRING},
248*e4b17023SJohn Marino const struct {const short code; const char string[10];} stab_names[] = {
249*e4b17023SJohn Marino #include "stab.def"
250*e4b17023SJohn Marino #undef __define_stab
251*e4b17023SJohn Marino };
252*e4b17023SJohn Marino
253*e4b17023SJohn Marino /* Command line options for getopt_long. */
254*e4b17023SJohn Marino
255*e4b17023SJohn Marino static const struct option options[] =
256*e4b17023SJohn Marino {
257*e4b17023SJohn Marino { "version", 0, 0, 'V' },
258*e4b17023SJohn Marino { "verbose", 0, 0, 'v' },
259*e4b17023SJohn Marino { 0, 0, 0, 0 }
260*e4b17023SJohn Marino };
261*e4b17023SJohn Marino
262*e4b17023SJohn Marino /* Read some bytes at a specified location, and return a pointer.
263*e4b17023SJohn Marino Read_seek takes a pointer PTR to a buffer or NULL and reads SIZE
264*e4b17023SJohn Marino bytes from offset OFFSET. In case of errors CONTEXT is used as
265*e4b17023SJohn Marino error message. */
266*e4b17023SJohn Marino
267*e4b17023SJohn Marino static void *
read_seek(void * ptr,size_t size,off_t offset,const char * context)268*e4b17023SJohn Marino read_seek (void *ptr, size_t size, off_t offset, const char *context)
269*e4b17023SJohn Marino {
270*e4b17023SJohn Marino long read_size = 0;
271*e4b17023SJohn Marino
272*e4b17023SJohn Marino if (size == 0) /* nothing to read */
273*e4b17023SJohn Marino return ptr;
274*e4b17023SJohn Marino
275*e4b17023SJohn Marino if (!ptr)
276*e4b17023SJohn Marino ptr = xmalloc (size);
277*e4b17023SJohn Marino
278*e4b17023SJohn Marino if ((tfile_offset != offset && lseek (tfile_fd, offset, 0) == -1)
279*e4b17023SJohn Marino || (read_size = read (tfile_fd, ptr, size)) < 0)
280*e4b17023SJohn Marino {
281*e4b17023SJohn Marino perror (context);
282*e4b17023SJohn Marino exit (1);
283*e4b17023SJohn Marino }
284*e4b17023SJohn Marino
285*e4b17023SJohn Marino if (read_size != (long) size)
286*e4b17023SJohn Marino {
287*e4b17023SJohn Marino fprintf (stderr, "%s: read %ld bytes, expected %ld bytes\n",
288*e4b17023SJohn Marino context, read_size, (long) size);
289*e4b17023SJohn Marino exit (1);
290*e4b17023SJohn Marino }
291*e4b17023SJohn Marino
292*e4b17023SJohn Marino tfile_offset = offset + size;
293*e4b17023SJohn Marino return ptr;
294*e4b17023SJohn Marino }
295*e4b17023SJohn Marino
296*e4b17023SJohn Marino
297*e4b17023SJohn Marino /* Convert language code to string format. */
298*e4b17023SJohn Marino
299*e4b17023SJohn Marino static const char *
lang_to_string(lang_t lang)300*e4b17023SJohn Marino lang_to_string (lang_t lang)
301*e4b17023SJohn Marino {
302*e4b17023SJohn Marino switch (lang)
303*e4b17023SJohn Marino {
304*e4b17023SJohn Marino case langC: return "C";
305*e4b17023SJohn Marino case langPascal: return "Pascal";
306*e4b17023SJohn Marino case langFortran: return "Fortran";
307*e4b17023SJohn Marino case langAssembler: return "Assembler";
308*e4b17023SJohn Marino case langMachine: return "Machine";
309*e4b17023SJohn Marino case langNil: return "Nil";
310*e4b17023SJohn Marino case langAda: return "Ada";
311*e4b17023SJohn Marino case langPl1: return "Pl1";
312*e4b17023SJohn Marino case langCobol: return "Cobol";
313*e4b17023SJohn Marino }
314*e4b17023SJohn Marino
315*e4b17023SJohn Marino return "Unknown language";
316*e4b17023SJohn Marino }
317*e4b17023SJohn Marino
318*e4b17023SJohn Marino
319*e4b17023SJohn Marino /* Convert storage class to string. */
320*e4b17023SJohn Marino
321*e4b17023SJohn Marino static const char *
sc_to_string(sc_t storage_class)322*e4b17023SJohn Marino sc_to_string (sc_t storage_class)
323*e4b17023SJohn Marino {
324*e4b17023SJohn Marino switch(storage_class)
325*e4b17023SJohn Marino {
326*e4b17023SJohn Marino case sc_Nil: return "Nil";
327*e4b17023SJohn Marino case sc_Text: return "Text";
328*e4b17023SJohn Marino case sc_Data: return "Data";
329*e4b17023SJohn Marino case sc_Bss: return "Bss";
330*e4b17023SJohn Marino case sc_Register: return "Register";
331*e4b17023SJohn Marino case sc_Abs: return "Abs";
332*e4b17023SJohn Marino case sc_Undefined: return "Undefined";
333*e4b17023SJohn Marino case sc_CdbLocal: return "CdbLocal";
334*e4b17023SJohn Marino case sc_Bits: return "Bits";
335*e4b17023SJohn Marino case sc_CdbSystem: return "CdbSystem";
336*e4b17023SJohn Marino case sc_RegImage: return "RegImage";
337*e4b17023SJohn Marino case sc_Info: return "Info";
338*e4b17023SJohn Marino case sc_UserStruct: return "UserStruct";
339*e4b17023SJohn Marino case sc_SData: return "SData";
340*e4b17023SJohn Marino case sc_SBss: return "SBss";
341*e4b17023SJohn Marino case sc_RData: return "RData";
342*e4b17023SJohn Marino case sc_Var: return "Var";
343*e4b17023SJohn Marino case sc_Common: return "Common";
344*e4b17023SJohn Marino case sc_SCommon: return "SCommon";
345*e4b17023SJohn Marino case sc_VarRegister: return "VarRegister";
346*e4b17023SJohn Marino case sc_Variant: return "Variant";
347*e4b17023SJohn Marino case sc_SUndefined: return "SUndefined";
348*e4b17023SJohn Marino case sc_Init: return "Init";
349*e4b17023SJohn Marino case sc_Max: return "Max";
350*e4b17023SJohn Marino }
351*e4b17023SJohn Marino
352*e4b17023SJohn Marino return "???";
353*e4b17023SJohn Marino }
354*e4b17023SJohn Marino
355*e4b17023SJohn Marino
356*e4b17023SJohn Marino /* Convert symbol type to string. */
357*e4b17023SJohn Marino
358*e4b17023SJohn Marino static const char *
st_to_string(st_t symbol_type)359*e4b17023SJohn Marino st_to_string (st_t symbol_type)
360*e4b17023SJohn Marino {
361*e4b17023SJohn Marino switch(symbol_type)
362*e4b17023SJohn Marino {
363*e4b17023SJohn Marino case st_Nil: return "Nil";
364*e4b17023SJohn Marino case st_Global: return "Global";
365*e4b17023SJohn Marino case st_Static: return "Static";
366*e4b17023SJohn Marino case st_Param: return "Param";
367*e4b17023SJohn Marino case st_Local: return "Local";
368*e4b17023SJohn Marino case st_Label: return "Label";
369*e4b17023SJohn Marino case st_Proc: return "Proc";
370*e4b17023SJohn Marino case st_Block: return "Block";
371*e4b17023SJohn Marino case st_End: return "End";
372*e4b17023SJohn Marino case st_Member: return "Member";
373*e4b17023SJohn Marino case st_Typedef: return "Typedef";
374*e4b17023SJohn Marino case st_File: return "File";
375*e4b17023SJohn Marino case st_RegReloc: return "RegReloc";
376*e4b17023SJohn Marino case st_Forward: return "Forward";
377*e4b17023SJohn Marino case st_StaticProc: return "StaticProc";
378*e4b17023SJohn Marino case st_Constant: return "Constant";
379*e4b17023SJohn Marino case st_StaParam: return "StaticParam";
380*e4b17023SJohn Marino #ifdef stStruct
381*e4b17023SJohn Marino case st_Struct: return "Struct";
382*e4b17023SJohn Marino case st_Union: return "Union";
383*e4b17023SJohn Marino case st_Enum: return "Enum";
384*e4b17023SJohn Marino #endif
385*e4b17023SJohn Marino case st_Str: return "String";
386*e4b17023SJohn Marino case st_Number: return "Number";
387*e4b17023SJohn Marino case st_Expr: return "Expr";
388*e4b17023SJohn Marino case st_Type: return "Type";
389*e4b17023SJohn Marino case st_Max: return "Max";
390*e4b17023SJohn Marino }
391*e4b17023SJohn Marino
392*e4b17023SJohn Marino return "???";
393*e4b17023SJohn Marino }
394*e4b17023SJohn Marino
395*e4b17023SJohn Marino
396*e4b17023SJohn Marino /* Convert debug level to string. */
397*e4b17023SJohn Marino
398*e4b17023SJohn Marino static const char *
glevel_to_string(glevel_t g_level)399*e4b17023SJohn Marino glevel_to_string (glevel_t g_level)
400*e4b17023SJohn Marino {
401*e4b17023SJohn Marino switch(g_level)
402*e4b17023SJohn Marino {
403*e4b17023SJohn Marino case GLEVEL_0: return "G0";
404*e4b17023SJohn Marino case GLEVEL_1: return "G1";
405*e4b17023SJohn Marino case GLEVEL_2: return "G2";
406*e4b17023SJohn Marino case GLEVEL_3: return "G3";
407*e4b17023SJohn Marino }
408*e4b17023SJohn Marino
409*e4b17023SJohn Marino return "??";
410*e4b17023SJohn Marino }
411*e4b17023SJohn Marino
412*e4b17023SJohn Marino
413*e4b17023SJohn Marino /* Convert the type information to string format. */
414*e4b17023SJohn Marino
415*e4b17023SJohn Marino static const char *
type_to_string(AUXU * aux_ptr,int index,FDR * fdp)416*e4b17023SJohn Marino type_to_string (AUXU *aux_ptr, int index, FDR *fdp)
417*e4b17023SJohn Marino {
418*e4b17023SJohn Marino AUXU u;
419*e4b17023SJohn Marino struct qual {
420*e4b17023SJohn Marino tq_t type;
421*e4b17023SJohn Marino int low_bound;
422*e4b17023SJohn Marino int high_bound;
423*e4b17023SJohn Marino int stride;
424*e4b17023SJohn Marino } qualifiers[7];
425*e4b17023SJohn Marino
426*e4b17023SJohn Marino bt_t basic_type;
427*e4b17023SJohn Marino int i;
428*e4b17023SJohn Marino static char buffer1[1024];
429*e4b17023SJohn Marino static char buffer2[1024];
430*e4b17023SJohn Marino char *p1 = buffer1;
431*e4b17023SJohn Marino char *p2 = buffer2;
432*e4b17023SJohn Marino char *used_ptr = aux_used + (aux_ptr - aux_symbols);
433*e4b17023SJohn Marino
434*e4b17023SJohn Marino for (i = 0; i < 7; i++)
435*e4b17023SJohn Marino {
436*e4b17023SJohn Marino qualifiers[i].low_bound = 0;
437*e4b17023SJohn Marino qualifiers[i].high_bound = 0;
438*e4b17023SJohn Marino qualifiers[i].stride = 0;
439*e4b17023SJohn Marino }
440*e4b17023SJohn Marino
441*e4b17023SJohn Marino used_ptr[index] = 1;
442*e4b17023SJohn Marino u = aux_ptr[index++];
443*e4b17023SJohn Marino if (u.isym == -1)
444*e4b17023SJohn Marino return "-1 (no type)";
445*e4b17023SJohn Marino
446*e4b17023SJohn Marino basic_type = (bt_t) u.ti.bt;
447*e4b17023SJohn Marino qualifiers[0].type = (tq_t) u.ti.tq0;
448*e4b17023SJohn Marino qualifiers[1].type = (tq_t) u.ti.tq1;
449*e4b17023SJohn Marino qualifiers[2].type = (tq_t) u.ti.tq2;
450*e4b17023SJohn Marino qualifiers[3].type = (tq_t) u.ti.tq3;
451*e4b17023SJohn Marino qualifiers[4].type = (tq_t) u.ti.tq4;
452*e4b17023SJohn Marino qualifiers[5].type = (tq_t) u.ti.tq5;
453*e4b17023SJohn Marino qualifiers[6].type = tq_Nil;
454*e4b17023SJohn Marino
455*e4b17023SJohn Marino /*
456*e4b17023SJohn Marino * Go get the basic type.
457*e4b17023SJohn Marino */
458*e4b17023SJohn Marino switch (basic_type)
459*e4b17023SJohn Marino {
460*e4b17023SJohn Marino case bt_Nil: /* undefined */
461*e4b17023SJohn Marino strcpy (p1, "nil");
462*e4b17023SJohn Marino break;
463*e4b17023SJohn Marino
464*e4b17023SJohn Marino case bt_Adr: /* address - integer same size as pointer */
465*e4b17023SJohn Marino strcpy (p1, "address");
466*e4b17023SJohn Marino break;
467*e4b17023SJohn Marino
468*e4b17023SJohn Marino case bt_Char: /* character */
469*e4b17023SJohn Marino strcpy (p1, "char");
470*e4b17023SJohn Marino break;
471*e4b17023SJohn Marino
472*e4b17023SJohn Marino case bt_UChar: /* unsigned character */
473*e4b17023SJohn Marino strcpy (p1, "unsigned char");
474*e4b17023SJohn Marino break;
475*e4b17023SJohn Marino
476*e4b17023SJohn Marino case bt_Short: /* short */
477*e4b17023SJohn Marino strcpy (p1, "short");
478*e4b17023SJohn Marino break;
479*e4b17023SJohn Marino
480*e4b17023SJohn Marino case bt_UShort: /* unsigned short */
481*e4b17023SJohn Marino strcpy (p1, "unsigned short");
482*e4b17023SJohn Marino break;
483*e4b17023SJohn Marino
484*e4b17023SJohn Marino case bt_Int: /* int */
485*e4b17023SJohn Marino strcpy (p1, "int");
486*e4b17023SJohn Marino break;
487*e4b17023SJohn Marino
488*e4b17023SJohn Marino case bt_UInt: /* unsigned int */
489*e4b17023SJohn Marino strcpy (p1, "unsigned int");
490*e4b17023SJohn Marino break;
491*e4b17023SJohn Marino
492*e4b17023SJohn Marino case bt_Long: /* long */
493*e4b17023SJohn Marino strcpy (p1, "long");
494*e4b17023SJohn Marino break;
495*e4b17023SJohn Marino
496*e4b17023SJohn Marino case bt_ULong: /* unsigned long */
497*e4b17023SJohn Marino strcpy (p1, "unsigned long");
498*e4b17023SJohn Marino break;
499*e4b17023SJohn Marino
500*e4b17023SJohn Marino case bt_Float: /* float (real) */
501*e4b17023SJohn Marino strcpy (p1, "float");
502*e4b17023SJohn Marino break;
503*e4b17023SJohn Marino
504*e4b17023SJohn Marino case bt_Double: /* Double (real) */
505*e4b17023SJohn Marino strcpy (p1, "double");
506*e4b17023SJohn Marino break;
507*e4b17023SJohn Marino
508*e4b17023SJohn Marino /* Structures add 1-2 aux words:
509*e4b17023SJohn Marino 1st word is [ST_RFDESCAPE, offset] pointer to struct def;
510*e4b17023SJohn Marino 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
511*e4b17023SJohn Marino
512*e4b17023SJohn Marino case bt_Struct: /* Structure (Record) */
513*e4b17023SJohn Marino emit_aggregate (p1, aux_ptr[index], aux_ptr[index+1], "struct", fdp);
514*e4b17023SJohn Marino used_ptr[index] = 1;
515*e4b17023SJohn Marino if (aux_ptr[index].rndx.rfd == ST_RFDESCAPE)
516*e4b17023SJohn Marino used_ptr[++index] = 1;
517*e4b17023SJohn Marino
518*e4b17023SJohn Marino index++; /* skip aux words */
519*e4b17023SJohn Marino break;
520*e4b17023SJohn Marino
521*e4b17023SJohn Marino /* Unions add 1-2 aux words:
522*e4b17023SJohn Marino 1st word is [ST_RFDESCAPE, offset] pointer to union def;
523*e4b17023SJohn Marino 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
524*e4b17023SJohn Marino
525*e4b17023SJohn Marino case bt_Union: /* Union */
526*e4b17023SJohn Marino emit_aggregate (p1, aux_ptr[index], aux_ptr[index+1], "union", fdp);
527*e4b17023SJohn Marino used_ptr[index] = 1;
528*e4b17023SJohn Marino if (aux_ptr[index].rndx.rfd == ST_RFDESCAPE)
529*e4b17023SJohn Marino used_ptr[++index] = 1;
530*e4b17023SJohn Marino
531*e4b17023SJohn Marino index++; /* skip aux words */
532*e4b17023SJohn Marino break;
533*e4b17023SJohn Marino
534*e4b17023SJohn Marino /* Enumerations add 1-2 aux words:
535*e4b17023SJohn Marino 1st word is [ST_RFDESCAPE, offset] pointer to enum def;
536*e4b17023SJohn Marino 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
537*e4b17023SJohn Marino
538*e4b17023SJohn Marino case bt_Enum: /* Enumeration */
539*e4b17023SJohn Marino emit_aggregate (p1, aux_ptr[index], aux_ptr[index+1], "enum", fdp);
540*e4b17023SJohn Marino used_ptr[index] = 1;
541*e4b17023SJohn Marino if (aux_ptr[index].rndx.rfd == ST_RFDESCAPE)
542*e4b17023SJohn Marino used_ptr[++index] = 1;
543*e4b17023SJohn Marino
544*e4b17023SJohn Marino index++; /* skip aux words */
545*e4b17023SJohn Marino break;
546*e4b17023SJohn Marino
547*e4b17023SJohn Marino case bt_Typedef: /* defined via a typedef, isymRef points */
548*e4b17023SJohn Marino strcpy (p1, "typedef");
549*e4b17023SJohn Marino break;
550*e4b17023SJohn Marino
551*e4b17023SJohn Marino case bt_Range: /* subrange of int */
552*e4b17023SJohn Marino strcpy (p1, "subrange");
553*e4b17023SJohn Marino break;
554*e4b17023SJohn Marino
555*e4b17023SJohn Marino case bt_Set: /* pascal sets */
556*e4b17023SJohn Marino strcpy (p1, "set");
557*e4b17023SJohn Marino break;
558*e4b17023SJohn Marino
559*e4b17023SJohn Marino case bt_Complex: /* fortran complex */
560*e4b17023SJohn Marino strcpy (p1, "complex");
561*e4b17023SJohn Marino break;
562*e4b17023SJohn Marino
563*e4b17023SJohn Marino case bt_DComplex: /* fortran double complex */
564*e4b17023SJohn Marino strcpy (p1, "double complex");
565*e4b17023SJohn Marino break;
566*e4b17023SJohn Marino
567*e4b17023SJohn Marino case bt_Indirect: /* forward or unnamed typedef */
568*e4b17023SJohn Marino strcpy (p1, "forward/unnamed typedef");
569*e4b17023SJohn Marino break;
570*e4b17023SJohn Marino
571*e4b17023SJohn Marino case bt_FixedDec: /* Fixed Decimal */
572*e4b17023SJohn Marino strcpy (p1, "fixed decimal");
573*e4b17023SJohn Marino break;
574*e4b17023SJohn Marino
575*e4b17023SJohn Marino case bt_FloatDec: /* Float Decimal */
576*e4b17023SJohn Marino strcpy (p1, "float decimal");
577*e4b17023SJohn Marino break;
578*e4b17023SJohn Marino
579*e4b17023SJohn Marino case bt_String: /* Varying Length Character String */
580*e4b17023SJohn Marino strcpy (p1, "string");
581*e4b17023SJohn Marino break;
582*e4b17023SJohn Marino
583*e4b17023SJohn Marino case bt_Bit: /* Aligned Bit String */
584*e4b17023SJohn Marino strcpy (p1, "bit");
585*e4b17023SJohn Marino break;
586*e4b17023SJohn Marino
587*e4b17023SJohn Marino case bt_Picture: /* Picture */
588*e4b17023SJohn Marino strcpy (p1, "picture");
589*e4b17023SJohn Marino break;
590*e4b17023SJohn Marino
591*e4b17023SJohn Marino case bt_Void: /* Void */
592*e4b17023SJohn Marino strcpy (p1, "void");
593*e4b17023SJohn Marino break;
594*e4b17023SJohn Marino
595*e4b17023SJohn Marino default:
596*e4b17023SJohn Marino sprintf (p1, "Unknown basic type %d", (int) basic_type);
597*e4b17023SJohn Marino break;
598*e4b17023SJohn Marino }
599*e4b17023SJohn Marino
600*e4b17023SJohn Marino p1 += strlen (buffer1);
601*e4b17023SJohn Marino
602*e4b17023SJohn Marino /*
603*e4b17023SJohn Marino * If this is a bitfield, get the bitsize.
604*e4b17023SJohn Marino */
605*e4b17023SJohn Marino if (u.ti.fBitfield)
606*e4b17023SJohn Marino {
607*e4b17023SJohn Marino int bitsize;
608*e4b17023SJohn Marino
609*e4b17023SJohn Marino used_ptr[index] = 1;
610*e4b17023SJohn Marino bitsize = aux_ptr[index++].width;
611*e4b17023SJohn Marino sprintf (p1, " : %d", bitsize);
612*e4b17023SJohn Marino p1 += strlen (buffer1);
613*e4b17023SJohn Marino }
614*e4b17023SJohn Marino
615*e4b17023SJohn Marino
616*e4b17023SJohn Marino /*
617*e4b17023SJohn Marino * Deal with any qualifiers.
618*e4b17023SJohn Marino */
619*e4b17023SJohn Marino if (qualifiers[0].type != tq_Nil)
620*e4b17023SJohn Marino {
621*e4b17023SJohn Marino /*
622*e4b17023SJohn Marino * Snarf up any array bounds in the correct order. Arrays
623*e4b17023SJohn Marino * store 5 successive words in the aux. table:
624*e4b17023SJohn Marino * word 0 RNDXR to type of the bounds (i.e., int)
625*e4b17023SJohn Marino * word 1 Current file descriptor index
626*e4b17023SJohn Marino * word 2 low bound
627*e4b17023SJohn Marino * word 3 high bound (or -1 if [])
628*e4b17023SJohn Marino * word 4 stride size in bits
629*e4b17023SJohn Marino */
630*e4b17023SJohn Marino for (i = 0; i < 7; i++)
631*e4b17023SJohn Marino {
632*e4b17023SJohn Marino if (qualifiers[i].type == tq_Array)
633*e4b17023SJohn Marino {
634*e4b17023SJohn Marino qualifiers[i].low_bound = aux_ptr[index+2].dnLow;
635*e4b17023SJohn Marino qualifiers[i].high_bound = aux_ptr[index+3].dnHigh;
636*e4b17023SJohn Marino qualifiers[i].stride = aux_ptr[index+4].width;
637*e4b17023SJohn Marino used_ptr[index] = 1;
638*e4b17023SJohn Marino used_ptr[index+1] = 1;
639*e4b17023SJohn Marino used_ptr[index+2] = 1;
640*e4b17023SJohn Marino used_ptr[index+3] = 1;
641*e4b17023SJohn Marino used_ptr[index+4] = 1;
642*e4b17023SJohn Marino index += 5;
643*e4b17023SJohn Marino }
644*e4b17023SJohn Marino }
645*e4b17023SJohn Marino
646*e4b17023SJohn Marino /*
647*e4b17023SJohn Marino * Now print out the qualifiers.
648*e4b17023SJohn Marino */
649*e4b17023SJohn Marino for (i = 0; i < 6; i++)
650*e4b17023SJohn Marino {
651*e4b17023SJohn Marino switch (qualifiers[i].type)
652*e4b17023SJohn Marino {
653*e4b17023SJohn Marino case tq_Nil:
654*e4b17023SJohn Marino case tq_Max:
655*e4b17023SJohn Marino break;
656*e4b17023SJohn Marino
657*e4b17023SJohn Marino case tq_Ptr:
658*e4b17023SJohn Marino strcpy (p2, "ptr to ");
659*e4b17023SJohn Marino p2 += sizeof ("ptr to ")-1;
660*e4b17023SJohn Marino break;
661*e4b17023SJohn Marino
662*e4b17023SJohn Marino case tq_Vol:
663*e4b17023SJohn Marino strcpy (p2, "volatile ");
664*e4b17023SJohn Marino p2 += sizeof ("volatile ")-1;
665*e4b17023SJohn Marino break;
666*e4b17023SJohn Marino
667*e4b17023SJohn Marino case tq_Far:
668*e4b17023SJohn Marino strcpy (p2, "far ");
669*e4b17023SJohn Marino p2 += sizeof ("far ")-1;
670*e4b17023SJohn Marino break;
671*e4b17023SJohn Marino
672*e4b17023SJohn Marino case tq_Proc:
673*e4b17023SJohn Marino strcpy (p2, "func. ret. ");
674*e4b17023SJohn Marino p2 += sizeof ("func. ret. ");
675*e4b17023SJohn Marino break;
676*e4b17023SJohn Marino
677*e4b17023SJohn Marino case tq_Array:
678*e4b17023SJohn Marino {
679*e4b17023SJohn Marino int first_array = i;
680*e4b17023SJohn Marino int j;
681*e4b17023SJohn Marino
682*e4b17023SJohn Marino /* Print array bounds reversed (i.e., in the order the C
683*e4b17023SJohn Marino programmer writes them). C is such a fun language.... */
684*e4b17023SJohn Marino
685*e4b17023SJohn Marino while (i < 5 && qualifiers[i+1].type == tq_Array)
686*e4b17023SJohn Marino i++;
687*e4b17023SJohn Marino
688*e4b17023SJohn Marino for (j = i; j >= first_array; j--)
689*e4b17023SJohn Marino {
690*e4b17023SJohn Marino strcpy (p2, "array [");
691*e4b17023SJohn Marino p2 += sizeof ("array [")-1;
692*e4b17023SJohn Marino if (qualifiers[j].low_bound != 0)
693*e4b17023SJohn Marino sprintf (p2,
694*e4b17023SJohn Marino "%ld:%ld {%ld bits}",
695*e4b17023SJohn Marino (long) qualifiers[j].low_bound,
696*e4b17023SJohn Marino (long) qualifiers[j].high_bound,
697*e4b17023SJohn Marino (long) qualifiers[j].stride);
698*e4b17023SJohn Marino
699*e4b17023SJohn Marino else if (qualifiers[j].high_bound != -1)
700*e4b17023SJohn Marino sprintf (p2,
701*e4b17023SJohn Marino "%ld {%ld bits}",
702*e4b17023SJohn Marino (long) (qualifiers[j].high_bound + 1),
703*e4b17023SJohn Marino (long) (qualifiers[j].stride));
704*e4b17023SJohn Marino
705*e4b17023SJohn Marino else
706*e4b17023SJohn Marino sprintf (p2, " {%ld bits}", (long) (qualifiers[j].stride));
707*e4b17023SJohn Marino
708*e4b17023SJohn Marino p2 += strlen (p2);
709*e4b17023SJohn Marino strcpy (p2, "] of ");
710*e4b17023SJohn Marino p2 += sizeof ("] of ")-1;
711*e4b17023SJohn Marino }
712*e4b17023SJohn Marino }
713*e4b17023SJohn Marino break;
714*e4b17023SJohn Marino }
715*e4b17023SJohn Marino }
716*e4b17023SJohn Marino }
717*e4b17023SJohn Marino
718*e4b17023SJohn Marino strcpy (p2, buffer1);
719*e4b17023SJohn Marino return buffer2;
720*e4b17023SJohn Marino }
721*e4b17023SJohn Marino
722*e4b17023SJohn Marino
723*e4b17023SJohn Marino /* Print out the global file header for object files. */
724*e4b17023SJohn Marino
725*e4b17023SJohn Marino static void
print_global_hdr(struct filehdr * ptr)726*e4b17023SJohn Marino print_global_hdr (struct filehdr *ptr)
727*e4b17023SJohn Marino {
728*e4b17023SJohn Marino char *time = ctime ((time_t *)&ptr->f_timdat);
729*e4b17023SJohn Marino ushort flags = ptr->f_flags;
730*e4b17023SJohn Marino
731*e4b17023SJohn Marino printf("Global file header:\n");
732*e4b17023SJohn Marino printf(" %-*s 0x%x\n", 24, "magic number", (ushort) ptr->f_magic);
733*e4b17023SJohn Marino printf(" %-*s %d\n", 24, "# sections", (int) ptr->f_nscns);
734*e4b17023SJohn Marino printf(" %-*s %ld, %s", 24, "timestamp", (long) ptr->f_timdat, time);
735*e4b17023SJohn Marino printf(" %-*s %ld\n", 24, "symbolic header offset", (long) ptr->f_symptr);
736*e4b17023SJohn Marino printf(" %-*s %ld\n", 24, "symbolic header size", (long) ptr->f_nsyms);
737*e4b17023SJohn Marino printf(" %-*s %ld\n", 24, "optional header", (long) ptr->f_opthdr);
738*e4b17023SJohn Marino printf(" %-*s 0x%x", 24, "flags", (ushort) flags);
739*e4b17023SJohn Marino
740*e4b17023SJohn Marino if ((flags & F_RELFLG) != 0)
741*e4b17023SJohn Marino printf (", F_RELFLG");
742*e4b17023SJohn Marino
743*e4b17023SJohn Marino if ((flags & F_EXEC) != 0)
744*e4b17023SJohn Marino printf (", F_EXEC");
745*e4b17023SJohn Marino
746*e4b17023SJohn Marino if ((flags & F_LNNO) != 0)
747*e4b17023SJohn Marino printf (", F_LNNO");
748*e4b17023SJohn Marino
749*e4b17023SJohn Marino if ((flags & F_LSYMS) != 0)
750*e4b17023SJohn Marino printf (", F_LSYMS");
751*e4b17023SJohn Marino
752*e4b17023SJohn Marino if ((flags & F_MINMAL) != 0)
753*e4b17023SJohn Marino printf (", F_MINMAL");
754*e4b17023SJohn Marino
755*e4b17023SJohn Marino if ((flags & F_UPDATE) != 0)
756*e4b17023SJohn Marino printf (", F_UPDATE");
757*e4b17023SJohn Marino
758*e4b17023SJohn Marino if ((flags & F_SWABD) != 0)
759*e4b17023SJohn Marino printf (", F_SWABD");
760*e4b17023SJohn Marino
761*e4b17023SJohn Marino if ((flags & F_AR16WR) != 0)
762*e4b17023SJohn Marino printf (", F_AR16WR");
763*e4b17023SJohn Marino
764*e4b17023SJohn Marino if ((flags & F_AR32WR) != 0)
765*e4b17023SJohn Marino printf (", F_AR32WR");
766*e4b17023SJohn Marino
767*e4b17023SJohn Marino if ((flags & F_AR32W) != 0)
768*e4b17023SJohn Marino printf (", F_AR32W");
769*e4b17023SJohn Marino
770*e4b17023SJohn Marino if ((flags & F_PATCH) != 0)
771*e4b17023SJohn Marino printf (", F_PATCH/F_NODF");
772*e4b17023SJohn Marino
773*e4b17023SJohn Marino printf ("\n\n");
774*e4b17023SJohn Marino }
775*e4b17023SJohn Marino
776*e4b17023SJohn Marino
777*e4b17023SJohn Marino /* Print out the symbolic header. */
778*e4b17023SJohn Marino
779*e4b17023SJohn Marino static void
print_sym_hdr(HDRR * sym_ptr)780*e4b17023SJohn Marino print_sym_hdr (HDRR *sym_ptr)
781*e4b17023SJohn Marino {
782*e4b17023SJohn Marino int width = 20;
783*e4b17023SJohn Marino
784*e4b17023SJohn Marino printf("Symbolic header, magic number = 0x%04x, vstamp = %d.%d:\n\n",
785*e4b17023SJohn Marino sym_ptr->magic & 0xffff,
786*e4b17023SJohn Marino (sym_ptr->vstamp & 0xffff) >> 8,
787*e4b17023SJohn Marino sym_ptr->vstamp & 0xff);
788*e4b17023SJohn Marino
789*e4b17023SJohn Marino printf(" %-*s %11s %11s %11s\n", width, "Info", "Offset", "Number", "Bytes");
790*e4b17023SJohn Marino printf(" %-*s %11s %11s %11s\n", width, "====", "======", "======", "=====\n");
791*e4b17023SJohn Marino
792*e4b17023SJohn Marino printf(" %-*s %11ld %11ld %11ld [%d]\n", width, "Line numbers",
793*e4b17023SJohn Marino (long) sym_ptr->cbLineOffset,
794*e4b17023SJohn Marino (long) sym_ptr->cbLine,
795*e4b17023SJohn Marino (long) sym_ptr->cbLine,
796*e4b17023SJohn Marino (int) sym_ptr->ilineMax);
797*e4b17023SJohn Marino
798*e4b17023SJohn Marino printf(" %-*s %11ld %11ld %11ld\n", width, "Dense numbers",
799*e4b17023SJohn Marino (long) sym_ptr->cbDnOffset,
800*e4b17023SJohn Marino (long) sym_ptr->idnMax,
801*e4b17023SJohn Marino (long) (sym_ptr->idnMax * sizeof (DNR)));
802*e4b17023SJohn Marino
803*e4b17023SJohn Marino printf(" %-*s %11ld %11ld %11ld\n", width, "Procedures Tables",
804*e4b17023SJohn Marino (long) sym_ptr->cbPdOffset,
805*e4b17023SJohn Marino (long) sym_ptr->ipdMax,
806*e4b17023SJohn Marino (long) (sym_ptr->ipdMax * sizeof (PDR)));
807*e4b17023SJohn Marino
808*e4b17023SJohn Marino printf(" %-*s %11ld %11ld %11ld\n", width, "Local Symbols",
809*e4b17023SJohn Marino (long) sym_ptr->cbSymOffset,
810*e4b17023SJohn Marino (long) sym_ptr->isymMax,
811*e4b17023SJohn Marino (long) (sym_ptr->isymMax * sizeof (SYMR)));
812*e4b17023SJohn Marino
813*e4b17023SJohn Marino printf(" %-*s %11ld %11ld %11ld\n", width, "Optimization Symbols",
814*e4b17023SJohn Marino (long) sym_ptr->cbOptOffset,
815*e4b17023SJohn Marino (long) sym_ptr->ioptMax,
816*e4b17023SJohn Marino (long) (sym_ptr->ioptMax * sizeof (OPTR)));
817*e4b17023SJohn Marino
818*e4b17023SJohn Marino printf(" %-*s %11ld %11ld %11ld\n", width, "Auxiliary Symbols",
819*e4b17023SJohn Marino (long) sym_ptr->cbAuxOffset,
820*e4b17023SJohn Marino (long) sym_ptr->iauxMax,
821*e4b17023SJohn Marino (long) (sym_ptr->iauxMax * sizeof (AUXU)));
822*e4b17023SJohn Marino
823*e4b17023SJohn Marino printf(" %-*s %11ld %11ld %11ld\n", width, "Local Strings",
824*e4b17023SJohn Marino (long) sym_ptr->cbSsOffset,
825*e4b17023SJohn Marino (long) sym_ptr->issMax,
826*e4b17023SJohn Marino (long) sym_ptr->issMax);
827*e4b17023SJohn Marino
828*e4b17023SJohn Marino printf(" %-*s %11ld %11ld %11ld\n", width, "External Strings",
829*e4b17023SJohn Marino (long) sym_ptr->cbSsExtOffset,
830*e4b17023SJohn Marino (long) sym_ptr->issExtMax,
831*e4b17023SJohn Marino (long) sym_ptr->issExtMax);
832*e4b17023SJohn Marino
833*e4b17023SJohn Marino printf(" %-*s %11ld %11ld %11ld\n", width, "File Tables",
834*e4b17023SJohn Marino (long) sym_ptr->cbFdOffset,
835*e4b17023SJohn Marino (long) sym_ptr->ifdMax,
836*e4b17023SJohn Marino (long) (sym_ptr->ifdMax * sizeof (FDR)));
837*e4b17023SJohn Marino
838*e4b17023SJohn Marino printf(" %-*s %11ld %11ld %11ld\n", width, "Relative Files",
839*e4b17023SJohn Marino (long) sym_ptr->cbRfdOffset,
840*e4b17023SJohn Marino (long) sym_ptr->crfd,
841*e4b17023SJohn Marino (long) (sym_ptr->crfd * sizeof (ulong)));
842*e4b17023SJohn Marino
843*e4b17023SJohn Marino printf(" %-*s %11ld %11ld %11ld\n", width, "External Symbols",
844*e4b17023SJohn Marino (long) sym_ptr->cbExtOffset,
845*e4b17023SJohn Marino (long) sym_ptr->iextMax,
846*e4b17023SJohn Marino (long) (sym_ptr->iextMax * sizeof (EXTR)));
847*e4b17023SJohn Marino }
848*e4b17023SJohn Marino
849*e4b17023SJohn Marino
850*e4b17023SJohn Marino /* Print out a symbol. */
851*e4b17023SJohn Marino
852*e4b17023SJohn Marino static void
print_symbol(SYMR * sym_ptr,int number,const char * strbase,AUXU * aux_base,int ifd,FDR * fdp)853*e4b17023SJohn Marino print_symbol (SYMR *sym_ptr, int number, const char *strbase, AUXU *aux_base,
854*e4b17023SJohn Marino int ifd, FDR *fdp)
855*e4b17023SJohn Marino {
856*e4b17023SJohn Marino sc_t storage_class = (sc_t) sym_ptr->sc;
857*e4b17023SJohn Marino st_t symbol_type = (st_t) sym_ptr->st;
858*e4b17023SJohn Marino ulong index = sym_ptr->index;
859*e4b17023SJohn Marino char *used_ptr = aux_used + (aux_base - aux_symbols);
860*e4b17023SJohn Marino scope_t *scope_ptr;
861*e4b17023SJohn Marino
862*e4b17023SJohn Marino printf ("\n Symbol# %d: \"%s\"\n", number, sym_ptr->iss + strbase);
863*e4b17023SJohn Marino
864*e4b17023SJohn Marino if (aux_base != (AUXU *) 0 && index != indexNil)
865*e4b17023SJohn Marino switch (symbol_type)
866*e4b17023SJohn Marino {
867*e4b17023SJohn Marino case st_Nil:
868*e4b17023SJohn Marino case st_Label:
869*e4b17023SJohn Marino break;
870*e4b17023SJohn Marino
871*e4b17023SJohn Marino case st_File:
872*e4b17023SJohn Marino case st_Block:
873*e4b17023SJohn Marino printf (" End+1 symbol: %ld\n", index);
874*e4b17023SJohn Marino if (want_scope)
875*e4b17023SJohn Marino {
876*e4b17023SJohn Marino if (free_scope == (scope_t *) 0)
877*e4b17023SJohn Marino scope_ptr = (scope_t *) xmalloc (sizeof (scope_t));
878*e4b17023SJohn Marino else
879*e4b17023SJohn Marino {
880*e4b17023SJohn Marino scope_ptr = free_scope;
881*e4b17023SJohn Marino free_scope = scope_ptr->prev;
882*e4b17023SJohn Marino }
883*e4b17023SJohn Marino scope_ptr->open_sym = number;
884*e4b17023SJohn Marino scope_ptr->st = symbol_type;
885*e4b17023SJohn Marino scope_ptr->sc = storage_class;
886*e4b17023SJohn Marino scope_ptr->prev = cur_scope;
887*e4b17023SJohn Marino cur_scope = scope_ptr;
888*e4b17023SJohn Marino }
889*e4b17023SJohn Marino break;
890*e4b17023SJohn Marino
891*e4b17023SJohn Marino case st_End:
892*e4b17023SJohn Marino if (storage_class == sc_Text || storage_class == sc_Info)
893*e4b17023SJohn Marino printf (" First symbol: %ld\n", index);
894*e4b17023SJohn Marino else
895*e4b17023SJohn Marino {
896*e4b17023SJohn Marino used_ptr[index] = 1;
897*e4b17023SJohn Marino printf (" First symbol: %ld\n", (long) aux_base[index].isym);
898*e4b17023SJohn Marino }
899*e4b17023SJohn Marino
900*e4b17023SJohn Marino if (want_scope)
901*e4b17023SJohn Marino {
902*e4b17023SJohn Marino if (cur_scope == (scope_t *) 0)
903*e4b17023SJohn Marino printf (" Can't pop end scope\n");
904*e4b17023SJohn Marino else
905*e4b17023SJohn Marino {
906*e4b17023SJohn Marino scope_ptr = cur_scope;
907*e4b17023SJohn Marino cur_scope = scope_ptr->prev;
908*e4b17023SJohn Marino scope_ptr->prev = free_scope;
909*e4b17023SJohn Marino free_scope = scope_ptr;
910*e4b17023SJohn Marino }
911*e4b17023SJohn Marino }
912*e4b17023SJohn Marino break;
913*e4b17023SJohn Marino
914*e4b17023SJohn Marino case st_Proc:
915*e4b17023SJohn Marino case st_StaticProc:
916*e4b17023SJohn Marino if (MIPS_IS_STAB(sym_ptr))
917*e4b17023SJohn Marino ;
918*e4b17023SJohn Marino else if (ifd == -1) /* local symbol */
919*e4b17023SJohn Marino {
920*e4b17023SJohn Marino used_ptr[index] = used_ptr[index+1] = 1;
921*e4b17023SJohn Marino printf (" End+1 symbol: %-7ld Type: %s\n",
922*e4b17023SJohn Marino (long) aux_base[index].isym,
923*e4b17023SJohn Marino type_to_string (aux_base, index+1, fdp));
924*e4b17023SJohn Marino }
925*e4b17023SJohn Marino else /* global symbol */
926*e4b17023SJohn Marino printf (" Local symbol: %ld\n", index);
927*e4b17023SJohn Marino
928*e4b17023SJohn Marino if (want_scope)
929*e4b17023SJohn Marino {
930*e4b17023SJohn Marino if (free_scope == (scope_t *) 0)
931*e4b17023SJohn Marino scope_ptr = (scope_t *) xmalloc (sizeof (scope_t));
932*e4b17023SJohn Marino else
933*e4b17023SJohn Marino {
934*e4b17023SJohn Marino scope_ptr = free_scope;
935*e4b17023SJohn Marino free_scope = scope_ptr->prev;
936*e4b17023SJohn Marino }
937*e4b17023SJohn Marino scope_ptr->open_sym = number;
938*e4b17023SJohn Marino scope_ptr->st = symbol_type;
939*e4b17023SJohn Marino scope_ptr->sc = storage_class;
940*e4b17023SJohn Marino scope_ptr->prev = cur_scope;
941*e4b17023SJohn Marino cur_scope = scope_ptr;
942*e4b17023SJohn Marino }
943*e4b17023SJohn Marino break;
944*e4b17023SJohn Marino
945*e4b17023SJohn Marino #ifdef stStruct
946*e4b17023SJohn Marino case st_Struct:
947*e4b17023SJohn Marino case st_Union:
948*e4b17023SJohn Marino case st_Enum:
949*e4b17023SJohn Marino printf (" End+1 symbol: %lu\n", index);
950*e4b17023SJohn Marino break;
951*e4b17023SJohn Marino #endif
952*e4b17023SJohn Marino
953*e4b17023SJohn Marino default:
954*e4b17023SJohn Marino if (!MIPS_IS_STAB (sym_ptr))
955*e4b17023SJohn Marino {
956*e4b17023SJohn Marino used_ptr[index] = 1;
957*e4b17023SJohn Marino printf (" Type: %s\n",
958*e4b17023SJohn Marino type_to_string (aux_base, index, fdp));
959*e4b17023SJohn Marino }
960*e4b17023SJohn Marino break;
961*e4b17023SJohn Marino }
962*e4b17023SJohn Marino
963*e4b17023SJohn Marino if (want_scope)
964*e4b17023SJohn Marino {
965*e4b17023SJohn Marino printf (" Scopes: ");
966*e4b17023SJohn Marino if (cur_scope == (scope_t *) 0)
967*e4b17023SJohn Marino printf (" none\n");
968*e4b17023SJohn Marino else
969*e4b17023SJohn Marino {
970*e4b17023SJohn Marino for (scope_ptr = cur_scope;
971*e4b17023SJohn Marino scope_ptr != (scope_t *) 0;
972*e4b17023SJohn Marino scope_ptr = scope_ptr->prev)
973*e4b17023SJohn Marino {
974*e4b17023SJohn Marino const char *sclass;
975*e4b17023SJohn Marino if (scope_ptr->st == st_Proc || scope_ptr->st == st_StaticProc)
976*e4b17023SJohn Marino sclass = "func.";
977*e4b17023SJohn Marino else if (scope_ptr->st == st_File)
978*e4b17023SJohn Marino sclass = "file";
979*e4b17023SJohn Marino else if (scope_ptr->st == st_Block && scope_ptr->sc == sc_Text)
980*e4b17023SJohn Marino sclass = "block";
981*e4b17023SJohn Marino else if (scope_ptr->st == st_Block && scope_ptr->sc == sc_Info)
982*e4b17023SJohn Marino sclass = "type";
983*e4b17023SJohn Marino else
984*e4b17023SJohn Marino sclass = "???";
985*e4b17023SJohn Marino
986*e4b17023SJohn Marino printf (" %ld [%s]", scope_ptr->open_sym, sclass);
987*e4b17023SJohn Marino }
988*e4b17023SJohn Marino printf ("\n");
989*e4b17023SJohn Marino }
990*e4b17023SJohn Marino }
991*e4b17023SJohn Marino
992*e4b17023SJohn Marino printf (" Value: %-13ld ",
993*e4b17023SJohn Marino (long)sym_ptr->value);
994*e4b17023SJohn Marino if (ifd == -1)
995*e4b17023SJohn Marino printf ("String index: %ld\n", (long)sym_ptr->iss);
996*e4b17023SJohn Marino else
997*e4b17023SJohn Marino printf ("String index: %-11ld Ifd: %d\n",
998*e4b17023SJohn Marino (long)sym_ptr->iss, ifd);
999*e4b17023SJohn Marino
1000*e4b17023SJohn Marino printf (" Symbol type: %-11sStorage class: %-11s",
1001*e4b17023SJohn Marino st_to_string (symbol_type), sc_to_string (storage_class));
1002*e4b17023SJohn Marino
1003*e4b17023SJohn Marino if (MIPS_IS_STAB(sym_ptr))
1004*e4b17023SJohn Marino {
1005*e4b17023SJohn Marino int i = ARRAY_SIZE (stab_names);
1006*e4b17023SJohn Marino const char *stab_name = "stab";
1007*e4b17023SJohn Marino short code = MIPS_UNMARK_STAB(sym_ptr->index);
1008*e4b17023SJohn Marino
1009*e4b17023SJohn Marino while (--i >= 0)
1010*e4b17023SJohn Marino if (stab_names[i].code == code)
1011*e4b17023SJohn Marino {
1012*e4b17023SJohn Marino stab_name = stab_names[i].string;
1013*e4b17023SJohn Marino break;
1014*e4b17023SJohn Marino }
1015*e4b17023SJohn Marino printf ("Index: 0x%lx (%s)\n", (long)sym_ptr->index, stab_name);
1016*e4b17023SJohn Marino }
1017*e4b17023SJohn Marino else if (sym_ptr->st == stLabel && sym_ptr->index != indexNil)
1018*e4b17023SJohn Marino printf ("Index: %ld (line#)\n", (long)sym_ptr->index);
1019*e4b17023SJohn Marino else
1020*e4b17023SJohn Marino printf ("Index: %ld\n", (long)sym_ptr->index);
1021*e4b17023SJohn Marino
1022*e4b17023SJohn Marino }
1023*e4b17023SJohn Marino
1024*e4b17023SJohn Marino
1025*e4b17023SJohn Marino /* Print out a word from the aux. table in various formats. */
1026*e4b17023SJohn Marino
1027*e4b17023SJohn Marino static void
print_aux(AUXU u,int auxi,int used)1028*e4b17023SJohn Marino print_aux (AUXU u, int auxi, int used)
1029*e4b17023SJohn Marino {
1030*e4b17023SJohn Marino printf ("\t%s#%-5d %11ld, [%4ld/%7ld], [%2d %1d:%1d %1x:%1x:%1x:%1x:%1x:%1x]\n",
1031*e4b17023SJohn Marino (used) ? " " : "* ",
1032*e4b17023SJohn Marino auxi,
1033*e4b17023SJohn Marino (long) u.isym,
1034*e4b17023SJohn Marino (long) u.rndx.rfd,
1035*e4b17023SJohn Marino (long) u.rndx.index,
1036*e4b17023SJohn Marino u.ti.bt,
1037*e4b17023SJohn Marino u.ti.fBitfield,
1038*e4b17023SJohn Marino u.ti.continued,
1039*e4b17023SJohn Marino u.ti.tq0,
1040*e4b17023SJohn Marino u.ti.tq1,
1041*e4b17023SJohn Marino u.ti.tq2,
1042*e4b17023SJohn Marino u.ti.tq3,
1043*e4b17023SJohn Marino u.ti.tq4,
1044*e4b17023SJohn Marino u.ti.tq5);
1045*e4b17023SJohn Marino }
1046*e4b17023SJohn Marino
1047*e4b17023SJohn Marino
1048*e4b17023SJohn Marino /* Write aggregate information to a string. */
1049*e4b17023SJohn Marino
1050*e4b17023SJohn Marino static void
emit_aggregate(char * string,AUXU u,AUXU u2,const char * which,FDR * fdp)1051*e4b17023SJohn Marino emit_aggregate (char *string, AUXU u, AUXU u2, const char *which, FDR *fdp)
1052*e4b17023SJohn Marino {
1053*e4b17023SJohn Marino unsigned int ifd = u.rndx.rfd;
1054*e4b17023SJohn Marino unsigned int index = u.rndx.index;
1055*e4b17023SJohn Marino const char *name;
1056*e4b17023SJohn Marino
1057*e4b17023SJohn Marino if (ifd == ST_RFDESCAPE)
1058*e4b17023SJohn Marino ifd = u2.isym;
1059*e4b17023SJohn Marino
1060*e4b17023SJohn Marino /* An ifd of -1 is an opaque type. An escaped index of 0 is a
1061*e4b17023SJohn Marino struct return type of a procedure compiled without -g. */
1062*e4b17023SJohn Marino if (ifd == 0xffffffff
1063*e4b17023SJohn Marino || (u.rndx.rfd == ST_RFDESCAPE && index == 0))
1064*e4b17023SJohn Marino name = "<undefined>";
1065*e4b17023SJohn Marino else if (index == indexNil)
1066*e4b17023SJohn Marino name = "<no name>";
1067*e4b17023SJohn Marino else
1068*e4b17023SJohn Marino {
1069*e4b17023SJohn Marino if (fdp == 0 || sym_hdr.crfd == 0)
1070*e4b17023SJohn Marino fdp = &file_desc[ifd];
1071*e4b17023SJohn Marino else
1072*e4b17023SJohn Marino fdp = &file_desc[rfile_desc[fdp->rfdBase + ifd]];
1073*e4b17023SJohn Marino name = &l_strings[fdp->issBase + l_symbols[index + fdp->isymBase].iss];
1074*e4b17023SJohn Marino }
1075*e4b17023SJohn Marino
1076*e4b17023SJohn Marino sprintf (string,
1077*e4b17023SJohn Marino "%s %s { ifd = %u, index = %u }",
1078*e4b17023SJohn Marino which, name, ifd, index);
1079*e4b17023SJohn Marino }
1080*e4b17023SJohn Marino
1081*e4b17023SJohn Marino
1082*e4b17023SJohn Marino /* Print out information about a file descriptor, and the symbols,
1083*e4b17023SJohn Marino procedures, and line numbers within it. */
1084*e4b17023SJohn Marino
1085*e4b17023SJohn Marino static void
print_file_desc(FDR * fdp,int number)1086*e4b17023SJohn Marino print_file_desc (FDR *fdp, int number)
1087*e4b17023SJohn Marino {
1088*e4b17023SJohn Marino char *str_base;
1089*e4b17023SJohn Marino AUXU *aux_base;
1090*e4b17023SJohn Marino int symi, pdi;
1091*e4b17023SJohn Marino int width = 20;
1092*e4b17023SJohn Marino char *used_base;
1093*e4b17023SJohn Marino
1094*e4b17023SJohn Marino str_base = l_strings + fdp->issBase;
1095*e4b17023SJohn Marino aux_base = aux_symbols + fdp->iauxBase;
1096*e4b17023SJohn Marino used_base = aux_used + (aux_base - aux_symbols);
1097*e4b17023SJohn Marino
1098*e4b17023SJohn Marino printf ("\nFile #%d, \"%s\"\n\n",
1099*e4b17023SJohn Marino number,
1100*e4b17023SJohn Marino fdp->rss != issNil ? str_base + fdp->rss : "<unknown>");
1101*e4b17023SJohn Marino
1102*e4b17023SJohn Marino printf (" Name index = %-10ld Readin = %s\n",
1103*e4b17023SJohn Marino (long) fdp->rss, (fdp->fReadin) ? "Yes" : "No");
1104*e4b17023SJohn Marino
1105*e4b17023SJohn Marino printf (" Merge = %-10s Endian = %s\n",
1106*e4b17023SJohn Marino (fdp->fMerge) ? "Yes" : "No",
1107*e4b17023SJohn Marino (fdp->fBigendian) ? "BIG" : "LITTLE");
1108*e4b17023SJohn Marino
1109*e4b17023SJohn Marino printf (" Debug level = %-10s Language = %s\n",
1110*e4b17023SJohn Marino glevel_to_string ((glevel_t) fdp->glevel),
1111*e4b17023SJohn Marino lang_to_string((lang_t) fdp->lang));
1112*e4b17023SJohn Marino
1113*e4b17023SJohn Marino printf (" Adr = 0x%08lx\n\n", (long) fdp->adr);
1114*e4b17023SJohn Marino
1115*e4b17023SJohn Marino printf(" %-*s %11s %11s %11s %11s\n", width, "Info", "Start", "Number", "Size", "Offset");
1116*e4b17023SJohn Marino printf(" %-*s %11s %11s %11s %11s\n", width, "====", "=====", "======", "====", "======");
1117*e4b17023SJohn Marino
1118*e4b17023SJohn Marino printf(" %-*s %11lu %11lu %11lu %11lu\n",
1119*e4b17023SJohn Marino width, "Local strings",
1120*e4b17023SJohn Marino (ulong) fdp->issBase,
1121*e4b17023SJohn Marino (ulong) fdp->cbSs,
1122*e4b17023SJohn Marino (ulong) fdp->cbSs,
1123*e4b17023SJohn Marino (ulong) (fdp->issBase + sym_hdr.cbSsOffset));
1124*e4b17023SJohn Marino
1125*e4b17023SJohn Marino printf(" %-*s %11lu %11lu %11lu %11lu\n",
1126*e4b17023SJohn Marino width, "Local symbols",
1127*e4b17023SJohn Marino (ulong) fdp->isymBase,
1128*e4b17023SJohn Marino (ulong) fdp->csym,
1129*e4b17023SJohn Marino (ulong) (fdp->csym * sizeof (SYMR)),
1130*e4b17023SJohn Marino (ulong) (fdp->isymBase * sizeof (SYMR) + sym_hdr.cbSymOffset));
1131*e4b17023SJohn Marino
1132*e4b17023SJohn Marino printf(" %-*s %11lu %11lu %11lu %11lu\n",
1133*e4b17023SJohn Marino width, "Line numbers",
1134*e4b17023SJohn Marino (ulong) fdp->cbLineOffset,
1135*e4b17023SJohn Marino (ulong) fdp->cline,
1136*e4b17023SJohn Marino (ulong) fdp->cbLine,
1137*e4b17023SJohn Marino (ulong) (fdp->cbLineOffset + sym_hdr.cbLineOffset));
1138*e4b17023SJohn Marino
1139*e4b17023SJohn Marino printf(" %-*s %11lu %11lu %11lu %11lu\n",
1140*e4b17023SJohn Marino width, "Optimization symbols",
1141*e4b17023SJohn Marino (ulong) fdp->ioptBase,
1142*e4b17023SJohn Marino (ulong) fdp->copt,
1143*e4b17023SJohn Marino (ulong) (fdp->copt * sizeof (OPTR)),
1144*e4b17023SJohn Marino (ulong) (fdp->ioptBase * sizeof (OPTR) + sym_hdr.cbOptOffset));
1145*e4b17023SJohn Marino
1146*e4b17023SJohn Marino printf(" %-*s %11lu %11lu %11lu %11lu\n",
1147*e4b17023SJohn Marino width, "Procedures",
1148*e4b17023SJohn Marino (ulong) fdp->ipdFirst,
1149*e4b17023SJohn Marino (ulong) fdp->cpd,
1150*e4b17023SJohn Marino (ulong) (fdp->cpd * sizeof (PDR)),
1151*e4b17023SJohn Marino (ulong) (fdp->ipdFirst * sizeof (PDR) + sym_hdr.cbPdOffset));
1152*e4b17023SJohn Marino
1153*e4b17023SJohn Marino printf(" %-*s %11lu %11lu %11lu %11lu\n",
1154*e4b17023SJohn Marino width, "Auxiliary symbols",
1155*e4b17023SJohn Marino (ulong) fdp->iauxBase,
1156*e4b17023SJohn Marino (ulong) fdp->caux,
1157*e4b17023SJohn Marino (ulong) (fdp->caux * sizeof (AUXU)),
1158*e4b17023SJohn Marino (ulong) (fdp->iauxBase * sizeof(AUXU) + sym_hdr.cbAuxOffset));
1159*e4b17023SJohn Marino
1160*e4b17023SJohn Marino printf(" %-*s %11lu %11lu %11lu %11lu\n",
1161*e4b17023SJohn Marino width, "Relative Files",
1162*e4b17023SJohn Marino (ulong) fdp->rfdBase,
1163*e4b17023SJohn Marino (ulong) fdp->crfd,
1164*e4b17023SJohn Marino (ulong) (fdp->crfd * sizeof (ulong)),
1165*e4b17023SJohn Marino (ulong) (fdp->rfdBase * sizeof(ulong) + sym_hdr.cbRfdOffset));
1166*e4b17023SJohn Marino
1167*e4b17023SJohn Marino
1168*e4b17023SJohn Marino if (want_scope && cur_scope != (scope_t *) 0)
1169*e4b17023SJohn Marino printf ("\n Warning scope does not start at 0!\n");
1170*e4b17023SJohn Marino
1171*e4b17023SJohn Marino /*
1172*e4b17023SJohn Marino * print the info about the symbol table.
1173*e4b17023SJohn Marino */
1174*e4b17023SJohn Marino printf ("\n There are %lu local symbols, starting at %lu\n",
1175*e4b17023SJohn Marino (ulong) fdp->csym,
1176*e4b17023SJohn Marino (ulong) (fdp->isymBase + sym_hdr.cbSymOffset));
1177*e4b17023SJohn Marino
1178*e4b17023SJohn Marino for(symi = fdp->isymBase; symi < (fdp->csym + fdp->isymBase); symi++)
1179*e4b17023SJohn Marino print_symbol (&l_symbols[symi],
1180*e4b17023SJohn Marino symi - fdp->isymBase,
1181*e4b17023SJohn Marino str_base,
1182*e4b17023SJohn Marino aux_base,
1183*e4b17023SJohn Marino -1,
1184*e4b17023SJohn Marino fdp);
1185*e4b17023SJohn Marino
1186*e4b17023SJohn Marino if (want_scope && cur_scope != (scope_t *) 0)
1187*e4b17023SJohn Marino printf ("\n Warning scope does not end at 0!\n");
1188*e4b17023SJohn Marino
1189*e4b17023SJohn Marino /*
1190*e4b17023SJohn Marino * print the aux. table if desired.
1191*e4b17023SJohn Marino */
1192*e4b17023SJohn Marino
1193*e4b17023SJohn Marino if (want_aux && fdp->caux != 0)
1194*e4b17023SJohn Marino {
1195*e4b17023SJohn Marino int auxi;
1196*e4b17023SJohn Marino
1197*e4b17023SJohn Marino printf ("\n There are %lu auxiliary table entries, starting at %lu.\n\n",
1198*e4b17023SJohn Marino (ulong) fdp->caux,
1199*e4b17023SJohn Marino (ulong) (fdp->iauxBase + sym_hdr.cbAuxOffset));
1200*e4b17023SJohn Marino
1201*e4b17023SJohn Marino for (auxi = fdp->iauxBase; auxi < (fdp->caux + fdp->iauxBase); auxi++)
1202*e4b17023SJohn Marino print_aux (aux_base[auxi], auxi, used_base[auxi]);
1203*e4b17023SJohn Marino }
1204*e4b17023SJohn Marino
1205*e4b17023SJohn Marino /*
1206*e4b17023SJohn Marino * print the relative file descriptors.
1207*e4b17023SJohn Marino */
1208*e4b17023SJohn Marino if (want_rfd && fdp->crfd != 0)
1209*e4b17023SJohn Marino {
1210*e4b17023SJohn Marino ulong *rfd_ptr, i;
1211*e4b17023SJohn Marino
1212*e4b17023SJohn Marino printf ("\n There are %lu relative file descriptors, starting at %lu.\n",
1213*e4b17023SJohn Marino (ulong) fdp->crfd,
1214*e4b17023SJohn Marino (ulong) fdp->rfdBase);
1215*e4b17023SJohn Marino
1216*e4b17023SJohn Marino rfd_ptr = rfile_desc + fdp->rfdBase;
1217*e4b17023SJohn Marino for (i = 0; i < (ulong) fdp->crfd; i++)
1218*e4b17023SJohn Marino {
1219*e4b17023SJohn Marino printf ("\t#%-5ld %11ld, 0x%08lx\n", i, *rfd_ptr, *rfd_ptr);
1220*e4b17023SJohn Marino rfd_ptr++;
1221*e4b17023SJohn Marino }
1222*e4b17023SJohn Marino }
1223*e4b17023SJohn Marino
1224*e4b17023SJohn Marino /*
1225*e4b17023SJohn Marino * do the procedure descriptors.
1226*e4b17023SJohn Marino */
1227*e4b17023SJohn Marino printf ("\n There are %lu procedure descriptor entries, ", (ulong) fdp->cpd);
1228*e4b17023SJohn Marino printf ("starting at %lu.\n", (ulong) fdp->ipdFirst);
1229*e4b17023SJohn Marino
1230*e4b17023SJohn Marino for (pdi = fdp->ipdFirst; pdi < (fdp->cpd + fdp->ipdFirst); pdi++)
1231*e4b17023SJohn Marino {
1232*e4b17023SJohn Marino PDR *proc_ptr = &proc_desc[pdi];
1233*e4b17023SJohn Marino printf ("\n\tProcedure descriptor %d:\n", (pdi - fdp->ipdFirst));
1234*e4b17023SJohn Marino
1235*e4b17023SJohn Marino if (l_symbols != 0)
1236*e4b17023SJohn Marino printf ("\t Name index = %-11ld Name = \"%s\"\n",
1237*e4b17023SJohn Marino (long) l_symbols[proc_ptr->isym + fdp->isymBase].iss,
1238*e4b17023SJohn Marino l_symbols[proc_ptr->isym + fdp->isymBase].iss + str_base);
1239*e4b17023SJohn Marino
1240*e4b17023SJohn Marino printf ("\t .mask 0x%08lx,%-9ld .fmask 0x%08lx,%ld\n",
1241*e4b17023SJohn Marino (long) proc_ptr->regmask,
1242*e4b17023SJohn Marino (long) proc_ptr->regoffset,
1243*e4b17023SJohn Marino (long) proc_ptr->fregmask,
1244*e4b17023SJohn Marino (long) proc_ptr->fregoffset);
1245*e4b17023SJohn Marino
1246*e4b17023SJohn Marino printf ("\t .frame $%d,%ld,$%d\n",
1247*e4b17023SJohn Marino (int) proc_ptr->framereg,
1248*e4b17023SJohn Marino (long) proc_ptr->frameoffset,
1249*e4b17023SJohn Marino (int) proc_ptr->pcreg);
1250*e4b17023SJohn Marino
1251*e4b17023SJohn Marino printf ("\t Opt. start = %-11ld Symbols start = %ld\n",
1252*e4b17023SJohn Marino (long) proc_ptr->iopt,
1253*e4b17023SJohn Marino (long) proc_ptr->isym);
1254*e4b17023SJohn Marino
1255*e4b17023SJohn Marino printf ("\t First line # = %-11ld Last line # = %ld\n",
1256*e4b17023SJohn Marino (long) proc_ptr->lnLow,
1257*e4b17023SJohn Marino (long) proc_ptr->lnHigh);
1258*e4b17023SJohn Marino
1259*e4b17023SJohn Marino printf ("\t Line Offset = %-11ld Address = 0x%08lx\n",
1260*e4b17023SJohn Marino (long) proc_ptr->cbLineOffset,
1261*e4b17023SJohn Marino (long) proc_ptr->adr);
1262*e4b17023SJohn Marino
1263*e4b17023SJohn Marino /*
1264*e4b17023SJohn Marino * print the line number entries.
1265*e4b17023SJohn Marino */
1266*e4b17023SJohn Marino
1267*e4b17023SJohn Marino if (want_line && fdp->cline != 0)
1268*e4b17023SJohn Marino {
1269*e4b17023SJohn Marino int delta, count;
1270*e4b17023SJohn Marino long cur_line = proc_ptr->lnLow;
1271*e4b17023SJohn Marino uchar *line_ptr = (((uchar *)lines) + proc_ptr->cbLineOffset
1272*e4b17023SJohn Marino + fdp->cbLineOffset);
1273*e4b17023SJohn Marino uchar *line_end;
1274*e4b17023SJohn Marino
1275*e4b17023SJohn Marino if (pdi == fdp->cpd + fdp->ipdFirst - 1) /* last procedure */
1276*e4b17023SJohn Marino line_end = ((uchar *)lines) + fdp->cbLine + fdp->cbLineOffset;
1277*e4b17023SJohn Marino else /* not last proc. */
1278*e4b17023SJohn Marino line_end = (((uchar *)lines) + proc_desc[pdi+1].cbLineOffset
1279*e4b17023SJohn Marino + fdp->cbLineOffset);
1280*e4b17023SJohn Marino
1281*e4b17023SJohn Marino printf ("\n\tThere are %lu bytes holding line numbers, starting at %lu.\n",
1282*e4b17023SJohn Marino (ulong) (line_end - line_ptr),
1283*e4b17023SJohn Marino (ulong) (fdp->ilineBase + sym_hdr.cbLineOffset));
1284*e4b17023SJohn Marino
1285*e4b17023SJohn Marino while (line_ptr < line_end)
1286*e4b17023SJohn Marino { /* sign extend nibble */
1287*e4b17023SJohn Marino delta = ((*line_ptr >> 4) ^ 0x8) - 0x8;
1288*e4b17023SJohn Marino count = (*line_ptr & 0xf) + 1;
1289*e4b17023SJohn Marino if (delta != -8)
1290*e4b17023SJohn Marino line_ptr++;
1291*e4b17023SJohn Marino else
1292*e4b17023SJohn Marino {
1293*e4b17023SJohn Marino delta = (((line_ptr[1]) & 0xff) << 8) + ((line_ptr[2]) & 0xff);
1294*e4b17023SJohn Marino delta = (delta ^ 0x8000) - 0x8000;
1295*e4b17023SJohn Marino line_ptr += 3;
1296*e4b17023SJohn Marino }
1297*e4b17023SJohn Marino
1298*e4b17023SJohn Marino cur_line += delta;
1299*e4b17023SJohn Marino printf ("\t Line %11ld, delta %5d, count %2d\n",
1300*e4b17023SJohn Marino cur_line,
1301*e4b17023SJohn Marino delta,
1302*e4b17023SJohn Marino count);
1303*e4b17023SJohn Marino }
1304*e4b17023SJohn Marino }
1305*e4b17023SJohn Marino }
1306*e4b17023SJohn Marino }
1307*e4b17023SJohn Marino
1308*e4b17023SJohn Marino
1309*e4b17023SJohn Marino /* Read in the portions of the .T file that we will print out. */
1310*e4b17023SJohn Marino
1311*e4b17023SJohn Marino static void
read_tfile(void)1312*e4b17023SJohn Marino read_tfile (void)
1313*e4b17023SJohn Marino {
1314*e4b17023SJohn Marino short magic;
1315*e4b17023SJohn Marino off_t sym_hdr_offset = 0;
1316*e4b17023SJohn Marino
1317*e4b17023SJohn Marino read_seek (&magic, sizeof (magic), 0, "Magic number");
1318*e4b17023SJohn Marino if (!tfile)
1319*e4b17023SJohn Marino {
1320*e4b17023SJohn Marino /* Print out the global header, since this is not a T-file. */
1321*e4b17023SJohn Marino
1322*e4b17023SJohn Marino read_seek (&global_hdr, sizeof (global_hdr), 0, "Global file header");
1323*e4b17023SJohn Marino
1324*e4b17023SJohn Marino print_global_hdr (&global_hdr);
1325*e4b17023SJohn Marino
1326*e4b17023SJohn Marino if (global_hdr.f_symptr == 0)
1327*e4b17023SJohn Marino {
1328*e4b17023SJohn Marino printf ("No symbolic header, Goodbye!\n");
1329*e4b17023SJohn Marino exit (1);
1330*e4b17023SJohn Marino }
1331*e4b17023SJohn Marino
1332*e4b17023SJohn Marino sym_hdr_offset = global_hdr.f_symptr;
1333*e4b17023SJohn Marino }
1334*e4b17023SJohn Marino
1335*e4b17023SJohn Marino read_seek (&sym_hdr, sizeof (sym_hdr), sym_hdr_offset, "Symbolic header");
1336*e4b17023SJohn Marino
1337*e4b17023SJohn Marino print_sym_hdr (&sym_hdr);
1338*e4b17023SJohn Marino
1339*e4b17023SJohn Marino lines = (LINER *) read_seek (NULL, sym_hdr.cbLine, sym_hdr.cbLineOffset,
1340*e4b17023SJohn Marino "Line numbers");
1341*e4b17023SJohn Marino
1342*e4b17023SJohn Marino dense_nums = (DNR *) read_seek (NULL, sym_hdr.idnMax * sizeof (DNR),
1343*e4b17023SJohn Marino sym_hdr.cbDnOffset, "Dense numbers");
1344*e4b17023SJohn Marino
1345*e4b17023SJohn Marino proc_desc = (PDR *) read_seek (NULL, sym_hdr.ipdMax * sizeof (PDR),
1346*e4b17023SJohn Marino sym_hdr.cbPdOffset, "Procedure tables");
1347*e4b17023SJohn Marino
1348*e4b17023SJohn Marino l_symbols = (SYMR *) read_seek (NULL, sym_hdr.isymMax * sizeof (SYMR),
1349*e4b17023SJohn Marino sym_hdr.cbSymOffset, "Local symbols");
1350*e4b17023SJohn Marino
1351*e4b17023SJohn Marino opt_symbols = (OPTR *) read_seek (NULL, sym_hdr.ioptMax * sizeof (OPTR),
1352*e4b17023SJohn Marino sym_hdr.cbOptOffset,
1353*e4b17023SJohn Marino "Optimization symbols");
1354*e4b17023SJohn Marino
1355*e4b17023SJohn Marino aux_symbols = (AUXU *) read_seek (NULL, sym_hdr.iauxMax * sizeof (AUXU),
1356*e4b17023SJohn Marino sym_hdr.cbAuxOffset, "Auxiliary symbols");
1357*e4b17023SJohn Marino
1358*e4b17023SJohn Marino if (sym_hdr.iauxMax > 0)
1359*e4b17023SJohn Marino aux_used = (char *) xcalloc (sym_hdr.iauxMax, 1);
1360*e4b17023SJohn Marino
1361*e4b17023SJohn Marino l_strings = (char *) read_seek (NULL, sym_hdr.issMax,
1362*e4b17023SJohn Marino sym_hdr.cbSsOffset, "Local string table");
1363*e4b17023SJohn Marino
1364*e4b17023SJohn Marino e_strings = (char *) read_seek (NULL, sym_hdr.issExtMax,
1365*e4b17023SJohn Marino sym_hdr.cbSsExtOffset,
1366*e4b17023SJohn Marino "External string table");
1367*e4b17023SJohn Marino
1368*e4b17023SJohn Marino file_desc = (FDR *) read_seek (NULL, sym_hdr.ifdMax * sizeof (FDR),
1369*e4b17023SJohn Marino sym_hdr.cbFdOffset, "File tables");
1370*e4b17023SJohn Marino
1371*e4b17023SJohn Marino rfile_desc = (ulong *) read_seek (NULL, sym_hdr.crfd * sizeof (ulong),
1372*e4b17023SJohn Marino sym_hdr.cbRfdOffset,
1373*e4b17023SJohn Marino "Relative file tables");
1374*e4b17023SJohn Marino
1375*e4b17023SJohn Marino e_symbols = (EXTR *) read_seek (NULL, sym_hdr.iextMax * sizeof (EXTR),
1376*e4b17023SJohn Marino sym_hdr.cbExtOffset, "External symbols");
1377*e4b17023SJohn Marino }
1378*e4b17023SJohn Marino
1379*e4b17023SJohn Marino
1380*e4b17023SJohn Marino
1381*e4b17023SJohn Marino extern int main (int, char **);
1382*e4b17023SJohn Marino
1383*e4b17023SJohn Marino int
main(int argc,char ** argv)1384*e4b17023SJohn Marino main (int argc, char **argv)
1385*e4b17023SJohn Marino {
1386*e4b17023SJohn Marino int i, opt;
1387*e4b17023SJohn Marino
1388*e4b17023SJohn Marino /*
1389*e4b17023SJohn Marino * Process arguments
1390*e4b17023SJohn Marino */
1391*e4b17023SJohn Marino while ((opt = getopt_long (argc, argv, "alrsvt", options, NULL)) != -1)
1392*e4b17023SJohn Marino switch (opt)
1393*e4b17023SJohn Marino {
1394*e4b17023SJohn Marino default: errors++; break;
1395*e4b17023SJohn Marino case 'a': want_aux++; break; /* print aux table */
1396*e4b17023SJohn Marino case 'l': want_line++; break; /* print line numbers */
1397*e4b17023SJohn Marino case 'r': want_rfd++; break; /* print relative fd's */
1398*e4b17023SJohn Marino case 's': want_scope++; break; /* print scope info */
1399*e4b17023SJohn Marino case 'v': verbose++; break; /* print version # */
1400*e4b17023SJohn Marino case 'V': version++; break; /* print version # */
1401*e4b17023SJohn Marino case 't': tfile++; break; /* this is a tfile (without header),
1402*e4b17023SJohn Marino and not a .o */
1403*e4b17023SJohn Marino }
1404*e4b17023SJohn Marino
1405*e4b17023SJohn Marino if (version)
1406*e4b17023SJohn Marino {
1407*e4b17023SJohn Marino printf ("mips-tdump %s%s\n", pkgversion_string, version_string);
1408*e4b17023SJohn Marino fputs ("Copyright (C) 2012 Free Software Foundation, Inc.\n", stdout);
1409*e4b17023SJohn Marino fputs ("This is free software; see the source for copying conditions. There is NO\n\
1410*e4b17023SJohn Marino warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n",
1411*e4b17023SJohn Marino stdout);
1412*e4b17023SJohn Marino exit (0);
1413*e4b17023SJohn Marino }
1414*e4b17023SJohn Marino
1415*e4b17023SJohn Marino if (optind != argc - 1)
1416*e4b17023SJohn Marino errors++;
1417*e4b17023SJohn Marino
1418*e4b17023SJohn Marino if (verbose || errors)
1419*e4b17023SJohn Marino fprintf (stderr, "mips-tdump (GCC) %s\n", version_string);
1420*e4b17023SJohn Marino
1421*e4b17023SJohn Marino if (errors)
1422*e4b17023SJohn Marino {
1423*e4b17023SJohn Marino fprintf (stderr, "Calling Sequence:\n");
1424*e4b17023SJohn Marino fprintf (stderr, "\t%s [-alrst] <object-or-T-file>\n", argv[0]);
1425*e4b17023SJohn Marino fprintf (stderr, "\n");
1426*e4b17023SJohn Marino fprintf (stderr, "switches:\n");
1427*e4b17023SJohn Marino fprintf (stderr, "\t-a Print out auxiliary table.\n");
1428*e4b17023SJohn Marino fprintf (stderr, "\t-l Print out line numbers.\n");
1429*e4b17023SJohn Marino fprintf (stderr, "\t-r Print out relative file descriptors.\n");
1430*e4b17023SJohn Marino fprintf (stderr, "\t-s Print out the current scopes for an item.\n");
1431*e4b17023SJohn Marino fprintf (stderr, "\t-t Assume there is no global header (ie, a T-file).\n");
1432*e4b17023SJohn Marino fprintf (stderr, "\t-v Print program version.\n");
1433*e4b17023SJohn Marino return 1;
1434*e4b17023SJohn Marino }
1435*e4b17023SJohn Marino
1436*e4b17023SJohn Marino /*
1437*e4b17023SJohn Marino * Open and process the input file.
1438*e4b17023SJohn Marino */
1439*e4b17023SJohn Marino tfile_fd = open (argv[optind], O_RDONLY);
1440*e4b17023SJohn Marino if (tfile_fd < 0)
1441*e4b17023SJohn Marino {
1442*e4b17023SJohn Marino perror (argv[optind]);
1443*e4b17023SJohn Marino return 1;
1444*e4b17023SJohn Marino }
1445*e4b17023SJohn Marino
1446*e4b17023SJohn Marino read_tfile ();
1447*e4b17023SJohn Marino
1448*e4b17023SJohn Marino /*
1449*e4b17023SJohn Marino * Print any global aux words if any.
1450*e4b17023SJohn Marino */
1451*e4b17023SJohn Marino if (want_aux)
1452*e4b17023SJohn Marino {
1453*e4b17023SJohn Marino long last_aux_in_use;
1454*e4b17023SJohn Marino
1455*e4b17023SJohn Marino if (sym_hdr.ifdMax != 0 && file_desc[0].iauxBase != 0)
1456*e4b17023SJohn Marino {
1457*e4b17023SJohn Marino printf ("\nGlobal auxiliary entries before first file:\n");
1458*e4b17023SJohn Marino for (i = 0; i < file_desc[0].iauxBase; i++)
1459*e4b17023SJohn Marino print_aux (aux_symbols[i], 0, aux_used[i]);
1460*e4b17023SJohn Marino }
1461*e4b17023SJohn Marino
1462*e4b17023SJohn Marino if (sym_hdr.ifdMax == 0)
1463*e4b17023SJohn Marino last_aux_in_use = 0;
1464*e4b17023SJohn Marino else
1465*e4b17023SJohn Marino last_aux_in_use
1466*e4b17023SJohn Marino = (file_desc[sym_hdr.ifdMax-1].iauxBase
1467*e4b17023SJohn Marino + file_desc[sym_hdr.ifdMax-1].caux - 1);
1468*e4b17023SJohn Marino
1469*e4b17023SJohn Marino if (last_aux_in_use < sym_hdr.iauxMax-1)
1470*e4b17023SJohn Marino {
1471*e4b17023SJohn Marino printf ("\nGlobal auxiliary entries after last file:\n");
1472*e4b17023SJohn Marino for (i = last_aux_in_use; i < sym_hdr.iauxMax; i++)
1473*e4b17023SJohn Marino print_aux (aux_symbols[i], i - last_aux_in_use, aux_used[i]);
1474*e4b17023SJohn Marino }
1475*e4b17023SJohn Marino }
1476*e4b17023SJohn Marino
1477*e4b17023SJohn Marino /*
1478*e4b17023SJohn Marino * Print the information for each file.
1479*e4b17023SJohn Marino */
1480*e4b17023SJohn Marino for (i = 0; i < sym_hdr.ifdMax; i++)
1481*e4b17023SJohn Marino print_file_desc (&file_desc[i], i);
1482*e4b17023SJohn Marino
1483*e4b17023SJohn Marino /*
1484*e4b17023SJohn Marino * Print the external symbols.
1485*e4b17023SJohn Marino */
1486*e4b17023SJohn Marino want_scope = 0; /* scope info is meaning for extern symbols */
1487*e4b17023SJohn Marino printf ("\nThere are %lu external symbols, starting at %lu\n",
1488*e4b17023SJohn Marino (ulong) sym_hdr.iextMax,
1489*e4b17023SJohn Marino (ulong) sym_hdr.cbExtOffset);
1490*e4b17023SJohn Marino
1491*e4b17023SJohn Marino for(i = 0; i < sym_hdr.iextMax; i++)
1492*e4b17023SJohn Marino print_symbol (&e_symbols[i].asym, i, e_strings,
1493*e4b17023SJohn Marino aux_symbols + file_desc[e_symbols[i].ifd].iauxBase,
1494*e4b17023SJohn Marino e_symbols[i].ifd,
1495*e4b17023SJohn Marino &file_desc[e_symbols[i].ifd]);
1496*e4b17023SJohn Marino
1497*e4b17023SJohn Marino /*
1498*e4b17023SJohn Marino * Print unused aux symbols now.
1499*e4b17023SJohn Marino */
1500*e4b17023SJohn Marino
1501*e4b17023SJohn Marino if (want_aux)
1502*e4b17023SJohn Marino {
1503*e4b17023SJohn Marino int first_time = 1;
1504*e4b17023SJohn Marino
1505*e4b17023SJohn Marino for (i = 0; i < sym_hdr.iauxMax; i++)
1506*e4b17023SJohn Marino {
1507*e4b17023SJohn Marino if (! aux_used[i])
1508*e4b17023SJohn Marino {
1509*e4b17023SJohn Marino if (first_time)
1510*e4b17023SJohn Marino {
1511*e4b17023SJohn Marino printf ("\nThe following auxiliary table entries were unused:\n\n");
1512*e4b17023SJohn Marino first_time = 0;
1513*e4b17023SJohn Marino }
1514*e4b17023SJohn Marino
1515*e4b17023SJohn Marino printf (" #%-5d %11ld 0x%08lx %s\n",
1516*e4b17023SJohn Marino i,
1517*e4b17023SJohn Marino (long) aux_symbols[i].isym,
1518*e4b17023SJohn Marino (long) aux_symbols[i].isym,
1519*e4b17023SJohn Marino type_to_string (aux_symbols, i, (FDR *) 0));
1520*e4b17023SJohn Marino }
1521*e4b17023SJohn Marino }
1522*e4b17023SJohn Marino }
1523*e4b17023SJohn Marino
1524*e4b17023SJohn Marino return 0;
1525*e4b17023SJohn Marino }
1526