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