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