ecoff.c revision 1.5 1 /* ECOFF debugging support.
2 Copyright (C) 1993-2016 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 indexs 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 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 struct hash_control *str_hash; /* string hash table */
952 thash_t *thash_head[THASH_SIZE];
953 } efdr_t;
954
955 /* Pre-initialized extended file structure. */
956 static const efdr_t init_file = {
957 { /* FDR structure */
958 0, /* adr: memory address of beginning of file */
959 0, /* rss: file name (of source, if known) */
960 0, /* issBase: file's string space */
961 0, /* cbSs: number of bytes in the ss */
962 0, /* isymBase: beginning of symbols */
963 0, /* csym: count file's of symbols */
964 0, /* ilineBase: file's line symbols */
965 0, /* cline: count of file's line symbols */
966 0, /* ioptBase: file's optimization entries */
967 0, /* copt: count of file's optimization entries */
968 0, /* ipdFirst: start of procedures for this file */
969 0, /* cpd: count of procedures for this file */
970 0, /* iauxBase: file's auxiliary entries */
971 0, /* caux: count of file's auxiliary entries */
972 0, /* rfdBase: index into the file indirect table */
973 0, /* crfd: count file indirect entries */
974 langC, /* lang: language for this file */
975 1, /* fMerge: whether this file can be merged */
976 0, /* fReadin: true if read in (not just created) */
977 TARGET_BYTES_BIG_ENDIAN, /* fBigendian: if 1, compiled on big endian machine */
978 GLEVEL_2, /* glevel: level this file was compiled with */
979 0, /* reserved: reserved for future use */
980 0, /* cbLineOffset: byte offset from header for this file ln's */
981 0, /* cbLine: size of lines for this file */
982 },
983
984 (FDR *)0, /* orig_fdr: original file header pointer */
985 (char *)0, /* name: pointer to filename */
986 0, /* fake: whether this is a faked .file */
987 0, /* void_type: ptr to aux node for void type */
988 0, /* int_type: ptr to aux node for int type */
989 (scope_t *)0, /* cur_scope: current scope being processed */
990 0, /* file_index: current file # */
991 0, /* nested_scopes: # nested scopes */
992 INIT_VARRAY (char), /* strings: local string varray */
993 INIT_VARRAY (localsym_t), /* symbols: local symbols varray */
994 INIT_VARRAY (proc_t), /* procs: procedure varray */
995 INIT_VARRAY (aux_t), /* aux_syms: auxiliary symbols varray */
996
997 (struct efdr *)0, /* next_file: next file structure */
998
999 (struct hash_control *)0, /* str_hash: string hash table */
1000 { 0 }, /* thash_head: type hash table */
1001 };
1002
1003 static efdr_t *first_file; /* first file descriptor */
1004 static efdr_t **last_file_ptr = &first_file; /* file descriptor tail */
1005
1006 /* Line number information is kept in a list until the assembly is
1007 finished. */
1008 typedef struct lineno_list {
1009 struct lineno_list *next; /* next element in list */
1010 efdr_t *file; /* file this line is in */
1011 proc_t *proc; /* procedure this line is in */
1012 fragS *frag; /* fragment this line number is in */
1013 unsigned long paddr; /* offset within fragment */
1014 long lineno; /* actual line number */
1015 } lineno_list_t;
1016
1017 static lineno_list_t *first_lineno;
1018 static lineno_list_t *last_lineno;
1019 static lineno_list_t **last_lineno_ptr = &first_lineno;
1020
1021 /* Sometimes there will be some .loc statements before a .ent. We
1022 keep them in this list so that we can fill in the procedure pointer
1023 after we see the .ent. */
1024 static lineno_list_t *noproc_lineno;
1025
1026 /* Union of various things that are held in pages. */
1027 typedef union page {
1028 char byte [ PAGE_SIZE ];
1029 unsigned char ubyte [ PAGE_SIZE ];
1030 efdr_t file [ PAGE_SIZE / sizeof (efdr_t) ];
1031 FDR ofile [ PAGE_SIZE / sizeof (FDR) ];
1032 proc_t proc [ PAGE_SIZE / sizeof (proc_t) ];
1033 localsym_t sym [ PAGE_SIZE / sizeof (localsym_t) ];
1034 aux_t aux [ PAGE_SIZE / sizeof (aux_t) ];
1035 DNR dense [ PAGE_SIZE / sizeof (DNR) ];
1036 scope_t scope [ PAGE_SIZE / sizeof (scope_t) ];
1037 vlinks_t vlinks [ PAGE_SIZE / sizeof (vlinks_t) ];
1038 shash_t shash [ PAGE_SIZE / sizeof (shash_t) ];
1039 thash_t thash [ PAGE_SIZE / sizeof (thash_t) ];
1040 tag_t tag [ PAGE_SIZE / sizeof (tag_t) ];
1041 forward_t forward [ PAGE_SIZE / sizeof (forward_t) ];
1042 thead_t thead [ PAGE_SIZE / sizeof (thead_t) ];
1043 lineno_list_t lineno [ PAGE_SIZE / sizeof (lineno_list_t) ];
1044 } page_type;
1045
1046 /* Structure holding allocation information for small sized structures. */
1047 typedef struct alloc_info {
1048 char *alloc_name; /* name of this allocation type (must be first) */
1049 page_type *cur_page; /* current page being allocated from */
1050 small_free_t free_list; /* current free list if any */
1051 int unallocated; /* number of elements unallocated on page */
1052 int total_alloc; /* total number of allocations */
1053 int total_free; /* total number of frees */
1054 int total_pages; /* total number of pages allocated */
1055 } alloc_info_t;
1056
1057 /* Type information collected together. */
1058 typedef struct type_info {
1059 bt_t basic_type; /* basic type */
1060 int orig_type; /* original COFF-based type */
1061 int num_tq; /* # type qualifiers */
1062 int num_dims; /* # dimensions */
1063 int num_sizes; /* # sizes */
1064 int extra_sizes; /* # extra sizes not tied with dims */
1065 tag_t * tag_ptr; /* tag pointer */
1066 int bitfield; /* symbol is a bitfield */
1067 tq_t type_qualifiers[N_TQ]; /* type qualifiers (ptr, func, array)*/
1068 symint_t dimensions [N_TQ]; /* dimensions for each array */
1069 symint_t sizes [N_TQ+2]; /* sizes of each array slice + size of
1070 struct/union/enum + bitfield size */
1071 } type_info_t;
1072
1073 /* Pre-initialized type_info struct. */
1074 static const type_info_t type_info_init = {
1075 bt_Nil, /* basic type */
1076 T_NULL, /* original COFF-based type */
1077 0, /* # type qualifiers */
1078 0, /* # dimensions */
1079 0, /* # sizes */
1080 0, /* sizes not tied with dims */
1081 NULL, /* ptr to tag */
1082 0, /* bitfield */
1083 { /* type qualifiers */
1084 tq_Nil,
1085 tq_Nil,
1086 tq_Nil,
1087 tq_Nil,
1088 tq_Nil,
1089 tq_Nil,
1090 },
1091 { /* dimensions */
1092 0,
1093 0,
1094 0,
1095 0,
1096 0,
1097 0
1098 },
1099 { /* sizes */
1100 0,
1101 0,
1102 0,
1103 0,
1104 0,
1105 0,
1106 0,
1107 0,
1108 },
1109 };
1110
1111 /* Global hash table for the tags table and global table for file
1112 descriptors. */
1113
1114 static varray_t file_desc = INIT_VARRAY (efdr_t);
1115
1116 static struct hash_control *tag_hash;
1117
1118 /* Static types for int and void. Also, remember the last function's
1119 type (which is set up when we encounter the declaration for the
1120 function, and used when the end block for the function is emitted. */
1121
1122 static type_info_t int_type_info;
1123 static type_info_t void_type_info;
1124 static type_info_t last_func_type_info;
1125 static symbolS *last_func_sym_value;
1126
1127 /* Convert COFF basic type to ECOFF basic type. The T_NULL type
1128 really should use bt_Void, but this causes the current ecoff GDB to
1129 issue unsupported type messages, and the Ultrix 4.00 dbx (aka MIPS
1130 2.0) doesn't understand it, even though the compiler generates it.
1131 Maybe this will be fixed in 2.10 or 2.20 of the MIPS compiler
1132 suite, but for now go with what works.
1133
1134 It would make sense for the .type and .scl directives to use the
1135 ECOFF numbers directly, rather than using the COFF numbers and
1136 mapping them. Unfortunately, this is historically what mips-tfile
1137 expects, and changing gcc now would be a considerable pain (the
1138 native compiler generates debugging information internally, rather
1139 than via the assembler, so it will never use .type or .scl). */
1140
1141 static const bt_t map_coff_types[] = {
1142 bt_Nil, /* T_NULL */
1143 bt_Nil, /* T_ARG */
1144 bt_Char, /* T_CHAR */
1145 bt_Short, /* T_SHORT */
1146 bt_Int, /* T_INT */
1147 bt_Long, /* T_LONG */
1148 bt_Float, /* T_FLOAT */
1149 bt_Double, /* T_DOUBLE */
1150 bt_Struct, /* T_STRUCT */
1151 bt_Union, /* T_UNION */
1152 bt_Enum, /* T_ENUM */
1153 bt_Enum, /* T_MOE */
1154 bt_UChar, /* T_UCHAR */
1155 bt_UShort, /* T_USHORT */
1156 bt_UInt, /* T_UINT */
1157 bt_ULong /* T_ULONG */
1158 };
1159
1160 /* Convert COFF storage class to ECOFF storage class. */
1161 static const sc_t map_coff_storage[] = {
1162 sc_Nil, /* 0: C_NULL */
1163 sc_Abs, /* 1: C_AUTO auto var */
1164 sc_Undefined, /* 2: C_EXT external */
1165 sc_Data, /* 3: C_STAT static */
1166 sc_Register, /* 4: C_REG register */
1167 sc_Undefined, /* 5: C_EXTDEF ??? */
1168 sc_Text, /* 6: C_LABEL label */
1169 sc_Text, /* 7: C_ULABEL user label */
1170 sc_Info, /* 8: C_MOS member of struct */
1171 sc_Abs, /* 9: C_ARG argument */
1172 sc_Info, /* 10: C_STRTAG struct tag */
1173 sc_Info, /* 11: C_MOU member of union */
1174 sc_Info, /* 12: C_UNTAG union tag */
1175 sc_Info, /* 13: C_TPDEF typedef */
1176 sc_Data, /* 14: C_USTATIC ??? */
1177 sc_Info, /* 15: C_ENTAG enum tag */
1178 sc_Info, /* 16: C_MOE member of enum */
1179 sc_Register, /* 17: C_REGPARM register parameter */
1180 sc_Bits, /* 18; C_FIELD bitfield */
1181 sc_Nil, /* 19 */
1182 sc_Nil, /* 20 */
1183 sc_Nil, /* 21 */
1184 sc_Nil, /* 22 */
1185 sc_Nil, /* 23 */
1186 sc_Nil, /* 24 */
1187 sc_Nil, /* 25 */
1188 sc_Nil, /* 26 */
1189 sc_Nil, /* 27 */
1190 sc_Nil, /* 28 */
1191 sc_Nil, /* 29 */
1192 sc_Nil, /* 30 */
1193 sc_Nil, /* 31 */
1194 sc_Nil, /* 32 */
1195 sc_Nil, /* 33 */
1196 sc_Nil, /* 34 */
1197 sc_Nil, /* 35 */
1198 sc_Nil, /* 36 */
1199 sc_Nil, /* 37 */
1200 sc_Nil, /* 38 */
1201 sc_Nil, /* 39 */
1202 sc_Nil, /* 40 */
1203 sc_Nil, /* 41 */
1204 sc_Nil, /* 42 */
1205 sc_Nil, /* 43 */
1206 sc_Nil, /* 44 */
1207 sc_Nil, /* 45 */
1208 sc_Nil, /* 46 */
1209 sc_Nil, /* 47 */
1210 sc_Nil, /* 48 */
1211 sc_Nil, /* 49 */
1212 sc_Nil, /* 50 */
1213 sc_Nil, /* 51 */
1214 sc_Nil, /* 52 */
1215 sc_Nil, /* 53 */
1216 sc_Nil, /* 54 */
1217 sc_Nil, /* 55 */
1218 sc_Nil, /* 56 */
1219 sc_Nil, /* 57 */
1220 sc_Nil, /* 58 */
1221 sc_Nil, /* 59 */
1222 sc_Nil, /* 60 */
1223 sc_Nil, /* 61 */
1224 sc_Nil, /* 62 */
1225 sc_Nil, /* 63 */
1226 sc_Nil, /* 64 */
1227 sc_Nil, /* 65 */
1228 sc_Nil, /* 66 */
1229 sc_Nil, /* 67 */
1230 sc_Nil, /* 68 */
1231 sc_Nil, /* 69 */
1232 sc_Nil, /* 70 */
1233 sc_Nil, /* 71 */
1234 sc_Nil, /* 72 */
1235 sc_Nil, /* 73 */
1236 sc_Nil, /* 74 */
1237 sc_Nil, /* 75 */
1238 sc_Nil, /* 76 */
1239 sc_Nil, /* 77 */
1240 sc_Nil, /* 78 */
1241 sc_Nil, /* 79 */
1242 sc_Nil, /* 80 */
1243 sc_Nil, /* 81 */
1244 sc_Nil, /* 82 */
1245 sc_Nil, /* 83 */
1246 sc_Nil, /* 84 */
1247 sc_Nil, /* 85 */
1248 sc_Nil, /* 86 */
1249 sc_Nil, /* 87 */
1250 sc_Nil, /* 88 */
1251 sc_Nil, /* 89 */
1252 sc_Nil, /* 90 */
1253 sc_Nil, /* 91 */
1254 sc_Nil, /* 92 */
1255 sc_Nil, /* 93 */
1256 sc_Nil, /* 94 */
1257 sc_Nil, /* 95 */
1258 sc_Nil, /* 96 */
1259 sc_Nil, /* 97 */
1260 sc_Nil, /* 98 */
1261 sc_Nil, /* 99 */
1262 sc_Text, /* 100: C_BLOCK block start/end */
1263 sc_Text, /* 101: C_FCN function start/end */
1264 sc_Info, /* 102: C_EOS end of struct/union/enum */
1265 sc_Nil, /* 103: C_FILE file start */
1266 sc_Nil, /* 104: C_LINE line number */
1267 sc_Nil, /* 105: C_ALIAS combined type info */
1268 sc_Nil, /* 106: C_HIDDEN ??? */
1269 };
1270
1271 /* Convert COFF storage class to ECOFF symbol type. */
1272 static const st_t map_coff_sym_type[] = {
1273 st_Nil, /* 0: C_NULL */
1274 st_Local, /* 1: C_AUTO auto var */
1275 st_Global, /* 2: C_EXT external */
1276 st_Static, /* 3: C_STAT static */
1277 st_Local, /* 4: C_REG register */
1278 st_Global, /* 5: C_EXTDEF ??? */
1279 st_Label, /* 6: C_LABEL label */
1280 st_Label, /* 7: C_ULABEL user label */
1281 st_Member, /* 8: C_MOS member of struct */
1282 st_Param, /* 9: C_ARG argument */
1283 st_Block, /* 10: C_STRTAG struct tag */
1284 st_Member, /* 11: C_MOU member of union */
1285 st_Block, /* 12: C_UNTAG union tag */
1286 st_Typedef, /* 13: C_TPDEF typedef */
1287 st_Static, /* 14: C_USTATIC ??? */
1288 st_Block, /* 15: C_ENTAG enum tag */
1289 st_Member, /* 16: C_MOE member of enum */
1290 st_Param, /* 17: C_REGPARM register parameter */
1291 st_Member, /* 18; C_FIELD bitfield */
1292 st_Nil, /* 19 */
1293 st_Nil, /* 20 */
1294 st_Nil, /* 21 */
1295 st_Nil, /* 22 */
1296 st_Nil, /* 23 */
1297 st_Nil, /* 24 */
1298 st_Nil, /* 25 */
1299 st_Nil, /* 26 */
1300 st_Nil, /* 27 */
1301 st_Nil, /* 28 */
1302 st_Nil, /* 29 */
1303 st_Nil, /* 30 */
1304 st_Nil, /* 31 */
1305 st_Nil, /* 32 */
1306 st_Nil, /* 33 */
1307 st_Nil, /* 34 */
1308 st_Nil, /* 35 */
1309 st_Nil, /* 36 */
1310 st_Nil, /* 37 */
1311 st_Nil, /* 38 */
1312 st_Nil, /* 39 */
1313 st_Nil, /* 40 */
1314 st_Nil, /* 41 */
1315 st_Nil, /* 42 */
1316 st_Nil, /* 43 */
1317 st_Nil, /* 44 */
1318 st_Nil, /* 45 */
1319 st_Nil, /* 46 */
1320 st_Nil, /* 47 */
1321 st_Nil, /* 48 */
1322 st_Nil, /* 49 */
1323 st_Nil, /* 50 */
1324 st_Nil, /* 51 */
1325 st_Nil, /* 52 */
1326 st_Nil, /* 53 */
1327 st_Nil, /* 54 */
1328 st_Nil, /* 55 */
1329 st_Nil, /* 56 */
1330 st_Nil, /* 57 */
1331 st_Nil, /* 58 */
1332 st_Nil, /* 59 */
1333 st_Nil, /* 60 */
1334 st_Nil, /* 61 */
1335 st_Nil, /* 62 */
1336 st_Nil, /* 63 */
1337 st_Nil, /* 64 */
1338 st_Nil, /* 65 */
1339 st_Nil, /* 66 */
1340 st_Nil, /* 67 */
1341 st_Nil, /* 68 */
1342 st_Nil, /* 69 */
1343 st_Nil, /* 70 */
1344 st_Nil, /* 71 */
1345 st_Nil, /* 72 */
1346 st_Nil, /* 73 */
1347 st_Nil, /* 74 */
1348 st_Nil, /* 75 */
1349 st_Nil, /* 76 */
1350 st_Nil, /* 77 */
1351 st_Nil, /* 78 */
1352 st_Nil, /* 79 */
1353 st_Nil, /* 80 */
1354 st_Nil, /* 81 */
1355 st_Nil, /* 82 */
1356 st_Nil, /* 83 */
1357 st_Nil, /* 84 */
1358 st_Nil, /* 85 */
1359 st_Nil, /* 86 */
1360 st_Nil, /* 87 */
1361 st_Nil, /* 88 */
1362 st_Nil, /* 89 */
1363 st_Nil, /* 90 */
1364 st_Nil, /* 91 */
1365 st_Nil, /* 92 */
1366 st_Nil, /* 93 */
1367 st_Nil, /* 94 */
1368 st_Nil, /* 95 */
1369 st_Nil, /* 96 */
1370 st_Nil, /* 97 */
1371 st_Nil, /* 98 */
1372 st_Nil, /* 99 */
1373 st_Block, /* 100: C_BLOCK block start/end */
1374 st_Proc, /* 101: C_FCN function start/end */
1375 st_End, /* 102: C_EOS end of struct/union/enum */
1376 st_File, /* 103: C_FILE file start */
1377 st_Nil, /* 104: C_LINE line number */
1378 st_Nil, /* 105: C_ALIAS combined type info */
1379 st_Nil, /* 106: C_HIDDEN ??? */
1380 };
1381
1382 /* Keep track of different sized allocation requests. */
1383 static alloc_info_t alloc_counts[(int) alloc_type_last];
1384
1385 /* Record whether we have seen any debugging information. */
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 struct hash_control *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);
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 = hash_new ();
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 struct hash_control *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 *) hash_find (hash_tbl, str);
1569 if (hash_ptr == (shash_t *) NULL)
1570 {
1571 const char *err;
1572
1573 if (vp->objects_last_page + len >= PAGE_USIZE)
1574 {
1575 vp->num_allocated =
1576 ((vp->num_allocated + PAGE_USIZE - 1) / PAGE_USIZE) * PAGE_USIZE;
1577 add_varray_page (vp);
1578 }
1579
1580 hash_ptr = allocate_shash ();
1581 hash_ptr->indx = vp->num_allocated;
1582
1583 hash_ptr->string = &vp->last->datum->byte[vp->objects_last_page];
1584
1585 vp->objects_last_page += len + 1;
1586 vp->num_allocated += len + 1;
1587
1588 strcpy (hash_ptr->string, str);
1589
1590 err = hash_insert (hash_tbl, str, (char *) hash_ptr);
1591 if (err)
1592 as_fatal (_("inserting \"%s\" into string hash table: %s"),
1593 str, err);
1594 }
1595
1596 if (ret_hash != (shash_t **) NULL)
1597 *ret_hash = hash_ptr;
1598
1599 return hash_ptr->indx;
1600 }
1601
1602 /* Add debugging information for a symbol. */
1604
1605 static localsym_t *
1606 add_ecoff_symbol (const char *str, /* symbol name */
1607 st_t type, /* symbol type */
1608 sc_t storage, /* storage class */
1609 symbolS *sym_value, /* associated symbol. */
1610 bfd_vma addend, /* addend to sym_value. */
1611 symint_t value, /* value of symbol */
1612 symint_t indx /* index to local/aux. syms */)
1613 {
1614 localsym_t *psym;
1615 scope_t *pscope;
1616 thead_t *ptag_head;
1617 tag_t *ptag;
1618 tag_t *ptag_next;
1619 varray_t *vp;
1620 int scope_delta = 0;
1621 shash_t *hash_ptr = (shash_t *) NULL;
1622
1623 if (cur_file_ptr == (efdr_t *) NULL)
1624 as_fatal (_("no current file pointer"));
1625
1626 vp = &cur_file_ptr->symbols;
1627
1628 if (vp->objects_last_page == vp->objects_per_page)
1629 add_varray_page (vp);
1630
1631 psym = &vp->last->datum->sym[vp->objects_last_page++];
1632
1633 if (str == (const char *) NULL && sym_value != (symbolS *) NULL)
1634 psym->name = S_GET_NAME (sym_value);
1635 else
1636 psym->name = str;
1637 psym->as_sym = sym_value;
1638 if (sym_value != (symbolS *) NULL)
1639 symbol_get_obj (sym_value)->ecoff_symbol = psym;
1640 psym->addend = addend;
1641 psym->file_ptr = cur_file_ptr;
1642 psym->proc_ptr = cur_proc_ptr;
1643 psym->begin_ptr = (localsym_t *) NULL;
1644 psym->index_ptr = (aux_t *) NULL;
1645 psym->forward_ref = (forward_t *) NULL;
1646 psym->sym_index = -1;
1647 memset (&psym->ecoff_sym, 0, sizeof (EXTR));
1648 psym->ecoff_sym.asym.value = value;
1649 psym->ecoff_sym.asym.st = (unsigned) type;
1650 psym->ecoff_sym.asym.sc = (unsigned) storage;
1651 psym->ecoff_sym.asym.index = indx;
1652
1653 /* If there is an associated symbol, we wait until the end of the
1654 assembly before deciding where to put the name (it may be just an
1655 external symbol). Otherwise, this is just a debugging symbol and
1656 the name should go with the current file. */
1657 if (sym_value == (symbolS *) NULL)
1658 psym->ecoff_sym.asym.iss = ((str == (const char *) NULL)
1659 ? 0
1660 : add_string (&cur_file_ptr->strings,
1661 cur_file_ptr->str_hash,
1662 str,
1663 &hash_ptr));
1664
1665 ++vp->num_allocated;
1666
1667 if (ECOFF_IS_STAB (&psym->ecoff_sym.asym))
1668 return psym;
1669
1670 /* Save the symbol within the hash table if this is a static
1671 item, and it has a name. */
1672 if (hash_ptr != (shash_t *) NULL
1673 && (type == st_Global || type == st_Static || type == st_Label
1674 || type == st_Proc || type == st_StaticProc))
1675 hash_ptr->sym_ptr = psym;
1676
1677 /* push or pop a scope if appropriate. */
1678 switch (type)
1679 {
1680 default:
1681 break;
1682
1683 case st_File: /* beginning of file */
1684 case st_Proc: /* procedure */
1685 case st_StaticProc: /* static procedure */
1686 case st_Block: /* begin scope */
1687 pscope = allocate_scope ();
1688 pscope->prev = cur_file_ptr->cur_scope;
1689 pscope->lsym = psym;
1690 pscope->type = type;
1691 cur_file_ptr->cur_scope = pscope;
1692
1693 if (type != st_File)
1694 scope_delta = 1;
1695
1696 /* For every block type except file, struct, union, or
1697 enumeration blocks, push a level on the tag stack. We omit
1698 file types, so that tags can span file boundaries. */
1699 if (type != st_File && storage != sc_Info)
1700 {
1701 ptag_head = allocate_thead ();
1702 ptag_head->first_tag = 0;
1703 ptag_head->prev = cur_tag_head;
1704 cur_tag_head = ptag_head;
1705 }
1706 break;
1707
1708 case st_End:
1709 pscope = cur_file_ptr->cur_scope;
1710 if (pscope == (scope_t *) NULL)
1711 as_fatal (_("too many st_End's"));
1712 else
1713 {
1714 st_t begin_type = (st_t) pscope->lsym->ecoff_sym.asym.st;
1715
1716 psym->begin_ptr = pscope->lsym;
1717
1718 if (begin_type != st_File)
1719 scope_delta = -1;
1720
1721 /* Except for file, structure, union, or enumeration end
1722 blocks remove all tags created within this scope. */
1723 if (begin_type != st_File && storage != sc_Info)
1724 {
1725 ptag_head = cur_tag_head;
1726 cur_tag_head = ptag_head->prev;
1727
1728 for (ptag = ptag_head->first_tag;
1729 ptag != (tag_t *) NULL;
1730 ptag = ptag_next)
1731 {
1732 if (ptag->forward_ref != (forward_t *) NULL)
1733 add_unknown_tag (ptag);
1734
1735 ptag_next = ptag->same_block;
1736 ptag->hash_ptr->tag_ptr = ptag->same_name;
1737 free_tag (ptag);
1738 }
1739
1740 free_thead (ptag_head);
1741 }
1742
1743 cur_file_ptr->cur_scope = pscope->prev;
1744
1745 /* block begin gets next sym #. This is set when we know
1746 the symbol index value. */
1747
1748 /* Functions push two or more aux words as follows:
1749 1st word: index+1 of the end symbol (filled in later).
1750 2nd word: type of the function (plus any aux words needed).
1751 Also, tie the external pointer back to the function begin symbol. */
1752 if (begin_type != st_File && begin_type != st_Block)
1753 {
1754 symint_t ty;
1755 varray_t *svp = &cur_file_ptr->aux_syms;
1756
1757 pscope->lsym->ecoff_sym.asym.index = add_aux_sym_symint (0);
1758 pscope->lsym->index_ptr =
1759 &svp->last->datum->aux[svp->objects_last_page - 1];
1760 ty = add_aux_sym_tir (&last_func_type_info,
1761 hash_no,
1762 &cur_file_ptr->thash_head[0]);
1763 (void) ty;
1764 /* This seems to be unnecessary. I'm not even sure what it is
1765 * intended to do. It's from mips-tfile.
1766 * if (last_func_sym_value != (symbolS *) NULL)
1767 * {
1768 * last_func_sym_value->ifd = cur_file_ptr->file_index;
1769 * last_func_sym_value->index = ty;
1770 * }
1771 */
1772 }
1773
1774 free_scope (pscope);
1775 }
1776 }
1777
1778 cur_file_ptr->nested_scopes += scope_delta;
1779
1780 #ifdef ECOFF_DEBUG
1781 if (debug && type != st_File
1782 && (debug > 2 || type == st_Block || type == st_End
1783 || type == st_Proc || type == st_StaticProc))
1784 {
1785 char *sc_str = sc_to_string (storage);
1786 char *st_str = st_to_string (type);
1787 int depth = cur_file_ptr->nested_scopes + (scope_delta < 0);
1788
1789 fprintf (stderr,
1790 "\tlsym\tv= %10ld, depth= %2d, sc= %-12s",
1791 value, depth, sc_str);
1792
1793 if (str_start && str_end_p1 - str_start > 0)
1794 fprintf (stderr, " st= %-11s name= %.*s\n",
1795 st_str, str_end_p1 - str_start, str_start);
1796 else
1797 {
1798 unsigned long len = strlen (st_str);
1799 fprintf (stderr, " st= %.*s\n", len - 1, st_str);
1800 }
1801 }
1802 #endif
1803
1804 return psym;
1805 }
1806
1807 /* Add an auxiliary symbol (passing a symint). This is actually used
1809 for integral aux types, not just symints. */
1810
1811 static symint_t
1812 add_aux_sym_symint (symint_t aux_word /* auxiliary information word */)
1813 {
1814 varray_t *vp;
1815 aux_t *aux_ptr;
1816
1817 if (cur_file_ptr == (efdr_t *) NULL)
1818 as_fatal (_("no current file pointer"));
1819
1820 vp = &cur_file_ptr->aux_syms;
1821
1822 if (vp->objects_last_page == vp->objects_per_page)
1823 add_varray_page (vp);
1824
1825 aux_ptr = &vp->last->datum->aux[vp->objects_last_page++];
1826 aux_ptr->type = aux_isym;
1827 aux_ptr->data.isym = aux_word;
1828
1829 return vp->num_allocated++;
1830 }
1831
1832 /* Add an auxiliary symbol (passing a file/symbol index combo). */
1833
1834 static symint_t
1835 add_aux_sym_rndx (int file_index, symint_t sym_index)
1836 {
1837 varray_t *vp;
1838 aux_t *aux_ptr;
1839
1840 if (cur_file_ptr == (efdr_t *) NULL)
1841 as_fatal (_("no current file pointer"));
1842
1843 vp = &cur_file_ptr->aux_syms;
1844
1845 if (vp->objects_last_page == vp->objects_per_page)
1846 add_varray_page (vp);
1847
1848 aux_ptr = &vp->last->datum->aux[vp->objects_last_page++];
1849 aux_ptr->type = aux_rndx;
1850 aux_ptr->data.rndx.rfd = file_index;
1851 aux_ptr->data.rndx.index = sym_index;
1852
1853 return vp->num_allocated++;
1854 }
1855
1856 /* Add an auxiliary symbol (passing the basic type and possibly
1858 type qualifiers). */
1859
1860 static symint_t
1861 add_aux_sym_tir (type_info_t *t, /* current type information */
1862 hash_state_t state, /* whether to hash type or not */
1863 thash_t **hash_tbl /* pointer to hash table to use */)
1864 {
1865 varray_t *vp;
1866 aux_t *aux_ptr;
1867 static AUXU init_aux;
1868 symint_t ret;
1869 int i;
1870 AUXU aux;
1871
1872 if (cur_file_ptr == (efdr_t *) NULL)
1873 as_fatal (_("no current file pointer"));
1874
1875 vp = &cur_file_ptr->aux_syms;
1876
1877 aux = init_aux;
1878 aux.ti.bt = (int) t->basic_type;
1879 aux.ti.continued = 0;
1880 aux.ti.fBitfield = t->bitfield;
1881
1882 aux.ti.tq0 = (int) t->type_qualifiers[0];
1883 aux.ti.tq1 = (int) t->type_qualifiers[1];
1884 aux.ti.tq2 = (int) t->type_qualifiers[2];
1885 aux.ti.tq3 = (int) t->type_qualifiers[3];
1886 aux.ti.tq4 = (int) t->type_qualifiers[4];
1887 aux.ti.tq5 = (int) t->type_qualifiers[5];
1888
1889 /* For anything that adds additional information, we must not hash,
1890 so check here, and reset our state. */
1891
1892 if (state != hash_no
1893 && (t->type_qualifiers[0] == tq_Array
1894 || t->type_qualifiers[1] == tq_Array
1895 || t->type_qualifiers[2] == tq_Array
1896 || t->type_qualifiers[3] == tq_Array
1897 || t->type_qualifiers[4] == tq_Array
1898 || t->type_qualifiers[5] == tq_Array
1899 || t->basic_type == bt_Struct
1900 || t->basic_type == bt_Union
1901 || t->basic_type == bt_Enum
1902 || t->bitfield
1903 || t->num_dims > 0))
1904 state = hash_no;
1905
1906 /* See if we can hash this type, and save some space, but some types
1907 can't be hashed (because they contain arrays or continuations),
1908 and others can be put into the hash list, but cannot use existing
1909 types because other aux entries precede this one. */
1910
1911 if (state != hash_no)
1912 {
1913 thash_t *hash_ptr;
1914 symint_t hi;
1915
1916 hi = aux.isym & ((1 << HASHBITS) - 1);
1917 hi %= THASH_SIZE;
1918
1919 for (hash_ptr = hash_tbl[hi];
1920 hash_ptr != (thash_t *)0;
1921 hash_ptr = hash_ptr->next)
1922 {
1923 if (aux.isym == hash_ptr->type.isym)
1924 break;
1925 }
1926
1927 if (hash_ptr != (thash_t *) NULL && state == hash_yes)
1928 return hash_ptr->indx;
1929
1930 if (hash_ptr == (thash_t *) NULL)
1931 {
1932 hash_ptr = allocate_thash ();
1933 hash_ptr->next = hash_tbl[hi];
1934 hash_ptr->type = aux;
1935 hash_ptr->indx = vp->num_allocated;
1936 hash_tbl[hi] = hash_ptr;
1937 }
1938 }
1939
1940 /* Everything is set up, add the aux symbol. */
1941 if (vp->objects_last_page == vp->objects_per_page)
1942 add_varray_page (vp);
1943
1944 aux_ptr = &vp->last->datum->aux[vp->objects_last_page++];
1945 aux_ptr->type = aux_tir;
1946 aux_ptr->data = aux;
1947
1948 ret = vp->num_allocated++;
1949
1950 /* Add bitfield length if it exists.
1951
1952 NOTE: Mips documentation claims bitfield goes at the end of the
1953 AUX record, but the DECstation compiler emits it here.
1954 (This would only make a difference for enum bitfields.)
1955
1956 Also note: We use the last size given since gcc may emit 2
1957 for an enum bitfield. */
1958
1959 if (t->bitfield)
1960 (void) add_aux_sym_symint ((symint_t) t->sizes[t->num_sizes - 1]);
1961
1962 /* Add tag information if needed. Structure, union, and enum
1963 references add 2 aux symbols: a [file index, symbol index]
1964 pointer to the structure type, and the current file index. */
1965
1966 if (t->basic_type == bt_Struct
1967 || t->basic_type == bt_Union
1968 || t->basic_type == bt_Enum)
1969 {
1970 symint_t file_index = t->tag_ptr->ifd;
1971 localsym_t *sym = t->tag_ptr->sym;
1972 forward_t *forward_ref = allocate_forward ();
1973
1974 if (sym != (localsym_t *) NULL)
1975 {
1976 forward_ref->next = sym->forward_ref;
1977 sym->forward_ref = forward_ref;
1978 }
1979 else
1980 {
1981 forward_ref->next = t->tag_ptr->forward_ref;
1982 t->tag_ptr->forward_ref = forward_ref;
1983 }
1984
1985 (void) add_aux_sym_rndx (ST_RFDESCAPE, indexNil);
1986 forward_ref->index_ptr
1987 = &vp->last->datum->aux[vp->objects_last_page - 1];
1988
1989 (void) add_aux_sym_symint (file_index);
1990 forward_ref->ifd_ptr
1991 = &vp->last->datum->aux[vp->objects_last_page - 1];
1992 }
1993
1994 /* Add information about array bounds if they exist. */
1995 for (i = 0; i < t->num_dims; i++)
1996 {
1997 (void) add_aux_sym_rndx (ST_RFDESCAPE,
1998 cur_file_ptr->int_type);
1999
2000 (void) add_aux_sym_symint (cur_file_ptr->file_index); /* file index*/
2001 (void) add_aux_sym_symint ((symint_t) 0); /* low bound */
2002 (void) add_aux_sym_symint (t->dimensions[i] - 1); /* high bound*/
2003 (void) add_aux_sym_symint ((t->dimensions[i] == 0) /* stride */
2004 ? 0
2005 : (t->sizes[i] * 8) / t->dimensions[i]);
2006 };
2007
2008 /* NOTE: Mips documentation claims that the bitfield width goes here.
2009 But it needs to be emitted earlier. */
2010
2011 return ret;
2012 }
2013
2014 /* Add a tag to the tag table (unless it already exists). */
2016
2017 static tag_t *
2018 get_tag (const char *tag, /* tag name */
2019 localsym_t *sym, /* tag start block */
2020 bt_t basic_type /* bt_Struct, bt_Union, or bt_Enum */)
2021 {
2022 shash_t *hash_ptr;
2023 const char *err;
2024 tag_t *tag_ptr;
2025
2026 if (cur_file_ptr == (efdr_t *) NULL)
2027 as_fatal (_("no current file pointer"));
2028
2029 hash_ptr = (shash_t *) hash_find (tag_hash, tag);
2030
2031 if (hash_ptr != (shash_t *) NULL
2032 && hash_ptr->tag_ptr != (tag_t *) NULL)
2033 {
2034 tag_ptr = hash_ptr->tag_ptr;
2035 if (sym != (localsym_t *) NULL)
2036 {
2037 tag_ptr->basic_type = basic_type;
2038 tag_ptr->ifd = cur_file_ptr->file_index;
2039 tag_ptr->sym = sym;
2040 }
2041 return tag_ptr;
2042 }
2043
2044 if (hash_ptr == (shash_t *) NULL)
2045 {
2046 char *perm;
2047
2048 perm = xstrdup (tag);
2049 hash_ptr = allocate_shash ();
2050 err = hash_insert (tag_hash, perm, (char *) hash_ptr);
2051 if (err)
2052 as_fatal (_("inserting \"%s\" into tag hash table: %s"),
2053 tag, err);
2054 hash_ptr->string = perm;
2055 }
2056
2057 tag_ptr = allocate_tag ();
2058 tag_ptr->forward_ref = (forward_t *) NULL;
2059 tag_ptr->hash_ptr = hash_ptr;
2060 tag_ptr->same_name = hash_ptr->tag_ptr;
2061 tag_ptr->basic_type = basic_type;
2062 tag_ptr->sym = sym;
2063 tag_ptr->ifd = ((sym == (localsym_t *) NULL)
2064 ? (symint_t) -1
2065 : cur_file_ptr->file_index);
2066 tag_ptr->same_block = cur_tag_head->first_tag;
2067
2068 cur_tag_head->first_tag = tag_ptr;
2069 hash_ptr->tag_ptr = tag_ptr;
2070
2071 return tag_ptr;
2072 }
2073
2074 /* Add an unknown {struct, union, enum} tag. */
2076
2077 static void
2078 add_unknown_tag (tag_t *ptag /* pointer to tag information */)
2079 {
2080 shash_t *hash_ptr = ptag->hash_ptr;
2081 char *name = hash_ptr->string;
2082 localsym_t *sym;
2083 forward_t **pf;
2084
2085 #ifdef ECOFF_DEBUG
2086 if (debug > 1)
2087 {
2088 char *agg_type = "{unknown aggregate type}";
2089 switch (ptag->basic_type)
2090 {
2091 case bt_Struct: agg_type = "struct"; break;
2092 case bt_Union: agg_type = "union"; break;
2093 case bt_Enum: agg_type = "enum"; break;
2094 default: break;
2095 }
2096
2097 fprintf (stderr, "unknown %s %.*s found\n", agg_type,
2098 hash_ptr->len, name_start);
2099 }
2100 #endif
2101
2102 sym = add_ecoff_symbol (name,
2103 st_Block,
2104 sc_Info,
2105 (symbolS *) NULL,
2106 (bfd_vma) 0,
2107 (symint_t) 0,
2108 (symint_t) 0);
2109
2110 (void) add_ecoff_symbol (name,
2111 st_End,
2112 sc_Info,
2113 (symbolS *) NULL,
2114 (bfd_vma) 0,
2115 (symint_t) 0,
2116 (symint_t) 0);
2117
2118 for (pf = &sym->forward_ref; *pf != (forward_t *) NULL; pf = &(*pf)->next)
2119 ;
2120 *pf = ptag->forward_ref;
2121 }
2122
2123 /* Add a procedure to the current file's list of procedures, and record
2125 this is the current procedure. */
2126
2127 static void
2128 add_procedure (char *func /* func name */)
2129 {
2130 varray_t *vp;
2131 proc_t *new_proc_ptr;
2132 symbolS *sym;
2133
2134 #ifdef ECOFF_DEBUG
2135 if (debug)
2136 fputc ('\n', stderr);
2137 #endif
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 /* Set the BSF_FUNCTION flag for the symbol. */
2160 sym = symbol_find_or_make (func);
2161 symbol_get_bfdsym (sym)->flags |= BSF_FUNCTION;
2162
2163 /* Push the start of the function. */
2164 new_proc_ptr->sym = add_ecoff_symbol ((const char *) NULL, st_Proc, sc_Text,
2165 sym, (bfd_vma) 0, (symint_t) 0,
2166 (symint_t) 0);
2167
2168 ++proc_cnt;
2169
2170 /* Fill in the linenos preceding the .ent, if any. */
2171 if (noproc_lineno != (lineno_list_t *) NULL)
2172 {
2173 lineno_list_t *l;
2174
2175 for (l = noproc_lineno; l != (lineno_list_t *) NULL; l = l->next)
2176 l->proc = new_proc_ptr;
2177 *last_lineno_ptr = noproc_lineno;
2178 while (*last_lineno_ptr != NULL)
2179 {
2180 last_lineno = *last_lineno_ptr;
2181 last_lineno_ptr = &last_lineno->next;
2182 }
2183 noproc_lineno = (lineno_list_t *) NULL;
2184 }
2185 }
2186
2187 symbolS *
2188 ecoff_get_cur_proc_sym (void)
2189 {
2190 return (cur_proc_ptr ? cur_proc_ptr->sym->as_sym : NULL);
2191 }
2192
2193 /* Add a new filename, and set up all of the file relative
2195 virtual arrays (strings, symbols, aux syms, etc.). Record
2196 where the current file structure lives. */
2197
2198 static void
2199 add_file (const char *file_name, int indx ATTRIBUTE_UNUSED, int fake)
2200 {
2201 int first_ch;
2202 efdr_t *fil_ptr;
2203
2204 #ifdef ECOFF_DEBUG
2205 if (debug)
2206 fprintf (stderr, "\tfile\t%.*s\n", len, file_start);
2207 #endif
2208
2209 /* If the file name is NULL, then no .file symbol appeared, and we
2210 want to use the actual file name. */
2211 if (file_name == (const char *) NULL)
2212 {
2213 if (first_file != (efdr_t *) NULL)
2214 as_fatal (_("fake .file after real one"));
2215 file_name = as_where ((unsigned int *) NULL);
2216
2217 /* Automatically generate ECOFF debugging information, since I
2218 think that's what other ECOFF assemblers do. We don't do
2219 this if we see a .file directive with a string, since that
2220 implies that some sort of debugging information is being
2221 provided. */
2222 if (! symbol_table_frozen && debug_type == DEBUG_UNSPECIFIED)
2223 debug_type = DEBUG_ECOFF;
2224 }
2225 else if (debug_type == DEBUG_UNSPECIFIED)
2226 debug_type = DEBUG_NONE;
2227
2228 #ifndef NO_LISTING
2229 if (listing)
2230 listing_source_file (file_name);
2231 #endif
2232
2233 current_stabs_filename = file_name;
2234
2235 /* If we're creating stabs, then we don't actually make a new FDR.
2236 Instead, we just create a stabs symbol. */
2237 if (stabs_seen)
2238 {
2239 (void) add_ecoff_symbol (file_name, st_Nil, sc_Nil,
2240 symbol_new ("L0\001", now_seg,
2241 (valueT) frag_now_fix (),
2242 frag_now),
2243 (bfd_vma) 0, 0, ECOFF_MARK_STAB (N_SOL));
2244 return;
2245 }
2246
2247 first_ch = *file_name;
2248
2249 /* FIXME: We can't safely merge files which have line number
2250 information (fMerge will be zero in this case). Otherwise, we
2251 get incorrect line number debugging info. See for instance
2252 ecoff_build_lineno, which will end up setting all file->fdr.*
2253 fields multiple times, resulting in incorrect debug info. In
2254 order to make this work right, all line number and symbol info
2255 for the same source file has to be adjacent in the object file,
2256 so that a single file descriptor can be used to point to them.
2257 This would require maintaining file specific lists of line
2258 numbers and symbols for each file, so that they can be merged
2259 together (or output together) when two .file pseudo-ops are
2260 merged into one file descriptor. */
2261
2262 /* See if the file has already been created. */
2263 for (fil_ptr = first_file;
2264 fil_ptr != (efdr_t *) NULL;
2265 fil_ptr = fil_ptr->next_file)
2266 {
2267 if (first_ch == fil_ptr->name[0]
2268 && filename_cmp (file_name, fil_ptr->name) == 0
2269 && fil_ptr->fdr.fMerge)
2270 {
2271 cur_file_ptr = fil_ptr;
2272 if (! fake)
2273 cur_file_ptr->fake = 0;
2274 break;
2275 }
2276 }
2277
2278 /* If this is a new file, create it. */
2279 if (fil_ptr == (efdr_t *) NULL)
2280 {
2281 if (file_desc.objects_last_page == file_desc.objects_per_page)
2282 add_varray_page (&file_desc);
2283
2284 fil_ptr = cur_file_ptr =
2285 &file_desc.last->datum->file[file_desc.objects_last_page++];
2286 *fil_ptr = init_file;
2287
2288 fil_ptr->file_index = current_file_idx++;
2289 ++file_desc.num_allocated;
2290
2291 fil_ptr->fake = fake;
2292
2293 /* Allocate the string hash table. */
2294 fil_ptr->str_hash = hash_new ();
2295
2296 /* Make sure 0 byte in string table is null */
2297 add_string (&fil_ptr->strings,
2298 fil_ptr->str_hash,
2299 "",
2300 (shash_t **)0);
2301
2302 if (strlen (file_name) > PAGE_USIZE - 2)
2303 as_fatal (_("filename goes over one page boundary"));
2304
2305 /* Push the start of the filename. We assume that the filename
2306 will be stored at string offset 1. */
2307 (void) add_ecoff_symbol (file_name, st_File, sc_Text,
2308 (symbolS *) NULL, (bfd_vma) 0,
2309 (symint_t) 0, (symint_t) 0);
2310 fil_ptr->fdr.rss = 1;
2311 fil_ptr->name = &fil_ptr->strings.last->datum->byte[1];
2312
2313 /* Update the linked list of file descriptors. */
2314 *last_file_ptr = fil_ptr;
2315 last_file_ptr = &fil_ptr->next_file;
2316
2317 /* Add void & int types to the file (void should be first to catch
2318 errant 0's within the index fields). */
2319 fil_ptr->void_type = add_aux_sym_tir (&void_type_info,
2320 hash_yes,
2321 &cur_file_ptr->thash_head[0]);
2322
2323 fil_ptr->int_type = add_aux_sym_tir (&int_type_info,
2324 hash_yes,
2325 &cur_file_ptr->thash_head[0]);
2326 }
2327 }
2328
2329 /* This function is called when the assembler notices a preprocessor
2330 directive switching to a new file. This will not happen in
2331 compiler output, only in hand coded assembler. */
2332
2333 void
2334 ecoff_new_file (const char *name, int appfile ATTRIBUTE_UNUSED)
2335 {
2336 if (cur_file_ptr != NULL && filename_cmp (cur_file_ptr->name, name) == 0)
2337 return;
2338 add_file (name, 0, 0);
2339
2340 /* This is a hand coded assembler file, so automatically turn on
2341 debugging information. */
2342 if (debug_type == DEBUG_UNSPECIFIED)
2343 debug_type = DEBUG_ECOFF;
2344 }
2345
2346 #ifdef ECOFF_DEBUG
2348
2349 /* Convert storage class to string. */
2350
2351 static char *
2352 sc_to_string (storage_class)
2353 sc_t storage_class;
2354 {
2355 switch (storage_class)
2356 {
2357 case sc_Nil: return "Nil,";
2358 case sc_Text: return "Text,";
2359 case sc_Data: return "Data,";
2360 case sc_Bss: return "Bss,";
2361 case sc_Register: return "Register,";
2362 case sc_Abs: return "Abs,";
2363 case sc_Undefined: return "Undefined,";
2364 case sc_CdbLocal: return "CdbLocal,";
2365 case sc_Bits: return "Bits,";
2366 case sc_CdbSystem: return "CdbSystem,";
2367 case sc_RegImage: return "RegImage,";
2368 case sc_Info: return "Info,";
2369 case sc_UserStruct: return "UserStruct,";
2370 case sc_SData: return "SData,";
2371 case sc_SBss: return "SBss,";
2372 case sc_RData: return "RData,";
2373 case sc_Var: return "Var,";
2374 case sc_Common: return "Common,";
2375 case sc_SCommon: return "SCommon,";
2376 case sc_VarRegister: return "VarRegister,";
2377 case sc_Variant: return "Variant,";
2378 case sc_SUndefined: return "SUndefined,";
2379 case sc_Init: return "Init,";
2380 case sc_Max: return "Max,";
2381 }
2382
2383 return "???,";
2384 }
2385
2386 #endif /* DEBUG */
2387
2388 #ifdef ECOFF_DEBUG
2390
2391 /* Convert symbol type to string. */
2392
2393 static char *
2394 st_to_string (symbol_type)
2395 st_t symbol_type;
2396 {
2397 switch (symbol_type)
2398 {
2399 case st_Nil: return "Nil,";
2400 case st_Global: return "Global,";
2401 case st_Static: return "Static,";
2402 case st_Param: return "Param,";
2403 case st_Local: return "Local,";
2404 case st_Label: return "Label,";
2405 case st_Proc: return "Proc,";
2406 case st_Block: return "Block,";
2407 case st_End: return "End,";
2408 case st_Member: return "Member,";
2409 case st_Typedef: return "Typedef,";
2410 case st_File: return "File,";
2411 case st_RegReloc: return "RegReloc,";
2412 case st_Forward: return "Forward,";
2413 case st_StaticProc: return "StaticProc,";
2414 case st_Constant: return "Constant,";
2415 case st_Str: return "String,";
2416 case st_Number: return "Number,";
2417 case st_Expr: return "Expr,";
2418 case st_Type: return "Type,";
2419 case st_Max: return "Max,";
2420 }
2421
2422 return "???,";
2423 }
2424
2425 #endif /* DEBUG */
2426
2427 /* Parse .begin directives which have a label as the first argument
2429 which gives the location of the start of the block. */
2430
2431 void
2432 ecoff_directive_begin (int ignore ATTRIBUTE_UNUSED)
2433 {
2434 char *name;
2435 char name_end;
2436
2437 if (cur_file_ptr == (efdr_t *) NULL)
2438 {
2439 as_warn (_(".begin directive without a preceding .file directive"));
2440 demand_empty_rest_of_line ();
2441 return;
2442 }
2443
2444 if (cur_proc_ptr == (proc_t *) NULL)
2445 {
2446 as_warn (_(".begin directive without a preceding .ent directive"));
2447 demand_empty_rest_of_line ();
2448 return;
2449 }
2450
2451 name_end = get_symbol_name (&name);
2452
2453 (void) add_ecoff_symbol ((const char *) NULL, st_Block, sc_Text,
2454 symbol_find_or_make (name),
2455 (bfd_vma) 0, (symint_t) 0, (symint_t) 0);
2456
2457 (void) restore_line_pointer (name_end);
2458
2459 /* The line number follows, but we don't use it. */
2460 (void) get_absolute_expression ();
2461 demand_empty_rest_of_line ();
2462 }
2463
2464 /* Parse .bend directives which have a label as the first argument
2466 which gives the location of the end of the block. */
2467
2468 void
2469 ecoff_directive_bend (int ignore ATTRIBUTE_UNUSED)
2470 {
2471 char *name;
2472 char name_end;
2473 symbolS *endsym;
2474
2475 if (cur_file_ptr == (efdr_t *) NULL)
2476 {
2477 as_warn (_(".bend directive without a preceding .file directive"));
2478 demand_empty_rest_of_line ();
2479 return;
2480 }
2481
2482 if (cur_proc_ptr == (proc_t *) NULL)
2483 {
2484 as_warn (_(".bend directive without a preceding .ent directive"));
2485 demand_empty_rest_of_line ();
2486 return;
2487 }
2488
2489 name_end = get_symbol_name (&name);
2490
2491 /* The value is the distance between the .bend directive and the
2492 corresponding symbol. We fill in the offset when we write out
2493 the symbol. */
2494 endsym = symbol_find (name);
2495 if (endsym == (symbolS *) NULL)
2496 as_warn (_(".bend directive names unknown symbol"));
2497 else
2498 (void) add_ecoff_symbol ((const char *) NULL, st_End, sc_Text, endsym,
2499 (bfd_vma) 0, (symint_t) 0, (symint_t) 0);
2500
2501 restore_line_pointer (name_end);
2502
2503 /* The line number follows, but we don't use it. */
2504 (void) get_absolute_expression ();
2505 demand_empty_rest_of_line ();
2506 }
2507
2508 /* COFF debugging information is provided as a series of directives
2510 (.def, .scl, etc.). We build up information as we read the
2511 directives in the following static variables, and file it away when
2512 we reach the .endef directive. */
2513 static char *coff_sym_name;
2514 static type_info_t coff_type;
2515 static sc_t coff_storage_class;
2516 static st_t coff_symbol_typ;
2517 static int coff_is_function;
2518 static char *coff_tag;
2519 static valueT coff_value;
2520 static symbolS *coff_sym_value;
2521 static bfd_vma coff_sym_addend;
2522 static int coff_inside_enumeration;
2523
2524 /* Handle a .def directive: start defining a symbol. */
2525
2526 void
2527 ecoff_directive_def (int ignore ATTRIBUTE_UNUSED)
2528 {
2529 char *name;
2530 char name_end;
2531
2532 ecoff_debugging_seen = 1;
2533
2534 SKIP_WHITESPACE ();
2535
2536 name_end = get_symbol_name (&name);
2537
2538 if (coff_sym_name != (char *) NULL)
2539 as_warn (_(".def pseudo-op used inside of .def/.endef; ignored"));
2540 else if (*name == '\0')
2541 as_warn (_("empty symbol name in .def; ignored"));
2542 else
2543 {
2544 if (coff_sym_name != (char *) NULL)
2545 free (coff_sym_name);
2546 if (coff_tag != (char *) NULL)
2547 free (coff_tag);
2548
2549 coff_sym_name = xstrdup (name);
2550 coff_type = type_info_init;
2551 coff_storage_class = sc_Nil;
2552 coff_symbol_typ = st_Nil;
2553 coff_is_function = 0;
2554 coff_tag = (char *) NULL;
2555 coff_value = 0;
2556 coff_sym_value = (symbolS *) NULL;
2557 coff_sym_addend = 0;
2558 }
2559
2560 restore_line_pointer (name_end);
2561
2562 demand_empty_rest_of_line ();
2563 }
2564
2565 /* Handle a .dim directive, used to give dimensions for an array. The
2566 arguments are comma separated numbers. mips-tfile assumes that
2567 there will not be more than 6 dimensions, and gdb won't read any
2568 more than that anyhow, so I will also make that assumption. */
2569
2570 void
2571 ecoff_directive_dim (int ignore ATTRIBUTE_UNUSED)
2572 {
2573 int dimens[N_TQ];
2574 int i;
2575
2576 if (coff_sym_name == (char *) NULL)
2577 {
2578 as_warn (_(".dim pseudo-op used outside of .def/.endef; ignored"));
2579 demand_empty_rest_of_line ();
2580 return;
2581 }
2582
2583 for (i = 0; i < N_TQ; i++)
2584 {
2585 SKIP_WHITESPACE ();
2586 dimens[i] = get_absolute_expression ();
2587 if (*input_line_pointer == ',')
2588 ++input_line_pointer;
2589 else
2590 {
2591 if (*input_line_pointer != '\n'
2592 && *input_line_pointer != ';')
2593 as_warn (_("badly formed .dim directive"));
2594 break;
2595 }
2596 }
2597
2598 if (i == N_TQ)
2599 --i;
2600
2601 /* The dimensions are stored away in reverse order. */
2602 for (; i >= 0; i--)
2603 {
2604 if (coff_type.num_dims >= N_TQ)
2605 {
2606 as_warn (_("too many .dim entries"));
2607 break;
2608 }
2609 coff_type.dimensions[coff_type.num_dims] = dimens[i];
2610 ++coff_type.num_dims;
2611 }
2612
2613 demand_empty_rest_of_line ();
2614 }
2615
2616 /* Handle a .scl directive, which sets the COFF storage class of the
2617 symbol. */
2618
2619 void
2620 ecoff_directive_scl (int ignore ATTRIBUTE_UNUSED)
2621 {
2622 long val;
2623
2624 if (coff_sym_name == (char *) NULL)
2625 {
2626 as_warn (_(".scl pseudo-op used outside of .def/.endef; ignored"));
2627 demand_empty_rest_of_line ();
2628 return;
2629 }
2630
2631 val = get_absolute_expression ();
2632
2633 coff_symbol_typ = map_coff_sym_type[val];
2634 coff_storage_class = map_coff_storage[val];
2635
2636 demand_empty_rest_of_line ();
2637 }
2638
2639 /* Handle a .size directive. For some reason mips-tfile.c thinks that
2640 .size can have multiple arguments. We humor it, although gcc will
2641 never generate more than one argument. */
2642
2643 void
2644 ecoff_directive_size (int ignore ATTRIBUTE_UNUSED)
2645 {
2646 int sizes[N_TQ];
2647 int i;
2648
2649 if (coff_sym_name == (char *) NULL)
2650 {
2651 as_warn (_(".size pseudo-op used outside of .def/.endef; ignored"));
2652 demand_empty_rest_of_line ();
2653 return;
2654 }
2655
2656 for (i = 0; i < N_TQ; i++)
2657 {
2658 SKIP_WHITESPACE ();
2659 sizes[i] = get_absolute_expression ();
2660 if (*input_line_pointer == ',')
2661 ++input_line_pointer;
2662 else
2663 {
2664 if (*input_line_pointer != '\n'
2665 && *input_line_pointer != ';')
2666 as_warn (_("badly formed .size directive"));
2667 break;
2668 }
2669 }
2670
2671 if (i == N_TQ)
2672 --i;
2673
2674 /* The sizes are stored away in reverse order. */
2675 for (; i >= 0; i--)
2676 {
2677 if (coff_type.num_sizes >= N_TQ)
2678 {
2679 as_warn (_("too many .size entries"));
2680 break;
2681 }
2682 coff_type.sizes[coff_type.num_sizes] = sizes[i];
2683 ++coff_type.num_sizes;
2684 }
2685
2686 demand_empty_rest_of_line ();
2687 }
2688
2689 /* Handle the .type directive, which gives the COFF type of the
2690 symbol. */
2691
2692 void
2693 ecoff_directive_type (int ignore ATTRIBUTE_UNUSED)
2694 {
2695 long val;
2696 tq_t *tq_ptr;
2697 tq_t *tq_shft;
2698
2699 if (coff_sym_name == (char *) NULL)
2700 {
2701 as_warn (_(".type pseudo-op used outside of .def/.endef; ignored"));
2702 demand_empty_rest_of_line ();
2703 return;
2704 }
2705
2706 val = get_absolute_expression ();
2707
2708 coff_type.orig_type = BTYPE (val);
2709 coff_type.basic_type = map_coff_types[coff_type.orig_type];
2710
2711 tq_ptr = &coff_type.type_qualifiers[N_TQ];
2712 while (val & ~N_BTMASK)
2713 {
2714 if (tq_ptr == &coff_type.type_qualifiers[0])
2715 {
2716 /* FIXME: We could handle this by setting the continued bit.
2717 There would still be a limit: the .type argument can not
2718 be infinite. */
2719 as_warn (_("the type of %s is too complex; it will be simplified"),
2720 coff_sym_name);
2721 break;
2722 }
2723 if (ISPTR (val))
2724 *--tq_ptr = tq_Ptr;
2725 else if (ISFCN (val))
2726 *--tq_ptr = tq_Proc;
2727 else if (ISARY (val))
2728 *--tq_ptr = tq_Array;
2729 else
2730 as_fatal (_("Unrecognized .type argument"));
2731
2732 val = DECREF (val);
2733 }
2734
2735 tq_shft = &coff_type.type_qualifiers[0];
2736 while (tq_ptr != &coff_type.type_qualifiers[N_TQ])
2737 *tq_shft++ = *tq_ptr++;
2738
2739 if (tq_shft != &coff_type.type_qualifiers[0] && tq_shft[-1] == tq_Proc)
2740 {
2741 /* If this is a function, ignore it, so that we don't get two
2742 entries (one from the .ent, and one for the .def that
2743 precedes it). Save the type information so that the end
2744 block can properly add it after the begin block index. For
2745 MIPS knows what reason, we must strip off the function type
2746 at this point. */
2747 coff_is_function = 1;
2748 tq_shft[-1] = tq_Nil;
2749 }
2750
2751 while (tq_shft != &coff_type.type_qualifiers[N_TQ])
2752 *tq_shft++ = tq_Nil;
2753
2754 demand_empty_rest_of_line ();
2755 }
2756
2757 /* Handle the .tag directive, which gives the name of a structure,
2758 union or enum. */
2759
2760 void
2761 ecoff_directive_tag (int ignore ATTRIBUTE_UNUSED)
2762 {
2763 char *name;
2764 char name_end;
2765
2766 if (coff_sym_name == (char *) NULL)
2767 {
2768 as_warn (_(".tag pseudo-op used outside of .def/.endef; ignored"));
2769 demand_empty_rest_of_line ();
2770 return;
2771 }
2772
2773 name_end = get_symbol_name (&name);
2774
2775 coff_tag = xstrdup (name);
2776
2777 (void) restore_line_pointer (name_end);
2778
2779 demand_empty_rest_of_line ();
2780 }
2781
2782 /* Handle the .val directive, which gives the value of the symbol. It
2783 may be the name of a static or global symbol. */
2784
2785 void
2786 ecoff_directive_val (int ignore ATTRIBUTE_UNUSED)
2787 {
2788 expressionS exp;
2789
2790 if (coff_sym_name == (char *) NULL)
2791 {
2792 as_warn (_(".val pseudo-op used outside of .def/.endef; ignored"));
2793 demand_empty_rest_of_line ();
2794 return;
2795 }
2796
2797 expression (&exp);
2798 if (exp.X_op != O_constant && exp.X_op != O_symbol)
2799 {
2800 as_bad (_(".val expression is too complex"));
2801 demand_empty_rest_of_line ();
2802 return;
2803 }
2804
2805 if (exp.X_op == O_constant)
2806 coff_value = exp.X_add_number;
2807 else
2808 {
2809 coff_sym_value = exp.X_add_symbol;
2810 coff_sym_addend = exp.X_add_number;
2811 }
2812
2813 demand_empty_rest_of_line ();
2814 }
2815
2816 /* Handle the .endef directive, which terminates processing of COFF
2817 debugging information for a symbol. */
2818
2819 void
2820 ecoff_directive_endef (int ignore ATTRIBUTE_UNUSED)
2821 {
2822 char *name;
2823 symint_t indx;
2824 localsym_t *sym;
2825
2826 demand_empty_rest_of_line ();
2827
2828 if (coff_sym_name == (char *) NULL)
2829 {
2830 as_warn (_(".endef pseudo-op used before .def; ignored"));
2831 return;
2832 }
2833
2834 name = coff_sym_name;
2835 coff_sym_name = (char *) NULL;
2836
2837 /* If the symbol is a static or external, we have already gotten the
2838 appropriate type and class, so make sure we don't override those
2839 values. This is needed because there are some type and classes
2840 that are not in COFF, such as short data, etc. */
2841 if (coff_sym_value != (symbolS *) NULL)
2842 {
2843 coff_symbol_typ = st_Nil;
2844 coff_storage_class = sc_Nil;
2845 }
2846
2847 coff_type.extra_sizes = coff_tag != (char *) NULL;
2848 if (coff_type.num_dims > 0)
2849 {
2850 int diff = coff_type.num_dims - coff_type.num_sizes;
2851 int i = coff_type.num_dims - 1;
2852 int j;
2853
2854 if (coff_type.num_sizes != 1 || diff < 0)
2855 {
2856 as_warn (_("bad COFF debugging information"));
2857 return;
2858 }
2859
2860 /* If this is an array, make sure the same number of dimensions
2861 and sizes were passed, creating extra sizes for multiply
2862 dimensioned arrays if not passed. */
2863 coff_type.extra_sizes = 0;
2864 if (diff)
2865 {
2866 j = (sizeof (coff_type.sizes) / sizeof (coff_type.sizes[0])) - 1;
2867 while (j >= 0)
2868 {
2869 coff_type.sizes[j] = (((j - diff) >= 0)
2870 ? coff_type.sizes[j - diff]
2871 : 0);
2872 j--;
2873 }
2874
2875 coff_type.num_sizes = i + 1;
2876 for (i--; i >= 0; i--)
2877 coff_type.sizes[i] = (coff_type.dimensions[i + 1] == 0
2878 ? 0
2879 : (coff_type.sizes[i + 1]
2880 / coff_type.dimensions[i + 1]));
2881 }
2882 }
2883 else if (coff_symbol_typ == st_Member
2884 && coff_type.num_sizes - coff_type.extra_sizes == 1)
2885 {
2886 /* Is this a bitfield? This is indicated by a structure member
2887 having a size field that isn't an array. */
2888 coff_type.bitfield = 1;
2889 }
2890
2891 /* Except for enumeration members & begin/ending of scopes, put the
2892 type word in the aux. symbol table. */
2893 if (coff_symbol_typ == st_Block || coff_symbol_typ == st_End)
2894 indx = 0;
2895 else if (coff_inside_enumeration)
2896 indx = cur_file_ptr->void_type;
2897 else
2898 {
2899 if (coff_type.basic_type == bt_Struct
2900 || coff_type.basic_type == bt_Union
2901 || coff_type.basic_type == bt_Enum)
2902 {
2903 if (coff_tag == (char *) NULL)
2904 {
2905 as_warn (_("no tag specified for %s"), name);
2906 return;
2907 }
2908
2909 coff_type.tag_ptr = get_tag (coff_tag, (localsym_t *) NULL,
2910 coff_type.basic_type);
2911 }
2912
2913 if (coff_is_function)
2914 {
2915 last_func_type_info = coff_type;
2916 last_func_sym_value = coff_sym_value;
2917 return;
2918 }
2919
2920 indx = add_aux_sym_tir (&coff_type,
2921 hash_yes,
2922 &cur_file_ptr->thash_head[0]);
2923 }
2924
2925 /* Do any last minute adjustments that are necessary. */
2926 switch (coff_symbol_typ)
2927 {
2928 default:
2929 break;
2930
2931 /* For the beginning of structs, unions, and enumerations, the
2932 size info needs to be passed in the value field. */
2933 case st_Block:
2934 if (coff_type.num_sizes - coff_type.num_dims - coff_type.extra_sizes
2935 != 1)
2936 {
2937 as_warn (_("bad COFF debugging information"));
2938 return;
2939 }
2940 else
2941 coff_value = coff_type.sizes[0];
2942
2943 coff_inside_enumeration = (coff_type.orig_type == T_ENUM);
2944 break;
2945
2946 /* For the end of structs, unions, and enumerations, omit the
2947 name which is always ".eos". This needs to be done last, so
2948 that any error reporting above gives the correct name. */
2949 case st_End:
2950 free (name);
2951 name = (char *) NULL;
2952 coff_value = 0;
2953 coff_inside_enumeration = 0;
2954 break;
2955
2956 /* Members of structures and unions that aren't bitfields, need
2957 to adjust the value from a byte offset to a bit offset.
2958 Members of enumerations do not have the value adjusted, and
2959 can be distinguished by indx == indexNil. For enumerations,
2960 update the maximum enumeration value. */
2961 case st_Member:
2962 if (! coff_type.bitfield && ! coff_inside_enumeration)
2963 coff_value *= 8;
2964
2965 break;
2966 }
2967
2968 /* Add the symbol. */
2969 sym = add_ecoff_symbol (name,
2970 coff_symbol_typ,
2971 coff_storage_class,
2972 coff_sym_value,
2973 coff_sym_addend,
2974 (symint_t) coff_value,
2975 indx);
2976
2977 /* deal with struct, union, and enum tags. */
2978 if (coff_symbol_typ == st_Block)
2979 {
2980 /* Create or update the tag information. */
2981 tag_t *tag_ptr = get_tag (name,
2982 sym,
2983 coff_type.basic_type);
2984 forward_t **pf;
2985
2986 /* Remember any forward references. */
2987 for (pf = &sym->forward_ref;
2988 *pf != (forward_t *) NULL;
2989 pf = &(*pf)->next)
2990 ;
2991 *pf = tag_ptr->forward_ref;
2992 tag_ptr->forward_ref = (forward_t *) NULL;
2993 }
2994 }
2995
2996 /* Parse .end directives. */
2998
2999 void
3000 ecoff_directive_end (int ignore ATTRIBUTE_UNUSED)
3001 {
3002 char *name;
3003 char name_end;
3004 symbolS *ent;
3005
3006 if (cur_file_ptr == (efdr_t *) NULL)
3007 {
3008 as_warn (_(".end directive without a preceding .file directive"));
3009 demand_empty_rest_of_line ();
3010 return;
3011 }
3012
3013 if (cur_proc_ptr == (proc_t *) NULL)
3014 {
3015 as_warn (_(".end directive without a preceding .ent directive"));
3016 demand_empty_rest_of_line ();
3017 return;
3018 }
3019
3020 name_end = get_symbol_name (&name);
3021
3022 if (name == input_line_pointer)
3023 {
3024 as_warn (_(".end directive has no name"));
3025 (void) restore_line_pointer (name_end);
3026 demand_empty_rest_of_line ();
3027 return;
3028 }
3029
3030 /* The value is the distance between the .end directive and the
3031 corresponding symbol. We create a fake symbol to hold the
3032 current location, and put in the offset when we write out the
3033 symbol. */
3034 ent = symbol_find (name);
3035 if (ent == (symbolS *) NULL)
3036 as_warn (_(".end directive names unknown symbol"));
3037 else
3038 (void) add_ecoff_symbol ((const char *) NULL, st_End, sc_Text,
3039 symbol_new ("L0\001", now_seg,
3040 (valueT) frag_now_fix (),
3041 frag_now),
3042 (bfd_vma) 0, (symint_t) 0, (symint_t) 0);
3043
3044 cur_proc_ptr = (proc_t *) NULL;
3045
3046 (void) restore_line_pointer (name_end);
3047 demand_empty_rest_of_line ();
3048 }
3049
3050 /* Parse .ent directives. */
3052
3053 void
3054 ecoff_directive_ent (int ignore ATTRIBUTE_UNUSED)
3055 {
3056 char *name;
3057 char name_end;
3058
3059 if (cur_file_ptr == (efdr_t *) NULL)
3060 add_file ((const char *) NULL, 0, 1);
3061
3062 if (cur_proc_ptr != (proc_t *) NULL)
3063 {
3064 as_warn (_("second .ent directive found before .end directive"));
3065 demand_empty_rest_of_line ();
3066 return;
3067 }
3068
3069 name_end = get_symbol_name (&name);
3070
3071 if (name == input_line_pointer)
3072 {
3073 as_warn (_(".ent directive has no name"));
3074 (void) restore_line_pointer (name_end);
3075 demand_empty_rest_of_line ();
3076 return;
3077 }
3078
3079 add_procedure (name);
3080
3081 (void) restore_line_pointer (name_end);
3082
3083 /* The .ent directive is sometimes followed by a number. I'm not
3084 really sure what the number means. I don't see any way to store
3085 the information in the PDR. The Irix 4 assembler seems to ignore
3086 the information. */
3087 SKIP_WHITESPACE ();
3088 if (*input_line_pointer == ',')
3089 {
3090 ++input_line_pointer;
3091 SKIP_WHITESPACE ();
3092 }
3093 if (ISDIGIT (*input_line_pointer)
3094 || *input_line_pointer == '-')
3095 (void) get_absolute_expression ();
3096
3097 demand_empty_rest_of_line ();
3098 }
3099
3100 /* Parse .extern directives. */
3102
3103 void
3104 ecoff_directive_extern (int ignore ATTRIBUTE_UNUSED)
3105 {
3106 char *name;
3107 int c;
3108 symbolS *symbolp;
3109 valueT size;
3110
3111 c = get_symbol_name (&name);
3112 symbolp = symbol_find_or_make (name);
3113 (void) restore_line_pointer (c);
3114
3115 S_SET_EXTERNAL (symbolp);
3116
3117 if (*input_line_pointer == ',')
3118 ++input_line_pointer;
3119 size = get_absolute_expression ();
3120
3121 symbol_get_obj (symbolp)->ecoff_extern_size = size;
3122 }
3123
3124 /* Parse .file directives. */
3126
3127 void
3128 ecoff_directive_file (int ignore ATTRIBUTE_UNUSED)
3129 {
3130 int indx;
3131 char *name;
3132 int len;
3133
3134 if (cur_proc_ptr != (proc_t *) NULL)
3135 {
3136 as_warn (_("no way to handle .file within .ent/.end section"));
3137 demand_empty_rest_of_line ();
3138 return;
3139 }
3140
3141 indx = (int) get_absolute_expression ();
3142
3143 /* FIXME: we don't have to save the name here. */
3144 name = demand_copy_C_string (&len);
3145
3146 add_file (name, indx - 1, 0);
3147
3148 demand_empty_rest_of_line ();
3149 }
3150
3151 /* Parse .fmask directives. */
3153
3154 void
3155 ecoff_directive_fmask (int ignore ATTRIBUTE_UNUSED)
3156 {
3157 long val;
3158
3159 if (cur_proc_ptr == (proc_t *) NULL)
3160 {
3161 as_warn (_(".fmask outside of .ent"));
3162 demand_empty_rest_of_line ();
3163 return;
3164 }
3165
3166 if (get_absolute_expression_and_terminator (&val) != ',')
3167 {
3168 as_warn (_("bad .fmask directive"));
3169 --input_line_pointer;
3170 demand_empty_rest_of_line ();
3171 return;
3172 }
3173
3174 cur_proc_ptr->pdr.fregmask = val;
3175 cur_proc_ptr->pdr.fregoffset = get_absolute_expression ();
3176
3177 demand_empty_rest_of_line ();
3178 }
3179
3180 /* Parse .frame directives. */
3182
3183 void
3184 ecoff_directive_frame (int ignore ATTRIBUTE_UNUSED)
3185 {
3186 long val;
3187
3188 if (cur_proc_ptr == (proc_t *) NULL)
3189 {
3190 as_warn (_(".frame outside of .ent"));
3191 demand_empty_rest_of_line ();
3192 return;
3193 }
3194
3195 cur_proc_ptr->pdr.framereg = tc_get_register (1);
3196
3197 SKIP_WHITESPACE ();
3198 if (*input_line_pointer++ != ','
3199 || get_absolute_expression_and_terminator (&val) != ',')
3200 {
3201 as_warn (_("bad .frame directive"));
3202 --input_line_pointer;
3203 demand_empty_rest_of_line ();
3204 return;
3205 }
3206
3207 cur_proc_ptr->pdr.frameoffset = val;
3208
3209 cur_proc_ptr->pdr.pcreg = tc_get_register (0);
3210
3211 /* Alpha-OSF1 adds "the offset of saved $a0 from $sp", according to
3212 Sandro. I don't yet know where this value should be stored, if
3213 anywhere. Don't call demand_empty_rest_of_line (). */
3214 s_ignore (42);
3215 }
3216
3217 /* Parse .mask directives. */
3219
3220 void
3221 ecoff_directive_mask (int ignore ATTRIBUTE_UNUSED)
3222 {
3223 long val;
3224
3225 if (cur_proc_ptr == (proc_t *) NULL)
3226 {
3227 as_warn (_(".mask outside of .ent"));
3228 demand_empty_rest_of_line ();
3229 return;
3230 }
3231
3232 if (get_absolute_expression_and_terminator (&val) != ',')
3233 {
3234 as_warn (_("bad .mask directive"));
3235 --input_line_pointer;
3236 demand_empty_rest_of_line ();
3237 return;
3238 }
3239
3240 cur_proc_ptr->pdr.regmask = val;
3241 cur_proc_ptr->pdr.regoffset = get_absolute_expression ();
3242
3243 demand_empty_rest_of_line ();
3244 }
3245
3246 /* Parse .loc directives. */
3248
3249 void
3250 ecoff_directive_loc (int ignore ATTRIBUTE_UNUSED)
3251 {
3252 lineno_list_t *list;
3253 symint_t lineno;
3254
3255 if (cur_file_ptr == (efdr_t *) NULL)
3256 {
3257 as_warn (_(".loc before .file"));
3258 demand_empty_rest_of_line ();
3259 return;
3260 }
3261
3262 if (now_seg != text_section)
3263 {
3264 as_warn (_(".loc outside of .text"));
3265 demand_empty_rest_of_line ();
3266 return;
3267 }
3268
3269 /* Skip the file number. */
3270 SKIP_WHITESPACE ();
3271 get_absolute_expression ();
3272 SKIP_WHITESPACE ();
3273
3274 lineno = get_absolute_expression ();
3275
3276 #ifndef NO_LISTING
3277 if (listing)
3278 listing_source_line (lineno);
3279 #endif
3280
3281 /* If we're building stabs, then output a special label rather than
3282 ECOFF line number info. */
3283 if (stabs_seen)
3284 {
3285 (void) add_ecoff_symbol ((char *) NULL, st_Label, sc_Text,
3286 symbol_new ("L0\001", now_seg,
3287 (valueT) frag_now_fix (),
3288 frag_now),
3289 (bfd_vma) 0, 0, lineno);
3290 return;
3291 }
3292
3293 list = allocate_lineno_list ();
3294
3295 list->next = (lineno_list_t *) NULL;
3296 list->file = cur_file_ptr;
3297 list->proc = cur_proc_ptr;
3298 list->frag = frag_now;
3299 list->paddr = frag_now_fix ();
3300 list->lineno = lineno;
3301
3302 /* We don't want to merge files which have line numbers. */
3303 cur_file_ptr->fdr.fMerge = 0;
3304
3305 /* A .loc directive will sometimes appear before a .ent directive,
3306 which means that cur_proc_ptr will be NULL here. Arrange to
3307 patch this up. */
3308 if (cur_proc_ptr == (proc_t *) NULL)
3309 {
3310 lineno_list_t **pl;
3311
3312 pl = &noproc_lineno;
3313 while (*pl != (lineno_list_t *) NULL)
3314 pl = &(*pl)->next;
3315 *pl = list;
3316 }
3317 else
3318 {
3319 last_lineno = list;
3320 *last_lineno_ptr = list;
3321 last_lineno_ptr = &list->next;
3322 }
3323 }
3324
3325 /* The MIPS assembler sometimes inserts nop instructions in the
3326 instruction stream. When this happens, we must patch up the .loc
3327 information so that it points to the instruction after the nop. */
3328
3329 void
3330 ecoff_fix_loc (fragS *old_frag, unsigned long old_frag_offset)
3331 {
3332 if (last_lineno != NULL
3333 && last_lineno->frag == old_frag
3334 && last_lineno->paddr == old_frag_offset)
3335 {
3336 last_lineno->frag = frag_now;
3337 last_lineno->paddr = frag_now_fix ();
3338 }
3339 }
3340
3341 /* Make sure the @stabs symbol is emitted. */
3343
3344 static void
3345 mark_stabs (int ignore ATTRIBUTE_UNUSED)
3346 {
3347 if (! stabs_seen)
3348 {
3349 /* Add a dummy @stabs dymbol. */
3350 stabs_seen = 1;
3351 (void) add_ecoff_symbol (stabs_symbol, st_Nil, sc_Info,
3352 (symbolS *) NULL,
3353 (bfd_vma) 0, (symint_t) -1,
3354 ECOFF_MARK_STAB (0));
3355 }
3356 }
3357
3358 /* Parse .weakext directives. */
3360 #ifndef TC_MIPS
3361 /* For TC_MIPS use the version in tc-mips.c. */
3362 void
3363 ecoff_directive_weakext (int ignore ATTRIBUTE_UNUSED)
3364 {
3365 char *name;
3366 int c;
3367 symbolS *symbolP;
3368 expressionS exp;
3369
3370 c = get_symbol_name (&name);
3371 symbolP = symbol_find_or_make (name);
3372 (void) restore_line_pointer (c);
3373
3374 SKIP_WHITESPACE ();
3375
3376 if (*input_line_pointer == ',')
3377 {
3378 if (S_IS_DEFINED (symbolP))
3379 {
3380 as_bad (_("symbol `%s' is already defined"),
3381 S_GET_NAME (symbolP));
3382 ignore_rest_of_line ();
3383 return;
3384 }
3385
3386 ++input_line_pointer;
3387 SKIP_WHITESPACE ();
3388 if (! is_end_of_line[(unsigned char) *input_line_pointer])
3389 {
3390 expression (&exp);
3391 if (exp.X_op != O_symbol)
3392 {
3393 as_bad (_("bad .weakext directive"));
3394 ignore_rest_of_line ();
3395 return;
3396 }
3397 symbol_set_value_expression (symbolP, &exp);
3398 }
3399 }
3400
3401 S_SET_WEAK (symbolP);
3402
3403 demand_empty_rest_of_line ();
3404 }
3405 #endif /* not TC_MIPS */
3406
3407 /* Handle .stabs directives. The actual parsing routine is done by a
3409 generic routine. This routine is called via OBJ_PROCESS_STAB.
3410 When this is called, input_line_pointer will be pointing at the
3411 value field of the stab.
3412
3413 .stabs directives have five fields:
3414 "string" a string, encoding the type information.
3415 code a numeric code, defined in <stab.h>
3416 0 a zero
3417 desc a zero or line number
3418 value a numeric value or an address.
3419
3420 If the value is relocatable, we transform this into:
3421 iss points as an index into string space
3422 value value from lookup of the name
3423 st st from lookup of the name
3424 sc sc from lookup of the name
3425 index code|CODE_MASK
3426
3427 If the value is not relocatable, we transform this into:
3428 iss points as an index into string space
3429 value value
3430 st st_Nil
3431 sc sc_Nil
3432 index code|CODE_MASK
3433
3434 .stabn directives have four fields (string is null):
3435 code a numeric code, defined in <stab.h>
3436 0 a zero
3437 desc a zero or a line number
3438 value a numeric value or an address. */
3439
3440 void
3441 ecoff_stab (segT sec ATTRIBUTE_UNUSED,
3442 int what,
3443 const char *string,
3444 int type,
3445 int other,
3446 int desc)
3447 {
3448 efdr_t *save_file_ptr = cur_file_ptr;
3449 symbolS *sym;
3450 symint_t value;
3451 bfd_vma addend;
3452 st_t st;
3453 sc_t sc;
3454 symint_t indx;
3455 localsym_t *hold = NULL;
3456
3457 ecoff_debugging_seen = 1;
3458
3459 /* We don't handle .stabd. */
3460 if (what != 's' && what != 'n')
3461 {
3462 as_bad (_(".stab%c is not supported"), what);
3463 return;
3464 }
3465
3466 /* A .stabn uses a null name, not an empty string. */
3467 if (what == 'n')
3468 string = NULL;
3469
3470 /* We ignore the other field. */
3471 if (other != 0)
3472 as_warn (_(".stab%c: ignoring non-zero other field"), what);
3473
3474 /* Make sure we have a current file. */
3475 if (cur_file_ptr == (efdr_t *) NULL)
3476 {
3477 add_file ((const char *) NULL, 0, 1);
3478 save_file_ptr = cur_file_ptr;
3479 }
3480
3481 /* For stabs in ECOFF, the first symbol must be @stabs. This is a
3482 signal to gdb. */
3483 if (stabs_seen == 0)
3484 mark_stabs (0);
3485
3486 /* Line number stabs are handled differently, since they have two
3487 values, the line number and the address of the label. We use the
3488 index field (aka desc) to hold the line number, and the value
3489 field to hold the address. The symbol type is st_Label, which
3490 should be different from the other stabs, so that gdb can
3491 recognize it. */
3492 if (type == N_SLINE)
3493 {
3494 SYMR dummy_symr;
3495 char *name;
3496 char name_end;
3497
3498 #ifndef NO_LISTING
3499 if (listing)
3500 listing_source_line ((unsigned int) desc);
3501 #endif
3502
3503 dummy_symr.index = desc;
3504 if (dummy_symr.index != desc)
3505 {
3506 as_warn (_("line number (%d) for .stab%c directive cannot fit in index field (20 bits)"),
3507 desc, what);
3508 return;
3509 }
3510
3511 name_end = get_symbol_name (&name);
3512 sym = symbol_find_or_make (name);
3513 (void) restore_line_pointer (name_end);
3514
3515 value = 0;
3516 addend = 0;
3517 st = st_Label;
3518 sc = sc_Text;
3519 indx = desc;
3520 }
3521 else
3522 {
3523 #ifndef NO_LISTING
3524 if (listing && (type == N_SO || type == N_SOL))
3525 listing_source_file (string);
3526 #endif
3527
3528 if (ISDIGIT (*input_line_pointer)
3529 || *input_line_pointer == '-'
3530 || *input_line_pointer == '+')
3531 {
3532 st = st_Nil;
3533 sc = sc_Nil;
3534 sym = (symbolS *) NULL;
3535 value = get_absolute_expression ();
3536 addend = 0;
3537 }
3538 else if (! is_name_beginner ((unsigned char) *input_line_pointer))
3539 {
3540 as_warn (_("illegal .stab%c directive, bad character"), what);
3541 return;
3542 }
3543 else
3544 {
3545 expressionS exp;
3546
3547 sc = sc_Nil;
3548 st = st_Nil;
3549
3550 expression (&exp);
3551 if (exp.X_op == O_constant)
3552 {
3553 sym = NULL;
3554 value = exp.X_add_number;
3555 addend = 0;
3556 }
3557 else if (exp.X_op == O_symbol)
3558 {
3559 sym = exp.X_add_symbol;
3560 value = 0;
3561 addend = exp.X_add_number;
3562 }
3563 else
3564 {
3565 sym = make_expr_symbol (&exp);
3566 value = 0;
3567 addend = 0;
3568 }
3569 }
3570
3571 indx = ECOFF_MARK_STAB (type);
3572 }
3573
3574 /* Don't store the stabs symbol we are creating as the type of the
3575 ECOFF symbol. We want to compute the type of the ECOFF symbol
3576 independently. */
3577 if (sym != (symbolS *) NULL)
3578 hold = symbol_get_obj (sym)->ecoff_symbol;
3579
3580 (void) add_ecoff_symbol (string, st, sc, sym, addend, value, indx);
3581
3582 if (sym != (symbolS *) NULL)
3583 symbol_get_obj (sym)->ecoff_symbol = hold;
3584
3585 /* Restore normal file type. */
3586 cur_file_ptr = save_file_ptr;
3587 }
3588
3589 /* Frob an ECOFF symbol. Small common symbols go into a special
3591 .scommon section rather than bfd_com_section. */
3592
3593 void
3594 ecoff_frob_symbol (symbolS *sym)
3595 {
3596 if (S_IS_COMMON (sym)
3597 && S_GET_VALUE (sym) > 0
3598 && S_GET_VALUE (sym) <= bfd_get_gp_size (stdoutput))
3599 {
3600 static asection scom_section;
3601 static asymbol scom_symbol;
3602
3603 /* We must construct a fake section similar to bfd_com_section
3604 but with the name .scommon. */
3605 if (scom_section.name == NULL)
3606 {
3607 scom_section = *bfd_com_section_ptr;
3608 scom_section.name = ".scommon";
3609 scom_section.output_section = &scom_section;
3610 scom_section.symbol = &scom_symbol;
3611 scom_section.symbol_ptr_ptr = &scom_section.symbol;
3612 scom_symbol = *bfd_com_section_ptr->symbol;
3613 scom_symbol.name = ".scommon";
3614 scom_symbol.section = &scom_section;
3615 }
3616 S_SET_SEGMENT (sym, &scom_section);
3617 }
3618
3619 /* Double check weak symbols. */
3620 if (S_IS_WEAK (sym))
3621 {
3622 if (S_IS_COMMON (sym))
3623 as_bad (_("symbol `%s' can not be both weak and common"),
3624 S_GET_NAME (sym));
3625 }
3626 }
3627
3628 /* Add bytes to the symbolic information buffer. */
3630
3631 static char *
3632 ecoff_add_bytes (char **buf,
3633 char **bufend,
3634 char *bufptr,
3635 unsigned long need)
3636 {
3637 unsigned long at;
3638 unsigned long want;
3639
3640 at = bufptr - *buf;
3641 need -= *bufend - bufptr;
3642 if (need < PAGE_SIZE)
3643 need = PAGE_SIZE;
3644 want = (*bufend - *buf) + need;
3645 *buf = XRESIZEVEC (char, *buf, want);
3646 *bufend = *buf + want;
3647 return *buf + at;
3648 }
3649
3650 /* Adjust the symbolic information buffer to the alignment required
3651 for the ECOFF target debugging information. */
3652
3653 static unsigned long
3654 ecoff_padding_adjust (const struct ecoff_debug_swap *backend,
3655 char **buf,
3656 char **bufend,
3657 unsigned long offset,
3658 char **bufptrptr)
3659 {
3660 bfd_size_type align;
3661
3662 align = backend->debug_align;
3663 if ((offset & (align - 1)) != 0)
3664 {
3665 unsigned long add;
3666
3667 add = align - (offset & (align - 1));
3668 if ((unsigned long) (*bufend - (*buf + offset)) < add)
3669 (void) ecoff_add_bytes (buf, bufend, *buf + offset, add);
3670 memset (*buf + offset, 0, add);
3671 offset += add;
3672 if (bufptrptr != (char **) NULL)
3673 *bufptrptr = *buf + offset;
3674 }
3675
3676 return offset;
3677 }
3678
3679 /* Build the line number information. */
3680
3681 static unsigned long
3682 ecoff_build_lineno (const struct ecoff_debug_swap *backend,
3683 char **buf,
3684 char **bufend,
3685 unsigned long offset,
3686 long *linecntptr)
3687 {
3688 char *bufptr;
3689 lineno_list_t *l;
3690 lineno_list_t *last;
3691 efdr_t *file;
3692 proc_t *proc;
3693 unsigned long c;
3694 long iline;
3695 long totcount;
3696 lineno_list_t first;
3697 lineno_list_t *local_first_lineno = first_lineno;
3698
3699 if (linecntptr != (long *) NULL)
3700 *linecntptr = 0;
3701
3702 bufptr = *buf + offset;
3703
3704 file = (efdr_t *) NULL;
3705 proc = (proc_t *) NULL;
3706 last = (lineno_list_t *) NULL;
3707 c = offset;
3708 iline = 0;
3709 totcount = 0;
3710
3711 /* FIXME? Now that MIPS embedded-PIC is gone, it may be safe to
3712 remove this code. */
3713 /* For some reason the address of the first procedure is ignored
3714 when reading line numbers. This doesn't matter if the address of
3715 the first procedure is 0, but when gcc is generating MIPS
3716 embedded PIC code, it will put strings in the .text section
3717 before the first procedure. We cope by inserting a dummy line if
3718 the address of the first procedure is not 0. Hopefully this
3719 won't screw things up too badly.
3720
3721 Don't do this for ECOFF assembly source line numbers. They work
3722 without this extra attention. */
3723 if (debug_type != DEBUG_ECOFF
3724 && first_proc_ptr != (proc_t *) NULL
3725 && local_first_lineno != (lineno_list_t *) NULL
3726 && ((S_GET_VALUE (first_proc_ptr->sym->as_sym)
3727 + bfd_get_section_vma (stdoutput,
3728 S_GET_SEGMENT (first_proc_ptr->sym->as_sym)))
3729 != 0))
3730 {
3731 first.file = local_first_lineno->file;
3732 first.proc = local_first_lineno->proc;
3733 first.frag = &zero_address_frag;
3734 first.paddr = 0;
3735 first.lineno = 0;
3736
3737 first.next = local_first_lineno;
3738 local_first_lineno = &first;
3739 }
3740
3741 for (l = local_first_lineno; l != (lineno_list_t *) NULL; l = l->next)
3742 {
3743 long count;
3744 long delta;
3745
3746 /* Get the offset to the memory address of the next line number
3747 (in words). Do this first, so that we can skip ahead to the
3748 next useful line number entry. */
3749 if (l->next == (lineno_list_t *) NULL)
3750 {
3751 /* We want a count of zero, but it will be decremented
3752 before it is used. */
3753 count = 1;
3754 }
3755 else if (l->next->frag->fr_address + l->next->paddr
3756 > l->frag->fr_address + l->paddr)
3757 {
3758 count = ((l->next->frag->fr_address + l->next->paddr
3759 - (l->frag->fr_address + l->paddr))
3760 >> 2);
3761 }
3762 else
3763 {
3764 /* Don't change last, so we still get the right delta. */
3765 continue;
3766 }
3767
3768 if (l->file != file || l->proc != proc)
3769 {
3770 if (l->proc != proc && proc != (proc_t *) NULL)
3771 proc->pdr.lnHigh = last->lineno;
3772 if (l->file != file && file != (efdr_t *) NULL)
3773 {
3774 file->fdr.cbLine = c - file->fdr.cbLineOffset;
3775 file->fdr.cline = totcount + count;
3776 if (linecntptr != (long *) NULL)
3777 *linecntptr += totcount + count;
3778 totcount = 0;
3779 }
3780
3781 if (l->file != file)
3782 {
3783 efdr_t *last_file = file;
3784
3785 file = l->file;
3786 if (last_file != (efdr_t *) NULL)
3787 file->fdr.ilineBase
3788 = last_file->fdr.ilineBase + last_file->fdr.cline;
3789 else
3790 file->fdr.ilineBase = 0;
3791 file->fdr.cbLineOffset = c;
3792 }
3793 if (l->proc != proc)
3794 {
3795 proc = l->proc;
3796 if (proc != (proc_t *) NULL)
3797 {
3798 proc->pdr.lnLow = l->lineno;
3799 proc->pdr.cbLineOffset = c - file->fdr.cbLineOffset;
3800 proc->pdr.iline = totcount;
3801 }
3802 }
3803
3804 last = (lineno_list_t *) NULL;
3805 }
3806
3807 totcount += count;
3808
3809 /* Get the offset to this line number. */
3810 if (last == (lineno_list_t *) NULL)
3811 delta = 0;
3812 else
3813 delta = l->lineno - last->lineno;
3814
3815 /* Put in the offset to this line number. */
3816 while (delta != 0)
3817 {
3818 int setcount;
3819
3820 /* 1 is added to each count read. */
3821 --count;
3822 /* We can only adjust the word count by up to 15 words at a
3823 time. */
3824 if (count <= 0x0f)
3825 {
3826 setcount = count;
3827 count = 0;
3828 }
3829 else
3830 {
3831 setcount = 0x0f;
3832 count -= 0x0f;
3833 }
3834 if (delta >= -7 && delta <= 7)
3835 {
3836 if (bufptr >= *bufend)
3837 bufptr = ecoff_add_bytes (buf, bufend, bufptr, (long) 1);
3838 *bufptr++ = setcount + (delta << 4);
3839 delta = 0;
3840 ++c;
3841 }
3842 else
3843 {
3844 int set;
3845
3846 if (*bufend - bufptr < 3)
3847 bufptr = ecoff_add_bytes (buf, bufend, bufptr, (long) 3);
3848 *bufptr++ = setcount + (8 << 4);
3849 if (delta < -0x8000)
3850 {
3851 set = -0x8000;
3852 delta += 0x8000;
3853 }
3854 else if (delta > 0x7fff)
3855 {
3856 set = 0x7fff;
3857 delta -= 0x7fff;
3858 }
3859 else
3860 {
3861 set = delta;
3862 delta = 0;
3863 }
3864 *bufptr++ = set >> 8;
3865 *bufptr++ = set & 0xffff;
3866 c += 3;
3867 }
3868 }
3869
3870 /* Finish adjusting the count. */
3871 while (count > 0)
3872 {
3873 if (bufptr >= *bufend)
3874 bufptr = ecoff_add_bytes (buf, bufend, bufptr, (long) 1);
3875 /* 1 is added to each count read. */
3876 --count;
3877 if (count > 0x0f)
3878 {
3879 *bufptr++ = 0x0f;
3880 count -= 0x0f;
3881 }
3882 else
3883 {
3884 *bufptr++ = count;
3885 count = 0;
3886 }
3887 ++c;
3888 }
3889
3890 ++iline;
3891 last = l;
3892 }
3893
3894 if (proc != (proc_t *) NULL)
3895 proc->pdr.lnHigh = last->lineno;
3896 if (file != (efdr_t *) NULL)
3897 {
3898 file->fdr.cbLine = c - file->fdr.cbLineOffset;
3899 file->fdr.cline = totcount;
3900 }
3901
3902 if (linecntptr != (long *) NULL)
3903 *linecntptr += totcount;
3904
3905 c = ecoff_padding_adjust (backend, buf, bufend, c, &bufptr);
3906
3907 return c;
3908 }
3909
3910 /* Build and swap out the symbols. */
3911
3912 static unsigned long
3913 ecoff_build_symbols (const struct ecoff_debug_swap *backend,
3914 char **buf,
3915 char **bufend,
3916 unsigned long offset)
3917 {
3918 const bfd_size_type external_sym_size = backend->external_sym_size;
3919 void (* const swap_sym_out) (bfd *, const SYMR *, void *)
3920 = backend->swap_sym_out;
3921 char *sym_out;
3922 long isym;
3923 vlinks_t *file_link;
3924
3925 sym_out = *buf + offset;
3926
3927 isym = 0;
3928
3929 /* The symbols are stored by file. */
3930 for (file_link = file_desc.first;
3931 file_link != (vlinks_t *) NULL;
3932 file_link = file_link->next)
3933 {
3934 int ifilesym;
3935 int fil_cnt;
3936 efdr_t *fil_ptr;
3937 efdr_t *fil_end;
3938
3939 if (file_link->next == (vlinks_t *) NULL)
3940 fil_cnt = file_desc.objects_last_page;
3941 else
3942 fil_cnt = file_desc.objects_per_page;
3943 fil_ptr = file_link->datum->file;
3944 fil_end = fil_ptr + fil_cnt;
3945 for (; fil_ptr < fil_end; fil_ptr++)
3946 {
3947 vlinks_t *sym_link;
3948
3949 fil_ptr->fdr.isymBase = isym;
3950 ifilesym = isym;
3951 for (sym_link = fil_ptr->symbols.first;
3952 sym_link != (vlinks_t *) NULL;
3953 sym_link = sym_link->next)
3954 {
3955 int sym_cnt;
3956 localsym_t *sym_ptr;
3957 localsym_t *sym_end;
3958
3959 if (sym_link->next == (vlinks_t *) NULL)
3960 sym_cnt = fil_ptr->symbols.objects_last_page;
3961 else
3962 sym_cnt = fil_ptr->symbols.objects_per_page;
3963 sym_ptr = sym_link->datum->sym;
3964 sym_end = sym_ptr + sym_cnt;
3965 for (; sym_ptr < sym_end; sym_ptr++)
3966 {
3967 int local;
3968 symbolS *as_sym;
3969 forward_t *f;
3970
3971 know (sym_ptr->file_ptr == fil_ptr);
3972
3973 /* If there is no associated gas symbol, then this
3974 is a pure debugging symbol. We have already
3975 added the name (if any) to fil_ptr->strings.
3976 Otherwise we must decide whether this is an
3977 external or a local symbol (actually, it may be
3978 both if the local provides additional debugging
3979 information for the external). */
3980 local = 1;
3981 as_sym = sym_ptr->as_sym;
3982 if (as_sym != (symbolS *) NULL)
3983 {
3984 symint_t indx;
3985
3986 /* The value of a block start symbol is the
3987 offset from the start of the procedure. For
3988 other symbols we just use the gas value (but
3989 we must offset it by the vma of the section,
3990 just as BFD does, because BFD will not see
3991 this value). */
3992 if (sym_ptr->ecoff_sym.asym.st == (int) st_Block
3993 && sym_ptr->ecoff_sym.asym.sc == (int) sc_Text)
3994 {
3995 symbolS *begin_sym;
3996
3997 know (sym_ptr->proc_ptr != (proc_t *) NULL);
3998 begin_sym = sym_ptr->proc_ptr->sym->as_sym;
3999 if (S_GET_SEGMENT (as_sym)
4000 != S_GET_SEGMENT (begin_sym))
4001 as_warn (_(".begin/.bend in different segments"));
4002 sym_ptr->ecoff_sym.asym.value =
4003 S_GET_VALUE (as_sym) - S_GET_VALUE (begin_sym);
4004 }
4005 else
4006 sym_ptr->ecoff_sym.asym.value =
4007 (S_GET_VALUE (as_sym)
4008 + bfd_get_section_vma (stdoutput,
4009 S_GET_SEGMENT (as_sym))
4010 + sym_ptr->addend);
4011
4012 sym_ptr->ecoff_sym.weakext = S_IS_WEAK (as_sym);
4013
4014 /* Set st_Proc to st_StaticProc for local
4015 functions. */
4016 if (sym_ptr->ecoff_sym.asym.st == st_Proc
4017 && S_IS_DEFINED (as_sym)
4018 && ! S_IS_EXTERNAL (as_sym)
4019 && ! S_IS_WEAK (as_sym))
4020 sym_ptr->ecoff_sym.asym.st = st_StaticProc;
4021
4022 /* Get the type and storage class based on where
4023 the symbol actually wound up. Traditionally,
4024 N_LBRAC and N_RBRAC are *not* relocated. */
4025 indx = sym_ptr->ecoff_sym.asym.index;
4026 if (sym_ptr->ecoff_sym.asym.st == st_Nil
4027 && sym_ptr->ecoff_sym.asym.sc == sc_Nil
4028 && (! ECOFF_IS_STAB (&sym_ptr->ecoff_sym.asym)
4029 || ((ECOFF_UNMARK_STAB (indx) != N_LBRAC)
4030 && (ECOFF_UNMARK_STAB (indx) != N_RBRAC))))
4031 {
4032 segT seg;
4033 const char *segname;
4034 st_t st;
4035 sc_t sc;
4036
4037 seg = S_GET_SEGMENT (as_sym);
4038 segname = segment_name (seg);
4039
4040 if (! ECOFF_IS_STAB (&sym_ptr->ecoff_sym.asym)
4041 && (S_IS_EXTERNAL (as_sym)
4042 || S_IS_WEAK (as_sym)
4043 || ! S_IS_DEFINED (as_sym)))
4044 {
4045 if ((symbol_get_bfdsym (as_sym)->flags
4046 & BSF_FUNCTION) != 0)
4047 st = st_Proc;
4048 else
4049 st = st_Global;
4050 }
4051 else if (seg == text_section)
4052 st = st_Label;
4053 else
4054 st = st_Static;
4055
4056 if (! S_IS_DEFINED (as_sym))
4057 {
4058 valueT s;
4059
4060 s = symbol_get_obj (as_sym)->ecoff_extern_size;
4061 if (s == 0
4062 || s > bfd_get_gp_size (stdoutput))
4063 sc = sc_Undefined;
4064 else
4065 {
4066 sc = sc_SUndefined;
4067 sym_ptr->ecoff_sym.asym.value = s;
4068 }
4069 #ifdef S_SET_SIZE
4070 S_SET_SIZE (as_sym, s);
4071 #endif
4072 }
4073 else if (S_IS_COMMON (as_sym))
4074 {
4075 if (S_GET_VALUE (as_sym) > 0
4076 && (S_GET_VALUE (as_sym)
4077 <= bfd_get_gp_size (stdoutput)))
4078 sc = sc_SCommon;
4079 else
4080 sc = sc_Common;
4081 }
4082 else if (seg == text_section)
4083 sc = sc_Text;
4084 else if (seg == data_section)
4085 sc = sc_Data;
4086 else if (strcmp (segname, ".rdata") == 0
4087 || strcmp (segname, ".rodata") == 0)
4088 sc = sc_RData;
4089 else if (strcmp (segname, ".sdata") == 0)
4090 sc = sc_SData;
4091 else if (seg == bss_section)
4092 sc = sc_Bss;
4093 else if (strcmp (segname, ".sbss") == 0)
4094 sc = sc_SBss;
4095 else if (seg == bfd_abs_section_ptr)
4096 sc = sc_Abs;
4097 else
4098 {
4099 /* This must be a user named section.
4100 This is not possible in ECOFF, but it
4101 is in ELF. */
4102 sc = sc_Data;
4103 }
4104
4105 sym_ptr->ecoff_sym.asym.st = (int) st;
4106 sym_ptr->ecoff_sym.asym.sc = (int) sc;
4107 }
4108
4109 /* This is just an external symbol if it is
4110 outside a procedure and it has a type.
4111 FIXME: g++ will generate symbols which have
4112 different names in the debugging information
4113 than the actual symbol. Should we handle
4114 them here? */
4115 if ((S_IS_EXTERNAL (as_sym)
4116 || S_IS_WEAK (as_sym)
4117 || ! S_IS_DEFINED (as_sym))
4118 && sym_ptr->proc_ptr == (proc_t *) NULL
4119 && sym_ptr->ecoff_sym.asym.st != (int) st_Nil
4120 && ! ECOFF_IS_STAB (&sym_ptr->ecoff_sym.asym))
4121 local = 0;
4122
4123 /* This is just an external symbol if it is a
4124 common symbol. */
4125 if (S_IS_COMMON (as_sym))
4126 local = 0;
4127
4128 /* If an st_end symbol has an associated gas
4129 symbol, then it is a local label created for
4130 a .bend or .end directive. Stabs line
4131 numbers will have \001 in the names. */
4132 if (local
4133 && sym_ptr->ecoff_sym.asym.st != st_End
4134 && strchr (sym_ptr->name, '\001') == 0)
4135 sym_ptr->ecoff_sym.asym.iss =
4136 add_string (&fil_ptr->strings,
4137 fil_ptr->str_hash,
4138 sym_ptr->name,
4139 (shash_t **) NULL);
4140 }
4141
4142 /* We now know the index of this symbol; fill in
4143 locations that have been waiting for that
4144 information. */
4145 if (sym_ptr->begin_ptr != (localsym_t *) NULL)
4146 {
4147 localsym_t *begin_ptr;
4148 st_t begin_type;
4149
4150 know (local);
4151 begin_ptr = sym_ptr->begin_ptr;
4152 know (begin_ptr->sym_index != -1);
4153 sym_ptr->ecoff_sym.asym.index = begin_ptr->sym_index;
4154 if (sym_ptr->ecoff_sym.asym.sc != (int) sc_Info)
4155 sym_ptr->ecoff_sym.asym.iss =
4156 begin_ptr->ecoff_sym.asym.iss;
4157
4158 begin_type = (st_t) begin_ptr->ecoff_sym.asym.st;
4159 if (begin_type == st_File
4160 || begin_type == st_Block)
4161 {
4162 begin_ptr->ecoff_sym.asym.index =
4163 isym - ifilesym + 1;
4164 (*swap_sym_out) (stdoutput,
4165 &begin_ptr->ecoff_sym.asym,
4166 (*buf
4167 + offset
4168 + (begin_ptr->sym_index
4169 * external_sym_size)));
4170 }
4171 else
4172 {
4173 know (begin_ptr->index_ptr != (aux_t *) NULL);
4174 begin_ptr->index_ptr->data.isym =
4175 isym - ifilesym + 1;
4176 }
4177
4178 /* The value of the symbol marking the end of a
4179 procedure is the size of the procedure. The
4180 value of the symbol marking the end of a
4181 block is the offset from the start of the
4182 procedure to the block. */
4183 if (begin_type == st_Proc
4184 || begin_type == st_StaticProc)
4185 {
4186 know (as_sym != (symbolS *) NULL);
4187 know (begin_ptr->as_sym != (symbolS *) NULL);
4188 if (S_GET_SEGMENT (as_sym)
4189 != S_GET_SEGMENT (begin_ptr->as_sym))
4190 as_warn (_(".begin/.bend in different segments"));
4191 sym_ptr->ecoff_sym.asym.value =
4192 (S_GET_VALUE (as_sym)
4193 - S_GET_VALUE (begin_ptr->as_sym));
4194
4195 /* If the size is odd, this is probably a
4196 mips16 function; force it to be even. */
4197 if ((sym_ptr->ecoff_sym.asym.value & 1) != 0)
4198 ++sym_ptr->ecoff_sym.asym.value;
4199
4200 #ifdef S_SET_SIZE
4201 S_SET_SIZE (begin_ptr->as_sym,
4202 sym_ptr->ecoff_sym.asym.value);
4203 #endif
4204 }
4205 else if (begin_type == st_Block
4206 && sym_ptr->ecoff_sym.asym.sc != (int) sc_Info)
4207 {
4208 symbolS *begin_sym;
4209
4210 know (as_sym != (symbolS *) NULL);
4211 know (sym_ptr->proc_ptr != (proc_t *) NULL);
4212 begin_sym = sym_ptr->proc_ptr->sym->as_sym;
4213 if (S_GET_SEGMENT (as_sym)
4214 != S_GET_SEGMENT (begin_sym))
4215 as_warn (_(".begin/.bend in different segments"));
4216 sym_ptr->ecoff_sym.asym.value =
4217 S_GET_VALUE (as_sym) - S_GET_VALUE (begin_sym);
4218 }
4219 }
4220
4221 for (f = sym_ptr->forward_ref;
4222 f != (forward_t *) NULL;
4223 f = f->next)
4224 {
4225 know (local);
4226 f->ifd_ptr->data.isym = fil_ptr->file_index;
4227 f->index_ptr->data.rndx.index = isym - ifilesym;
4228 }
4229
4230 if (local)
4231 {
4232 if ((bfd_size_type)(*bufend - sym_out) < external_sym_size)
4233 sym_out = ecoff_add_bytes (buf, bufend,
4234 sym_out,
4235 external_sym_size);
4236 (*swap_sym_out) (stdoutput, &sym_ptr->ecoff_sym.asym,
4237 sym_out);
4238 sym_out += external_sym_size;
4239
4240 sym_ptr->sym_index = isym;
4241
4242 if (sym_ptr->proc_ptr != (proc_t *) NULL
4243 && sym_ptr->proc_ptr->sym == sym_ptr)
4244 sym_ptr->proc_ptr->pdr.isym = isym - ifilesym;
4245
4246 ++isym;
4247 }
4248
4249 /* Record the local symbol index and file number in
4250 case this is an external symbol. Note that this
4251 destroys the asym.index field. */
4252 if (as_sym != (symbolS *) NULL
4253 && symbol_get_obj (as_sym)->ecoff_symbol == sym_ptr)
4254 {
4255 if ((sym_ptr->ecoff_sym.asym.st == st_Proc
4256 || sym_ptr->ecoff_sym.asym.st == st_StaticProc)
4257 && local)
4258 sym_ptr->ecoff_sym.asym.index = isym - ifilesym - 1;
4259 sym_ptr->ecoff_sym.ifd = fil_ptr->file_index;
4260
4261 /* Don't try to merge an FDR which has an
4262 external symbol attached to it. */
4263 if (S_IS_EXTERNAL (as_sym) || S_IS_WEAK (as_sym))
4264 fil_ptr->fdr.fMerge = 0;
4265 }
4266 }
4267 }
4268 fil_ptr->fdr.csym = isym - fil_ptr->fdr.isymBase;
4269 }
4270 }
4271
4272 return offset + isym * external_sym_size;
4273 }
4274
4275 /* Swap out the procedure information. */
4276
4277 static unsigned long
4278 ecoff_build_procs (const struct ecoff_debug_swap *backend,
4279 char **buf,
4280 char **bufend,
4281 unsigned long offset)
4282 {
4283 const bfd_size_type external_pdr_size = backend->external_pdr_size;
4284 void (* const swap_pdr_out) (bfd *, const PDR *, void *)
4285 = backend->swap_pdr_out;
4286 char *pdr_out;
4287 long iproc;
4288 vlinks_t *file_link;
4289
4290 pdr_out = *buf + offset;
4291
4292 iproc = 0;
4293
4294 /* The procedures are stored by file. */
4295 for (file_link = file_desc.first;
4296 file_link != (vlinks_t *) NULL;
4297 file_link = file_link->next)
4298 {
4299 int fil_cnt;
4300 efdr_t *fil_ptr;
4301 efdr_t *fil_end;
4302
4303 if (file_link->next == (vlinks_t *) NULL)
4304 fil_cnt = file_desc.objects_last_page;
4305 else
4306 fil_cnt = file_desc.objects_per_page;
4307 fil_ptr = file_link->datum->file;
4308 fil_end = fil_ptr + fil_cnt;
4309 for (; fil_ptr < fil_end; fil_ptr++)
4310 {
4311 vlinks_t *proc_link;
4312 int first;
4313
4314 fil_ptr->fdr.ipdFirst = iproc;
4315 first = 1;
4316 for (proc_link = fil_ptr->procs.first;
4317 proc_link != (vlinks_t *) NULL;
4318 proc_link = proc_link->next)
4319 {
4320 int prc_cnt;
4321 proc_t *proc_ptr;
4322 proc_t *proc_end;
4323
4324 if (proc_link->next == (vlinks_t *) NULL)
4325 prc_cnt = fil_ptr->procs.objects_last_page;
4326 else
4327 prc_cnt = fil_ptr->procs.objects_per_page;
4328 proc_ptr = proc_link->datum->proc;
4329 proc_end = proc_ptr + prc_cnt;
4330 for (; proc_ptr < proc_end; proc_ptr++)
4331 {
4332 symbolS *adr_sym;
4333 unsigned long adr;
4334
4335 adr_sym = proc_ptr->sym->as_sym;
4336 adr = (S_GET_VALUE (adr_sym)
4337 + bfd_get_section_vma (stdoutput,
4338 S_GET_SEGMENT (adr_sym)));
4339 if (first)
4340 {
4341 /* This code used to force the adr of the very
4342 first fdr to be 0. However, the native tools
4343 don't do that, and I can't remember why it
4344 used to work that way, so I took it out. */
4345 fil_ptr->fdr.adr = adr;
4346 first = 0;
4347 }
4348 proc_ptr->pdr.adr = adr - fil_ptr->fdr.adr;
4349 if ((bfd_size_type)(*bufend - pdr_out) < external_pdr_size)
4350 pdr_out = ecoff_add_bytes (buf, bufend,
4351 pdr_out,
4352 external_pdr_size);
4353 (*swap_pdr_out) (stdoutput, &proc_ptr->pdr, pdr_out);
4354 pdr_out += external_pdr_size;
4355 ++iproc;
4356 }
4357 }
4358 fil_ptr->fdr.cpd = iproc - fil_ptr->fdr.ipdFirst;
4359 }
4360 }
4361
4362 return offset + iproc * external_pdr_size;
4363 }
4364
4365 /* Swap out the aux information. */
4366
4367 static unsigned long
4368 ecoff_build_aux (const struct ecoff_debug_swap *backend,
4369 char **buf,
4370 char **bufend,
4371 unsigned long offset)
4372 {
4373 int bigendian;
4374 union aux_ext *aux_out;
4375 long iaux;
4376 vlinks_t *file_link;
4377
4378 bigendian = bfd_big_endian (stdoutput);
4379
4380 aux_out = (union aux_ext *) (*buf + offset);
4381
4382 iaux = 0;
4383
4384 /* The aux entries are stored by file. */
4385 for (file_link = file_desc.first;
4386 file_link != (vlinks_t *) NULL;
4387 file_link = file_link->next)
4388 {
4389 int fil_cnt;
4390 efdr_t *fil_ptr;
4391 efdr_t *fil_end;
4392
4393 if (file_link->next == (vlinks_t *) NULL)
4394 fil_cnt = file_desc.objects_last_page;
4395 else
4396 fil_cnt = file_desc.objects_per_page;
4397 fil_ptr = file_link->datum->file;
4398 fil_end = fil_ptr + fil_cnt;
4399 for (; fil_ptr < fil_end; fil_ptr++)
4400 {
4401 vlinks_t *aux_link;
4402
4403 fil_ptr->fdr.fBigendian = bigendian;
4404 fil_ptr->fdr.iauxBase = iaux;
4405 for (aux_link = fil_ptr->aux_syms.first;
4406 aux_link != (vlinks_t *) NULL;
4407 aux_link = aux_link->next)
4408 {
4409 int aux_cnt;
4410 aux_t *aux_ptr;
4411 aux_t *aux_end;
4412
4413 if (aux_link->next == (vlinks_t *) NULL)
4414 aux_cnt = fil_ptr->aux_syms.objects_last_page;
4415 else
4416 aux_cnt = fil_ptr->aux_syms.objects_per_page;
4417 aux_ptr = aux_link->datum->aux;
4418 aux_end = aux_ptr + aux_cnt;
4419 for (; aux_ptr < aux_end; aux_ptr++)
4420 {
4421 if ((unsigned long) (*bufend - (char *) aux_out)
4422 < sizeof (union aux_ext))
4423 aux_out = ((union aux_ext *)
4424 ecoff_add_bytes (buf, bufend,
4425 (char *) aux_out,
4426 sizeof (union aux_ext)));
4427 switch (aux_ptr->type)
4428 {
4429 case aux_tir:
4430 (*backend->swap_tir_out) (bigendian,
4431 &aux_ptr->data.ti,
4432 &aux_out->a_ti);
4433 break;
4434 case aux_rndx:
4435 (*backend->swap_rndx_out) (bigendian,
4436 &aux_ptr->data.rndx,
4437 &aux_out->a_rndx);
4438 break;
4439 case aux_dnLow:
4440 AUX_PUT_DNLOW (bigendian, aux_ptr->data.dnLow,
4441 aux_out);
4442 break;
4443 case aux_dnHigh:
4444 AUX_PUT_DNHIGH (bigendian, aux_ptr->data.dnHigh,
4445 aux_out);
4446 break;
4447 case aux_isym:
4448 AUX_PUT_ISYM (bigendian, aux_ptr->data.isym,
4449 aux_out);
4450 break;
4451 case aux_iss:
4452 AUX_PUT_ISS (bigendian, aux_ptr->data.iss,
4453 aux_out);
4454 break;
4455 case aux_width:
4456 AUX_PUT_WIDTH (bigendian, aux_ptr->data.width,
4457 aux_out);
4458 break;
4459 case aux_count:
4460 AUX_PUT_COUNT (bigendian, aux_ptr->data.count,
4461 aux_out);
4462 break;
4463 }
4464
4465 ++aux_out;
4466 ++iaux;
4467 }
4468 }
4469 fil_ptr->fdr.caux = iaux - fil_ptr->fdr.iauxBase;
4470 }
4471 }
4472
4473 return ecoff_padding_adjust (backend, buf, bufend,
4474 offset + iaux * sizeof (union aux_ext),
4475 (char **) NULL);
4476 }
4477
4478 /* Copy out the strings from a varray_t. This returns the number of
4479 bytes copied, rather than the new offset. */
4480
4481 static unsigned long
4482 ecoff_build_strings (char **buf,
4483 char **bufend,
4484 unsigned long offset,
4485 varray_t *vp)
4486 {
4487 unsigned long istr;
4488 char *str_out;
4489 vlinks_t *str_link;
4490
4491 str_out = *buf + offset;
4492
4493 istr = 0;
4494
4495 for (str_link = vp->first;
4496 str_link != (vlinks_t *) NULL;
4497 str_link = str_link->next)
4498 {
4499 unsigned long str_cnt;
4500
4501 if (str_link->next == (vlinks_t *) NULL)
4502 str_cnt = vp->objects_last_page;
4503 else
4504 str_cnt = vp->objects_per_page;
4505
4506 if ((unsigned long)(*bufend - str_out) < str_cnt)
4507 str_out = ecoff_add_bytes (buf, bufend, str_out, str_cnt);
4508
4509 memcpy (str_out, str_link->datum->byte, str_cnt);
4510 str_out += str_cnt;
4511 istr += str_cnt;
4512 }
4513
4514 return istr;
4515 }
4516
4517 /* Dump out the local strings. */
4518
4519 static unsigned long
4520 ecoff_build_ss (const struct ecoff_debug_swap *backend,
4521 char **buf,
4522 char **bufend,
4523 unsigned long offset)
4524 {
4525 long iss;
4526 vlinks_t *file_link;
4527
4528 iss = 0;
4529
4530 for (file_link = file_desc.first;
4531 file_link != (vlinks_t *) NULL;
4532 file_link = file_link->next)
4533 {
4534 int fil_cnt;
4535 efdr_t *fil_ptr;
4536 efdr_t *fil_end;
4537
4538 if (file_link->next == (vlinks_t *) NULL)
4539 fil_cnt = file_desc.objects_last_page;
4540 else
4541 fil_cnt = file_desc.objects_per_page;
4542 fil_ptr = file_link->datum->file;
4543 fil_end = fil_ptr + fil_cnt;
4544 for (; fil_ptr < fil_end; fil_ptr++)
4545 {
4546 long ss_cnt;
4547
4548 fil_ptr->fdr.issBase = iss;
4549 ss_cnt = ecoff_build_strings (buf, bufend, offset + iss,
4550 &fil_ptr->strings);
4551 fil_ptr->fdr.cbSs = ss_cnt;
4552 iss += ss_cnt;
4553 }
4554 }
4555
4556 return ecoff_padding_adjust (backend, buf, bufend, offset + iss,
4557 (char **) NULL);
4558 }
4559
4560 /* Swap out the file descriptors. */
4561
4562 static unsigned long
4563 ecoff_build_fdr (const struct ecoff_debug_swap *backend,
4564 char **buf,
4565 char **bufend,
4566 unsigned long offset)
4567 {
4568 const bfd_size_type external_fdr_size = backend->external_fdr_size;
4569 void (* const swap_fdr_out) (bfd *, const FDR *, void *)
4570 = backend->swap_fdr_out;
4571 long ifile;
4572 char *fdr_out;
4573 vlinks_t *file_link;
4574
4575 ifile = 0;
4576
4577 fdr_out = *buf + offset;
4578
4579 for (file_link = file_desc.first;
4580 file_link != (vlinks_t *) NULL;
4581 file_link = file_link->next)
4582 {
4583 int fil_cnt;
4584 efdr_t *fil_ptr;
4585 efdr_t *fil_end;
4586
4587 if (file_link->next == (vlinks_t *) NULL)
4588 fil_cnt = file_desc.objects_last_page;
4589 else
4590 fil_cnt = file_desc.objects_per_page;
4591 fil_ptr = file_link->datum->file;
4592 fil_end = fil_ptr + fil_cnt;
4593 for (; fil_ptr < fil_end; fil_ptr++)
4594 {
4595 if ((bfd_size_type)(*bufend - fdr_out) < external_fdr_size)
4596 fdr_out = ecoff_add_bytes (buf, bufend, fdr_out,
4597 external_fdr_size);
4598 (*swap_fdr_out) (stdoutput, &fil_ptr->fdr, fdr_out);
4599 fdr_out += external_fdr_size;
4600 ++ifile;
4601 }
4602 }
4603
4604 return offset + ifile * external_fdr_size;
4605 }
4606
4607 /* Set up the external symbols. These are supposed to be handled by
4608 the backend. This routine just gets the right information and
4609 calls a backend function to deal with it. */
4610
4611 static void
4612 ecoff_setup_ext (void)
4613 {
4614 symbolS *sym;
4615
4616 for (sym = symbol_rootP; sym != (symbolS *) NULL; sym = symbol_next (sym))
4617 {
4618 if (symbol_get_obj (sym)->ecoff_symbol == NULL)
4619 continue;
4620
4621 /* If this is a local symbol, then force the fields to zero. */
4622 if (! S_IS_EXTERNAL (sym)
4623 && ! S_IS_WEAK (sym)
4624 && S_IS_DEFINED (sym))
4625 {
4626 struct localsym *lsym;
4627
4628 lsym = symbol_get_obj (sym)->ecoff_symbol;
4629 lsym->ecoff_sym.asym.value = 0;
4630 lsym->ecoff_sym.asym.st = (int) st_Nil;
4631 lsym->ecoff_sym.asym.sc = (int) sc_Nil;
4632 lsym->ecoff_sym.asym.index = indexNil;
4633 }
4634
4635 obj_ecoff_set_ext (sym, &symbol_get_obj (sym)->ecoff_symbol->ecoff_sym);
4636 }
4637 }
4638
4639 /* Build the ECOFF debugging information. */
4640
4641 unsigned long
4642 ecoff_build_debug (HDRR *hdr,
4643 char **bufp,
4644 const struct ecoff_debug_swap *backend)
4645 {
4646 const bfd_size_type external_pdr_size = backend->external_pdr_size;
4647 tag_t *ptag;
4648 tag_t *ptag_next;
4649 efdr_t *fil_ptr;
4650 int end_warning;
4651 efdr_t *hold_file_ptr;
4652 proc_t *hold_proc_ptr;
4653 symbolS *sym;
4654 char *buf;
4655 char *bufend;
4656 unsigned long offset;
4657
4658 /* Make sure we have a file. */
4659 if (first_file == (efdr_t *) NULL)
4660 add_file ((const char *) NULL, 0, 1);
4661
4662 /* Handle any top level tags. */
4663 for (ptag = top_tag_head->first_tag;
4664 ptag != (tag_t *) NULL;
4665 ptag = ptag_next)
4666 {
4667 if (ptag->forward_ref != (forward_t *) NULL)
4668 add_unknown_tag (ptag);
4669
4670 ptag_next = ptag->same_block;
4671 ptag->hash_ptr->tag_ptr = ptag->same_name;
4672 free_tag (ptag);
4673 }
4674
4675 free_thead (top_tag_head);
4676
4677 /* Look through the symbols. Add debugging information for each
4678 symbol that has not already received it. */
4679 hold_file_ptr = cur_file_ptr;
4680 hold_proc_ptr = cur_proc_ptr;
4681 cur_proc_ptr = (proc_t *) NULL;
4682 for (sym = symbol_rootP; sym != (symbolS *) NULL; sym = symbol_next (sym))
4683 {
4684 if (symbol_get_obj (sym)->ecoff_symbol != NULL
4685 || symbol_get_obj (sym)->ecoff_file == (efdr_t *) NULL
4686 || (symbol_get_bfdsym (sym)->flags & BSF_SECTION_SYM) != 0)
4687 continue;
4688
4689 cur_file_ptr = symbol_get_obj (sym)->ecoff_file;
4690 add_ecoff_symbol ((const char *) NULL, st_Nil, sc_Nil, sym,
4691 (bfd_vma) 0, S_GET_VALUE (sym), indexNil);
4692 }
4693 cur_proc_ptr = hold_proc_ptr;
4694 cur_file_ptr = hold_file_ptr;
4695
4696 /* Output an ending symbol for all the files. We have to do this
4697 here for the last file, so we may as well do it for all of the
4698 files. */
4699 end_warning = 0;
4700 for (fil_ptr = first_file;
4701 fil_ptr != (efdr_t *) NULL;
4702 fil_ptr = fil_ptr->next_file)
4703 {
4704 cur_file_ptr = fil_ptr;
4705 while (cur_file_ptr->cur_scope != (scope_t *) NULL
4706 && cur_file_ptr->cur_scope->prev != (scope_t *) NULL)
4707 {
4708 cur_file_ptr->cur_scope = cur_file_ptr->cur_scope->prev;
4709 if (! end_warning && ! cur_file_ptr->fake)
4710 {
4711 as_warn (_("missing .end or .bend at end of file"));
4712 end_warning = 1;
4713 }
4714 }
4715 if (cur_file_ptr->cur_scope != (scope_t *) NULL)
4716 (void) add_ecoff_symbol ((const char *) NULL,
4717 st_End, sc_Text,
4718 (symbolS *) NULL,
4719 (bfd_vma) 0,
4720 (symint_t) 0,
4721 (symint_t) 0);
4722 }
4723
4724 /* Build the symbolic information. */
4725 offset = 0;
4726 buf = XNEWVEC (char, PAGE_SIZE);
4727 bufend = buf + PAGE_SIZE;
4728
4729 /* Build the line number information. */
4730 hdr->cbLineOffset = offset;
4731 offset = ecoff_build_lineno (backend, &buf, &bufend, offset,
4732 &hdr->ilineMax);
4733 hdr->cbLine = offset - hdr->cbLineOffset;
4734
4735 /* We don't use dense numbers at all. */
4736 hdr->idnMax = 0;
4737 hdr->cbDnOffset = 0;
4738
4739 /* We can't build the PDR table until we have built the symbols,
4740 because a PDR contains a symbol index. However, we set aside
4741 space at this point. */
4742 hdr->ipdMax = proc_cnt;
4743 hdr->cbPdOffset = offset;
4744 if ((bfd_size_type)(bufend - (buf + offset)) < proc_cnt * external_pdr_size)
4745 (void) ecoff_add_bytes (&buf, &bufend, buf + offset,
4746 proc_cnt * external_pdr_size);
4747 offset += proc_cnt * external_pdr_size;
4748
4749 /* Build the local symbols. */
4750 hdr->cbSymOffset = offset;
4751 offset = ecoff_build_symbols (backend, &buf, &bufend, offset);
4752 hdr->isymMax = (offset - hdr->cbSymOffset) / backend->external_sym_size;
4753
4754 /* Building the symbols initializes the symbol index in the PDR's.
4755 Now we can swap out the PDR's. */
4756 (void) ecoff_build_procs (backend, &buf, &bufend, hdr->cbPdOffset);
4757
4758 /* We don't use optimization symbols. */
4759 hdr->ioptMax = 0;
4760 hdr->cbOptOffset = 0;
4761
4762 /* Swap out the auxiliary type information. */
4763 hdr->cbAuxOffset = offset;
4764 offset = ecoff_build_aux (backend, &buf, &bufend, offset);
4765 hdr->iauxMax = (offset - hdr->cbAuxOffset) / sizeof (union aux_ext);
4766
4767 /* Copy out the local strings. */
4768 hdr->cbSsOffset = offset;
4769 offset = ecoff_build_ss (backend, &buf, &bufend, offset);
4770 hdr->issMax = offset - hdr->cbSsOffset;
4771
4772 /* We don't use relative file descriptors. */
4773 hdr->crfd = 0;
4774 hdr->cbRfdOffset = 0;
4775
4776 /* Swap out the file descriptors. */
4777 hdr->cbFdOffset = offset;
4778 offset = ecoff_build_fdr (backend, &buf, &bufend, offset);
4779 hdr->ifdMax = (offset - hdr->cbFdOffset) / backend->external_fdr_size;
4780
4781 /* Set up the external symbols, which are handled by the BFD back
4782 end. */
4783 hdr->issExtMax = 0;
4784 hdr->cbSsExtOffset = 0;
4785 hdr->iextMax = 0;
4786 hdr->cbExtOffset = 0;
4787 ecoff_setup_ext ();
4788
4789 know ((offset & (backend->debug_align - 1)) == 0);
4790
4791 /* FIXME: This value should be determined from the .verstamp directive,
4792 with reasonable defaults in config files. */
4793 #ifdef TC_ALPHA
4794 hdr->vstamp = 0x030b;
4795 #else
4796 hdr->vstamp = 0x020b;
4797 #endif
4798
4799 *bufp = buf;
4800 return offset;
4801 }
4802
4803 /* Allocate a cluster of pages. */
4805
4806 #ifndef MALLOC_CHECK
4807
4808 static page_type *
4809 allocate_cluster (unsigned long npages)
4810 {
4811 page_type *value = (page_type *) xmalloc (npages * PAGE_USIZE);
4812
4813 #ifdef ECOFF_DEBUG
4814 if (debug > 3)
4815 fprintf (stderr, "\talloc\tnpages = %d, value = 0x%.8x\n", npages, value);
4816 #endif
4817
4818 memset (value, 0, npages * PAGE_USIZE);
4819
4820 return value;
4821 }
4822
4823 static page_type *cluster_ptr = NULL;
4824 static unsigned long pages_left = 0;
4825
4826 #endif /* MALLOC_CHECK */
4827
4828 /* Allocate one page (which is initialized to 0). */
4829
4830 static page_type *
4831 allocate_page (void)
4832 {
4833 #ifndef MALLOC_CHECK
4834
4835 if (pages_left == 0)
4836 {
4837 pages_left = MAX_CLUSTER_PAGES;
4838 cluster_ptr = allocate_cluster (pages_left);
4839 }
4840
4841 pages_left--;
4842 return cluster_ptr++;
4843
4844 #else /* MALLOC_CHECK */
4845
4846 page_type *ptr;
4847
4848 ptr = xmalloc (PAGE_USIZE);
4849 memset (ptr, 0, PAGE_USIZE);
4850 return ptr;
4851
4852 #endif /* MALLOC_CHECK */
4853 }
4854
4855 /* Allocate scoping information. */
4857
4858 static scope_t *
4859 allocate_scope (void)
4860 {
4861 scope_t *ptr;
4862 static scope_t initial_scope;
4863
4864 #ifndef MALLOC_CHECK
4865
4866 ptr = alloc_counts[(int) alloc_type_scope].free_list.f_scope;
4867 if (ptr != (scope_t *) NULL)
4868 alloc_counts[(int) alloc_type_scope].free_list.f_scope = ptr->free;
4869 else
4870 {
4871 int unallocated = alloc_counts[(int) alloc_type_scope].unallocated;
4872 page_type *cur_page = alloc_counts[(int) alloc_type_scope].cur_page;
4873
4874 if (unallocated == 0)
4875 {
4876 unallocated = PAGE_SIZE / sizeof (scope_t);
4877 alloc_counts[(int) alloc_type_scope].cur_page = cur_page = allocate_page ();
4878 alloc_counts[(int) alloc_type_scope].total_pages++;
4879 }
4880
4881 ptr = &cur_page->scope[--unallocated];
4882 alloc_counts[(int) alloc_type_scope].unallocated = unallocated;
4883 }
4884
4885 #else
4886
4887 ptr = XNEW (scope_t);
4888
4889 #endif
4890
4891 alloc_counts[(int) alloc_type_scope].total_alloc++;
4892 *ptr = initial_scope;
4893 return ptr;
4894 }
4895
4896 /* Free scoping information. */
4897
4898 static void
4899 free_scope (scope_t *ptr)
4900 {
4901 alloc_counts[(int) alloc_type_scope].total_free++;
4902
4903 #ifndef MALLOC_CHECK
4904 ptr->free = alloc_counts[(int) alloc_type_scope].free_list.f_scope;
4905 alloc_counts[(int) alloc_type_scope].free_list.f_scope = ptr;
4906 #else
4907 free ((void *) ptr);
4908 #endif
4909 }
4910
4911 /* Allocate links for pages in a virtual array. */
4913
4914 static vlinks_t *
4915 allocate_vlinks (void)
4916 {
4917 vlinks_t *ptr;
4918 static vlinks_t initial_vlinks;
4919
4920 #ifndef MALLOC_CHECK
4921
4922 int unallocated = alloc_counts[(int) alloc_type_vlinks].unallocated;
4923 page_type *cur_page = alloc_counts[(int) alloc_type_vlinks].cur_page;
4924
4925 if (unallocated == 0)
4926 {
4927 unallocated = PAGE_SIZE / sizeof (vlinks_t);
4928 alloc_counts[(int) alloc_type_vlinks].cur_page = cur_page = allocate_page ();
4929 alloc_counts[(int) alloc_type_vlinks].total_pages++;
4930 }
4931
4932 ptr = &cur_page->vlinks[--unallocated];
4933 alloc_counts[(int) alloc_type_vlinks].unallocated = unallocated;
4934
4935 #else
4936
4937 ptr = XNEW (vlinks_t);
4938
4939 #endif
4940
4941 alloc_counts[(int) alloc_type_vlinks].total_alloc++;
4942 *ptr = initial_vlinks;
4943 return ptr;
4944 }
4945
4946 /* Allocate string hash buckets. */
4948
4949 static shash_t *
4950 allocate_shash (void)
4951 {
4952 shash_t *ptr;
4953 static shash_t initial_shash;
4954
4955 #ifndef MALLOC_CHECK
4956
4957 int unallocated = alloc_counts[(int) alloc_type_shash].unallocated;
4958 page_type *cur_page = alloc_counts[(int) alloc_type_shash].cur_page;
4959
4960 if (unallocated == 0)
4961 {
4962 unallocated = PAGE_SIZE / sizeof (shash_t);
4963 alloc_counts[(int) alloc_type_shash].cur_page = cur_page = allocate_page ();
4964 alloc_counts[(int) alloc_type_shash].total_pages++;
4965 }
4966
4967 ptr = &cur_page->shash[--unallocated];
4968 alloc_counts[(int) alloc_type_shash].unallocated = unallocated;
4969
4970 #else
4971
4972 ptr = XNEW (shash_t);
4973
4974 #endif
4975
4976 alloc_counts[(int) alloc_type_shash].total_alloc++;
4977 *ptr = initial_shash;
4978 return ptr;
4979 }
4980
4981 /* Allocate type hash buckets. */
4983
4984 static thash_t *
4985 allocate_thash (void)
4986 {
4987 thash_t *ptr;
4988 static thash_t initial_thash;
4989
4990 #ifndef MALLOC_CHECK
4991
4992 int unallocated = alloc_counts[(int) alloc_type_thash].unallocated;
4993 page_type *cur_page = alloc_counts[(int) alloc_type_thash].cur_page;
4994
4995 if (unallocated == 0)
4996 {
4997 unallocated = PAGE_SIZE / sizeof (thash_t);
4998 alloc_counts[(int) alloc_type_thash].cur_page = cur_page = allocate_page ();
4999 alloc_counts[(int) alloc_type_thash].total_pages++;
5000 }
5001
5002 ptr = &cur_page->thash[--unallocated];
5003 alloc_counts[(int) alloc_type_thash].unallocated = unallocated;
5004
5005 #else
5006
5007 ptr = XNEW (thash_t);
5008
5009 #endif
5010
5011 alloc_counts[(int) alloc_type_thash].total_alloc++;
5012 *ptr = initial_thash;
5013 return ptr;
5014 }
5015
5016 /* Allocate structure, union, or enum tag information. */
5018
5019 static tag_t *
5020 allocate_tag (void)
5021 {
5022 tag_t *ptr;
5023 static tag_t initial_tag;
5024
5025 #ifndef MALLOC_CHECK
5026
5027 ptr = alloc_counts[(int) alloc_type_tag].free_list.f_tag;
5028 if (ptr != (tag_t *) NULL)
5029 alloc_counts[(int) alloc_type_tag].free_list.f_tag = ptr->free;
5030 else
5031 {
5032 int unallocated = alloc_counts[(int) alloc_type_tag].unallocated;
5033 page_type *cur_page = alloc_counts[(int) alloc_type_tag].cur_page;
5034
5035 if (unallocated == 0)
5036 {
5037 unallocated = PAGE_SIZE / sizeof (tag_t);
5038 alloc_counts[(int) alloc_type_tag].cur_page = cur_page = allocate_page ();
5039 alloc_counts[(int) alloc_type_tag].total_pages++;
5040 }
5041
5042 ptr = &cur_page->tag[--unallocated];
5043 alloc_counts[(int) alloc_type_tag].unallocated = unallocated;
5044 }
5045
5046 #else
5047
5048 ptr = XNEW (tag_t);
5049
5050 #endif
5051
5052 alloc_counts[(int) alloc_type_tag].total_alloc++;
5053 *ptr = initial_tag;
5054 return ptr;
5055 }
5056
5057 /* Free scoping information. */
5058
5059 static void
5060 free_tag (tag_t *ptr)
5061 {
5062 alloc_counts[(int) alloc_type_tag].total_free++;
5063
5064 #ifndef MALLOC_CHECK
5065 ptr->free = alloc_counts[(int) alloc_type_tag].free_list.f_tag;
5066 alloc_counts[(int) alloc_type_tag].free_list.f_tag = ptr;
5067 #else
5068 free ((PTR_T) ptr);
5069 #endif
5070 }
5071
5072 /* Allocate forward reference to a yet unknown tag. */
5074
5075 static forward_t *
5076 allocate_forward (void)
5077 {
5078 forward_t *ptr;
5079 static forward_t initial_forward;
5080
5081 #ifndef MALLOC_CHECK
5082
5083 int unallocated = alloc_counts[(int) alloc_type_forward].unallocated;
5084 page_type *cur_page = alloc_counts[(int) alloc_type_forward].cur_page;
5085
5086 if (unallocated == 0)
5087 {
5088 unallocated = PAGE_SIZE / sizeof (forward_t);
5089 alloc_counts[(int) alloc_type_forward].cur_page = cur_page = allocate_page ();
5090 alloc_counts[(int) alloc_type_forward].total_pages++;
5091 }
5092
5093 ptr = &cur_page->forward[--unallocated];
5094 alloc_counts[(int) alloc_type_forward].unallocated = unallocated;
5095
5096 #else
5097
5098 ptr = XNEW (forward_t);
5099
5100 #endif
5101
5102 alloc_counts[(int) alloc_type_forward].total_alloc++;
5103 *ptr = initial_forward;
5104 return ptr;
5105 }
5106
5107 /* Allocate head of type hash list. */
5109
5110 static thead_t *
5111 allocate_thead (void)
5112 {
5113 thead_t *ptr;
5114 static thead_t initial_thead;
5115
5116 #ifndef MALLOC_CHECK
5117
5118 ptr = alloc_counts[(int) alloc_type_thead].free_list.f_thead;
5119 if (ptr != (thead_t *) NULL)
5120 alloc_counts[(int) alloc_type_thead].free_list.f_thead = ptr->free;
5121 else
5122 {
5123 int unallocated = alloc_counts[(int) alloc_type_thead].unallocated;
5124 page_type *cur_page = alloc_counts[(int) alloc_type_thead].cur_page;
5125
5126 if (unallocated == 0)
5127 {
5128 unallocated = PAGE_SIZE / sizeof (thead_t);
5129 alloc_counts[(int) alloc_type_thead].cur_page = cur_page = allocate_page ();
5130 alloc_counts[(int) alloc_type_thead].total_pages++;
5131 }
5132
5133 ptr = &cur_page->thead[--unallocated];
5134 alloc_counts[(int) alloc_type_thead].unallocated = unallocated;
5135 }
5136
5137 #else
5138
5139 ptr = XNEW (thead_t);
5140
5141 #endif
5142
5143 alloc_counts[(int) alloc_type_thead].total_alloc++;
5144 *ptr = initial_thead;
5145 return ptr;
5146 }
5147
5148 /* Free scoping information. */
5149
5150 static void
5151 free_thead (thead_t *ptr)
5152 {
5153 alloc_counts[(int) alloc_type_thead].total_free++;
5154
5155 #ifndef MALLOC_CHECK
5156 ptr->free = (thead_t *) alloc_counts[(int) alloc_type_thead].free_list.f_thead;
5157 alloc_counts[(int) alloc_type_thead].free_list.f_thead = ptr;
5158 #else
5159 free ((PTR_T) ptr);
5160 #endif
5161 }
5162
5163 static lineno_list_t *
5165 allocate_lineno_list (void)
5166 {
5167 lineno_list_t *ptr;
5168 static lineno_list_t initial_lineno_list;
5169
5170 #ifndef MALLOC_CHECK
5171
5172 int unallocated = alloc_counts[(int) alloc_type_lineno].unallocated;
5173 page_type *cur_page = alloc_counts[(int) alloc_type_lineno].cur_page;
5174
5175 if (unallocated == 0)
5176 {
5177 unallocated = PAGE_SIZE / sizeof (lineno_list_t);
5178 alloc_counts[(int) alloc_type_lineno].cur_page = cur_page = allocate_page ();
5179 alloc_counts[(int) alloc_type_lineno].total_pages++;
5180 }
5181
5182 ptr = &cur_page->lineno[--unallocated];
5183 alloc_counts[(int) alloc_type_lineno].unallocated = unallocated;
5184
5185 #else
5186
5187 ptr = XNEW (lineno_list_t);
5188
5189 #endif
5190
5191 alloc_counts[(int) alloc_type_lineno].total_alloc++;
5192 *ptr = initial_lineno_list;
5193 return ptr;
5194 }
5195
5196 void
5197 ecoff_set_gp_prolog_size (int sz)
5198 {
5199 if (cur_proc_ptr == 0)
5200 return;
5201
5202 cur_proc_ptr->pdr.gp_prologue = sz;
5203 if (cur_proc_ptr->pdr.gp_prologue != sz)
5204 {
5205 as_warn (_("GP prologue size exceeds field size, using 0 instead"));
5206 cur_proc_ptr->pdr.gp_prologue = 0;
5207 }
5208
5209 cur_proc_ptr->pdr.gp_used = 1;
5210 }
5211
5212 int
5213 ecoff_no_current_file (void)
5214 {
5215 return cur_file_ptr == (efdr_t *) NULL;
5216 }
5217
5218 void
5219 ecoff_generate_asm_lineno (void)
5220 {
5221 unsigned int lineno;
5222 const char *filename;
5223 lineno_list_t *list;
5224
5225 filename = as_where (&lineno);
5226
5227 if (current_stabs_filename == (char *) NULL
5228 || filename_cmp (current_stabs_filename, filename))
5229 add_file (filename, 0, 1);
5230
5231 list = allocate_lineno_list ();
5232
5233 list->next = (lineno_list_t *) NULL;
5234 list->file = cur_file_ptr;
5235 list->proc = cur_proc_ptr;
5236 list->frag = frag_now;
5237 list->paddr = frag_now_fix ();
5238 list->lineno = lineno;
5239
5240 /* We don't want to merge files which have line numbers. */
5241 cur_file_ptr->fdr.fMerge = 0;
5242
5243 /* A .loc directive will sometimes appear before a .ent directive,
5244 which means that cur_proc_ptr will be NULL here. Arrange to
5245 patch this up. */
5246 if (cur_proc_ptr == (proc_t *) NULL)
5247 {
5248 lineno_list_t **pl;
5249
5250 pl = &noproc_lineno;
5251 while (*pl != (lineno_list_t *) NULL)
5252 pl = &(*pl)->next;
5253 *pl = list;
5254 }
5255 else
5256 {
5257 last_lineno = list;
5258 *last_lineno_ptr = list;
5259 last_lineno_ptr = &list->next;
5260 }
5261 }
5262
5263 #else
5264
5265 void
5266 ecoff_generate_asm_lineno (void)
5267 {
5268 }
5269
5270 #endif /* ECOFF_DEBUGGING */
5271