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