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