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