Home | History | Annotate | Line # | Download | only in gas
ecoff.c revision 1.8
      1 /* ECOFF debugging support.
      2    Copyright (C) 1993-2022 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 indices are reset to 0 for each of those
    189    tables for the file.
    190 
    191    The procedure table contains the binary equivalents of the .ent
    192    (start of the function address), .frame (what register is the
    193    virtual frame pointer, constant offset from the register to obtain
    194    the VFP, and what register holds the return address), .mask/.fmask
    195    (bitmask of saved registers, and where the first register is stored
    196    relative to the VFP) assembler directives.  It also contains the
    197    low and high bounds of the line numbers if debugging is turned on.
    198 
    199    The line number table is a compressed form of the normal COFF line
    200    table.  Each line number entry is either 1 or 3 bytes long, and
    201    contains a signed delta from the previous line, and an unsigned
    202    count of the number of instructions this statement takes.
    203 
    204    The local symbol table contains the following fields:
    205 
    206     1)	iss: index to the local string table giving the name of the
    207 	symbol.
    208 
    209     2)	value: value of the symbol (address, register number, etc.).
    210 
    211     3)	st: symbol type.  The current symbol types are:
    212 
    213 	    stNil	  -- Nuthin' special
    214 	    stGlobal	  -- external symbol
    215 	    stStatic	  -- static
    216 	    stParam	  -- procedure argument
    217 	    stLocal	  -- local variable
    218 	    stLabel	  -- label
    219 	    stProc	  -- External Procedure
    220 	    stBlock	  -- beginning of block
    221 	    stEnd	  -- end (of anything)
    222 	    stMember	  -- member (of anything)
    223 	    stTypedef	  -- type definition
    224 	    stFile	  -- file name
    225 	    stRegReloc	  -- register relocation
    226 	    stForward	  -- forwarding address
    227 	    stStaticProc  -- Static procedure
    228 	    stConstant	  -- const
    229 
    230     4)	sc: storage class.  The current storage classes are:
    231 
    232 	    scText	  -- text symbol
    233 	    scData	  -- initialized data symbol
    234 	    scBss	  -- un-initialized data symbol
    235 	    scRegister	  -- value of symbol is register number
    236 	    scAbs	  -- value of symbol is absolute
    237 	    scUndefined   -- who knows?
    238 	    scCdbLocal	  -- variable's value is IN se->va.??
    239 	    scBits	  -- this is a bit field
    240 	    scCdbSystem	  -- value is IN debugger's address space
    241 	    scRegImage	  -- register value saved on stack
    242 	    scInfo	  -- symbol contains debugger information
    243 	    scUserStruct  -- addr in struct user for current process
    244 	    scSData	  -- load time only small data
    245 	    scSBss	  -- load time only small common
    246 	    scRData	  -- load time only read only data
    247 	    scVar	  -- Var parameter (fortranpascal)
    248 	    scCommon	  -- common variable
    249 	    scSCommon	  -- small common
    250 	    scVarRegister -- Var parameter in a register
    251 	    scVariant	  -- Variant record
    252 	    scSUndefined  -- small undefined(external) data
    253 	    scInit	  -- .init section symbol
    254 
    255     5)	index: pointer to a local symbol or aux. entry.
    256 
    257    For the following program:
    258 
    259 	#include <stdio.h>
    260 
    261 	main(){
    262 		printf("Hello World!\n");
    263 		return 0;
    264 	}
    265 
    266    Mips-tdump produces the following information:
    267 
    268    Global file header:
    269        magic number             0x162
    270        # sections               2
    271        timestamp                645311799, Wed Jun 13 17:16:39 1990
    272        symbolic header offset   284
    273        symbolic header size     96
    274        optional header          56
    275        flags                    0x0
    276 
    277    Symbolic header, magic number = 0x7009, vstamp = 1.31:
    278 
    279        Info                      Offset      Number       Bytes
    280        ====                      ======      ======      =====
    281 
    282        Line numbers                 380           4           4 [13]
    283        Dense numbers                  0           0           0
    284        Procedures Tables            384           1          52
    285        Local Symbols                436          16         192
    286        Optimization Symbols           0           0           0
    287        Auxiliary Symbols            628          39         156
    288        Local Strings                784          80          80
    289        External Strings             864         144         144
    290        File Tables                 1008           2         144
    291        Relative Files                 0           0           0
    292        External Symbols            1152          20         320
    293 
    294    File #0, "hello2.c"
    295 
    296        Name index  = 1          Readin      = No
    297        Merge       = No         Endian      = LITTLE
    298        Debug level = G2         Language    = C
    299        Adr         = 0x00000000
    300 
    301        Info                       Start      Number        Size      Offset
    302        ====                       =====      ======        ====      ======
    303        Local strings                  0          15          15         784
    304        Local symbols                  0           6          72         436
    305        Line numbers                   0          13          13         380
    306        Optimization symbols           0           0           0           0
    307        Procedures                     0           1          52         384
    308        Auxiliary symbols              0          14          56         628
    309        Relative Files                 0           0           0           0
    310 
    311     There are 6 local symbols, starting at 436
    312 
    313 	Symbol# 0: "hello2.c"
    314 	    End+1 symbol  = 6
    315 	    String index  = 1
    316 	    Storage class = Text        Index  = 6
    317 	    Symbol type   = File        Value  = 0
    318 
    319 	Symbol# 1: "main"
    320 	    End+1 symbol  = 5
    321 	    Type          = int
    322 	    String index  = 10
    323 	    Storage class = Text        Index  = 12
    324 	    Symbol type   = Proc        Value  = 0
    325 
    326 	Symbol# 2: ""
    327 	    End+1 symbol  = 4
    328 	    String index  = 0
    329 	    Storage class = Text        Index  = 4
    330 	    Symbol type   = Block       Value  = 8
    331 
    332 	Symbol# 3: ""
    333 	    First symbol  = 2
    334 	    String index  = 0
    335 	    Storage class = Text        Index  = 2
    336 	    Symbol type   = End         Value  = 28
    337 
    338 	Symbol# 4: "main"
    339 	    First symbol  = 1
    340 	    String index  = 10
    341 	    Storage class = Text        Index  = 1
    342 	    Symbol type   = End         Value  = 52
    343 
    344 	Symbol# 5: "hello2.c"
    345 	    First symbol  = 0
    346 	    String index  = 1
    347 	    Storage class = Text        Index  = 0
    348 	    Symbol type   = End         Value  = 0
    349 
    350     There are 14 auxiliary table entries, starting at 628.
    351 
    352 	* #0               0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
    353 	* #1              24, [  24/      0], [ 6 0:0 0:0:0:0:0:0]
    354 	* #2               8, [   8/      0], [ 2 0:0 0:0:0:0:0:0]
    355 	* #3              16, [  16/      0], [ 4 0:0 0:0:0:0:0:0]
    356 	* #4              24, [  24/      0], [ 6 0:0 0:0:0:0:0:0]
    357 	* #5              32, [  32/      0], [ 8 0:0 0:0:0:0:0:0]
    358 	* #6              40, [  40/      0], [10 0:0 0:0:0:0:0:0]
    359 	* #7              44, [  44/      0], [11 0:0 0:0:0:0:0:0]
    360 	* #8              12, [  12/      0], [ 3 0:0 0:0:0:0:0:0]
    361 	* #9              20, [  20/      0], [ 5 0:0 0:0:0:0:0:0]
    362 	* #10             28, [  28/      0], [ 7 0:0 0:0:0:0:0:0]
    363 	* #11             36, [  36/      0], [ 9 0:0 0:0:0:0:0:0]
    364 	  #12              5, [   5/      0], [ 1 1:0 0:0:0:0:0:0]
    365 	  #13             24, [  24/      0], [ 6 0:0 0:0:0:0:0:0]
    366 
    367     There are 1 procedure descriptor entries, starting at 0.
    368 
    369 	Procedure descriptor 0:
    370 	    Name index   = 10          Name          = "main"
    371 	    .mask 0x80000000,-4        .fmask 0x00000000,0
    372 	    .frame $29,24,$31
    373 	    Opt. start   = -1          Symbols start = 1
    374 	    First line # = 3           Last line #   = 6
    375 	    Line Offset  = 0           Address       = 0x00000000
    376 
    377 	There are 4 bytes holding line numbers, starting at 380.
    378 	    Line           3,   delta     0,   count  2
    379 	    Line           4,   delta     1,   count  3
    380 	    Line           5,   delta     1,   count  2
    381 	    Line           6,   delta     1,   count  6
    382 
    383    File #1, "/usr/include/stdio.h"
    384 
    385     Name index  = 1          Readin      = No
    386     Merge       = Yes        Endian      = LITTLE
    387     Debug level = G2         Language    = C
    388     Adr         = 0x00000000
    389 
    390     Info                       Start      Number        Size      Offset
    391     ====                       =====      ======        ====      ======
    392     Local strings                 15          65          65         799
    393     Local symbols                  6          10         120         508
    394     Line numbers                   0           0           0         380
    395     Optimization symbols           0           0           0           0
    396     Procedures                     1           0           0         436
    397     Auxiliary symbols             14          25         100         684
    398     Relative Files                 0           0           0           0
    399 
    400     There are 10 local symbols, starting at 442
    401 
    402 	Symbol# 0: "/usr/include/stdio.h"
    403 	    End+1 symbol  = 10
    404 	    String index  = 1
    405 	    Storage class = Text        Index  = 10
    406 	    Symbol type   = File        Value  = 0
    407 
    408 	Symbol# 1: "_iobuf"
    409 	    End+1 symbol  = 9
    410 	    String index  = 22
    411 	    Storage class = Info        Index  = 9
    412 	    Symbol type   = Block       Value  = 20
    413 
    414 	Symbol# 2: "_cnt"
    415 	    Type          = int
    416 	    String index  = 29
    417 	    Storage class = Info        Index  = 4
    418 	    Symbol type   = Member      Value  = 0
    419 
    420 	Symbol# 3: "_ptr"
    421 	    Type          = ptr to char
    422 	    String index  = 34
    423 	    Storage class = Info        Index  = 15
    424 	    Symbol type   = Member      Value  = 32
    425 
    426 	Symbol# 4: "_base"
    427 	    Type          = ptr to char
    428 	    String index  = 39
    429 	    Storage class = Info        Index  = 16
    430 	    Symbol type   = Member      Value  = 64
    431 
    432 	Symbol# 5: "_bufsiz"
    433 	    Type          = int
    434 	    String index  = 45
    435 	    Storage class = Info        Index  = 4
    436 	    Symbol type   = Member      Value  = 96
    437 
    438 	Symbol# 6: "_flag"
    439 	    Type          = short
    440 	    String index  = 53
    441 	    Storage class = Info        Index  = 3
    442 	    Symbol type   = Member      Value  = 128
    443 
    444 	Symbol# 7: "_file"
    445 	    Type          = char
    446 	    String index  = 59
    447 	    Storage class = Info        Index  = 2
    448 	    Symbol type   = Member      Value  = 144
    449 
    450 	Symbol# 8: ""
    451 	    First symbol  = 1
    452 	    String index  = 0
    453 	    Storage class = Info        Index  = 1
    454 	    Symbol type   = End         Value  = 0
    455 
    456 	Symbol# 9: "/usr/include/stdio.h"
    457 	    First symbol  = 0
    458 	    String index  = 1
    459 	    Storage class = Text        Index  = 0
    460 	    Symbol type   = End         Value  = 0
    461 
    462     There are 25 auxiliary table entries, starting at 642.
    463 
    464 	* #14             -1, [4095/1048575], [63 1:1 f:f:f:f:f:f]
    465 	  #15          65544, [   8/     16], [ 2 0:0 1:0:0:0:0:0]
    466 	  #16          65544, [   8/     16], [ 2 0:0 1:0:0:0:0:0]
    467 	* #17         196656, [  48/     48], [12 0:0 3:0:0:0:0:0]
    468 	* #18           8191, [4095/      1], [63 1:1 0:0:0:0:f:1]
    469 	* #19              1, [   1/      0], [ 0 1:0 0:0:0:0:0:0]
    470 	* #20          20479, [4095/      4], [63 1:1 0:0:0:0:f:4]
    471 	* #21              1, [   1/      0], [ 0 1:0 0:0:0:0:0:0]
    472 	* #22              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
    473 	* #23              2, [   2/      0], [ 0 0:1 0:0:0:0:0:0]
    474 	* #24            160, [ 160/      0], [40 0:0 0:0:0:0:0:0]
    475 	* #25              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
    476 	* #26              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
    477 	* #27              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
    478 	* #28              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
    479 	* #29              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
    480 	* #30              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
    481 	* #31              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
    482 	* #32              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
    483 	* #33              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
    484 	* #34              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
    485 	* #35              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
    486 	* #36              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
    487 	* #37              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
    488 	* #38              0, [   0/      0], [ 0 0:0 0:0:0:0:0:0]
    489 
    490     There are 0 procedure descriptor entries, starting at 1.
    491 
    492    There are 20 external symbols, starting at 1152
    493 
    494 	Symbol# 0: "_iob"
    495 	    Type          = array [3 {160}] of struct _iobuf { ifd = 1, index = 1 }
    496 	    String index  = 0           Ifd    = 1
    497 	    Storage class = Nil         Index  = 17
    498 	    Symbol type   = Global      Value  = 60
    499 
    500 	Symbol# 1: "fopen"
    501 	    String index  = 5           Ifd    = 1
    502 	    Storage class = Nil         Index  = 1048575
    503 	    Symbol type   = Proc        Value  = 0
    504 
    505 	Symbol# 2: "fdopen"
    506 	    String index  = 11          Ifd    = 1
    507 	    Storage class = Nil         Index  = 1048575
    508 	    Symbol type   = Proc        Value  = 0
    509 
    510 	Symbol# 3: "freopen"
    511 	    String index  = 18          Ifd    = 1
    512 	    Storage class = Nil         Index  = 1048575
    513 	    Symbol type   = Proc        Value  = 0
    514 
    515 	Symbol# 4: "popen"
    516 	    String index  = 26          Ifd    = 1
    517 	    Storage class = Nil         Index  = 1048575
    518 	    Symbol type   = Proc        Value  = 0
    519 
    520 	Symbol# 5: "tmpfile"
    521 	    String index  = 32          Ifd    = 1
    522 	    Storage class = Nil         Index  = 1048575
    523 	    Symbol type   = Proc        Value  = 0
    524 
    525 	Symbol# 6: "ftell"
    526 	    String index  = 40          Ifd    = 1
    527 	    Storage class = Nil         Index  = 1048575
    528 	    Symbol type   = Proc        Value  = 0
    529 
    530 	Symbol# 7: "rewind"
    531 	    String index  = 46          Ifd    = 1
    532 	    Storage class = Nil         Index  = 1048575
    533 	    Symbol type   = Proc        Value  = 0
    534 
    535 	Symbol# 8: "setbuf"
    536 	    String index  = 53          Ifd    = 1
    537 	    Storage class = Nil         Index  = 1048575
    538 	    Symbol type   = Proc        Value  = 0
    539 
    540 	Symbol# 9: "setbuffer"
    541 	    String index  = 60          Ifd    = 1
    542 	    Storage class = Nil         Index  = 1048575
    543 	    Symbol type   = Proc        Value  = 0
    544 
    545 	Symbol# 10: "setlinebuf"
    546 	    String index  = 70          Ifd    = 1
    547 	    Storage class = Nil         Index  = 1048575
    548 	    Symbol type   = Proc        Value  = 0
    549 
    550 	Symbol# 11: "fgets"
    551 	    String index  = 81          Ifd    = 1
    552 	    Storage class = Nil         Index  = 1048575
    553 	    Symbol type   = Proc        Value  = 0
    554 
    555 	Symbol# 12: "gets"
    556 	    String index  = 87          Ifd    = 1
    557 	    Storage class = Nil         Index  = 1048575
    558 	    Symbol type   = Proc        Value  = 0
    559 
    560 	Symbol# 13: "ctermid"
    561 	    String index  = 92          Ifd    = 1
    562 	    Storage class = Nil         Index  = 1048575
    563 	    Symbol type   = Proc        Value  = 0
    564 
    565 	Symbol# 14: "cuserid"
    566 	    String index  = 100         Ifd    = 1
    567 	    Storage class = Nil         Index  = 1048575
    568 	    Symbol type   = Proc        Value  = 0
    569 
    570 	Symbol# 15: "tempnam"
    571 	    String index  = 108         Ifd    = 1
    572 	    Storage class = Nil         Index  = 1048575
    573 	    Symbol type   = Proc        Value  = 0
    574 
    575 	Symbol# 16: "tmpnam"
    576 	    String index  = 116         Ifd    = 1
    577 	    Storage class = Nil         Index  = 1048575
    578 	    Symbol type   = Proc        Value  = 0
    579 
    580 	Symbol# 17: "sprintf"
    581 	    String index  = 123         Ifd    = 1
    582 	    Storage class = Nil         Index  = 1048575
    583 	    Symbol type   = Proc        Value  = 0
    584 
    585 	Symbol# 18: "main"
    586 	    Type          = int
    587 	    String index  = 131         Ifd    = 0
    588 	    Storage class = Text        Index  = 1
    589 	    Symbol type   = Proc        Value  = 0
    590 
    591 	Symbol# 19: "printf"
    592 	    String index  = 136         Ifd    = 0
    593 	    Storage class = Undefined   Index  = 1048575
    594 	    Symbol type   = Proc        Value  = 0
    595 
    596    The following auxiliary table entries were unused:
    597 
    598     #0               0  0x00000000  void
    599     #2               8  0x00000008  char
    600     #3              16  0x00000010  short
    601     #4              24  0x00000018  int
    602     #5              32  0x00000020  long
    603     #6              40  0x00000028  float
    604     #7              44  0x0000002c  double
    605     #8              12  0x0000000c  unsigned char
    606     #9              20  0x00000014  unsigned short
    607     #10             28  0x0000001c  unsigned int
    608     #11             36  0x00000024  unsigned long
    609     #14              0  0x00000000  void
    610     #15             24  0x00000018  int
    611     #19             32  0x00000020  long
    612     #20             40  0x00000028  float
    613     #21             44  0x0000002c  double
    614     #22             12  0x0000000c  unsigned char
    615     #23             20  0x00000014  unsigned short
    616     #24             28  0x0000001c  unsigned int
    617     #25             36  0x00000024  unsigned long
    618     #26             48  0x00000030  struct no name { ifd = -1, index = 1048575 }
    619 */
    620 
    621 /* Redefinition of storage classes as an enumeration for better
    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   htab_t	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   (htab_t)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 htab_t 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 			    htab_t 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, int aent);
   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 = str_htab_create ();
   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 	    htab_t 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 *) str_hash_find (hash_tbl, str);
   1569   if (hash_ptr == (shash_t *) NULL)
   1570     {
   1571       if (vp->objects_last_page + len >= PAGE_USIZE)
   1572 	{
   1573 	  vp->num_allocated =
   1574 	    ((vp->num_allocated + PAGE_USIZE - 1) / PAGE_USIZE) * PAGE_USIZE;
   1575 	  add_varray_page (vp);
   1576 	}
   1577 
   1578       hash_ptr = allocate_shash ();
   1579       hash_ptr->indx = vp->num_allocated;
   1580 
   1581       hash_ptr->string = &vp->last->datum->byte[vp->objects_last_page];
   1582 
   1583       vp->objects_last_page += len + 1;
   1584       vp->num_allocated += len + 1;
   1585 
   1586       strcpy (hash_ptr->string, str);
   1587 
   1588       if (str_hash_insert (hash_tbl, str, hash_ptr, 0) != NULL)
   1589 	as_fatal (_("duplicate %s"), str);
   1590     }
   1591 
   1592   if (ret_hash != (shash_t **) NULL)
   1593     *ret_hash = hash_ptr;
   1594 
   1595   return hash_ptr->indx;
   1596 }
   1597 
   1598 /* Add debugging information for a symbol.  */
   1600 
   1601 static localsym_t *
   1602 add_ecoff_symbol (const char *str,	/* symbol name */
   1603 		  st_t type,		/* symbol type */
   1604 		  sc_t storage,		/* storage class */
   1605 		  symbolS *sym_value,	/* associated symbol.  */
   1606 		  bfd_vma addend,	/* addend to sym_value.  */
   1607 		  symint_t value,	/* value of symbol */
   1608 		  symint_t indx		/* index to local/aux. syms */)
   1609 {
   1610   localsym_t *psym;
   1611   scope_t *pscope;
   1612   thead_t *ptag_head;
   1613   tag_t *ptag;
   1614   tag_t *ptag_next;
   1615   varray_t *vp;
   1616   int scope_delta = 0;
   1617   shash_t *hash_ptr = (shash_t *) NULL;
   1618 
   1619   if (cur_file_ptr == (efdr_t *) NULL)
   1620     as_fatal (_("no current file pointer"));
   1621 
   1622   vp = &cur_file_ptr->symbols;
   1623 
   1624   if (vp->objects_last_page == vp->objects_per_page)
   1625     add_varray_page (vp);
   1626 
   1627   psym = &vp->last->datum->sym[vp->objects_last_page++];
   1628 
   1629   if (str == (const char *) NULL && sym_value != (symbolS *) NULL)
   1630     psym->name = S_GET_NAME (sym_value);
   1631   else
   1632     psym->name = str;
   1633   psym->as_sym = sym_value;
   1634   if (sym_value != (symbolS *) NULL)
   1635     symbol_get_obj (sym_value)->ecoff_symbol = psym;
   1636   psym->addend = addend;
   1637   psym->file_ptr = cur_file_ptr;
   1638   psym->proc_ptr = cur_proc_ptr;
   1639   psym->begin_ptr = (localsym_t *) NULL;
   1640   psym->index_ptr = (aux_t *) NULL;
   1641   psym->forward_ref = (forward_t *) NULL;
   1642   psym->sym_index = -1;
   1643   memset (&psym->ecoff_sym, 0, sizeof (EXTR));
   1644   psym->ecoff_sym.asym.value = value;
   1645   psym->ecoff_sym.asym.st = (unsigned) type;
   1646   psym->ecoff_sym.asym.sc = (unsigned) storage;
   1647   psym->ecoff_sym.asym.index = indx;
   1648 
   1649   /* If there is an associated symbol, we wait until the end of the
   1650      assembly before deciding where to put the name (it may be just an
   1651      external symbol).  Otherwise, this is just a debugging symbol and
   1652      the name should go with the current file.  */
   1653   if (sym_value == (symbolS *) NULL)
   1654     psym->ecoff_sym.asym.iss = ((str == (const char *) NULL)
   1655 				? 0
   1656 				: add_string (&cur_file_ptr->strings,
   1657 					      cur_file_ptr->str_hash,
   1658 					      str,
   1659 					      &hash_ptr));
   1660 
   1661   ++vp->num_allocated;
   1662 
   1663   if (ECOFF_IS_STAB (&psym->ecoff_sym.asym))
   1664     return psym;
   1665 
   1666   /* Save the symbol within the hash table if this is a static
   1667      item, and it has a name.  */
   1668   if (hash_ptr != (shash_t *) NULL
   1669       && (type == st_Global || type == st_Static || type == st_Label
   1670 	  || type == st_Proc || type == st_StaticProc))
   1671     hash_ptr->sym_ptr = psym;
   1672 
   1673   /* push or pop a scope if appropriate.  */
   1674   switch (type)
   1675     {
   1676     default:
   1677       break;
   1678 
   1679     case st_File:			/* beginning of file */
   1680     case st_Proc:			/* procedure */
   1681     case st_StaticProc:			/* static procedure */
   1682     case st_Block:			/* begin scope */
   1683       pscope = allocate_scope ();
   1684       pscope->prev = cur_file_ptr->cur_scope;
   1685       pscope->lsym = psym;
   1686       pscope->type = type;
   1687       cur_file_ptr->cur_scope = pscope;
   1688 
   1689       if (type != st_File)
   1690 	scope_delta = 1;
   1691 
   1692       /* For every block type except file, struct, union, or
   1693          enumeration blocks, push a level on the tag stack.  We omit
   1694          file types, so that tags can span file boundaries.  */
   1695       if (type != st_File && storage != sc_Info)
   1696 	{
   1697 	  ptag_head = allocate_thead ();
   1698 	  ptag_head->first_tag = 0;
   1699 	  ptag_head->prev = cur_tag_head;
   1700 	  cur_tag_head = ptag_head;
   1701 	}
   1702       break;
   1703 
   1704     case st_End:
   1705       pscope = cur_file_ptr->cur_scope;
   1706       if (pscope == (scope_t *) NULL)
   1707 	as_fatal (_("too many st_End's"));
   1708       else
   1709 	{
   1710 	  st_t begin_type = (st_t) pscope->lsym->ecoff_sym.asym.st;
   1711 
   1712 	  psym->begin_ptr = pscope->lsym;
   1713 
   1714 	  if (begin_type != st_File)
   1715 	    scope_delta = -1;
   1716 
   1717 	  /* Except for file, structure, union, or enumeration end
   1718 	     blocks remove all tags created within this scope.  */
   1719 	  if (begin_type != st_File && storage != sc_Info)
   1720 	    {
   1721 	      ptag_head = cur_tag_head;
   1722 	      cur_tag_head = ptag_head->prev;
   1723 
   1724 	      for (ptag = ptag_head->first_tag;
   1725 		   ptag != (tag_t *) NULL;
   1726 		   ptag = ptag_next)
   1727 		{
   1728 		  if (ptag->forward_ref != (forward_t *) NULL)
   1729 		    add_unknown_tag (ptag);
   1730 
   1731 		  ptag_next = ptag->same_block;
   1732 		  ptag->hash_ptr->tag_ptr = ptag->same_name;
   1733 		  free_tag (ptag);
   1734 		}
   1735 
   1736 	      free_thead (ptag_head);
   1737 	    }
   1738 
   1739 	  cur_file_ptr->cur_scope = pscope->prev;
   1740 
   1741 	  /* block begin gets next sym #.  This is set when we know
   1742 	     the symbol index value.  */
   1743 
   1744 	  /* Functions push two or more aux words as follows:
   1745 	     1st word: index+1 of the end symbol (filled in later).
   1746 	     2nd word: type of the function (plus any aux words needed).
   1747 	     Also, tie the external pointer back to the function begin symbol.  */
   1748 	  if (begin_type != st_File && begin_type != st_Block)
   1749 	    {
   1750 	      symint_t ty;
   1751 	      varray_t *svp = &cur_file_ptr->aux_syms;
   1752 
   1753 	      pscope->lsym->ecoff_sym.asym.index = add_aux_sym_symint (0);
   1754 	      pscope->lsym->index_ptr =
   1755 		&svp->last->datum->aux[svp->objects_last_page - 1];
   1756 	      ty = add_aux_sym_tir (&last_func_type_info,
   1757 				    hash_no,
   1758 				    &cur_file_ptr->thash_head[0]);
   1759 	      (void) ty;
   1760 /* This seems to be unnecessary.  I'm not even sure what it is
   1761  * intended to do.  It's from mips-tfile.
   1762  *	      if (last_func_sym_value != (symbolS *) NULL)
   1763  *		{
   1764  *		  last_func_sym_value->ifd = cur_file_ptr->file_index;
   1765  *		  last_func_sym_value->index = ty;
   1766  *		}
   1767  */
   1768 	    }
   1769 
   1770 	  free_scope (pscope);
   1771 	}
   1772     }
   1773 
   1774   cur_file_ptr->nested_scopes += scope_delta;
   1775 
   1776 #ifdef ECOFF_DEBUG
   1777   if (debug && type != st_File
   1778       && (debug > 2 || type == st_Block || type == st_End
   1779 	  || type == st_Proc || type == st_StaticProc))
   1780     {
   1781       char *sc_str = sc_to_string (storage);
   1782       char *st_str = st_to_string (type);
   1783       int depth = cur_file_ptr->nested_scopes + (scope_delta < 0);
   1784 
   1785       fprintf (stderr,
   1786 	       "\tlsym\tv= %10ld, depth= %2d, sc= %-12s",
   1787 	       value, depth, sc_str);
   1788 
   1789       if (str_start && str_end_p1 - str_start > 0)
   1790 	fprintf (stderr, " st= %-11s name= %.*s\n",
   1791 		 st_str, str_end_p1 - str_start, str_start);
   1792       else
   1793 	{
   1794 	  unsigned long len = strlen (st_str);
   1795 	  fprintf (stderr, " st= %.*s\n", len - 1, st_str);
   1796 	}
   1797     }
   1798 #endif
   1799 
   1800   return psym;
   1801 }
   1802 
   1803 /* Add an auxiliary symbol (passing a symint).  This is actually used
   1805    for integral aux types, not just symints.  */
   1806 
   1807 static symint_t
   1808 add_aux_sym_symint (symint_t aux_word /* auxiliary information word */)
   1809 {
   1810   varray_t *vp;
   1811   aux_t *aux_ptr;
   1812 
   1813   if (cur_file_ptr == (efdr_t *) NULL)
   1814     as_fatal (_("no current file pointer"));
   1815 
   1816   vp = &cur_file_ptr->aux_syms;
   1817 
   1818   if (vp->objects_last_page == vp->objects_per_page)
   1819     add_varray_page (vp);
   1820 
   1821   aux_ptr = &vp->last->datum->aux[vp->objects_last_page++];
   1822   aux_ptr->type = aux_isym;
   1823   aux_ptr->data.isym = aux_word;
   1824 
   1825   return vp->num_allocated++;
   1826 }
   1827 
   1828 /* Add an auxiliary symbol (passing a file/symbol index combo).  */
   1829 
   1830 static symint_t
   1831 add_aux_sym_rndx (int file_index, symint_t sym_index)
   1832 {
   1833   varray_t *vp;
   1834   aux_t *aux_ptr;
   1835 
   1836   if (cur_file_ptr == (efdr_t *) NULL)
   1837     as_fatal (_("no current file pointer"));
   1838 
   1839   vp = &cur_file_ptr->aux_syms;
   1840 
   1841   if (vp->objects_last_page == vp->objects_per_page)
   1842     add_varray_page (vp);
   1843 
   1844   aux_ptr = &vp->last->datum->aux[vp->objects_last_page++];
   1845   aux_ptr->type = aux_rndx;
   1846   aux_ptr->data.rndx.rfd   = file_index;
   1847   aux_ptr->data.rndx.index = sym_index;
   1848 
   1849   return vp->num_allocated++;
   1850 }
   1851 
   1852 /* Add an auxiliary symbol (passing the basic type and possibly
   1854    type qualifiers).  */
   1855 
   1856 static symint_t
   1857 add_aux_sym_tir (type_info_t *t,	/* current type information */
   1858 		 hash_state_t state,	/* whether to hash type or not */
   1859 		 thash_t **hash_tbl	/* pointer to hash table to use */)
   1860 {
   1861   varray_t *vp;
   1862   aux_t *aux_ptr;
   1863   static AUXU init_aux;
   1864   symint_t ret;
   1865   int i;
   1866   AUXU aux;
   1867 
   1868   if (cur_file_ptr == (efdr_t *) NULL)
   1869     as_fatal (_("no current file pointer"));
   1870 
   1871   vp = &cur_file_ptr->aux_syms;
   1872 
   1873   aux = init_aux;
   1874   aux.ti.bt = (int) t->basic_type;
   1875   aux.ti.continued = 0;
   1876   aux.ti.fBitfield = t->bitfield;
   1877 
   1878   aux.ti.tq0 = (int) t->type_qualifiers[0];
   1879   aux.ti.tq1 = (int) t->type_qualifiers[1];
   1880   aux.ti.tq2 = (int) t->type_qualifiers[2];
   1881   aux.ti.tq3 = (int) t->type_qualifiers[3];
   1882   aux.ti.tq4 = (int) t->type_qualifiers[4];
   1883   aux.ti.tq5 = (int) t->type_qualifiers[5];
   1884 
   1885   /* For anything that adds additional information, we must not hash,
   1886      so check here, and reset our state.  */
   1887 
   1888   if (state != hash_no
   1889       && (t->type_qualifiers[0] == tq_Array
   1890 	  || t->type_qualifiers[1] == tq_Array
   1891 	  || t->type_qualifiers[2] == tq_Array
   1892 	  || t->type_qualifiers[3] == tq_Array
   1893 	  || t->type_qualifiers[4] == tq_Array
   1894 	  || t->type_qualifiers[5] == tq_Array
   1895 	  || t->basic_type == bt_Struct
   1896 	  || t->basic_type == bt_Union
   1897 	  || t->basic_type == bt_Enum
   1898 	  || t->bitfield
   1899 	  || t->num_dims > 0))
   1900     state = hash_no;
   1901 
   1902   /* See if we can hash this type, and save some space, but some types
   1903      can't be hashed (because they contain arrays or continuations),
   1904      and others can be put into the hash list, but cannot use existing
   1905      types because other aux entries precede this one.  */
   1906 
   1907   if (state != hash_no)
   1908     {
   1909       thash_t *hash_ptr;
   1910       symint_t hi;
   1911 
   1912       hi = aux.isym & ((1 << HASHBITS) - 1);
   1913       hi %= THASH_SIZE;
   1914 
   1915       for (hash_ptr = hash_tbl[hi];
   1916 	   hash_ptr != (thash_t *)0;
   1917 	   hash_ptr = hash_ptr->next)
   1918 	{
   1919 	  if (aux.isym == hash_ptr->type.isym)
   1920 	    break;
   1921 	}
   1922 
   1923       if (hash_ptr != (thash_t *) NULL && state == hash_yes)
   1924 	return hash_ptr->indx;
   1925 
   1926       if (hash_ptr == (thash_t *) NULL)
   1927 	{
   1928 	  hash_ptr = allocate_thash ();
   1929 	  hash_ptr->next = hash_tbl[hi];
   1930 	  hash_ptr->type = aux;
   1931 	  hash_ptr->indx = vp->num_allocated;
   1932 	  hash_tbl[hi] = hash_ptr;
   1933 	}
   1934     }
   1935 
   1936   /* Everything is set up, add the aux symbol.  */
   1937   if (vp->objects_last_page == vp->objects_per_page)
   1938     add_varray_page (vp);
   1939 
   1940   aux_ptr = &vp->last->datum->aux[vp->objects_last_page++];
   1941   aux_ptr->type = aux_tir;
   1942   aux_ptr->data = aux;
   1943 
   1944   ret = vp->num_allocated++;
   1945 
   1946   /* Add bitfield length if it exists.
   1947 
   1948      NOTE:  Mips documentation claims bitfield goes at the end of the
   1949      AUX record, but the DECstation compiler emits it here.
   1950      (This would only make a difference for enum bitfields.)
   1951 
   1952      Also note:  We use the last size given since gcc may emit 2
   1953      for an enum bitfield.  */
   1954 
   1955   if (t->bitfield)
   1956     (void) add_aux_sym_symint ((symint_t) t->sizes[t->num_sizes - 1]);
   1957 
   1958   /* Add tag information if needed.  Structure, union, and enum
   1959      references add 2 aux symbols: a [file index, symbol index]
   1960      pointer to the structure type, and the current file index.  */
   1961 
   1962   if (t->basic_type == bt_Struct
   1963       || t->basic_type == bt_Union
   1964       || t->basic_type == bt_Enum)
   1965     {
   1966       symint_t file_index = t->tag_ptr->ifd;
   1967       localsym_t *sym = t->tag_ptr->sym;
   1968       forward_t *forward_ref = allocate_forward ();
   1969 
   1970       if (sym != (localsym_t *) NULL)
   1971 	{
   1972 	  forward_ref->next = sym->forward_ref;
   1973 	  sym->forward_ref = forward_ref;
   1974 	}
   1975       else
   1976 	{
   1977 	  forward_ref->next = t->tag_ptr->forward_ref;
   1978 	  t->tag_ptr->forward_ref = forward_ref;
   1979 	}
   1980 
   1981       (void) add_aux_sym_rndx (ST_RFDESCAPE, indexNil);
   1982       forward_ref->index_ptr
   1983 	= &vp->last->datum->aux[vp->objects_last_page - 1];
   1984 
   1985       (void) add_aux_sym_symint (file_index);
   1986       forward_ref->ifd_ptr
   1987 	= &vp->last->datum->aux[vp->objects_last_page - 1];
   1988     }
   1989 
   1990   /* Add information about array bounds if they exist.  */
   1991   for (i = 0; i < t->num_dims; i++)
   1992     {
   1993       (void) add_aux_sym_rndx (ST_RFDESCAPE,
   1994 			       cur_file_ptr->int_type);
   1995 
   1996       (void) add_aux_sym_symint (cur_file_ptr->file_index);	/* file index*/
   1997       (void) add_aux_sym_symint ((symint_t) 0);			/* low bound */
   1998       (void) add_aux_sym_symint (t->dimensions[i] - 1);		/* high bound*/
   1999       (void) add_aux_sym_symint ((t->dimensions[i] == 0)	/* stride */
   2000 				 ? 0
   2001 				 : (t->sizes[i] * 8) / t->dimensions[i]);
   2002     };
   2003 
   2004   /* NOTE:  Mips documentation claims that the bitfield width goes here.
   2005      But it needs to be emitted earlier.  */
   2006 
   2007   return ret;
   2008 }
   2009 
   2010 /* Add a tag to the tag table (unless it already exists).  */
   2012 
   2013 static tag_t *
   2014 get_tag (const char *tag,	/* tag name */
   2015 	 localsym_t *sym,	/* tag start block */
   2016 	 bt_t basic_type	/* bt_Struct, bt_Union, or bt_Enum */)
   2017 {
   2018   shash_t *hash_ptr;
   2019   tag_t *tag_ptr;
   2020 
   2021   if (cur_file_ptr == (efdr_t *) NULL)
   2022     as_fatal (_("no current file pointer"));
   2023 
   2024   hash_ptr = (shash_t *) str_hash_find (tag_hash, tag);
   2025 
   2026   if (hash_ptr != (shash_t *) NULL
   2027       && hash_ptr->tag_ptr != (tag_t *) NULL)
   2028     {
   2029       tag_ptr = hash_ptr->tag_ptr;
   2030       if (sym != (localsym_t *) NULL)
   2031 	{
   2032 	  tag_ptr->basic_type = basic_type;
   2033 	  tag_ptr->ifd        = cur_file_ptr->file_index;
   2034 	  tag_ptr->sym        = sym;
   2035 	}
   2036       return tag_ptr;
   2037     }
   2038 
   2039   if (hash_ptr == (shash_t *) NULL)
   2040     {
   2041       char *perm;
   2042 
   2043       perm = xstrdup (tag);
   2044       hash_ptr = allocate_shash ();
   2045       str_hash_insert (tag_hash, perm, hash_ptr, 0);
   2046       hash_ptr->string = perm;
   2047     }
   2048 
   2049   tag_ptr = allocate_tag ();
   2050   tag_ptr->forward_ref	= (forward_t *) NULL;
   2051   tag_ptr->hash_ptr	= hash_ptr;
   2052   tag_ptr->same_name	= hash_ptr->tag_ptr;
   2053   tag_ptr->basic_type	= basic_type;
   2054   tag_ptr->sym		= sym;
   2055   tag_ptr->ifd		= ((sym == (localsym_t *) NULL)
   2056 			   ? (symint_t) -1
   2057 			   : cur_file_ptr->file_index);
   2058   tag_ptr->same_block	= cur_tag_head->first_tag;
   2059 
   2060   cur_tag_head->first_tag = tag_ptr;
   2061   hash_ptr->tag_ptr	  = tag_ptr;
   2062 
   2063   return tag_ptr;
   2064 }
   2065 
   2066 /* Add an unknown {struct, union, enum} tag.  */
   2068 
   2069 static void
   2070 add_unknown_tag (tag_t *ptag /* pointer to tag information */)
   2071 {
   2072   shash_t *hash_ptr	= ptag->hash_ptr;
   2073   char *name		= hash_ptr->string;
   2074   localsym_t *sym;
   2075   forward_t **pf;
   2076 
   2077 #ifdef ECOFF_DEBUG
   2078   if (debug > 1)
   2079     {
   2080       char *agg_type = "{unknown aggregate type}";
   2081       switch (ptag->basic_type)
   2082 	{
   2083 	case bt_Struct:	agg_type = "struct";	break;
   2084 	case bt_Union:	agg_type = "union";	break;
   2085 	case bt_Enum:	agg_type = "enum";	break;
   2086 	default:				break;
   2087 	}
   2088 
   2089       fprintf (stderr, "unknown %s %.*s found\n", agg_type,
   2090 	       hash_ptr->len, name_start);
   2091     }
   2092 #endif
   2093 
   2094   sym = add_ecoff_symbol (name,
   2095 			  st_Block,
   2096 			  sc_Info,
   2097 			  (symbolS *) NULL,
   2098 			  (bfd_vma) 0,
   2099 			  (symint_t) 0,
   2100 			  (symint_t) 0);
   2101 
   2102   (void) add_ecoff_symbol (name,
   2103 			   st_End,
   2104 			   sc_Info,
   2105 			   (symbolS *) NULL,
   2106 			   (bfd_vma) 0,
   2107 			   (symint_t) 0,
   2108 			   (symint_t) 0);
   2109 
   2110   for (pf = &sym->forward_ref; *pf != (forward_t *) NULL; pf = &(*pf)->next)
   2111     ;
   2112   *pf = ptag->forward_ref;
   2113 }
   2114 
   2115 /* Add a procedure to the current file's list of procedures, and record
   2117    this is the current procedure.  If AENT, then only set the requested
   2118    symbol's function type.  */
   2119 
   2120 static void
   2121 add_procedure (char *func /* func name */, int aent)
   2122 {
   2123   varray_t *vp;
   2124   proc_t *new_proc_ptr;
   2125   symbolS *sym;
   2126 
   2127 #ifdef ECOFF_DEBUG
   2128   if (debug)
   2129     fputc ('\n', stderr);
   2130 #endif
   2131 
   2132   /* Set the BSF_FUNCTION flag for the symbol.  */
   2133   sym = symbol_find_or_make (func);
   2134   symbol_get_bfdsym (sym)->flags |= BSF_FUNCTION;
   2135 
   2136   if (aent)
   2137     return;
   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   /* Push the start of the function.  */
   2160   new_proc_ptr->sym = add_ecoff_symbol ((const char *) NULL, st_Proc, sc_Text,
   2161 					sym, (bfd_vma) 0, (symint_t) 0,
   2162 					(symint_t) 0);
   2163 
   2164   ++proc_cnt;
   2165 
   2166   /* Fill in the linenos preceding the .ent, if any.  */
   2167   if (noproc_lineno != (lineno_list_t *) NULL)
   2168     {
   2169       lineno_list_t *l;
   2170 
   2171       for (l = noproc_lineno; l != (lineno_list_t *) NULL; l = l->next)
   2172 	l->proc = new_proc_ptr;
   2173       *last_lineno_ptr = noproc_lineno;
   2174       while (*last_lineno_ptr != NULL)
   2175 	{
   2176 	  last_lineno = *last_lineno_ptr;
   2177 	  last_lineno_ptr = &last_lineno->next;
   2178 	}
   2179       noproc_lineno = (lineno_list_t *) NULL;
   2180     }
   2181 }
   2182 
   2183 symbolS *
   2184 ecoff_get_cur_proc_sym (void)
   2185 {
   2186   return (cur_proc_ptr ? cur_proc_ptr->sym->as_sym : NULL);
   2187 }
   2188 
   2189 /* Add a new filename, and set up all of the file relative
   2191    virtual arrays (strings, symbols, aux syms, etc.).  Record
   2192    where the current file structure lives.  */
   2193 
   2194 static void
   2195 add_file (const char *file_name, int indx ATTRIBUTE_UNUSED, int fake)
   2196 {
   2197   int first_ch;
   2198   efdr_t *fil_ptr;
   2199 
   2200 #ifdef ECOFF_DEBUG
   2201   if (debug)
   2202     fprintf (stderr, "\tfile\t%.*s\n", len, file_start);
   2203 #endif
   2204 
   2205   /* If the file name is NULL, then no .file symbol appeared, and we
   2206      want to use the actual file name.  */
   2207   if (file_name == (const char *) NULL)
   2208     {
   2209       if (first_file != (efdr_t *) NULL)
   2210 	as_fatal (_("fake .file after real one"));
   2211       file_name = as_where ((unsigned int *) NULL);
   2212 
   2213       /* Automatically generate ECOFF debugging information, since I
   2214          think that's what other ECOFF assemblers do.  We don't do
   2215          this if we see a .file directive with a string, since that
   2216          implies that some sort of debugging information is being
   2217          provided.  */
   2218       if (! symbol_table_frozen && debug_type == DEBUG_UNSPECIFIED)
   2219 	debug_type = DEBUG_ECOFF;
   2220     }
   2221   else if (debug_type == DEBUG_UNSPECIFIED)
   2222     debug_type = DEBUG_NONE;
   2223 
   2224 #ifndef NO_LISTING
   2225   if (listing)
   2226     listing_source_file (file_name);
   2227 #endif
   2228 
   2229   current_stabs_filename = file_name;
   2230 
   2231   /* If we're creating stabs, then we don't actually make a new FDR.
   2232      Instead, we just create a stabs symbol.  */
   2233   if (stabs_seen)
   2234     {
   2235       (void) add_ecoff_symbol (file_name, st_Nil, sc_Nil,
   2236 			       symbol_new (FAKE_LABEL_NAME, now_seg,
   2237 					   frag_now, frag_now_fix ()),
   2238 			       (bfd_vma) 0, 0, ECOFF_MARK_STAB (N_SOL));
   2239       return;
   2240     }
   2241 
   2242   first_ch = *file_name;
   2243 
   2244   /* FIXME: We can't safely merge files which have line number
   2245      information (fMerge will be zero in this case).  Otherwise, we
   2246      get incorrect line number debugging info.  See for instance
   2247      ecoff_build_lineno, which will end up setting all file->fdr.*
   2248      fields multiple times, resulting in incorrect debug info.  In
   2249      order to make this work right, all line number and symbol info
   2250      for the same source file has to be adjacent in the object file,
   2251      so that a single file descriptor can be used to point to them.
   2252      This would require maintaining file specific lists of line
   2253      numbers and symbols for each file, so that they can be merged
   2254      together (or output together) when two .file pseudo-ops are
   2255      merged into one file descriptor.  */
   2256 
   2257   /* See if the file has already been created.  */
   2258   for (fil_ptr = first_file;
   2259        fil_ptr != (efdr_t *) NULL;
   2260        fil_ptr = fil_ptr->next_file)
   2261     {
   2262       if (first_ch == fil_ptr->name[0]
   2263 	  && filename_cmp (file_name, fil_ptr->name) == 0
   2264 	  && fil_ptr->fdr.fMerge)
   2265 	{
   2266 	  cur_file_ptr = fil_ptr;
   2267 	  if (! fake)
   2268 	    cur_file_ptr->fake = 0;
   2269 	  break;
   2270 	}
   2271     }
   2272 
   2273   /* If this is a new file, create it.  */
   2274   if (fil_ptr == (efdr_t *) NULL)
   2275     {
   2276       if (file_desc.objects_last_page == file_desc.objects_per_page)
   2277 	add_varray_page (&file_desc);
   2278 
   2279       fil_ptr = cur_file_ptr =
   2280 	&file_desc.last->datum->file[file_desc.objects_last_page++];
   2281       *fil_ptr = init_file;
   2282 
   2283       fil_ptr->file_index = current_file_idx++;
   2284       ++file_desc.num_allocated;
   2285 
   2286       fil_ptr->fake = fake;
   2287 
   2288       /* Allocate the string hash table.  */
   2289       fil_ptr->str_hash = str_htab_create ();
   2290 
   2291       /* Make sure 0 byte in string table is null  */
   2292       add_string (&fil_ptr->strings,
   2293 		  fil_ptr->str_hash,
   2294 		  "",
   2295 		  (shash_t **)0);
   2296 
   2297       if (strlen (file_name) > PAGE_USIZE - 2)
   2298 	as_fatal (_("filename goes over one page boundary"));
   2299 
   2300       /* Push the start of the filename. We assume that the filename
   2301          will be stored at string offset 1.  */
   2302       (void) add_ecoff_symbol (file_name, st_File, sc_Text,
   2303 			       (symbolS *) NULL, (bfd_vma) 0,
   2304 			       (symint_t) 0, (symint_t) 0);
   2305       fil_ptr->fdr.rss = 1;
   2306       fil_ptr->name = &fil_ptr->strings.last->datum->byte[1];
   2307 
   2308       /* Update the linked list of file descriptors.  */
   2309       *last_file_ptr = fil_ptr;
   2310       last_file_ptr = &fil_ptr->next_file;
   2311 
   2312       /* Add void & int types to the file (void should be first to catch
   2313          errant 0's within the index fields).  */
   2314       fil_ptr->void_type = add_aux_sym_tir (&void_type_info,
   2315 					    hash_yes,
   2316 					    &cur_file_ptr->thash_head[0]);
   2317 
   2318       fil_ptr->int_type = add_aux_sym_tir (&int_type_info,
   2319 					   hash_yes,
   2320 					   &cur_file_ptr->thash_head[0]);
   2321     }
   2322 }
   2323 
   2324 /* This function is called when the assembler notices a preprocessor
   2325    directive switching to a new file.  This will not happen in
   2326    compiler output, only in hand coded assembler.  */
   2327 
   2328 void
   2329 ecoff_new_file (const char *name)
   2330 {
   2331   if (cur_file_ptr != NULL && filename_cmp (cur_file_ptr->name, name) == 0)
   2332     return;
   2333   add_file (name, 0, 0);
   2334 
   2335   /* This is a hand coded assembler file, so automatically turn on
   2336      debugging information.  */
   2337   if (debug_type == DEBUG_UNSPECIFIED)
   2338     debug_type = DEBUG_ECOFF;
   2339 }
   2340 
   2341 #ifdef ECOFF_DEBUG
   2343 
   2344 /* Convert storage class to string.  */
   2345 
   2346 static char *
   2347 sc_to_string (storage_class)
   2348      sc_t storage_class;
   2349 {
   2350   switch (storage_class)
   2351     {
   2352     case sc_Nil:	 return "Nil,";
   2353     case sc_Text:	 return "Text,";
   2354     case sc_Data:	 return "Data,";
   2355     case sc_Bss:	 return "Bss,";
   2356     case sc_Register:	 return "Register,";
   2357     case sc_Abs:	 return "Abs,";
   2358     case sc_Undefined:	 return "Undefined,";
   2359     case sc_CdbLocal:	 return "CdbLocal,";
   2360     case sc_Bits:	 return "Bits,";
   2361     case sc_CdbSystem:	 return "CdbSystem,";
   2362     case sc_RegImage:	 return "RegImage,";
   2363     case sc_Info:	 return "Info,";
   2364     case sc_UserStruct:	 return "UserStruct,";
   2365     case sc_SData:	 return "SData,";
   2366     case sc_SBss:	 return "SBss,";
   2367     case sc_RData:	 return "RData,";
   2368     case sc_Var:	 return "Var,";
   2369     case sc_Common:	 return "Common,";
   2370     case sc_SCommon:	 return "SCommon,";
   2371     case sc_VarRegister: return "VarRegister,";
   2372     case sc_Variant:	 return "Variant,";
   2373     case sc_SUndefined:	 return "SUndefined,";
   2374     case sc_Init:	 return "Init,";
   2375     case sc_Max:	 return "Max,";
   2376     }
   2377 
   2378   return "???,";
   2379 }
   2380 
   2381 #endif /* DEBUG */
   2382 
   2383 #ifdef ECOFF_DEBUG
   2385 
   2386 /* Convert symbol type to string.  */
   2387 
   2388 static char *
   2389 st_to_string (symbol_type)
   2390      st_t symbol_type;
   2391 {
   2392   switch (symbol_type)
   2393     {
   2394     case st_Nil:	return "Nil,";
   2395     case st_Global:	return "Global,";
   2396     case st_Static:	return "Static,";
   2397     case st_Param:	return "Param,";
   2398     case st_Local:	return "Local,";
   2399     case st_Label:	return "Label,";
   2400     case st_Proc:	return "Proc,";
   2401     case st_Block:	return "Block,";
   2402     case st_End:	return "End,";
   2403     case st_Member:	return "Member,";
   2404     case st_Typedef:	return "Typedef,";
   2405     case st_File:	return "File,";
   2406     case st_RegReloc:	return "RegReloc,";
   2407     case st_Forward:	return "Forward,";
   2408     case st_StaticProc:	return "StaticProc,";
   2409     case st_Constant:	return "Constant,";
   2410     case st_Str:	return "String,";
   2411     case st_Number:	return "Number,";
   2412     case st_Expr:	return "Expr,";
   2413     case st_Type:	return "Type,";
   2414     case st_Max:	return "Max,";
   2415     }
   2416 
   2417   return "???,";
   2418 }
   2419 
   2420 #endif /* DEBUG */
   2421 
   2422 /* Parse .begin directives which have a label as the first argument
   2424    which gives the location of the start of the block.  */
   2425 
   2426 void
   2427 ecoff_directive_begin (int ignore ATTRIBUTE_UNUSED)
   2428 {
   2429   char *name;
   2430   char name_end;
   2431 
   2432   if (cur_file_ptr == (efdr_t *) NULL)
   2433     {
   2434       as_warn (_(".begin directive without a preceding .file directive"));
   2435       demand_empty_rest_of_line ();
   2436       return;
   2437     }
   2438 
   2439   if (cur_proc_ptr == (proc_t *) NULL)
   2440     {
   2441       as_warn (_(".begin directive without a preceding .ent directive"));
   2442       demand_empty_rest_of_line ();
   2443       return;
   2444     }
   2445 
   2446   name_end = get_symbol_name (&name);
   2447 
   2448   (void) add_ecoff_symbol ((const char *) NULL, st_Block, sc_Text,
   2449 			   symbol_find_or_make (name),
   2450 			   (bfd_vma) 0, (symint_t) 0, (symint_t) 0);
   2451 
   2452   (void) restore_line_pointer (name_end);
   2453 
   2454   /* The line number follows, but we don't use it.  */
   2455   (void) get_absolute_expression ();
   2456   demand_empty_rest_of_line ();
   2457 }
   2458 
   2459 /* Parse .bend directives which have a label as the first argument
   2461    which gives the location of the end of the block.  */
   2462 
   2463 void
   2464 ecoff_directive_bend (int ignore ATTRIBUTE_UNUSED)
   2465 {
   2466   char *name;
   2467   char name_end;
   2468   symbolS *endsym;
   2469 
   2470   if (cur_file_ptr == (efdr_t *) NULL)
   2471     {
   2472       as_warn (_(".bend directive without a preceding .file directive"));
   2473       demand_empty_rest_of_line ();
   2474       return;
   2475     }
   2476 
   2477   if (cur_proc_ptr == (proc_t *) NULL)
   2478     {
   2479       as_warn (_(".bend directive without a preceding .ent directive"));
   2480       demand_empty_rest_of_line ();
   2481       return;
   2482     }
   2483 
   2484   name_end = get_symbol_name (&name);
   2485 
   2486   /* The value is the distance between the .bend directive and the
   2487      corresponding symbol.  We fill in the offset when we write out
   2488      the symbol.  */
   2489   endsym = symbol_find (name);
   2490   if (endsym == (symbolS *) NULL)
   2491     as_warn (_(".bend directive names unknown symbol"));
   2492   else
   2493     (void) add_ecoff_symbol ((const char *) NULL, st_End, sc_Text, endsym,
   2494 			     (bfd_vma) 0, (symint_t) 0, (symint_t) 0);
   2495 
   2496   restore_line_pointer (name_end);
   2497 
   2498   /* The line number follows, but we don't use it.  */
   2499   (void) get_absolute_expression ();
   2500   demand_empty_rest_of_line ();
   2501 }
   2502 
   2503 /* COFF debugging information is provided as a series of directives
   2505    (.def, .scl, etc.).  We build up information as we read the
   2506    directives in the following static variables, and file it away when
   2507    we reach the .endef directive.  */
   2508 static char *coff_sym_name;
   2509 static type_info_t coff_type;
   2510 static sc_t coff_storage_class;
   2511 static st_t coff_symbol_typ;
   2512 static int coff_is_function;
   2513 static char *coff_tag;
   2514 static valueT coff_value;
   2515 static symbolS *coff_sym_value;
   2516 static bfd_vma coff_sym_addend;
   2517 static int coff_inside_enumeration;
   2518 
   2519 /* Handle a .def directive: start defining a symbol.  */
   2520 
   2521 void
   2522 ecoff_directive_def (int ignore ATTRIBUTE_UNUSED)
   2523 {
   2524   char *name;
   2525   char name_end;
   2526 
   2527   ecoff_debugging_seen = 1;
   2528 
   2529   SKIP_WHITESPACE ();
   2530 
   2531   name_end = get_symbol_name (&name);
   2532 
   2533   if (coff_sym_name != (char *) NULL)
   2534     as_warn (_(".def pseudo-op used inside of .def/.endef; ignored"));
   2535   else if (*name == '\0')
   2536     as_warn (_("empty symbol name in .def; ignored"));
   2537   else
   2538     {
   2539       free (coff_sym_name);
   2540       free (coff_tag);
   2541 
   2542       coff_sym_name = xstrdup (name);
   2543       coff_type = type_info_init;
   2544       coff_storage_class = sc_Nil;
   2545       coff_symbol_typ = st_Nil;
   2546       coff_is_function = 0;
   2547       coff_tag = (char *) NULL;
   2548       coff_value = 0;
   2549       coff_sym_value = (symbolS *) NULL;
   2550       coff_sym_addend = 0;
   2551     }
   2552 
   2553   restore_line_pointer (name_end);
   2554 
   2555   demand_empty_rest_of_line ();
   2556 }
   2557 
   2558 /* Handle a .dim directive, used to give dimensions for an array.  The
   2559    arguments are comma separated numbers.  mips-tfile assumes that
   2560    there will not be more than 6 dimensions, and gdb won't read any
   2561    more than that anyhow, so I will also make that assumption.  */
   2562 
   2563 void
   2564 ecoff_directive_dim (int ignore ATTRIBUTE_UNUSED)
   2565 {
   2566   int dimens[N_TQ];
   2567   int i;
   2568 
   2569   if (coff_sym_name == (char *) NULL)
   2570     {
   2571       as_warn (_(".dim pseudo-op used outside of .def/.endef; ignored"));
   2572       demand_empty_rest_of_line ();
   2573       return;
   2574     }
   2575 
   2576   for (i = 0; i < N_TQ; i++)
   2577     {
   2578       SKIP_WHITESPACE ();
   2579       dimens[i] = get_absolute_expression ();
   2580       if (*input_line_pointer == ',')
   2581 	++input_line_pointer;
   2582       else
   2583 	{
   2584 	  if (*input_line_pointer != '\n'
   2585 	      && *input_line_pointer != ';')
   2586 	    as_warn (_("badly formed .dim directive"));
   2587 	  break;
   2588 	}
   2589     }
   2590 
   2591   if (i == N_TQ)
   2592     --i;
   2593 
   2594   /* The dimensions are stored away in reverse order.  */
   2595   for (; i >= 0; i--)
   2596     {
   2597       if (coff_type.num_dims >= N_TQ)
   2598 	{
   2599 	  as_warn (_("too many .dim entries"));
   2600 	  break;
   2601 	}
   2602       coff_type.dimensions[coff_type.num_dims] = dimens[i];
   2603       ++coff_type.num_dims;
   2604     }
   2605 
   2606   demand_empty_rest_of_line ();
   2607 }
   2608 
   2609 /* Handle a .scl directive, which sets the COFF storage class of the
   2610    symbol.  */
   2611 
   2612 void
   2613 ecoff_directive_scl (int ignore ATTRIBUTE_UNUSED)
   2614 {
   2615   long val;
   2616 
   2617   if (coff_sym_name == (char *) NULL)
   2618     {
   2619       as_warn (_(".scl pseudo-op used outside of .def/.endef; ignored"));
   2620       demand_empty_rest_of_line ();
   2621       return;
   2622     }
   2623 
   2624   val = get_absolute_expression ();
   2625 
   2626   coff_symbol_typ = map_coff_sym_type[val];
   2627   coff_storage_class = map_coff_storage[val];
   2628 
   2629   demand_empty_rest_of_line ();
   2630 }
   2631 
   2632 /* Handle a .size directive.  For some reason mips-tfile.c thinks that
   2633    .size can have multiple arguments.  We humor it, although gcc will
   2634    never generate more than one argument.  */
   2635 
   2636 void
   2637 ecoff_directive_size (int ignore ATTRIBUTE_UNUSED)
   2638 {
   2639   int sizes[N_TQ];
   2640   int i;
   2641 
   2642   if (coff_sym_name == (char *) NULL)
   2643     {
   2644       as_warn (_(".size pseudo-op used outside of .def/.endef; ignored"));
   2645       demand_empty_rest_of_line ();
   2646       return;
   2647     }
   2648 
   2649   for (i = 0; i < N_TQ; i++)
   2650     {
   2651       SKIP_WHITESPACE ();
   2652       sizes[i] = get_absolute_expression ();
   2653       if (*input_line_pointer == ',')
   2654 	++input_line_pointer;
   2655       else
   2656 	{
   2657 	  if (*input_line_pointer != '\n'
   2658 	      && *input_line_pointer != ';')
   2659 	    as_warn (_("badly formed .size directive"));
   2660 	  break;
   2661 	}
   2662     }
   2663 
   2664   if (i == N_TQ)
   2665     --i;
   2666 
   2667   /* The sizes are stored away in reverse order.  */
   2668   for (; i >= 0; i--)
   2669     {
   2670       if (coff_type.num_sizes >= N_TQ)
   2671 	{
   2672 	  as_warn (_("too many .size entries"));
   2673 	  break;
   2674 	}
   2675       coff_type.sizes[coff_type.num_sizes] = sizes[i];
   2676       ++coff_type.num_sizes;
   2677     }
   2678 
   2679   demand_empty_rest_of_line ();
   2680 }
   2681 
   2682 /* Handle the .type directive, which gives the COFF type of the
   2683    symbol.  */
   2684 
   2685 void
   2686 ecoff_directive_type (int ignore ATTRIBUTE_UNUSED)
   2687 {
   2688   long val;
   2689   tq_t *tq_ptr;
   2690   tq_t *tq_shft;
   2691 
   2692   if (coff_sym_name == (char *) NULL)
   2693     {
   2694       as_warn (_(".type pseudo-op used outside of .def/.endef; ignored"));
   2695       demand_empty_rest_of_line ();
   2696       return;
   2697     }
   2698 
   2699   val = get_absolute_expression ();
   2700 
   2701   coff_type.orig_type = BTYPE (val);
   2702   coff_type.basic_type = map_coff_types[coff_type.orig_type];
   2703 
   2704   tq_ptr = &coff_type.type_qualifiers[N_TQ];
   2705   while (val & ~N_BTMASK)
   2706     {
   2707       if (tq_ptr == &coff_type.type_qualifiers[0])
   2708 	{
   2709 	  /* FIXME: We could handle this by setting the continued bit.
   2710 	     There would still be a limit: the .type argument can not
   2711 	     be infinite.  */
   2712 	  as_warn (_("the type of %s is too complex; it will be simplified"),
   2713 		   coff_sym_name);
   2714 	  break;
   2715 	}
   2716       if (ISPTR (val))
   2717 	*--tq_ptr = tq_Ptr;
   2718       else if (ISFCN (val))
   2719 	*--tq_ptr = tq_Proc;
   2720       else if (ISARY (val))
   2721 	*--tq_ptr = tq_Array;
   2722       else
   2723 	as_fatal (_("Unrecognized .type argument"));
   2724 
   2725       val = DECREF (val);
   2726     }
   2727 
   2728   tq_shft = &coff_type.type_qualifiers[0];
   2729   while (tq_ptr != &coff_type.type_qualifiers[N_TQ])
   2730     *tq_shft++ = *tq_ptr++;
   2731 
   2732   if (tq_shft != &coff_type.type_qualifiers[0] && tq_shft[-1] == tq_Proc)
   2733     {
   2734       /* If this is a function, ignore it, so that we don't get two
   2735          entries (one from the .ent, and one for the .def that
   2736          precedes it).  Save the type information so that the end
   2737          block can properly add it after the begin block index.  For
   2738          MIPS knows what reason, we must strip off the function type
   2739          at this point.  */
   2740       coff_is_function = 1;
   2741       tq_shft[-1] = tq_Nil;
   2742     }
   2743 
   2744   while (tq_shft != &coff_type.type_qualifiers[N_TQ])
   2745     *tq_shft++ = tq_Nil;
   2746 
   2747   demand_empty_rest_of_line ();
   2748 }
   2749 
   2750 /* Handle the .tag directive, which gives the name of a structure,
   2751    union or enum.  */
   2752 
   2753 void
   2754 ecoff_directive_tag (int ignore ATTRIBUTE_UNUSED)
   2755 {
   2756   char *name;
   2757   char name_end;
   2758 
   2759   if (coff_sym_name == (char *) NULL)
   2760     {
   2761       as_warn (_(".tag pseudo-op used outside of .def/.endef; ignored"));
   2762       demand_empty_rest_of_line ();
   2763       return;
   2764     }
   2765 
   2766   name_end = get_symbol_name (&name);
   2767 
   2768   coff_tag = xstrdup (name);
   2769 
   2770   (void) restore_line_pointer (name_end);
   2771 
   2772   demand_empty_rest_of_line ();
   2773 }
   2774 
   2775 /* Handle the .val directive, which gives the value of the symbol.  It
   2776    may be the name of a static or global symbol.  */
   2777 
   2778 void
   2779 ecoff_directive_val (int ignore ATTRIBUTE_UNUSED)
   2780 {
   2781   expressionS exp;
   2782 
   2783   if (coff_sym_name == (char *) NULL)
   2784     {
   2785       as_warn (_(".val pseudo-op used outside of .def/.endef; ignored"));
   2786       demand_empty_rest_of_line ();
   2787       return;
   2788     }
   2789 
   2790   expression (&exp);
   2791   if (exp.X_op != O_constant && exp.X_op != O_symbol)
   2792     {
   2793       as_bad (_(".val expression is too complex"));
   2794       demand_empty_rest_of_line ();
   2795       return;
   2796     }
   2797 
   2798   if (exp.X_op == O_constant)
   2799     coff_value = exp.X_add_number;
   2800   else
   2801     {
   2802       coff_sym_value = exp.X_add_symbol;
   2803       coff_sym_addend = exp.X_add_number;
   2804     }
   2805 
   2806   demand_empty_rest_of_line ();
   2807 }
   2808 
   2809 /* Handle the .endef directive, which terminates processing of COFF
   2810    debugging information for a symbol.  */
   2811 
   2812 void
   2813 ecoff_directive_endef (int ignore ATTRIBUTE_UNUSED)
   2814 {
   2815   char *name;
   2816   symint_t indx;
   2817   localsym_t *sym;
   2818 
   2819   demand_empty_rest_of_line ();
   2820 
   2821   if (coff_sym_name == (char *) NULL)
   2822     {
   2823       as_warn (_(".endef pseudo-op used before .def; ignored"));
   2824       return;
   2825     }
   2826 
   2827   name = coff_sym_name;
   2828   coff_sym_name = (char *) NULL;
   2829 
   2830   /* If the symbol is a static or external, we have already gotten the
   2831      appropriate type and class, so make sure we don't override those
   2832      values.  This is needed because there are some type and classes
   2833      that are not in COFF, such as short data, etc.  */
   2834   if (coff_sym_value != (symbolS *) NULL)
   2835     {
   2836       coff_symbol_typ = st_Nil;
   2837       coff_storage_class = sc_Nil;
   2838     }
   2839 
   2840   coff_type.extra_sizes = coff_tag != (char *) NULL;
   2841   if (coff_type.num_dims > 0)
   2842     {
   2843       int diff = coff_type.num_dims - coff_type.num_sizes;
   2844       int i = coff_type.num_dims - 1;
   2845       int j;
   2846 
   2847       if (coff_type.num_sizes != 1 || diff < 0)
   2848 	{
   2849 	  as_warn (_("bad COFF debugging information"));
   2850 	  return;
   2851 	}
   2852 
   2853       /* If this is an array, make sure the same number of dimensions
   2854          and sizes were passed, creating extra sizes for multiply
   2855          dimensioned arrays if not passed.  */
   2856       coff_type.extra_sizes = 0;
   2857       if (diff)
   2858 	{
   2859 	  j = (sizeof (coff_type.sizes) / sizeof (coff_type.sizes[0])) - 1;
   2860 	  while (j >= 0)
   2861 	    {
   2862 	      coff_type.sizes[j] = (((j - diff) >= 0)
   2863 				    ? coff_type.sizes[j - diff]
   2864 				    : 0);
   2865 	      j--;
   2866 	    }
   2867 
   2868 	  coff_type.num_sizes = i + 1;
   2869 	  for (i--; i >= 0; i--)
   2870 	    coff_type.sizes[i] = (coff_type.dimensions[i + 1] == 0
   2871 				  ? 0
   2872 				  : (coff_type.sizes[i + 1]
   2873 				     / coff_type.dimensions[i + 1]));
   2874 	}
   2875     }
   2876   else if (coff_symbol_typ == st_Member
   2877 	   && coff_type.num_sizes - coff_type.extra_sizes == 1)
   2878     {
   2879       /* Is this a bitfield?  This is indicated by a structure member
   2880          having a size field that isn't an array.  */
   2881       coff_type.bitfield = 1;
   2882     }
   2883 
   2884   /* Except for enumeration members & begin/ending of scopes, put the
   2885      type word in the aux. symbol table.  */
   2886   if (coff_symbol_typ == st_Block || coff_symbol_typ == st_End)
   2887     indx = 0;
   2888   else if (coff_inside_enumeration)
   2889     indx = cur_file_ptr->void_type;
   2890   else
   2891     {
   2892       if (coff_type.basic_type == bt_Struct
   2893 	  || coff_type.basic_type == bt_Union
   2894 	  || coff_type.basic_type == bt_Enum)
   2895 	{
   2896 	  if (coff_tag == (char *) NULL)
   2897 	    {
   2898 	      as_warn (_("no tag specified for %s"), name);
   2899 	      return;
   2900 	    }
   2901 
   2902 	  coff_type.tag_ptr = get_tag (coff_tag, (localsym_t *) NULL,
   2903 				       coff_type.basic_type);
   2904 	}
   2905 
   2906       if (coff_is_function)
   2907 	{
   2908 	  last_func_type_info = coff_type;
   2909 	  last_func_sym_value = coff_sym_value;
   2910 	  return;
   2911 	}
   2912 
   2913       indx = add_aux_sym_tir (&coff_type,
   2914 			      hash_yes,
   2915 			      &cur_file_ptr->thash_head[0]);
   2916     }
   2917 
   2918   /* Do any last minute adjustments that are necessary.  */
   2919   switch (coff_symbol_typ)
   2920     {
   2921     default:
   2922       break;
   2923 
   2924       /* For the beginning of structs, unions, and enumerations, the
   2925          size info needs to be passed in the value field.  */
   2926     case st_Block:
   2927       if (coff_type.num_sizes - coff_type.num_dims - coff_type.extra_sizes
   2928 	  != 1)
   2929 	{
   2930 	  as_warn (_("bad COFF debugging information"));
   2931 	  return;
   2932 	}
   2933       else
   2934 	coff_value = coff_type.sizes[0];
   2935 
   2936       coff_inside_enumeration = (coff_type.orig_type == T_ENUM);
   2937       break;
   2938 
   2939       /* For the end of structs, unions, and enumerations, omit the
   2940          name which is always ".eos".  This needs to be done last, so
   2941          that any error reporting above gives the correct name.  */
   2942     case st_End:
   2943       free (name);
   2944       name = (char *) NULL;
   2945       coff_value = 0;
   2946       coff_inside_enumeration = 0;
   2947       break;
   2948 
   2949       /* Members of structures and unions that aren't bitfields, need
   2950          to adjust the value from a byte offset to a bit offset.
   2951          Members of enumerations do not have the value adjusted, and
   2952          can be distinguished by indx == indexNil.  For enumerations,
   2953          update the maximum enumeration value.  */
   2954     case st_Member:
   2955       if (! coff_type.bitfield && ! coff_inside_enumeration)
   2956 	coff_value *= 8;
   2957 
   2958       break;
   2959     }
   2960 
   2961   /* Add the symbol.  */
   2962   sym = add_ecoff_symbol (name,
   2963 			  coff_symbol_typ,
   2964 			  coff_storage_class,
   2965 			  coff_sym_value,
   2966 			  coff_sym_addend,
   2967 			  (symint_t) coff_value,
   2968 			  indx);
   2969 
   2970   /* deal with struct, union, and enum tags.  */
   2971   if (coff_symbol_typ == st_Block)
   2972     {
   2973       /* Create or update the tag information.  */
   2974       tag_t *tag_ptr = get_tag (name,
   2975 				sym,
   2976 				coff_type.basic_type);
   2977       forward_t **pf;
   2978 
   2979       /* Remember any forward references.  */
   2980       for (pf = &sym->forward_ref;
   2981 	   *pf != (forward_t *) NULL;
   2982 	   pf = &(*pf)->next)
   2983 	;
   2984       *pf = tag_ptr->forward_ref;
   2985       tag_ptr->forward_ref = (forward_t *) NULL;
   2986     }
   2987 }
   2988 
   2989 /* Parse .end directives.  */
   2991 
   2992 void
   2993 ecoff_directive_end (int ignore ATTRIBUTE_UNUSED)
   2994 {
   2995   char *name;
   2996   char name_end;
   2997   symbolS *ent;
   2998 
   2999   if (cur_file_ptr == (efdr_t *) NULL)
   3000     {
   3001       as_warn (_(".end directive without a preceding .file directive"));
   3002       demand_empty_rest_of_line ();
   3003       return;
   3004     }
   3005 
   3006   if (cur_proc_ptr == (proc_t *) NULL)
   3007     {
   3008       as_warn (_(".end directive without a preceding .ent directive"));
   3009       demand_empty_rest_of_line ();
   3010       return;
   3011     }
   3012 
   3013   name_end = get_symbol_name (&name);
   3014 
   3015   if (name == input_line_pointer)
   3016     {
   3017       as_warn (_(".end directive has no name"));
   3018       (void) restore_line_pointer (name_end);
   3019       demand_empty_rest_of_line ();
   3020       return;
   3021     }
   3022 
   3023   /* The value is the distance between the .end directive and the
   3024      corresponding symbol.  We create a fake symbol to hold the
   3025      current location, and put in the offset when we write out the
   3026      symbol.  */
   3027   ent = symbol_find (name);
   3028   if (ent == (symbolS *) NULL)
   3029     as_warn (_(".end directive names unknown symbol"));
   3030   else
   3031     (void) add_ecoff_symbol ((const char *) NULL, st_End, sc_Text,
   3032 			     symbol_new (FAKE_LABEL_NAME, now_seg,
   3033 					 frag_now, frag_now_fix ()),
   3034 			     (bfd_vma) 0, (symint_t) 0, (symint_t) 0);
   3035 
   3036 #ifdef md_flush_pending_output
   3037   md_flush_pending_output ();
   3038 #endif
   3039 
   3040   cur_proc_ptr = (proc_t *) NULL;
   3041 
   3042   (void) restore_line_pointer (name_end);
   3043   demand_empty_rest_of_line ();
   3044 }
   3045 
   3046 /* Parse .ent directives.  */
   3048 
   3049 void
   3050 ecoff_directive_ent (int aent)
   3051 {
   3052   char *name;
   3053   char name_end;
   3054 
   3055   if (cur_file_ptr == (efdr_t *) NULL)
   3056     add_file ((const char *) NULL, 0, 1);
   3057 
   3058   if (!aent && cur_proc_ptr != (proc_t *) NULL)
   3059     {
   3060       as_warn (_("second .ent directive found before .end directive"));
   3061       demand_empty_rest_of_line ();
   3062       return;
   3063     }
   3064 
   3065   name_end = get_symbol_name (&name);
   3066 
   3067   if (name == input_line_pointer)
   3068     {
   3069       as_warn (_("%s directive has no name"), aent ? ".aent" : ".ent");
   3070       (void) restore_line_pointer (name_end);
   3071       demand_empty_rest_of_line ();
   3072       return;
   3073     }
   3074 
   3075   add_procedure (name, aent);
   3076 
   3077   (void) restore_line_pointer (name_end);
   3078 
   3079   /* The .ent directive is sometimes followed by a number.  I'm not
   3080      really sure what the number means.  I don't see any way to store
   3081      the information in the PDR.  The Irix 4 assembler seems to ignore
   3082      the information.  */
   3083   SKIP_WHITESPACE ();
   3084   if (*input_line_pointer == ',')
   3085     {
   3086       ++input_line_pointer;
   3087       SKIP_WHITESPACE ();
   3088     }
   3089   if (ISDIGIT (*input_line_pointer)
   3090       || *input_line_pointer == '-')
   3091     (void) get_absolute_expression ();
   3092 
   3093   demand_empty_rest_of_line ();
   3094 }
   3095 
   3096 /* Parse .extern directives.  */
   3098 
   3099 void
   3100 ecoff_directive_extern (int ignore ATTRIBUTE_UNUSED)
   3101 {
   3102   char *name;
   3103   int c;
   3104   symbolS *symbolp;
   3105   valueT size;
   3106 
   3107   c = get_symbol_name (&name);
   3108   symbolp = symbol_find_or_make (name);
   3109   (void) restore_line_pointer (c);
   3110 
   3111   S_SET_EXTERNAL (symbolp);
   3112 
   3113   if (*input_line_pointer == ',')
   3114     ++input_line_pointer;
   3115   size = get_absolute_expression ();
   3116 
   3117   symbol_get_obj (symbolp)->ecoff_extern_size = size;
   3118 }
   3119 
   3120 /* Parse .file directives.  */
   3122 
   3123 void
   3124 ecoff_directive_file (int ignore ATTRIBUTE_UNUSED)
   3125 {
   3126   int indx;
   3127   char *name;
   3128   int len;
   3129 
   3130   if (cur_proc_ptr != (proc_t *) NULL)
   3131     {
   3132       as_warn (_("no way to handle .file within .ent/.end section"));
   3133       demand_empty_rest_of_line ();
   3134       return;
   3135     }
   3136 
   3137   indx = (int) get_absolute_expression ();
   3138 
   3139   /* FIXME: we don't have to save the name here.  */
   3140   name = demand_copy_C_string (&len);
   3141 
   3142   add_file (name, indx - 1, 0);
   3143 
   3144   demand_empty_rest_of_line ();
   3145 }
   3146 
   3147 /* Parse .fmask directives.  */
   3149 
   3150 void
   3151 ecoff_directive_fmask (int ignore ATTRIBUTE_UNUSED)
   3152 {
   3153   long val;
   3154 
   3155   if (cur_proc_ptr == (proc_t *) NULL)
   3156     {
   3157       as_warn (_(".fmask outside of .ent"));
   3158       demand_empty_rest_of_line ();
   3159       return;
   3160     }
   3161 
   3162   if (get_absolute_expression_and_terminator (&val) != ',')
   3163     {
   3164       as_warn (_("bad .fmask directive"));
   3165       --input_line_pointer;
   3166       demand_empty_rest_of_line ();
   3167       return;
   3168     }
   3169 
   3170   cur_proc_ptr->pdr.fregmask = val;
   3171   cur_proc_ptr->pdr.fregoffset = get_absolute_expression ();
   3172 
   3173   demand_empty_rest_of_line ();
   3174 }
   3175 
   3176 /* Parse .frame directives.  */
   3178 
   3179 void
   3180 ecoff_directive_frame (int ignore ATTRIBUTE_UNUSED)
   3181 {
   3182   long val;
   3183 
   3184   if (cur_proc_ptr == (proc_t *) NULL)
   3185     {
   3186       as_warn (_(".frame outside of .ent"));
   3187       demand_empty_rest_of_line ();
   3188       return;
   3189     }
   3190 
   3191   cur_proc_ptr->pdr.framereg = tc_get_register (1);
   3192 
   3193   SKIP_WHITESPACE ();
   3194   if (*input_line_pointer++ != ','
   3195       || get_absolute_expression_and_terminator (&val) != ',')
   3196     {
   3197       as_warn (_("bad .frame directive"));
   3198       --input_line_pointer;
   3199       demand_empty_rest_of_line ();
   3200       return;
   3201     }
   3202 
   3203   cur_proc_ptr->pdr.frameoffset = val;
   3204 
   3205   cur_proc_ptr->pdr.pcreg = tc_get_register (0);
   3206 
   3207   /* Alpha-OSF1 adds "the offset of saved $a0 from $sp", according to
   3208      Sandro.  I don't yet know where this value should be stored, if
   3209      anywhere.  Don't call demand_empty_rest_of_line ().  */
   3210   s_ignore (42);
   3211 }
   3212 
   3213 /* Parse .mask directives.  */
   3215 
   3216 void
   3217 ecoff_directive_mask (int ignore ATTRIBUTE_UNUSED)
   3218 {
   3219   long val;
   3220 
   3221   if (cur_proc_ptr == (proc_t *) NULL)
   3222     {
   3223       as_warn (_(".mask outside of .ent"));
   3224       demand_empty_rest_of_line ();
   3225       return;
   3226     }
   3227 
   3228   if (get_absolute_expression_and_terminator (&val) != ',')
   3229     {
   3230       as_warn (_("bad .mask directive"));
   3231       --input_line_pointer;
   3232       demand_empty_rest_of_line ();
   3233       return;
   3234     }
   3235 
   3236   cur_proc_ptr->pdr.regmask = val;
   3237   cur_proc_ptr->pdr.regoffset = get_absolute_expression ();
   3238 
   3239   demand_empty_rest_of_line ();
   3240 }
   3241 
   3242 /* Parse .loc directives.  */
   3244 
   3245 void
   3246 ecoff_directive_loc (int ignore ATTRIBUTE_UNUSED)
   3247 {
   3248   lineno_list_t *list;
   3249   symint_t lineno;
   3250 
   3251   if (cur_file_ptr == (efdr_t *) NULL)
   3252     {
   3253       as_warn (_(".loc before .file"));
   3254       demand_empty_rest_of_line ();
   3255       return;
   3256     }
   3257 
   3258   if (now_seg != text_section)
   3259     {
   3260       as_warn (_(".loc outside of .text"));
   3261       demand_empty_rest_of_line ();
   3262       return;
   3263     }
   3264 
   3265   /* Skip the file number.  */
   3266   SKIP_WHITESPACE ();
   3267   get_absolute_expression ();
   3268   SKIP_WHITESPACE ();
   3269 
   3270   lineno = get_absolute_expression ();
   3271 
   3272 #ifndef NO_LISTING
   3273   if (listing)
   3274     listing_source_line (lineno);
   3275 #endif
   3276 
   3277   /* If we're building stabs, then output a special label rather than
   3278      ECOFF line number info.  */
   3279   if (stabs_seen)
   3280     {
   3281       (void) add_ecoff_symbol ((char *) NULL, st_Label, sc_Text,
   3282 			       symbol_new (FAKE_LABEL_NAME, now_seg,
   3283 					   frag_now, frag_now_fix ()),
   3284 			       (bfd_vma) 0, 0, lineno);
   3285       return;
   3286     }
   3287 
   3288   list = allocate_lineno_list ();
   3289 
   3290   list->next = (lineno_list_t *) NULL;
   3291   list->file = cur_file_ptr;
   3292   list->proc = cur_proc_ptr;
   3293   list->frag = frag_now;
   3294   list->paddr = frag_now_fix ();
   3295   list->lineno = lineno;
   3296 
   3297   /* We don't want to merge files which have line numbers.  */
   3298   cur_file_ptr->fdr.fMerge = 0;
   3299 
   3300   /* A .loc directive will sometimes appear before a .ent directive,
   3301      which means that cur_proc_ptr will be NULL here.  Arrange to
   3302      patch this up.  */
   3303   if (cur_proc_ptr == (proc_t *) NULL)
   3304     {
   3305       lineno_list_t **pl;
   3306 
   3307       pl = &noproc_lineno;
   3308       while (*pl != (lineno_list_t *) NULL)
   3309 	pl = &(*pl)->next;
   3310       *pl = list;
   3311     }
   3312   else
   3313     {
   3314       last_lineno = list;
   3315       *last_lineno_ptr = list;
   3316       last_lineno_ptr = &list->next;
   3317     }
   3318 }
   3319 
   3320 /* The MIPS assembler sometimes inserts nop instructions in the
   3321    instruction stream.  When this happens, we must patch up the .loc
   3322    information so that it points to the instruction after the nop.  */
   3323 
   3324 void
   3325 ecoff_fix_loc (fragS *old_frag, unsigned long old_frag_offset)
   3326 {
   3327   if (last_lineno != NULL
   3328       && last_lineno->frag == old_frag
   3329       && last_lineno->paddr == old_frag_offset)
   3330     {
   3331       last_lineno->frag = frag_now;
   3332       last_lineno->paddr = frag_now_fix ();
   3333     }
   3334 }
   3335 
   3336 /* Make sure the @stabs symbol is emitted.  */
   3338 
   3339 static void
   3340 mark_stabs (int ignore ATTRIBUTE_UNUSED)
   3341 {
   3342   if (! stabs_seen)
   3343     {
   3344       /* Add a dummy @stabs symbol.  */
   3345       stabs_seen = 1;
   3346       (void) add_ecoff_symbol (stabs_symbol, st_Nil, sc_Info,
   3347 			       (symbolS *) NULL,
   3348 			       (bfd_vma) 0, (symint_t) -1,
   3349 			       ECOFF_MARK_STAB (0));
   3350     }
   3351 }
   3352 
   3353 /* Parse .weakext directives.  */
   3355 #ifndef TC_MIPS
   3356 /* For TC_MIPS use the version in tc-mips.c.  */
   3357 void
   3358 ecoff_directive_weakext (int ignore ATTRIBUTE_UNUSED)
   3359 {
   3360   char *name;
   3361   int c;
   3362   symbolS *symbolP;
   3363   expressionS exp;
   3364 
   3365   c = get_symbol_name (&name);
   3366   symbolP = symbol_find_or_make (name);
   3367   (void) restore_line_pointer (c);
   3368 
   3369   SKIP_WHITESPACE ();
   3370 
   3371   if (*input_line_pointer == ',')
   3372     {
   3373       if (S_IS_DEFINED (symbolP))
   3374 	{
   3375 	  as_bad (_("symbol `%s' is already defined"),
   3376 		  S_GET_NAME (symbolP));
   3377 	  ignore_rest_of_line ();
   3378 	  return;
   3379 	}
   3380 
   3381       ++input_line_pointer;
   3382       SKIP_WHITESPACE ();
   3383       if (! is_end_of_line[(unsigned char) *input_line_pointer])
   3384 	{
   3385 	  expression (&exp);
   3386 	  if (exp.X_op != O_symbol)
   3387 	    {
   3388 	      as_bad (_("bad .weakext directive"));
   3389 	      ignore_rest_of_line ();
   3390 	      return;
   3391 	    }
   3392 	  symbol_set_value_expression (symbolP, &exp);
   3393 	}
   3394     }
   3395 
   3396   S_SET_WEAK (symbolP);
   3397 
   3398   demand_empty_rest_of_line ();
   3399 }
   3400 #endif /* not TC_MIPS */
   3401 
   3402 /* Handle .stabs directives.  The actual parsing routine is done by a
   3404    generic routine.  This routine is called via OBJ_PROCESS_STAB.
   3405    When this is called, input_line_pointer will be pointing at the
   3406    value field of the stab.
   3407 
   3408    .stabs directives have five fields:
   3409 	"string"	a string, encoding the type information.
   3410 	code		a numeric code, defined in <stab.h>
   3411 	0		a zero
   3412 	desc		a zero or line number
   3413 	value		a numeric value or an address.
   3414 
   3415     If the value is relocatable, we transform this into:
   3416 	iss		points as an index into string space
   3417 	value		value from lookup of the name
   3418 	st		st from lookup of the name
   3419 	sc		sc from lookup of the name
   3420 	index		code|CODE_MASK
   3421 
   3422     If the value is not relocatable, we transform this into:
   3423 	iss		points as an index into string space
   3424 	value		value
   3425 	st		st_Nil
   3426 	sc		sc_Nil
   3427 	index		code|CODE_MASK
   3428 
   3429     .stabn directives have four fields (string is null):
   3430 	code		a numeric code, defined in <stab.h>
   3431 	0		a zero
   3432 	desc		a zero or a line number
   3433 	value		a numeric value or an address.  */
   3434 
   3435 void
   3436 ecoff_stab (segT sec ATTRIBUTE_UNUSED,
   3437 	    int what,
   3438 	    const char *string,
   3439 	    int type,
   3440 	    int other,
   3441 	    int desc)
   3442 {
   3443   efdr_t *save_file_ptr = cur_file_ptr;
   3444   symbolS *sym;
   3445   symint_t value;
   3446   bfd_vma addend;
   3447   st_t st;
   3448   sc_t sc;
   3449   symint_t indx;
   3450   localsym_t *hold = NULL;
   3451 
   3452   ecoff_debugging_seen = 1;
   3453 
   3454   /* We don't handle .stabd.  */
   3455   if (what != 's' && what != 'n')
   3456     {
   3457       as_bad (_(".stab%c is not supported"), what);
   3458       return;
   3459     }
   3460 
   3461   /* A .stabn uses a null name, not an empty string.  */
   3462   if (what == 'n')
   3463     string = NULL;
   3464 
   3465   /* We ignore the other field.  */
   3466   if (other != 0)
   3467     as_warn (_(".stab%c: ignoring non-zero other field"), what);
   3468 
   3469   /* Make sure we have a current file.  */
   3470   if (cur_file_ptr == (efdr_t *) NULL)
   3471     {
   3472       add_file ((const char *) NULL, 0, 1);
   3473       save_file_ptr = cur_file_ptr;
   3474     }
   3475 
   3476   /* For stabs in ECOFF, the first symbol must be @stabs.  This is a
   3477      signal to gdb.  */
   3478   if (stabs_seen == 0)
   3479     mark_stabs (0);
   3480 
   3481   /* Line number stabs are handled differently, since they have two
   3482      values, the line number and the address of the label.  We use the
   3483      index field (aka desc) to hold the line number, and the value
   3484      field to hold the address.  The symbol type is st_Label, which
   3485      should be different from the other stabs, so that gdb can
   3486      recognize it.  */
   3487   if (type == N_SLINE)
   3488     {
   3489       SYMR dummy_symr;
   3490       char *name;
   3491       char name_end;
   3492 
   3493 #ifndef NO_LISTING
   3494       if (listing)
   3495 	listing_source_line ((unsigned int) desc);
   3496 #endif
   3497 
   3498       dummy_symr.index = desc;
   3499       if (dummy_symr.index != desc)
   3500 	{
   3501 	  as_warn (_("line number (%d) for .stab%c directive cannot fit in index field (20 bits)"),
   3502 		   desc, what);
   3503 	  return;
   3504 	}
   3505 
   3506       name_end = get_symbol_name (&name);
   3507       sym = symbol_find_or_make (name);
   3508       (void) restore_line_pointer (name_end);
   3509 
   3510       value = 0;
   3511       addend = 0;
   3512       st = st_Label;
   3513       sc = sc_Text;
   3514       indx = desc;
   3515     }
   3516   else
   3517     {
   3518 #ifndef NO_LISTING
   3519       if (listing && (type == N_SO || type == N_SOL))
   3520 	listing_source_file (string);
   3521 #endif
   3522 
   3523       if (ISDIGIT (*input_line_pointer)
   3524 	  || *input_line_pointer == '-'
   3525 	  || *input_line_pointer == '+')
   3526 	{
   3527 	  st = st_Nil;
   3528 	  sc = sc_Nil;
   3529 	  sym = (symbolS *) NULL;
   3530 	  value = get_absolute_expression ();
   3531 	  addend = 0;
   3532 	}
   3533       else if (! is_name_beginner ((unsigned char) *input_line_pointer))
   3534 	{
   3535 	  as_warn (_("illegal .stab%c directive, bad character"), what);
   3536 	  return;
   3537 	}
   3538       else
   3539 	{
   3540 	  expressionS exp;
   3541 
   3542 	  sc = sc_Nil;
   3543 	  st = st_Nil;
   3544 
   3545 	  expression (&exp);
   3546 	  if (exp.X_op == O_constant)
   3547 	    {
   3548 	      sym = NULL;
   3549 	      value = exp.X_add_number;
   3550 	      addend = 0;
   3551 	    }
   3552 	  else if (exp.X_op == O_symbol)
   3553 	    {
   3554 	      sym = exp.X_add_symbol;
   3555 	      value = 0;
   3556 	      addend = exp.X_add_number;
   3557 	    }
   3558 	  else
   3559 	    {
   3560 	      sym = make_expr_symbol (&exp);
   3561 	      value = 0;
   3562 	      addend = 0;
   3563 	    }
   3564 	}
   3565 
   3566       indx = ECOFF_MARK_STAB (type);
   3567     }
   3568 
   3569   /* Don't store the stabs symbol we are creating as the type of the
   3570      ECOFF symbol.  We want to compute the type of the ECOFF symbol
   3571      independently.  */
   3572   if (sym != (symbolS *) NULL)
   3573     hold = symbol_get_obj (sym)->ecoff_symbol;
   3574 
   3575   (void) add_ecoff_symbol (string, st, sc, sym, addend, value, indx);
   3576 
   3577   if (sym != (symbolS *) NULL)
   3578     symbol_get_obj (sym)->ecoff_symbol = hold;
   3579 
   3580   /* Restore normal file type.  */
   3581   cur_file_ptr = save_file_ptr;
   3582 }
   3583 
   3584 static asection ecoff_scom_section;
   3586 static const asymbol ecoff_scom_symbol =
   3587   GLOBAL_SYM_INIT (SCOMMON, &ecoff_scom_section);
   3588 static asection ecoff_scom_section =
   3589   BFD_FAKE_SECTION (ecoff_scom_section, &ecoff_scom_symbol,
   3590 		    SCOMMON, 0, SEC_IS_COMMON | SEC_SMALL_DATA);
   3591 
   3592 /* Frob an ECOFF symbol.  Small common symbols go into a special
   3593    .scommon section rather than bfd_com_section.  */
   3594 
   3595 void
   3596 ecoff_frob_symbol (symbolS *sym)
   3597 {
   3598   if (S_IS_COMMON (sym)
   3599       && S_GET_VALUE (sym) > 0
   3600       && S_GET_VALUE (sym) <= bfd_get_gp_size (stdoutput))
   3601     {
   3602       S_SET_SEGMENT (sym, &ecoff_scom_section);
   3603     }
   3604 
   3605   /* Double check weak symbols.  */
   3606   if (S_IS_WEAK (sym))
   3607     {
   3608       if (S_IS_COMMON (sym))
   3609 	as_bad (_("symbol `%s' can not be both weak and common"),
   3610 		S_GET_NAME (sym));
   3611     }
   3612 }
   3613 
   3614 /* Add bytes to the symbolic information buffer.  */
   3616 
   3617 static char *
   3618 ecoff_add_bytes (char **buf,
   3619 		 char **bufend,
   3620 		 char *bufptr,
   3621 		 unsigned long need)
   3622 {
   3623   unsigned long at;
   3624   unsigned long want;
   3625 
   3626   at = bufptr - *buf;
   3627   need -= *bufend - bufptr;
   3628   if (need < PAGE_SIZE)
   3629     need = PAGE_SIZE;
   3630   want = (*bufend - *buf) + need;
   3631   *buf = XRESIZEVEC (char, *buf, want);
   3632   *bufend = *buf + want;
   3633   return *buf + at;
   3634 }
   3635 
   3636 /* Adjust the symbolic information buffer to the alignment required
   3637    for the ECOFF target debugging information.  */
   3638 
   3639 static unsigned long
   3640 ecoff_padding_adjust (const struct ecoff_debug_swap *backend,
   3641 		      char **buf,
   3642 		      char **bufend,
   3643 		      unsigned long offset,
   3644 		      char **bufptrptr)
   3645 {
   3646   bfd_size_type align;
   3647 
   3648   align = backend->debug_align;
   3649   if ((offset & (align - 1)) != 0)
   3650     {
   3651       unsigned long add;
   3652 
   3653       add = align - (offset & (align - 1));
   3654       if ((unsigned long) (*bufend - (*buf + offset)) < add)
   3655 	(void) ecoff_add_bytes (buf, bufend, *buf + offset, add);
   3656       memset (*buf + offset, 0, add);
   3657       offset += add;
   3658       if (bufptrptr != (char **) NULL)
   3659 	*bufptrptr = *buf + offset;
   3660     }
   3661 
   3662   return offset;
   3663 }
   3664 
   3665 /* Build the line number information.  */
   3666 
   3667 static unsigned long
   3668 ecoff_build_lineno (const struct ecoff_debug_swap *backend,
   3669 		    char **buf,
   3670 		    char **bufend,
   3671 		    unsigned long offset,
   3672 		    long *linecntptr)
   3673 {
   3674   char *bufptr;
   3675   lineno_list_t *l;
   3676   lineno_list_t *last;
   3677   efdr_t *file;
   3678   proc_t *proc;
   3679   unsigned long c;
   3680   long iline;
   3681   long totcount;
   3682   lineno_list_t first;
   3683   lineno_list_t *local_first_lineno = first_lineno;
   3684 
   3685   if (linecntptr != (long *) NULL)
   3686     *linecntptr = 0;
   3687 
   3688   bufptr = *buf + offset;
   3689 
   3690   file = (efdr_t *) NULL;
   3691   proc = (proc_t *) NULL;
   3692   last = (lineno_list_t *) NULL;
   3693   c = offset;
   3694   iline = 0;
   3695   totcount = 0;
   3696 
   3697   /* FIXME?  Now that MIPS embedded-PIC is gone, it may be safe to
   3698      remove this code.  */
   3699   /* For some reason the address of the first procedure is ignored
   3700      when reading line numbers.  This doesn't matter if the address of
   3701      the first procedure is 0, but when gcc is generating MIPS
   3702      embedded PIC code, it will put strings in the .text section
   3703      before the first procedure.  We cope by inserting a dummy line if
   3704      the address of the first procedure is not 0.  Hopefully this
   3705      won't screw things up too badly.
   3706 
   3707      Don't do this for ECOFF assembly source line numbers.  They work
   3708      without this extra attention.  */
   3709   if (debug_type != DEBUG_ECOFF
   3710       && first_proc_ptr != (proc_t *) NULL
   3711       && local_first_lineno != (lineno_list_t *) NULL
   3712       && ((S_GET_VALUE (first_proc_ptr->sym->as_sym)
   3713 	   + bfd_section_vma (S_GET_SEGMENT (first_proc_ptr->sym->as_sym)))
   3714 	  != 0))
   3715     {
   3716       first.file = local_first_lineno->file;
   3717       first.proc = local_first_lineno->proc;
   3718       first.frag = &zero_address_frag;
   3719       first.paddr = 0;
   3720       first.lineno = 0;
   3721 
   3722       first.next = local_first_lineno;
   3723       local_first_lineno = &first;
   3724     }
   3725 
   3726   for (l = local_first_lineno; l != (lineno_list_t *) NULL; l = l->next)
   3727     {
   3728       long count;
   3729       long delta;
   3730 
   3731       /* Get the offset to the memory address of the next line number
   3732          (in words).  Do this first, so that we can skip ahead to the
   3733          next useful line number entry.  */
   3734       if (l->next == (lineno_list_t *) NULL)
   3735 	{
   3736 	  /* We want a count of zero, but it will be decremented
   3737 	     before it is used.  */
   3738 	  count = 1;
   3739 	}
   3740       else if (l->next->frag->fr_address + l->next->paddr
   3741 	       > l->frag->fr_address + l->paddr)
   3742 	{
   3743 	  count = ((l->next->frag->fr_address + l->next->paddr
   3744 		    - (l->frag->fr_address + l->paddr))
   3745 		   >> 2);
   3746 	}
   3747       else
   3748 	{
   3749 	  /* Don't change last, so we still get the right delta.  */
   3750 	  continue;
   3751 	}
   3752 
   3753       if (l->file != file || l->proc != proc)
   3754 	{
   3755 	  if (l->proc != proc && proc != (proc_t *) NULL)
   3756 	    proc->pdr.lnHigh = last->lineno;
   3757 	  if (l->file != file && file != (efdr_t *) NULL)
   3758 	    {
   3759 	      file->fdr.cbLine = c - file->fdr.cbLineOffset;
   3760 	      file->fdr.cline = totcount + count;
   3761 	      if (linecntptr != (long *) NULL)
   3762 		*linecntptr += totcount + count;
   3763 	      totcount = 0;
   3764 	    }
   3765 
   3766 	  if (l->file != file)
   3767 	    {
   3768 	      efdr_t *last_file = file;
   3769 
   3770 	      file = l->file;
   3771 	      if (last_file != (efdr_t *) NULL)
   3772 		file->fdr.ilineBase
   3773 		  = last_file->fdr.ilineBase + last_file->fdr.cline;
   3774 	      else
   3775 		file->fdr.ilineBase = 0;
   3776 	      file->fdr.cbLineOffset = c;
   3777 	    }
   3778 	  if (l->proc != proc)
   3779 	    {
   3780 	      proc = l->proc;
   3781 	      if (proc != (proc_t *) NULL)
   3782 		{
   3783 		  proc->pdr.lnLow = l->lineno;
   3784 		  proc->pdr.cbLineOffset = c - file->fdr.cbLineOffset;
   3785 		  proc->pdr.iline = totcount;
   3786 		}
   3787 	    }
   3788 
   3789 	  last = (lineno_list_t *) NULL;
   3790 	}
   3791 
   3792       totcount += count;
   3793 
   3794       /* Get the offset to this line number.  */
   3795       if (last == (lineno_list_t *) NULL)
   3796 	delta = 0;
   3797       else
   3798 	delta = l->lineno - last->lineno;
   3799 
   3800       /* Put in the offset to this line number.  */
   3801       while (delta != 0)
   3802 	{
   3803 	  int setcount;
   3804 
   3805 	  /* 1 is added to each count read.  */
   3806 	  --count;
   3807 	  /* We can only adjust the word count by up to 15 words at a
   3808 	     time.  */
   3809 	  if (count <= 0x0f)
   3810 	    {
   3811 	      setcount = count;
   3812 	      count = 0;
   3813 	    }
   3814 	  else
   3815 	    {
   3816 	      setcount = 0x0f;
   3817 	      count -= 0x0f;
   3818 	    }
   3819 	  if (delta >= -7 && delta <= 7)
   3820 	    {
   3821 	      if (bufptr >= *bufend)
   3822 		bufptr = ecoff_add_bytes (buf, bufend, bufptr, (long) 1);
   3823 	      *bufptr++ = setcount + (delta << 4);
   3824 	      delta = 0;
   3825 	      ++c;
   3826 	    }
   3827 	  else
   3828 	    {
   3829 	      int set;
   3830 
   3831 	      if (*bufend - bufptr < 3)
   3832 		bufptr = ecoff_add_bytes (buf, bufend, bufptr, (long) 3);
   3833 	      *bufptr++ = setcount + (8 << 4);
   3834 	      if (delta < -0x8000)
   3835 		{
   3836 		  set = -0x8000;
   3837 		  delta += 0x8000;
   3838 		}
   3839 	      else if (delta > 0x7fff)
   3840 		{
   3841 		  set = 0x7fff;
   3842 		  delta -= 0x7fff;
   3843 		}
   3844 	      else
   3845 		{
   3846 		  set = delta;
   3847 		  delta = 0;
   3848 		}
   3849 	      *bufptr++ = set >> 8;
   3850 	      *bufptr++ = set & 0xffff;
   3851 	      c += 3;
   3852 	    }
   3853 	}
   3854 
   3855       /* Finish adjusting the count.  */
   3856       while (count > 0)
   3857 	{
   3858 	  if (bufptr >= *bufend)
   3859 	    bufptr = ecoff_add_bytes (buf, bufend, bufptr, (long) 1);
   3860 	  /* 1 is added to each count read.  */
   3861 	  --count;
   3862 	  if (count > 0x0f)
   3863 	    {
   3864 	      *bufptr++ = 0x0f;
   3865 	      count -= 0x0f;
   3866 	    }
   3867 	  else
   3868 	    {
   3869 	      *bufptr++ = count;
   3870 	      count = 0;
   3871 	    }
   3872 	  ++c;
   3873 	}
   3874 
   3875       ++iline;
   3876       last = l;
   3877     }
   3878 
   3879   if (proc != (proc_t *) NULL)
   3880     proc->pdr.lnHigh = last->lineno;
   3881   if (file != (efdr_t *) NULL)
   3882     {
   3883       file->fdr.cbLine = c - file->fdr.cbLineOffset;
   3884       file->fdr.cline = totcount;
   3885     }
   3886 
   3887   if (linecntptr != (long *) NULL)
   3888     *linecntptr += totcount;
   3889 
   3890   c = ecoff_padding_adjust (backend, buf, bufend, c, &bufptr);
   3891 
   3892   return c;
   3893 }
   3894 
   3895 /* Build and swap out the symbols.  */
   3896 
   3897 static unsigned long
   3898 ecoff_build_symbols (const struct ecoff_debug_swap *backend,
   3899 		     char **buf,
   3900 		     char **bufend,
   3901 		     unsigned long offset)
   3902 {
   3903   const bfd_size_type external_sym_size = backend->external_sym_size;
   3904   void (* const swap_sym_out) (bfd *, const SYMR *, void *)
   3905     = backend->swap_sym_out;
   3906   char *sym_out;
   3907   long isym;
   3908   vlinks_t *file_link;
   3909 
   3910   sym_out = *buf + offset;
   3911 
   3912   isym = 0;
   3913 
   3914   /* The symbols are stored by file.  */
   3915   for (file_link = file_desc.first;
   3916        file_link != (vlinks_t *) NULL;
   3917        file_link = file_link->next)
   3918     {
   3919       int ifilesym;
   3920       int fil_cnt;
   3921       efdr_t *fil_ptr;
   3922       efdr_t *fil_end;
   3923 
   3924       if (file_link->next == (vlinks_t *) NULL)
   3925 	fil_cnt = file_desc.objects_last_page;
   3926       else
   3927 	fil_cnt = file_desc.objects_per_page;
   3928       fil_ptr = file_link->datum->file;
   3929       fil_end = fil_ptr + fil_cnt;
   3930       for (; fil_ptr < fil_end; fil_ptr++)
   3931 	{
   3932 	  vlinks_t *sym_link;
   3933 
   3934 	  fil_ptr->fdr.isymBase = isym;
   3935 	  ifilesym = isym;
   3936 	  for (sym_link = fil_ptr->symbols.first;
   3937 	       sym_link != (vlinks_t *) NULL;
   3938 	       sym_link = sym_link->next)
   3939 	    {
   3940 	      int sym_cnt;
   3941 	      localsym_t *sym_ptr;
   3942 	      localsym_t *sym_end;
   3943 
   3944 	      if (sym_link->next == (vlinks_t *) NULL)
   3945 		sym_cnt = fil_ptr->symbols.objects_last_page;
   3946 	      else
   3947 		sym_cnt = fil_ptr->symbols.objects_per_page;
   3948 	      sym_ptr = sym_link->datum->sym;
   3949 	      sym_end = sym_ptr + sym_cnt;
   3950 	      for (; sym_ptr < sym_end; sym_ptr++)
   3951 		{
   3952 		  int local;
   3953 		  symbolS *as_sym;
   3954 		  forward_t *f;
   3955 
   3956 		  know (sym_ptr->file_ptr == fil_ptr);
   3957 
   3958 		  /* If there is no associated gas symbol, then this
   3959 		     is a pure debugging symbol.  We have already
   3960 		     added the name (if any) to fil_ptr->strings.
   3961 		     Otherwise we must decide whether this is an
   3962 		     external or a local symbol (actually, it may be
   3963 		     both if the local provides additional debugging
   3964 		     information for the external).  */
   3965 		  local = 1;
   3966 		  as_sym = sym_ptr->as_sym;
   3967 		  if (as_sym != (symbolS *) NULL)
   3968 		    {
   3969 		      symint_t indx;
   3970 
   3971 		      /* The value of a block start symbol is the
   3972 		         offset from the start of the procedure.  For
   3973 		         other symbols we just use the gas value (but
   3974 		         we must offset it by the vma of the section,
   3975 		         just as BFD does, because BFD will not see
   3976 		         this value).  */
   3977 		      if (sym_ptr->ecoff_sym.asym.st == (int) st_Block
   3978 			  && sym_ptr->ecoff_sym.asym.sc == (int) sc_Text)
   3979 			{
   3980 			  symbolS *begin_sym;
   3981 
   3982 			  know (sym_ptr->proc_ptr != (proc_t *) NULL);
   3983 			  begin_sym = sym_ptr->proc_ptr->sym->as_sym;
   3984 			  if (S_GET_SEGMENT (as_sym)
   3985 			      != S_GET_SEGMENT (begin_sym))
   3986 			    as_warn (_(".begin/.bend in different segments"));
   3987 			  sym_ptr->ecoff_sym.asym.value =
   3988 			    S_GET_VALUE (as_sym) - S_GET_VALUE (begin_sym);
   3989 			}
   3990 		      else
   3991 			sym_ptr->ecoff_sym.asym.value =
   3992 			  (S_GET_VALUE (as_sym)
   3993 			   + bfd_section_vma (S_GET_SEGMENT (as_sym))
   3994 			   + sym_ptr->addend);
   3995 
   3996 		      sym_ptr->ecoff_sym.weakext = S_IS_WEAK (as_sym);
   3997 
   3998 		      /* Set st_Proc to st_StaticProc for local
   3999 			 functions.  */
   4000 		      if (sym_ptr->ecoff_sym.asym.st == st_Proc
   4001 			  && S_IS_DEFINED (as_sym)
   4002 			  && ! S_IS_EXTERNAL (as_sym)
   4003 			  && ! S_IS_WEAK (as_sym))
   4004 			sym_ptr->ecoff_sym.asym.st = st_StaticProc;
   4005 
   4006 		      /* Get the type and storage class based on where
   4007 		         the symbol actually wound up.  Traditionally,
   4008 		         N_LBRAC and N_RBRAC are *not* relocated.  */
   4009 		      indx = sym_ptr->ecoff_sym.asym.index;
   4010 		      if (sym_ptr->ecoff_sym.asym.st == st_Nil
   4011 			  && sym_ptr->ecoff_sym.asym.sc == sc_Nil
   4012 			  && (! ECOFF_IS_STAB (&sym_ptr->ecoff_sym.asym)
   4013 			      || ((ECOFF_UNMARK_STAB (indx) != N_LBRAC)
   4014 				  && (ECOFF_UNMARK_STAB (indx) != N_RBRAC))))
   4015 			{
   4016 			  segT seg;
   4017 			  const char *segname;
   4018 			  st_t st;
   4019 			  sc_t sc;
   4020 
   4021 			  seg = S_GET_SEGMENT (as_sym);
   4022 			  segname = segment_name (seg);
   4023 
   4024 			  if (! ECOFF_IS_STAB (&sym_ptr->ecoff_sym.asym)
   4025 			      && (S_IS_EXTERNAL (as_sym)
   4026 				  || S_IS_WEAK (as_sym)
   4027 				  || ! S_IS_DEFINED (as_sym)))
   4028 			    {
   4029 			      if ((symbol_get_bfdsym (as_sym)->flags
   4030 				   & BSF_FUNCTION) != 0)
   4031 				st = st_Proc;
   4032 			      else
   4033 				st = st_Global;
   4034 			    }
   4035 			  else if (seg == text_section)
   4036 			    st = st_Label;
   4037 			  else
   4038 			    st = st_Static;
   4039 
   4040 			  if (! S_IS_DEFINED (as_sym))
   4041 			    {
   4042 			      valueT s;
   4043 
   4044 			      s = symbol_get_obj (as_sym)->ecoff_extern_size;
   4045 			      if (s == 0
   4046 				  || s > bfd_get_gp_size (stdoutput))
   4047 				sc = sc_Undefined;
   4048 			      else
   4049 				{
   4050 				  sc = sc_SUndefined;
   4051 				  sym_ptr->ecoff_sym.asym.value = s;
   4052 				}
   4053 #ifdef S_SET_SIZE
   4054 			      S_SET_SIZE (as_sym, s);
   4055 #endif
   4056 			    }
   4057 			  else if (S_IS_COMMON (as_sym))
   4058 			    {
   4059 			      if (S_GET_VALUE (as_sym) > 0
   4060 				  && (S_GET_VALUE (as_sym)
   4061 				      <= bfd_get_gp_size (stdoutput)))
   4062 				sc = sc_SCommon;
   4063 			      else
   4064 				sc = sc_Common;
   4065 			    }
   4066 			  else if (seg == text_section)
   4067 			    sc = sc_Text;
   4068 			  else if (seg == data_section)
   4069 			    sc = sc_Data;
   4070 			  else if (strcmp (segname, ".rdata") == 0
   4071 				   || strcmp (segname, ".rodata") == 0)
   4072 			    sc = sc_RData;
   4073 			  else if (strcmp (segname, ".sdata") == 0)
   4074 			    sc = sc_SData;
   4075 			  else if (seg == bss_section)
   4076 			    sc = sc_Bss;
   4077 			  else if (strcmp (segname, ".sbss") == 0)
   4078 			    sc = sc_SBss;
   4079 			  else if (seg == bfd_abs_section_ptr)
   4080 			    sc = sc_Abs;
   4081 			  else
   4082 			    {
   4083 			      /* This must be a user named section.
   4084 			         This is not possible in ECOFF, but it
   4085 			         is in ELF.  */
   4086 			      sc = sc_Data;
   4087 			    }
   4088 
   4089 			  sym_ptr->ecoff_sym.asym.st = (int) st;
   4090 			  sym_ptr->ecoff_sym.asym.sc = (int) sc;
   4091 			}
   4092 
   4093 		      /* This is just an external symbol if it is
   4094 		         outside a procedure and it has a type.
   4095 		         FIXME: g++ will generate symbols which have
   4096 		         different names in the debugging information
   4097 		         than the actual symbol.  Should we handle
   4098 		         them here?  */
   4099 		      if ((S_IS_EXTERNAL (as_sym)
   4100 			   || S_IS_WEAK (as_sym)
   4101 			   || ! S_IS_DEFINED (as_sym))
   4102 			  && sym_ptr->proc_ptr == (proc_t *) NULL
   4103 			  && sym_ptr->ecoff_sym.asym.st != (int) st_Nil
   4104 			  && ! ECOFF_IS_STAB (&sym_ptr->ecoff_sym.asym))
   4105 			local = 0;
   4106 
   4107 		      /* This is just an external symbol if it is a
   4108 		         common symbol.  */
   4109 		      if (S_IS_COMMON (as_sym))
   4110 			local = 0;
   4111 
   4112 		      /* If an st_end symbol has an associated gas
   4113 		         symbol, then it is a local label created for
   4114 		         a .bend or .end directive.  Stabs line
   4115 		         numbers will have FAKE_LABEL_CHAR in the names.  */
   4116 		      if (local
   4117 			  && sym_ptr->ecoff_sym.asym.st != st_End
   4118 			  && strchr (sym_ptr->name, FAKE_LABEL_CHAR) == 0)
   4119 			sym_ptr->ecoff_sym.asym.iss =
   4120 			  add_string (&fil_ptr->strings,
   4121 				      fil_ptr->str_hash,
   4122 				      sym_ptr->name,
   4123 				      (shash_t **) NULL);
   4124 		    }
   4125 
   4126 		  /* We now know the index of this symbol; fill in
   4127 		     locations that have been waiting for that
   4128 		     information.  */
   4129 		  if (sym_ptr->begin_ptr != (localsym_t *) NULL)
   4130 		    {
   4131 		      localsym_t *begin_ptr;
   4132 		      st_t begin_type;
   4133 
   4134 		      know (local);
   4135 		      begin_ptr = sym_ptr->begin_ptr;
   4136 		      know (begin_ptr->sym_index != -1);
   4137 		      sym_ptr->ecoff_sym.asym.index = begin_ptr->sym_index;
   4138 		      if (sym_ptr->ecoff_sym.asym.sc != (int) sc_Info)
   4139 			sym_ptr->ecoff_sym.asym.iss =
   4140 			  begin_ptr->ecoff_sym.asym.iss;
   4141 
   4142 		      begin_type = (st_t) begin_ptr->ecoff_sym.asym.st;
   4143 		      if (begin_type == st_File
   4144 			  || begin_type == st_Block)
   4145 			{
   4146 			  begin_ptr->ecoff_sym.asym.index =
   4147 			    isym - ifilesym + 1;
   4148 			  (*swap_sym_out) (stdoutput,
   4149 					   &begin_ptr->ecoff_sym.asym,
   4150 					   (*buf
   4151 					    + offset
   4152 					    + (begin_ptr->sym_index
   4153 					       * external_sym_size)));
   4154 			}
   4155 		      else
   4156 			{
   4157 			  know (begin_ptr->index_ptr != (aux_t *) NULL);
   4158 			  begin_ptr->index_ptr->data.isym =
   4159 			    isym - ifilesym + 1;
   4160 			}
   4161 
   4162 		      /* The value of the symbol marking the end of a
   4163 		         procedure is the size of the procedure.  The
   4164 		         value of the symbol marking the end of a
   4165 		         block is the offset from the start of the
   4166 		         procedure to the block.  */
   4167 		      if (begin_type == st_Proc
   4168 			  || begin_type == st_StaticProc)
   4169 			{
   4170 			  know (as_sym != (symbolS *) NULL);
   4171 			  know (begin_ptr->as_sym != (symbolS *) NULL);
   4172 			  if (S_GET_SEGMENT (as_sym)
   4173 			      != S_GET_SEGMENT (begin_ptr->as_sym))
   4174 			    as_warn (_(".begin/.bend in different segments"));
   4175 			  sym_ptr->ecoff_sym.asym.value =
   4176 			    (S_GET_VALUE (as_sym)
   4177 			     - S_GET_VALUE (begin_ptr->as_sym));
   4178 
   4179 			  /* If the size is odd, this is probably a
   4180 			     mips16 function; force it to be even.  */
   4181 			  if ((sym_ptr->ecoff_sym.asym.value & 1) != 0)
   4182 			    ++sym_ptr->ecoff_sym.asym.value;
   4183 
   4184 #ifdef S_SET_SIZE
   4185 			  S_SET_SIZE (begin_ptr->as_sym,
   4186 				      sym_ptr->ecoff_sym.asym.value);
   4187 #endif
   4188 			}
   4189 		      else if (begin_type == st_Block
   4190 			       && sym_ptr->ecoff_sym.asym.sc != (int) sc_Info)
   4191 			{
   4192 			  symbolS *begin_sym;
   4193 
   4194 			  know (as_sym != (symbolS *) NULL);
   4195 			  know (sym_ptr->proc_ptr != (proc_t *) NULL);
   4196 			  begin_sym = sym_ptr->proc_ptr->sym->as_sym;
   4197 			  if (S_GET_SEGMENT (as_sym)
   4198 			      != S_GET_SEGMENT (begin_sym))
   4199 			    as_warn (_(".begin/.bend in different segments"));
   4200 			  sym_ptr->ecoff_sym.asym.value =
   4201 			    S_GET_VALUE (as_sym) - S_GET_VALUE (begin_sym);
   4202 			}
   4203 		    }
   4204 
   4205 		  for (f = sym_ptr->forward_ref;
   4206 		       f != (forward_t *) NULL;
   4207 		       f = f->next)
   4208 		    {
   4209 		      know (local);
   4210 		      f->ifd_ptr->data.isym = fil_ptr->file_index;
   4211 		      f->index_ptr->data.rndx.index = isym - ifilesym;
   4212 		    }
   4213 
   4214 		  if (local)
   4215 		    {
   4216 		      if ((bfd_size_type)(*bufend - sym_out) < external_sym_size)
   4217 			sym_out = ecoff_add_bytes (buf, bufend,
   4218 						   sym_out,
   4219 						   external_sym_size);
   4220 		      (*swap_sym_out) (stdoutput, &sym_ptr->ecoff_sym.asym,
   4221 				       sym_out);
   4222 		      sym_out += external_sym_size;
   4223 
   4224 		      sym_ptr->sym_index = isym;
   4225 
   4226 		      if (sym_ptr->proc_ptr != (proc_t *) NULL
   4227 			  && sym_ptr->proc_ptr->sym == sym_ptr)
   4228 			sym_ptr->proc_ptr->pdr.isym = isym - ifilesym;
   4229 
   4230 		      ++isym;
   4231 		    }
   4232 
   4233 		  /* Record the local symbol index and file number in
   4234 		     case this is an external symbol.  Note that this
   4235 		     destroys the asym.index field.  */
   4236 		  if (as_sym != (symbolS *) NULL
   4237 		      && symbol_get_obj (as_sym)->ecoff_symbol == sym_ptr)
   4238 		    {
   4239 		      if ((sym_ptr->ecoff_sym.asym.st == st_Proc
   4240 			   || sym_ptr->ecoff_sym.asym.st == st_StaticProc)
   4241 			  && local)
   4242 			sym_ptr->ecoff_sym.asym.index = isym - ifilesym - 1;
   4243 		      sym_ptr->ecoff_sym.ifd = fil_ptr->file_index;
   4244 
   4245 		      /* Don't try to merge an FDR which has an
   4246 		         external symbol attached to it.  */
   4247 		      if (S_IS_EXTERNAL (as_sym) || S_IS_WEAK (as_sym))
   4248 			fil_ptr->fdr.fMerge = 0;
   4249 		    }
   4250 		}
   4251 	    }
   4252 	  fil_ptr->fdr.csym = isym - fil_ptr->fdr.isymBase;
   4253 	}
   4254     }
   4255 
   4256   return offset + isym * external_sym_size;
   4257 }
   4258 
   4259 /* Swap out the procedure information.  */
   4260 
   4261 static unsigned long
   4262 ecoff_build_procs (const struct ecoff_debug_swap *backend,
   4263 		   char **buf,
   4264 		   char **bufend,
   4265 		   unsigned long offset)
   4266 {
   4267   const bfd_size_type external_pdr_size = backend->external_pdr_size;
   4268   void (* const swap_pdr_out) (bfd *, const PDR *, void *)
   4269     = backend->swap_pdr_out;
   4270   char *pdr_out;
   4271   long iproc;
   4272   vlinks_t *file_link;
   4273 
   4274   pdr_out = *buf + offset;
   4275 
   4276   iproc = 0;
   4277 
   4278   /* The procedures are stored by file.  */
   4279   for (file_link = file_desc.first;
   4280        file_link != (vlinks_t *) NULL;
   4281        file_link = file_link->next)
   4282     {
   4283       int fil_cnt;
   4284       efdr_t *fil_ptr;
   4285       efdr_t *fil_end;
   4286 
   4287       if (file_link->next == (vlinks_t *) NULL)
   4288 	fil_cnt = file_desc.objects_last_page;
   4289       else
   4290 	fil_cnt = file_desc.objects_per_page;
   4291       fil_ptr = file_link->datum->file;
   4292       fil_end = fil_ptr + fil_cnt;
   4293       for (; fil_ptr < fil_end; fil_ptr++)
   4294 	{
   4295 	  vlinks_t *proc_link;
   4296 	  int first;
   4297 
   4298 	  fil_ptr->fdr.ipdFirst = iproc;
   4299 	  first = 1;
   4300 	  for (proc_link = fil_ptr->procs.first;
   4301 	       proc_link != (vlinks_t *) NULL;
   4302 	       proc_link = proc_link->next)
   4303 	    {
   4304 	      int prc_cnt;
   4305 	      proc_t *proc_ptr;
   4306 	      proc_t *proc_end;
   4307 
   4308 	      if (proc_link->next == (vlinks_t *) NULL)
   4309 		prc_cnt = fil_ptr->procs.objects_last_page;
   4310 	      else
   4311 		prc_cnt = fil_ptr->procs.objects_per_page;
   4312 	      proc_ptr = proc_link->datum->proc;
   4313 	      proc_end = proc_ptr + prc_cnt;
   4314 	      for (; proc_ptr < proc_end; proc_ptr++)
   4315 		{
   4316 		  symbolS *adr_sym;
   4317 		  unsigned long adr;
   4318 
   4319 		  adr_sym = proc_ptr->sym->as_sym;
   4320 		  adr = (S_GET_VALUE (adr_sym)
   4321 			 + bfd_section_vma (S_GET_SEGMENT (adr_sym)));
   4322 		  if (first)
   4323 		    {
   4324 		      /* This code used to force the adr of the very
   4325 		         first fdr to be 0.  However, the native tools
   4326 		         don't do that, and I can't remember why it
   4327 		         used to work that way, so I took it out.  */
   4328 		      fil_ptr->fdr.adr = adr;
   4329 		      first = 0;
   4330 		    }
   4331 		  proc_ptr->pdr.adr = adr - fil_ptr->fdr.adr;
   4332 		  if ((bfd_size_type)(*bufend - pdr_out) < external_pdr_size)
   4333 		    pdr_out = ecoff_add_bytes (buf, bufend,
   4334 					       pdr_out,
   4335 					       external_pdr_size);
   4336 		  (*swap_pdr_out) (stdoutput, &proc_ptr->pdr, pdr_out);
   4337 		  pdr_out += external_pdr_size;
   4338 		  ++iproc;
   4339 		}
   4340 	    }
   4341 	  fil_ptr->fdr.cpd = iproc - fil_ptr->fdr.ipdFirst;
   4342 	}
   4343     }
   4344 
   4345   return offset + iproc * external_pdr_size;
   4346 }
   4347 
   4348 /* Swap out the aux information.  */
   4349 
   4350 static unsigned long
   4351 ecoff_build_aux (const struct ecoff_debug_swap *backend,
   4352 		 char **buf,
   4353 		 char **bufend,
   4354 		 unsigned long offset)
   4355 {
   4356   int bigendian;
   4357   union aux_ext *aux_out;
   4358   long iaux;
   4359   vlinks_t *file_link;
   4360 
   4361   bigendian = bfd_big_endian (stdoutput);
   4362 
   4363   aux_out = (union aux_ext *) (*buf + offset);
   4364 
   4365   iaux = 0;
   4366 
   4367   /* The aux entries are stored by file.  */
   4368   for (file_link = file_desc.first;
   4369        file_link != (vlinks_t *) NULL;
   4370        file_link = file_link->next)
   4371     {
   4372       int fil_cnt;
   4373       efdr_t *fil_ptr;
   4374       efdr_t *fil_end;
   4375 
   4376       if (file_link->next == (vlinks_t *) NULL)
   4377 	fil_cnt = file_desc.objects_last_page;
   4378       else
   4379 	fil_cnt = file_desc.objects_per_page;
   4380       fil_ptr = file_link->datum->file;
   4381       fil_end = fil_ptr + fil_cnt;
   4382       for (; fil_ptr < fil_end; fil_ptr++)
   4383 	{
   4384 	  vlinks_t *aux_link;
   4385 
   4386 	  fil_ptr->fdr.fBigendian = bigendian;
   4387 	  fil_ptr->fdr.iauxBase = iaux;
   4388 	  for (aux_link = fil_ptr->aux_syms.first;
   4389 	       aux_link != (vlinks_t *) NULL;
   4390 	       aux_link = aux_link->next)
   4391 	    {
   4392 	      int aux_cnt;
   4393 	      aux_t *aux_ptr;
   4394 	      aux_t *aux_end;
   4395 
   4396 	      if (aux_link->next == (vlinks_t *) NULL)
   4397 		aux_cnt = fil_ptr->aux_syms.objects_last_page;
   4398 	      else
   4399 		aux_cnt = fil_ptr->aux_syms.objects_per_page;
   4400 	      aux_ptr = aux_link->datum->aux;
   4401 	      aux_end = aux_ptr + aux_cnt;
   4402 	      for (; aux_ptr < aux_end; aux_ptr++)
   4403 		{
   4404 		  if ((unsigned long) (*bufend - (char *) aux_out)
   4405 		      < sizeof (union aux_ext))
   4406 		    aux_out = ((union aux_ext *)
   4407 			       ecoff_add_bytes (buf, bufend,
   4408 						(char *) aux_out,
   4409 						sizeof (union aux_ext)));
   4410 		  switch (aux_ptr->type)
   4411 		    {
   4412 		    case aux_tir:
   4413 		      (*backend->swap_tir_out) (bigendian,
   4414 						&aux_ptr->data.ti,
   4415 						&aux_out->a_ti);
   4416 		      break;
   4417 		    case aux_rndx:
   4418 		      (*backend->swap_rndx_out) (bigendian,
   4419 						 &aux_ptr->data.rndx,
   4420 						 &aux_out->a_rndx);
   4421 		      break;
   4422 		    case aux_dnLow:
   4423 		      AUX_PUT_DNLOW (bigendian, aux_ptr->data.dnLow,
   4424 				     aux_out);
   4425 		      break;
   4426 		    case aux_dnHigh:
   4427 		      AUX_PUT_DNHIGH (bigendian, aux_ptr->data.dnHigh,
   4428 				      aux_out);
   4429 		      break;
   4430 		    case aux_isym:
   4431 		      AUX_PUT_ISYM (bigendian, aux_ptr->data.isym,
   4432 				    aux_out);
   4433 		      break;
   4434 		    case aux_iss:
   4435 		      AUX_PUT_ISS (bigendian, aux_ptr->data.iss,
   4436 				   aux_out);
   4437 		      break;
   4438 		    case aux_width:
   4439 		      AUX_PUT_WIDTH (bigendian, aux_ptr->data.width,
   4440 				     aux_out);
   4441 		      break;
   4442 		    case aux_count:
   4443 		      AUX_PUT_COUNT (bigendian, aux_ptr->data.count,
   4444 				     aux_out);
   4445 		      break;
   4446 		    }
   4447 
   4448 		  ++aux_out;
   4449 		  ++iaux;
   4450 		}
   4451 	    }
   4452 	  fil_ptr->fdr.caux = iaux - fil_ptr->fdr.iauxBase;
   4453 	}
   4454     }
   4455 
   4456   return ecoff_padding_adjust (backend, buf, bufend,
   4457 			       offset + iaux * sizeof (union aux_ext),
   4458 			       (char **) NULL);
   4459 }
   4460 
   4461 /* Copy out the strings from a varray_t.  This returns the number of
   4462    bytes copied, rather than the new offset.  */
   4463 
   4464 static unsigned long
   4465 ecoff_build_strings (char **buf,
   4466 		     char **bufend,
   4467 		     unsigned long offset,
   4468 		     varray_t *vp)
   4469 {
   4470   unsigned long istr;
   4471   char *str_out;
   4472   vlinks_t *str_link;
   4473 
   4474   str_out = *buf + offset;
   4475 
   4476   istr = 0;
   4477 
   4478   for (str_link = vp->first;
   4479        str_link != (vlinks_t *) NULL;
   4480        str_link = str_link->next)
   4481     {
   4482       unsigned long str_cnt;
   4483 
   4484       if (str_link->next == (vlinks_t *) NULL)
   4485 	str_cnt = vp->objects_last_page;
   4486       else
   4487 	str_cnt = vp->objects_per_page;
   4488 
   4489       if ((unsigned long)(*bufend - str_out) < str_cnt)
   4490 	str_out = ecoff_add_bytes (buf, bufend, str_out, str_cnt);
   4491 
   4492       memcpy (str_out, str_link->datum->byte, str_cnt);
   4493       str_out += str_cnt;
   4494       istr += str_cnt;
   4495     }
   4496 
   4497   return istr;
   4498 }
   4499 
   4500 /* Dump out the local strings.  */
   4501 
   4502 static unsigned long
   4503 ecoff_build_ss (const struct ecoff_debug_swap *backend,
   4504 		char **buf,
   4505 		char **bufend,
   4506 		unsigned long offset)
   4507 {
   4508   long iss;
   4509   vlinks_t *file_link;
   4510 
   4511   iss = 0;
   4512 
   4513   for (file_link = file_desc.first;
   4514        file_link != (vlinks_t *) NULL;
   4515        file_link = file_link->next)
   4516     {
   4517       int fil_cnt;
   4518       efdr_t *fil_ptr;
   4519       efdr_t *fil_end;
   4520 
   4521       if (file_link->next == (vlinks_t *) NULL)
   4522 	fil_cnt = file_desc.objects_last_page;
   4523       else
   4524 	fil_cnt = file_desc.objects_per_page;
   4525       fil_ptr = file_link->datum->file;
   4526       fil_end = fil_ptr + fil_cnt;
   4527       for (; fil_ptr < fil_end; fil_ptr++)
   4528 	{
   4529 	  long ss_cnt;
   4530 
   4531 	  fil_ptr->fdr.issBase = iss;
   4532 	  ss_cnt = ecoff_build_strings (buf, bufend, offset + iss,
   4533 					&fil_ptr->strings);
   4534 	  fil_ptr->fdr.cbSs = ss_cnt;
   4535 	  iss += ss_cnt;
   4536 	}
   4537     }
   4538 
   4539   return ecoff_padding_adjust (backend, buf, bufend, offset + iss,
   4540 			       (char **) NULL);
   4541 }
   4542 
   4543 /* Swap out the file descriptors.  */
   4544 
   4545 static unsigned long
   4546 ecoff_build_fdr (const struct ecoff_debug_swap *backend,
   4547 		 char **buf,
   4548 		 char **bufend,
   4549 		 unsigned long offset)
   4550 {
   4551   const bfd_size_type external_fdr_size = backend->external_fdr_size;
   4552   void (* const swap_fdr_out) (bfd *, const FDR *, void *)
   4553     = backend->swap_fdr_out;
   4554   long ifile;
   4555   char *fdr_out;
   4556   vlinks_t *file_link;
   4557 
   4558   ifile = 0;
   4559 
   4560   fdr_out = *buf + offset;
   4561 
   4562   for (file_link = file_desc.first;
   4563        file_link != (vlinks_t *) NULL;
   4564        file_link = file_link->next)
   4565     {
   4566       int fil_cnt;
   4567       efdr_t *fil_ptr;
   4568       efdr_t *fil_end;
   4569 
   4570       if (file_link->next == (vlinks_t *) NULL)
   4571 	fil_cnt = file_desc.objects_last_page;
   4572       else
   4573 	fil_cnt = file_desc.objects_per_page;
   4574       fil_ptr = file_link->datum->file;
   4575       fil_end = fil_ptr + fil_cnt;
   4576       for (; fil_ptr < fil_end; fil_ptr++)
   4577 	{
   4578 	  if ((bfd_size_type)(*bufend - fdr_out) < external_fdr_size)
   4579 	    fdr_out = ecoff_add_bytes (buf, bufend, fdr_out,
   4580 				       external_fdr_size);
   4581 	  (*swap_fdr_out) (stdoutput, &fil_ptr->fdr, fdr_out);
   4582 	  fdr_out += external_fdr_size;
   4583 	  ++ifile;
   4584 	}
   4585     }
   4586 
   4587   return offset + ifile * external_fdr_size;
   4588 }
   4589 
   4590 /* Set up the external symbols.  These are supposed to be handled by
   4591    the backend.  This routine just gets the right information and
   4592    calls a backend function to deal with it.  */
   4593 
   4594 static void
   4595 ecoff_setup_ext (void)
   4596 {
   4597   symbolS *sym;
   4598 
   4599   for (sym = symbol_rootP; sym != (symbolS *) NULL; sym = symbol_next (sym))
   4600     {
   4601       if (symbol_get_obj (sym)->ecoff_symbol == NULL)
   4602 	continue;
   4603 
   4604       /* If this is a local symbol, then force the fields to zero.  */
   4605       if (! S_IS_EXTERNAL (sym)
   4606 	  && ! S_IS_WEAK (sym)
   4607 	  && S_IS_DEFINED (sym))
   4608 	{
   4609 	  struct localsym *lsym;
   4610 
   4611 	  lsym = symbol_get_obj (sym)->ecoff_symbol;
   4612 	  lsym->ecoff_sym.asym.value = 0;
   4613 	  lsym->ecoff_sym.asym.st = (int) st_Nil;
   4614 	  lsym->ecoff_sym.asym.sc = (int) sc_Nil;
   4615 	  lsym->ecoff_sym.asym.index = indexNil;
   4616 	}
   4617 
   4618       obj_ecoff_set_ext (sym, &symbol_get_obj (sym)->ecoff_symbol->ecoff_sym);
   4619     }
   4620 }
   4621 
   4622 /* Build the ECOFF debugging information.  */
   4623 
   4624 unsigned long
   4625 ecoff_build_debug (HDRR *hdr,
   4626 		   char **bufp,
   4627 		   const struct ecoff_debug_swap *backend)
   4628 {
   4629   const bfd_size_type external_pdr_size = backend->external_pdr_size;
   4630   tag_t *ptag;
   4631   tag_t *ptag_next;
   4632   efdr_t *fil_ptr;
   4633   int end_warning;
   4634   efdr_t *hold_file_ptr;
   4635   proc_t *hold_proc_ptr;
   4636   symbolS *sym;
   4637   char *buf;
   4638   char *bufend;
   4639   unsigned long offset;
   4640 
   4641   /* Make sure we have a file.  */
   4642   if (first_file == (efdr_t *) NULL)
   4643     add_file ((const char *) NULL, 0, 1);
   4644 
   4645   /* Handle any top level tags.  */
   4646   for (ptag = top_tag_head->first_tag;
   4647        ptag != (tag_t *) NULL;
   4648        ptag = ptag_next)
   4649     {
   4650       if (ptag->forward_ref != (forward_t *) NULL)
   4651 	add_unknown_tag (ptag);
   4652 
   4653       ptag_next = ptag->same_block;
   4654       ptag->hash_ptr->tag_ptr = ptag->same_name;
   4655       free_tag (ptag);
   4656     }
   4657 
   4658   free_thead (top_tag_head);
   4659 
   4660   /* Look through the symbols.  Add debugging information for each
   4661      symbol that has not already received it.  */
   4662   hold_file_ptr = cur_file_ptr;
   4663   hold_proc_ptr = cur_proc_ptr;
   4664   cur_proc_ptr = (proc_t *) NULL;
   4665   for (sym = symbol_rootP; sym != (symbolS *) NULL; sym = symbol_next (sym))
   4666     {
   4667       if (symbol_get_obj (sym)->ecoff_symbol != NULL
   4668 	  || symbol_get_obj (sym)->ecoff_file == (efdr_t *) NULL
   4669 	  || (symbol_get_bfdsym (sym)->flags & BSF_SECTION_SYM) != 0)
   4670 	continue;
   4671 
   4672       cur_file_ptr = symbol_get_obj (sym)->ecoff_file;
   4673       add_ecoff_symbol ((const char *) NULL, st_Nil, sc_Nil, sym,
   4674 			(bfd_vma) 0, S_GET_VALUE (sym), indexNil);
   4675     }
   4676   cur_proc_ptr = hold_proc_ptr;
   4677   cur_file_ptr = hold_file_ptr;
   4678 
   4679   /* Output an ending symbol for all the files.  We have to do this
   4680      here for the last file, so we may as well do it for all of the
   4681      files.  */
   4682   end_warning = 0;
   4683   for (fil_ptr = first_file;
   4684        fil_ptr != (efdr_t *) NULL;
   4685        fil_ptr = fil_ptr->next_file)
   4686     {
   4687       cur_file_ptr = fil_ptr;
   4688       while (cur_file_ptr->cur_scope != (scope_t *) NULL
   4689 	     && cur_file_ptr->cur_scope->prev != (scope_t *) NULL)
   4690 	{
   4691 	  cur_file_ptr->cur_scope = cur_file_ptr->cur_scope->prev;
   4692 	  if (! end_warning && ! cur_file_ptr->fake)
   4693 	    {
   4694 	      as_warn (_("missing .end or .bend at end of file"));
   4695 	      end_warning = 1;
   4696 	    }
   4697 	}
   4698       if (cur_file_ptr->cur_scope != (scope_t *) NULL)
   4699 	(void) add_ecoff_symbol ((const char *) NULL,
   4700 				 st_End, sc_Text,
   4701 				 (symbolS *) NULL,
   4702 				 (bfd_vma) 0,
   4703 				 (symint_t) 0,
   4704 				 (symint_t) 0);
   4705     }
   4706 
   4707   /* Build the symbolic information.  */
   4708   offset = 0;
   4709   buf = XNEWVEC (char, PAGE_SIZE);
   4710   bufend = buf + PAGE_SIZE;
   4711 
   4712   /* Build the line number information.  */
   4713   hdr->cbLineOffset = offset;
   4714   offset = ecoff_build_lineno (backend, &buf, &bufend, offset,
   4715 			       &hdr->ilineMax);
   4716   hdr->cbLine = offset - hdr->cbLineOffset;
   4717 
   4718   /* We don't use dense numbers at all.  */
   4719   hdr->idnMax = 0;
   4720   hdr->cbDnOffset = 0;
   4721 
   4722   /* We can't build the PDR table until we have built the symbols,
   4723      because a PDR contains a symbol index.  However, we set aside
   4724      space at this point.  */
   4725   hdr->ipdMax = proc_cnt;
   4726   hdr->cbPdOffset = offset;
   4727   if ((bfd_size_type)(bufend - (buf + offset)) < proc_cnt * external_pdr_size)
   4728     (void) ecoff_add_bytes (&buf, &bufend, buf + offset,
   4729 			    proc_cnt * external_pdr_size);
   4730   offset += proc_cnt * external_pdr_size;
   4731 
   4732   /* Build the local symbols.  */
   4733   hdr->cbSymOffset = offset;
   4734   offset = ecoff_build_symbols (backend, &buf, &bufend, offset);
   4735   hdr->isymMax = (offset - hdr->cbSymOffset) / backend->external_sym_size;
   4736 
   4737   /* Building the symbols initializes the symbol index in the PDR's.
   4738      Now we can swap out the PDR's.  */
   4739   (void) ecoff_build_procs (backend, &buf, &bufend, hdr->cbPdOffset);
   4740 
   4741   /* We don't use optimization symbols.  */
   4742   hdr->ioptMax = 0;
   4743   hdr->cbOptOffset = 0;
   4744 
   4745   /* Swap out the auxiliary type information.  */
   4746   hdr->cbAuxOffset = offset;
   4747   offset = ecoff_build_aux (backend, &buf, &bufend, offset);
   4748   hdr->iauxMax = (offset - hdr->cbAuxOffset) / sizeof (union aux_ext);
   4749 
   4750   /* Copy out the local strings.  */
   4751   hdr->cbSsOffset = offset;
   4752   offset = ecoff_build_ss (backend, &buf, &bufend, offset);
   4753   hdr->issMax = offset - hdr->cbSsOffset;
   4754 
   4755   /* We don't use relative file descriptors.  */
   4756   hdr->crfd = 0;
   4757   hdr->cbRfdOffset = 0;
   4758 
   4759   /* Swap out the file descriptors.  */
   4760   hdr->cbFdOffset = offset;
   4761   offset = ecoff_build_fdr (backend, &buf, &bufend, offset);
   4762   hdr->ifdMax = (offset - hdr->cbFdOffset) / backend->external_fdr_size;
   4763 
   4764   /* Set up the external symbols, which are handled by the BFD back
   4765      end.  */
   4766   hdr->issExtMax = 0;
   4767   hdr->cbSsExtOffset = 0;
   4768   hdr->iextMax = 0;
   4769   hdr->cbExtOffset = 0;
   4770   ecoff_setup_ext ();
   4771 
   4772   know ((offset & (backend->debug_align - 1)) == 0);
   4773 
   4774   /* FIXME: This value should be determined from the .verstamp directive,
   4775      with reasonable defaults in config files.  */
   4776 #ifdef TC_ALPHA
   4777   hdr->vstamp = 0x030b;
   4778 #else
   4779   hdr->vstamp = 0x020b;
   4780 #endif
   4781 
   4782   *bufp = buf;
   4783   return offset;
   4784 }
   4785 
   4786 /* Allocate a cluster of pages.  */
   4788 
   4789 #ifndef MALLOC_CHECK
   4790 
   4791 static page_type *
   4792 allocate_cluster (unsigned long npages)
   4793 {
   4794   page_type *value = (page_type *) xmalloc (npages * PAGE_USIZE);
   4795 
   4796 #ifdef ECOFF_DEBUG
   4797   if (debug > 3)
   4798     fprintf (stderr, "\talloc\tnpages = %d, value = 0x%.8x\n", npages, value);
   4799 #endif
   4800 
   4801   memset (value, 0, npages * PAGE_USIZE);
   4802 
   4803   return value;
   4804 }
   4805 
   4806 static page_type *cluster_ptr = NULL;
   4807 static unsigned long pages_left = 0;
   4808 
   4809 #endif /* MALLOC_CHECK */
   4810 
   4811 /* Allocate one page (which is initialized to 0).  */
   4812 
   4813 static page_type *
   4814 allocate_page (void)
   4815 {
   4816 #ifndef MALLOC_CHECK
   4817 
   4818   if (pages_left == 0)
   4819     {
   4820       pages_left = MAX_CLUSTER_PAGES;
   4821       cluster_ptr = allocate_cluster (pages_left);
   4822     }
   4823 
   4824   pages_left--;
   4825   return cluster_ptr++;
   4826 
   4827 #else /* MALLOC_CHECK */
   4828 
   4829   page_type *ptr;
   4830 
   4831   ptr = xmalloc (PAGE_USIZE);
   4832   memset (ptr, 0, PAGE_USIZE);
   4833   return ptr;
   4834 
   4835 #endif /* MALLOC_CHECK */
   4836 }
   4837 
   4838 /* Allocate scoping information.  */
   4840 
   4841 static scope_t *
   4842 allocate_scope (void)
   4843 {
   4844   scope_t *ptr;
   4845   static scope_t initial_scope;
   4846 
   4847 #ifndef MALLOC_CHECK
   4848 
   4849   ptr = alloc_counts[(int) alloc_type_scope].free_list.f_scope;
   4850   if (ptr != (scope_t *) NULL)
   4851     alloc_counts[(int) alloc_type_scope].free_list.f_scope = ptr->free;
   4852   else
   4853     {
   4854       int unallocated	= alloc_counts[(int) alloc_type_scope].unallocated;
   4855       page_type *cur_page	= alloc_counts[(int) alloc_type_scope].cur_page;
   4856 
   4857       if (unallocated == 0)
   4858 	{
   4859 	  unallocated = PAGE_SIZE / sizeof (scope_t);
   4860 	  alloc_counts[(int) alloc_type_scope].cur_page = cur_page = allocate_page ();
   4861 	  alloc_counts[(int) alloc_type_scope].total_pages++;
   4862 	}
   4863 
   4864       ptr = &cur_page->scope[--unallocated];
   4865       alloc_counts[(int) alloc_type_scope].unallocated = unallocated;
   4866     }
   4867 
   4868 #else
   4869 
   4870   ptr = XNEW (scope_t);
   4871 
   4872 #endif
   4873 
   4874   alloc_counts[(int) alloc_type_scope].total_alloc++;
   4875   *ptr = initial_scope;
   4876   return ptr;
   4877 }
   4878 
   4879 /* Free scoping information.  */
   4880 
   4881 static void
   4882 free_scope (scope_t *ptr)
   4883 {
   4884   alloc_counts[(int) alloc_type_scope].total_free++;
   4885 
   4886 #ifndef MALLOC_CHECK
   4887   ptr->free = alloc_counts[(int) alloc_type_scope].free_list.f_scope;
   4888   alloc_counts[(int) alloc_type_scope].free_list.f_scope = ptr;
   4889 #else
   4890   free ((void *) ptr);
   4891 #endif
   4892 }
   4893 
   4894 /* Allocate links for pages in a virtual array.  */
   4896 
   4897 static vlinks_t *
   4898 allocate_vlinks (void)
   4899 {
   4900   vlinks_t *ptr;
   4901   static vlinks_t initial_vlinks;
   4902 
   4903 #ifndef MALLOC_CHECK
   4904 
   4905   int unallocated = alloc_counts[(int) alloc_type_vlinks].unallocated;
   4906   page_type *cur_page = alloc_counts[(int) alloc_type_vlinks].cur_page;
   4907 
   4908   if (unallocated == 0)
   4909     {
   4910       unallocated = PAGE_SIZE / sizeof (vlinks_t);
   4911       alloc_counts[(int) alloc_type_vlinks].cur_page = cur_page = allocate_page ();
   4912       alloc_counts[(int) alloc_type_vlinks].total_pages++;
   4913     }
   4914 
   4915   ptr = &cur_page->vlinks[--unallocated];
   4916   alloc_counts[(int) alloc_type_vlinks].unallocated = unallocated;
   4917 
   4918 #else
   4919 
   4920   ptr = XNEW (vlinks_t);
   4921 
   4922 #endif
   4923 
   4924   alloc_counts[(int) alloc_type_vlinks].total_alloc++;
   4925   *ptr = initial_vlinks;
   4926   return ptr;
   4927 }
   4928 
   4929 /* Allocate string hash buckets.  */
   4931 
   4932 static shash_t *
   4933 allocate_shash (void)
   4934 {
   4935   shash_t *ptr;
   4936   static shash_t initial_shash;
   4937 
   4938 #ifndef MALLOC_CHECK
   4939 
   4940   int unallocated = alloc_counts[(int) alloc_type_shash].unallocated;
   4941   page_type *cur_page = alloc_counts[(int) alloc_type_shash].cur_page;
   4942 
   4943   if (unallocated == 0)
   4944     {
   4945       unallocated = PAGE_SIZE / sizeof (shash_t);
   4946       alloc_counts[(int) alloc_type_shash].cur_page = cur_page = allocate_page ();
   4947       alloc_counts[(int) alloc_type_shash].total_pages++;
   4948     }
   4949 
   4950   ptr = &cur_page->shash[--unallocated];
   4951   alloc_counts[(int) alloc_type_shash].unallocated = unallocated;
   4952 
   4953 #else
   4954 
   4955   ptr = XNEW (shash_t);
   4956 
   4957 #endif
   4958 
   4959   alloc_counts[(int) alloc_type_shash].total_alloc++;
   4960   *ptr = initial_shash;
   4961   return ptr;
   4962 }
   4963 
   4964 /* Allocate type hash buckets.  */
   4966 
   4967 static thash_t *
   4968 allocate_thash (void)
   4969 {
   4970   thash_t *ptr;
   4971   static thash_t initial_thash;
   4972 
   4973 #ifndef MALLOC_CHECK
   4974 
   4975   int unallocated = alloc_counts[(int) alloc_type_thash].unallocated;
   4976   page_type *cur_page = alloc_counts[(int) alloc_type_thash].cur_page;
   4977 
   4978   if (unallocated == 0)
   4979     {
   4980       unallocated = PAGE_SIZE / sizeof (thash_t);
   4981       alloc_counts[(int) alloc_type_thash].cur_page = cur_page = allocate_page ();
   4982       alloc_counts[(int) alloc_type_thash].total_pages++;
   4983     }
   4984 
   4985   ptr = &cur_page->thash[--unallocated];
   4986   alloc_counts[(int) alloc_type_thash].unallocated = unallocated;
   4987 
   4988 #else
   4989 
   4990   ptr = XNEW (thash_t);
   4991 
   4992 #endif
   4993 
   4994   alloc_counts[(int) alloc_type_thash].total_alloc++;
   4995   *ptr = initial_thash;
   4996   return ptr;
   4997 }
   4998 
   4999 /* Allocate structure, union, or enum tag information.  */
   5001 
   5002 static tag_t *
   5003 allocate_tag (void)
   5004 {
   5005   tag_t *ptr;
   5006   static tag_t initial_tag;
   5007 
   5008 #ifndef MALLOC_CHECK
   5009 
   5010   ptr = alloc_counts[(int) alloc_type_tag].free_list.f_tag;
   5011   if (ptr != (tag_t *) NULL)
   5012     alloc_counts[(int) alloc_type_tag].free_list.f_tag = ptr->free;
   5013   else
   5014     {
   5015       int unallocated = alloc_counts[(int) alloc_type_tag].unallocated;
   5016       page_type *cur_page = alloc_counts[(int) alloc_type_tag].cur_page;
   5017 
   5018       if (unallocated == 0)
   5019 	{
   5020 	  unallocated = PAGE_SIZE / sizeof (tag_t);
   5021 	  alloc_counts[(int) alloc_type_tag].cur_page = cur_page = allocate_page ();
   5022 	  alloc_counts[(int) alloc_type_tag].total_pages++;
   5023 	}
   5024 
   5025       ptr = &cur_page->tag[--unallocated];
   5026       alloc_counts[(int) alloc_type_tag].unallocated = unallocated;
   5027     }
   5028 
   5029 #else
   5030 
   5031   ptr = XNEW (tag_t);
   5032 
   5033 #endif
   5034 
   5035   alloc_counts[(int) alloc_type_tag].total_alloc++;
   5036   *ptr = initial_tag;
   5037   return ptr;
   5038 }
   5039 
   5040 /* Free scoping information.  */
   5041 
   5042 static void
   5043 free_tag (tag_t *ptr)
   5044 {
   5045   alloc_counts[(int) alloc_type_tag].total_free++;
   5046 
   5047 #ifndef MALLOC_CHECK
   5048   ptr->free = alloc_counts[(int) alloc_type_tag].free_list.f_tag;
   5049   alloc_counts[(int) alloc_type_tag].free_list.f_tag = ptr;
   5050 #else
   5051   free ((PTR_T) ptr);
   5052 #endif
   5053 }
   5054 
   5055 /* Allocate forward reference to a yet unknown tag.  */
   5057 
   5058 static forward_t *
   5059 allocate_forward (void)
   5060 {
   5061   forward_t *ptr;
   5062   static forward_t initial_forward;
   5063 
   5064 #ifndef MALLOC_CHECK
   5065 
   5066   int unallocated = alloc_counts[(int) alloc_type_forward].unallocated;
   5067   page_type *cur_page = alloc_counts[(int) alloc_type_forward].cur_page;
   5068 
   5069   if (unallocated == 0)
   5070     {
   5071       unallocated = PAGE_SIZE / sizeof (forward_t);
   5072       alloc_counts[(int) alloc_type_forward].cur_page = cur_page = allocate_page ();
   5073       alloc_counts[(int) alloc_type_forward].total_pages++;
   5074     }
   5075 
   5076   ptr = &cur_page->forward[--unallocated];
   5077   alloc_counts[(int) alloc_type_forward].unallocated = unallocated;
   5078 
   5079 #else
   5080 
   5081   ptr = XNEW (forward_t);
   5082 
   5083 #endif
   5084 
   5085   alloc_counts[(int) alloc_type_forward].total_alloc++;
   5086   *ptr = initial_forward;
   5087   return ptr;
   5088 }
   5089 
   5090 /* Allocate head of type hash list.  */
   5092 
   5093 static thead_t *
   5094 allocate_thead (void)
   5095 {
   5096   thead_t *ptr;
   5097   static thead_t initial_thead;
   5098 
   5099 #ifndef MALLOC_CHECK
   5100 
   5101   ptr = alloc_counts[(int) alloc_type_thead].free_list.f_thead;
   5102   if (ptr != (thead_t *) NULL)
   5103     alloc_counts[(int) alloc_type_thead].free_list.f_thead = ptr->free;
   5104   else
   5105     {
   5106       int unallocated = alloc_counts[(int) alloc_type_thead].unallocated;
   5107       page_type *cur_page = alloc_counts[(int) alloc_type_thead].cur_page;
   5108 
   5109       if (unallocated == 0)
   5110 	{
   5111 	  unallocated = PAGE_SIZE / sizeof (thead_t);
   5112 	  alloc_counts[(int) alloc_type_thead].cur_page = cur_page = allocate_page ();
   5113 	  alloc_counts[(int) alloc_type_thead].total_pages++;
   5114 	}
   5115 
   5116       ptr = &cur_page->thead[--unallocated];
   5117       alloc_counts[(int) alloc_type_thead].unallocated = unallocated;
   5118     }
   5119 
   5120 #else
   5121 
   5122   ptr = XNEW (thead_t);
   5123 
   5124 #endif
   5125 
   5126   alloc_counts[(int) alloc_type_thead].total_alloc++;
   5127   *ptr = initial_thead;
   5128   return ptr;
   5129 }
   5130 
   5131 /* Free scoping information.  */
   5132 
   5133 static void
   5134 free_thead (thead_t *ptr)
   5135 {
   5136   alloc_counts[(int) alloc_type_thead].total_free++;
   5137 
   5138 #ifndef MALLOC_CHECK
   5139   ptr->free = (thead_t *) alloc_counts[(int) alloc_type_thead].free_list.f_thead;
   5140   alloc_counts[(int) alloc_type_thead].free_list.f_thead = ptr;
   5141 #else
   5142   free ((PTR_T) ptr);
   5143 #endif
   5144 }
   5145 
   5146 static lineno_list_t *
   5148 allocate_lineno_list (void)
   5149 {
   5150   lineno_list_t *ptr;
   5151   static lineno_list_t initial_lineno_list;
   5152 
   5153 #ifndef MALLOC_CHECK
   5154 
   5155   int unallocated = alloc_counts[(int) alloc_type_lineno].unallocated;
   5156   page_type *cur_page = alloc_counts[(int) alloc_type_lineno].cur_page;
   5157 
   5158   if (unallocated == 0)
   5159     {
   5160       unallocated = PAGE_SIZE / sizeof (lineno_list_t);
   5161       alloc_counts[(int) alloc_type_lineno].cur_page = cur_page = allocate_page ();
   5162       alloc_counts[(int) alloc_type_lineno].total_pages++;
   5163     }
   5164 
   5165   ptr = &cur_page->lineno[--unallocated];
   5166   alloc_counts[(int) alloc_type_lineno].unallocated = unallocated;
   5167 
   5168 #else
   5169 
   5170   ptr = XNEW (lineno_list_t);
   5171 
   5172 #endif
   5173 
   5174   alloc_counts[(int) alloc_type_lineno].total_alloc++;
   5175   *ptr = initial_lineno_list;
   5176   return ptr;
   5177 }
   5178 
   5179 void
   5180 ecoff_set_gp_prolog_size (int sz)
   5181 {
   5182   if (cur_proc_ptr == 0)
   5183     return;
   5184 
   5185   cur_proc_ptr->pdr.gp_prologue = sz;
   5186   if (cur_proc_ptr->pdr.gp_prologue != sz)
   5187     {
   5188       as_warn (_("GP prologue size exceeds field size, using 0 instead"));
   5189       cur_proc_ptr->pdr.gp_prologue = 0;
   5190     }
   5191 
   5192   cur_proc_ptr->pdr.gp_used = 1;
   5193 }
   5194 
   5195 int
   5196 ecoff_no_current_file (void)
   5197 {
   5198   return cur_file_ptr == (efdr_t *) NULL;
   5199 }
   5200 
   5201 void
   5202 ecoff_generate_asm_lineno (void)
   5203 {
   5204   unsigned int lineno;
   5205   const char *filename;
   5206   lineno_list_t *list;
   5207 
   5208   filename = as_where (&lineno);
   5209 
   5210   if (current_stabs_filename == (char *) NULL
   5211       || filename_cmp (current_stabs_filename, filename))
   5212     add_file (filename, 0, 1);
   5213 
   5214   list = allocate_lineno_list ();
   5215 
   5216   list->next = (lineno_list_t *) NULL;
   5217   list->file = cur_file_ptr;
   5218   list->proc = cur_proc_ptr;
   5219   list->frag = frag_now;
   5220   list->paddr = frag_now_fix ();
   5221   list->lineno = lineno;
   5222 
   5223   /* We don't want to merge files which have line numbers.  */
   5224   cur_file_ptr->fdr.fMerge = 0;
   5225 
   5226   /* A .loc directive will sometimes appear before a .ent directive,
   5227      which means that cur_proc_ptr will be NULL here.  Arrange to
   5228      patch this up.  */
   5229   if (cur_proc_ptr == (proc_t *) NULL)
   5230     {
   5231       lineno_list_t **pl;
   5232 
   5233       pl = &noproc_lineno;
   5234       while (*pl != (lineno_list_t *) NULL)
   5235 	pl = &(*pl)->next;
   5236       *pl = list;
   5237     }
   5238   else
   5239     {
   5240       last_lineno = list;
   5241       *last_lineno_ptr = list;
   5242       last_lineno_ptr = &list->next;
   5243     }
   5244 }
   5245 
   5246 #else
   5247 
   5248 void
   5249 ecoff_generate_asm_lineno (void)
   5250 {
   5251 }
   5252 
   5253 #endif /* ECOFF_DEBUGGING */
   5254