~ubuntu-branches/ubuntu/hoary/binutils/hoary

« back to all changes in this revision

Viewing changes to gas/ecoff.c

  • Committer: Bazaar Package Importer
  • Author(s): James Troup
  • Date: 2004-05-19 10:35:44 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20040519103544-17h3o6e8pwndydrg
Tags: 2.14.90.0.7-8
debian/rules: don't use gcc-2.95 on m68k.  Thanks to Adam Conrad for
pointing this out.

Show diffs side-by-side

added added

removed removed

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