coff_sym.h revision 2632:1bb2f91485ea
1/*
2 * Copyright (c) 2003, 2005-2006 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;
9 * redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution;
12 * neither the name of the copyright holders nor the names of its
13 * contributors may be used to endorse or promote products derived from
14 * this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * Authors: Steve Reinhardt
29 */
30
31/*
32 * Taken from binutils-2.14.90.0.5 include/coff/sym.h
33 */
34
35/* Declarations of internal format of MIPS ECOFF symbols.
36   Originally contributed by MIPS Computer Systems and Third Eye Software.
37   Changes contributed by Cygnus Support are in the public domain.
38
39   This file is just aggregated with the files that make up the GNU
40   release; it is not considered part of GAS, GDB, or other GNU
41   programs.  */
42
43/*
44 * |-----------------------------------------------------------|
45 * | Copyright (c) 1992, 1991, 1990 MIPS Computer Systems, Inc.|
46 * | MIPS Computer Systems, Inc. grants reproduction and use   |
47 * | rights to all parties, PROVIDED that this comment is      |
48 * | maintained in the copy.                                   |
49 * |-----------------------------------------------------------|
50 */
51#ifndef _SYM_H
52#define _SYM_H
53
54/* (C) Copyright 1984 by Third Eye Software, Inc.
55 *
56 * Third Eye Software, Inc. grants reproduction and use rights to
57 * all parties, PROVIDED that this comment is maintained in the copy.
58 *
59 * Third Eye makes no claims about the applicability of this
60 * symbol table to a particular use.
61 */
62
63/*
64 * This file contains the definition of the Third Eye Symbol Table.
65 *
66 * Symbols are assumed to be in 'encounter order' - i.e. the order that
67 * the things they represent were encountered by the compiler/assembler/loader.
68 * EXCEPT for globals!	These are assumed to be bunched together,
69 * probably right after the last 'normal' symbol.  Globals ARE sorted
70 * in ascending order.
71 *
72 * -----------------------------------------------------------------------
73 * A brief word about Third Eye naming/use conventions:
74 *
75 * All arrays and index's are 0 based.
76 * All "ifooMax" values are the highest legal value PLUS ONE. This makes
77 * them good for allocating arrays, etc. All checks are "ifoo < ifooMax".
78 *
79 * "isym"	Index into the SYMbol table.
80 * "ipd"	Index into the Procedure Descriptor array.
81 * "ifd"	Index into the File Descriptor array.
82 * "iss"	Index into String Space.
83 * "cb"		Count of Bytes.
84 * "rgPd"	array whose domain is "0..ipdMax-1" and RanGe is PDR.
85 * "rgFd"	array whose domain is "0..ifdMax-1" and RanGe is FDR.
86 */
87
88
89/*
90 * Symbolic Header (HDR) structure.
91 * As long as all the pointers are set correctly,
92 * we don't care WHAT order the various sections come out in!
93 *
94 * A file produced solely for the use of CDB will probably NOT have
95 * any instructions or data areas in it, as these are available
96 * in the original.
97 */
98
99typedef struct ecoff_symhdr {
100    coff_short	magic;		/* to verify validity of the table */
101    coff_short	vstamp;		/* version stamp */
102    coff_int	ilineMax;	/* number of line number entries */
103    coff_int	idnMax;		/* max index into dense number table */
104    coff_int	ipdMax;		/* number of procedures */
105    coff_int	isymMax;	/* number of local symbols */
106    coff_int	ioptMax;	/* max index into optimization symbol entries */
107    coff_int	iauxMax;	/* number of auxillary symbol entries */
108    coff_int	issMax;		/* max index into local strings */
109    coff_int	issExtMax;	/* max index into external strings */
110    coff_int	ifdMax;		/* number of file descriptor entries */
111    coff_int	crfd;		/* number of relative file descriptor entries */
112    coff_int	iextMax;	/* max index into external symbols */
113    coff_addr	cbLine;		/* number of bytes for line number entries */
114    coff_addr	cbLineOffset;	/* offset to start of line number entries*/
115    coff_addr	cbDnOffset;	/* offset to start dense number table */
116    coff_addr	cbPdOffset;	/* offset to procedure descriptor table */
117    coff_addr	cbSymOffset;	/* offset to start of local symbols*/
118    coff_addr	cbOptOffset;	/* offset to optimization symbol entries */
119    coff_addr	cbAuxOffset;	/* offset to start of auxillary symbol entries*/
120    coff_addr	cbSsOffset;	/* offset to start of local strings */
121    coff_addr	cbSsExtOffset;	/* offset to start of external strings */
122    coff_addr	cbFdOffset;	/* offset to file descriptor table */
123    coff_addr	cbRfdOffset;	/* offset to relative file descriptor table */
124    coff_addr	cbExtOffset;	/* offset to start of external symbol entries*/
125    /* If you add machine dependent fields, add them here */
126} HDRR, *pHDRR;
127#define cbHDRR sizeof(HDRR)
128#define hdrNil ((pHDRR)0)
129
130/*
131 * The FDR and PDR structures speed mapping of address <-> name.
132 * They are sorted in ascending memory order and are kept in
133 * memory by CDB at runtime.
134 */
135
136/*
137 * File Descriptor
138 *
139 * There is one of these for EVERY FILE, whether compiled with
140 * full debugging symbols or not.  The name of a file should be
141 * the path name given to the compiler.	 This allows the user
142 * to simply specify the names of the directories where the COMPILES
143 * were done, and we will be able to find their files.
144 * A field whose comment starts with "R - " indicates that it will be
145 * setup at runtime.
146 */
147typedef struct ecoff_fdr {
148    coff_addr	adr;		/* memory address of beginning of file */
149    coff_addr	cbLineOffset;	/* byte offset from header for this file ln's */
150    coff_addr	cbLine;		/* size of lines for this file */
151    coff_addr	cbSs;		/* number of bytes in the ss */
152    coff_int	rss;		/* file name (of source, if known) */
153    coff_int	issBase;	/* file's string space */
154    coff_int	isymBase;	/* beginning of symbols */
155    coff_int	csym;		/* count file's of symbols */
156    coff_int	ilineBase;	/* file's line symbols */
157    coff_int	cline;		/* count of file's line symbols */
158    coff_int	ioptBase;	/* file's optimization entries */
159    coff_int	copt;		/* count of file's optimization entries */
160    coff_int 	ipdFirst;	/* start of procedures for this file */
161    coff_int	cpd;		/* count of procedures for this file */
162    coff_int	iauxBase;	/* file's auxiliary entries */
163    coff_int	caux;		/* count of file's auxiliary entries */
164    coff_int	rfdBase;	/* index into the file indirect table */
165    coff_int	crfd;		/* count file indirect entries */
166    unsigned lang: 5;	/* language for this file */
167    unsigned fMerge : 1;	/* whether this file can be merged */
168    unsigned fReadin : 1;	/* true if it was read in (not just created) */
169    unsigned fBigendian : 1;/* if set, was compiled on big endian machine */
170    /*	aux's will be in compile host's sex */
171    unsigned glevel : 2;	/* level this file was compiled with */
172    unsigned reserved : 22;  /* reserved for future use */
173    coff_uint	reserved2;
174} FDR, *pFDR;
175#define cbFDR sizeof(FDR)
176#define fdNil ((pFDR)0)
177#define ifdNil -1
178#define ifdTemp 0
179#define ilnNil -1
180
181
182/*
183 * Procedure Descriptor
184 *
185 * There is one of these for EVERY TEXT LABEL.
186 * If a procedure is in a file with full symbols, then isym
187 * will point to the PROC symbols, else it will point to the
188 * global symbol for the label.
189 */
190
191typedef struct pdr {
192    coff_addr	adr;		/* memory address of start of procedure */
193    coff_addr	cbLineOffset;	/* byte offset for this procedure from the fd base */
194    coff_int	isym;		/* start of local symbol entries */
195    coff_int	iline;		/* start of line number entries*/
196    coff_uint	regmask;	/* save register mask */
197    coff_int	regoffset;	/* save register offset */
198    coff_int	iopt;		/* start of optimization symbol entries*/
199    coff_uint	fregmask;	/* save floating point register mask */
200    coff_int	fregoffset;	/* save floating point register offset */
201    coff_int	frameoffset;	/* frame size */
202    coff_int	lnLow;		/* lowest line in the procedure */
203    coff_int	lnHigh;		/* highest line in the procedure */
204    /* These fields are new for 64 bit ECOFF.  */
205    unsigned gp_prologue : 8; /* byte size of GP prologue */
206    unsigned gp_used : 1;	/* true if the procedure uses GP */
207    unsigned reg_frame : 1;	/* true if register frame procedure */
208    unsigned prof : 1;	/* true if compiled with -pg */
209    unsigned reserved : 13;	/* reserved: must be zero */
210    unsigned localoff : 8;	/* offset of local variables from vfp */
211    coff_short	framereg;	/* frame pointer register */
212    coff_short	pcreg;		/* offset or reg of return pc */
213} PDR, *pPDR;
214#define cbPDR sizeof(PDR)
215#define pdNil ((pPDR) 0)
216#define ipdNil	-1
217
218/*
219 * The structure of the runtime procedure descriptor created by the loader
220 * for use by the static exception system.
221 */
222/*
223 * If 0'd out because exception_info chokes Visual C++ and because there
224 * don't seem to be any references to this structure elsewhere in gdb.
225 */
226#if 0
227typedef struct runtime_pdr {
228    coff_addr	adr;		/* memory address of start of procedure */
229    coff_uint	regmask;	/* save register mask */
230    coff_int	regoffset;	/* save register offset */
231    coff_uint	fregmask;	/* save floating point register mask */
232    coff_int	fregoffset;	/* save floating point register offset */
233    coff_int	frameoffset;	/* frame size */
234    coff_ushort	framereg;	/* frame pointer register */
235    coff_ushort	pcreg;		/* offset or reg of return pc */
236    coff_int	irpss;		/* index into the runtime string table */
237    coff_uint	reserved;
238    struct exception_info *exception_info;/* pointer to exception array */
239} RPDR, *pRPDR;
240#define cbRPDR sizeof(RPDR)
241#define rpdNil ((pRPDR) 0)
242#endif
243
244/*
245 * Line Numbers
246 *
247 * Line Numbers are segregated from the normal symbols because they
248 * are [1] smaller , [2] are of no interest to your
249 * average loader, and [3] are never needed in the middle of normal
250 * scanning and therefore slow things down.
251 *
252 * By definition, the first LINER for any given procedure will have
253 * the first line of a procedure and represent the first address.
254 */
255
256typedef	coff_int LINER, *pLINER;
257#define lineNil ((pLINER)0)
258#define cbLINER sizeof(LINER)
259#define ilineNil	-1
260
261
262
263/*
264 * The Symbol Structure		(GFW, to those who Know!)
265 */
266
267typedef struct ecoff_sym {
268    coff_long	value;		/* value of symbol */
269    coff_int	iss;		/* index into String Space of name */
270    unsigned st : 6;	/* symbol type */
271    unsigned sc  : 5;	/* storage class - text, data, etc */
272    unsigned reserved : 1;	/* reserved */
273    unsigned index : 20;	/* index into sym/aux table */
274} SYMR, *pSYMR;
275#define symNil ((pSYMR)0)
276#define cbSYMR sizeof(SYMR)
277#define isymNil -1
278#define indexNil 0xfffff
279#define issNil -1
280#define issNull 0
281
282
283/* The following converts a memory resident string to an iss.
284 * This hack is recognized in SbFIss, in sym.c of the debugger.
285 */
286#define IssFSb(sb) (0x80000000 | ((coff_ulong)(sb)))
287
288/* E X T E R N A L   S Y M B O L  R E C O R D
289 *
290 *	Same as the SYMR except it contains file context to determine where
291 *	the index is.
292 */
293typedef struct ecoff_extsym {
294    SYMR	asym;		/* symbol for the external */
295    unsigned jmptbl:1;	/* symbol is a jump table entry for shlibs */
296    unsigned cobol_main:1;	/* symbol is a cobol main procedure */
297    unsigned weakext:1;	/* symbol is weak external */
298    unsigned reserved:29;	/* reserved for future use */
299    coff_int ifd;		/* where the iss and index fields point into */
300} EXTR, *pEXTR;
301#define extNil ((pEXTR)0)
302#define cbEXTR sizeof(EXTR)
303
304
305/* A U X I L L A R Y   T Y P E	 I N F O R M A T I O N */
306
307/*
308 * Type Information Record
309 */
310typedef struct {
311    unsigned fBitfield : 1; /* set if bit width is specified */
312    unsigned continued : 1; /* indicates additional TQ info in next AUX */
313    unsigned bt  : 6;	/* basic type */
314    unsigned tq4 : 4;
315    unsigned tq5 : 4;
316    /* ---- 16 bit boundary ---- */
317    unsigned tq0 : 4;
318    unsigned tq1 : 4;	/* 6 type qualifiers - tqPtr, etc. */
319    unsigned tq2 : 4;
320    unsigned tq3 : 4;
321} TIR, *pTIR;
322#define cbTIR sizeof(TIR)
323#define tiNil ((pTIR)0)
324#define itqMax 6
325
326/*
327 * Relative symbol record
328 *
329 * If the rfd field is 4095, the index field indexes into the global symbol
330 *	table.
331 */
332
333typedef struct {
334    unsigned	rfd : 12;    /* index into the file indirect table */
335    unsigned	index : 20; /* index int sym/aux/iss tables */
336} RNDXR, *pRNDXR;
337#define cbRNDXR sizeof(RNDXR)
338#define rndxNil ((pRNDXR)0)
339
340/* dense numbers or sometimes called block numbers are stored in this type,
341 *	a rfd of 0xffffffff is an index into the global table.
342 */
343typedef struct {
344    coff_uint	rfd;    /* index into the file table */
345    coff_uint	index; 	/* index int sym/aux/iss tables */
346} DNR, *pDNR;
347#define cbDNR sizeof(DNR)
348#define dnNil ((pDNR)0)
349
350
351
352/*
353 * Auxillary information occurs only if needed.
354 * It ALWAYS occurs in this order when present.
355
356            isymMac		used by stProc only
357            TIR			type info
358            TIR			additional TQ info (if first TIR was not enough)
359            rndx		if (bt == btStruct,btUnion,btEnum,btSet,btRange,
360                                    btTypedef):
361                                    rsym.index == iaux for btSet or btRange
362                                    else rsym.index == isym
363            dimLow		btRange, btSet
364            dimMac		btRange, btSet
365            rndx0		As many as there are tq arrays
366            dimLow0
367            dimHigh0
368            ...
369            rndxMax-1
370            dimLowMax-1
371            dimHighMax-1
372            width in bits	if (bit field), width in bits.
373 */
374#define cAuxMax (6 + (idimMax*3))
375
376/* a union of all possible info in the AUX universe */
377typedef union {
378    TIR	ti;		/* type information record */
379    RNDXR	rndx;		/* relative index into symbol table */
380    coff_int	dnLow;		/* low dimension */
381    coff_int	dnHigh;		/* high dimension */
382    coff_int	isym;		/* symbol table index (end of proc) */
383    coff_int	iss;		/* index into string space (not used) */
384    coff_int	width;		/* width for non-default sized struc fields */
385    coff_int	count;		/* count of ranges for variant arm */
386} AUXU, *pAUXU;
387#define cbAUXU sizeof(AUXU)
388#define auxNil ((pAUXU)0)
389#define iauxNil -1
390
391
392/*
393 * Optimization symbols
394 *
395 * Optimization symbols contain some overlap information with the normal
396 * symbol table. In particular, the proc information
397 * is somewhat redundant but necessary to easily find the other information
398 * present.
399 *
400 * All of the offsets are relative to the beginning of the last otProc
401 */
402
403typedef struct {
404    unsigned ot: 8;		/* optimization type */
405    unsigned value: 24;	/* address where we are moving it to */
406    RNDXR	rndx;		/* points to a symbol or opt entry */
407    coff_ulong	offset;	/* relative offset this occured */
408} OPTR, *pOPTR;
409#define optNil	((pOPTR) 0)
410#define cbOPTR sizeof(OPTR)
411#define ioptNil -1
412
413/*
414 * File Indirect
415 *
416 * When a symbol is referenced across files the following procedure is used:
417 *	1) use the file index to get the File indirect entry.
418 *	2) use the file indirect entry to get the File descriptor.
419 *	3) add the sym index to the base of that file's sym table
420 *
421 */
422
423typedef coff_long RFDT, *pRFDT;
424#define cbRFDT sizeof(RFDT)
425#define rfdNil	-1
426
427/*
428 * The file indirect table in the mips loader is known as an array of FITs.
429 * This is done to keep the code in the loader readable in the area where
430 * these tables are merged.  Note this is only a name change.
431 */
432typedef coff_int FIT, *pFIT;
433#define cbFIT	sizeof(FIT)
434#define ifiNil	-1
435#define fiNil	((pFIT) 0)
436
437#ifdef _LANGUAGE_PASCAL
438#define ifdNil -1
439#define ilnNil -1
440#define ipdNil -1
441#define ilineNil -1
442#define isymNil -1
443#define indexNil 16#fffff
444#define issNil -1
445#define issNull 0
446#define itqMax 6
447#define iauxNil -1
448#define ioptNil -1
449#define rfdNil -1
450#define ifiNil -1
451#endif	/* _LANGUAGE_PASCAL */
452
453
454/* Dense numbers
455 *
456 * Rather than use file index, symbol index pairs to represent symbols
457 *	and globals, we use dense number so that they can be easily embeded
458 *	in intermediate code and the programs that process them can
459 *	use direct access tabls instead of hash table (which would be
460 *	necesary otherwise because of the sparse name space caused by
461 *	file index, symbol index pairs. Dense number are represented
462 *	by RNDXRs.
463 */
464
465/*
466 * The following table defines the meaning of each SYM field as
467 * a function of the "st". (scD/B == scData OR scBss)
468 *
469 * Note: the value "isymMac" is used by symbols that have the concept
470 * of enclosing a block of related information.	 This value is the
471 * isym of the first symbol AFTER the end associated with the primary
472 * symbol. For example if a procedure was at isym==90 and had an
473 * isymMac==155, the associated end would be at isym==154, and the
474 * symbol at 155 would probably (although not necessarily) be the
475 * symbol for the next procedure.  This allows rapid skipping over
476 * internal information of various sorts. "stEnd"s ALWAYS have the
477 * isym of the primary symbol that started the block.
478 *
479
480ST		SC	VALUE		INDEX
481--------	------	--------	------
482stFile		scText	address		isymMac
483stLabel		scText	address		---
484stGlobal	scD/B	address		iaux
485stStatic	scD/B	address		iaux
486stParam		scAbs	offset		iaux
487stLocal		scAbs	offset		iaux
488stProc		scText	address		iaux	(isymMac is first AUX)
489stStaticProc	scText	address		iaux	(isymMac is first AUX)
490
491stMember	scNil	ordinal		---	(if member of enum)
492        (mipsread thinks the case below has a bit, not byte, offset.)
493stMember	scNil	byte offset	iaux	(if member of struct/union)
494stMember	scBits	bit offset	iaux	(bit field spec)
495
496stBlock		scText	address		isymMac (text block)
497        (the code seems to think that rather than scNil, we see scInfo for
498         the two cases below.)
499stBlock		scNil	cb		isymMac (struct/union member define)
500stBlock		scNil	cMembers	isymMac (enum member define)
501
502        (New types added by SGI to simplify things:)
503stStruct	scInfo	cb		isymMac (struct type define)
504stUnion		scInfo	cb		isymMac (union  type define)
505stEnum		scInfo	cMembers	isymMac (enum   type define)
506
507stEnd		scText	address		isymStart
508stEnd		scNil	-------		isymStart (struct/union/enum)
509
510stTypedef	scNil	-------		iaux
511stRegReloc	sc???	value		old register number
512stForward	sc???	new address	isym to original symbol
513
514stConstant	scInfo	value		--- (scalar)
515stConstant	scInfo	iss		--- (complex, e.g. string)
516
517 *
518 */
519#endif
520