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