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