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