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