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