xref: /openbsd/gnu/usr.bin/binutils-2.17/gas/ecoff.c (revision 3d8817e4)
1 /* ECOFF debugging support.
2    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3    2003, 2004, 2005
4    Free Software Foundation, Inc.
5    Contributed by Cygnus Support.
6    This file was put together by Ian Lance Taylor <ian@cygnus.com>.  A
7    good deal of it comes directly from mips-tfile.c, by Michael
8    Meissner <meissner@osf.org>.
9 
10    This file is part of GAS.
11 
12    GAS is free software; you can redistribute it and/or modify
13    it under the terms of the GNU General Public License as published by
14    the Free Software Foundation; either version 2, or (at your option)
15    any later version.
16 
17    GAS is distributed in the hope that it will be useful,
18    but WITHOUT ANY WARRANTY; without even the implied warranty of
19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20    GNU General Public License for more details.
21 
22    You should have received a copy of the GNU General Public License
23    along with GAS; see the file COPYING.  If not, write to the Free
24    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
25    02110-1301, USA.  */
26 
27 #include "as.h"
28 
29 /* This file is compiled conditionally for those targets which use
30    ECOFF debugging information (e.g., MIPS ECOFF, MIPS ELF, Alpha
31    ECOFF).  */
32 
33 #include "ecoff.h"
34 
35 #ifdef ECOFF_DEBUGGING
36 
37 #include "coff/internal.h"
38 #include "coff/symconst.h"
39 #include "aout/stab_gnu.h"
40 
41 #include "safe-ctype.h"
42 
43 /* Why isn't this in coff/sym.h?  */
44 #define ST_RFDESCAPE 0xfff
45 
46 /* This file constructs the information used by the ECOFF debugging
47    format.  It just builds a large block of data.
48 
49    We support both ECOFF style debugging and stabs debugging (the
50    stabs symbols are encapsulated in ECOFF symbols).  This should let
51    us handle anything the compiler might throw at us.  */
52 
53 /* Here is a brief description of the MIPS ECOFF symbol table, by
54    Michael Meissner.  The MIPS symbol table has the following pieces:
55 
56 	Symbolic Header
57 	    |
58 	    +--	Auxiliary Symbols
59 	    |
60 	    +--	Dense number table
61 	    |
62 	    +--	Optimizer Symbols
63 	    |
64 	    +--	External Strings
65 	    |
66 	    +--	External Symbols
67 	    |
68 	    +--	Relative file descriptors
69 	    |
70 	    +--	File table
71 		    |
72 		    +--	Procedure table
73 		    |
74 		    +--	Line number table
75 		    |
76 		    +--	Local Strings
77 		    |
78 		    +--	Local Symbols
79 
80    The symbolic header points to each of the other tables, and also
81    contains the number of entries.  It also contains a magic number
82    and MIPS compiler version number, such as 2.0.
83 
84    The auxiliary table is a series of 32 bit integers, that are
85    referenced as needed from the local symbol table.  Unlike standard
86    COFF, the aux.  information does not follow the symbol that uses
87    it, but rather is a separate table.  In theory, this would allow
88    the MIPS compilers to collapse duplicate aux. entries, but I've not
89    noticed this happening with the 1.31 compiler suite.  The different
90    types of aux. entries are:
91 
92     1)	dnLow: Low bound on array dimension.
93 
94     2)	dnHigh: High bound on array dimension.
95 
96     3)	isym: Index to the local symbol which is the start of the
97 	function for the end of function first aux. entry.
98 
99     4)	width: Width of structures and bitfields.
100 
101     5)	count: Count of ranges for variant part.
102 
103     6)	rndx: A relative index into the symbol table.  The relative
104 	index field has two parts: rfd which is a pointer into the
105 	relative file index table or ST_RFDESCAPE which says the next
106 	aux. entry is the file number, and index: which is the pointer
107 	into the local symbol within a given file table.  This is for
108 	things like references to types defined in another file.
109 
110     7)	Type information: This is like the COFF type bits, except it
111 	is 32 bits instead of 16; they still have room to add new
112 	basic types; and they can handle more than 6 levels of array,
113 	pointer, function, etc.  Each type information field contains
114 	the following structure members:
115 
116 	    a)	fBitfield: a bit that says this is a bitfield, and the
117 		size in bits follows as the next aux. entry.
118 
119 	    b)	continued: a bit that says the next aux. entry is a
120 		continuation of the current type information (in case
121 		there are more than 6 levels of array/ptr/function).
122 
123 	    c)	bt: an integer containing the base type before adding
124 		array, pointer, function, etc. qualifiers.  The
125 		current base types that I have documentation for are:
126 
127 			btNil		-- undefined
128 			btAdr		-- address - integer same size as ptr
129 			btChar		-- character
130 			btUChar		-- unsigned character
131 			btShort		-- short
132 			btUShort	-- unsigned short
133 			btInt		-- int
134 			btUInt		-- unsigned int
135 			btLong		-- long
136 			btULong		-- unsigned long
137 			btFloat		-- float (real)
138 			btDouble	-- Double (real)
139 			btStruct	-- Structure (Record)
140 			btUnion		-- Union (variant)
141 			btEnum		-- Enumerated
142 			btTypedef	-- defined via a typedef isymRef
143 			btRange		-- subrange of int
144 			btSet		-- pascal sets
145 			btComplex	-- fortran complex
146 			btDComplex	-- fortran double complex
147 			btIndirect	-- forward or unnamed typedef
148 			btFixedDec	-- Fixed Decimal
149 			btFloatDec	-- Float Decimal
150 			btString	-- Varying Length Character String
151 			btBit		-- Aligned Bit String
152 			btPicture	-- Picture
153 			btVoid		-- Void (MIPS cc revision >= 2.00)
154 
155 	    d)	tq0 - tq5: type qualifier fields as needed.  The
156 		current type qualifier fields I have documentation for
157 		are:
158 
159 			tqNil		-- no more qualifiers
160 			tqPtr		-- pointer
161 			tqProc		-- procedure
162 			tqArray		-- array
163 			tqFar		-- 8086 far pointers
164 			tqVol		-- volatile
165 
166    The dense number table is used in the front ends, and disappears by
167    the time the .o is created.
168 
169    With the 1.31 compiler suite, the optimization symbols don't seem
170    to be used as far as I can tell.
171 
172    The linker is the first entity that creates the relative file
173    descriptor table, and I believe it is used so that the individual
174    file table pointers don't have to be rewritten when the objects are
175    merged together into the program file.
176 
177    Unlike COFF, the basic symbol & string tables are split into
178    external and local symbols/strings.  The relocation information
179    only goes off of the external symbol table, and the debug
180    information only goes off of the internal symbol table.  The
181    external symbols can have links to an appropriate file index and
182    symbol within the file to give it the appropriate type information.
183    Because of this, the external symbols are actually larger than the
184    internal symbols (to contain the link information), and contain the
185    local symbol structure as a member, though this member is not the
186    first member of the external symbol structure (!).  I suspect this
187    split is to make strip easier to deal with.
188 
189    Each file table has offsets for where the line numbers, local
190    strings, local symbols, and procedure table starts from within the
191    global tables, and the indexs are reset to 0 for each of those
192    tables for the file.
193 
194    The procedure table contains the binary equivalents of the .ent
195    (start of the function address), .frame (what register is the
196    virtual frame pointer, constant offset from the register to obtain
197    the VFP, and what register holds the return address), .mask/.fmask
198    (bitmask of saved registers, and where the first register is stored
199    relative to the VFP) assembler directives.  It also contains the
200    low and high bounds of the line numbers if debugging is turned on.
201 
202    The line number table is a compressed form of the normal COFF line
203    table.  Each line number entry is either 1 or 3 bytes long, and
204    contains a signed delta from the previous line, and an unsigned
205    count of the number of instructions this statement takes.
206 
207    The local symbol table contains the following fields:
208 
209     1)	iss: index to the local string table giving the name of the
210 	symbol.
211 
212     2)	value: value of the symbol (address, register number, etc.).
213 
214     3)	st: symbol type.  The current symbol types are:
215 
216 	    stNil	  -- Nuthin' special
217 	    stGlobal	  -- external symbol
218 	    stStatic	  -- static
219 	    stParam	  -- procedure argument
220 	    stLocal	  -- local variable
221 	    stLabel	  -- label
222 	    stProc	  -- External Procedure
223 	    stBlock	  -- beginning of block
224 	    stEnd	  -- end (of anything)
225 	    stMember	  -- member (of anything)
226 	    stTypedef	  -- type definition
227 	    stFile	  -- file name
228 	    stRegReloc	  -- register relocation
229 	    stForward	  -- forwarding address
230 	    stStaticProc  -- Static procedure
231 	    stConstant	  -- const
232 
233     4)	sc: storage class.  The current storage classes are:
234 
235 	    scText	  -- text symbol
236 	    scData	  -- initialized data symbol
237 	    scBss	  -- un-initialized data symbol
238 	    scRegister	  -- value of symbol is register number
239 	    scAbs	  -- value of symbol is absolute
240 	    scUndefined   -- who knows?
241 	    scCdbLocal	  -- variable's value is IN se->va.??
242 	    scBits	  -- this is a bit field
243 	    scCdbSystem	  -- value is IN debugger's address space
244 	    scRegImage	  -- register value saved on stack
245 	    scInfo	  -- symbol contains debugger information
246 	    scUserStruct  -- addr in struct user for current process
247 	    scSData	  -- load time only small data
248 	    scSBss	  -- load time only small common
249 	    scRData	  -- load time only read only data
250 	    scVar	  -- Var parameter (fortranpascal)
251 	    scCommon	  -- common variable
252 	    scSCommon	  -- small common
253 	    scVarRegister -- Var parameter in a register
254 	    scVariant	  -- Variant record
255 	    scSUndefined  -- small undefined(external) data
256 	    scInit	  -- .init section symbol
257 
258     5)	index: pointer to a local symbol or aux. entry.
259 
260    For the following program:
261 
262 	#include <stdio.h>
263 
264 	main(){
265 		printf("Hello World!\n");
266 		return 0;
267 	}
268 
269    Mips-tdump produces the following information:
270 
271    Global file header:
272        magic number             0x162
273        # sections               2
274        timestamp                645311799, Wed Jun 13 17:16:39 1990
275        symbolic header offset   284
276        symbolic header size     96
277        optional header          56
278        flags                    0x0
279 
280    Symbolic header, magic number = 0x7009, vstamp = 1.31:
281 
282        Info                      Offset      Number       Bytes
283        ====                      ======      ======      =====
284 
285        Line numbers                 380           4           4 [13]
286        Dense numbers                  0           0           0
287        Procedures Tables            384           1          52
288        Local Symbols                436          16         192
289        Optimization Symbols           0           0           0
290        Auxiliary Symbols            628          39         156
291        Local Strings                784          80          80
292        External Strings             864         144         144
293        File Tables                 1008           2         144
294        Relative Files                 0           0           0
295        External Symbols            1152          20         320
296 
297    File #0, "hello2.c"
298 
299        Name index  = 1          Readin      = No
300        Merge       = No         Endian      = LITTLE
301        Debug level = G2         Language    = C
302        Adr         = 0x00000000
303 
304        Info                       Start      Number        Size      Offset
305        ====                       =====      ======        ====      ======
306        Local strings                  0          15          15         784
307        Local symbols                  0           6          72         436
308        Line numbers                   0          13          13         380
309        Optimization symbols           0           0           0           0
310        Procedures                     0           1          52         384
311        Auxiliary symbols              0          14          56         628
312        Relative Files                 0           0           0           0
313 
314     There are 6 local symbols, starting at 436
315 
316 	Symbol# 0: "hello2.c"
317 	    End+1 symbol  = 6
318 	    String index  = 1
319 	    Storage class = Text        Index  = 6
320 	    Symbol type   = File        Value  = 0
321 
322 	Symbol# 1: "main"
323 	    End+1 symbol  = 5
324 	    Type          = int
325 	    String index  = 10
326 	    Storage class = Text        Index  = 12
327 	    Symbol type   = Proc        Value  = 0
328 
329 	Symbol# 2: ""
330 	    End+1 symbol  = 4
331 	    String index  = 0
332 	    Storage class = Text        Index  = 4
333 	    Symbol type   = Block       Value  = 8
334 
335 	Symbol# 3: ""
336 	    First symbol  = 2
337 	    String index  = 0
338 	    Storage class = Text        Index  = 2
339 	    Symbol type   = End         Value  = 28
340 
341 	Symbol# 4: "main"
342 	    First symbol  = 1
343 	    String index  = 10
344 	    Storage class = Text        Index  = 1
345 	    Symbol type   = End         Value  = 52
346 
347 	Symbol# 5: "hello2.c"
348 	    First symbol  = 0
349 	    String index  = 1
350 	    Storage class = Text        Index  = 0
351 	    Symbol type   = End         Value  = 0
352 
353     There are 14 auxiliary table entries, starting at 628.
354 
355 	* #0               0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
356 	* #1              24, [  24/      0], [ 6 0:0 0:0:0:0:0:0]
357 	* #2               8, [   8/      0], [ 2 0:0 0:0:0:0:0:0]
358 	* #3              16, [  16/      0], [ 4 0:0 0:0:0:0:0:0]
359 	* #4              24, [  24/      0], [ 6 0:0 0:0:0:0:0:0]
360 	* #5              32, [  32/      0], [ 8 0:0 0:0:0:0:0:0]
361 	* #6              40, [  40/      0], [10 0:0 0:0:0:0:0:0]
362 	* #7              44, [  44/      0], [11 0:0 0:0:0:0:0:0]
363 	* #8              12, [  12/      0], [ 3 0:0 0:0:0:0:0:0]
364 	* #9              20, [  20/      0], [ 5 0:0 0:0:0:0:0:0]
365 	* #10             28, [  28/      0], [ 7 0:0 0:0:0:0:0:0]
366 	* #11             36, [  36/      0], [ 9 0:0 0:0:0:0:0:0]
367 	  #12              5, [   5/      0], [ 1 1:0 0:0:0:0:0:0]
368 	  #13             24, [  24/      0], [ 6 0:0 0:0:0:0:0:0]
369 
370     There are 1 procedure descriptor entries, starting at 0.
371 
372 	Procedure descriptor 0:
373 	    Name index   = 10          Name          = "main"
374 	    .mask 0x80000000,-4        .fmask 0x00000000,0
375 	    .frame $29,24,$31
376 	    Opt. start   = -1          Symbols start = 1
377 	    First line # = 3           Last line #   = 6
378 	    Line Offset  = 0           Address       = 0x00000000
379 
380 	There are 4 bytes holding line numbers, starting at 380.
381 	    Line           3,   delta     0,   count  2
382 	    Line           4,   delta     1,   count  3
383 	    Line           5,   delta     1,   count  2
384 	    Line           6,   delta     1,   count  6
385 
386    File #1, "/usr/include/stdio.h"
387 
388     Name index  = 1          Readin      = No
389     Merge       = Yes        Endian      = LITTLE
390     Debug level = G2         Language    = C
391     Adr         = 0x00000000
392 
393     Info                       Start      Number        Size      Offset
394     ====                       =====      ======        ====      ======
395     Local strings                 15          65          65         799
396     Local symbols                  6          10         120         508
397     Line numbers                   0           0           0         380
398     Optimization symbols           0           0           0           0
399     Procedures                     1           0           0         436
400     Auxiliary symbols             14          25         100         684
401     Relative Files                 0           0           0           0
402 
403     There are 10 local symbols, starting at 442
404 
405 	Symbol# 0: "/usr/include/stdio.h"
406 	    End+1 symbol  = 10
407 	    String index  = 1
408 	    Storage class = Text        Index  = 10
409 	    Symbol type   = File        Value  = 0
410 
411 	Symbol# 1: "_iobuf"
412 	    End+1 symbol  = 9
413 	    String index  = 22
414 	    Storage class = Info        Index  = 9
415 	    Symbol type   = Block       Value  = 20
416 
417 	Symbol# 2: "_cnt"
418 	    Type          = int
419 	    String index  = 29
420 	    Storage class = Info        Index  = 4
421 	    Symbol type   = Member      Value  = 0
422 
423 	Symbol# 3: "_ptr"
424 	    Type          = ptr to char
425 	    String index  = 34
426 	    Storage class = Info        Index  = 15
427 	    Symbol type   = Member      Value  = 32
428 
429 	Symbol# 4: "_base"
430 	    Type          = ptr to char
431 	    String index  = 39
432 	    Storage class = Info        Index  = 16
433 	    Symbol type   = Member      Value  = 64
434 
435 	Symbol# 5: "_bufsiz"
436 	    Type          = int
437 	    String index  = 45
438 	    Storage class = Info        Index  = 4
439 	    Symbol type   = Member      Value  = 96
440 
441 	Symbol# 6: "_flag"
442 	    Type          = short
443 	    String index  = 53
444 	    Storage class = Info        Index  = 3
445 	    Symbol type   = Member      Value  = 128
446 
447 	Symbol# 7: "_file"
448 	    Type          = char
449 	    String index  = 59
450 	    Storage class = Info        Index  = 2
451 	    Symbol type   = Member      Value  = 144
452 
453 	Symbol# 8: ""
454 	    First symbol  = 1
455 	    String index  = 0
456 	    Storage class = Info        Index  = 1
457 	    Symbol type   = End         Value  = 0
458 
459 	Symbol# 9: "/usr/include/stdio.h"
460 	    First symbol  = 0
461 	    String index  = 1
462 	    Storage class = Text        Index  = 0
463 	    Symbol type   = End         Value  = 0
464 
465     There are 25 auxiliary table entries, starting at 642.
466 
467 	* #14             -1, [4095/1048575], [63 1:1 f:f:f:f:f:f]
468 	  #15          65544, [   8/     16], [ 2 0:0 1:0:0:0:0:0]
469 	  #16          65544, [   8/     16], [ 2 0:0 1:0:0:0:0:0]
470 	* #17         196656, [  48/     48], [12 0:0 3:0:0:0:0:0]
471 	* #18           8191, [4095/      1], [63 1:1 0:0:0:0:f:1]
472 	* #19              1, [   1/      0], [ 0 1:0 0:0:0:0:0:0]
473 	* #20          20479, [4095/      4], [63 1:1 0:0:0:0:f:4]
474 	* #21              1, [   1/      0], [ 0 1:0 0:0:0:0:0:0]
475 	* #22              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
476 	* #23              2, [   2/      0], [ 0 0:1 0:0:0:0:0:0]
477 	* #24            160, [ 160/      0], [40 0:0 0:0:0:0:0:0]
478 	* #25              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
479 	* #26              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
480 	* #27              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
481 	* #28              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
482 	* #29              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
483 	* #30              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
484 	* #31              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
485 	* #32              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
486 	* #33              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
487 	* #34              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
488 	* #35              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
489 	* #36              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
490 	* #37              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
491 	* #38              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
492 
493     There are 0 procedure descriptor entries, starting at 1.
494 
495    There are 20 external symbols, starting at 1152
496 
497 	Symbol# 0: "_iob"
498 	    Type          = array [3 {160}] of struct _iobuf { ifd = 1, index = 1 }
499 	    String index  = 0           Ifd    = 1
500 	    Storage class = Nil         Index  = 17
501 	    Symbol type   = Global      Value  = 60
502 
503 	Symbol# 1: "fopen"
504 	    String index  = 5           Ifd    = 1
505 	    Storage class = Nil         Index  = 1048575
506 	    Symbol type   = Proc        Value  = 0
507 
508 	Symbol# 2: "fdopen"
509 	    String index  = 11          Ifd    = 1
510 	    Storage class = Nil         Index  = 1048575
511 	    Symbol type   = Proc        Value  = 0
512 
513 	Symbol# 3: "freopen"
514 	    String index  = 18          Ifd    = 1
515 	    Storage class = Nil         Index  = 1048575
516 	    Symbol type   = Proc        Value  = 0
517 
518 	Symbol# 4: "popen"
519 	    String index  = 26          Ifd    = 1
520 	    Storage class = Nil         Index  = 1048575
521 	    Symbol type   = Proc        Value  = 0
522 
523 	Symbol# 5: "tmpfile"
524 	    String index  = 32          Ifd    = 1
525 	    Storage class = Nil         Index  = 1048575
526 	    Symbol type   = Proc        Value  = 0
527 
528 	Symbol# 6: "ftell"
529 	    String index  = 40          Ifd    = 1
530 	    Storage class = Nil         Index  = 1048575
531 	    Symbol type   = Proc        Value  = 0
532 
533 	Symbol# 7: "rewind"
534 	    String index  = 46          Ifd    = 1
535 	    Storage class = Nil         Index  = 1048575
536 	    Symbol type   = Proc        Value  = 0
537 
538 	Symbol# 8: "setbuf"
539 	    String index  = 53          Ifd    = 1
540 	    Storage class = Nil         Index  = 1048575
541 	    Symbol type   = Proc        Value  = 0
542 
543 	Symbol# 9: "setbuffer"
544 	    String index  = 60          Ifd    = 1
545 	    Storage class = Nil         Index  = 1048575
546 	    Symbol type   = Proc        Value  = 0
547 
548 	Symbol# 10: "setlinebuf"
549 	    String index  = 70          Ifd    = 1
550 	    Storage class = Nil         Index  = 1048575
551 	    Symbol type   = Proc        Value  = 0
552 
553 	Symbol# 11: "fgets"
554 	    String index  = 81          Ifd    = 1
555 	    Storage class = Nil         Index  = 1048575
556 	    Symbol type   = Proc        Value  = 0
557 
558 	Symbol# 12: "gets"
559 	    String index  = 87          Ifd    = 1
560 	    Storage class = Nil         Index  = 1048575
561 	    Symbol type   = Proc        Value  = 0
562 
563 	Symbol# 13: "ctermid"
564 	    String index  = 92          Ifd    = 1
565 	    Storage class = Nil         Index  = 1048575
566 	    Symbol type   = Proc        Value  = 0
567 
568 	Symbol# 14: "cuserid"
569 	    String index  = 100         Ifd    = 1
570 	    Storage class = Nil         Index  = 1048575
571 	    Symbol type   = Proc        Value  = 0
572 
573 	Symbol# 15: "tempnam"
574 	    String index  = 108         Ifd    = 1
575 	    Storage class = Nil         Index  = 1048575
576 	    Symbol type   = Proc        Value  = 0
577 
578 	Symbol# 16: "tmpnam"
579 	    String index  = 116         Ifd    = 1
580 	    Storage class = Nil         Index  = 1048575
581 	    Symbol type   = Proc        Value  = 0
582 
583 	Symbol# 17: "sprintf"
584 	    String index  = 123         Ifd    = 1
585 	    Storage class = Nil         Index  = 1048575
586 	    Symbol type   = Proc        Value  = 0
587 
588 	Symbol# 18: "main"
589 	    Type          = int
590 	    String index  = 131         Ifd    = 0
591 	    Storage class = Text        Index  = 1
592 	    Symbol type   = Proc        Value  = 0
593 
594 	Symbol# 19: "printf"
595 	    String index  = 136         Ifd    = 0
596 	    Storage class = Undefined   Index  = 1048575
597 	    Symbol type   = Proc        Value  = 0
598 
599    The following auxiliary table entries were unused:
600 
601     #0               0  0x00000000  void
602     #2               8  0x00000008  char
603     #3              16  0x00000010  short
604     #4              24  0x00000018  int
605     #5              32  0x00000020  long
606     #6              40  0x00000028  float
607     #7              44  0x0000002c  double
608     #8              12  0x0000000c  unsigned char
609     #9              20  0x00000014  unsigned short
610     #10             28  0x0000001c  unsigned int
611     #11             36  0x00000024  unsigned long
612     #14              0  0x00000000  void
613     #15             24  0x00000018  int
614     #19             32  0x00000020  long
615     #20             40  0x00000028  float
616     #21             44  0x0000002c  double
617     #22             12  0x0000000c  unsigned char
618     #23             20  0x00000014  unsigned short
619     #24             28  0x0000001c  unsigned int
620     #25             36  0x00000024  unsigned long
621     #26             48  0x00000030  struct no name { ifd = -1, index = 1048575 }
622 */
623 
624 /* Redefinition of of storage classes as an enumeration for better
625    debugging.  */
626 
627 typedef enum sc {
628   sc_Nil	 = scNil,	  /* no storage class */
629   sc_Text	 = scText,	  /* text symbol */
630   sc_Data	 = scData,	  /* initialized data symbol */
631   sc_Bss	 = scBss,	  /* un-initialized data symbol */
632   sc_Register	 = scRegister,	  /* value of symbol is register number */
633   sc_Abs	 = scAbs,	  /* value of symbol is absolute */
634   sc_Undefined	 = scUndefined,	  /* who knows? */
635   sc_CdbLocal	 = scCdbLocal,	  /* variable's value is IN se->va.?? */
636   sc_Bits	 = scBits,	  /* this is a bit field */
637   sc_CdbSystem	 = scCdbSystem,	  /* value is IN CDB's address space */
638   sc_RegImage	 = scRegImage,	  /* register value saved on stack */
639   sc_Info	 = scInfo,	  /* symbol contains debugger information */
640   sc_UserStruct	 = scUserStruct,  /* addr in struct user for current process */
641   sc_SData	 = scSData,	  /* load time only small data */
642   sc_SBss	 = scSBss,	  /* load time only small common */
643   sc_RData	 = scRData,	  /* load time only read only data */
644   sc_Var	 = scVar,	  /* Var parameter (fortran,pascal) */
645   sc_Common	 = scCommon,	  /* common variable */
646   sc_SCommon	 = scSCommon,	  /* small common */
647   sc_VarRegister = scVarRegister, /* Var parameter in a register */
648   sc_Variant	 = scVariant,	  /* Variant record */
649   sc_SUndefined	 = scSUndefined,  /* small undefined(external) data */
650   sc_Init	 = scInit,	  /* .init section symbol */
651   sc_Max	 = scMax	  /* Max storage class+1 */
652 } sc_t;
653 
654 /* Redefinition of symbol type.  */
655 
656 typedef enum st {
657   st_Nil	= stNil,	/* Nuthin' special */
658   st_Global	= stGlobal,	/* external symbol */
659   st_Static	= stStatic,	/* static */
660   st_Param	= stParam,	/* procedure argument */
661   st_Local	= stLocal,	/* local variable */
662   st_Label	= stLabel,	/* label */
663   st_Proc	= stProc,	/*     "      "	 Procedure */
664   st_Block	= stBlock,	/* beginning of block */
665   st_End	= stEnd,	/* end (of anything) */
666   st_Member	= stMember,	/* member (of anything	- struct/union/enum */
667   st_Typedef	= stTypedef,	/* type definition */
668   st_File	= stFile,	/* file name */
669   st_RegReloc	= stRegReloc,	/* register relocation */
670   st_Forward	= stForward,	/* forwarding address */
671   st_StaticProc	= stStaticProc,	/* load time only static procs */
672   st_Constant	= stConstant,	/* const */
673   st_Str	= stStr,	/* string */
674   st_Number	= stNumber,	/* pure number (ie. 4 NOR 2+2) */
675   st_Expr	= stExpr,	/* 2+2 vs. 4 */
676   st_Type	= stType,	/* post-coercion SER */
677   st_Max	= stMax		/* max type+1 */
678 } st_t;
679 
680 /* Redefinition of type qualifiers.  */
681 
682 typedef enum tq {
683   tq_Nil	= tqNil,	/* bt is what you see */
684   tq_Ptr	= tqPtr,	/* pointer */
685   tq_Proc	= tqProc,	/* procedure */
686   tq_Array	= tqArray,	/* duh */
687   tq_Far	= tqFar,	/* longer addressing - 8086/8 land */
688   tq_Vol	= tqVol,	/* volatile */
689   tq_Max	= tqMax		/* Max type qualifier+1 */
690 } tq_t;
691 
692 /* Redefinition of basic types.  */
693 
694 typedef enum bt {
695   bt_Nil	= btNil,	/* undefined */
696   bt_Adr	= btAdr,	/* address - integer same size as pointer */
697   bt_Char	= btChar,	/* character */
698   bt_UChar	= btUChar,	/* unsigned character */
699   bt_Short	= btShort,	/* short */
700   bt_UShort	= btUShort,	/* unsigned short */
701   bt_Int	= btInt,	/* int */
702   bt_UInt	= btUInt,	/* unsigned int */
703   bt_Long	= btLong,	/* long */
704   bt_ULong	= btULong,	/* unsigned long */
705   bt_Float	= btFloat,	/* float (real) */
706   bt_Double	= btDouble,	/* Double (real) */
707   bt_Struct	= btStruct,	/* Structure (Record) */
708   bt_Union	= btUnion,	/* Union (variant) */
709   bt_Enum	= btEnum,	/* Enumerated */
710   bt_Typedef	= btTypedef,	/* defined via a typedef, isymRef points */
711   bt_Range	= btRange,	/* subrange of int */
712   bt_Set	= btSet,	/* pascal sets */
713   bt_Complex	= btComplex,	/* fortran complex */
714   bt_DComplex	= btDComplex,	/* fortran double complex */
715   bt_Indirect	= btIndirect,	/* forward or unnamed typedef */
716   bt_FixedDec	= btFixedDec,	/* Fixed Decimal */
717   bt_FloatDec	= btFloatDec,	/* Float Decimal */
718   bt_String	= btString,	/* Varying Length Character String */
719   bt_Bit	= btBit,	/* Aligned Bit String */
720   bt_Picture	= btPicture,	/* Picture */
721   bt_Void	= btVoid,	/* Void */
722   bt_Max	= btMax		/* Max basic type+1 */
723 } bt_t;
724 
725 #define N_TQ itqMax
726 
727 /* States for whether to hash type or not.  */
728 typedef enum hash_state {
729   hash_no	= 0,		/* Don't hash type */
730   hash_yes	= 1,		/* OK to hash type, or use previous hash */
731   hash_record	= 2		/* OK to record hash, but don't use prev.  */
732 } hash_state_t;
733 
734 /* Types of different sized allocation requests.  */
735 enum alloc_type {
736   alloc_type_none,		/* dummy value */
737   alloc_type_scope,		/* nested scopes linked list */
738   alloc_type_vlinks,		/* glue linking pages in varray */
739   alloc_type_shash,		/* string hash element */
740   alloc_type_thash,		/* type hash element */
741   alloc_type_tag,		/* struct/union/tag element */
742   alloc_type_forward,		/* element to hold unknown tag */
743   alloc_type_thead,		/* head of type hash list */
744   alloc_type_varray,		/* general varray allocation */
745   alloc_type_lineno,		/* line number list */
746   alloc_type_last		/* last+1 element for array bounds */
747 };
748 
749 /* Types of auxiliary type information.  */
750 enum aux_type {
751   aux_tir,			/* TIR type information */
752   aux_rndx,			/* relative index into symbol table */
753   aux_dnLow,			/* low dimension */
754   aux_dnHigh,			/* high dimension */
755   aux_isym,			/* symbol table index (end of proc) */
756   aux_iss,			/* index into string space (not used) */
757   aux_width,			/* width for non-default sized struc fields */
758   aux_count			/* count of ranges for variant arm */
759 };
760 
761 /* Structures to provide n-number of virtual arrays, each of which can
762    grow linearly, and which are written in the object file as
763    sequential pages.  On systems with a BSD malloc, the
764    MAX_CLUSTER_PAGES should be 1 less than a power of two, since
765    malloc adds it's overhead, and rounds up to the next power of 2.
766    Pages are linked together via a linked list.
767 
768    If PAGE_SIZE is > 4096, the string length in the shash_t structure
769    can't be represented (assuming there are strings > 4096 bytes).  */
770 
771 /* FIXME: Yes, there can be such strings while emitting C++ class debug
772    info.  Templates are the offender here, the test case in question
773    having a mangled class name of
774 
775      t7rb_tree4Z4xkeyZt4pair2ZC4xkeyZt7xsocket1Z4UserZt9select1st2Zt4pair\
776      2ZC4xkeyZt7xsocket1Z4UserZ4xkeyZt4less1Z4xkey
777 
778    Repeat that a couple dozen times while listing the class members and
779    you've got strings over 4k.  Hack around this for now by increasing
780    the page size.  A proper solution would abandon this structure scheme
781    certainly for very large strings, and possibly entirely.  */
782 
783 #ifndef PAGE_SIZE
784 #define PAGE_SIZE (8*1024)	/* size of varray pages */
785 #endif
786 
787 #define PAGE_USIZE ((unsigned long) PAGE_SIZE)
788 
789 #ifndef MAX_CLUSTER_PAGES	/* # pages to get from system */
790 #define MAX_CLUSTER_PAGES 63
791 #endif
792 
793 /* Linked list connecting separate page allocations.  */
794 typedef struct vlinks {
795   struct vlinks	*prev;		/* previous set of pages */
796   struct vlinks *next;		/* next set of pages */
797   union  page   *datum;		/* start of page */
798   unsigned long	 start_index;	/* starting index # of page */
799 } vlinks_t;
800 
801 /* Virtual array header.  */
802 typedef struct varray {
803   vlinks_t	*first;			/* first page link */
804   vlinks_t	*last;			/* last page link */
805   unsigned long	 num_allocated;		/* # objects allocated */
806   unsigned short object_size;		/* size in bytes of each object */
807   unsigned short objects_per_page;	/* # objects that can fit on a page */
808   unsigned short objects_last_page;	/* # objects allocated on last page */
809 } varray_t;
810 
811 #ifndef MALLOC_CHECK
812 #define OBJECTS_PER_PAGE(type) (PAGE_SIZE / sizeof (type))
813 #else
814 #define OBJECTS_PER_PAGE(type) ((sizeof (type) > 1) ? 1 : PAGE_SIZE)
815 #endif
816 
817 #define INIT_VARRAY(type) {	/* macro to initialize a varray */	\
818   (vlinks_t *)0,		/* first */				\
819   (vlinks_t *)0,		/* last */				\
820   0,				/* num_allocated */			\
821   sizeof (type),		/* object_size */			\
822   OBJECTS_PER_PAGE (type),	/* objects_per_page */			\
823   OBJECTS_PER_PAGE (type),	/* objects_last_page */			\
824 }
825 
826 /* Master type for indexes within the symbol table.  */
827 typedef unsigned long symint_t;
828 
829 /* Linked list support for nested scopes (file, block, structure, etc.).  */
830 typedef struct scope {
831   struct scope	*prev;		/* previous scope level */
832   struct scope	*free;		/* free list pointer */
833   struct localsym *lsym;	/* pointer to local symbol node */
834   st_t		 type;		/* type of the node */
835 } scope_t;
836 
837 /* For a local symbol we store a gas symbol as well as the debugging
838    information we generate.  The gas symbol will be NULL if this is
839    only a debugging symbol.  */
840 typedef struct localsym {
841   const char *name;		/* symbol name */
842   symbolS *as_sym;		/* symbol as seen by gas */
843   bfd_vma addend;		/* addend to as_sym value */
844   struct efdr *file_ptr;	/* file pointer */
845   struct ecoff_proc *proc_ptr;	/* proc pointer */
846   struct localsym *begin_ptr;	/* symbol at start of block */
847   struct ecoff_aux *index_ptr;	/* index value to be filled in */
848   struct forward *forward_ref;	/* forward references to this symbol */
849   long sym_index;		/* final symbol index */
850   EXTR ecoff_sym;		/* ECOFF debugging symbol */
851 } localsym_t;
852 
853 /* For aux information we keep the type and the data.  */
854 typedef struct ecoff_aux {
855   enum aux_type type;		/* aux type */
856   AUXU data;			/* aux data */
857 } aux_t;
858 
859 /* For a procedure we store the gas symbol as well as the PDR
860    debugging information.  */
861 typedef struct ecoff_proc {
862   localsym_t *sym;		/* associated symbol */
863   PDR pdr;			/* ECOFF debugging info */
864 } proc_t;
865 
866 /* Number of proc_t structures allocated.  */
867 static unsigned long proc_cnt;
868 
869 /* Forward reference list for tags referenced, but not yet defined.  */
870 typedef struct forward {
871   struct forward *next;		/* next forward reference */
872   struct forward *free;		/* free list pointer */
873   aux_t		 *ifd_ptr;	/* pointer to store file index */
874   aux_t		 *index_ptr;	/* pointer to store symbol index */
875 } forward_t;
876 
877 /* Linked list support for tags.  The first tag in the list is always
878    the current tag for that block.  */
879 typedef struct tag {
880   struct tag	 *free;		/* free list pointer */
881   struct shash	 *hash_ptr;	/* pointer to the hash table head */
882   struct tag	 *same_name;	/* tag with same name in outer scope */
883   struct tag	 *same_block;	/* next tag defined in the same block.  */
884   struct forward *forward_ref;	/* list of forward references */
885   bt_t		  basic_type;	/* bt_Struct, bt_Union, or bt_Enum */
886   symint_t	  ifd;		/* file # tag defined in */
887   localsym_t	 *sym;		/* file's local symbols */
888 } tag_t;
889 
890 /* Head of a block's linked list of tags.  */
891 typedef struct thead {
892   struct thead	*prev;		/* previous block */
893   struct thead	*free;		/* free list pointer */
894   struct tag	*first_tag;	/* first tag in block defined */
895 } thead_t;
896 
897 /* Union containing pointers to each the small structures which are freed up.  */
898 typedef union small_free {
899   scope_t	*f_scope;	/* scope structure */
900   thead_t	*f_thead;	/* tag head structure */
901   tag_t		*f_tag;		/* tag element structure */
902   forward_t	*f_forward;	/* forward tag reference */
903 } small_free_t;
904 
905 /* String hash table entry.  */
906 
907 typedef struct shash {
908   char		*string;	/* string we are hashing */
909   symint_t	 indx;		/* index within string table */
910   EXTR		*esym_ptr;	/* global symbol pointer */
911   localsym_t	*sym_ptr;	/* local symbol pointer */
912   localsym_t	*end_ptr;	/* symbol pointer to end block */
913   tag_t		*tag_ptr;	/* tag pointer */
914   proc_t	*proc_ptr;	/* procedure descriptor pointer */
915 } shash_t;
916 
917 /* Type hash table support.  The size of the hash table must fit
918    within a page with the other extended file descriptor information.
919    Because unique types which are hashed are fewer in number than
920    strings, we use a smaller hash value.  */
921 
922 #define HASHBITS 30
923 
924 #ifndef THASH_SIZE
925 #define THASH_SIZE 113
926 #endif
927 
928 typedef struct thash {
929   struct thash	*next;		/* next hash value */
930   AUXU		 type;		/* type we are hashing */
931   symint_t	 indx;		/* index within string table */
932 } thash_t;
933 
934 /* Extended file descriptor that contains all of the support necessary
935    to add things to each file separately.  */
936 typedef struct efdr {
937   FDR		 fdr;		/* File header to be written out */
938   FDR		*orig_fdr;	/* original file header */
939   char		*name;		/* filename */
940   int		 fake;		/* whether this is faked .file */
941   symint_t	 void_type;	/* aux. pointer to 'void' type */
942   symint_t	 int_type;	/* aux. pointer to 'int' type */
943   scope_t	*cur_scope;	/* current nested scopes */
944   symint_t	 file_index;	/* current file number */
945   int		 nested_scopes;	/* # nested scopes */
946   varray_t	 strings;	/* local strings */
947   varray_t	 symbols;	/* local symbols */
948   varray_t	 procs;		/* procedures */
949   varray_t	 aux_syms;	/* auxiliary symbols */
950   struct efdr	*next_file;	/* next file descriptor */
951 				/* string/type hash tables */
952   struct hash_control *str_hash;	/* string hash table */
953   thash_t	*thash_head[THASH_SIZE];
954 } efdr_t;
955 
956 /* Pre-initialized extended file structure.  */
957 static const efdr_t init_file = {
958   {			/* FDR structure */
959     0,			/* adr:		memory address of beginning of file */
960     0,			/* rss:		file name (of source, if known) */
961     0,			/* issBase:	file's string space */
962     0,			/* cbSs:	number of bytes in the ss */
963     0,			/* isymBase:	beginning of symbols */
964     0,			/* csym:	count file's of symbols */
965     0,			/* ilineBase:	file's line symbols */
966     0,			/* cline:	count of file's line symbols */
967     0,			/* ioptBase:	file's optimization entries */
968     0,			/* copt:	count of file's optimization entries */
969     0,			/* ipdFirst:	start of procedures for this file */
970     0,			/* cpd:		count of procedures for this file */
971     0,			/* iauxBase:	file's auxiliary entries */
972     0,			/* caux:	count of file's auxiliary entries */
973     0,			/* rfdBase:	index into the file indirect table */
974     0,			/* crfd:	count file indirect entries */
975     langC,		/* lang:	language for this file */
976     1,			/* fMerge:	whether this file can be merged */
977     0,			/* fReadin:	true if read in (not just created) */
978     TARGET_BYTES_BIG_ENDIAN,  /* fBigendian:	if 1, compiled on big endian machine */
979     GLEVEL_2,		/* glevel:	level this file was compiled with */
980     0,			/* reserved:	reserved for future use */
981     0,			/* cbLineOffset: byte offset from header for this file ln's */
982     0,			/* cbLine:	size of lines for this file */
983   },
984 
985   (FDR *)0,		/* orig_fdr:	original file header pointer */
986   (char *)0,		/* name:	pointer to filename */
987   0,			/* fake:	whether this is a faked .file */
988   0,			/* void_type:	ptr to aux node for void type */
989   0,			/* int_type:	ptr to aux node for int type */
990   (scope_t *)0,		/* cur_scope:	current scope being processed */
991   0,			/* file_index:	current file # */
992   0,			/* nested_scopes: # nested scopes */
993   INIT_VARRAY (char),	/* strings:	local string varray */
994   INIT_VARRAY (localsym_t),	/* symbols:	local symbols varray */
995   INIT_VARRAY (proc_t),	/* procs:	procedure varray */
996   INIT_VARRAY (aux_t),	/* aux_syms:	auxiliary symbols varray */
997 
998   (struct efdr *)0,	/* next_file:	next file structure */
999 
1000   (struct hash_control *)0,	/* str_hash:	string hash table */
1001   { 0 },		/* thash_head:	type hash table */
1002 };
1003 
1004 static efdr_t *first_file;			/* first file descriptor */
1005 static efdr_t **last_file_ptr = &first_file;	/* file descriptor tail */
1006 
1007 /* Line number information is kept in a list until the assembly is
1008    finished.  */
1009 typedef struct lineno_list {
1010   struct lineno_list *next;	/* next element in list */
1011   efdr_t *file;			/* file this line is in */
1012   proc_t *proc;			/* procedure this line is in */
1013   fragS *frag;			/* fragment this line number is in */
1014   unsigned long paddr;		/* offset within fragment */
1015   long lineno;			/* actual line number */
1016 } lineno_list_t;
1017 
1018 static lineno_list_t *first_lineno;
1019 static lineno_list_t *last_lineno;
1020 static lineno_list_t **last_lineno_ptr = &first_lineno;
1021 
1022 /* Sometimes there will be some .loc statements before a .ent.  We
1023    keep them in this list so that we can fill in the procedure pointer
1024    after we see the .ent.  */
1025 static lineno_list_t *noproc_lineno;
1026 
1027 /* Union of various things that are held in pages.  */
1028 typedef union page {
1029   char		byte	[ PAGE_SIZE ];
1030   unsigned char	ubyte	[ PAGE_SIZE ];
1031   efdr_t	file	[ PAGE_SIZE / sizeof (efdr_t)	     ];
1032   FDR		ofile	[ PAGE_SIZE / sizeof (FDR)	     ];
1033   proc_t	proc	[ PAGE_SIZE / sizeof (proc_t)	     ];
1034   localsym_t	sym	[ PAGE_SIZE / sizeof (localsym_t)    ];
1035   aux_t		aux	[ PAGE_SIZE / sizeof (aux_t)	     ];
1036   DNR		dense	[ PAGE_SIZE / sizeof (DNR)	     ];
1037   scope_t	scope	[ PAGE_SIZE / sizeof (scope_t)	     ];
1038   vlinks_t	vlinks	[ PAGE_SIZE / sizeof (vlinks_t)	     ];
1039   shash_t	shash	[ PAGE_SIZE / sizeof (shash_t)	     ];
1040   thash_t	thash	[ PAGE_SIZE / sizeof (thash_t)	     ];
1041   tag_t		tag	[ PAGE_SIZE / sizeof (tag_t)	     ];
1042   forward_t	forward	[ PAGE_SIZE / sizeof (forward_t)     ];
1043   thead_t	thead	[ PAGE_SIZE / sizeof (thead_t)	     ];
1044   lineno_list_t	lineno	[ PAGE_SIZE / sizeof (lineno_list_t) ];
1045 } page_type;
1046 
1047 /* Structure holding allocation information for small sized structures.  */
1048 typedef struct alloc_info {
1049   char		*alloc_name;	/* name of this allocation type (must be first) */
1050   page_type	*cur_page;	/* current page being allocated from */
1051   small_free_t	 free_list;	/* current free list if any */
1052   int		 unallocated;	/* number of elements unallocated on page */
1053   int		 total_alloc;	/* total number of allocations */
1054   int		 total_free;	/* total number of frees */
1055   int		 total_pages;	/* total number of pages allocated */
1056 } alloc_info_t;
1057 
1058 /* Type information collected together.  */
1059 typedef struct type_info {
1060   bt_t	      basic_type;		/* basic type */
1061   int	      orig_type;		/* original COFF-based type */
1062   int	      num_tq;			/* # type qualifiers */
1063   int	      num_dims;			/* # dimensions */
1064   int	      num_sizes;		/* # sizes */
1065   int	      extra_sizes;		/* # extra sizes not tied with dims */
1066   tag_t *     tag_ptr;			/* tag pointer */
1067   int	      bitfield;			/* symbol is a bitfield */
1068   tq_t	      type_qualifiers[N_TQ];	/* type qualifiers (ptr, func, array)*/
1069   symint_t    dimensions     [N_TQ];	/* dimensions for each array */
1070   symint_t    sizes	     [N_TQ+2];	/* sizes of each array slice + size of
1071 					   struct/union/enum + bitfield size */
1072 } type_info_t;
1073 
1074 /* Pre-initialized type_info struct.  */
1075 static const type_info_t type_info_init = {
1076   bt_Nil,				/* basic type */
1077   T_NULL,				/* original COFF-based type */
1078   0,					/* # type qualifiers */
1079   0,					/* # dimensions */
1080   0,					/* # sizes */
1081   0,					/* sizes not tied with dims */
1082   NULL,					/* ptr to tag */
1083   0,					/* bitfield */
1084   {					/* type qualifiers */
1085     tq_Nil,
1086     tq_Nil,
1087     tq_Nil,
1088     tq_Nil,
1089     tq_Nil,
1090     tq_Nil,
1091   },
1092   {					/* dimensions */
1093     0,
1094     0,
1095     0,
1096     0,
1097     0,
1098     0
1099   },
1100   {					/* sizes */
1101     0,
1102     0,
1103     0,
1104     0,
1105     0,
1106     0,
1107     0,
1108     0,
1109   },
1110 };
1111 
1112 /* Global hash table for the tags table and global table for file
1113    descriptors.  */
1114 
1115 static varray_t file_desc = INIT_VARRAY (efdr_t);
1116 
1117 static struct hash_control *tag_hash;
1118 
1119 /* Static types for int and void.  Also, remember the last function's
1120    type (which is set up when we encounter the declaration for the
1121    function, and used when the end block for the function is emitted.  */
1122 
1123 static type_info_t int_type_info;
1124 static type_info_t void_type_info;
1125 static type_info_t last_func_type_info;
1126 static symbolS *last_func_sym_value;
1127 
1128 /* Convert COFF basic type to ECOFF basic type.  The T_NULL type
1129    really should use bt_Void, but this causes the current ecoff GDB to
1130    issue unsupported type messages, and the Ultrix 4.00 dbx (aka MIPS
1131    2.0) doesn't understand it, even though the compiler generates it.
1132    Maybe this will be fixed in 2.10 or 2.20 of the MIPS compiler
1133    suite, but for now go with what works.
1134 
1135    It would make sense for the .type and .scl directives to use the
1136    ECOFF numbers directly, rather than using the COFF numbers and
1137    mapping them.  Unfortunately, this is historically what mips-tfile
1138    expects, and changing gcc now would be a considerable pain (the
1139    native compiler generates debugging information internally, rather
1140    than via the assembler, so it will never use .type or .scl).  */
1141 
1142 static const bt_t map_coff_types[] = {
1143   bt_Nil,			/* T_NULL */
1144   bt_Nil,			/* T_ARG */
1145   bt_Char,			/* T_CHAR */
1146   bt_Short,			/* T_SHORT */
1147   bt_Int,			/* T_INT */
1148   bt_Long,			/* T_LONG */
1149   bt_Float,			/* T_FLOAT */
1150   bt_Double,			/* T_DOUBLE */
1151   bt_Struct,			/* T_STRUCT */
1152   bt_Union,			/* T_UNION */
1153   bt_Enum,			/* T_ENUM */
1154   bt_Enum,			/* T_MOE */
1155   bt_UChar,			/* T_UCHAR */
1156   bt_UShort,			/* T_USHORT */
1157   bt_UInt,			/* T_UINT */
1158   bt_ULong			/* T_ULONG */
1159 };
1160 
1161 /* Convert COFF storage class to ECOFF storage class.  */
1162 static const sc_t map_coff_storage[] = {
1163   sc_Nil,			/*   0: C_NULL */
1164   sc_Abs,			/*   1: C_AUTO	  auto var */
1165   sc_Undefined,			/*   2: C_EXT	  external */
1166   sc_Data,			/*   3: C_STAT	  static */
1167   sc_Register,			/*   4: C_REG	  register */
1168   sc_Undefined,			/*   5: C_EXTDEF  ??? */
1169   sc_Text,			/*   6: C_LABEL	  label */
1170   sc_Text,			/*   7: C_ULABEL  user label */
1171   sc_Info,			/*   8: C_MOS	  member of struct */
1172   sc_Abs,			/*   9: C_ARG	  argument */
1173   sc_Info,			/*  10: C_STRTAG  struct tag */
1174   sc_Info,			/*  11: C_MOU	  member of union */
1175   sc_Info,			/*  12: C_UNTAG   union tag */
1176   sc_Info,			/*  13: C_TPDEF	  typedef */
1177   sc_Data,			/*  14: C_USTATIC ??? */
1178   sc_Info,			/*  15: C_ENTAG	  enum tag */
1179   sc_Info,			/*  16: C_MOE	  member of enum */
1180   sc_Register,			/*  17: C_REGPARM register parameter */
1181   sc_Bits,			/*  18; C_FIELD	  bitfield */
1182   sc_Nil,			/*  19 */
1183   sc_Nil,			/*  20 */
1184   sc_Nil,			/*  21 */
1185   sc_Nil,			/*  22 */
1186   sc_Nil,			/*  23 */
1187   sc_Nil,			/*  24 */
1188   sc_Nil,			/*  25 */
1189   sc_Nil,			/*  26 */
1190   sc_Nil,			/*  27 */
1191   sc_Nil,			/*  28 */
1192   sc_Nil,			/*  29 */
1193   sc_Nil,			/*  30 */
1194   sc_Nil,			/*  31 */
1195   sc_Nil,			/*  32 */
1196   sc_Nil,			/*  33 */
1197   sc_Nil,			/*  34 */
1198   sc_Nil,			/*  35 */
1199   sc_Nil,			/*  36 */
1200   sc_Nil,			/*  37 */
1201   sc_Nil,			/*  38 */
1202   sc_Nil,			/*  39 */
1203   sc_Nil,			/*  40 */
1204   sc_Nil,			/*  41 */
1205   sc_Nil,			/*  42 */
1206   sc_Nil,			/*  43 */
1207   sc_Nil,			/*  44 */
1208   sc_Nil,			/*  45 */
1209   sc_Nil,			/*  46 */
1210   sc_Nil,			/*  47 */
1211   sc_Nil,			/*  48 */
1212   sc_Nil,			/*  49 */
1213   sc_Nil,			/*  50 */
1214   sc_Nil,			/*  51 */
1215   sc_Nil,			/*  52 */
1216   sc_Nil,			/*  53 */
1217   sc_Nil,			/*  54 */
1218   sc_Nil,			/*  55 */
1219   sc_Nil,			/*  56 */
1220   sc_Nil,			/*  57 */
1221   sc_Nil,			/*  58 */
1222   sc_Nil,			/*  59 */
1223   sc_Nil,			/*  60 */
1224   sc_Nil,			/*  61 */
1225   sc_Nil,			/*  62 */
1226   sc_Nil,			/*  63 */
1227   sc_Nil,			/*  64 */
1228   sc_Nil,			/*  65 */
1229   sc_Nil,			/*  66 */
1230   sc_Nil,			/*  67 */
1231   sc_Nil,			/*  68 */
1232   sc_Nil,			/*  69 */
1233   sc_Nil,			/*  70 */
1234   sc_Nil,			/*  71 */
1235   sc_Nil,			/*  72 */
1236   sc_Nil,			/*  73 */
1237   sc_Nil,			/*  74 */
1238   sc_Nil,			/*  75 */
1239   sc_Nil,			/*  76 */
1240   sc_Nil,			/*  77 */
1241   sc_Nil,			/*  78 */
1242   sc_Nil,			/*  79 */
1243   sc_Nil,			/*  80 */
1244   sc_Nil,			/*  81 */
1245   sc_Nil,			/*  82 */
1246   sc_Nil,			/*  83 */
1247   sc_Nil,			/*  84 */
1248   sc_Nil,			/*  85 */
1249   sc_Nil,			/*  86 */
1250   sc_Nil,			/*  87 */
1251   sc_Nil,			/*  88 */
1252   sc_Nil,			/*  89 */
1253   sc_Nil,			/*  90 */
1254   sc_Nil,			/*  91 */
1255   sc_Nil,			/*  92 */
1256   sc_Nil,			/*  93 */
1257   sc_Nil,			/*  94 */
1258   sc_Nil,			/*  95 */
1259   sc_Nil,			/*  96 */
1260   sc_Nil,			/*  97 */
1261   sc_Nil,			/*  98 */
1262   sc_Nil,			/*  99 */
1263   sc_Text,			/* 100: C_BLOCK  block start/end */
1264   sc_Text,			/* 101: C_FCN	 function start/end */
1265   sc_Info,			/* 102: C_EOS	 end of struct/union/enum */
1266   sc_Nil,			/* 103: C_FILE	 file start */
1267   sc_Nil,			/* 104: C_LINE	 line number */
1268   sc_Nil,			/* 105: C_ALIAS	 combined type info */
1269   sc_Nil,			/* 106: C_HIDDEN ??? */
1270 };
1271 
1272 /* Convert COFF storage class to ECOFF symbol type.  */
1273 static const st_t map_coff_sym_type[] = {
1274   st_Nil,			/*   0: C_NULL */
1275   st_Local,			/*   1: C_AUTO	  auto var */
1276   st_Global,			/*   2: C_EXT	  external */
1277   st_Static,			/*   3: C_STAT	  static */
1278   st_Local,			/*   4: C_REG	  register */
1279   st_Global,			/*   5: C_EXTDEF  ??? */
1280   st_Label,			/*   6: C_LABEL	  label */
1281   st_Label,			/*   7: C_ULABEL  user label */
1282   st_Member,			/*   8: C_MOS	  member of struct */
1283   st_Param,			/*   9: C_ARG	  argument */
1284   st_Block,			/*  10: C_STRTAG  struct tag */
1285   st_Member,			/*  11: C_MOU	  member of union */
1286   st_Block,			/*  12: C_UNTAG   union tag */
1287   st_Typedef,			/*  13: C_TPDEF	  typedef */
1288   st_Static,			/*  14: C_USTATIC ??? */
1289   st_Block,			/*  15: C_ENTAG	  enum tag */
1290   st_Member,			/*  16: C_MOE	  member of enum */
1291   st_Param,			/*  17: C_REGPARM register parameter */
1292   st_Member,			/*  18; C_FIELD	  bitfield */
1293   st_Nil,			/*  19 */
1294   st_Nil,			/*  20 */
1295   st_Nil,			/*  21 */
1296   st_Nil,			/*  22 */
1297   st_Nil,			/*  23 */
1298   st_Nil,			/*  24 */
1299   st_Nil,			/*  25 */
1300   st_Nil,			/*  26 */
1301   st_Nil,			/*  27 */
1302   st_Nil,			/*  28 */
1303   st_Nil,			/*  29 */
1304   st_Nil,			/*  30 */
1305   st_Nil,			/*  31 */
1306   st_Nil,			/*  32 */
1307   st_Nil,			/*  33 */
1308   st_Nil,			/*  34 */
1309   st_Nil,			/*  35 */
1310   st_Nil,			/*  36 */
1311   st_Nil,			/*  37 */
1312   st_Nil,			/*  38 */
1313   st_Nil,			/*  39 */
1314   st_Nil,			/*  40 */
1315   st_Nil,			/*  41 */
1316   st_Nil,			/*  42 */
1317   st_Nil,			/*  43 */
1318   st_Nil,			/*  44 */
1319   st_Nil,			/*  45 */
1320   st_Nil,			/*  46 */
1321   st_Nil,			/*  47 */
1322   st_Nil,			/*  48 */
1323   st_Nil,			/*  49 */
1324   st_Nil,			/*  50 */
1325   st_Nil,			/*  51 */
1326   st_Nil,			/*  52 */
1327   st_Nil,			/*  53 */
1328   st_Nil,			/*  54 */
1329   st_Nil,			/*  55 */
1330   st_Nil,			/*  56 */
1331   st_Nil,			/*  57 */
1332   st_Nil,			/*  58 */
1333   st_Nil,			/*  59 */
1334   st_Nil,			/*  60 */
1335   st_Nil,			/*  61 */
1336   st_Nil,			/*  62 */
1337   st_Nil,			/*  63 */
1338   st_Nil,			/*  64 */
1339   st_Nil,			/*  65 */
1340   st_Nil,			/*  66 */
1341   st_Nil,			/*  67 */
1342   st_Nil,			/*  68 */
1343   st_Nil,			/*  69 */
1344   st_Nil,			/*  70 */
1345   st_Nil,			/*  71 */
1346   st_Nil,			/*  72 */
1347   st_Nil,			/*  73 */
1348   st_Nil,			/*  74 */
1349   st_Nil,			/*  75 */
1350   st_Nil,			/*  76 */
1351   st_Nil,			/*  77 */
1352   st_Nil,			/*  78 */
1353   st_Nil,			/*  79 */
1354   st_Nil,			/*  80 */
1355   st_Nil,			/*  81 */
1356   st_Nil,			/*  82 */
1357   st_Nil,			/*  83 */
1358   st_Nil,			/*  84 */
1359   st_Nil,			/*  85 */
1360   st_Nil,			/*  86 */
1361   st_Nil,			/*  87 */
1362   st_Nil,			/*  88 */
1363   st_Nil,			/*  89 */
1364   st_Nil,			/*  90 */
1365   st_Nil,			/*  91 */
1366   st_Nil,			/*  92 */
1367   st_Nil,			/*  93 */
1368   st_Nil,			/*  94 */
1369   st_Nil,			/*  95 */
1370   st_Nil,			/*  96 */
1371   st_Nil,			/*  97 */
1372   st_Nil,			/*  98 */
1373   st_Nil,			/*  99 */
1374   st_Block,			/* 100: C_BLOCK  block start/end */
1375   st_Proc,			/* 101: C_FCN	 function start/end */
1376   st_End,			/* 102: C_EOS	 end of struct/union/enum */
1377   st_File,			/* 103: C_FILE	 file start */
1378   st_Nil,			/* 104: C_LINE	 line number */
1379   st_Nil,			/* 105: C_ALIAS	 combined type info */
1380   st_Nil,			/* 106: C_HIDDEN ??? */
1381 };
1382 
1383 /* Keep track of different sized allocation requests.  */
1384 static alloc_info_t alloc_counts[(int) alloc_type_last];
1385 
1386 /* Record whether we have seen any debugging information.  */
1387 int ecoff_debugging_seen = 0;
1388 
1389 /* Various statics.  */
1390 static efdr_t  *cur_file_ptr	= (efdr_t *) 0;	/* current file desc. header */
1391 static proc_t  *cur_proc_ptr	= (proc_t *) 0;	/* current procedure header */
1392 static proc_t  *first_proc_ptr  = (proc_t *) 0; /* first procedure header */
1393 static thead_t *top_tag_head	= (thead_t *) 0; /* top level tag head */
1394 static thead_t *cur_tag_head	= (thead_t *) 0; /* current tag head */
1395 #ifdef ECOFF_DEBUG
1396 static int	debug		= 0; 		/* trace functions */
1397 #endif
1398 static int	stabs_seen	= 0;		/* != 0 if stabs have been seen */
1399 
1400 static int current_file_idx;
1401 static const char *current_stabs_filename;
1402 
1403 /* Pseudo symbol to use when putting stabs into the symbol table.  */
1404 #ifndef STABS_SYMBOL
1405 #define STABS_SYMBOL "@stabs"
1406 #endif
1407 
1408 static char stabs_symbol[] = STABS_SYMBOL;
1409 
1410 /* Prototypes for functions defined in this file.  */
1411 
1412 static void add_varray_page (varray_t *vp);
1413 static symint_t add_string (varray_t *vp,
1414 			    struct hash_control *hash_tbl,
1415 			    const char *str,
1416 			    shash_t **ret_hash);
1417 static localsym_t *add_ecoff_symbol (const char *str, st_t type,
1418 				     sc_t storage, symbolS *sym,
1419 				     bfd_vma addend, symint_t value,
1420 				     symint_t indx);
1421 static symint_t add_aux_sym_symint (symint_t aux_word);
1422 static symint_t add_aux_sym_rndx (int file_index, symint_t sym_index);
1423 static symint_t add_aux_sym_tir (type_info_t *t,
1424 				 hash_state_t state,
1425 				 thash_t **hash_tbl);
1426 static tag_t *get_tag (const char *tag, localsym_t *sym, bt_t basic_type);
1427 static void add_unknown_tag (tag_t *ptag);
1428 static void add_procedure (char *func);
1429 static void add_file (const char *file_name, int indx, int fake);
1430 #ifdef ECOFF_DEBUG
1431 static char *sc_to_string (sc_t storage_class);
1432 static char *st_to_string (st_t symbol_type);
1433 #endif
1434 static void mark_stabs (int);
1435 static char *ecoff_add_bytes (char **buf, char **bufend,
1436 			      char *bufptr, unsigned long need);
1437 static unsigned long ecoff_padding_adjust
1438   (const struct ecoff_debug_swap *backend, char **buf, char **bufend,
1439    unsigned long offset, char **bufptrptr);
1440 static unsigned long ecoff_build_lineno
1441   (const struct ecoff_debug_swap *backend, char **buf, char **bufend,
1442    unsigned long offset, long *linecntptr);
1443 static unsigned long ecoff_build_symbols
1444   (const struct ecoff_debug_swap *backend, char **buf, char **bufend,
1445    unsigned long offset);
1446 static unsigned long ecoff_build_procs
1447   (const struct ecoff_debug_swap *backend, char **buf, char **bufend,
1448    unsigned long offset);
1449 static unsigned long ecoff_build_aux
1450   (const struct ecoff_debug_swap *backend, char **buf, char **bufend,
1451    unsigned long offset);
1452 static unsigned long ecoff_build_strings (char **buf, char **bufend,
1453 					  unsigned long offset,
1454 					  varray_t *vp);
1455 static unsigned long ecoff_build_ss
1456   (const struct ecoff_debug_swap *backend, char **buf, char **bufend,
1457    unsigned long offset);
1458 static unsigned long ecoff_build_fdr
1459   (const struct ecoff_debug_swap *backend, char **buf, char **bufend,
1460    unsigned long offset);
1461 static void ecoff_setup_ext (void);
1462 static page_type *allocate_cluster (unsigned long npages);
1463 static page_type *allocate_page (void);
1464 static scope_t *allocate_scope (void);
1465 static void free_scope (scope_t *ptr);
1466 static vlinks_t *allocate_vlinks (void);
1467 static shash_t *allocate_shash (void);
1468 static thash_t *allocate_thash (void);
1469 static tag_t *allocate_tag (void);
1470 static void free_tag (tag_t *ptr);
1471 static forward_t *allocate_forward (void);
1472 static thead_t *allocate_thead (void);
1473 static void free_thead (thead_t *ptr);
1474 static lineno_list_t *allocate_lineno_list (void);
1475 
1476 /* This function should be called when the assembler starts up.  */
1477 
1478 void
ecoff_read_begin_hook(void)1479 ecoff_read_begin_hook (void)
1480 {
1481   tag_hash = hash_new ();
1482   top_tag_head = allocate_thead ();
1483   top_tag_head->first_tag = (tag_t *) NULL;
1484   top_tag_head->free = (thead_t *) NULL;
1485   top_tag_head->prev = cur_tag_head;
1486   cur_tag_head = top_tag_head;
1487 }
1488 
1489 /* This function should be called when a symbol is created.  */
1490 
1491 void
ecoff_symbol_new_hook(symbolS * symbolP)1492 ecoff_symbol_new_hook (symbolS *symbolP)
1493 {
1494   OBJ_SYMFIELD_TYPE *obj;
1495 
1496   /* Make sure that we have a file pointer, but only if we have seen a
1497      file.  If we haven't seen a file, then this is a probably special
1498      symbol created by md_begin which may required special handling at
1499      some point.  Creating a dummy file with a dummy name is certainly
1500      wrong.  */
1501   if (cur_file_ptr == (efdr_t *) NULL
1502       && seen_at_least_1_file ())
1503     add_file ((const char *) NULL, 0, 1);
1504   obj = symbol_get_obj (symbolP);
1505   obj->ecoff_file = cur_file_ptr;
1506   obj->ecoff_symbol = NULL;
1507   obj->ecoff_extern_size = 0;
1508 }
1509 
1510 /* Add a page to a varray object.  */
1511 
1512 static void
add_varray_page(varray_t * vp)1513 add_varray_page (varray_t *vp /* varray to add page to */)
1514 {
1515   vlinks_t *new_links = allocate_vlinks ();
1516 
1517 #ifdef MALLOC_CHECK
1518   if (vp->object_size > 1)
1519     new_links->datum = (page_type *) xcalloc (1, vp->object_size);
1520   else
1521 #endif
1522     new_links->datum = allocate_page ();
1523 
1524   alloc_counts[(int) alloc_type_varray].total_alloc++;
1525   alloc_counts[(int) alloc_type_varray].total_pages++;
1526 
1527   new_links->start_index = vp->num_allocated;
1528   vp->objects_last_page = 0;
1529 
1530   if (vp->first == (vlinks_t *) NULL)		/* first allocation? */
1531     vp->first = vp->last = new_links;
1532   else
1533     {						/* 2nd or greater allocation */
1534       new_links->prev = vp->last;
1535       vp->last->next = new_links;
1536       vp->last = new_links;
1537     }
1538 }
1539 
1540 /* Add a string (and null pad) to one of the string tables.  */
1541 
1542 static symint_t
add_string(varray_t * vp,struct hash_control * hash_tbl,const char * str,shash_t ** ret_hash)1543 add_string (varray_t *vp,			/* string obstack */
1544 	    struct hash_control *hash_tbl,	/* ptr to hash table */
1545 	    const char *str,			/* string */
1546 	    shash_t **ret_hash			/* return hash pointer */)
1547 {
1548   register unsigned long len = strlen (str);
1549   register shash_t *hash_ptr;
1550 
1551   if (len >= PAGE_USIZE)
1552     as_fatal (_("string too big (%lu bytes)"), len);
1553 
1554   hash_ptr = (shash_t *) hash_find (hash_tbl, str);
1555   if (hash_ptr == (shash_t *) NULL)
1556     {
1557       register const char *err;
1558 
1559       if (vp->objects_last_page + len >= PAGE_USIZE)
1560 	{
1561 	  vp->num_allocated =
1562 	    ((vp->num_allocated + PAGE_USIZE - 1) / PAGE_USIZE) * PAGE_USIZE;
1563 	  add_varray_page (vp);
1564 	}
1565 
1566       hash_ptr = allocate_shash ();
1567       hash_ptr->indx = vp->num_allocated;
1568 
1569       hash_ptr->string = &vp->last->datum->byte[vp->objects_last_page];
1570 
1571       vp->objects_last_page += len + 1;
1572       vp->num_allocated += len + 1;
1573 
1574       strcpy (hash_ptr->string, str);
1575 
1576       err = hash_insert (hash_tbl, str, (char *) hash_ptr);
1577       if (err)
1578 	as_fatal (_("inserting \"%s\" into string hash table: %s"),
1579 		  str, err);
1580     }
1581 
1582   if (ret_hash != (shash_t **) NULL)
1583     *ret_hash = hash_ptr;
1584 
1585   return hash_ptr->indx;
1586 }
1587 
1588 /* Add debugging information for a symbol.  */
1589 
1590 static localsym_t *
add_ecoff_symbol(const char * str,st_t type,sc_t storage,symbolS * sym_value,bfd_vma addend,symint_t value,symint_t indx)1591 add_ecoff_symbol (const char *str,	/* symbol name */
1592 		  st_t type,		/* symbol type */
1593 		  sc_t storage,		/* storage class */
1594 		  symbolS *sym_value,	/* associated symbol.  */
1595 		  bfd_vma addend,	/* addend to sym_value.  */
1596 		  symint_t value,	/* value of symbol */
1597 		  symint_t indx		/* index to local/aux. syms */)
1598 {
1599   localsym_t *psym;
1600   register scope_t *pscope;
1601   register thead_t *ptag_head;
1602   register tag_t *ptag;
1603   register tag_t *ptag_next;
1604   register varray_t *vp;
1605   register int scope_delta = 0;
1606   shash_t *hash_ptr = (shash_t *) NULL;
1607 
1608   if (cur_file_ptr == (efdr_t *) NULL)
1609     as_fatal (_("no current file pointer"));
1610 
1611   vp = &cur_file_ptr->symbols;
1612 
1613   if (vp->objects_last_page == vp->objects_per_page)
1614     add_varray_page (vp);
1615 
1616   psym = &vp->last->datum->sym[vp->objects_last_page++];
1617 
1618   if (str == (const char *) NULL && sym_value != (symbolS *) NULL)
1619     psym->name = S_GET_NAME (sym_value);
1620   else
1621     psym->name = str;
1622   psym->as_sym = sym_value;
1623   if (sym_value != (symbolS *) NULL)
1624     symbol_get_obj (sym_value)->ecoff_symbol = psym;
1625   psym->addend = addend;
1626   psym->file_ptr = cur_file_ptr;
1627   psym->proc_ptr = cur_proc_ptr;
1628   psym->begin_ptr = (localsym_t *) NULL;
1629   psym->index_ptr = (aux_t *) NULL;
1630   psym->forward_ref = (forward_t *) NULL;
1631   psym->sym_index = -1;
1632   memset (&psym->ecoff_sym, 0, sizeof (EXTR));
1633   psym->ecoff_sym.asym.value = value;
1634   psym->ecoff_sym.asym.st = (unsigned) type;
1635   psym->ecoff_sym.asym.sc = (unsigned) storage;
1636   psym->ecoff_sym.asym.index = indx;
1637 
1638   /* If there is an associated symbol, we wait until the end of the
1639      assembly before deciding where to put the name (it may be just an
1640      external symbol).  Otherwise, this is just a debugging symbol and
1641      the name should go with the current file.  */
1642   if (sym_value == (symbolS *) NULL)
1643     psym->ecoff_sym.asym.iss = ((str == (const char *) NULL)
1644 				? 0
1645 				: add_string (&cur_file_ptr->strings,
1646 					      cur_file_ptr->str_hash,
1647 					      str,
1648 					      &hash_ptr));
1649 
1650   ++vp->num_allocated;
1651 
1652   if (ECOFF_IS_STAB (&psym->ecoff_sym.asym))
1653     return psym;
1654 
1655   /* Save the symbol within the hash table if this is a static
1656      item, and it has a name.  */
1657   if (hash_ptr != (shash_t *) NULL
1658       && (type == st_Global || type == st_Static || type == st_Label
1659 	  || type == st_Proc || type == st_StaticProc))
1660     hash_ptr->sym_ptr = psym;
1661 
1662   /* push or pop a scope if appropriate.  */
1663   switch (type)
1664     {
1665     default:
1666       break;
1667 
1668     case st_File:			/* beginning of file */
1669     case st_Proc:			/* procedure */
1670     case st_StaticProc:			/* static procedure */
1671     case st_Block:			/* begin scope */
1672       pscope = allocate_scope ();
1673       pscope->prev = cur_file_ptr->cur_scope;
1674       pscope->lsym = psym;
1675       pscope->type = type;
1676       cur_file_ptr->cur_scope = pscope;
1677 
1678       if (type != st_File)
1679 	scope_delta = 1;
1680 
1681       /* For every block type except file, struct, union, or
1682          enumeration blocks, push a level on the tag stack.  We omit
1683          file types, so that tags can span file boundaries.  */
1684       if (type != st_File && storage != sc_Info)
1685 	{
1686 	  ptag_head = allocate_thead ();
1687 	  ptag_head->first_tag = 0;
1688 	  ptag_head->prev = cur_tag_head;
1689 	  cur_tag_head = ptag_head;
1690 	}
1691       break;
1692 
1693     case st_End:
1694       pscope = cur_file_ptr->cur_scope;
1695       if (pscope == (scope_t *) NULL)
1696 	as_fatal (_("too many st_End's"));
1697       else
1698 	{
1699 	  st_t begin_type = (st_t) pscope->lsym->ecoff_sym.asym.st;
1700 
1701 	  psym->begin_ptr = pscope->lsym;
1702 
1703 	  if (begin_type != st_File)
1704 	    scope_delta = -1;
1705 
1706 	  /* Except for file, structure, union, or enumeration end
1707 	     blocks remove all tags created within this scope.  */
1708 	  if (begin_type != st_File && storage != sc_Info)
1709 	    {
1710 	      ptag_head = cur_tag_head;
1711 	      cur_tag_head = ptag_head->prev;
1712 
1713 	      for (ptag = ptag_head->first_tag;
1714 		   ptag != (tag_t *) NULL;
1715 		   ptag = ptag_next)
1716 		{
1717 		  if (ptag->forward_ref != (forward_t *) NULL)
1718 		    add_unknown_tag (ptag);
1719 
1720 		  ptag_next = ptag->same_block;
1721 		  ptag->hash_ptr->tag_ptr = ptag->same_name;
1722 		  free_tag (ptag);
1723 		}
1724 
1725 	      free_thead (ptag_head);
1726 	    }
1727 
1728 	  cur_file_ptr->cur_scope = pscope->prev;
1729 
1730 	  /* block begin gets next sym #.  This is set when we know
1731 	     the symbol index value.  */
1732 
1733 	  /* Functions push two or more aux words as follows:
1734 	     1st word: index+1 of the end symbol (filled in later).
1735 	     2nd word: type of the function (plus any aux words needed).
1736 	     Also, tie the external pointer back to the function begin symbol.  */
1737 	  if (begin_type != st_File && begin_type != st_Block)
1738 	    {
1739 	      symint_t ty;
1740 	      varray_t *svp = &cur_file_ptr->aux_syms;
1741 
1742 	      pscope->lsym->ecoff_sym.asym.index = add_aux_sym_symint (0);
1743 	      pscope->lsym->index_ptr =
1744 		&svp->last->datum->aux[svp->objects_last_page - 1];
1745 	      ty = add_aux_sym_tir (&last_func_type_info,
1746 				    hash_no,
1747 				    &cur_file_ptr->thash_head[0]);
1748 
1749 /* This seems to be unnecessary.  I'm not even sure what it is
1750  * intended to do.  It's from mips-tfile.
1751  *	      if (last_func_sym_value != (symbolS *) NULL)
1752  *		{
1753  *		  last_func_sym_value->ifd = cur_file_ptr->file_index;
1754  *		  last_func_sym_value->index = ty;
1755  *		}
1756  */
1757 	    }
1758 
1759 	  free_scope (pscope);
1760 	}
1761     }
1762 
1763   cur_file_ptr->nested_scopes += scope_delta;
1764 
1765 #ifdef ECOFF_DEBUG
1766   if (debug && type != st_File
1767       && (debug > 2 || type == st_Block || type == st_End
1768 	  || type == st_Proc || type == st_StaticProc))
1769     {
1770       char *sc_str = sc_to_string (storage);
1771       char *st_str = st_to_string (type);
1772       int depth = cur_file_ptr->nested_scopes + (scope_delta < 0);
1773 
1774       fprintf (stderr,
1775 	       "\tlsym\tv= %10ld, depth= %2d, sc= %-12s",
1776 	       value, depth, sc_str);
1777 
1778       if (str_start && str_end_p1 - str_start > 0)
1779 	fprintf (stderr, " st= %-11s name= %.*s\n",
1780 		 st_str, str_end_p1 - str_start, str_start);
1781       else
1782 	{
1783 	  unsigned long len = strlen (st_str);
1784 	  fprintf (stderr, " st= %.*s\n", len - 1, st_str);
1785 	}
1786     }
1787 #endif
1788 
1789   return psym;
1790 }
1791 
1792 /* Add an auxiliary symbol (passing a symint).  This is actually used
1793    for integral aux types, not just symints.  */
1794 
1795 static symint_t
add_aux_sym_symint(symint_t aux_word)1796 add_aux_sym_symint (symint_t aux_word /* auxiliary information word */)
1797 {
1798   register varray_t *vp;
1799   register aux_t *aux_ptr;
1800 
1801   if (cur_file_ptr == (efdr_t *) NULL)
1802     as_fatal (_("no current file pointer"));
1803 
1804   vp = &cur_file_ptr->aux_syms;
1805 
1806   if (vp->objects_last_page == vp->objects_per_page)
1807     add_varray_page (vp);
1808 
1809   aux_ptr = &vp->last->datum->aux[vp->objects_last_page++];
1810   aux_ptr->type = aux_isym;
1811   aux_ptr->data.isym = aux_word;
1812 
1813   return vp->num_allocated++;
1814 }
1815 
1816 /* Add an auxiliary symbol (passing a file/symbol index combo).  */
1817 
1818 static symint_t
add_aux_sym_rndx(int file_index,symint_t sym_index)1819 add_aux_sym_rndx (int file_index, symint_t sym_index)
1820 {
1821   register varray_t *vp;
1822   register aux_t *aux_ptr;
1823 
1824   if (cur_file_ptr == (efdr_t *) NULL)
1825     as_fatal (_("no current file pointer"));
1826 
1827   vp = &cur_file_ptr->aux_syms;
1828 
1829   if (vp->objects_last_page == vp->objects_per_page)
1830     add_varray_page (vp);
1831 
1832   aux_ptr = &vp->last->datum->aux[vp->objects_last_page++];
1833   aux_ptr->type = aux_rndx;
1834   aux_ptr->data.rndx.rfd   = file_index;
1835   aux_ptr->data.rndx.index = sym_index;
1836 
1837   return vp->num_allocated++;
1838 }
1839 
1840 /* Add an auxiliary symbol (passing the basic type and possibly
1841    type qualifiers).  */
1842 
1843 static symint_t
add_aux_sym_tir(type_info_t * t,hash_state_t state,thash_t ** hash_tbl)1844 add_aux_sym_tir (type_info_t *t,	/* current type information */
1845 		 hash_state_t state,	/* whether to hash type or not */
1846 		 thash_t **hash_tbl	/* pointer to hash table to use */)
1847 {
1848   register varray_t *vp;
1849   register aux_t *aux_ptr;
1850   static AUXU init_aux;
1851   symint_t ret;
1852   int i;
1853   AUXU aux;
1854 
1855   if (cur_file_ptr == (efdr_t *) NULL)
1856     as_fatal (_("no current file pointer"));
1857 
1858   vp = &cur_file_ptr->aux_syms;
1859 
1860   aux = init_aux;
1861   aux.ti.bt = (int) t->basic_type;
1862   aux.ti.continued = 0;
1863   aux.ti.fBitfield = t->bitfield;
1864 
1865   aux.ti.tq0 = (int) t->type_qualifiers[0];
1866   aux.ti.tq1 = (int) t->type_qualifiers[1];
1867   aux.ti.tq2 = (int) t->type_qualifiers[2];
1868   aux.ti.tq3 = (int) t->type_qualifiers[3];
1869   aux.ti.tq4 = (int) t->type_qualifiers[4];
1870   aux.ti.tq5 = (int) t->type_qualifiers[5];
1871 
1872   /* For anything that adds additional information, we must not hash,
1873      so check here, and reset our state.  */
1874 
1875   if (state != hash_no
1876       && (t->type_qualifiers[0] == tq_Array
1877 	  || t->type_qualifiers[1] == tq_Array
1878 	  || t->type_qualifiers[2] == tq_Array
1879 	  || t->type_qualifiers[3] == tq_Array
1880 	  || t->type_qualifiers[4] == tq_Array
1881 	  || t->type_qualifiers[5] == tq_Array
1882 	  || t->basic_type == bt_Struct
1883 	  || t->basic_type == bt_Union
1884 	  || t->basic_type == bt_Enum
1885 	  || t->bitfield
1886 	  || t->num_dims > 0))
1887     state = hash_no;
1888 
1889   /* See if we can hash this type, and save some space, but some types
1890      can't be hashed (because they contain arrays or continuations),
1891      and others can be put into the hash list, but cannot use existing
1892      types because other aux entries precede this one.  */
1893 
1894   if (state != hash_no)
1895     {
1896       register thash_t *hash_ptr;
1897       register symint_t hi;
1898 
1899       hi = aux.isym & ((1 << HASHBITS) - 1);
1900       hi %= THASH_SIZE;
1901 
1902       for (hash_ptr = hash_tbl[hi];
1903 	   hash_ptr != (thash_t *)0;
1904 	   hash_ptr = hash_ptr->next)
1905 	{
1906 	  if (aux.isym == hash_ptr->type.isym)
1907 	    break;
1908 	}
1909 
1910       if (hash_ptr != (thash_t *) NULL && state == hash_yes)
1911 	return hash_ptr->indx;
1912 
1913       if (hash_ptr == (thash_t *) NULL)
1914 	{
1915 	  hash_ptr = allocate_thash ();
1916 	  hash_ptr->next = hash_tbl[hi];
1917 	  hash_ptr->type = aux;
1918 	  hash_ptr->indx = vp->num_allocated;
1919 	  hash_tbl[hi] = hash_ptr;
1920 	}
1921     }
1922 
1923   /* Everything is set up, add the aux symbol.  */
1924   if (vp->objects_last_page == vp->objects_per_page)
1925     add_varray_page (vp);
1926 
1927   aux_ptr = &vp->last->datum->aux[vp->objects_last_page++];
1928   aux_ptr->type = aux_tir;
1929   aux_ptr->data = aux;
1930 
1931   ret = vp->num_allocated++;
1932 
1933   /* Add bitfield length if it exists.
1934 
1935      NOTE:  Mips documentation claims bitfield goes at the end of the
1936      AUX record, but the DECstation compiler emits it here.
1937      (This would only make a difference for enum bitfields.)
1938 
1939      Also note:  We use the last size given since gcc may emit 2
1940      for an enum bitfield.  */
1941 
1942   if (t->bitfield)
1943     (void) add_aux_sym_symint ((symint_t) t->sizes[t->num_sizes - 1]);
1944 
1945   /* Add tag information if needed.  Structure, union, and enum
1946      references add 2 aux symbols: a [file index, symbol index]
1947      pointer to the structure type, and the current file index.  */
1948 
1949   if (t->basic_type == bt_Struct
1950       || t->basic_type == bt_Union
1951       || t->basic_type == bt_Enum)
1952     {
1953       register symint_t file_index = t->tag_ptr->ifd;
1954       register localsym_t *sym = t->tag_ptr->sym;
1955       register forward_t *forward_ref = allocate_forward ();
1956 
1957       if (sym != (localsym_t *) NULL)
1958 	{
1959 	  forward_ref->next = sym->forward_ref;
1960 	  sym->forward_ref = forward_ref;
1961 	}
1962       else
1963 	{
1964 	  forward_ref->next = t->tag_ptr->forward_ref;
1965 	  t->tag_ptr->forward_ref = forward_ref;
1966 	}
1967 
1968       (void) add_aux_sym_rndx (ST_RFDESCAPE, indexNil);
1969       forward_ref->index_ptr
1970 	= &vp->last->datum->aux[vp->objects_last_page - 1];
1971 
1972       (void) add_aux_sym_symint (file_index);
1973       forward_ref->ifd_ptr
1974 	= &vp->last->datum->aux[vp->objects_last_page - 1];
1975     }
1976 
1977   /* Add information about array bounds if they exist.  */
1978   for (i = 0; i < t->num_dims; i++)
1979     {
1980       (void) add_aux_sym_rndx (ST_RFDESCAPE,
1981 			       cur_file_ptr->int_type);
1982 
1983       (void) add_aux_sym_symint (cur_file_ptr->file_index);	/* file index*/
1984       (void) add_aux_sym_symint ((symint_t) 0);			/* low bound */
1985       (void) add_aux_sym_symint (t->dimensions[i] - 1);		/* high bound*/
1986       (void) add_aux_sym_symint ((t->dimensions[i] == 0)	/* stride */
1987 				 ? 0
1988 				 : (t->sizes[i] * 8) / t->dimensions[i]);
1989     };
1990 
1991   /* NOTE:  Mips documentation claims that the bitfield width goes here.
1992      But it needs to be emitted earlier.  */
1993 
1994   return ret;
1995 }
1996 
1997 /* Add a tag to the tag table (unless it already exists).  */
1998 
1999 static tag_t *
get_tag(const char * tag,localsym_t * sym,bt_t basic_type)2000 get_tag (const char *tag,	/* tag name */
2001 	 localsym_t *sym,	/* tag start block */
2002 	 bt_t basic_type	/* bt_Struct, bt_Union, or bt_Enum */)
2003 {
2004   shash_t *hash_ptr;
2005   const char *err;
2006   tag_t *tag_ptr;
2007 
2008   if (cur_file_ptr == (efdr_t *) NULL)
2009     as_fatal (_("no current file pointer"));
2010 
2011   hash_ptr = (shash_t *) hash_find (tag_hash, tag);
2012 
2013   if (hash_ptr != (shash_t *) NULL
2014       && hash_ptr->tag_ptr != (tag_t *) NULL)
2015     {
2016       tag_ptr = hash_ptr->tag_ptr;
2017       if (sym != (localsym_t *) NULL)
2018 	{
2019 	  tag_ptr->basic_type = basic_type;
2020 	  tag_ptr->ifd        = cur_file_ptr->file_index;
2021 	  tag_ptr->sym        = sym;
2022 	}
2023       return tag_ptr;
2024     }
2025 
2026   if (hash_ptr == (shash_t *) NULL)
2027     {
2028       char *perm;
2029 
2030       perm = xstrdup (tag);
2031       hash_ptr = allocate_shash ();
2032       err = hash_insert (tag_hash, perm, (char *) hash_ptr);
2033       if (err)
2034 	as_fatal (_("inserting \"%s\" into tag hash table: %s"),
2035 		  tag, err);
2036       hash_ptr->string = perm;
2037     }
2038 
2039   tag_ptr = allocate_tag ();
2040   tag_ptr->forward_ref	= (forward_t *) NULL;
2041   tag_ptr->hash_ptr	= hash_ptr;
2042   tag_ptr->same_name	= hash_ptr->tag_ptr;
2043   tag_ptr->basic_type	= basic_type;
2044   tag_ptr->sym		= sym;
2045   tag_ptr->ifd		= ((sym == (localsym_t *) NULL)
2046 			   ? (symint_t) -1
2047 			   : cur_file_ptr->file_index);
2048   tag_ptr->same_block	= cur_tag_head->first_tag;
2049 
2050   cur_tag_head->first_tag = tag_ptr;
2051   hash_ptr->tag_ptr	  = tag_ptr;
2052 
2053   return tag_ptr;
2054 }
2055 
2056 /* Add an unknown {struct, union, enum} tag.  */
2057 
2058 static void
add_unknown_tag(tag_t * ptag)2059 add_unknown_tag (tag_t *ptag /* pointer to tag information */)
2060 {
2061   shash_t *hash_ptr	= ptag->hash_ptr;
2062   char *name		= hash_ptr->string;
2063   localsym_t *sym;
2064   forward_t **pf;
2065 
2066 #ifdef ECOFF_DEBUG
2067   if (debug > 1)
2068     {
2069       char *agg_type = "{unknown aggregate type}";
2070       switch (ptag->basic_type)
2071 	{
2072 	case bt_Struct:	agg_type = "struct";	break;
2073 	case bt_Union:	agg_type = "union";	break;
2074 	case bt_Enum:	agg_type = "enum";	break;
2075 	default:				break;
2076 	}
2077 
2078       fprintf (stderr, "unknown %s %.*s found\n", agg_type,
2079 	       hash_ptr->len, name_start);
2080     }
2081 #endif
2082 
2083   sym = add_ecoff_symbol (name,
2084 			  st_Block,
2085 			  sc_Info,
2086 			  (symbolS *) NULL,
2087 			  (bfd_vma) 0,
2088 			  (symint_t) 0,
2089 			  (symint_t) 0);
2090 
2091   (void) add_ecoff_symbol (name,
2092 			   st_End,
2093 			   sc_Info,
2094 			   (symbolS *) NULL,
2095 			   (bfd_vma) 0,
2096 			   (symint_t) 0,
2097 			   (symint_t) 0);
2098 
2099   for (pf = &sym->forward_ref; *pf != (forward_t *) NULL; pf = &(*pf)->next)
2100     ;
2101   *pf = ptag->forward_ref;
2102 }
2103 
2104 /* Add a procedure to the current file's list of procedures, and record
2105    this is the current procedure.  */
2106 
2107 static void
add_procedure(char * func)2108 add_procedure (char *func /* func name */)
2109 {
2110   register varray_t *vp;
2111   register proc_t *new_proc_ptr;
2112   symbolS *sym;
2113 
2114 #ifdef ECOFF_DEBUG
2115   if (debug)
2116     fputc ('\n', stderr);
2117 #endif
2118 
2119   if (cur_file_ptr == (efdr_t *) NULL)
2120     as_fatal (_("no current file pointer"));
2121 
2122   vp = &cur_file_ptr->procs;
2123 
2124   if (vp->objects_last_page == vp->objects_per_page)
2125     add_varray_page (vp);
2126 
2127   cur_proc_ptr = new_proc_ptr = &vp->last->datum->proc[vp->objects_last_page++];
2128 
2129   if (first_proc_ptr == (proc_t *) NULL)
2130     first_proc_ptr = new_proc_ptr;
2131 
2132   vp->num_allocated++;
2133 
2134   new_proc_ptr->pdr.isym = -1;
2135   new_proc_ptr->pdr.iline = -1;
2136   new_proc_ptr->pdr.lnLow = -1;
2137   new_proc_ptr->pdr.lnHigh = -1;
2138 
2139   /* Set the BSF_FUNCTION flag for the symbol.  */
2140   sym = symbol_find_or_make (func);
2141   symbol_get_bfdsym (sym)->flags |= BSF_FUNCTION;
2142 
2143   /* Push the start of the function.  */
2144   new_proc_ptr->sym = add_ecoff_symbol ((const char *) NULL, st_Proc, sc_Text,
2145 					sym, (bfd_vma) 0, (symint_t) 0,
2146 					(symint_t) 0);
2147 
2148   ++proc_cnt;
2149 
2150   /* Fill in the linenos preceding the .ent, if any.  */
2151   if (noproc_lineno != (lineno_list_t *) NULL)
2152     {
2153       lineno_list_t *l;
2154 
2155       for (l = noproc_lineno; l != (lineno_list_t *) NULL; l = l->next)
2156 	l->proc = new_proc_ptr;
2157       *last_lineno_ptr = noproc_lineno;
2158       while (*last_lineno_ptr != NULL)
2159 	{
2160 	  last_lineno = *last_lineno_ptr;
2161 	  last_lineno_ptr = &last_lineno->next;
2162 	}
2163       noproc_lineno = (lineno_list_t *) NULL;
2164     }
2165 }
2166 
2167 symbolS *
ecoff_get_cur_proc_sym(void)2168 ecoff_get_cur_proc_sym (void)
2169 {
2170   return (cur_proc_ptr ? cur_proc_ptr->sym->as_sym : NULL);
2171 }
2172 
2173 /* Add a new filename, and set up all of the file relative
2174    virtual arrays (strings, symbols, aux syms, etc.).  Record
2175    where the current file structure lives.  */
2176 
2177 static void
add_file(const char * file_name,int indx ATTRIBUTE_UNUSED,int fake)2178 add_file (const char *file_name, int indx ATTRIBUTE_UNUSED, int fake)
2179 {
2180   register int first_ch;
2181   register efdr_t *fil_ptr;
2182 
2183 #ifdef ECOFF_DEBUG
2184   if (debug)
2185     fprintf (stderr, "\tfile\t%.*s\n", len, file_start);
2186 #endif
2187 
2188   /* If the file name is NULL, then no .file symbol appeared, and we
2189      want to use the actual file name.  */
2190   if (file_name == (const char *) NULL)
2191     {
2192       char *file;
2193 
2194       if (first_file != (efdr_t *) NULL)
2195 	as_fatal (_("fake .file after real one"));
2196       as_where (&file, (unsigned int *) NULL);
2197       file_name = (const char *) file;
2198 
2199       /* Automatically generate ECOFF debugging information, since I
2200          think that's what other ECOFF assemblers do.  We don't do
2201          this if we see a .file directive with a string, since that
2202          implies that some sort of debugging information is being
2203          provided.  */
2204       if (! symbol_table_frozen && debug_type == DEBUG_UNSPECIFIED)
2205 	debug_type = DEBUG_ECOFF;
2206     }
2207   else if (debug_type == DEBUG_UNSPECIFIED)
2208     debug_type = DEBUG_NONE;
2209 
2210 #ifndef NO_LISTING
2211   if (listing)
2212     listing_source_file (file_name);
2213 #endif
2214 
2215   current_stabs_filename = file_name;
2216 
2217   /* If we're creating stabs, then we don't actually make a new FDR.
2218      Instead, we just create a stabs symbol.  */
2219   if (stabs_seen)
2220     {
2221       (void) add_ecoff_symbol (file_name, st_Nil, sc_Nil,
2222 			       symbol_new ("L0\001", now_seg,
2223 					   (valueT) frag_now_fix (),
2224 					   frag_now),
2225 			       (bfd_vma) 0, 0, ECOFF_MARK_STAB (N_SOL));
2226       return;
2227     }
2228 
2229   first_ch = *file_name;
2230 
2231   /* FIXME: We can't safely merge files which have line number
2232      information (fMerge will be zero in this case).  Otherwise, we
2233      get incorrect line number debugging info.  See for instance
2234      ecoff_build_lineno, which will end up setting all file->fdr.*
2235      fields multiple times, resulting in incorrect debug info.  In
2236      order to make this work right, all line number and symbol info
2237      for the same source file has to be adjacent in the object file,
2238      so that a single file descriptor can be used to point to them.
2239      This would require maintaining file specific lists of line
2240      numbers and symbols for each file, so that they can be merged
2241      together (or output together) when two .file pseudo-ops are
2242      merged into one file descriptor.  */
2243 
2244   /* See if the file has already been created.  */
2245   for (fil_ptr = first_file;
2246        fil_ptr != (efdr_t *) NULL;
2247        fil_ptr = fil_ptr->next_file)
2248     {
2249       if (first_ch == fil_ptr->name[0]
2250 	  && strcmp (file_name, fil_ptr->name) == 0
2251 	  && fil_ptr->fdr.fMerge)
2252 	{
2253 	  cur_file_ptr = fil_ptr;
2254 	  if (! fake)
2255 	    cur_file_ptr->fake = 0;
2256 	  break;
2257 	}
2258     }
2259 
2260   /* If this is a new file, create it.  */
2261   if (fil_ptr == (efdr_t *) NULL)
2262     {
2263       if (file_desc.objects_last_page == file_desc.objects_per_page)
2264 	add_varray_page (&file_desc);
2265 
2266       fil_ptr = cur_file_ptr =
2267 	&file_desc.last->datum->file[file_desc.objects_last_page++];
2268       *fil_ptr = init_file;
2269 
2270       fil_ptr->file_index = current_file_idx++;
2271       ++file_desc.num_allocated;
2272 
2273       fil_ptr->fake = fake;
2274 
2275       /* Allocate the string hash table.  */
2276       fil_ptr->str_hash = hash_new ();
2277 
2278       /* Make sure 0 byte in string table is null  */
2279       add_string (&fil_ptr->strings,
2280 		  fil_ptr->str_hash,
2281 		  "",
2282 		  (shash_t **)0);
2283 
2284       if (strlen (file_name) > PAGE_USIZE - 2)
2285 	as_fatal (_("filename goes over one page boundary"));
2286 
2287       /* Push the start of the filename. We assume that the filename
2288          will be stored at string offset 1.  */
2289       (void) add_ecoff_symbol (file_name, st_File, sc_Text,
2290 			       (symbolS *) NULL, (bfd_vma) 0,
2291 			       (symint_t) 0, (symint_t) 0);
2292       fil_ptr->fdr.rss = 1;
2293       fil_ptr->name = &fil_ptr->strings.last->datum->byte[1];
2294 
2295       /* Update the linked list of file descriptors.  */
2296       *last_file_ptr = fil_ptr;
2297       last_file_ptr = &fil_ptr->next_file;
2298 
2299       /* Add void & int types to the file (void should be first to catch
2300          errant 0's within the index fields).  */
2301       fil_ptr->void_type = add_aux_sym_tir (&void_type_info,
2302 					    hash_yes,
2303 					    &cur_file_ptr->thash_head[0]);
2304 
2305       fil_ptr->int_type = add_aux_sym_tir (&int_type_info,
2306 					   hash_yes,
2307 					   &cur_file_ptr->thash_head[0]);
2308     }
2309 }
2310 
2311 /* This function is called when the assembler notices a preprocessor
2312    directive switching to a new file.  This will not happen in
2313    compiler output, only in hand coded assembler.  */
2314 
2315 void
ecoff_new_file(const char * name,int appfile ATTRIBUTE_UNUSED)2316 ecoff_new_file (const char *name, int appfile ATTRIBUTE_UNUSED)
2317 {
2318   if (cur_file_ptr != NULL && strcmp (cur_file_ptr->name, name) == 0)
2319     return;
2320   add_file (name, 0, 0);
2321 
2322   /* This is a hand coded assembler file, so automatically turn on
2323      debugging information.  */
2324   if (debug_type == DEBUG_UNSPECIFIED)
2325     debug_type = DEBUG_ECOFF;
2326 }
2327 
2328 #ifdef ECOFF_DEBUG
2329 
2330 /* Convert storage class to string.  */
2331 
2332 static char *
sc_to_string(storage_class)2333 sc_to_string (storage_class)
2334      sc_t storage_class;
2335 {
2336   switch (storage_class)
2337     {
2338     case sc_Nil:	 return "Nil,";
2339     case sc_Text:	 return "Text,";
2340     case sc_Data:	 return "Data,";
2341     case sc_Bss:	 return "Bss,";
2342     case sc_Register:	 return "Register,";
2343     case sc_Abs:	 return "Abs,";
2344     case sc_Undefined:	 return "Undefined,";
2345     case sc_CdbLocal:	 return "CdbLocal,";
2346     case sc_Bits:	 return "Bits,";
2347     case sc_CdbSystem:	 return "CdbSystem,";
2348     case sc_RegImage:	 return "RegImage,";
2349     case sc_Info:	 return "Info,";
2350     case sc_UserStruct:	 return "UserStruct,";
2351     case sc_SData:	 return "SData,";
2352     case sc_SBss:	 return "SBss,";
2353     case sc_RData:	 return "RData,";
2354     case sc_Var:	 return "Var,";
2355     case sc_Common:	 return "Common,";
2356     case sc_SCommon:	 return "SCommon,";
2357     case sc_VarRegister: return "VarRegister,";
2358     case sc_Variant:	 return "Variant,";
2359     case sc_SUndefined:	 return "SUndefined,";
2360     case sc_Init:	 return "Init,";
2361     case sc_Max:	 return "Max,";
2362     }
2363 
2364   return "???,";
2365 }
2366 
2367 #endif /* DEBUG */
2368 
2369 #ifdef ECOFF_DEBUG
2370 
2371 /* Convert symbol type to string.  */
2372 
2373 static char *
st_to_string(symbol_type)2374 st_to_string (symbol_type)
2375      st_t symbol_type;
2376 {
2377   switch (symbol_type)
2378     {
2379     case st_Nil:	return "Nil,";
2380     case st_Global:	return "Global,";
2381     case st_Static:	return "Static,";
2382     case st_Param:	return "Param,";
2383     case st_Local:	return "Local,";
2384     case st_Label:	return "Label,";
2385     case st_Proc:	return "Proc,";
2386     case st_Block:	return "Block,";
2387     case st_End:	return "End,";
2388     case st_Member:	return "Member,";
2389     case st_Typedef:	return "Typedef,";
2390     case st_File:	return "File,";
2391     case st_RegReloc:	return "RegReloc,";
2392     case st_Forward:	return "Forward,";
2393     case st_StaticProc:	return "StaticProc,";
2394     case st_Constant:	return "Constant,";
2395     case st_Str:	return "String,";
2396     case st_Number:	return "Number,";
2397     case st_Expr:	return "Expr,";
2398     case st_Type:	return "Type,";
2399     case st_Max:	return "Max,";
2400     }
2401 
2402   return "???,";
2403 }
2404 
2405 #endif /* DEBUG */
2406 
2407 /* Parse .begin directives which have a label as the first argument
2408    which gives the location of the start of the block.  */
2409 
2410 void
ecoff_directive_begin(int ignore ATTRIBUTE_UNUSED)2411 ecoff_directive_begin (int ignore ATTRIBUTE_UNUSED)
2412 {
2413   char *name;
2414   char name_end;
2415 
2416   if (cur_file_ptr == (efdr_t *) NULL)
2417     {
2418       as_warn (_(".begin directive without a preceding .file directive"));
2419       demand_empty_rest_of_line ();
2420       return;
2421     }
2422 
2423   if (cur_proc_ptr == (proc_t *) NULL)
2424     {
2425       as_warn (_(".begin directive without a preceding .ent directive"));
2426       demand_empty_rest_of_line ();
2427       return;
2428     }
2429 
2430   name = input_line_pointer;
2431   name_end = get_symbol_end ();
2432 
2433   (void) add_ecoff_symbol ((const char *) NULL, st_Block, sc_Text,
2434 			   symbol_find_or_make (name),
2435 			   (bfd_vma) 0, (symint_t) 0, (symint_t) 0);
2436 
2437   *input_line_pointer = name_end;
2438 
2439   /* The line number follows, but we don't use it.  */
2440   (void) get_absolute_expression ();
2441   demand_empty_rest_of_line ();
2442 }
2443 
2444 /* Parse .bend directives which have a label as the first argument
2445    which gives the location of the end of the block.  */
2446 
2447 void
ecoff_directive_bend(int ignore ATTRIBUTE_UNUSED)2448 ecoff_directive_bend (int ignore ATTRIBUTE_UNUSED)
2449 {
2450   char *name;
2451   char name_end;
2452   symbolS *endsym;
2453 
2454   if (cur_file_ptr == (efdr_t *) NULL)
2455     {
2456       as_warn (_(".bend directive without a preceding .file directive"));
2457       demand_empty_rest_of_line ();
2458       return;
2459     }
2460 
2461   if (cur_proc_ptr == (proc_t *) NULL)
2462     {
2463       as_warn (_(".bend directive without a preceding .ent directive"));
2464       demand_empty_rest_of_line ();
2465       return;
2466     }
2467 
2468   name = input_line_pointer;
2469   name_end = get_symbol_end ();
2470 
2471   /* The value is the distance between the .bend directive and the
2472      corresponding symbol.  We fill in the offset when we write out
2473      the symbol.  */
2474   endsym = symbol_find (name);
2475   if (endsym == (symbolS *) NULL)
2476     as_warn (_(".bend directive names unknown symbol"));
2477   else
2478     (void) add_ecoff_symbol ((const char *) NULL, st_End, sc_Text, endsym,
2479 			     (bfd_vma) 0, (symint_t) 0, (symint_t) 0);
2480 
2481   *input_line_pointer = name_end;
2482 
2483   /* The line number follows, but we don't use it.  */
2484   (void) get_absolute_expression ();
2485   demand_empty_rest_of_line ();
2486 }
2487 
2488 /* COFF debugging information is provided as a series of directives
2489    (.def, .scl, etc.).  We build up information as we read the
2490    directives in the following static variables, and file it away when
2491    we reach the .endef directive.  */
2492 static char *coff_sym_name;
2493 static type_info_t coff_type;
2494 static sc_t coff_storage_class;
2495 static st_t coff_symbol_typ;
2496 static int coff_is_function;
2497 static char *coff_tag;
2498 static valueT coff_value;
2499 static symbolS *coff_sym_value;
2500 static bfd_vma coff_sym_addend;
2501 static int coff_inside_enumeration;
2502 
2503 /* Handle a .def directive: start defining a symbol.  */
2504 
2505 void
ecoff_directive_def(int ignore ATTRIBUTE_UNUSED)2506 ecoff_directive_def (int ignore ATTRIBUTE_UNUSED)
2507 {
2508   char *name;
2509   char name_end;
2510 
2511   ecoff_debugging_seen = 1;
2512 
2513   SKIP_WHITESPACE ();
2514 
2515   name = input_line_pointer;
2516   name_end = get_symbol_end ();
2517 
2518   if (coff_sym_name != (char *) NULL)
2519     as_warn (_(".def pseudo-op used inside of .def/.endef; ignored"));
2520   else if (*name == '\0')
2521     as_warn (_("empty symbol name in .def; ignored"));
2522   else
2523     {
2524       if (coff_sym_name != (char *) NULL)
2525 	free (coff_sym_name);
2526       if (coff_tag != (char *) NULL)
2527 	free (coff_tag);
2528 
2529       coff_sym_name = xstrdup (name);
2530       coff_type = type_info_init;
2531       coff_storage_class = sc_Nil;
2532       coff_symbol_typ = st_Nil;
2533       coff_is_function = 0;
2534       coff_tag = (char *) NULL;
2535       coff_value = 0;
2536       coff_sym_value = (symbolS *) NULL;
2537       coff_sym_addend = 0;
2538     }
2539 
2540   *input_line_pointer = name_end;
2541 
2542   demand_empty_rest_of_line ();
2543 }
2544 
2545 /* Handle a .dim directive, used to give dimensions for an array.  The
2546    arguments are comma separated numbers.  mips-tfile assumes that
2547    there will not be more than 6 dimensions, and gdb won't read any
2548    more than that anyhow, so I will also make that assumption.  */
2549 
2550 void
ecoff_directive_dim(int ignore ATTRIBUTE_UNUSED)2551 ecoff_directive_dim (int ignore ATTRIBUTE_UNUSED)
2552 {
2553   int dimens[N_TQ];
2554   int i;
2555 
2556   if (coff_sym_name == (char *) NULL)
2557     {
2558       as_warn (_(".dim pseudo-op used outside of .def/.endef; ignored"));
2559       demand_empty_rest_of_line ();
2560       return;
2561     }
2562 
2563   for (i = 0; i < N_TQ; i++)
2564     {
2565       SKIP_WHITESPACE ();
2566       dimens[i] = get_absolute_expression ();
2567       if (*input_line_pointer == ',')
2568 	++input_line_pointer;
2569       else
2570 	{
2571 	  if (*input_line_pointer != '\n'
2572 	      && *input_line_pointer != ';')
2573 	    as_warn (_("badly formed .dim directive"));
2574 	  break;
2575 	}
2576     }
2577 
2578   if (i == N_TQ)
2579     --i;
2580 
2581   /* The dimensions are stored away in reverse order.  */
2582   for (; i >= 0; i--)
2583     {
2584       if (coff_type.num_dims >= N_TQ)
2585 	{
2586 	  as_warn (_("too many .dim entries"));
2587 	  break;
2588 	}
2589       coff_type.dimensions[coff_type.num_dims] = dimens[i];
2590       ++coff_type.num_dims;
2591     }
2592 
2593   demand_empty_rest_of_line ();
2594 }
2595 
2596 /* Handle a .scl directive, which sets the COFF storage class of the
2597    symbol.  */
2598 
2599 void
ecoff_directive_scl(int ignore ATTRIBUTE_UNUSED)2600 ecoff_directive_scl (int ignore ATTRIBUTE_UNUSED)
2601 {
2602   long val;
2603 
2604   if (coff_sym_name == (char *) NULL)
2605     {
2606       as_warn (_(".scl pseudo-op used outside of .def/.endef; ignored"));
2607       demand_empty_rest_of_line ();
2608       return;
2609     }
2610 
2611   val = get_absolute_expression ();
2612 
2613   coff_symbol_typ = map_coff_sym_type[val];
2614   coff_storage_class = map_coff_storage[val];
2615 
2616   demand_empty_rest_of_line ();
2617 }
2618 
2619 /* Handle a .size directive.  For some reason mips-tfile.c thinks that
2620    .size can have multiple arguments.  We humor it, although gcc will
2621    never generate more than one argument.  */
2622 
2623 void
ecoff_directive_size(int ignore ATTRIBUTE_UNUSED)2624 ecoff_directive_size (int ignore ATTRIBUTE_UNUSED)
2625 {
2626   int sizes[N_TQ];
2627   int i;
2628 
2629   if (coff_sym_name == (char *) NULL)
2630     {
2631       as_warn (_(".size pseudo-op used outside of .def/.endef; ignored"));
2632       demand_empty_rest_of_line ();
2633       return;
2634     }
2635 
2636   for (i = 0; i < N_TQ; i++)
2637     {
2638       SKIP_WHITESPACE ();
2639       sizes[i] = get_absolute_expression ();
2640       if (*input_line_pointer == ',')
2641 	++input_line_pointer;
2642       else
2643 	{
2644 	  if (*input_line_pointer != '\n'
2645 	      && *input_line_pointer != ';')
2646 	    as_warn (_("badly formed .size directive"));
2647 	  break;
2648 	}
2649     }
2650 
2651   if (i == N_TQ)
2652     --i;
2653 
2654   /* The sizes are stored away in reverse order.  */
2655   for (; i >= 0; i--)
2656     {
2657       if (coff_type.num_sizes >= N_TQ)
2658 	{
2659 	  as_warn (_("too many .size entries"));
2660 	  break;
2661 	}
2662       coff_type.sizes[coff_type.num_sizes] = sizes[i];
2663       ++coff_type.num_sizes;
2664     }
2665 
2666   demand_empty_rest_of_line ();
2667 }
2668 
2669 /* Handle the .type directive, which gives the COFF type of the
2670    symbol.  */
2671 
2672 void
ecoff_directive_type(int ignore ATTRIBUTE_UNUSED)2673 ecoff_directive_type (int ignore ATTRIBUTE_UNUSED)
2674 {
2675   long val;
2676   tq_t *tq_ptr;
2677   tq_t *tq_shft;
2678 
2679   if (coff_sym_name == (char *) NULL)
2680     {
2681       as_warn (_(".type pseudo-op used outside of .def/.endef; ignored"));
2682       demand_empty_rest_of_line ();
2683       return;
2684     }
2685 
2686   val = get_absolute_expression ();
2687 
2688   coff_type.orig_type = BTYPE (val);
2689   coff_type.basic_type = map_coff_types[coff_type.orig_type];
2690 
2691   tq_ptr = &coff_type.type_qualifiers[N_TQ];
2692   while (val & ~N_BTMASK)
2693     {
2694       if (tq_ptr == &coff_type.type_qualifiers[0])
2695 	{
2696 	  /* FIXME: We could handle this by setting the continued bit.
2697 	     There would still be a limit: the .type argument can not
2698 	     be infinite.  */
2699 	  as_warn (_("the type of %s is too complex; it will be simplified"),
2700 		   coff_sym_name);
2701 	  break;
2702 	}
2703       if (ISPTR (val))
2704 	*--tq_ptr = tq_Ptr;
2705       else if (ISFCN (val))
2706 	*--tq_ptr = tq_Proc;
2707       else if (ISARY (val))
2708 	*--tq_ptr = tq_Array;
2709       else
2710 	as_fatal (_("Unrecognized .type argument"));
2711 
2712       val = DECREF (val);
2713     }
2714 
2715   tq_shft = &coff_type.type_qualifiers[0];
2716   while (tq_ptr != &coff_type.type_qualifiers[N_TQ])
2717     *tq_shft++ = *tq_ptr++;
2718 
2719   if (tq_shft != &coff_type.type_qualifiers[0] && tq_shft[-1] == tq_Proc)
2720     {
2721       /* If this is a function, ignore it, so that we don't get two
2722          entries (one from the .ent, and one for the .def that
2723          precedes it).  Save the type information so that the end
2724          block can properly add it after the begin block index.  For
2725          MIPS knows what reason, we must strip off the function type
2726          at this point.  */
2727       coff_is_function = 1;
2728       tq_shft[-1] = tq_Nil;
2729     }
2730 
2731   while (tq_shft != &coff_type.type_qualifiers[N_TQ])
2732     *tq_shft++ = tq_Nil;
2733 
2734   demand_empty_rest_of_line ();
2735 }
2736 
2737 /* Handle the .tag directive, which gives the name of a structure,
2738    union or enum.  */
2739 
2740 void
ecoff_directive_tag(int ignore ATTRIBUTE_UNUSED)2741 ecoff_directive_tag (int ignore ATTRIBUTE_UNUSED)
2742 {
2743   char *name;
2744   char name_end;
2745 
2746   if (coff_sym_name == (char *) NULL)
2747     {
2748       as_warn (_(".tag pseudo-op used outside of .def/.endef; ignored"));
2749       demand_empty_rest_of_line ();
2750       return;
2751     }
2752 
2753   name = input_line_pointer;
2754   name_end = get_symbol_end ();
2755 
2756   coff_tag = xstrdup (name);
2757 
2758   *input_line_pointer = name_end;
2759 
2760   demand_empty_rest_of_line ();
2761 }
2762 
2763 /* Handle the .val directive, which gives the value of the symbol.  It
2764    may be the name of a static or global symbol.  */
2765 
2766 void
ecoff_directive_val(int ignore ATTRIBUTE_UNUSED)2767 ecoff_directive_val (int ignore ATTRIBUTE_UNUSED)
2768 {
2769   expressionS exp;
2770 
2771   if (coff_sym_name == (char *) NULL)
2772     {
2773       as_warn (_(".val pseudo-op used outside of .def/.endef; ignored"));
2774       demand_empty_rest_of_line ();
2775       return;
2776     }
2777 
2778   expression (&exp);
2779   if (exp.X_op != O_constant && exp.X_op != O_symbol)
2780     {
2781       as_bad (_(".val expression is too copmlex"));
2782       demand_empty_rest_of_line ();
2783       return;
2784     }
2785 
2786   if (exp.X_op == O_constant)
2787     coff_value = exp.X_add_number;
2788   else
2789     {
2790       coff_sym_value = exp.X_add_symbol;
2791       coff_sym_addend = exp.X_add_number;
2792     }
2793 
2794   demand_empty_rest_of_line ();
2795 }
2796 
2797 /* Handle the .endef directive, which terminates processing of COFF
2798    debugging information for a symbol.  */
2799 
2800 void
ecoff_directive_endef(int ignore ATTRIBUTE_UNUSED)2801 ecoff_directive_endef (int ignore ATTRIBUTE_UNUSED)
2802 {
2803   char *name;
2804   symint_t indx;
2805   localsym_t *sym;
2806 
2807   demand_empty_rest_of_line ();
2808 
2809   if (coff_sym_name == (char *) NULL)
2810     {
2811       as_warn (_(".endef pseudo-op used before .def; ignored"));
2812       return;
2813     }
2814 
2815   name = coff_sym_name;
2816   coff_sym_name = (char *) NULL;
2817 
2818   /* If the symbol is a static or external, we have already gotten the
2819      appropriate type and class, so make sure we don't override those
2820      values.  This is needed because there are some type and classes
2821      that are not in COFF, such as short data, etc.  */
2822   if (coff_sym_value != (symbolS *) NULL)
2823     {
2824       coff_symbol_typ = st_Nil;
2825       coff_storage_class = sc_Nil;
2826     }
2827 
2828   coff_type.extra_sizes = coff_tag != (char *) NULL;
2829   if (coff_type.num_dims > 0)
2830     {
2831       int diff = coff_type.num_dims - coff_type.num_sizes;
2832       int i = coff_type.num_dims - 1;
2833       int j;
2834 
2835       if (coff_type.num_sizes != 1 || diff < 0)
2836 	{
2837 	  as_warn (_("bad COFF debugging information"));
2838 	  return;
2839 	}
2840 
2841       /* If this is an array, make sure the same number of dimensions
2842          and sizes were passed, creating extra sizes for multiply
2843          dimensioned arrays if not passed.  */
2844       coff_type.extra_sizes = 0;
2845       if (diff)
2846 	{
2847 	  j = (sizeof (coff_type.sizes) / sizeof (coff_type.sizes[0])) - 1;
2848 	  while (j >= 0)
2849 	    {
2850 	      coff_type.sizes[j] = (((j - diff) >= 0)
2851 				    ? coff_type.sizes[j - diff]
2852 				    : 0);
2853 	      j--;
2854 	    }
2855 
2856 	  coff_type.num_sizes = i + 1;
2857 	  for (i--; i >= 0; i--)
2858 	    coff_type.sizes[i] = (coff_type.dimensions[i + 1] == 0
2859 				  ? 0
2860 				  : (coff_type.sizes[i + 1]
2861 				     / coff_type.dimensions[i + 1]));
2862 	}
2863     }
2864   else if (coff_symbol_typ == st_Member
2865 	   && coff_type.num_sizes - coff_type.extra_sizes == 1)
2866     {
2867       /* Is this a bitfield?  This is indicated by a structure member
2868          having a size field that isn't an array.  */
2869       coff_type.bitfield = 1;
2870     }
2871 
2872   /* Except for enumeration members & begin/ending of scopes, put the
2873      type word in the aux. symbol table.  */
2874   if (coff_symbol_typ == st_Block || coff_symbol_typ == st_End)
2875     indx = 0;
2876   else if (coff_inside_enumeration)
2877     indx = cur_file_ptr->void_type;
2878   else
2879     {
2880       if (coff_type.basic_type == bt_Struct
2881 	  || coff_type.basic_type == bt_Union
2882 	  || coff_type.basic_type == bt_Enum)
2883 	{
2884 	  if (coff_tag == (char *) NULL)
2885 	    {
2886 	      as_warn (_("no tag specified for %s"), name);
2887 	      return;
2888 	    }
2889 
2890 	  coff_type.tag_ptr = get_tag (coff_tag, (localsym_t *) NULL,
2891 				       coff_type.basic_type);
2892 	}
2893 
2894       if (coff_is_function)
2895 	{
2896 	  last_func_type_info = coff_type;
2897 	  last_func_sym_value = coff_sym_value;
2898 	  return;
2899 	}
2900 
2901       indx = add_aux_sym_tir (&coff_type,
2902 			      hash_yes,
2903 			      &cur_file_ptr->thash_head[0]);
2904     }
2905 
2906   /* Do any last minute adjustments that are necessary.  */
2907   switch (coff_symbol_typ)
2908     {
2909     default:
2910       break;
2911 
2912       /* For the beginning of structs, unions, and enumerations, the
2913          size info needs to be passed in the value field.  */
2914     case st_Block:
2915       if (coff_type.num_sizes - coff_type.num_dims - coff_type.extra_sizes
2916 	  != 1)
2917 	{
2918 	  as_warn (_("bad COFF debugging information"));
2919 	  return;
2920 	}
2921       else
2922 	coff_value = coff_type.sizes[0];
2923 
2924       coff_inside_enumeration = (coff_type.orig_type == T_ENUM);
2925       break;
2926 
2927       /* For the end of structs, unions, and enumerations, omit the
2928          name which is always ".eos".  This needs to be done last, so
2929          that any error reporting above gives the correct name.  */
2930     case st_End:
2931       free (name);
2932       name = (char *) NULL;
2933       coff_value = 0;
2934       coff_inside_enumeration = 0;
2935       break;
2936 
2937       /* Members of structures and unions that aren't bitfields, need
2938          to adjust the value from a byte offset to a bit offset.
2939          Members of enumerations do not have the value adjusted, and
2940          can be distinguished by indx == indexNil.  For enumerations,
2941          update the maximum enumeration value.  */
2942     case st_Member:
2943       if (! coff_type.bitfield && ! coff_inside_enumeration)
2944 	coff_value *= 8;
2945 
2946       break;
2947     }
2948 
2949   /* Add the symbol.  */
2950   sym = add_ecoff_symbol (name,
2951 			  coff_symbol_typ,
2952 			  coff_storage_class,
2953 			  coff_sym_value,
2954 			  coff_sym_addend,
2955 			  (symint_t) coff_value,
2956 			  indx);
2957 
2958   /* deal with struct, union, and enum tags.  */
2959   if (coff_symbol_typ == st_Block)
2960     {
2961       /* Create or update the tag information.  */
2962       tag_t *tag_ptr = get_tag (name,
2963 				sym,
2964 				coff_type.basic_type);
2965       forward_t **pf;
2966 
2967       /* Remember any forward references.  */
2968       for (pf = &sym->forward_ref;
2969 	   *pf != (forward_t *) NULL;
2970 	   pf = &(*pf)->next)
2971 	;
2972       *pf = tag_ptr->forward_ref;
2973       tag_ptr->forward_ref = (forward_t *) NULL;
2974     }
2975 }
2976 
2977 /* Parse .end directives.  */
2978 
2979 void
ecoff_directive_end(int ignore ATTRIBUTE_UNUSED)2980 ecoff_directive_end (int ignore ATTRIBUTE_UNUSED)
2981 {
2982   char *name;
2983   char name_end;
2984   symbolS *ent;
2985 
2986   if (cur_file_ptr == (efdr_t *) NULL)
2987     {
2988       as_warn (_(".end directive without a preceding .file directive"));
2989       demand_empty_rest_of_line ();
2990       return;
2991     }
2992 
2993   if (cur_proc_ptr == (proc_t *) NULL)
2994     {
2995       as_warn (_(".end directive without a preceding .ent directive"));
2996       demand_empty_rest_of_line ();
2997       return;
2998     }
2999 
3000   name = input_line_pointer;
3001   name_end = get_symbol_end ();
3002 
3003   if (name == input_line_pointer)
3004     {
3005       as_warn (_(".end directive has no name"));
3006       *input_line_pointer = name_end;
3007       demand_empty_rest_of_line ();
3008       return;
3009     }
3010 
3011   /* The value is the distance between the .end directive and the
3012      corresponding symbol.  We create a fake symbol to hold the
3013      current location, and put in the offset when we write out the
3014      symbol.  */
3015   ent = symbol_find (name);
3016   if (ent == (symbolS *) NULL)
3017     as_warn (_(".end directive names unknown symbol"));
3018   else
3019     (void) add_ecoff_symbol ((const char *) NULL, st_End, sc_Text,
3020 			     symbol_new ("L0\001", now_seg,
3021 					 (valueT) frag_now_fix (),
3022 					 frag_now),
3023 			     (bfd_vma) 0, (symint_t) 0, (symint_t) 0);
3024 
3025   cur_proc_ptr = (proc_t *) NULL;
3026 
3027   *input_line_pointer = name_end;
3028   demand_empty_rest_of_line ();
3029 }
3030 
3031 /* Parse .ent directives.  */
3032 
3033 void
ecoff_directive_ent(int ignore ATTRIBUTE_UNUSED)3034 ecoff_directive_ent (int ignore ATTRIBUTE_UNUSED)
3035 {
3036   char *name;
3037   char name_end;
3038 
3039   if (cur_file_ptr == (efdr_t *) NULL)
3040     add_file ((const char *) NULL, 0, 1);
3041 
3042   if (cur_proc_ptr != (proc_t *) NULL)
3043     {
3044       as_warn (_("second .ent directive found before .end directive"));
3045       demand_empty_rest_of_line ();
3046       return;
3047     }
3048 
3049   name = input_line_pointer;
3050   name_end = get_symbol_end ();
3051 
3052   if (name == input_line_pointer)
3053     {
3054       as_warn (_(".ent directive has no name"));
3055       *input_line_pointer = name_end;
3056       demand_empty_rest_of_line ();
3057       return;
3058     }
3059 
3060   add_procedure (name);
3061 
3062   *input_line_pointer = name_end;
3063 
3064   /* The .ent directive is sometimes followed by a number.  I'm not
3065      really sure what the number means.  I don't see any way to store
3066      the information in the PDR.  The Irix 4 assembler seems to ignore
3067      the information.  */
3068   SKIP_WHITESPACE ();
3069   if (*input_line_pointer == ',')
3070     {
3071       ++input_line_pointer;
3072       SKIP_WHITESPACE ();
3073     }
3074   if (ISDIGIT (*input_line_pointer)
3075       || *input_line_pointer == '-')
3076     (void) get_absolute_expression ();
3077 
3078   demand_empty_rest_of_line ();
3079 }
3080 
3081 /* Parse .extern directives.  */
3082 
3083 void
ecoff_directive_extern(int ignore ATTRIBUTE_UNUSED)3084 ecoff_directive_extern (int ignore ATTRIBUTE_UNUSED)
3085 {
3086   char *name;
3087   int c;
3088   symbolS *symbolp;
3089   valueT size;
3090 
3091   name = input_line_pointer;
3092   c = get_symbol_end ();
3093   symbolp = symbol_find_or_make (name);
3094   *input_line_pointer = c;
3095 
3096   S_SET_EXTERNAL (symbolp);
3097 
3098   if (*input_line_pointer == ',')
3099     ++input_line_pointer;
3100   size = get_absolute_expression ();
3101 
3102   symbol_get_obj (symbolp)->ecoff_extern_size = size;
3103 }
3104 
3105 /* Parse .file directives.  */
3106 
3107 void
ecoff_directive_file(int ignore ATTRIBUTE_UNUSED)3108 ecoff_directive_file (int ignore ATTRIBUTE_UNUSED)
3109 {
3110   int indx;
3111   char *name;
3112   int len;
3113 
3114   if (cur_proc_ptr != (proc_t *) NULL)
3115     {
3116       as_warn (_("no way to handle .file within .ent/.end section"));
3117       demand_empty_rest_of_line ();
3118       return;
3119     }
3120 
3121   indx = (int) get_absolute_expression ();
3122 
3123   /* FIXME: we don't have to save the name here.  */
3124   name = demand_copy_C_string (&len);
3125 
3126   add_file (name, indx - 1, 0);
3127 
3128   demand_empty_rest_of_line ();
3129 }
3130 
3131 /* Parse .fmask directives.  */
3132 
3133 void
ecoff_directive_fmask(int ignore ATTRIBUTE_UNUSED)3134 ecoff_directive_fmask (int ignore ATTRIBUTE_UNUSED)
3135 {
3136   long val;
3137 
3138   if (cur_proc_ptr == (proc_t *) NULL)
3139     {
3140       as_warn (_(".fmask outside of .ent"));
3141       demand_empty_rest_of_line ();
3142       return;
3143     }
3144 
3145   if (get_absolute_expression_and_terminator (&val) != ',')
3146     {
3147       as_warn (_("bad .fmask directive"));
3148       --input_line_pointer;
3149       demand_empty_rest_of_line ();
3150       return;
3151     }
3152 
3153   cur_proc_ptr->pdr.fregmask = val;
3154   cur_proc_ptr->pdr.fregoffset = get_absolute_expression ();
3155 
3156   demand_empty_rest_of_line ();
3157 }
3158 
3159 /* Parse .frame directives.  */
3160 
3161 void
ecoff_directive_frame(int ignore ATTRIBUTE_UNUSED)3162 ecoff_directive_frame (int ignore ATTRIBUTE_UNUSED)
3163 {
3164   long val;
3165 
3166   if (cur_proc_ptr == (proc_t *) NULL)
3167     {
3168       as_warn (_(".frame outside of .ent"));
3169       demand_empty_rest_of_line ();
3170       return;
3171     }
3172 
3173   cur_proc_ptr->pdr.framereg = tc_get_register (1);
3174 
3175   SKIP_WHITESPACE ();
3176   if (*input_line_pointer++ != ','
3177       || get_absolute_expression_and_terminator (&val) != ',')
3178     {
3179       as_warn (_("bad .frame directive"));
3180       --input_line_pointer;
3181       demand_empty_rest_of_line ();
3182       return;
3183     }
3184 
3185   cur_proc_ptr->pdr.frameoffset = val;
3186 
3187   cur_proc_ptr->pdr.pcreg = tc_get_register (0);
3188 
3189   /* Alpha-OSF1 adds "the offset of saved $a0 from $sp", according to
3190      Sandro.  I don't yet know where this value should be stored, if
3191      anywhere.  Don't call demand_empty_rest_of_line ().  */
3192   s_ignore (42);
3193 }
3194 
3195 /* Parse .mask directives.  */
3196 
3197 void
ecoff_directive_mask(int ignore ATTRIBUTE_UNUSED)3198 ecoff_directive_mask (int ignore ATTRIBUTE_UNUSED)
3199 {
3200   long val;
3201 
3202   if (cur_proc_ptr == (proc_t *) NULL)
3203     {
3204       as_warn (_(".mask outside of .ent"));
3205       demand_empty_rest_of_line ();
3206       return;
3207     }
3208 
3209   if (get_absolute_expression_and_terminator (&val) != ',')
3210     {
3211       as_warn (_("bad .mask directive"));
3212       --input_line_pointer;
3213       demand_empty_rest_of_line ();
3214       return;
3215     }
3216 
3217   cur_proc_ptr->pdr.regmask = val;
3218   cur_proc_ptr->pdr.regoffset = get_absolute_expression ();
3219 
3220   demand_empty_rest_of_line ();
3221 }
3222 
3223 /* Parse .loc directives.  */
3224 
3225 void
ecoff_directive_loc(int ignore ATTRIBUTE_UNUSED)3226 ecoff_directive_loc (int ignore ATTRIBUTE_UNUSED)
3227 {
3228   lineno_list_t *list;
3229   symint_t lineno;
3230 
3231   if (cur_file_ptr == (efdr_t *) NULL)
3232     {
3233       as_warn (_(".loc before .file"));
3234       demand_empty_rest_of_line ();
3235       return;
3236     }
3237 
3238   if (now_seg != text_section)
3239     {
3240       as_warn (_(".loc outside of .text"));
3241       demand_empty_rest_of_line ();
3242       return;
3243     }
3244 
3245   /* Skip the file number.  */
3246   SKIP_WHITESPACE ();
3247   get_absolute_expression ();
3248   SKIP_WHITESPACE ();
3249 
3250   lineno = get_absolute_expression ();
3251 
3252 #ifndef NO_LISTING
3253   if (listing)
3254     listing_source_line (lineno);
3255 #endif
3256 
3257   /* If we're building stabs, then output a special label rather than
3258      ECOFF line number info.  */
3259   if (stabs_seen)
3260     {
3261       (void) add_ecoff_symbol ((char *) NULL, st_Label, sc_Text,
3262 			       symbol_new ("L0\001", now_seg,
3263 					   (valueT) frag_now_fix (),
3264 					   frag_now),
3265 			       (bfd_vma) 0, 0, lineno);
3266       return;
3267     }
3268 
3269   list = allocate_lineno_list ();
3270 
3271   list->next = (lineno_list_t *) NULL;
3272   list->file = cur_file_ptr;
3273   list->proc = cur_proc_ptr;
3274   list->frag = frag_now;
3275   list->paddr = frag_now_fix ();
3276   list->lineno = lineno;
3277 
3278   /* We don't want to merge files which have line numbers.  */
3279   cur_file_ptr->fdr.fMerge = 0;
3280 
3281   /* A .loc directive will sometimes appear before a .ent directive,
3282      which means that cur_proc_ptr will be NULL here.  Arrange to
3283      patch this up.  */
3284   if (cur_proc_ptr == (proc_t *) NULL)
3285     {
3286       lineno_list_t **pl;
3287 
3288       pl = &noproc_lineno;
3289       while (*pl != (lineno_list_t *) NULL)
3290 	pl = &(*pl)->next;
3291       *pl = list;
3292     }
3293   else
3294     {
3295       last_lineno = list;
3296       *last_lineno_ptr = list;
3297       last_lineno_ptr = &list->next;
3298     }
3299 }
3300 
3301 /* The MIPS assembler sometimes inserts nop instructions in the
3302    instruction stream.  When this happens, we must patch up the .loc
3303    information so that it points to the instruction after the nop.  */
3304 
3305 void
ecoff_fix_loc(fragS * old_frag,unsigned long old_frag_offset)3306 ecoff_fix_loc (fragS *old_frag, unsigned long old_frag_offset)
3307 {
3308   if (last_lineno != NULL
3309       && last_lineno->frag == old_frag
3310       && last_lineno->paddr == old_frag_offset)
3311     {
3312       last_lineno->frag = frag_now;
3313       last_lineno->paddr = frag_now_fix ();
3314     }
3315 }
3316 
3317 /* Make sure the @stabs symbol is emitted.  */
3318 
3319 static void
mark_stabs(int ignore ATTRIBUTE_UNUSED)3320 mark_stabs (int ignore ATTRIBUTE_UNUSED)
3321 {
3322   if (! stabs_seen)
3323     {
3324       /* Add a dummy @stabs dymbol.  */
3325       stabs_seen = 1;
3326       (void) add_ecoff_symbol (stabs_symbol, stNil, scInfo,
3327 			       (symbolS *) NULL,
3328 			       (bfd_vma) 0, (symint_t) -1,
3329 			       ECOFF_MARK_STAB (0));
3330     }
3331 }
3332 
3333 /* Parse .weakext directives.  */
3334 #ifndef TC_MIPS
3335 /* For TC_MIPS use the version in tc-mips.c.  */
3336 void
ecoff_directive_weakext(int ignore ATTRIBUTE_UNUSED)3337 ecoff_directive_weakext (int ignore ATTRIBUTE_UNUSED)
3338 {
3339   char *name;
3340   int c;
3341   symbolS *symbolP;
3342   expressionS exp;
3343 
3344   name = input_line_pointer;
3345   c = get_symbol_end ();
3346   symbolP = symbol_find_or_make (name);
3347   *input_line_pointer = c;
3348 
3349   SKIP_WHITESPACE ();
3350 
3351   if (*input_line_pointer == ',')
3352     {
3353       if (S_IS_DEFINED (symbolP))
3354 	{
3355 	  as_bad (_("symbol `%s' is already defined"),
3356 		  S_GET_NAME (symbolP));
3357 	  ignore_rest_of_line ();
3358 	  return;
3359 	}
3360 
3361       ++input_line_pointer;
3362       SKIP_WHITESPACE ();
3363       if (! is_end_of_line[(unsigned char) *input_line_pointer])
3364 	{
3365 	  expression (&exp);
3366 	  if (exp.X_op != O_symbol)
3367 	    {
3368 	      as_bad (_("bad .weakext directive"));
3369 	      ignore_rest_of_line ();
3370 	      return;
3371 	    }
3372 	  symbol_set_value_expression (symbolP, &exp);
3373 	}
3374     }
3375 
3376   S_SET_WEAK (symbolP);
3377 
3378   demand_empty_rest_of_line ();
3379 }
3380 #endif /* not TC_MIPS */
3381 
3382 /* Handle .stabs directives.  The actual parsing routine is done by a
3383    generic routine.  This routine is called via OBJ_PROCESS_STAB.
3384    When this is called, input_line_pointer will be pointing at the
3385    value field of the stab.
3386 
3387    .stabs directives have five fields:
3388 	"string"	a string, encoding the type information.
3389 	code		a numeric code, defined in <stab.h>
3390 	0		a zero
3391 	desc		a zero or line number
3392 	value		a numeric value or an address.
3393 
3394     If the value is relocatable, we transform this into:
3395 	iss		points as an index into string space
3396 	value		value from lookup of the name
3397 	st		st from lookup of the name
3398 	sc		sc from lookup of the name
3399 	index		code|CODE_MASK
3400 
3401     If the value is not relocatable, we transform this into:
3402 	iss		points as an index into string space
3403 	value		value
3404 	st		st_Nil
3405 	sc		sc_Nil
3406 	index		code|CODE_MASK
3407 
3408     .stabn directives have four fields (string is null):
3409 	code		a numeric code, defined in <stab.h>
3410 	0		a zero
3411 	desc		a zero or a line number
3412 	value		a numeric value or an address.  */
3413 
3414 void
ecoff_stab(segT sec ATTRIBUTE_UNUSED,int what,const char * string,int type,int other,int desc)3415 ecoff_stab (segT sec ATTRIBUTE_UNUSED,
3416 	    int what,
3417 	    const char *string,
3418 	    int type,
3419 	    int other,
3420 	    int desc)
3421 {
3422   efdr_t *save_file_ptr = cur_file_ptr;
3423   symbolS *sym;
3424   symint_t value;
3425   bfd_vma addend;
3426   st_t st;
3427   sc_t sc;
3428   symint_t indx;
3429   localsym_t *hold = NULL;
3430 
3431   ecoff_debugging_seen = 1;
3432 
3433   /* We don't handle .stabd.  */
3434   if (what != 's' && what != 'n')
3435     {
3436       as_bad (_(".stab%c is not supported"), what);
3437       return;
3438     }
3439 
3440   /* A .stabn uses a null name, not an empty string.  */
3441   if (what == 'n')
3442     string = NULL;
3443 
3444   /* We ignore the other field.  */
3445   if (other != 0)
3446     as_warn (_(".stab%c: ignoring non-zero other field"), what);
3447 
3448   /* Make sure we have a current file.  */
3449   if (cur_file_ptr == (efdr_t *) NULL)
3450     {
3451       add_file ((const char *) NULL, 0, 1);
3452       save_file_ptr = cur_file_ptr;
3453     }
3454 
3455   /* For stabs in ECOFF, the first symbol must be @stabs.  This is a
3456      signal to gdb.  */
3457   if (stabs_seen == 0)
3458     mark_stabs (0);
3459 
3460   /* Line number stabs are handled differently, since they have two
3461      values, the line number and the address of the label.  We use the
3462      index field (aka desc) to hold the line number, and the value
3463      field to hold the address.  The symbol type is st_Label, which
3464      should be different from the other stabs, so that gdb can
3465      recognize it.  */
3466   if (type == N_SLINE)
3467     {
3468       SYMR dummy_symr;
3469       char *name;
3470       char name_end;
3471 
3472 #ifndef NO_LISTING
3473       if (listing)
3474 	listing_source_line ((unsigned int) desc);
3475 #endif
3476 
3477       dummy_symr.index = desc;
3478       if (dummy_symr.index != desc)
3479 	{
3480 	  as_warn (_("line number (%d) for .stab%c directive cannot fit in index field (20 bits)"),
3481 		   desc, what);
3482 	  return;
3483 	}
3484 
3485       name = input_line_pointer;
3486       name_end = get_symbol_end ();
3487 
3488       sym = symbol_find_or_make (name);
3489       *input_line_pointer = name_end;
3490 
3491       value = 0;
3492       addend = 0;
3493       st = st_Label;
3494       sc = sc_Text;
3495       indx = desc;
3496     }
3497   else
3498     {
3499 #ifndef NO_LISTING
3500       if (listing && (type == N_SO || type == N_SOL))
3501 	listing_source_file (string);
3502 #endif
3503 
3504       if (ISDIGIT (*input_line_pointer)
3505 	  || *input_line_pointer == '-'
3506 	  || *input_line_pointer == '+')
3507 	{
3508 	  st = st_Nil;
3509 	  sc = sc_Nil;
3510 	  sym = (symbolS *) NULL;
3511 	  value = get_absolute_expression ();
3512 	  addend = 0;
3513 	}
3514       else if (! is_name_beginner ((unsigned char) *input_line_pointer))
3515 	{
3516 	  as_warn (_("illegal .stab%c directive, bad character"), what);
3517 	  return;
3518 	}
3519       else
3520 	{
3521 	  expressionS exp;
3522 
3523 	  sc = sc_Nil;
3524 	  st = st_Nil;
3525 
3526 	  expression (&exp);
3527 	  if (exp.X_op == O_constant)
3528 	    {
3529 	      sym = NULL;
3530 	      value = exp.X_add_number;
3531 	      addend = 0;
3532 	    }
3533 	  else if (exp.X_op == O_symbol)
3534 	    {
3535 	      sym = exp.X_add_symbol;
3536 	      value = 0;
3537 	      addend = exp.X_add_number;
3538 	    }
3539 	  else
3540 	    {
3541 	      sym = make_expr_symbol (&exp);
3542 	      value = 0;
3543 	      addend = 0;
3544 	    }
3545 	}
3546 
3547       indx = ECOFF_MARK_STAB (type);
3548     }
3549 
3550   /* Don't store the stabs symbol we are creating as the type of the
3551      ECOFF symbol.  We want to compute the type of the ECOFF symbol
3552      independently.  */
3553   if (sym != (symbolS *) NULL)
3554     hold = symbol_get_obj (sym)->ecoff_symbol;
3555 
3556   (void) add_ecoff_symbol (string, st, sc, sym, addend, value, indx);
3557 
3558   if (sym != (symbolS *) NULL)
3559     symbol_get_obj (sym)->ecoff_symbol = hold;
3560 
3561   /* Restore normal file type.  */
3562   cur_file_ptr = save_file_ptr;
3563 }
3564 
3565 /* Frob an ECOFF symbol.  Small common symbols go into a special
3566    .scommon section rather than bfd_com_section.  */
3567 
3568 void
ecoff_frob_symbol(symbolS * sym)3569 ecoff_frob_symbol (symbolS *sym)
3570 {
3571   if (S_IS_COMMON (sym)
3572       && S_GET_VALUE (sym) > 0
3573       && S_GET_VALUE (sym) <= bfd_get_gp_size (stdoutput))
3574     {
3575       static asection scom_section;
3576       static asymbol scom_symbol;
3577 
3578       /* We must construct a fake section similar to bfd_com_section
3579          but with the name .scommon.  */
3580       if (scom_section.name == NULL)
3581 	{
3582 	  scom_section = bfd_com_section;
3583 	  scom_section.name = ".scommon";
3584 	  scom_section.output_section = &scom_section;
3585 	  scom_section.symbol = &scom_symbol;
3586 	  scom_section.symbol_ptr_ptr = &scom_section.symbol;
3587 	  scom_symbol = *bfd_com_section.symbol;
3588 	  scom_symbol.name = ".scommon";
3589 	  scom_symbol.section = &scom_section;
3590 	}
3591       S_SET_SEGMENT (sym, &scom_section);
3592     }
3593 
3594   /* Double check weak symbols.  */
3595   if (S_IS_WEAK (sym))
3596     {
3597       if (S_IS_COMMON (sym))
3598 	as_bad (_("symbol `%s' can not be both weak and common"),
3599 		S_GET_NAME (sym));
3600     }
3601 }
3602 
3603 /* Add bytes to the symbolic information buffer.  */
3604 
3605 static char *
ecoff_add_bytes(char ** buf,char ** bufend,char * bufptr,unsigned long need)3606 ecoff_add_bytes (char **buf,
3607 		 char **bufend,
3608 		 char *bufptr,
3609 		 unsigned long need)
3610 {
3611   unsigned long at;
3612   unsigned long want;
3613 
3614   at = bufptr - *buf;
3615   need -= *bufend - bufptr;
3616   if (need < PAGE_SIZE)
3617     need = PAGE_SIZE;
3618   want = (*bufend - *buf) + need;
3619   *buf = xrealloc (*buf, want);
3620   *bufend = *buf + want;
3621   return *buf + at;
3622 }
3623 
3624 /* Adjust the symbolic information buffer to the alignment required
3625    for the ECOFF target debugging information.  */
3626 
3627 static unsigned long
ecoff_padding_adjust(const struct ecoff_debug_swap * backend,char ** buf,char ** bufend,unsigned long offset,char ** bufptrptr)3628 ecoff_padding_adjust (const struct ecoff_debug_swap *backend,
3629 		      char **buf,
3630 		      char **bufend,
3631 		      unsigned long offset,
3632 		      char **bufptrptr)
3633 {
3634   bfd_size_type align;
3635 
3636   align = backend->debug_align;
3637   if ((offset & (align - 1)) != 0)
3638     {
3639       unsigned long add;
3640 
3641       add = align - (offset & (align - 1));
3642       if ((unsigned long) (*bufend - (*buf + offset)) < add)
3643 	(void) ecoff_add_bytes (buf, bufend, *buf + offset, add);
3644       memset (*buf + offset, 0, add);
3645       offset += add;
3646       if (bufptrptr != (char **) NULL)
3647 	*bufptrptr = *buf + offset;
3648     }
3649 
3650   return offset;
3651 }
3652 
3653 /* Build the line number information.  */
3654 
3655 static unsigned long
ecoff_build_lineno(const struct ecoff_debug_swap * backend,char ** buf,char ** bufend,unsigned long offset,long * linecntptr)3656 ecoff_build_lineno (const struct ecoff_debug_swap *backend,
3657 		    char **buf,
3658 		    char **bufend,
3659 		    unsigned long offset,
3660 		    long *linecntptr)
3661 {
3662   char *bufptr;
3663   register lineno_list_t *l;
3664   lineno_list_t *last;
3665   efdr_t *file;
3666   proc_t *proc;
3667   unsigned long c;
3668   long iline;
3669   long totcount;
3670   lineno_list_t first;
3671   lineno_list_t *local_first_lineno = first_lineno;
3672 
3673   if (linecntptr != (long *) NULL)
3674     *linecntptr = 0;
3675 
3676   bufptr = *buf + offset;
3677 
3678   file = (efdr_t *) NULL;
3679   proc = (proc_t *) NULL;
3680   last = (lineno_list_t *) NULL;
3681   c = offset;
3682   iline = 0;
3683   totcount = 0;
3684 
3685   /* FIXME?  Now that MIPS embedded-PIC is gone, it may be safe to
3686      remove this code.  */
3687   /* For some reason the address of the first procedure is ignored
3688      when reading line numbers.  This doesn't matter if the address of
3689      the first procedure is 0, but when gcc is generating MIPS
3690      embedded PIC code, it will put strings in the .text section
3691      before the first procedure.  We cope by inserting a dummy line if
3692      the address of the first procedure is not 0.  Hopefully this
3693      won't screw things up too badly.
3694 
3695      Don't do this for ECOFF assembly source line numbers.  They work
3696      without this extra attention.  */
3697   if (debug_type != DEBUG_ECOFF
3698       && first_proc_ptr != (proc_t *) NULL
3699       && local_first_lineno != (lineno_list_t *) NULL
3700       && ((S_GET_VALUE (first_proc_ptr->sym->as_sym)
3701 	   + bfd_get_section_vma (stdoutput,
3702 				  S_GET_SEGMENT (first_proc_ptr->sym->as_sym)))
3703 	  != 0))
3704     {
3705       first.file = local_first_lineno->file;
3706       first.proc = local_first_lineno->proc;
3707       first.frag = &zero_address_frag;
3708       first.paddr = 0;
3709       first.lineno = 0;
3710 
3711       first.next = local_first_lineno;
3712       local_first_lineno = &first;
3713     }
3714 
3715   for (l = local_first_lineno; l != (lineno_list_t *) NULL; l = l->next)
3716     {
3717       long count;
3718       long delta;
3719 
3720       /* Get the offset to the memory address of the next line number
3721          (in words).  Do this first, so that we can skip ahead to the
3722          next useful line number entry.  */
3723       if (l->next == (lineno_list_t *) NULL)
3724 	{
3725 	  /* We want a count of zero, but it will be decremented
3726 	     before it is used.  */
3727 	  count = 1;
3728 	}
3729       else if (l->next->frag->fr_address + l->next->paddr
3730 	       > l->frag->fr_address + l->paddr)
3731 	{
3732 	  count = ((l->next->frag->fr_address + l->next->paddr
3733 		    - (l->frag->fr_address + l->paddr))
3734 		   >> 2);
3735 	}
3736       else
3737 	{
3738 	  /* Don't change last, so we still get the right delta.  */
3739 	  continue;
3740 	}
3741 
3742       if (l->file != file || l->proc != proc)
3743 	{
3744 	  if (l->proc != proc && proc != (proc_t *) NULL)
3745 	    proc->pdr.lnHigh = last->lineno;
3746 	  if (l->file != file && file != (efdr_t *) NULL)
3747 	    {
3748 	      file->fdr.cbLine = c - file->fdr.cbLineOffset;
3749 	      file->fdr.cline = totcount + count;
3750 	      if (linecntptr != (long *) NULL)
3751 		*linecntptr += totcount + count;
3752 	      totcount = 0;
3753 	    }
3754 
3755 	  if (l->file != file)
3756 	    {
3757 	      efdr_t *last_file = file;
3758 
3759 	      file = l->file;
3760 	      if (last_file != (efdr_t *) NULL)
3761 		file->fdr.ilineBase
3762 		  = last_file->fdr.ilineBase + last_file->fdr.cline;
3763 	      else
3764 		file->fdr.ilineBase = 0;
3765 	      file->fdr.cbLineOffset = c;
3766 	    }
3767 	  if (l->proc != proc)
3768 	    {
3769 	      proc = l->proc;
3770 	      if (proc != (proc_t *) NULL)
3771 		{
3772 		  proc->pdr.lnLow = l->lineno;
3773 		  proc->pdr.cbLineOffset = c - file->fdr.cbLineOffset;
3774 		  proc->pdr.iline = totcount;
3775 		}
3776 	    }
3777 
3778 	  last = (lineno_list_t *) NULL;
3779 	}
3780 
3781       totcount += count;
3782 
3783       /* Get the offset to this line number.  */
3784       if (last == (lineno_list_t *) NULL)
3785 	delta = 0;
3786       else
3787 	delta = l->lineno - last->lineno;
3788 
3789       /* Put in the offset to this line number.  */
3790       while (delta != 0)
3791 	{
3792 	  int setcount;
3793 
3794 	  /* 1 is added to each count read.  */
3795 	  --count;
3796 	  /* We can only adjust the word count by up to 15 words at a
3797 	     time.  */
3798 	  if (count <= 0x0f)
3799 	    {
3800 	      setcount = count;
3801 	      count = 0;
3802 	    }
3803 	  else
3804 	    {
3805 	      setcount = 0x0f;
3806 	      count -= 0x0f;
3807 	    }
3808 	  if (delta >= -7 && delta <= 7)
3809 	    {
3810 	      if (bufptr >= *bufend)
3811 		bufptr = ecoff_add_bytes (buf, bufend, bufptr, (long) 1);
3812 	      *bufptr++ = setcount + (delta << 4);
3813 	      delta = 0;
3814 	      ++c;
3815 	    }
3816 	  else
3817 	    {
3818 	      int set;
3819 
3820 	      if (*bufend - bufptr < 3)
3821 		bufptr = ecoff_add_bytes (buf, bufend, bufptr, (long) 3);
3822 	      *bufptr++ = setcount + (8 << 4);
3823 	      if (delta < -0x8000)
3824 		{
3825 		  set = -0x8000;
3826 		  delta += 0x8000;
3827 		}
3828 	      else if (delta > 0x7fff)
3829 		{
3830 		  set = 0x7fff;
3831 		  delta -= 0x7fff;
3832 		}
3833 	      else
3834 		{
3835 		  set = delta;
3836 		  delta = 0;
3837 		}
3838 	      *bufptr++ = set >> 8;
3839 	      *bufptr++ = set & 0xffff;
3840 	      c += 3;
3841 	    }
3842 	}
3843 
3844       /* Finish adjusting the count.  */
3845       while (count > 0)
3846 	{
3847 	  if (bufptr >= *bufend)
3848 	    bufptr = ecoff_add_bytes (buf, bufend, bufptr, (long) 1);
3849 	  /* 1 is added to each count read.  */
3850 	  --count;
3851 	  if (count > 0x0f)
3852 	    {
3853 	      *bufptr++ = 0x0f;
3854 	      count -= 0x0f;
3855 	    }
3856 	  else
3857 	    {
3858 	      *bufptr++ = count;
3859 	      count = 0;
3860 	    }
3861 	  ++c;
3862 	}
3863 
3864       ++iline;
3865       last = l;
3866     }
3867 
3868   if (proc != (proc_t *) NULL)
3869     proc->pdr.lnHigh = last->lineno;
3870   if (file != (efdr_t *) NULL)
3871     {
3872       file->fdr.cbLine = c - file->fdr.cbLineOffset;
3873       file->fdr.cline = totcount;
3874     }
3875 
3876   if (linecntptr != (long *) NULL)
3877     *linecntptr += totcount;
3878 
3879   c = ecoff_padding_adjust (backend, buf, bufend, c, &bufptr);
3880 
3881   return c;
3882 }
3883 
3884 /* Build and swap out the symbols.  */
3885 
3886 static unsigned long
ecoff_build_symbols(const struct ecoff_debug_swap * backend,char ** buf,char ** bufend,unsigned long offset)3887 ecoff_build_symbols (const struct ecoff_debug_swap *backend,
3888 		     char **buf,
3889 		     char **bufend,
3890 		     unsigned long offset)
3891 {
3892   const bfd_size_type external_sym_size = backend->external_sym_size;
3893   void (* const swap_sym_out) (bfd *, const SYMR *, PTR)
3894     = backend->swap_sym_out;
3895   char *sym_out;
3896   long isym;
3897   vlinks_t *file_link;
3898 
3899   sym_out = *buf + offset;
3900 
3901   isym = 0;
3902 
3903   /* The symbols are stored by file.  */
3904   for (file_link = file_desc.first;
3905        file_link != (vlinks_t *) NULL;
3906        file_link = file_link->next)
3907     {
3908       int ifilesym;
3909       int fil_cnt;
3910       efdr_t *fil_ptr;
3911       efdr_t *fil_end;
3912 
3913       if (file_link->next == (vlinks_t *) NULL)
3914 	fil_cnt = file_desc.objects_last_page;
3915       else
3916 	fil_cnt = file_desc.objects_per_page;
3917       fil_ptr = file_link->datum->file;
3918       fil_end = fil_ptr + fil_cnt;
3919       for (; fil_ptr < fil_end; fil_ptr++)
3920 	{
3921 	  vlinks_t *sym_link;
3922 
3923 	  fil_ptr->fdr.isymBase = isym;
3924 	  ifilesym = isym;
3925 	  for (sym_link = fil_ptr->symbols.first;
3926 	       sym_link != (vlinks_t *) NULL;
3927 	       sym_link = sym_link->next)
3928 	    {
3929 	      int sym_cnt;
3930 	      localsym_t *sym_ptr;
3931 	      localsym_t *sym_end;
3932 
3933 	      if (sym_link->next == (vlinks_t *) NULL)
3934 		sym_cnt = fil_ptr->symbols.objects_last_page;
3935 	      else
3936 		sym_cnt = fil_ptr->symbols.objects_per_page;
3937 	      sym_ptr = sym_link->datum->sym;
3938 	      sym_end = sym_ptr + sym_cnt;
3939 	      for (; sym_ptr < sym_end; sym_ptr++)
3940 		{
3941 		  int local;
3942 		  symbolS *as_sym;
3943 		  forward_t *f;
3944 
3945 		  know (sym_ptr->file_ptr == fil_ptr);
3946 
3947 		  /* If there is no associated gas symbol, then this
3948 		     is a pure debugging symbol.  We have already
3949 		     added the name (if any) to fil_ptr->strings.
3950 		     Otherwise we must decide whether this is an
3951 		     external or a local symbol (actually, it may be
3952 		     both if the local provides additional debugging
3953 		     information for the external).  */
3954 		  local = 1;
3955 		  as_sym = sym_ptr->as_sym;
3956 		  if (as_sym != (symbolS *) NULL)
3957 		    {
3958 		      symint_t indx;
3959 
3960 		      /* The value of a block start symbol is the
3961 		         offset from the start of the procedure.  For
3962 		         other symbols we just use the gas value (but
3963 		         we must offset it by the vma of the section,
3964 		         just as BFD does, because BFD will not see
3965 		         this value).  */
3966 		      if (sym_ptr->ecoff_sym.asym.st == (int) st_Block
3967 			  && sym_ptr->ecoff_sym.asym.sc == (int) sc_Text)
3968 			{
3969 			  symbolS *begin_sym;
3970 
3971 			  know (sym_ptr->proc_ptr != (proc_t *) NULL);
3972 			  begin_sym = sym_ptr->proc_ptr->sym->as_sym;
3973 			  if (S_GET_SEGMENT (as_sym)
3974 			      != S_GET_SEGMENT (begin_sym))
3975 			    as_warn (_(".begin/.bend in different segments"));
3976 			  sym_ptr->ecoff_sym.asym.value =
3977 			    S_GET_VALUE (as_sym) - S_GET_VALUE (begin_sym);
3978 			}
3979 		      else
3980 			sym_ptr->ecoff_sym.asym.value =
3981 			  (S_GET_VALUE (as_sym)
3982 			   + bfd_get_section_vma (stdoutput,
3983 						  S_GET_SEGMENT (as_sym))
3984 			   + sym_ptr->addend);
3985 
3986 		      sym_ptr->ecoff_sym.weakext = S_IS_WEAK (as_sym);
3987 
3988 		      /* Set st_Proc to st_StaticProc for local
3989 			 functions.  */
3990 		      if (sym_ptr->ecoff_sym.asym.st == st_Proc
3991 			  && S_IS_DEFINED (as_sym)
3992 			  && ! S_IS_EXTERNAL (as_sym)
3993 			  && ! S_IS_WEAK (as_sym))
3994 			sym_ptr->ecoff_sym.asym.st = st_StaticProc;
3995 
3996 		      /* Get the type and storage class based on where
3997 		         the symbol actually wound up.  Traditionally,
3998 		         N_LBRAC and N_RBRAC are *not* relocated.  */
3999 		      indx = sym_ptr->ecoff_sym.asym.index;
4000 		      if (sym_ptr->ecoff_sym.asym.st == st_Nil
4001 			  && sym_ptr->ecoff_sym.asym.sc == sc_Nil
4002 			  && (! ECOFF_IS_STAB (&sym_ptr->ecoff_sym.asym)
4003 			      || ((ECOFF_UNMARK_STAB (indx) != N_LBRAC)
4004 				  && (ECOFF_UNMARK_STAB (indx) != N_RBRAC))))
4005 			{
4006 			  segT seg;
4007 			  const char *segname;
4008 			  st_t st;
4009 			  sc_t sc;
4010 
4011 			  seg = S_GET_SEGMENT (as_sym);
4012 			  segname = segment_name (seg);
4013 
4014 			  if (! ECOFF_IS_STAB (&sym_ptr->ecoff_sym.asym)
4015 			      && (S_IS_EXTERNAL (as_sym)
4016 				  || S_IS_WEAK (as_sym)
4017 				  || ! S_IS_DEFINED (as_sym)))
4018 			    {
4019 			      if ((symbol_get_bfdsym (as_sym)->flags
4020 				   & BSF_FUNCTION) != 0)
4021 				st = st_Proc;
4022 			      else
4023 				st = st_Global;
4024 			    }
4025 			  else if (seg == text_section)
4026 			    st = st_Label;
4027 			  else
4028 			    st = st_Static;
4029 
4030 			  if (! S_IS_DEFINED (as_sym))
4031 			    {
4032 			      valueT s;
4033 
4034 			      s = symbol_get_obj (as_sym)->ecoff_extern_size;
4035 			      if (s == 0
4036 				  || s > bfd_get_gp_size (stdoutput))
4037 				sc = sc_Undefined;
4038 			      else
4039 				{
4040 				  sc = sc_SUndefined;
4041 				  sym_ptr->ecoff_sym.asym.value = s;
4042 				}
4043 #ifdef S_SET_SIZE
4044 			      S_SET_SIZE (as_sym, s);
4045 #endif
4046 			    }
4047 			  else if (S_IS_COMMON (as_sym))
4048 			    {
4049 			      if (S_GET_VALUE (as_sym) > 0
4050 				  && (S_GET_VALUE (as_sym)
4051 				      <= bfd_get_gp_size (stdoutput)))
4052 				sc = sc_SCommon;
4053 			      else
4054 				sc = sc_Common;
4055 			    }
4056 			  else if (seg == text_section)
4057 			    sc = sc_Text;
4058 			  else if (seg == data_section)
4059 			    sc = sc_Data;
4060 			  else if (strcmp (segname, ".rdata") == 0
4061 				   || strcmp (segname, ".rodata") == 0)
4062 			    sc = sc_RData;
4063 			  else if (strcmp (segname, ".sdata") == 0)
4064 			    sc = sc_SData;
4065 			  else if (seg == bss_section)
4066 			    sc = sc_Bss;
4067 			  else if (strcmp (segname, ".sbss") == 0)
4068 			    sc = sc_SBss;
4069 			  else if (seg == &bfd_abs_section)
4070 			    sc = sc_Abs;
4071 			  else
4072 			    {
4073 			      /* This must be a user named section.
4074 			         This is not possible in ECOFF, but it
4075 			         is in ELF.  */
4076 			      sc = sc_Data;
4077 			    }
4078 
4079 			  sym_ptr->ecoff_sym.asym.st = (int) st;
4080 			  sym_ptr->ecoff_sym.asym.sc = (int) sc;
4081 			}
4082 
4083 		      /* This is just an external symbol if it is
4084 		         outside a procedure and it has a type.
4085 		         FIXME: g++ will generate symbols which have
4086 		         different names in the debugging information
4087 		         than the actual symbol.  Should we handle
4088 		         them here?  */
4089 		      if ((S_IS_EXTERNAL (as_sym)
4090 			   || S_IS_WEAK (as_sym)
4091 			   || ! S_IS_DEFINED (as_sym))
4092 			  && sym_ptr->proc_ptr == (proc_t *) NULL
4093 			  && sym_ptr->ecoff_sym.asym.st != (int) st_Nil
4094 			  && ! ECOFF_IS_STAB (&sym_ptr->ecoff_sym.asym))
4095 			local = 0;
4096 
4097 		      /* This is just an external symbol if it is a
4098 		         common symbol.  */
4099 		      if (S_IS_COMMON (as_sym))
4100 			local = 0;
4101 
4102 		      /* If an st_end symbol has an associated gas
4103 		         symbol, then it is a local label created for
4104 		         a .bend or .end directive.  Stabs line
4105 		         numbers will have \001 in the names.  */
4106 		      if (local
4107 			  && sym_ptr->ecoff_sym.asym.st != st_End
4108 			  && strchr (sym_ptr->name, '\001') == 0)
4109 			sym_ptr->ecoff_sym.asym.iss =
4110 			  add_string (&fil_ptr->strings,
4111 				      fil_ptr->str_hash,
4112 				      sym_ptr->name,
4113 				      (shash_t **) NULL);
4114 		    }
4115 
4116 		  /* We now know the index of this symbol; fill in
4117 		     locations that have been waiting for that
4118 		     information.  */
4119 		  if (sym_ptr->begin_ptr != (localsym_t *) NULL)
4120 		    {
4121 		      localsym_t *begin_ptr;
4122 		      st_t begin_type;
4123 
4124 		      know (local);
4125 		      begin_ptr = sym_ptr->begin_ptr;
4126 		      know (begin_ptr->sym_index != -1);
4127 		      sym_ptr->ecoff_sym.asym.index = begin_ptr->sym_index;
4128 		      if (sym_ptr->ecoff_sym.asym.sc != (int) sc_Info)
4129 			sym_ptr->ecoff_sym.asym.iss =
4130 			  begin_ptr->ecoff_sym.asym.iss;
4131 
4132 		      begin_type = begin_ptr->ecoff_sym.asym.st;
4133 		      if (begin_type == st_File
4134 			  || begin_type == st_Block)
4135 			{
4136 			  begin_ptr->ecoff_sym.asym.index =
4137 			    isym - ifilesym + 1;
4138 			  (*swap_sym_out) (stdoutput,
4139 					   &begin_ptr->ecoff_sym.asym,
4140 					   (*buf
4141 					    + offset
4142 					    + (begin_ptr->sym_index
4143 					       * external_sym_size)));
4144 			}
4145 		      else
4146 			{
4147 			  know (begin_ptr->index_ptr != (aux_t *) NULL);
4148 			  begin_ptr->index_ptr->data.isym =
4149 			    isym - ifilesym + 1;
4150 			}
4151 
4152 		      /* The value of the symbol marking the end of a
4153 		         procedure is the size of the procedure.  The
4154 		         value of the symbol marking the end of a
4155 		         block is the offset from the start of the
4156 		         procedure to the block.  */
4157 		      if (begin_type == st_Proc
4158 			  || begin_type == st_StaticProc)
4159 			{
4160 			  know (as_sym != (symbolS *) NULL);
4161 			  know (begin_ptr->as_sym != (symbolS *) NULL);
4162 			  if (S_GET_SEGMENT (as_sym)
4163 			      != S_GET_SEGMENT (begin_ptr->as_sym))
4164 			    as_warn (_(".begin/.bend in different segments"));
4165 			  sym_ptr->ecoff_sym.asym.value =
4166 			    (S_GET_VALUE (as_sym)
4167 			     - S_GET_VALUE (begin_ptr->as_sym));
4168 
4169 			  /* If the size is odd, this is probably a
4170 			     mips16 function; force it to be even.  */
4171 			  if ((sym_ptr->ecoff_sym.asym.value & 1) != 0)
4172 			    ++sym_ptr->ecoff_sym.asym.value;
4173 
4174 #ifdef S_SET_SIZE
4175 			  S_SET_SIZE (begin_ptr->as_sym,
4176 				      sym_ptr->ecoff_sym.asym.value);
4177 #endif
4178 			}
4179 		      else if (begin_type == st_Block
4180 			       && sym_ptr->ecoff_sym.asym.sc != (int) sc_Info)
4181 			{
4182 			  symbolS *begin_sym;
4183 
4184 			  know (as_sym != (symbolS *) NULL);
4185 			  know (sym_ptr->proc_ptr != (proc_t *) NULL);
4186 			  begin_sym = sym_ptr->proc_ptr->sym->as_sym;
4187 			  if (S_GET_SEGMENT (as_sym)
4188 			      != S_GET_SEGMENT (begin_sym))
4189 			    as_warn (_(".begin/.bend in different segments"));
4190 			  sym_ptr->ecoff_sym.asym.value =
4191 			    S_GET_VALUE (as_sym) - S_GET_VALUE (begin_sym);
4192 			}
4193 		    }
4194 
4195 		  for (f = sym_ptr->forward_ref;
4196 		       f != (forward_t *) NULL;
4197 		       f = f->next)
4198 		    {
4199 		      know (local);
4200 		      f->ifd_ptr->data.isym = fil_ptr->file_index;
4201 		      f->index_ptr->data.rndx.index = isym - ifilesym;
4202 		    }
4203 
4204 		  if (local)
4205 		    {
4206 		      if ((bfd_size_type)(*bufend - sym_out) < external_sym_size)
4207 			sym_out = ecoff_add_bytes (buf, bufend,
4208 						   sym_out,
4209 						   external_sym_size);
4210 		      (*swap_sym_out) (stdoutput, &sym_ptr->ecoff_sym.asym,
4211 				       sym_out);
4212 		      sym_out += external_sym_size;
4213 
4214 		      sym_ptr->sym_index = isym;
4215 
4216 		      if (sym_ptr->proc_ptr != (proc_t *) NULL
4217 			  && sym_ptr->proc_ptr->sym == sym_ptr)
4218 			sym_ptr->proc_ptr->pdr.isym = isym - ifilesym;
4219 
4220 		      ++isym;
4221 		    }
4222 
4223 		  /* Record the local symbol index and file number in
4224 		     case this is an external symbol.  Note that this
4225 		     destroys the asym.index field.  */
4226 		  if (as_sym != (symbolS *) NULL
4227 		      && symbol_get_obj (as_sym)->ecoff_symbol == sym_ptr)
4228 		    {
4229 		      if ((sym_ptr->ecoff_sym.asym.st == st_Proc
4230 			   || sym_ptr->ecoff_sym.asym.st == st_StaticProc)
4231 			  && local)
4232 			sym_ptr->ecoff_sym.asym.index = isym - ifilesym - 1;
4233 		      sym_ptr->ecoff_sym.ifd = fil_ptr->file_index;
4234 
4235 		      /* Don't try to merge an FDR which has an
4236 		         external symbol attached to it.  */
4237 		      if (S_IS_EXTERNAL (as_sym) || S_IS_WEAK (as_sym))
4238 			fil_ptr->fdr.fMerge = 0;
4239 		    }
4240 		}
4241 	    }
4242 	  fil_ptr->fdr.csym = isym - fil_ptr->fdr.isymBase;
4243 	}
4244     }
4245 
4246   return offset + isym * external_sym_size;
4247 }
4248 
4249 /* Swap out the procedure information.  */
4250 
4251 static unsigned long
ecoff_build_procs(const struct ecoff_debug_swap * backend,char ** buf,char ** bufend,unsigned long offset)4252 ecoff_build_procs (const struct ecoff_debug_swap *backend,
4253 		   char **buf,
4254 		   char **bufend,
4255 		   unsigned long offset)
4256 {
4257   const bfd_size_type external_pdr_size = backend->external_pdr_size;
4258   void (* const swap_pdr_out) (bfd *, const PDR *, PTR)
4259     = backend->swap_pdr_out;
4260   char *pdr_out;
4261   long iproc;
4262   vlinks_t *file_link;
4263 
4264   pdr_out = *buf + offset;
4265 
4266   iproc = 0;
4267 
4268   /* The procedures are stored by file.  */
4269   for (file_link = file_desc.first;
4270        file_link != (vlinks_t *) NULL;
4271        file_link = file_link->next)
4272     {
4273       int fil_cnt;
4274       efdr_t *fil_ptr;
4275       efdr_t *fil_end;
4276 
4277       if (file_link->next == (vlinks_t *) NULL)
4278 	fil_cnt = file_desc.objects_last_page;
4279       else
4280 	fil_cnt = file_desc.objects_per_page;
4281       fil_ptr = file_link->datum->file;
4282       fil_end = fil_ptr + fil_cnt;
4283       for (; fil_ptr < fil_end; fil_ptr++)
4284 	{
4285 	  vlinks_t *proc_link;
4286 	  int first;
4287 
4288 	  fil_ptr->fdr.ipdFirst = iproc;
4289 	  first = 1;
4290 	  for (proc_link = fil_ptr->procs.first;
4291 	       proc_link != (vlinks_t *) NULL;
4292 	       proc_link = proc_link->next)
4293 	    {
4294 	      int prc_cnt;
4295 	      proc_t *proc_ptr;
4296 	      proc_t *proc_end;
4297 
4298 	      if (proc_link->next == (vlinks_t *) NULL)
4299 		prc_cnt = fil_ptr->procs.objects_last_page;
4300 	      else
4301 		prc_cnt = fil_ptr->procs.objects_per_page;
4302 	      proc_ptr = proc_link->datum->proc;
4303 	      proc_end = proc_ptr + prc_cnt;
4304 	      for (; proc_ptr < proc_end; proc_ptr++)
4305 		{
4306 		  symbolS *adr_sym;
4307 		  unsigned long adr;
4308 
4309 		  adr_sym = proc_ptr->sym->as_sym;
4310 		  adr = (S_GET_VALUE (adr_sym)
4311 			 + bfd_get_section_vma (stdoutput,
4312 						S_GET_SEGMENT (adr_sym)));
4313 		  if (first)
4314 		    {
4315 		      /* This code used to force the adr of the very
4316 		         first fdr to be 0.  However, the native tools
4317 		         don't do that, and I can't remember why it
4318 		         used to work that way, so I took it out.  */
4319 		      fil_ptr->fdr.adr = adr;
4320 		      first = 0;
4321 		    }
4322 		  proc_ptr->pdr.adr = adr - fil_ptr->fdr.adr;
4323 		  if ((bfd_size_type)(*bufend - pdr_out) < external_pdr_size)
4324 		    pdr_out = ecoff_add_bytes (buf, bufend,
4325 					       pdr_out,
4326 					       external_pdr_size);
4327 		  (*swap_pdr_out) (stdoutput, &proc_ptr->pdr, pdr_out);
4328 		  pdr_out += external_pdr_size;
4329 		  ++iproc;
4330 		}
4331 	    }
4332 	  fil_ptr->fdr.cpd = iproc - fil_ptr->fdr.ipdFirst;
4333 	}
4334     }
4335 
4336   return offset + iproc * external_pdr_size;
4337 }
4338 
4339 /* Swap out the aux information.  */
4340 
4341 static unsigned long
ecoff_build_aux(const struct ecoff_debug_swap * backend,char ** buf,char ** bufend,unsigned long offset)4342 ecoff_build_aux (const struct ecoff_debug_swap *backend,
4343 		 char **buf,
4344 		 char **bufend,
4345 		 unsigned long offset)
4346 {
4347   int bigendian;
4348   union aux_ext *aux_out;
4349   long iaux;
4350   vlinks_t *file_link;
4351 
4352   bigendian = bfd_big_endian (stdoutput);
4353 
4354   aux_out = (union aux_ext *) (*buf + offset);
4355 
4356   iaux = 0;
4357 
4358   /* The aux entries are stored by file.  */
4359   for (file_link = file_desc.first;
4360        file_link != (vlinks_t *) NULL;
4361        file_link = file_link->next)
4362     {
4363       int fil_cnt;
4364       efdr_t *fil_ptr;
4365       efdr_t *fil_end;
4366 
4367       if (file_link->next == (vlinks_t *) NULL)
4368 	fil_cnt = file_desc.objects_last_page;
4369       else
4370 	fil_cnt = file_desc.objects_per_page;
4371       fil_ptr = file_link->datum->file;
4372       fil_end = fil_ptr + fil_cnt;
4373       for (; fil_ptr < fil_end; fil_ptr++)
4374 	{
4375 	  vlinks_t *aux_link;
4376 
4377 	  fil_ptr->fdr.fBigendian = bigendian;
4378 	  fil_ptr->fdr.iauxBase = iaux;
4379 	  for (aux_link = fil_ptr->aux_syms.first;
4380 	       aux_link != (vlinks_t *) NULL;
4381 	       aux_link = aux_link->next)
4382 	    {
4383 	      int aux_cnt;
4384 	      aux_t *aux_ptr;
4385 	      aux_t *aux_end;
4386 
4387 	      if (aux_link->next == (vlinks_t *) NULL)
4388 		aux_cnt = fil_ptr->aux_syms.objects_last_page;
4389 	      else
4390 		aux_cnt = fil_ptr->aux_syms.objects_per_page;
4391 	      aux_ptr = aux_link->datum->aux;
4392 	      aux_end = aux_ptr + aux_cnt;
4393 	      for (; aux_ptr < aux_end; aux_ptr++)
4394 		{
4395 		  if ((unsigned long) (*bufend - (char *) aux_out)
4396 		      < sizeof (union aux_ext))
4397 		    aux_out = ((union aux_ext *)
4398 			       ecoff_add_bytes (buf, bufend,
4399 						(char *) aux_out,
4400 						sizeof (union aux_ext)));
4401 		  switch (aux_ptr->type)
4402 		    {
4403 		    case aux_tir:
4404 		      (*backend->swap_tir_out) (bigendian,
4405 						&aux_ptr->data.ti,
4406 						&aux_out->a_ti);
4407 		      break;
4408 		    case aux_rndx:
4409 		      (*backend->swap_rndx_out) (bigendian,
4410 						 &aux_ptr->data.rndx,
4411 						 &aux_out->a_rndx);
4412 		      break;
4413 		    case aux_dnLow:
4414 		      AUX_PUT_DNLOW (bigendian, aux_ptr->data.dnLow,
4415 				     aux_out);
4416 		      break;
4417 		    case aux_dnHigh:
4418 		      AUX_PUT_DNHIGH (bigendian, aux_ptr->data.dnHigh,
4419 				      aux_out);
4420 		      break;
4421 		    case aux_isym:
4422 		      AUX_PUT_ISYM (bigendian, aux_ptr->data.isym,
4423 				    aux_out);
4424 		      break;
4425 		    case aux_iss:
4426 		      AUX_PUT_ISS (bigendian, aux_ptr->data.iss,
4427 				   aux_out);
4428 		      break;
4429 		    case aux_width:
4430 		      AUX_PUT_WIDTH (bigendian, aux_ptr->data.width,
4431 				     aux_out);
4432 		      break;
4433 		    case aux_count:
4434 		      AUX_PUT_COUNT (bigendian, aux_ptr->data.count,
4435 				     aux_out);
4436 		      break;
4437 		    }
4438 
4439 		  ++aux_out;
4440 		  ++iaux;
4441 		}
4442 	    }
4443 	  fil_ptr->fdr.caux = iaux - fil_ptr->fdr.iauxBase;
4444 	}
4445     }
4446 
4447   return ecoff_padding_adjust (backend, buf, bufend,
4448 			       offset + iaux * sizeof (union aux_ext),
4449 			       (char **) NULL);
4450 }
4451 
4452 /* Copy out the strings from a varray_t.  This returns the number of
4453    bytes copied, rather than the new offset.  */
4454 
4455 static unsigned long
ecoff_build_strings(char ** buf,char ** bufend,unsigned long offset,varray_t * vp)4456 ecoff_build_strings (char **buf,
4457 		     char **bufend,
4458 		     unsigned long offset,
4459 		     varray_t *vp)
4460 {
4461   unsigned long istr;
4462   char *str_out;
4463   vlinks_t *str_link;
4464 
4465   str_out = *buf + offset;
4466 
4467   istr = 0;
4468 
4469   for (str_link = vp->first;
4470        str_link != (vlinks_t *) NULL;
4471        str_link = str_link->next)
4472     {
4473       unsigned long str_cnt;
4474 
4475       if (str_link->next == (vlinks_t *) NULL)
4476 	str_cnt = vp->objects_last_page;
4477       else
4478 	str_cnt = vp->objects_per_page;
4479 
4480       if ((unsigned long)(*bufend - str_out) < str_cnt)
4481 	str_out = ecoff_add_bytes (buf, bufend, str_out, str_cnt);
4482 
4483       memcpy (str_out, str_link->datum->byte, str_cnt);
4484       str_out += str_cnt;
4485       istr += str_cnt;
4486     }
4487 
4488   return istr;
4489 }
4490 
4491 /* Dump out the local strings.  */
4492 
4493 static unsigned long
ecoff_build_ss(const struct ecoff_debug_swap * backend,char ** buf,char ** bufend,unsigned long offset)4494 ecoff_build_ss (const struct ecoff_debug_swap *backend,
4495 		char **buf,
4496 		char **bufend,
4497 		unsigned long offset)
4498 {
4499   long iss;
4500   vlinks_t *file_link;
4501 
4502   iss = 0;
4503 
4504   for (file_link = file_desc.first;
4505        file_link != (vlinks_t *) NULL;
4506        file_link = file_link->next)
4507     {
4508       int fil_cnt;
4509       efdr_t *fil_ptr;
4510       efdr_t *fil_end;
4511 
4512       if (file_link->next == (vlinks_t *) NULL)
4513 	fil_cnt = file_desc.objects_last_page;
4514       else
4515 	fil_cnt = file_desc.objects_per_page;
4516       fil_ptr = file_link->datum->file;
4517       fil_end = fil_ptr + fil_cnt;
4518       for (; fil_ptr < fil_end; fil_ptr++)
4519 	{
4520 	  long ss_cnt;
4521 
4522 	  fil_ptr->fdr.issBase = iss;
4523 	  ss_cnt = ecoff_build_strings (buf, bufend, offset + iss,
4524 					&fil_ptr->strings);
4525 	  fil_ptr->fdr.cbSs = ss_cnt;
4526 	  iss += ss_cnt;
4527 	}
4528     }
4529 
4530   return ecoff_padding_adjust (backend, buf, bufend, offset + iss,
4531 			       (char **) NULL);
4532 }
4533 
4534 /* Swap out the file descriptors.  */
4535 
4536 static unsigned long
ecoff_build_fdr(const struct ecoff_debug_swap * backend,char ** buf,char ** bufend,unsigned long offset)4537 ecoff_build_fdr (const struct ecoff_debug_swap *backend,
4538 		 char **buf,
4539 		 char **bufend,
4540 		 unsigned long offset)
4541 {
4542   const bfd_size_type external_fdr_size = backend->external_fdr_size;
4543   void (* const swap_fdr_out) (bfd *, const FDR *, PTR)
4544     = backend->swap_fdr_out;
4545   long ifile;
4546   char *fdr_out;
4547   vlinks_t *file_link;
4548 
4549   ifile = 0;
4550 
4551   fdr_out = *buf + offset;
4552 
4553   for (file_link = file_desc.first;
4554        file_link != (vlinks_t *) NULL;
4555        file_link = file_link->next)
4556     {
4557       int fil_cnt;
4558       efdr_t *fil_ptr;
4559       efdr_t *fil_end;
4560 
4561       if (file_link->next == (vlinks_t *) NULL)
4562 	fil_cnt = file_desc.objects_last_page;
4563       else
4564 	fil_cnt = file_desc.objects_per_page;
4565       fil_ptr = file_link->datum->file;
4566       fil_end = fil_ptr + fil_cnt;
4567       for (; fil_ptr < fil_end; fil_ptr++)
4568 	{
4569 	  if ((bfd_size_type)(*bufend - fdr_out) < external_fdr_size)
4570 	    fdr_out = ecoff_add_bytes (buf, bufend, fdr_out,
4571 				       external_fdr_size);
4572 	  (*swap_fdr_out) (stdoutput, &fil_ptr->fdr, fdr_out);
4573 	  fdr_out += external_fdr_size;
4574 	  ++ifile;
4575 	}
4576     }
4577 
4578   return offset + ifile * external_fdr_size;
4579 }
4580 
4581 /* Set up the external symbols.  These are supposed to be handled by
4582    the backend.  This routine just gets the right information and
4583    calls a backend function to deal with it.  */
4584 
4585 static void
ecoff_setup_ext(void)4586 ecoff_setup_ext (void)
4587 {
4588   register symbolS *sym;
4589 
4590   for (sym = symbol_rootP; sym != (symbolS *) NULL; sym = symbol_next (sym))
4591     {
4592       if (symbol_get_obj (sym)->ecoff_symbol == NULL)
4593 	continue;
4594 
4595       /* If this is a local symbol, then force the fields to zero.  */
4596       if (! S_IS_EXTERNAL (sym)
4597 	  && ! S_IS_WEAK (sym)
4598 	  && S_IS_DEFINED (sym))
4599 	{
4600 	  struct localsym *lsym;
4601 
4602 	  lsym = symbol_get_obj (sym)->ecoff_symbol;
4603 	  lsym->ecoff_sym.asym.value = 0;
4604 	  lsym->ecoff_sym.asym.st = (int) st_Nil;
4605 	  lsym->ecoff_sym.asym.sc = (int) sc_Nil;
4606 	  lsym->ecoff_sym.asym.index = indexNil;
4607 	}
4608 
4609       obj_ecoff_set_ext (sym, &symbol_get_obj (sym)->ecoff_symbol->ecoff_sym);
4610     }
4611 }
4612 
4613 /* Build the ECOFF debugging information.  */
4614 
4615 unsigned long
ecoff_build_debug(HDRR * hdr,char ** bufp,const struct ecoff_debug_swap * backend)4616 ecoff_build_debug (HDRR *hdr,
4617 		   char **bufp,
4618 		   const struct ecoff_debug_swap *backend)
4619 {
4620   const bfd_size_type external_pdr_size = backend->external_pdr_size;
4621   tag_t *ptag;
4622   tag_t *ptag_next;
4623   efdr_t *fil_ptr;
4624   int end_warning;
4625   efdr_t *hold_file_ptr;
4626   proc_t *hold_proc_ptr;
4627   symbolS *sym;
4628   char *buf;
4629   char *bufend;
4630   unsigned long offset;
4631 
4632   /* Make sure we have a file.  */
4633   if (first_file == (efdr_t *) NULL)
4634     add_file ((const char *) NULL, 0, 1);
4635 
4636   /* Handle any top level tags.  */
4637   for (ptag = top_tag_head->first_tag;
4638        ptag != (tag_t *) NULL;
4639        ptag = ptag_next)
4640     {
4641       if (ptag->forward_ref != (forward_t *) NULL)
4642 	add_unknown_tag (ptag);
4643 
4644       ptag_next = ptag->same_block;
4645       ptag->hash_ptr->tag_ptr = ptag->same_name;
4646       free_tag (ptag);
4647     }
4648 
4649   free_thead (top_tag_head);
4650 
4651   /* Look through the symbols.  Add debugging information for each
4652      symbol that has not already received it.  */
4653   hold_file_ptr = cur_file_ptr;
4654   hold_proc_ptr = cur_proc_ptr;
4655   cur_proc_ptr = (proc_t *) NULL;
4656   for (sym = symbol_rootP; sym != (symbolS *) NULL; sym = symbol_next (sym))
4657     {
4658       if (symbol_get_obj (sym)->ecoff_symbol != NULL
4659 	  || symbol_get_obj (sym)->ecoff_file == (efdr_t *) NULL
4660 	  || (symbol_get_bfdsym (sym)->flags & BSF_SECTION_SYM) != 0)
4661 	continue;
4662 
4663       cur_file_ptr = symbol_get_obj (sym)->ecoff_file;
4664       add_ecoff_symbol ((const char *) NULL, st_Nil, sc_Nil, sym,
4665 			(bfd_vma) 0, S_GET_VALUE (sym), indexNil);
4666     }
4667   cur_proc_ptr = hold_proc_ptr;
4668   cur_file_ptr = hold_file_ptr;
4669 
4670   /* Output an ending symbol for all the files.  We have to do this
4671      here for the last file, so we may as well do it for all of the
4672      files.  */
4673   end_warning = 0;
4674   for (fil_ptr = first_file;
4675        fil_ptr != (efdr_t *) NULL;
4676        fil_ptr = fil_ptr->next_file)
4677     {
4678       cur_file_ptr = fil_ptr;
4679       while (cur_file_ptr->cur_scope != (scope_t *) NULL
4680 	     && cur_file_ptr->cur_scope->prev != (scope_t *) NULL)
4681 	{
4682 	  cur_file_ptr->cur_scope = cur_file_ptr->cur_scope->prev;
4683 	  if (! end_warning && ! cur_file_ptr->fake)
4684 	    {
4685 	      as_warn (_("missing .end or .bend at end of file"));
4686 	      end_warning = 1;
4687 	    }
4688 	}
4689       if (cur_file_ptr->cur_scope != (scope_t *) NULL)
4690 	(void) add_ecoff_symbol ((const char *) NULL,
4691 				 st_End, sc_Text,
4692 				 (symbolS *) NULL,
4693 				 (bfd_vma) 0,
4694 				 (symint_t) 0,
4695 				 (symint_t) 0);
4696     }
4697 
4698   /* Build the symbolic information.  */
4699   offset = 0;
4700   buf = xmalloc (PAGE_SIZE);
4701   bufend = buf + PAGE_SIZE;
4702 
4703   /* Build the line number information.  */
4704   hdr->cbLineOffset = offset;
4705   offset = ecoff_build_lineno (backend, &buf, &bufend, offset,
4706 			       &hdr->ilineMax);
4707   hdr->cbLine = offset - hdr->cbLineOffset;
4708 
4709   /* We don't use dense numbers at all.  */
4710   hdr->idnMax = 0;
4711   hdr->cbDnOffset = 0;
4712 
4713   /* We can't build the PDR table until we have built the symbols,
4714      because a PDR contains a symbol index.  However, we set aside
4715      space at this point.  */
4716   hdr->ipdMax = proc_cnt;
4717   hdr->cbPdOffset = offset;
4718   if ((bfd_size_type)(bufend - (buf + offset)) < proc_cnt * external_pdr_size)
4719     (void) ecoff_add_bytes (&buf, &bufend, buf + offset,
4720 			    proc_cnt * external_pdr_size);
4721   offset += proc_cnt * external_pdr_size;
4722 
4723   /* Build the local symbols.  */
4724   hdr->cbSymOffset = offset;
4725   offset = ecoff_build_symbols (backend, &buf, &bufend, offset);
4726   hdr->isymMax = (offset - hdr->cbSymOffset) / backend->external_sym_size;
4727 
4728   /* Building the symbols initializes the symbol index in the PDR's.
4729      Now we can swap out the PDR's.  */
4730   (void) ecoff_build_procs (backend, &buf, &bufend, hdr->cbPdOffset);
4731 
4732   /* We don't use optimization symbols.  */
4733   hdr->ioptMax = 0;
4734   hdr->cbOptOffset = 0;
4735 
4736   /* Swap out the auxiliary type information.  */
4737   hdr->cbAuxOffset = offset;
4738   offset = ecoff_build_aux (backend, &buf, &bufend, offset);
4739   hdr->iauxMax = (offset - hdr->cbAuxOffset) / sizeof (union aux_ext);
4740 
4741   /* Copy out the local strings.  */
4742   hdr->cbSsOffset = offset;
4743   offset = ecoff_build_ss (backend, &buf, &bufend, offset);
4744   hdr->issMax = offset - hdr->cbSsOffset;
4745 
4746   /* We don't use relative file descriptors.  */
4747   hdr->crfd = 0;
4748   hdr->cbRfdOffset = 0;
4749 
4750   /* Swap out the file descriptors.  */
4751   hdr->cbFdOffset = offset;
4752   offset = ecoff_build_fdr (backend, &buf, &bufend, offset);
4753   hdr->ifdMax = (offset - hdr->cbFdOffset) / backend->external_fdr_size;
4754 
4755   /* Set up the external symbols, which are handled by the BFD back
4756      end.  */
4757   hdr->issExtMax = 0;
4758   hdr->cbSsExtOffset = 0;
4759   hdr->iextMax = 0;
4760   hdr->cbExtOffset = 0;
4761   ecoff_setup_ext ();
4762 
4763   know ((offset & (backend->debug_align - 1)) == 0);
4764 
4765   /* FIXME: This value should be determined from the .verstamp directive,
4766      with reasonable defaults in config files.  */
4767 #ifdef TC_ALPHA
4768   hdr->vstamp = 0x030b;
4769 #else
4770   hdr->vstamp = 0x020b;
4771 #endif
4772 
4773   *bufp = buf;
4774   return offset;
4775 }
4776 
4777 /* Allocate a cluster of pages.  */
4778 
4779 #ifndef MALLOC_CHECK
4780 
4781 static page_type *
allocate_cluster(unsigned long npages)4782 allocate_cluster (unsigned long npages)
4783 {
4784   register page_type *value = (page_type *) xmalloc (npages * PAGE_USIZE);
4785 
4786 #ifdef ECOFF_DEBUG
4787   if (debug > 3)
4788     fprintf (stderr, "\talloc\tnpages = %d, value = 0x%.8x\n", npages, value);
4789 #endif
4790 
4791   memset (value, 0, npages * PAGE_USIZE);
4792 
4793   return value;
4794 }
4795 
4796 static page_type *cluster_ptr = NULL;
4797 static unsigned long pages_left = 0;
4798 
4799 #endif /* MALLOC_CHECK */
4800 
4801 /* Allocate one page (which is initialized to 0).  */
4802 
4803 static page_type *
allocate_page(void)4804 allocate_page (void)
4805 {
4806 #ifndef MALLOC_CHECK
4807 
4808   if (pages_left == 0)
4809     {
4810       pages_left = MAX_CLUSTER_PAGES;
4811       cluster_ptr = allocate_cluster (pages_left);
4812     }
4813 
4814   pages_left--;
4815   return cluster_ptr++;
4816 
4817 #else /* MALLOC_CHECK */
4818 
4819   page_type *ptr;
4820 
4821   ptr = xmalloc (PAGE_USIZE);
4822   memset (ptr, 0, PAGE_USIZE);
4823   return ptr;
4824 
4825 #endif /* MALLOC_CHECK */
4826 }
4827 
4828 /* Allocate scoping information.  */
4829 
4830 static scope_t *
allocate_scope(void)4831 allocate_scope (void)
4832 {
4833   register scope_t *ptr;
4834   static scope_t initial_scope;
4835 
4836 #ifndef MALLOC_CHECK
4837 
4838   ptr = alloc_counts[(int) alloc_type_scope].free_list.f_scope;
4839   if (ptr != (scope_t *) NULL)
4840     alloc_counts[(int) alloc_type_scope].free_list.f_scope = ptr->free;
4841   else
4842     {
4843       register int unallocated	= alloc_counts[(int) alloc_type_scope].unallocated;
4844       register page_type *cur_page	= alloc_counts[(int) alloc_type_scope].cur_page;
4845 
4846       if (unallocated == 0)
4847 	{
4848 	  unallocated = PAGE_SIZE / sizeof (scope_t);
4849 	  alloc_counts[(int) alloc_type_scope].cur_page = cur_page = allocate_page ();
4850 	  alloc_counts[(int) alloc_type_scope].total_pages++;
4851 	}
4852 
4853       ptr = &cur_page->scope[--unallocated];
4854       alloc_counts[(int) alloc_type_scope].unallocated = unallocated;
4855     }
4856 
4857 #else
4858 
4859   ptr = (scope_t *) xmalloc (sizeof (scope_t));
4860 
4861 #endif
4862 
4863   alloc_counts[(int) alloc_type_scope].total_alloc++;
4864   *ptr = initial_scope;
4865   return ptr;
4866 }
4867 
4868 /* Free scoping information.  */
4869 
4870 static void
free_scope(scope_t * ptr)4871 free_scope (scope_t *ptr)
4872 {
4873   alloc_counts[(int) alloc_type_scope].total_free++;
4874 
4875 #ifndef MALLOC_CHECK
4876   ptr->free = alloc_counts[(int) alloc_type_scope].free_list.f_scope;
4877   alloc_counts[(int) alloc_type_scope].free_list.f_scope = ptr;
4878 #else
4879   free ((PTR) ptr);
4880 #endif
4881 }
4882 
4883 /* Allocate links for pages in a virtual array.  */
4884 
4885 static vlinks_t *
allocate_vlinks(void)4886 allocate_vlinks (void)
4887 {
4888   register vlinks_t *ptr;
4889   static vlinks_t initial_vlinks;
4890 
4891 #ifndef MALLOC_CHECK
4892 
4893   register int unallocated = alloc_counts[(int) alloc_type_vlinks].unallocated;
4894   register page_type *cur_page = alloc_counts[(int) alloc_type_vlinks].cur_page;
4895 
4896   if (unallocated == 0)
4897     {
4898       unallocated = PAGE_SIZE / sizeof (vlinks_t);
4899       alloc_counts[(int) alloc_type_vlinks].cur_page = cur_page = allocate_page ();
4900       alloc_counts[(int) alloc_type_vlinks].total_pages++;
4901     }
4902 
4903   ptr = &cur_page->vlinks[--unallocated];
4904   alloc_counts[(int) alloc_type_vlinks].unallocated = unallocated;
4905 
4906 #else
4907 
4908   ptr = (vlinks_t *) xmalloc (sizeof (vlinks_t));
4909 
4910 #endif
4911 
4912   alloc_counts[(int) alloc_type_vlinks].total_alloc++;
4913   *ptr = initial_vlinks;
4914   return ptr;
4915 }
4916 
4917 /* Allocate string hash buckets.  */
4918 
4919 static shash_t *
allocate_shash(void)4920 allocate_shash (void)
4921 {
4922   register shash_t *ptr;
4923   static shash_t initial_shash;
4924 
4925 #ifndef MALLOC_CHECK
4926 
4927   register int unallocated = alloc_counts[(int) alloc_type_shash].unallocated;
4928   register page_type *cur_page = alloc_counts[(int) alloc_type_shash].cur_page;
4929 
4930   if (unallocated == 0)
4931     {
4932       unallocated = PAGE_SIZE / sizeof (shash_t);
4933       alloc_counts[(int) alloc_type_shash].cur_page = cur_page = allocate_page ();
4934       alloc_counts[(int) alloc_type_shash].total_pages++;
4935     }
4936 
4937   ptr = &cur_page->shash[--unallocated];
4938   alloc_counts[(int) alloc_type_shash].unallocated = unallocated;
4939 
4940 #else
4941 
4942   ptr = (shash_t *) xmalloc (sizeof (shash_t));
4943 
4944 #endif
4945 
4946   alloc_counts[(int) alloc_type_shash].total_alloc++;
4947   *ptr = initial_shash;
4948   return ptr;
4949 }
4950 
4951 /* Allocate type hash buckets.  */
4952 
4953 static thash_t *
allocate_thash(void)4954 allocate_thash (void)
4955 {
4956   register thash_t *ptr;
4957   static thash_t initial_thash;
4958 
4959 #ifndef MALLOC_CHECK
4960 
4961   register int unallocated = alloc_counts[(int) alloc_type_thash].unallocated;
4962   register page_type *cur_page = alloc_counts[(int) alloc_type_thash].cur_page;
4963 
4964   if (unallocated == 0)
4965     {
4966       unallocated = PAGE_SIZE / sizeof (thash_t);
4967       alloc_counts[(int) alloc_type_thash].cur_page = cur_page = allocate_page ();
4968       alloc_counts[(int) alloc_type_thash].total_pages++;
4969     }
4970 
4971   ptr = &cur_page->thash[--unallocated];
4972   alloc_counts[(int) alloc_type_thash].unallocated = unallocated;
4973 
4974 #else
4975 
4976   ptr = (thash_t *) xmalloc (sizeof (thash_t));
4977 
4978 #endif
4979 
4980   alloc_counts[(int) alloc_type_thash].total_alloc++;
4981   *ptr = initial_thash;
4982   return ptr;
4983 }
4984 
4985 /* Allocate structure, union, or enum tag information.  */
4986 
4987 static tag_t *
allocate_tag(void)4988 allocate_tag (void)
4989 {
4990   register tag_t *ptr;
4991   static tag_t initial_tag;
4992 
4993 #ifndef MALLOC_CHECK
4994 
4995   ptr = alloc_counts[(int) alloc_type_tag].free_list.f_tag;
4996   if (ptr != (tag_t *) NULL)
4997     alloc_counts[(int) alloc_type_tag].free_list.f_tag = ptr->free;
4998   else
4999     {
5000       register int unallocated = alloc_counts[(int) alloc_type_tag].unallocated;
5001       register page_type *cur_page = alloc_counts[(int) alloc_type_tag].cur_page;
5002 
5003       if (unallocated == 0)
5004 	{
5005 	  unallocated = PAGE_SIZE / sizeof (tag_t);
5006 	  alloc_counts[(int) alloc_type_tag].cur_page = cur_page = allocate_page ();
5007 	  alloc_counts[(int) alloc_type_tag].total_pages++;
5008 	}
5009 
5010       ptr = &cur_page->tag[--unallocated];
5011       alloc_counts[(int) alloc_type_tag].unallocated = unallocated;
5012     }
5013 
5014 #else
5015 
5016   ptr = (tag_t *) xmalloc (sizeof (tag_t));
5017 
5018 #endif
5019 
5020   alloc_counts[(int) alloc_type_tag].total_alloc++;
5021   *ptr = initial_tag;
5022   return ptr;
5023 }
5024 
5025 /* Free scoping information.  */
5026 
5027 static void
free_tag(tag_t * ptr)5028 free_tag (tag_t *ptr)
5029 {
5030   alloc_counts[(int) alloc_type_tag].total_free++;
5031 
5032 #ifndef MALLOC_CHECK
5033   ptr->free = alloc_counts[(int) alloc_type_tag].free_list.f_tag;
5034   alloc_counts[(int) alloc_type_tag].free_list.f_tag = ptr;
5035 #else
5036   free ((PTR_T) ptr);
5037 #endif
5038 }
5039 
5040 /* Allocate forward reference to a yet unknown tag.  */
5041 
5042 static forward_t *
allocate_forward(void)5043 allocate_forward (void)
5044 {
5045   register forward_t *ptr;
5046   static forward_t initial_forward;
5047 
5048 #ifndef MALLOC_CHECK
5049 
5050   register int unallocated = alloc_counts[(int) alloc_type_forward].unallocated;
5051   register page_type *cur_page = alloc_counts[(int) alloc_type_forward].cur_page;
5052 
5053   if (unallocated == 0)
5054     {
5055       unallocated = PAGE_SIZE / sizeof (forward_t);
5056       alloc_counts[(int) alloc_type_forward].cur_page = cur_page = allocate_page ();
5057       alloc_counts[(int) alloc_type_forward].total_pages++;
5058     }
5059 
5060   ptr = &cur_page->forward[--unallocated];
5061   alloc_counts[(int) alloc_type_forward].unallocated = unallocated;
5062 
5063 #else
5064 
5065   ptr = (forward_t *) xmalloc (sizeof (forward_t));
5066 
5067 #endif
5068 
5069   alloc_counts[(int) alloc_type_forward].total_alloc++;
5070   *ptr = initial_forward;
5071   return ptr;
5072 }
5073 
5074 /* Allocate head of type hash list.  */
5075 
5076 static thead_t *
allocate_thead(void)5077 allocate_thead (void)
5078 {
5079   register thead_t *ptr;
5080   static thead_t initial_thead;
5081 
5082 #ifndef MALLOC_CHECK
5083 
5084   ptr = alloc_counts[(int) alloc_type_thead].free_list.f_thead;
5085   if (ptr != (thead_t *) NULL)
5086     alloc_counts[(int) alloc_type_thead].free_list.f_thead = ptr->free;
5087   else
5088     {
5089       register int unallocated = alloc_counts[(int) alloc_type_thead].unallocated;
5090       register page_type *cur_page = alloc_counts[(int) alloc_type_thead].cur_page;
5091 
5092       if (unallocated == 0)
5093 	{
5094 	  unallocated = PAGE_SIZE / sizeof (thead_t);
5095 	  alloc_counts[(int) alloc_type_thead].cur_page = cur_page = allocate_page ();
5096 	  alloc_counts[(int) alloc_type_thead].total_pages++;
5097 	}
5098 
5099       ptr = &cur_page->thead[--unallocated];
5100       alloc_counts[(int) alloc_type_thead].unallocated = unallocated;
5101     }
5102 
5103 #else
5104 
5105   ptr = (thead_t *) xmalloc (sizeof (thead_t));
5106 
5107 #endif
5108 
5109   alloc_counts[(int) alloc_type_thead].total_alloc++;
5110   *ptr = initial_thead;
5111   return ptr;
5112 }
5113 
5114 /* Free scoping information.  */
5115 
5116 static void
free_thead(thead_t * ptr)5117 free_thead (thead_t *ptr)
5118 {
5119   alloc_counts[(int) alloc_type_thead].total_free++;
5120 
5121 #ifndef MALLOC_CHECK
5122   ptr->free = (thead_t *) alloc_counts[(int) alloc_type_thead].free_list.f_thead;
5123   alloc_counts[(int) alloc_type_thead].free_list.f_thead = ptr;
5124 #else
5125   free ((PTR_T) ptr);
5126 #endif
5127 }
5128 
5129 static lineno_list_t *
allocate_lineno_list(void)5130 allocate_lineno_list (void)
5131 {
5132   register lineno_list_t *ptr;
5133   static lineno_list_t initial_lineno_list;
5134 
5135 #ifndef MALLOC_CHECK
5136 
5137   register int unallocated = alloc_counts[(int) alloc_type_lineno].unallocated;
5138   register page_type *cur_page = alloc_counts[(int) alloc_type_lineno].cur_page;
5139 
5140   if (unallocated == 0)
5141     {
5142       unallocated = PAGE_SIZE / sizeof (lineno_list_t);
5143       alloc_counts[(int) alloc_type_lineno].cur_page = cur_page = allocate_page ();
5144       alloc_counts[(int) alloc_type_lineno].total_pages++;
5145     }
5146 
5147   ptr = &cur_page->lineno[--unallocated];
5148   alloc_counts[(int) alloc_type_lineno].unallocated = unallocated;
5149 
5150 #else
5151 
5152   ptr = (lineno_list_t *) xmalloc (sizeof (lineno_list_t));
5153 
5154 #endif
5155 
5156   alloc_counts[(int) alloc_type_lineno].total_alloc++;
5157   *ptr = initial_lineno_list;
5158   return ptr;
5159 }
5160 
5161 void
ecoff_set_gp_prolog_size(int sz)5162 ecoff_set_gp_prolog_size (int sz)
5163 {
5164   if (cur_proc_ptr == 0)
5165     return;
5166 
5167   cur_proc_ptr->pdr.gp_prologue = sz;
5168   if (cur_proc_ptr->pdr.gp_prologue != sz)
5169     {
5170       as_warn (_("GP prologue size exceeds field size, using 0 instead"));
5171       cur_proc_ptr->pdr.gp_prologue = 0;
5172     }
5173 
5174   cur_proc_ptr->pdr.gp_used = 1;
5175 }
5176 
5177 int
ecoff_no_current_file(void)5178 ecoff_no_current_file (void)
5179 {
5180   return cur_file_ptr == (efdr_t *) NULL;
5181 }
5182 
5183 void
ecoff_generate_asm_lineno(void)5184 ecoff_generate_asm_lineno (void)
5185 {
5186   unsigned int lineno;
5187   char *filename;
5188   lineno_list_t *list;
5189 
5190   as_where (&filename, &lineno);
5191 
5192   if (current_stabs_filename == (char *) NULL
5193       || strcmp (current_stabs_filename, filename))
5194     add_file (filename, 0, 1);
5195 
5196   list = allocate_lineno_list ();
5197 
5198   list->next = (lineno_list_t *) NULL;
5199   list->file = cur_file_ptr;
5200   list->proc = cur_proc_ptr;
5201   list->frag = frag_now;
5202   list->paddr = frag_now_fix ();
5203   list->lineno = lineno;
5204 
5205   /* We don't want to merge files which have line numbers.  */
5206   cur_file_ptr->fdr.fMerge = 0;
5207 
5208   /* A .loc directive will sometimes appear before a .ent directive,
5209      which means that cur_proc_ptr will be NULL here.  Arrange to
5210      patch this up.  */
5211   if (cur_proc_ptr == (proc_t *) NULL)
5212     {
5213       lineno_list_t **pl;
5214 
5215       pl = &noproc_lineno;
5216       while (*pl != (lineno_list_t *) NULL)
5217 	pl = &(*pl)->next;
5218       *pl = list;
5219     }
5220   else
5221     {
5222       last_lineno = list;
5223       *last_lineno_ptr = list;
5224       last_lineno_ptr = &list->next;
5225     }
5226 }
5227 
5228 #else
5229 
5230 void
ecoff_generate_asm_lineno(void)5231 ecoff_generate_asm_lineno (void)
5232 {
5233 }
5234 
5235 #endif /* ECOFF_DEBUGGING */
5236