1 /* tc-hppa.c -- Assemble for the PA 2 Copyright 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 3 2002, 2003 Free Software Foundation, Inc. 4 5 This file is part of GAS, the GNU Assembler. 6 7 GAS is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 2, or (at your option) 10 any later version. 11 12 GAS is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with GAS; see the file COPYING. If not, write to the Free 19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA 20 02111-1307, USA. */ 21 22 /* HP PA-RISC support was contributed by the Center for Software Science 23 at the University of Utah. */ 24 25 #include <stdio.h> 26 27 #include "as.h" 28 #include "safe-ctype.h" 29 #include "subsegs.h" 30 31 #include "bfd/libhppa.h" 32 33 /* Be careful, this file includes data *declarations*. */ 34 #include "opcode/hppa.h" 35 36 #if defined (OBJ_ELF) && defined (OBJ_SOM) 37 error only one of OBJ_ELF and OBJ_SOM can be defined 38 #endif 39 40 /* If we are using ELF, then we probably can support dwarf2 debug 41 records. Furthermore, if we are supporting dwarf2 debug records, 42 then we want to use the assembler support for compact line numbers. */ 43 #ifdef OBJ_ELF 44 #include "dwarf2dbg.h" 45 46 /* A "convenient" place to put object file dependencies which do 47 not need to be seen outside of tc-hppa.c. */ 48 49 /* Object file formats specify relocation types. */ 50 typedef enum elf_hppa_reloc_type reloc_type; 51 52 /* Object file formats specify BFD symbol types. */ 53 typedef elf_symbol_type obj_symbol_type; 54 #define symbol_arg_reloc_info(sym)\ 55 (((obj_symbol_type *) symbol_get_bfdsym (sym))->tc_data.hppa_arg_reloc) 56 57 #if TARGET_ARCH_SIZE == 64 58 /* How to generate a relocation. */ 59 #define hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type 60 #define elf_hppa_reloc_final_type elf64_hppa_reloc_final_type 61 #else 62 #define hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type 63 #define elf_hppa_reloc_final_type elf32_hppa_reloc_final_type 64 #endif 65 66 /* ELF objects can have versions, but apparently do not have anywhere 67 to store a copyright string. */ 68 #define obj_version obj_elf_version 69 #define obj_copyright obj_elf_version 70 71 #define UNWIND_SECTION_NAME ".PARISC.unwind" 72 #endif /* OBJ_ELF */ 73 74 #ifdef OBJ_SOM 75 /* Names of various debugging spaces/subspaces. */ 76 #define GDB_DEBUG_SPACE_NAME "$GDB_DEBUG$" 77 #define GDB_STRINGS_SUBSPACE_NAME "$GDB_STRINGS$" 78 #define GDB_SYMBOLS_SUBSPACE_NAME "$GDB_SYMBOLS$" 79 #define UNWIND_SECTION_NAME "$UNWIND$" 80 81 /* Object file formats specify relocation types. */ 82 typedef int reloc_type; 83 84 /* SOM objects can have both a version string and a copyright string. */ 85 #define obj_version obj_som_version 86 #define obj_copyright obj_som_copyright 87 88 /* How to generate a relocation. */ 89 #define hppa_gen_reloc_type hppa_som_gen_reloc_type 90 91 /* Object file formats specify BFD symbol types. */ 92 typedef som_symbol_type obj_symbol_type; 93 #define symbol_arg_reloc_info(sym)\ 94 (((obj_symbol_type *) symbol_get_bfdsym (sym))->tc_data.ap.hppa_arg_reloc) 95 96 /* This apparently isn't in older versions of hpux reloc.h. */ 97 #ifndef R_DLT_REL 98 #define R_DLT_REL 0x78 99 #endif 100 101 #ifndef R_N0SEL 102 #define R_N0SEL 0xd8 103 #endif 104 105 #ifndef R_N1SEL 106 #define R_N1SEL 0xd9 107 #endif 108 #endif /* OBJ_SOM */ 109 110 #if TARGET_ARCH_SIZE == 64 111 #define DEFAULT_LEVEL 25 112 #else 113 #define DEFAULT_LEVEL 10 114 #endif 115 116 /* Various structures and types used internally in tc-hppa.c. */ 117 118 /* Unwind table and descriptor. FIXME: Sync this with GDB version. */ 119 120 struct unwind_desc 121 { 122 unsigned int cannot_unwind:1; 123 unsigned int millicode:1; 124 unsigned int millicode_save_rest:1; 125 unsigned int region_desc:2; 126 unsigned int save_sr:2; 127 unsigned int entry_fr:4; 128 unsigned int entry_gr:5; 129 unsigned int args_stored:1; 130 unsigned int call_fr:5; 131 unsigned int call_gr:5; 132 unsigned int save_sp:1; 133 unsigned int save_rp:1; 134 unsigned int save_rp_in_frame:1; 135 unsigned int extn_ptr_defined:1; 136 unsigned int cleanup_defined:1; 137 138 unsigned int hpe_interrupt_marker:1; 139 unsigned int hpux_interrupt_marker:1; 140 unsigned int reserved:3; 141 unsigned int frame_size:27; 142 }; 143 144 /* We can't rely on compilers placing bitfields in any particular 145 place, so use these macros when dumping unwind descriptors to 146 object files. */ 147 #define UNWIND_LOW32(U) \ 148 (((U)->cannot_unwind << 31) \ 149 | ((U)->millicode << 30) \ 150 | ((U)->millicode_save_rest << 29) \ 151 | ((U)->region_desc << 27) \ 152 | ((U)->save_sr << 25) \ 153 | ((U)->entry_fr << 21) \ 154 | ((U)->entry_gr << 16) \ 155 | ((U)->args_stored << 15) \ 156 | ((U)->call_fr << 10) \ 157 | ((U)->call_gr << 5) \ 158 | ((U)->save_sp << 4) \ 159 | ((U)->save_rp << 3) \ 160 | ((U)->save_rp_in_frame << 2) \ 161 | ((U)->extn_ptr_defined << 1) \ 162 | ((U)->cleanup_defined << 0)) 163 164 #define UNWIND_HIGH32(U) \ 165 (((U)->hpe_interrupt_marker << 31) \ 166 | ((U)->hpux_interrupt_marker << 30) \ 167 | ((U)->frame_size << 0)) 168 169 struct unwind_table 170 { 171 /* Starting and ending offsets of the region described by 172 descriptor. */ 173 unsigned int start_offset; 174 unsigned int end_offset; 175 struct unwind_desc descriptor; 176 }; 177 178 /* This structure is used by the .callinfo, .enter, .leave pseudo-ops to 179 control the entry and exit code they generate. It is also used in 180 creation of the correct stack unwind descriptors. 181 182 NOTE: GAS does not support .enter and .leave for the generation of 183 prologues and epilogues. FIXME. 184 185 The fields in structure roughly correspond to the arguments available on the 186 .callinfo pseudo-op. */ 187 188 struct call_info 189 { 190 /* The unwind descriptor being built. */ 191 struct unwind_table ci_unwind; 192 193 /* Name of this function. */ 194 symbolS *start_symbol; 195 196 /* (temporary) symbol used to mark the end of this function. */ 197 symbolS *end_symbol; 198 199 /* Next entry in the chain. */ 200 struct call_info *ci_next; 201 }; 202 203 /* Operand formats for FP instructions. Note not all FP instructions 204 allow all four formats to be used (for example fmpysub only allows 205 SGL and DBL). */ 206 typedef enum 207 { 208 SGL, DBL, ILLEGAL_FMT, QUAD, W, UW, DW, UDW, QW, UQW 209 } 210 fp_operand_format; 211 212 /* This fully describes the symbol types which may be attached to 213 an EXPORT or IMPORT directive. Only SOM uses this formation 214 (ELF has no need for it). */ 215 typedef enum 216 { 217 SYMBOL_TYPE_UNKNOWN, 218 SYMBOL_TYPE_ABSOLUTE, 219 SYMBOL_TYPE_CODE, 220 SYMBOL_TYPE_DATA, 221 SYMBOL_TYPE_ENTRY, 222 SYMBOL_TYPE_MILLICODE, 223 SYMBOL_TYPE_PLABEL, 224 SYMBOL_TYPE_PRI_PROG, 225 SYMBOL_TYPE_SEC_PROG, 226 } 227 pa_symbol_type; 228 229 /* This structure contains information needed to assemble 230 individual instructions. */ 231 struct pa_it 232 { 233 /* Holds the opcode after parsing by pa_ip. */ 234 unsigned long opcode; 235 236 /* Holds an expression associated with the current instruction. */ 237 expressionS exp; 238 239 /* Does this instruction use PC-relative addressing. */ 240 int pcrel; 241 242 /* Floating point formats for operand1 and operand2. */ 243 fp_operand_format fpof1; 244 fp_operand_format fpof2; 245 246 /* Whether or not we saw a truncation request on an fcnv insn. */ 247 int trunc; 248 249 /* Holds the field selector for this instruction 250 (for example L%, LR%, etc). */ 251 long field_selector; 252 253 /* Holds any argument relocation bits associated with this 254 instruction. (instruction should be some sort of call). */ 255 unsigned int arg_reloc; 256 257 /* The format specification for this instruction. */ 258 int format; 259 260 /* The relocation (if any) associated with this instruction. */ 261 reloc_type reloc; 262 }; 263 264 /* PA-89 floating point registers are arranged like this: 265 266 +--------------+--------------+ 267 | 0 or 16L | 16 or 16R | 268 +--------------+--------------+ 269 | 1 or 17L | 17 or 17R | 270 +--------------+--------------+ 271 | | | 272 273 . . . 274 . . . 275 . . . 276 277 | | | 278 +--------------+--------------+ 279 | 14 or 30L | 30 or 30R | 280 +--------------+--------------+ 281 | 15 or 31L | 31 or 31R | 282 +--------------+--------------+ */ 283 284 /* Additional information needed to build argument relocation stubs. */ 285 struct call_desc 286 { 287 /* The argument relocation specification. */ 288 unsigned int arg_reloc; 289 290 /* Number of arguments. */ 291 unsigned int arg_count; 292 }; 293 294 #ifdef OBJ_SOM 295 /* This structure defines an entry in the subspace dictionary 296 chain. */ 297 298 struct subspace_dictionary_chain 299 { 300 /* Nonzero if this space has been defined by the user code. */ 301 unsigned int ssd_defined; 302 303 /* Name of this subspace. */ 304 char *ssd_name; 305 306 /* GAS segment and subsegment associated with this subspace. */ 307 asection *ssd_seg; 308 int ssd_subseg; 309 310 /* Next space in the subspace dictionary chain. */ 311 struct subspace_dictionary_chain *ssd_next; 312 }; 313 314 typedef struct subspace_dictionary_chain ssd_chain_struct; 315 316 /* This structure defines an entry in the subspace dictionary 317 chain. */ 318 319 struct space_dictionary_chain 320 { 321 /* Nonzero if this space has been defined by the user code or 322 as a default space. */ 323 unsigned int sd_defined; 324 325 /* Nonzero if this spaces has been defined by the user code. */ 326 unsigned int sd_user_defined; 327 328 /* The space number (or index). */ 329 unsigned int sd_spnum; 330 331 /* The name of this subspace. */ 332 char *sd_name; 333 334 /* GAS segment to which this subspace corresponds. */ 335 asection *sd_seg; 336 337 /* Current subsegment number being used. */ 338 int sd_last_subseg; 339 340 /* The chain of subspaces contained within this space. */ 341 ssd_chain_struct *sd_subspaces; 342 343 /* The next entry in the space dictionary chain. */ 344 struct space_dictionary_chain *sd_next; 345 }; 346 347 typedef struct space_dictionary_chain sd_chain_struct; 348 349 /* This structure defines attributes of the default subspace 350 dictionary entries. */ 351 352 struct default_subspace_dict 353 { 354 /* Name of the subspace. */ 355 char *name; 356 357 /* FIXME. Is this still needed? */ 358 char defined; 359 360 /* Nonzero if this subspace is loadable. */ 361 char loadable; 362 363 /* Nonzero if this subspace contains only code. */ 364 char code_only; 365 366 /* Nonzero if this is a common subspace. */ 367 char common; 368 369 /* Nonzero if this is a common subspace which allows symbols 370 to be multiply defined. */ 371 char dup_common; 372 373 /* Nonzero if this subspace should be zero filled. */ 374 char zero; 375 376 /* Sort key for this subspace. */ 377 unsigned char sort; 378 379 /* Access control bits for this subspace. Can represent RWX access 380 as well as privilege level changes for gateways. */ 381 int access; 382 383 /* Index of containing space. */ 384 int space_index; 385 386 /* Alignment (in bytes) of this subspace. */ 387 int alignment; 388 389 /* Quadrant within space where this subspace should be loaded. */ 390 int quadrant; 391 392 /* An index into the default spaces array. */ 393 int def_space_index; 394 395 /* Subsegment associated with this subspace. */ 396 subsegT subsegment; 397 }; 398 399 /* This structure defines attributes of the default space 400 dictionary entries. */ 401 402 struct default_space_dict 403 { 404 /* Name of the space. */ 405 char *name; 406 407 /* Space number. It is possible to identify spaces within 408 assembly code numerically! */ 409 int spnum; 410 411 /* Nonzero if this space is loadable. */ 412 char loadable; 413 414 /* Nonzero if this space is "defined". FIXME is still needed */ 415 char defined; 416 417 /* Nonzero if this space can not be shared. */ 418 char private; 419 420 /* Sort key for this space. */ 421 unsigned char sort; 422 423 /* Segment associated with this space. */ 424 asection *segment; 425 }; 426 #endif 427 428 /* Structure for previous label tracking. Needed so that alignments, 429 callinfo declarations, etc can be easily attached to a particular 430 label. */ 431 typedef struct label_symbol_struct 432 { 433 struct symbol *lss_label; 434 #ifdef OBJ_SOM 435 sd_chain_struct *lss_space; 436 #endif 437 #ifdef OBJ_ELF 438 segT lss_segment; 439 #endif 440 struct label_symbol_struct *lss_next; 441 } 442 label_symbol_struct; 443 444 /* Extra information needed to perform fixups (relocations) on the PA. */ 445 struct hppa_fix_struct 446 { 447 /* The field selector. */ 448 enum hppa_reloc_field_selector_type_alt fx_r_field; 449 450 /* Type of fixup. */ 451 int fx_r_type; 452 453 /* Format of fixup. */ 454 int fx_r_format; 455 456 /* Argument relocation bits. */ 457 unsigned int fx_arg_reloc; 458 459 /* The segment this fixup appears in. */ 460 segT segment; 461 }; 462 463 /* Structure to hold information about predefined registers. */ 464 465 struct pd_reg 466 { 467 char *name; 468 int value; 469 }; 470 471 /* This structure defines the mapping from a FP condition string 472 to a condition number which can be recorded in an instruction. */ 473 struct fp_cond_map 474 { 475 char *string; 476 int cond; 477 }; 478 479 /* This structure defines a mapping from a field selector 480 string to a field selector type. */ 481 struct selector_entry 482 { 483 char *prefix; 484 int field_selector; 485 }; 486 487 /* Prototypes for functions local to tc-hppa.c. */ 488 489 #ifdef OBJ_SOM 490 static void pa_check_current_space_and_subspace PARAMS ((void)); 491 #endif 492 493 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD))) 494 static void pa_text PARAMS ((int)); 495 static void pa_data PARAMS ((int)); 496 static void pa_comm PARAMS ((int)); 497 #endif 498 static fp_operand_format pa_parse_fp_format PARAMS ((char **s)); 499 static void pa_cons PARAMS ((int)); 500 static void pa_float_cons PARAMS ((int)); 501 static void pa_fill PARAMS ((int)); 502 static void pa_lcomm PARAMS ((int)); 503 static void pa_lsym PARAMS ((int)); 504 static void pa_stringer PARAMS ((int)); 505 static void pa_version PARAMS ((int)); 506 static int pa_parse_fp_cmp_cond PARAMS ((char **)); 507 static int get_expression PARAMS ((char *)); 508 static int pa_get_absolute_expression PARAMS ((struct pa_it *, char **)); 509 static int evaluate_absolute PARAMS ((struct pa_it *)); 510 static unsigned int pa_build_arg_reloc PARAMS ((char *)); 511 static unsigned int pa_align_arg_reloc PARAMS ((unsigned int, unsigned int)); 512 static int pa_parse_nullif PARAMS ((char **)); 513 static int pa_parse_nonneg_cmpsub_cmpltr PARAMS ((char **)); 514 static int pa_parse_neg_cmpsub_cmpltr PARAMS ((char **)); 515 static int pa_parse_neg_add_cmpltr PARAMS ((char **)); 516 static int pa_parse_nonneg_add_cmpltr PARAMS ((char **)); 517 static int pa_parse_cmpb_64_cmpltr PARAMS ((char **)); 518 static int pa_parse_cmpib_64_cmpltr PARAMS ((char **)); 519 static int pa_parse_addb_64_cmpltr PARAMS ((char **)); 520 static void pa_block PARAMS ((int)); 521 static void pa_brtab PARAMS ((int)); 522 static void pa_try PARAMS ((int)); 523 static void pa_call PARAMS ((int)); 524 static void pa_call_args PARAMS ((struct call_desc *)); 525 static void pa_callinfo PARAMS ((int)); 526 static void pa_copyright PARAMS ((int)); 527 static void pa_end PARAMS ((int)); 528 static void pa_enter PARAMS ((int)); 529 static void pa_entry PARAMS ((int)); 530 static void pa_equ PARAMS ((int)); 531 static void pa_exit PARAMS ((int)); 532 static void pa_export PARAMS ((int)); 533 static void pa_type_args PARAMS ((symbolS *, int)); 534 static void pa_import PARAMS ((int)); 535 static void pa_label PARAMS ((int)); 536 static void pa_leave PARAMS ((int)); 537 static void pa_level PARAMS ((int)); 538 static void pa_origin PARAMS ((int)); 539 static void pa_proc PARAMS ((int)); 540 static void pa_procend PARAMS ((int)); 541 static void pa_param PARAMS ((int)); 542 static void pa_undefine_label PARAMS ((void)); 543 static int need_pa11_opcode PARAMS ((void)); 544 static int pa_parse_number PARAMS ((char **, int)); 545 static label_symbol_struct *pa_get_label PARAMS ((void)); 546 #ifdef OBJ_SOM 547 static int log2 PARAMS ((int)); 548 static void pa_compiler PARAMS ((int)); 549 static void pa_align PARAMS ((int)); 550 static void pa_space PARAMS ((int)); 551 static void pa_spnum PARAMS ((int)); 552 static void pa_subspace PARAMS ((int)); 553 static sd_chain_struct *create_new_space PARAMS ((char *, int, int, 554 int, int, int, 555 asection *, int)); 556 static ssd_chain_struct *create_new_subspace PARAMS ((sd_chain_struct *, 557 char *, int, int, 558 int, int, int, 559 int, int, int, int, 560 int, asection *)); 561 static ssd_chain_struct *update_subspace PARAMS ((sd_chain_struct *, 562 char *, int, int, int, 563 int, int, int, int, 564 int, int, int, 565 asection *)); 566 static sd_chain_struct *is_defined_space PARAMS ((char *)); 567 static ssd_chain_struct *is_defined_subspace PARAMS ((char *)); 568 static sd_chain_struct *pa_segment_to_space PARAMS ((asection *)); 569 static ssd_chain_struct *pa_subsegment_to_subspace PARAMS ((asection *, 570 subsegT)); 571 static sd_chain_struct *pa_find_space_by_number PARAMS ((int)); 572 static unsigned int pa_subspace_start PARAMS ((sd_chain_struct *, int)); 573 static sd_chain_struct *pa_parse_space_stmt PARAMS ((char *, int)); 574 static int pa_next_subseg PARAMS ((sd_chain_struct *)); 575 static void pa_spaces_begin PARAMS ((void)); 576 #endif 577 static void pa_ip PARAMS ((char *)); 578 static void fix_new_hppa PARAMS ((fragS *, int, int, symbolS *, 579 offsetT, expressionS *, int, 580 bfd_reloc_code_real_type, 581 enum hppa_reloc_field_selector_type_alt, 582 int, unsigned int, int)); 583 static int is_end_of_statement PARAMS ((void)); 584 static int reg_name_search PARAMS ((char *)); 585 static int pa_chk_field_selector PARAMS ((char **)); 586 static int is_same_frag PARAMS ((fragS *, fragS *)); 587 static void process_exit PARAMS ((void)); 588 static unsigned int pa_stringer_aux PARAMS ((char *)); 589 static fp_operand_format pa_parse_fp_cnv_format PARAMS ((char **s)); 590 static int pa_parse_ftest_gfx_completer PARAMS ((char **)); 591 592 #ifdef OBJ_ELF 593 static void hppa_elf_mark_end_of_function PARAMS ((void)); 594 static void pa_build_unwind_subspace PARAMS ((struct call_info *)); 595 static void pa_vtable_entry PARAMS ((int)); 596 static void pa_vtable_inherit PARAMS ((int)); 597 #endif 598 599 /* File and globally scoped variable declarations. */ 600 601 #ifdef OBJ_SOM 602 /* Root and final entry in the space chain. */ 603 static sd_chain_struct *space_dict_root; 604 static sd_chain_struct *space_dict_last; 605 606 /* The current space and subspace. */ 607 static sd_chain_struct *current_space; 608 static ssd_chain_struct *current_subspace; 609 #endif 610 611 /* Root of the call_info chain. */ 612 static struct call_info *call_info_root; 613 614 /* The last call_info (for functions) structure 615 seen so it can be associated with fixups and 616 function labels. */ 617 static struct call_info *last_call_info; 618 619 /* The last call description (for actual calls). */ 620 static struct call_desc last_call_desc; 621 622 /* handle of the OPCODE hash table */ 623 static struct hash_control *op_hash = NULL; 624 625 /* These characters can be suffixes of opcode names and they may be 626 followed by meaningful whitespace. We don't include `,' and `!' 627 as they never appear followed by meaningful whitespace. */ 628 const char hppa_symbol_chars[] = "*?=<>"; 629 630 /* Table of pseudo ops for the PA. FIXME -- how many of these 631 are now redundant with the overall GAS and the object file 632 dependent tables? */ 633 const pseudo_typeS md_pseudo_table[] = 634 { 635 /* align pseudo-ops on the PA specify the actual alignment requested, 636 not the log2 of the requested alignment. */ 637 #ifdef OBJ_SOM 638 {"align", pa_align, 8}, 639 #endif 640 #ifdef OBJ_ELF 641 {"align", s_align_bytes, 8}, 642 #endif 643 {"begin_brtab", pa_brtab, 1}, 644 {"begin_try", pa_try, 1}, 645 {"block", pa_block, 1}, 646 {"blockz", pa_block, 0}, 647 {"byte", pa_cons, 1}, 648 {"call", pa_call, 0}, 649 {"callinfo", pa_callinfo, 0}, 650 #if defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)) 651 {"code", obj_elf_text, 0}, 652 #else 653 {"code", pa_text, 0}, 654 {"comm", pa_comm, 0}, 655 #endif 656 #ifdef OBJ_SOM 657 {"compiler", pa_compiler, 0}, 658 #endif 659 {"copyright", pa_copyright, 0}, 660 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD))) 661 {"data", pa_data, 0}, 662 #endif 663 {"double", pa_float_cons, 'd'}, 664 {"dword", pa_cons, 8}, 665 {"end", pa_end, 0}, 666 {"end_brtab", pa_brtab, 0}, 667 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD))) 668 {"end_try", pa_try, 0}, 669 #endif 670 {"enter", pa_enter, 0}, 671 {"entry", pa_entry, 0}, 672 {"equ", pa_equ, 0}, 673 {"exit", pa_exit, 0}, 674 {"export", pa_export, 0}, 675 {"fill", pa_fill, 0}, 676 {"float", pa_float_cons, 'f'}, 677 {"half", pa_cons, 2}, 678 {"import", pa_import, 0}, 679 {"int", pa_cons, 4}, 680 {"label", pa_label, 0}, 681 {"lcomm", pa_lcomm, 0}, 682 {"leave", pa_leave, 0}, 683 {"level", pa_level, 0}, 684 {"long", pa_cons, 4}, 685 {"lsym", pa_lsym, 0}, 686 #ifdef OBJ_SOM 687 {"nsubspa", pa_subspace, 1}, 688 #endif 689 {"octa", pa_cons, 16}, 690 {"org", pa_origin, 0}, 691 {"origin", pa_origin, 0}, 692 {"param", pa_param, 0}, 693 {"proc", pa_proc, 0}, 694 {"procend", pa_procend, 0}, 695 {"quad", pa_cons, 8}, 696 {"reg", pa_equ, 1}, 697 {"short", pa_cons, 2}, 698 {"single", pa_float_cons, 'f'}, 699 #ifdef OBJ_SOM 700 {"space", pa_space, 0}, 701 {"spnum", pa_spnum, 0}, 702 #endif 703 {"string", pa_stringer, 0}, 704 {"stringz", pa_stringer, 1}, 705 #ifdef OBJ_SOM 706 {"subspa", pa_subspace, 0}, 707 #endif 708 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD))) 709 {"text", pa_text, 0}, 710 #endif 711 {"version", pa_version, 0}, 712 #ifdef OBJ_ELF 713 {"vtable_entry", pa_vtable_entry, 0}, 714 {"vtable_inherit", pa_vtable_inherit, 0}, 715 #endif 716 {"word", pa_cons, 4}, 717 {NULL, 0, 0} 718 }; 719 720 /* This array holds the chars that only start a comment at the beginning of 721 a line. If the line seems to have the form '# 123 filename' 722 .line and .file directives will appear in the pre-processed output. 723 724 Note that input_file.c hand checks for '#' at the beginning of the 725 first line of the input file. This is because the compiler outputs 726 #NO_APP at the beginning of its output. 727 728 Also note that C style comments will always work. */ 729 const char line_comment_chars[] = "#"; 730 731 /* This array holds the chars that always start a comment. If the 732 pre-processor is disabled, these aren't very useful. */ 733 const char comment_chars[] = ";"; 734 735 /* This array holds the characters which act as line separators. */ 736 const char line_separator_chars[] = "!"; 737 738 /* Chars that can be used to separate mant from exp in floating point nums. */ 739 const char EXP_CHARS[] = "eE"; 740 741 /* Chars that mean this number is a floating point constant. 742 As in 0f12.456 or 0d1.2345e12. 743 744 Be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be 745 changed in read.c. Ideally it shouldn't hae to know abou it at 746 all, but nothing is ideal around here. */ 747 const char FLT_CHARS[] = "rRsSfFdDxXpP"; 748 749 static struct pa_it the_insn; 750 751 /* Points to the end of an expression just parsed by get_expression 752 and friends. FIXME. This shouldn't be handled with a file-global 753 variable. */ 754 static char *expr_end; 755 756 /* Nonzero if a .callinfo appeared within the current procedure. */ 757 static int callinfo_found; 758 759 /* Nonzero if the assembler is currently within a .entry/.exit pair. */ 760 static int within_entry_exit; 761 762 /* Nonzero if the assembler is currently within a procedure definition. */ 763 static int within_procedure; 764 765 /* Handle on structure which keep track of the last symbol 766 seen in each subspace. */ 767 static label_symbol_struct *label_symbols_rootp = NULL; 768 769 /* Holds the last field selector. */ 770 static int hppa_field_selector; 771 772 /* Nonzero when strict syntax checking is enabled. Zero otherwise. 773 774 Each opcode in the table has a flag which indicates whether or not 775 strict syntax checking should be enabled for that instruction. */ 776 static int strict = 0; 777 778 /* pa_parse_number returns values in `pa_number'. Mostly 779 pa_parse_number is used to return a register number, with floating 780 point registers being numbered from FP_REG_BASE upwards. 781 The bit specified with FP_REG_RSEL is set if the floating point 782 register has a `r' suffix. */ 783 #define FP_REG_BASE 64 784 #define FP_REG_RSEL 128 785 static int pa_number; 786 787 #ifdef OBJ_SOM 788 /* A dummy bfd symbol so that all relocations have symbols of some kind. */ 789 static symbolS *dummy_symbol; 790 #endif 791 792 /* Nonzero if errors are to be printed. */ 793 static int print_errors = 1; 794 795 /* List of registers that are pre-defined: 796 797 Each general register has one predefined name of the form 798 %r<REGNUM> which has the value <REGNUM>. 799 800 Space and control registers are handled in a similar manner, 801 but use %sr<REGNUM> and %cr<REGNUM> as their predefined names. 802 803 Likewise for the floating point registers, but of the form 804 %fr<REGNUM>. Floating point registers have additional predefined 805 names with 'L' and 'R' suffixes (e.g. %fr19L, %fr19R) which 806 again have the value <REGNUM>. 807 808 Many registers also have synonyms: 809 810 %r26 - %r23 have %arg0 - %arg3 as synonyms 811 %r28 - %r29 have %ret0 - %ret1 as synonyms 812 %r30 has %sp as a synonym 813 %r27 has %dp as a synonym 814 %r2 has %rp as a synonym 815 816 Almost every control register has a synonym; they are not listed 817 here for brevity. 818 819 The table is sorted. Suitable for searching by a binary search. */ 820 821 static const struct pd_reg pre_defined_registers[] = 822 { 823 {"%arg0", 26}, 824 {"%arg1", 25}, 825 {"%arg2", 24}, 826 {"%arg3", 23}, 827 {"%cr0", 0}, 828 {"%cr10", 10}, 829 {"%cr11", 11}, 830 {"%cr12", 12}, 831 {"%cr13", 13}, 832 {"%cr14", 14}, 833 {"%cr15", 15}, 834 {"%cr16", 16}, 835 {"%cr17", 17}, 836 {"%cr18", 18}, 837 {"%cr19", 19}, 838 {"%cr20", 20}, 839 {"%cr21", 21}, 840 {"%cr22", 22}, 841 {"%cr23", 23}, 842 {"%cr24", 24}, 843 {"%cr25", 25}, 844 {"%cr26", 26}, 845 {"%cr27", 27}, 846 {"%cr28", 28}, 847 {"%cr29", 29}, 848 {"%cr30", 30}, 849 {"%cr31", 31}, 850 {"%cr8", 8}, 851 {"%cr9", 9}, 852 {"%dp", 27}, 853 {"%eiem", 15}, 854 {"%eirr", 23}, 855 {"%farg0", 5}, 856 {"%farg1", 6}, 857 {"%farg2", 7}, 858 {"%farg3", 8}, 859 {"%fr0", 0 + FP_REG_BASE}, 860 {"%fr0l", 0 + FP_REG_BASE}, 861 {"%fr0r", 0 + FP_REG_BASE + FP_REG_RSEL}, 862 {"%fr1", 1 + FP_REG_BASE}, 863 {"%fr10", 10 + FP_REG_BASE}, 864 {"%fr10l", 10 + FP_REG_BASE}, 865 {"%fr10r", 10 + FP_REG_BASE + FP_REG_RSEL}, 866 {"%fr11", 11 + FP_REG_BASE}, 867 {"%fr11l", 11 + FP_REG_BASE}, 868 {"%fr11r", 11 + FP_REG_BASE + FP_REG_RSEL}, 869 {"%fr12", 12 + FP_REG_BASE}, 870 {"%fr12l", 12 + FP_REG_BASE}, 871 {"%fr12r", 12 + FP_REG_BASE + FP_REG_RSEL}, 872 {"%fr13", 13 + FP_REG_BASE}, 873 {"%fr13l", 13 + FP_REG_BASE}, 874 {"%fr13r", 13 + FP_REG_BASE + FP_REG_RSEL}, 875 {"%fr14", 14 + FP_REG_BASE}, 876 {"%fr14l", 14 + FP_REG_BASE}, 877 {"%fr14r", 14 + FP_REG_BASE + FP_REG_RSEL}, 878 {"%fr15", 15 + FP_REG_BASE}, 879 {"%fr15l", 15 + FP_REG_BASE}, 880 {"%fr15r", 15 + FP_REG_BASE + FP_REG_RSEL}, 881 {"%fr16", 16 + FP_REG_BASE}, 882 {"%fr16l", 16 + FP_REG_BASE}, 883 {"%fr16r", 16 + FP_REG_BASE + FP_REG_RSEL}, 884 {"%fr17", 17 + FP_REG_BASE}, 885 {"%fr17l", 17 + FP_REG_BASE}, 886 {"%fr17r", 17 + FP_REG_BASE + FP_REG_RSEL}, 887 {"%fr18", 18 + FP_REG_BASE}, 888 {"%fr18l", 18 + FP_REG_BASE}, 889 {"%fr18r", 18 + FP_REG_BASE + FP_REG_RSEL}, 890 {"%fr19", 19 + FP_REG_BASE}, 891 {"%fr19l", 19 + FP_REG_BASE}, 892 {"%fr19r", 19 + FP_REG_BASE + FP_REG_RSEL}, 893 {"%fr1l", 1 + FP_REG_BASE}, 894 {"%fr1r", 1 + FP_REG_BASE + FP_REG_RSEL}, 895 {"%fr2", 2 + FP_REG_BASE}, 896 {"%fr20", 20 + FP_REG_BASE}, 897 {"%fr20l", 20 + FP_REG_BASE}, 898 {"%fr20r", 20 + FP_REG_BASE + FP_REG_RSEL}, 899 {"%fr21", 21 + FP_REG_BASE}, 900 {"%fr21l", 21 + FP_REG_BASE}, 901 {"%fr21r", 21 + FP_REG_BASE + FP_REG_RSEL}, 902 {"%fr22", 22 + FP_REG_BASE}, 903 {"%fr22l", 22 + FP_REG_BASE}, 904 {"%fr22r", 22 + FP_REG_BASE + FP_REG_RSEL}, 905 {"%fr23", 23 + FP_REG_BASE}, 906 {"%fr23l", 23 + FP_REG_BASE}, 907 {"%fr23r", 23 + FP_REG_BASE + FP_REG_RSEL}, 908 {"%fr24", 24 + FP_REG_BASE}, 909 {"%fr24l", 24 + FP_REG_BASE}, 910 {"%fr24r", 24 + FP_REG_BASE + FP_REG_RSEL}, 911 {"%fr25", 25 + FP_REG_BASE}, 912 {"%fr25l", 25 + FP_REG_BASE}, 913 {"%fr25r", 25 + FP_REG_BASE + FP_REG_RSEL}, 914 {"%fr26", 26 + FP_REG_BASE}, 915 {"%fr26l", 26 + FP_REG_BASE}, 916 {"%fr26r", 26 + FP_REG_BASE + FP_REG_RSEL}, 917 {"%fr27", 27 + FP_REG_BASE}, 918 {"%fr27l", 27 + FP_REG_BASE}, 919 {"%fr27r", 27 + FP_REG_BASE + FP_REG_RSEL}, 920 {"%fr28", 28 + FP_REG_BASE}, 921 {"%fr28l", 28 + FP_REG_BASE}, 922 {"%fr28r", 28 + FP_REG_BASE + FP_REG_RSEL}, 923 {"%fr29", 29 + FP_REG_BASE}, 924 {"%fr29l", 29 + FP_REG_BASE}, 925 {"%fr29r", 29 + FP_REG_BASE + FP_REG_RSEL}, 926 {"%fr2l", 2 + FP_REG_BASE}, 927 {"%fr2r", 2 + FP_REG_BASE + FP_REG_RSEL}, 928 {"%fr3", 3 + FP_REG_BASE}, 929 {"%fr30", 30 + FP_REG_BASE}, 930 {"%fr30l", 30 + FP_REG_BASE}, 931 {"%fr30r", 30 + FP_REG_BASE + FP_REG_RSEL}, 932 {"%fr31", 31 + FP_REG_BASE}, 933 {"%fr31l", 31 + FP_REG_BASE}, 934 {"%fr31r", 31 + FP_REG_BASE + FP_REG_RSEL}, 935 {"%fr3l", 3 + FP_REG_BASE}, 936 {"%fr3r", 3 + FP_REG_BASE + FP_REG_RSEL}, 937 {"%fr4", 4 + FP_REG_BASE}, 938 {"%fr4l", 4 + FP_REG_BASE}, 939 {"%fr4r", 4 + FP_REG_BASE + FP_REG_RSEL}, 940 {"%fr5", 5 + FP_REG_BASE}, 941 {"%fr5l", 5 + FP_REG_BASE}, 942 {"%fr5r", 5 + FP_REG_BASE + FP_REG_RSEL}, 943 {"%fr6", 6 + FP_REG_BASE}, 944 {"%fr6l", 6 + FP_REG_BASE}, 945 {"%fr6r", 6 + FP_REG_BASE + FP_REG_RSEL}, 946 {"%fr7", 7 + FP_REG_BASE}, 947 {"%fr7l", 7 + FP_REG_BASE}, 948 {"%fr7r", 7 + FP_REG_BASE + FP_REG_RSEL}, 949 {"%fr8", 8 + FP_REG_BASE}, 950 {"%fr8l", 8 + FP_REG_BASE}, 951 {"%fr8r", 8 + FP_REG_BASE + FP_REG_RSEL}, 952 {"%fr9", 9 + FP_REG_BASE}, 953 {"%fr9l", 9 + FP_REG_BASE}, 954 {"%fr9r", 9 + FP_REG_BASE + FP_REG_RSEL}, 955 {"%fret", 4}, 956 {"%hta", 25}, 957 {"%iir", 19}, 958 {"%ior", 21}, 959 {"%ipsw", 22}, 960 {"%isr", 20}, 961 {"%itmr", 16}, 962 {"%iva", 14}, 963 #if TARGET_ARCH_SIZE == 64 964 {"%mrp", 2}, 965 #else 966 {"%mrp", 31}, 967 #endif 968 {"%pcoq", 18}, 969 {"%pcsq", 17}, 970 {"%pidr1", 8}, 971 {"%pidr2", 9}, 972 {"%pidr3", 12}, 973 {"%pidr4", 13}, 974 {"%ppda", 24}, 975 {"%r0", 0}, 976 {"%r1", 1}, 977 {"%r10", 10}, 978 {"%r11", 11}, 979 {"%r12", 12}, 980 {"%r13", 13}, 981 {"%r14", 14}, 982 {"%r15", 15}, 983 {"%r16", 16}, 984 {"%r17", 17}, 985 {"%r18", 18}, 986 {"%r19", 19}, 987 {"%r2", 2}, 988 {"%r20", 20}, 989 {"%r21", 21}, 990 {"%r22", 22}, 991 {"%r23", 23}, 992 {"%r24", 24}, 993 {"%r25", 25}, 994 {"%r26", 26}, 995 {"%r27", 27}, 996 {"%r28", 28}, 997 {"%r29", 29}, 998 {"%r3", 3}, 999 {"%r30", 30}, 1000 {"%r31", 31}, 1001 {"%r4", 4}, 1002 {"%r5", 5}, 1003 {"%r6", 6}, 1004 {"%r7", 7}, 1005 {"%r8", 8}, 1006 {"%r9", 9}, 1007 {"%rctr", 0}, 1008 {"%ret0", 28}, 1009 {"%ret1", 29}, 1010 {"%rp", 2}, 1011 {"%sar", 11}, 1012 {"%sp", 30}, 1013 {"%sr0", 0}, 1014 {"%sr1", 1}, 1015 {"%sr2", 2}, 1016 {"%sr3", 3}, 1017 {"%sr4", 4}, 1018 {"%sr5", 5}, 1019 {"%sr6", 6}, 1020 {"%sr7", 7}, 1021 {"%t1", 22}, 1022 {"%t2", 21}, 1023 {"%t3", 20}, 1024 {"%t4", 19}, 1025 {"%tf1", 11}, 1026 {"%tf2", 10}, 1027 {"%tf3", 9}, 1028 {"%tf4", 8}, 1029 {"%tr0", 24}, 1030 {"%tr1", 25}, 1031 {"%tr2", 26}, 1032 {"%tr3", 27}, 1033 {"%tr4", 28}, 1034 {"%tr5", 29}, 1035 {"%tr6", 30}, 1036 {"%tr7", 31} 1037 }; 1038 1039 /* This table is sorted by order of the length of the string. This is 1040 so we check for <> before we check for <. If we had a <> and checked 1041 for < first, we would get a false match. */ 1042 static const struct fp_cond_map fp_cond_map[] = 1043 { 1044 {"false?", 0}, 1045 {"false", 1}, 1046 {"true?", 30}, 1047 {"true", 31}, 1048 {"!<=>", 3}, 1049 {"!?>=", 8}, 1050 {"!?<=", 16}, 1051 {"!<>", 7}, 1052 {"!>=", 11}, 1053 {"!?>", 12}, 1054 {"?<=", 14}, 1055 {"!<=", 19}, 1056 {"!?<", 20}, 1057 {"?>=", 22}, 1058 {"!?=", 24}, 1059 {"!=t", 27}, 1060 {"<=>", 29}, 1061 {"=t", 5}, 1062 {"?=", 6}, 1063 {"?<", 10}, 1064 {"<=", 13}, 1065 {"!>", 15}, 1066 {"?>", 18}, 1067 {">=", 21}, 1068 {"!<", 23}, 1069 {"<>", 25}, 1070 {"!=", 26}, 1071 {"!?", 28}, 1072 {"?", 2}, 1073 {"=", 4}, 1074 {"<", 9}, 1075 {">", 17} 1076 }; 1077 1078 static const struct selector_entry selector_table[] = 1079 { 1080 {"f", e_fsel}, 1081 {"l", e_lsel}, 1082 {"ld", e_ldsel}, 1083 {"lp", e_lpsel}, 1084 {"lr", e_lrsel}, 1085 {"ls", e_lssel}, 1086 {"lt", e_ltsel}, 1087 {"ltp", e_ltpsel}, 1088 {"n", e_nsel}, 1089 {"nl", e_nlsel}, 1090 {"nlr", e_nlrsel}, 1091 {"p", e_psel}, 1092 {"r", e_rsel}, 1093 {"rd", e_rdsel}, 1094 {"rp", e_rpsel}, 1095 {"rr", e_rrsel}, 1096 {"rs", e_rssel}, 1097 {"rt", e_rtsel}, 1098 {"rtp", e_rtpsel}, 1099 {"t", e_tsel}, 1100 }; 1101 1102 #ifdef OBJ_SOM 1103 /* default space and subspace dictionaries */ 1104 1105 #define GDB_SYMBOLS GDB_SYMBOLS_SUBSPACE_NAME 1106 #define GDB_STRINGS GDB_STRINGS_SUBSPACE_NAME 1107 1108 /* pre-defined subsegments (subspaces) for the HPPA. */ 1109 #define SUBSEG_CODE 0 1110 #define SUBSEG_LIT 1 1111 #define SUBSEG_MILLI 2 1112 #define SUBSEG_DATA 0 1113 #define SUBSEG_BSS 2 1114 #define SUBSEG_UNWIND 3 1115 #define SUBSEG_GDB_STRINGS 0 1116 #define SUBSEG_GDB_SYMBOLS 1 1117 1118 static struct default_subspace_dict pa_def_subspaces[] = 1119 { 1120 {"$CODE$", 1, 1, 1, 0, 0, 0, 24, 0x2c, 0, 8, 0, 0, SUBSEG_CODE}, 1121 {"$DATA$", 1, 1, 0, 0, 0, 0, 24, 0x1f, 1, 8, 1, 1, SUBSEG_DATA}, 1122 {"$LIT$", 1, 1, 0, 0, 0, 0, 16, 0x2c, 0, 8, 0, 0, SUBSEG_LIT}, 1123 {"$MILLICODE$", 1, 1, 0, 0, 0, 0, 8, 0x2c, 0, 8, 0, 0, SUBSEG_MILLI}, 1124 {"$BSS$", 1, 1, 0, 0, 0, 1, 80, 0x1f, 1, 8, 1, 1, SUBSEG_BSS}, 1125 {NULL, 0, 1, 0, 0, 0, 0, 255, 0x1f, 0, 4, 0, 0, 0} 1126 }; 1127 1128 static struct default_space_dict pa_def_spaces[] = 1129 { 1130 {"$TEXT$", 0, 1, 1, 0, 8, ASEC_NULL}, 1131 {"$PRIVATE$", 1, 1, 1, 1, 16, ASEC_NULL}, 1132 {NULL, 0, 0, 0, 0, 0, ASEC_NULL} 1133 }; 1134 1135 /* Misc local definitions used by the assembler. */ 1136 1137 /* These macros are used to maintain spaces/subspaces. */ 1138 #define SPACE_DEFINED(space_chain) (space_chain)->sd_defined 1139 #define SPACE_USER_DEFINED(space_chain) (space_chain)->sd_user_defined 1140 #define SPACE_SPNUM(space_chain) (space_chain)->sd_spnum 1141 #define SPACE_NAME(space_chain) (space_chain)->sd_name 1142 1143 #define SUBSPACE_DEFINED(ss_chain) (ss_chain)->ssd_defined 1144 #define SUBSPACE_NAME(ss_chain) (ss_chain)->ssd_name 1145 #endif 1146 1147 /* Return nonzero if the string pointed to by S potentially represents 1148 a right or left half of a FP register */ 1149 #define IS_R_SELECT(S) (*(S) == 'R' || *(S) == 'r') 1150 #define IS_L_SELECT(S) (*(S) == 'L' || *(S) == 'l') 1151 1152 /* Insert FIELD into OPCODE starting at bit START. Continue pa_ip 1153 main loop after insertion. */ 1154 1155 #define INSERT_FIELD_AND_CONTINUE(OPCODE, FIELD, START) \ 1156 { \ 1157 ((OPCODE) |= (FIELD) << (START)); \ 1158 continue; \ 1159 } 1160 1161 /* Simple range checking for FIELD against HIGH and LOW bounds. 1162 IGNORE is used to suppress the error message. */ 1163 1164 #define CHECK_FIELD(FIELD, HIGH, LOW, IGNORE) \ 1165 { \ 1166 if ((FIELD) > (HIGH) || (FIELD) < (LOW)) \ 1167 { \ 1168 if (! IGNORE) \ 1169 as_bad (_("Field out of range [%d..%d] (%d)."), (LOW), (HIGH), \ 1170 (int) (FIELD));\ 1171 break; \ 1172 } \ 1173 } 1174 1175 /* Variant of CHECK_FIELD for use in md_apply_fix3 and other places where 1176 the current file and line number are not valid. */ 1177 1178 #define CHECK_FIELD_WHERE(FIELD, HIGH, LOW, FILENAME, LINE) \ 1179 { \ 1180 if ((FIELD) > (HIGH) || (FIELD) < (LOW)) \ 1181 { \ 1182 as_bad_where ((FILENAME), (LINE), \ 1183 _("Field out of range [%d..%d] (%d)."), (LOW), (HIGH), \ 1184 (int) (FIELD));\ 1185 break; \ 1186 } \ 1187 } 1188 1189 /* Simple alignment checking for FIELD against ALIGN (a power of two). 1190 IGNORE is used to suppress the error message. */ 1191 1192 #define CHECK_ALIGN(FIELD, ALIGN, IGNORE) \ 1193 { \ 1194 if ((FIELD) & ((ALIGN) - 1)) \ 1195 { \ 1196 if (! IGNORE) \ 1197 as_bad (_("Field not properly aligned [%d] (%d)."), (ALIGN), \ 1198 (int) (FIELD));\ 1199 break; \ 1200 } \ 1201 } 1202 1203 #define is_DP_relative(exp) \ 1204 ((exp).X_op == O_subtract \ 1205 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$global$") == 0) 1206 1207 #define is_PC_relative(exp) \ 1208 ((exp).X_op == O_subtract \ 1209 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$PIC_pcrel$0") == 0) 1210 1211 /* We need some complex handling for stabs (sym1 - sym2). Luckily, we'll 1212 always be able to reduce the expression to a constant, so we don't 1213 need real complex handling yet. */ 1214 #define is_complex(exp) \ 1215 ((exp).X_op != O_constant && (exp).X_op != O_symbol) 1216 1217 /* Actual functions to implement the PA specific code for the assembler. */ 1218 1219 /* Called before writing the object file. Make sure entry/exit and 1220 proc/procend pairs match. */ 1221 1222 void 1223 pa_check_eof () 1224 { 1225 if (within_entry_exit) 1226 as_fatal (_("Missing .exit\n")); 1227 1228 if (within_procedure) 1229 as_fatal (_("Missing .procend\n")); 1230 } 1231 1232 /* Returns a pointer to the label_symbol_struct for the current space. 1233 or NULL if no label_symbol_struct exists for the current space. */ 1234 1235 static label_symbol_struct * 1236 pa_get_label () 1237 { 1238 label_symbol_struct *label_chain; 1239 1240 for (label_chain = label_symbols_rootp; 1241 label_chain; 1242 label_chain = label_chain->lss_next) 1243 { 1244 #ifdef OBJ_SOM 1245 if (current_space == label_chain->lss_space && label_chain->lss_label) 1246 return label_chain; 1247 #endif 1248 #ifdef OBJ_ELF 1249 if (now_seg == label_chain->lss_segment && label_chain->lss_label) 1250 return label_chain; 1251 #endif 1252 } 1253 1254 return NULL; 1255 } 1256 1257 /* Defines a label for the current space. If one is already defined, 1258 this function will replace it with the new label. */ 1259 1260 void 1261 pa_define_label (symbol) 1262 symbolS *symbol; 1263 { 1264 label_symbol_struct *label_chain = pa_get_label (); 1265 1266 if (label_chain) 1267 label_chain->lss_label = symbol; 1268 else 1269 { 1270 /* Create a new label entry and add it to the head of the chain. */ 1271 label_chain 1272 = (label_symbol_struct *) xmalloc (sizeof (label_symbol_struct)); 1273 label_chain->lss_label = symbol; 1274 #ifdef OBJ_SOM 1275 label_chain->lss_space = current_space; 1276 #endif 1277 #ifdef OBJ_ELF 1278 label_chain->lss_segment = now_seg; 1279 #endif 1280 label_chain->lss_next = NULL; 1281 1282 if (label_symbols_rootp) 1283 label_chain->lss_next = label_symbols_rootp; 1284 1285 label_symbols_rootp = label_chain; 1286 } 1287 } 1288 1289 /* Removes a label definition for the current space. 1290 If there is no label_symbol_struct entry, then no action is taken. */ 1291 1292 static void 1293 pa_undefine_label () 1294 { 1295 label_symbol_struct *label_chain; 1296 label_symbol_struct *prev_label_chain = NULL; 1297 1298 for (label_chain = label_symbols_rootp; 1299 label_chain; 1300 label_chain = label_chain->lss_next) 1301 { 1302 if (1 1303 #ifdef OBJ_SOM 1304 && current_space == label_chain->lss_space && label_chain->lss_label 1305 #endif 1306 #ifdef OBJ_ELF 1307 && now_seg == label_chain->lss_segment && label_chain->lss_label 1308 #endif 1309 ) 1310 { 1311 /* Remove the label from the chain and free its memory. */ 1312 if (prev_label_chain) 1313 prev_label_chain->lss_next = label_chain->lss_next; 1314 else 1315 label_symbols_rootp = label_chain->lss_next; 1316 1317 free (label_chain); 1318 break; 1319 } 1320 prev_label_chain = label_chain; 1321 } 1322 } 1323 1324 /* An HPPA-specific version of fix_new. This is required because the HPPA 1325 code needs to keep track of some extra stuff. Each call to fix_new_hppa 1326 results in the creation of an instance of an hppa_fix_struct. An 1327 hppa_fix_struct stores the extra information along with a pointer to the 1328 original fixS. This is attached to the original fixup via the 1329 tc_fix_data field. */ 1330 1331 static void 1332 fix_new_hppa (frag, where, size, add_symbol, offset, exp, pcrel, 1333 r_type, r_field, r_format, arg_reloc, unwind_bits) 1334 fragS *frag; 1335 int where; 1336 int size; 1337 symbolS *add_symbol; 1338 offsetT offset; 1339 expressionS *exp; 1340 int pcrel; 1341 bfd_reloc_code_real_type r_type; 1342 enum hppa_reloc_field_selector_type_alt r_field; 1343 int r_format; 1344 unsigned int arg_reloc; 1345 int unwind_bits ATTRIBUTE_UNUSED; 1346 { 1347 fixS *new_fix; 1348 1349 struct hppa_fix_struct *hppa_fix = (struct hppa_fix_struct *) 1350 obstack_alloc (¬es, sizeof (struct hppa_fix_struct)); 1351 1352 if (exp != NULL) 1353 new_fix = fix_new_exp (frag, where, size, exp, pcrel, r_type); 1354 else 1355 new_fix = fix_new (frag, where, size, add_symbol, offset, pcrel, r_type); 1356 new_fix->tc_fix_data = (void *) hppa_fix; 1357 hppa_fix->fx_r_type = r_type; 1358 hppa_fix->fx_r_field = r_field; 1359 hppa_fix->fx_r_format = r_format; 1360 hppa_fix->fx_arg_reloc = arg_reloc; 1361 hppa_fix->segment = now_seg; 1362 #ifdef OBJ_SOM 1363 if (r_type == R_ENTRY || r_type == R_EXIT) 1364 new_fix->fx_offset = unwind_bits; 1365 #endif 1366 1367 /* foo-$global$ is used to access non-automatic storage. $global$ 1368 is really just a marker and has served its purpose, so eliminate 1369 it now so as not to confuse write.c. Ditto for $PIC_pcrel$0. */ 1370 if (new_fix->fx_subsy 1371 && (strcmp (S_GET_NAME (new_fix->fx_subsy), "$global$") == 0 1372 || strcmp (S_GET_NAME (new_fix->fx_subsy), "$PIC_pcrel$0") == 0)) 1373 new_fix->fx_subsy = NULL; 1374 } 1375 1376 /* Parse a .byte, .word, .long expression for the HPPA. Called by 1377 cons via the TC_PARSE_CONS_EXPRESSION macro. */ 1378 1379 void 1380 parse_cons_expression_hppa (exp) 1381 expressionS *exp; 1382 { 1383 hppa_field_selector = pa_chk_field_selector (&input_line_pointer); 1384 expression (exp); 1385 } 1386 1387 /* This fix_new is called by cons via TC_CONS_FIX_NEW. 1388 hppa_field_selector is set by the parse_cons_expression_hppa. */ 1389 1390 void 1391 cons_fix_new_hppa (frag, where, size, exp) 1392 fragS *frag; 1393 int where; 1394 int size; 1395 expressionS *exp; 1396 { 1397 unsigned int rel_type; 1398 1399 /* Get a base relocation type. */ 1400 if (is_DP_relative (*exp)) 1401 rel_type = R_HPPA_GOTOFF; 1402 else if (is_PC_relative (*exp)) 1403 rel_type = R_HPPA_PCREL_CALL; 1404 else if (is_complex (*exp)) 1405 rel_type = R_HPPA_COMPLEX; 1406 else 1407 rel_type = R_HPPA; 1408 1409 if (hppa_field_selector != e_psel && hppa_field_selector != e_fsel) 1410 { 1411 as_warn (_("Invalid field selector. Assuming F%%.")); 1412 hppa_field_selector = e_fsel; 1413 } 1414 1415 fix_new_hppa (frag, where, size, 1416 (symbolS *) NULL, (offsetT) 0, exp, 0, rel_type, 1417 hppa_field_selector, size * 8, 0, 0); 1418 1419 /* Reset field selector to its default state. */ 1420 hppa_field_selector = 0; 1421 } 1422 1423 /* This function is called once, at assembler startup time. It should 1424 set up all the tables, etc. that the MD part of the assembler will need. */ 1425 1426 void 1427 md_begin () 1428 { 1429 const char *retval = NULL; 1430 int lose = 0; 1431 unsigned int i = 0; 1432 1433 last_call_info = NULL; 1434 call_info_root = NULL; 1435 1436 /* Set the default machine type. */ 1437 if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, DEFAULT_LEVEL)) 1438 as_warn (_("could not set architecture and machine")); 1439 1440 /* Folding of text and data segments fails miserably on the PA. 1441 Warn user and disable "-R" option. */ 1442 if (flag_readonly_data_in_text) 1443 { 1444 as_warn (_("-R option not supported on this target.")); 1445 flag_readonly_data_in_text = 0; 1446 } 1447 1448 #ifdef OBJ_SOM 1449 pa_spaces_begin (); 1450 #endif 1451 1452 op_hash = hash_new (); 1453 1454 while (i < NUMOPCODES) 1455 { 1456 const char *name = pa_opcodes[i].name; 1457 retval = hash_insert (op_hash, name, (struct pa_opcode *) &pa_opcodes[i]); 1458 if (retval != NULL && *retval != '\0') 1459 { 1460 as_fatal (_("Internal error: can't hash `%s': %s\n"), name, retval); 1461 lose = 1; 1462 } 1463 do 1464 { 1465 if ((pa_opcodes[i].match & pa_opcodes[i].mask) 1466 != pa_opcodes[i].match) 1467 { 1468 fprintf (stderr, _("internal error: losing opcode: `%s' \"%s\"\n"), 1469 pa_opcodes[i].name, pa_opcodes[i].args); 1470 lose = 1; 1471 } 1472 ++i; 1473 } 1474 while (i < NUMOPCODES && !strcmp (pa_opcodes[i].name, name)); 1475 } 1476 1477 if (lose) 1478 as_fatal (_("Broken assembler. No assembly attempted.")); 1479 1480 #ifdef OBJ_SOM 1481 /* SOM will change text_section. To make sure we never put 1482 anything into the old one switch to the new one now. */ 1483 subseg_set (text_section, 0); 1484 #endif 1485 1486 #ifdef OBJ_SOM 1487 dummy_symbol = symbol_find_or_make ("L$dummy"); 1488 S_SET_SEGMENT (dummy_symbol, text_section); 1489 /* Force the symbol to be converted to a real symbol. */ 1490 (void) symbol_get_bfdsym (dummy_symbol); 1491 #endif 1492 } 1493 1494 /* Assemble a single instruction storing it into a frag. */ 1495 void 1496 md_assemble (str) 1497 char *str; 1498 { 1499 char *to; 1500 1501 /* The had better be something to assemble. */ 1502 assert (str); 1503 1504 /* If we are within a procedure definition, make sure we've 1505 defined a label for the procedure; handle case where the 1506 label was defined after the .PROC directive. 1507 1508 Note there's not need to diddle with the segment or fragment 1509 for the label symbol in this case. We have already switched 1510 into the new $CODE$ subspace at this point. */ 1511 if (within_procedure && last_call_info->start_symbol == NULL) 1512 { 1513 label_symbol_struct *label_symbol = pa_get_label (); 1514 1515 if (label_symbol) 1516 { 1517 if (label_symbol->lss_label) 1518 { 1519 last_call_info->start_symbol = label_symbol->lss_label; 1520 symbol_get_bfdsym (label_symbol->lss_label)->flags 1521 |= BSF_FUNCTION; 1522 #ifdef OBJ_SOM 1523 /* Also handle allocation of a fixup to hold the unwind 1524 information when the label appears after the proc/procend. */ 1525 if (within_entry_exit) 1526 { 1527 char *where; 1528 unsigned int u; 1529 1530 where = frag_more (0); 1531 u = UNWIND_LOW32 (&last_call_info->ci_unwind.descriptor); 1532 fix_new_hppa (frag_now, where - frag_now->fr_literal, 0, 1533 NULL, (offsetT) 0, NULL, 1534 0, R_HPPA_ENTRY, e_fsel, 0, 0, u); 1535 } 1536 #endif 1537 } 1538 else 1539 as_bad (_("Missing function name for .PROC (corrupted label chain)")); 1540 } 1541 else 1542 as_bad (_("Missing function name for .PROC")); 1543 } 1544 1545 /* Assemble the instruction. Results are saved into "the_insn". */ 1546 pa_ip (str); 1547 1548 /* Get somewhere to put the assembled instruction. */ 1549 to = frag_more (4); 1550 1551 /* Output the opcode. */ 1552 md_number_to_chars (to, the_insn.opcode, 4); 1553 1554 /* If necessary output more stuff. */ 1555 if (the_insn.reloc != R_HPPA_NONE) 1556 fix_new_hppa (frag_now, (to - frag_now->fr_literal), 4, NULL, 1557 (offsetT) 0, &the_insn.exp, the_insn.pcrel, 1558 the_insn.reloc, the_insn.field_selector, 1559 the_insn.format, the_insn.arg_reloc, 0); 1560 1561 #ifdef OBJ_ELF 1562 dwarf2_emit_insn (4); 1563 #endif 1564 } 1565 1566 /* Do the real work for assembling a single instruction. Store results 1567 into the global "the_insn" variable. */ 1568 1569 static void 1570 pa_ip (str) 1571 char *str; 1572 { 1573 char *error_message = ""; 1574 char *s, c, *argstart, *name, *save_s; 1575 const char *args; 1576 int match = FALSE; 1577 int comma = 0; 1578 int cmpltr, nullif, flag, cond, num; 1579 unsigned long opcode; 1580 struct pa_opcode *insn; 1581 1582 #ifdef OBJ_SOM 1583 /* We must have a valid space and subspace. */ 1584 pa_check_current_space_and_subspace (); 1585 #endif 1586 1587 /* Convert everything up to the first whitespace character into lower 1588 case. */ 1589 for (s = str; *s != ' ' && *s != '\t' && *s != '\n' && *s != '\0'; s++) 1590 *s = TOLOWER (*s); 1591 1592 /* Skip to something interesting. */ 1593 for (s = str; 1594 ISUPPER (*s) || ISLOWER (*s) || (*s >= '0' && *s <= '3'); 1595 ++s) 1596 ; 1597 1598 switch (*s) 1599 { 1600 1601 case '\0': 1602 break; 1603 1604 case ',': 1605 comma = 1; 1606 1607 /*FALLTHROUGH */ 1608 1609 case ' ': 1610 *s++ = '\0'; 1611 break; 1612 1613 default: 1614 as_fatal (_("Unknown opcode: `%s'"), str); 1615 } 1616 1617 /* Look up the opcode in the has table. */ 1618 if ((insn = (struct pa_opcode *) hash_find (op_hash, str)) == NULL) 1619 { 1620 as_bad ("Unknown opcode: `%s'", str); 1621 return; 1622 } 1623 1624 if (comma) 1625 { 1626 *--s = ','; 1627 } 1628 1629 /* Mark the location where arguments for the instruction start, then 1630 start processing them. */ 1631 argstart = s; 1632 for (;;) 1633 { 1634 /* Do some initialization. */ 1635 opcode = insn->match; 1636 strict = (insn->flags & FLAG_STRICT); 1637 memset (&the_insn, 0, sizeof (the_insn)); 1638 1639 the_insn.reloc = R_HPPA_NONE; 1640 1641 /* If this instruction is specific to a particular architecture, 1642 then set a new architecture. */ 1643 /* But do not automatically promote to pa2.0. The automatic promotion 1644 crud is for compatibility with HP's old assemblers only. */ 1645 if (insn->arch < 20 1646 && bfd_get_mach (stdoutput) < insn->arch) 1647 { 1648 if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, insn->arch)) 1649 as_warn (_("could not update architecture and machine")); 1650 } 1651 else if (bfd_get_mach (stdoutput) < insn->arch) 1652 { 1653 match = FALSE; 1654 goto failed; 1655 } 1656 1657 /* Build the opcode, checking as we go to make 1658 sure that the operands match. */ 1659 for (args = insn->args;; ++args) 1660 { 1661 /* Absorb white space in instruction. */ 1662 while (*s == ' ' || *s == '\t') 1663 s++; 1664 1665 switch (*args) 1666 { 1667 1668 /* End of arguments. */ 1669 case '\0': 1670 if (*s == '\0') 1671 match = TRUE; 1672 break; 1673 1674 case '+': 1675 if (*s == '+') 1676 { 1677 ++s; 1678 continue; 1679 } 1680 if (*s == '-') 1681 continue; 1682 break; 1683 1684 /* These must match exactly. */ 1685 case '(': 1686 case ')': 1687 case ',': 1688 case ' ': 1689 if (*s++ == *args) 1690 continue; 1691 break; 1692 1693 /* Handle a 5 bit register or control register field at 10. */ 1694 case 'b': 1695 case '^': 1696 if (!pa_parse_number (&s, 0)) 1697 break; 1698 num = pa_number; 1699 CHECK_FIELD (num, 31, 0, 0); 1700 INSERT_FIELD_AND_CONTINUE (opcode, num, 21); 1701 1702 /* Handle %sar or %cr11. No bits get set, we just verify that it 1703 is there. */ 1704 case '!': 1705 /* Skip whitespace before register. */ 1706 while (*s == ' ' || *s == '\t') 1707 s = s + 1; 1708 1709 if (!strncasecmp (s, "%sar", 4)) 1710 { 1711 s += 4; 1712 continue; 1713 } 1714 else if (!strncasecmp (s, "%cr11", 5)) 1715 { 1716 s += 5; 1717 continue; 1718 } 1719 break; 1720 1721 /* Handle a 5 bit register field at 15. */ 1722 case 'x': 1723 if (!pa_parse_number (&s, 0)) 1724 break; 1725 num = pa_number; 1726 CHECK_FIELD (num, 31, 0, 0); 1727 INSERT_FIELD_AND_CONTINUE (opcode, num, 16); 1728 1729 /* Handle a 5 bit register field at 31. */ 1730 case 't': 1731 if (!pa_parse_number (&s, 0)) 1732 break; 1733 num = pa_number; 1734 CHECK_FIELD (num, 31, 0, 0); 1735 INSERT_FIELD_AND_CONTINUE (opcode, num, 0); 1736 1737 /* Handle a 5 bit register field at 10 and 15. */ 1738 case 'a': 1739 if (!pa_parse_number (&s, 0)) 1740 break; 1741 num = pa_number; 1742 CHECK_FIELD (num, 31, 0, 0); 1743 opcode |= num << 16; 1744 INSERT_FIELD_AND_CONTINUE (opcode, num, 21); 1745 1746 /* Handle a 5 bit field length at 31. */ 1747 case 'T': 1748 num = pa_get_absolute_expression (&the_insn, &s); 1749 if (strict && the_insn.exp.X_op != O_constant) 1750 break; 1751 s = expr_end; 1752 CHECK_FIELD (num, 32, 1, 0); 1753 INSERT_FIELD_AND_CONTINUE (opcode, 32 - num, 0); 1754 1755 /* Handle a 5 bit immediate at 15. */ 1756 case '5': 1757 num = pa_get_absolute_expression (&the_insn, &s); 1758 if (strict && the_insn.exp.X_op != O_constant) 1759 break; 1760 s = expr_end; 1761 /* When in strict mode, we want to just reject this 1762 match instead of giving an out of range error. */ 1763 CHECK_FIELD (num, 15, -16, strict); 1764 num = low_sign_unext (num, 5); 1765 INSERT_FIELD_AND_CONTINUE (opcode, num, 16); 1766 1767 /* Handle a 5 bit immediate at 31. */ 1768 case 'V': 1769 num = pa_get_absolute_expression (&the_insn, &s); 1770 if (strict && the_insn.exp.X_op != O_constant) 1771 break; 1772 s = expr_end; 1773 /* When in strict mode, we want to just reject this 1774 match instead of giving an out of range error. */ 1775 CHECK_FIELD (num, 15, -16, strict); 1776 num = low_sign_unext (num, 5); 1777 INSERT_FIELD_AND_CONTINUE (opcode, num, 0); 1778 1779 /* Handle an unsigned 5 bit immediate at 31. */ 1780 case 'r': 1781 num = pa_get_absolute_expression (&the_insn, &s); 1782 if (strict && the_insn.exp.X_op != O_constant) 1783 break; 1784 s = expr_end; 1785 CHECK_FIELD (num, 31, 0, strict); 1786 INSERT_FIELD_AND_CONTINUE (opcode, num, 0); 1787 1788 /* Handle an unsigned 5 bit immediate at 15. */ 1789 case 'R': 1790 num = pa_get_absolute_expression (&the_insn, &s); 1791 if (strict && the_insn.exp.X_op != O_constant) 1792 break; 1793 s = expr_end; 1794 CHECK_FIELD (num, 31, 0, strict); 1795 INSERT_FIELD_AND_CONTINUE (opcode, num, 16); 1796 1797 /* Handle an unsigned 10 bit immediate at 15. */ 1798 case 'U': 1799 num = pa_get_absolute_expression (&the_insn, &s); 1800 if (strict && the_insn.exp.X_op != O_constant) 1801 break; 1802 s = expr_end; 1803 CHECK_FIELD (num, 1023, 0, strict); 1804 INSERT_FIELD_AND_CONTINUE (opcode, num, 16); 1805 1806 /* Handle a 2 bit space identifier at 17. */ 1807 case 's': 1808 if (!pa_parse_number (&s, 0)) 1809 break; 1810 num = pa_number; 1811 CHECK_FIELD (num, 3, 0, 1); 1812 INSERT_FIELD_AND_CONTINUE (opcode, num, 14); 1813 1814 /* Handle a 3 bit space identifier at 18. */ 1815 case 'S': 1816 if (!pa_parse_number (&s, 0)) 1817 break; 1818 num = pa_number; 1819 CHECK_FIELD (num, 7, 0, 1); 1820 opcode |= re_assemble_3 (num); 1821 continue; 1822 1823 /* Handle all completers. */ 1824 case 'c': 1825 switch (*++args) 1826 { 1827 1828 /* Handle a completer for an indexing load or store. */ 1829 case 'X': 1830 case 'x': 1831 { 1832 int uu = 0; 1833 int m = 0; 1834 int i = 0; 1835 while (*s == ',' && i < 2) 1836 { 1837 s++; 1838 if (strncasecmp (s, "sm", 2) == 0) 1839 { 1840 uu = 1; 1841 m = 1; 1842 s++; 1843 i++; 1844 } 1845 else if (strncasecmp (s, "m", 1) == 0) 1846 m = 1; 1847 else if ((strncasecmp (s, "s ", 2) == 0) 1848 || (strncasecmp (s, "s,", 2) == 0)) 1849 uu = 1; 1850 /* When in strict mode this is a match failure. */ 1851 else if (strict) 1852 { 1853 s--; 1854 break; 1855 } 1856 else 1857 as_bad (_("Invalid Indexed Load Completer.")); 1858 s++; 1859 i++; 1860 } 1861 if (i > 2) 1862 as_bad (_("Invalid Indexed Load Completer Syntax.")); 1863 opcode |= m << 5; 1864 INSERT_FIELD_AND_CONTINUE (opcode, uu, 13); 1865 } 1866 1867 /* Handle a short load/store completer. */ 1868 case 'M': 1869 case 'm': 1870 case 'q': 1871 case 'J': 1872 case 'e': 1873 { 1874 int a = 0; 1875 int m = 0; 1876 if (*s == ',') 1877 { 1878 int found = 0; 1879 s++; 1880 if (strncasecmp (s, "ma", 2) == 0) 1881 { 1882 a = 0; 1883 m = 1; 1884 found = 1; 1885 } 1886 else if (strncasecmp (s, "mb", 2) == 0) 1887 { 1888 a = 1; 1889 m = 1; 1890 found = 1; 1891 } 1892 1893 /* When in strict mode, pass through for cache op. */ 1894 if (!found && strict) 1895 s--; 1896 else 1897 { 1898 if (!found) 1899 as_bad (_("Invalid Short Load/Store Completer.")); 1900 s += 2; 1901 } 1902 } 1903 /* If we did not get a ma/mb completer, then we do not 1904 consider this a positive match for 'ce'. */ 1905 else if (*args == 'e') 1906 break; 1907 1908 /* 'J', 'm', 'M' and 'q' are the same, except for where they 1909 encode the before/after field. */ 1910 if (*args == 'm' || *args == 'M') 1911 { 1912 opcode |= m << 5; 1913 INSERT_FIELD_AND_CONTINUE (opcode, a, 13); 1914 } 1915 else if (*args == 'q') 1916 { 1917 opcode |= m << 3; 1918 INSERT_FIELD_AND_CONTINUE (opcode, a, 2); 1919 } 1920 else if (*args == 'J') 1921 { 1922 /* M bit is explicit in the major opcode. */ 1923 INSERT_FIELD_AND_CONTINUE (opcode, a, 2); 1924 } 1925 else if (*args == 'e') 1926 { 1927 /* Stash the ma/mb flag temporarily in the 1928 instruction. We will use (and remove it) 1929 later when handling 'J', 'K', '<' & '>'. */ 1930 opcode |= a; 1931 continue; 1932 } 1933 } 1934 1935 /* Handle a stbys completer. */ 1936 case 'A': 1937 case 's': 1938 { 1939 int a = 0; 1940 int m = 0; 1941 int i = 0; 1942 while (*s == ',' && i < 2) 1943 { 1944 s++; 1945 if (strncasecmp (s, "m", 1) == 0) 1946 m = 1; 1947 else if ((strncasecmp (s, "b ", 2) == 0) 1948 || (strncasecmp (s, "b,", 2) == 0)) 1949 a = 0; 1950 else if (strncasecmp (s, "e", 1) == 0) 1951 a = 1; 1952 /* When in strict mode this is a match failure. */ 1953 else if (strict) 1954 { 1955 s--; 1956 break; 1957 } 1958 else 1959 as_bad (_("Invalid Store Bytes Short Completer")); 1960 s++; 1961 i++; 1962 } 1963 if (i > 2) 1964 as_bad (_("Invalid Store Bytes Short Completer")); 1965 opcode |= m << 5; 1966 INSERT_FIELD_AND_CONTINUE (opcode, a, 13); 1967 } 1968 1969 /* Handle load cache hint completer. */ 1970 case 'c': 1971 cmpltr = 0; 1972 if (!strncmp (s, ",sl", 3)) 1973 { 1974 s += 3; 1975 cmpltr = 2; 1976 } 1977 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10); 1978 1979 /* Handle store cache hint completer. */ 1980 case 'C': 1981 cmpltr = 0; 1982 if (!strncmp (s, ",sl", 3)) 1983 { 1984 s += 3; 1985 cmpltr = 2; 1986 } 1987 else if (!strncmp (s, ",bc", 3)) 1988 { 1989 s += 3; 1990 cmpltr = 1; 1991 } 1992 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10); 1993 1994 /* Handle load and clear cache hint completer. */ 1995 case 'd': 1996 cmpltr = 0; 1997 if (!strncmp (s, ",co", 3)) 1998 { 1999 s += 3; 2000 cmpltr = 1; 2001 } 2002 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10); 2003 2004 /* Handle load ordering completer. */ 2005 case 'o': 2006 if (strncmp (s, ",o", 2) != 0) 2007 break; 2008 s += 2; 2009 continue; 2010 2011 /* Handle a branch gate completer. */ 2012 case 'g': 2013 if (strncasecmp (s, ",gate", 5) != 0) 2014 break; 2015 s += 5; 2016 continue; 2017 2018 /* Handle a branch link and push completer. */ 2019 case 'p': 2020 if (strncasecmp (s, ",l,push", 7) != 0) 2021 break; 2022 s += 7; 2023 continue; 2024 2025 /* Handle a branch link completer. */ 2026 case 'l': 2027 if (strncasecmp (s, ",l", 2) != 0) 2028 break; 2029 s += 2; 2030 continue; 2031 2032 /* Handle a branch pop completer. */ 2033 case 'P': 2034 if (strncasecmp (s, ",pop", 4) != 0) 2035 break; 2036 s += 4; 2037 continue; 2038 2039 /* Handle a local processor completer. */ 2040 case 'L': 2041 if (strncasecmp (s, ",l", 2) != 0) 2042 break; 2043 s += 2; 2044 continue; 2045 2046 /* Handle a PROBE read/write completer. */ 2047 case 'w': 2048 flag = 0; 2049 if (!strncasecmp (s, ",w", 2)) 2050 { 2051 flag = 1; 2052 s += 2; 2053 } 2054 else if (!strncasecmp (s, ",r", 2)) 2055 { 2056 flag = 0; 2057 s += 2; 2058 } 2059 2060 INSERT_FIELD_AND_CONTINUE (opcode, flag, 6); 2061 2062 /* Handle MFCTL wide completer. */ 2063 case 'W': 2064 if (strncasecmp (s, ",w", 2) != 0) 2065 break; 2066 s += 2; 2067 continue; 2068 2069 /* Handle an RFI restore completer. */ 2070 case 'r': 2071 flag = 0; 2072 if (!strncasecmp (s, ",r", 2)) 2073 { 2074 flag = 5; 2075 s += 2; 2076 } 2077 2078 INSERT_FIELD_AND_CONTINUE (opcode, flag, 5); 2079 2080 /* Handle a system control completer. */ 2081 case 'Z': 2082 if (*s == ',' && (*(s + 1) == 'm' || *(s + 1) == 'M')) 2083 { 2084 flag = 1; 2085 s += 2; 2086 } 2087 else 2088 flag = 0; 2089 2090 INSERT_FIELD_AND_CONTINUE (opcode, flag, 5); 2091 2092 /* Handle intermediate/final completer for DCOR. */ 2093 case 'i': 2094 flag = 0; 2095 if (!strncasecmp (s, ",i", 2)) 2096 { 2097 flag = 1; 2098 s += 2; 2099 } 2100 2101 INSERT_FIELD_AND_CONTINUE (opcode, flag, 6); 2102 2103 /* Handle zero/sign extension completer. */ 2104 case 'z': 2105 flag = 1; 2106 if (!strncasecmp (s, ",z", 2)) 2107 { 2108 flag = 0; 2109 s += 2; 2110 } 2111 2112 INSERT_FIELD_AND_CONTINUE (opcode, flag, 10); 2113 2114 /* Handle add completer. */ 2115 case 'a': 2116 flag = 1; 2117 if (!strncasecmp (s, ",l", 2)) 2118 { 2119 flag = 2; 2120 s += 2; 2121 } 2122 else if (!strncasecmp (s, ",tsv", 4)) 2123 { 2124 flag = 3; 2125 s += 4; 2126 } 2127 2128 INSERT_FIELD_AND_CONTINUE (opcode, flag, 10); 2129 2130 /* Handle 64 bit carry for ADD. */ 2131 case 'Y': 2132 flag = 0; 2133 if (!strncasecmp (s, ",dc,tsv", 7) || 2134 !strncasecmp (s, ",tsv,dc", 7)) 2135 { 2136 flag = 1; 2137 s += 7; 2138 } 2139 else if (!strncasecmp (s, ",dc", 3)) 2140 { 2141 flag = 0; 2142 s += 3; 2143 } 2144 else 2145 break; 2146 2147 INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); 2148 2149 /* Handle 32 bit carry for ADD. */ 2150 case 'y': 2151 flag = 0; 2152 if (!strncasecmp (s, ",c,tsv", 6) || 2153 !strncasecmp (s, ",tsv,c", 6)) 2154 { 2155 flag = 1; 2156 s += 6; 2157 } 2158 else if (!strncasecmp (s, ",c", 2)) 2159 { 2160 flag = 0; 2161 s += 2; 2162 } 2163 else 2164 break; 2165 2166 INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); 2167 2168 /* Handle trap on signed overflow. */ 2169 case 'v': 2170 flag = 0; 2171 if (!strncasecmp (s, ",tsv", 4)) 2172 { 2173 flag = 1; 2174 s += 4; 2175 } 2176 2177 INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); 2178 2179 /* Handle trap on condition and overflow. */ 2180 case 't': 2181 flag = 0; 2182 if (!strncasecmp (s, ",tc,tsv", 7) || 2183 !strncasecmp (s, ",tsv,tc", 7)) 2184 { 2185 flag = 1; 2186 s += 7; 2187 } 2188 else if (!strncasecmp (s, ",tc", 3)) 2189 { 2190 flag = 0; 2191 s += 3; 2192 } 2193 else 2194 break; 2195 2196 INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); 2197 2198 /* Handle 64 bit borrow for SUB. */ 2199 case 'B': 2200 flag = 0; 2201 if (!strncasecmp (s, ",db,tsv", 7) || 2202 !strncasecmp (s, ",tsv,db", 7)) 2203 { 2204 flag = 1; 2205 s += 7; 2206 } 2207 else if (!strncasecmp (s, ",db", 3)) 2208 { 2209 flag = 0; 2210 s += 3; 2211 } 2212 else 2213 break; 2214 2215 INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); 2216 2217 /* Handle 32 bit borrow for SUB. */ 2218 case 'b': 2219 flag = 0; 2220 if (!strncasecmp (s, ",b,tsv", 6) || 2221 !strncasecmp (s, ",tsv,b", 6)) 2222 { 2223 flag = 1; 2224 s += 6; 2225 } 2226 else if (!strncasecmp (s, ",b", 2)) 2227 { 2228 flag = 0; 2229 s += 2; 2230 } 2231 else 2232 break; 2233 2234 INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); 2235 2236 /* Handle trap condition completer for UADDCM. */ 2237 case 'T': 2238 flag = 0; 2239 if (!strncasecmp (s, ",tc", 3)) 2240 { 2241 flag = 1; 2242 s += 3; 2243 } 2244 2245 INSERT_FIELD_AND_CONTINUE (opcode, flag, 6); 2246 2247 /* Handle signed/unsigned at 21. */ 2248 case 'S': 2249 { 2250 int sign = 1; 2251 if (strncasecmp (s, ",s", 2) == 0) 2252 { 2253 sign = 1; 2254 s += 2; 2255 } 2256 else if (strncasecmp (s, ",u", 2) == 0) 2257 { 2258 sign = 0; 2259 s += 2; 2260 } 2261 2262 INSERT_FIELD_AND_CONTINUE (opcode, sign, 10); 2263 } 2264 2265 /* Handle left/right combination at 17:18. */ 2266 case 'h': 2267 if (*s++ == ',') 2268 { 2269 int lr = 0; 2270 if (*s == 'r') 2271 lr = 2; 2272 else if (*s == 'l') 2273 lr = 0; 2274 else 2275 as_bad (_("Invalid left/right combination completer")); 2276 2277 s++; 2278 INSERT_FIELD_AND_CONTINUE (opcode, lr, 13); 2279 } 2280 else 2281 as_bad (_("Invalid left/right combination completer")); 2282 break; 2283 2284 /* Handle saturation at 24:25. */ 2285 case 'H': 2286 { 2287 int sat = 3; 2288 if (strncasecmp (s, ",ss", 3) == 0) 2289 { 2290 sat = 1; 2291 s += 3; 2292 } 2293 else if (strncasecmp (s, ",us", 3) == 0) 2294 { 2295 sat = 0; 2296 s += 3; 2297 } 2298 2299 INSERT_FIELD_AND_CONTINUE (opcode, sat, 6); 2300 } 2301 2302 /* Handle permutation completer. */ 2303 case '*': 2304 if (*s++ == ',') 2305 { 2306 int permloc[4]; 2307 int perm = 0; 2308 int i = 0; 2309 permloc[0] = 13; 2310 permloc[1] = 10; 2311 permloc[2] = 8; 2312 permloc[3] = 6; 2313 for (; i < 4; i++) 2314 { 2315 switch (*s++) 2316 { 2317 case '0': 2318 perm = 0; 2319 break; 2320 case '1': 2321 perm = 1; 2322 break; 2323 case '2': 2324 perm = 2; 2325 break; 2326 case '3': 2327 perm = 3; 2328 break; 2329 default: 2330 as_bad (_("Invalid permutation completer")); 2331 } 2332 opcode |= perm << permloc[i]; 2333 } 2334 continue; 2335 } 2336 else 2337 as_bad (_("Invalid permutation completer")); 2338 break; 2339 2340 default: 2341 abort (); 2342 } 2343 break; 2344 2345 /* Handle all conditions. */ 2346 case '?': 2347 { 2348 args++; 2349 switch (*args) 2350 { 2351 /* Handle FP compare conditions. */ 2352 case 'f': 2353 cond = pa_parse_fp_cmp_cond (&s); 2354 INSERT_FIELD_AND_CONTINUE (opcode, cond, 0); 2355 2356 /* Handle an add condition. */ 2357 case 'A': 2358 case 'a': 2359 cmpltr = 0; 2360 flag = 0; 2361 if (*s == ',') 2362 { 2363 s++; 2364 2365 /* 64 bit conditions. */ 2366 if (*args == 'A') 2367 { 2368 if (*s == '*') 2369 s++; 2370 else 2371 break; 2372 } 2373 else if (*s == '*') 2374 break; 2375 2376 name = s; 2377 while (*s != ',' && *s != ' ' && *s != '\t') 2378 s += 1; 2379 c = *s; 2380 *s = 0x00; 2381 if (strcmp (name, "=") == 0) 2382 cmpltr = 1; 2383 else if (strcmp (name, "<") == 0) 2384 cmpltr = 2; 2385 else if (strcmp (name, "<=") == 0) 2386 cmpltr = 3; 2387 else if (strcasecmp (name, "nuv") == 0) 2388 cmpltr = 4; 2389 else if (strcasecmp (name, "znv") == 0) 2390 cmpltr = 5; 2391 else if (strcasecmp (name, "sv") == 0) 2392 cmpltr = 6; 2393 else if (strcasecmp (name, "od") == 0) 2394 cmpltr = 7; 2395 else if (strcasecmp (name, "tr") == 0) 2396 { 2397 cmpltr = 0; 2398 flag = 1; 2399 } 2400 else if (strcmp (name, "<>") == 0) 2401 { 2402 cmpltr = 1; 2403 flag = 1; 2404 } 2405 else if (strcmp (name, ">=") == 0) 2406 { 2407 cmpltr = 2; 2408 flag = 1; 2409 } 2410 else if (strcmp (name, ">") == 0) 2411 { 2412 cmpltr = 3; 2413 flag = 1; 2414 } 2415 else if (strcasecmp (name, "uv") == 0) 2416 { 2417 cmpltr = 4; 2418 flag = 1; 2419 } 2420 else if (strcasecmp (name, "vnz") == 0) 2421 { 2422 cmpltr = 5; 2423 flag = 1; 2424 } 2425 else if (strcasecmp (name, "nsv") == 0) 2426 { 2427 cmpltr = 6; 2428 flag = 1; 2429 } 2430 else if (strcasecmp (name, "ev") == 0) 2431 { 2432 cmpltr = 7; 2433 flag = 1; 2434 } 2435 /* ",*" is a valid condition. */ 2436 else if (*args == 'a' || *name) 2437 as_bad (_("Invalid Add Condition: %s"), name); 2438 *s = c; 2439 } 2440 opcode |= cmpltr << 13; 2441 INSERT_FIELD_AND_CONTINUE (opcode, flag, 12); 2442 2443 /* Handle non-negated add and branch condition. */ 2444 case 'd': 2445 cmpltr = pa_parse_nonneg_add_cmpltr (&s); 2446 if (cmpltr < 0) 2447 { 2448 as_bad (_("Invalid Add and Branch Condition")); 2449 cmpltr = 0; 2450 } 2451 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13); 2452 2453 /* Handle 64 bit wide-mode add and branch condition. */ 2454 case 'W': 2455 cmpltr = pa_parse_addb_64_cmpltr (&s); 2456 if (cmpltr < 0) 2457 { 2458 as_bad (_("Invalid Add and Branch Condition")); 2459 cmpltr = 0; 2460 } 2461 else 2462 { 2463 /* Negated condition requires an opcode change. */ 2464 opcode |= (cmpltr & 8) << 24; 2465 } 2466 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr & 7, 13); 2467 2468 /* Handle a negated or non-negated add and branch 2469 condition. */ 2470 case '@': 2471 save_s = s; 2472 cmpltr = pa_parse_nonneg_add_cmpltr (&s); 2473 if (cmpltr < 0) 2474 { 2475 s = save_s; 2476 cmpltr = pa_parse_neg_add_cmpltr (&s); 2477 if (cmpltr < 0) 2478 { 2479 as_bad (_("Invalid Compare/Subtract Condition")); 2480 cmpltr = 0; 2481 } 2482 else 2483 { 2484 /* Negated condition requires an opcode change. */ 2485 opcode |= 1 << 27; 2486 } 2487 } 2488 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13); 2489 2490 /* Handle branch on bit conditions. */ 2491 case 'B': 2492 case 'b': 2493 cmpltr = 0; 2494 if (*s == ',') 2495 { 2496 s++; 2497 2498 if (*args == 'B') 2499 { 2500 if (*s == '*') 2501 s++; 2502 else 2503 break; 2504 } 2505 else if (*s == '*') 2506 break; 2507 2508 if (strncmp (s, "<", 1) == 0) 2509 { 2510 cmpltr = 0; 2511 s++; 2512 } 2513 else if (strncmp (s, ">=", 2) == 0) 2514 { 2515 cmpltr = 1; 2516 s += 2; 2517 } 2518 else 2519 as_bad (_("Invalid Bit Branch Condition: %c"), *s); 2520 } 2521 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 15); 2522 2523 /* Handle a compare/subtract condition. */ 2524 case 'S': 2525 case 's': 2526 cmpltr = 0; 2527 flag = 0; 2528 if (*s == ',') 2529 { 2530 s++; 2531 2532 /* 64 bit conditions. */ 2533 if (*args == 'S') 2534 { 2535 if (*s == '*') 2536 s++; 2537 else 2538 break; 2539 } 2540 else if (*s == '*') 2541 break; 2542 2543 name = s; 2544 while (*s != ',' && *s != ' ' && *s != '\t') 2545 s += 1; 2546 c = *s; 2547 *s = 0x00; 2548 if (strcmp (name, "=") == 0) 2549 cmpltr = 1; 2550 else if (strcmp (name, "<") == 0) 2551 cmpltr = 2; 2552 else if (strcmp (name, "<=") == 0) 2553 cmpltr = 3; 2554 else if (strcasecmp (name, "<<") == 0) 2555 cmpltr = 4; 2556 else if (strcasecmp (name, "<<=") == 0) 2557 cmpltr = 5; 2558 else if (strcasecmp (name, "sv") == 0) 2559 cmpltr = 6; 2560 else if (strcasecmp (name, "od") == 0) 2561 cmpltr = 7; 2562 else if (strcasecmp (name, "tr") == 0) 2563 { 2564 cmpltr = 0; 2565 flag = 1; 2566 } 2567 else if (strcmp (name, "<>") == 0) 2568 { 2569 cmpltr = 1; 2570 flag = 1; 2571 } 2572 else if (strcmp (name, ">=") == 0) 2573 { 2574 cmpltr = 2; 2575 flag = 1; 2576 } 2577 else if (strcmp (name, ">") == 0) 2578 { 2579 cmpltr = 3; 2580 flag = 1; 2581 } 2582 else if (strcasecmp (name, ">>=") == 0) 2583 { 2584 cmpltr = 4; 2585 flag = 1; 2586 } 2587 else if (strcasecmp (name, ">>") == 0) 2588 { 2589 cmpltr = 5; 2590 flag = 1; 2591 } 2592 else if (strcasecmp (name, "nsv") == 0) 2593 { 2594 cmpltr = 6; 2595 flag = 1; 2596 } 2597 else if (strcasecmp (name, "ev") == 0) 2598 { 2599 cmpltr = 7; 2600 flag = 1; 2601 } 2602 /* ",*" is a valid condition. */ 2603 else if (*args != 'S' || *name) 2604 as_bad (_("Invalid Compare/Subtract Condition: %s"), 2605 name); 2606 *s = c; 2607 } 2608 opcode |= cmpltr << 13; 2609 INSERT_FIELD_AND_CONTINUE (opcode, flag, 12); 2610 2611 /* Handle a non-negated compare condition. */ 2612 case 't': 2613 cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s); 2614 if (cmpltr < 0) 2615 { 2616 as_bad (_("Invalid Compare/Subtract Condition")); 2617 cmpltr = 0; 2618 } 2619 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13); 2620 2621 /* Handle a 32 bit compare and branch condition. */ 2622 case 'n': 2623 save_s = s; 2624 cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s); 2625 if (cmpltr < 0) 2626 { 2627 s = save_s; 2628 cmpltr = pa_parse_neg_cmpsub_cmpltr (&s); 2629 if (cmpltr < 0) 2630 { 2631 as_bad (_("Invalid Compare and Branch Condition")); 2632 cmpltr = 0; 2633 } 2634 else 2635 { 2636 /* Negated condition requires an opcode change. */ 2637 opcode |= 1 << 27; 2638 } 2639 } 2640 2641 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13); 2642 2643 /* Handle a 64 bit compare and branch condition. */ 2644 case 'N': 2645 cmpltr = pa_parse_cmpb_64_cmpltr (&s); 2646 if (cmpltr >= 0) 2647 { 2648 /* Negated condition requires an opcode change. */ 2649 opcode |= (cmpltr & 8) << 26; 2650 } 2651 else 2652 /* Not a 64 bit cond. Give 32 bit a chance. */ 2653 break; 2654 2655 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr & 7, 13); 2656 2657 /* Handle a 64 bit cmpib condition. */ 2658 case 'Q': 2659 cmpltr = pa_parse_cmpib_64_cmpltr (&s); 2660 if (cmpltr < 0) 2661 /* Not a 64 bit cond. Give 32 bit a chance. */ 2662 break; 2663 2664 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13); 2665 2666 /* Handle a logical instruction condition. */ 2667 case 'L': 2668 case 'l': 2669 cmpltr = 0; 2670 flag = 0; 2671 if (*s == ',') 2672 { 2673 s++; 2674 2675 /* 64 bit conditions. */ 2676 if (*args == 'L') 2677 { 2678 if (*s == '*') 2679 s++; 2680 else 2681 break; 2682 } 2683 else if (*s == '*') 2684 break; 2685 2686 name = s; 2687 while (*s != ',' && *s != ' ' && *s != '\t') 2688 s += 1; 2689 c = *s; 2690 *s = 0x00; 2691 2692 if (strcmp (name, "=") == 0) 2693 cmpltr = 1; 2694 else if (strcmp (name, "<") == 0) 2695 cmpltr = 2; 2696 else if (strcmp (name, "<=") == 0) 2697 cmpltr = 3; 2698 else if (strcasecmp (name, "od") == 0) 2699 cmpltr = 7; 2700 else if (strcasecmp (name, "tr") == 0) 2701 { 2702 cmpltr = 0; 2703 flag = 1; 2704 } 2705 else if (strcmp (name, "<>") == 0) 2706 { 2707 cmpltr = 1; 2708 flag = 1; 2709 } 2710 else if (strcmp (name, ">=") == 0) 2711 { 2712 cmpltr = 2; 2713 flag = 1; 2714 } 2715 else if (strcmp (name, ">") == 0) 2716 { 2717 cmpltr = 3; 2718 flag = 1; 2719 } 2720 else if (strcasecmp (name, "ev") == 0) 2721 { 2722 cmpltr = 7; 2723 flag = 1; 2724 } 2725 /* ",*" is a valid condition. */ 2726 else if (*args != 'L' || *name) 2727 as_bad (_("Invalid Logical Instruction Condition.")); 2728 *s = c; 2729 } 2730 opcode |= cmpltr << 13; 2731 INSERT_FIELD_AND_CONTINUE (opcode, flag, 12); 2732 2733 /* Handle a shift/extract/deposit condition. */ 2734 case 'X': 2735 case 'x': 2736 case 'y': 2737 cmpltr = 0; 2738 if (*s == ',') 2739 { 2740 save_s = s++; 2741 2742 /* 64 bit conditions. */ 2743 if (*args == 'X') 2744 { 2745 if (*s == '*') 2746 s++; 2747 else 2748 break; 2749 } 2750 else if (*s == '*') 2751 break; 2752 2753 name = s; 2754 while (*s != ',' && *s != ' ' && *s != '\t') 2755 s += 1; 2756 c = *s; 2757 *s = 0x00; 2758 if (strcmp (name, "=") == 0) 2759 cmpltr = 1; 2760 else if (strcmp (name, "<") == 0) 2761 cmpltr = 2; 2762 else if (strcasecmp (name, "od") == 0) 2763 cmpltr = 3; 2764 else if (strcasecmp (name, "tr") == 0) 2765 cmpltr = 4; 2766 else if (strcmp (name, "<>") == 0) 2767 cmpltr = 5; 2768 else if (strcmp (name, ">=") == 0) 2769 cmpltr = 6; 2770 else if (strcasecmp (name, "ev") == 0) 2771 cmpltr = 7; 2772 /* Handle movb,n. Put things back the way they were. 2773 This includes moving s back to where it started. */ 2774 else if (strcasecmp (name, "n") == 0 && *args == 'y') 2775 { 2776 *s = c; 2777 s = save_s; 2778 continue; 2779 } 2780 /* ",*" is a valid condition. */ 2781 else if (*args != 'X' || *name) 2782 as_bad (_("Invalid Shift/Extract/Deposit Condition.")); 2783 *s = c; 2784 } 2785 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13); 2786 2787 /* Handle a unit instruction condition. */ 2788 case 'U': 2789 case 'u': 2790 cmpltr = 0; 2791 flag = 0; 2792 if (*s == ',') 2793 { 2794 s++; 2795 2796 /* 64 bit conditions. */ 2797 if (*args == 'U') 2798 { 2799 if (*s == '*') 2800 s++; 2801 else 2802 break; 2803 } 2804 else if (*s == '*') 2805 break; 2806 2807 if (strncasecmp (s, "sbz", 3) == 0) 2808 { 2809 cmpltr = 2; 2810 s += 3; 2811 } 2812 else if (strncasecmp (s, "shz", 3) == 0) 2813 { 2814 cmpltr = 3; 2815 s += 3; 2816 } 2817 else if (strncasecmp (s, "sdc", 3) == 0) 2818 { 2819 cmpltr = 4; 2820 s += 3; 2821 } 2822 else if (strncasecmp (s, "sbc", 3) == 0) 2823 { 2824 cmpltr = 6; 2825 s += 3; 2826 } 2827 else if (strncasecmp (s, "shc", 3) == 0) 2828 { 2829 cmpltr = 7; 2830 s += 3; 2831 } 2832 else if (strncasecmp (s, "tr", 2) == 0) 2833 { 2834 cmpltr = 0; 2835 flag = 1; 2836 s += 2; 2837 } 2838 else if (strncasecmp (s, "nbz", 3) == 0) 2839 { 2840 cmpltr = 2; 2841 flag = 1; 2842 s += 3; 2843 } 2844 else if (strncasecmp (s, "nhz", 3) == 0) 2845 { 2846 cmpltr = 3; 2847 flag = 1; 2848 s += 3; 2849 } 2850 else if (strncasecmp (s, "ndc", 3) == 0) 2851 { 2852 cmpltr = 4; 2853 flag = 1; 2854 s += 3; 2855 } 2856 else if (strncasecmp (s, "nbc", 3) == 0) 2857 { 2858 cmpltr = 6; 2859 flag = 1; 2860 s += 3; 2861 } 2862 else if (strncasecmp (s, "nhc", 3) == 0) 2863 { 2864 cmpltr = 7; 2865 flag = 1; 2866 s += 3; 2867 } 2868 else if (strncasecmp (s, "swz", 3) == 0) 2869 { 2870 cmpltr = 1; 2871 flag = 0; 2872 s += 3; 2873 } 2874 else if (strncasecmp (s, "swc", 3) == 0) 2875 { 2876 cmpltr = 5; 2877 flag = 0; 2878 s += 3; 2879 } 2880 else if (strncasecmp (s, "nwz", 3) == 0) 2881 { 2882 cmpltr = 1; 2883 flag = 1; 2884 s += 3; 2885 } 2886 else if (strncasecmp (s, "nwc", 3) == 0) 2887 { 2888 cmpltr = 5; 2889 flag = 1; 2890 s += 3; 2891 } 2892 /* ",*" is a valid condition. */ 2893 else if (*args != 'U' || (*s != ' ' && *s != '\t')) 2894 as_bad (_("Invalid Unit Instruction Condition.")); 2895 } 2896 opcode |= cmpltr << 13; 2897 INSERT_FIELD_AND_CONTINUE (opcode, flag, 12); 2898 2899 default: 2900 abort (); 2901 } 2902 break; 2903 } 2904 2905 /* Handle a nullification completer for branch instructions. */ 2906 case 'n': 2907 nullif = pa_parse_nullif (&s); 2908 INSERT_FIELD_AND_CONTINUE (opcode, nullif, 1); 2909 2910 /* Handle a nullification completer for copr and spop insns. */ 2911 case 'N': 2912 nullif = pa_parse_nullif (&s); 2913 INSERT_FIELD_AND_CONTINUE (opcode, nullif, 5); 2914 2915 /* Handle ,%r2 completer for new syntax branches. */ 2916 case 'L': 2917 if (*s == ',' && strncasecmp (s + 1, "%r2", 3) == 0) 2918 s += 4; 2919 else if (*s == ',' && strncasecmp (s + 1, "%rp", 3) == 0) 2920 s += 4; 2921 else 2922 break; 2923 continue; 2924 2925 /* Handle 3 bit entry into the fp compare array. Valid values 2926 are 0..6 inclusive. */ 2927 case 'h': 2928 get_expression (s); 2929 s = expr_end; 2930 if (the_insn.exp.X_op == O_constant) 2931 { 2932 num = evaluate_absolute (&the_insn); 2933 CHECK_FIELD (num, 6, 0, 0); 2934 num++; 2935 INSERT_FIELD_AND_CONTINUE (opcode, num, 13); 2936 } 2937 else 2938 break; 2939 2940 /* Handle 3 bit entry into the fp compare array. Valid values 2941 are 0..6 inclusive. */ 2942 case 'm': 2943 get_expression (s); 2944 if (the_insn.exp.X_op == O_constant) 2945 { 2946 s = expr_end; 2947 num = evaluate_absolute (&the_insn); 2948 CHECK_FIELD (num, 6, 0, 0); 2949 num = (num + 1) ^ 1; 2950 INSERT_FIELD_AND_CONTINUE (opcode, num, 13); 2951 } 2952 else 2953 break; 2954 2955 /* Handle graphics test completers for ftest */ 2956 case '=': 2957 { 2958 num = pa_parse_ftest_gfx_completer (&s); 2959 INSERT_FIELD_AND_CONTINUE (opcode, num, 0); 2960 } 2961 2962 /* Handle a 11 bit immediate at 31. */ 2963 case 'i': 2964 the_insn.field_selector = pa_chk_field_selector (&s); 2965 get_expression (s); 2966 s = expr_end; 2967 if (the_insn.exp.X_op == O_constant) 2968 { 2969 num = evaluate_absolute (&the_insn); 2970 CHECK_FIELD (num, 1023, -1024, 0); 2971 num = low_sign_unext (num, 11); 2972 INSERT_FIELD_AND_CONTINUE (opcode, num, 0); 2973 } 2974 else 2975 { 2976 if (is_DP_relative (the_insn.exp)) 2977 the_insn.reloc = R_HPPA_GOTOFF; 2978 else if (is_PC_relative (the_insn.exp)) 2979 the_insn.reloc = R_HPPA_PCREL_CALL; 2980 else 2981 the_insn.reloc = R_HPPA; 2982 the_insn.format = 11; 2983 continue; 2984 } 2985 2986 /* Handle a 14 bit immediate at 31. */ 2987 case 'J': 2988 the_insn.field_selector = pa_chk_field_selector (&s); 2989 get_expression (s); 2990 s = expr_end; 2991 if (the_insn.exp.X_op == O_constant) 2992 { 2993 int mb; 2994 2995 /* XXX the completer stored away tidbits of information 2996 for us to extract. We need a cleaner way to do this. 2997 Now that we have lots of letters again, it would be 2998 good to rethink this. */ 2999 mb = opcode & 1; 3000 opcode -= mb; 3001 num = evaluate_absolute (&the_insn); 3002 if (mb != (num < 0)) 3003 break; 3004 CHECK_FIELD (num, 8191, -8192, 0); 3005 num = low_sign_unext (num, 14); 3006 INSERT_FIELD_AND_CONTINUE (opcode, num, 0); 3007 } 3008 break; 3009 3010 /* Handle a 14 bit immediate at 31. */ 3011 case 'K': 3012 the_insn.field_selector = pa_chk_field_selector (&s); 3013 get_expression (s); 3014 s = expr_end; 3015 if (the_insn.exp.X_op == O_constant) 3016 { 3017 int mb; 3018 3019 mb = opcode & 1; 3020 opcode -= mb; 3021 num = evaluate_absolute (&the_insn); 3022 if (mb == (num < 0)) 3023 break; 3024 if (num % 4) 3025 break; 3026 CHECK_FIELD (num, 8191, -8192, 0); 3027 num = low_sign_unext (num, 14); 3028 INSERT_FIELD_AND_CONTINUE (opcode, num, 0); 3029 } 3030 break; 3031 3032 /* Handle a 16 bit immediate at 31. */ 3033 case '<': 3034 the_insn.field_selector = pa_chk_field_selector (&s); 3035 get_expression (s); 3036 s = expr_end; 3037 if (the_insn.exp.X_op == O_constant) 3038 { 3039 int mb; 3040 3041 mb = opcode & 1; 3042 opcode -= mb; 3043 num = evaluate_absolute (&the_insn); 3044 if (mb != (num < 0)) 3045 break; 3046 CHECK_FIELD (num, 32767, -32768, 0); 3047 num = re_assemble_16 (num); 3048 INSERT_FIELD_AND_CONTINUE (opcode, num, 0); 3049 } 3050 break; 3051 3052 /* Handle a 16 bit immediate at 31. */ 3053 case '>': 3054 the_insn.field_selector = pa_chk_field_selector (&s); 3055 get_expression (s); 3056 s = expr_end; 3057 if (the_insn.exp.X_op == O_constant) 3058 { 3059 int mb; 3060 3061 mb = opcode & 1; 3062 opcode -= mb; 3063 num = evaluate_absolute (&the_insn); 3064 if (mb == (num < 0)) 3065 break; 3066 if (num % 4) 3067 break; 3068 CHECK_FIELD (num, 32767, -32768, 0); 3069 num = re_assemble_16 (num); 3070 INSERT_FIELD_AND_CONTINUE (opcode, num, 0); 3071 } 3072 break; 3073 3074 /* Handle 14 bit immediate, shifted left three times. */ 3075 case '#': 3076 the_insn.field_selector = pa_chk_field_selector (&s); 3077 get_expression (s); 3078 s = expr_end; 3079 if (the_insn.exp.X_op == O_constant) 3080 { 3081 num = evaluate_absolute (&the_insn); 3082 if (num & 0x7) 3083 break; 3084 CHECK_FIELD (num, 8191, -8192, 0); 3085 if (num < 0) 3086 opcode |= 1; 3087 num &= 0x1fff; 3088 num >>= 3; 3089 INSERT_FIELD_AND_CONTINUE (opcode, num, 4); 3090 } 3091 else 3092 { 3093 if (is_DP_relative (the_insn.exp)) 3094 the_insn.reloc = R_HPPA_GOTOFF; 3095 else if (is_PC_relative (the_insn.exp)) 3096 the_insn.reloc = R_HPPA_PCREL_CALL; 3097 else 3098 the_insn.reloc = R_HPPA; 3099 the_insn.format = 14; 3100 continue; 3101 } 3102 break; 3103 3104 /* Handle 14 bit immediate, shifted left twice. */ 3105 case 'd': 3106 the_insn.field_selector = pa_chk_field_selector (&s); 3107 get_expression (s); 3108 s = expr_end; 3109 if (the_insn.exp.X_op == O_constant) 3110 { 3111 num = evaluate_absolute (&the_insn); 3112 if (num & 0x3) 3113 break; 3114 CHECK_FIELD (num, 8191, -8192, 0); 3115 if (num < 0) 3116 opcode |= 1; 3117 num &= 0x1fff; 3118 num >>= 2; 3119 INSERT_FIELD_AND_CONTINUE (opcode, num, 3); 3120 } 3121 else 3122 { 3123 if (is_DP_relative (the_insn.exp)) 3124 the_insn.reloc = R_HPPA_GOTOFF; 3125 else if (is_PC_relative (the_insn.exp)) 3126 the_insn.reloc = R_HPPA_PCREL_CALL; 3127 else 3128 the_insn.reloc = R_HPPA; 3129 the_insn.format = 14; 3130 continue; 3131 } 3132 3133 /* Handle a 14 bit immediate at 31. */ 3134 case 'j': 3135 the_insn.field_selector = pa_chk_field_selector (&s); 3136 get_expression (s); 3137 s = expr_end; 3138 if (the_insn.exp.X_op == O_constant) 3139 { 3140 num = evaluate_absolute (&the_insn); 3141 CHECK_FIELD (num, 8191, -8192, 0); 3142 num = low_sign_unext (num, 14); 3143 INSERT_FIELD_AND_CONTINUE (opcode, num, 0); 3144 } 3145 else 3146 { 3147 if (is_DP_relative (the_insn.exp)) 3148 the_insn.reloc = R_HPPA_GOTOFF; 3149 else if (is_PC_relative (the_insn.exp)) 3150 the_insn.reloc = R_HPPA_PCREL_CALL; 3151 else 3152 the_insn.reloc = R_HPPA; 3153 the_insn.format = 14; 3154 continue; 3155 } 3156 3157 /* Handle a 21 bit immediate at 31. */ 3158 case 'k': 3159 the_insn.field_selector = pa_chk_field_selector (&s); 3160 get_expression (s); 3161 s = expr_end; 3162 if (the_insn.exp.X_op == O_constant) 3163 { 3164 num = evaluate_absolute (&the_insn); 3165 CHECK_FIELD (num >> 11, 1048575, -1048576, 0); 3166 opcode |= re_assemble_21 (num); 3167 continue; 3168 } 3169 else 3170 { 3171 if (is_DP_relative (the_insn.exp)) 3172 the_insn.reloc = R_HPPA_GOTOFF; 3173 else if (is_PC_relative (the_insn.exp)) 3174 the_insn.reloc = R_HPPA_PCREL_CALL; 3175 else 3176 the_insn.reloc = R_HPPA; 3177 the_insn.format = 21; 3178 continue; 3179 } 3180 3181 /* Handle a 16 bit immediate at 31 (PA 2.0 wide mode only). */ 3182 case 'l': 3183 the_insn.field_selector = pa_chk_field_selector (&s); 3184 get_expression (s); 3185 s = expr_end; 3186 if (the_insn.exp.X_op == O_constant) 3187 { 3188 num = evaluate_absolute (&the_insn); 3189 CHECK_FIELD (num, 32767, -32768, 0); 3190 opcode |= re_assemble_16 (num); 3191 continue; 3192 } 3193 else 3194 { 3195 /* ??? Is this valid for wide mode? */ 3196 if (is_DP_relative (the_insn.exp)) 3197 the_insn.reloc = R_HPPA_GOTOFF; 3198 else if (is_PC_relative (the_insn.exp)) 3199 the_insn.reloc = R_HPPA_PCREL_CALL; 3200 else 3201 the_insn.reloc = R_HPPA; 3202 the_insn.format = 14; 3203 continue; 3204 } 3205 3206 /* Handle a word-aligned 16-bit imm. at 31 (PA2.0 wide). */ 3207 case 'y': 3208 the_insn.field_selector = pa_chk_field_selector (&s); 3209 get_expression (s); 3210 s = expr_end; 3211 if (the_insn.exp.X_op == O_constant) 3212 { 3213 num = evaluate_absolute (&the_insn); 3214 CHECK_FIELD (num, 32767, -32768, 0); 3215 CHECK_ALIGN (num, 4, 0); 3216 opcode |= re_assemble_16 (num); 3217 continue; 3218 } 3219 else 3220 { 3221 /* ??? Is this valid for wide mode? */ 3222 if (is_DP_relative (the_insn.exp)) 3223 the_insn.reloc = R_HPPA_GOTOFF; 3224 else if (is_PC_relative (the_insn.exp)) 3225 the_insn.reloc = R_HPPA_PCREL_CALL; 3226 else 3227 the_insn.reloc = R_HPPA; 3228 the_insn.format = 14; 3229 continue; 3230 } 3231 3232 /* Handle a dword-aligned 16-bit imm. at 31 (PA2.0 wide). */ 3233 case '&': 3234 the_insn.field_selector = pa_chk_field_selector (&s); 3235 get_expression (s); 3236 s = expr_end; 3237 if (the_insn.exp.X_op == O_constant) 3238 { 3239 num = evaluate_absolute (&the_insn); 3240 CHECK_FIELD (num, 32767, -32768, 0); 3241 CHECK_ALIGN (num, 8, 0); 3242 opcode |= re_assemble_16 (num); 3243 continue; 3244 } 3245 else 3246 { 3247 /* ??? Is this valid for wide mode? */ 3248 if (is_DP_relative (the_insn.exp)) 3249 the_insn.reloc = R_HPPA_GOTOFF; 3250 else if (is_PC_relative (the_insn.exp)) 3251 the_insn.reloc = R_HPPA_PCREL_CALL; 3252 else 3253 the_insn.reloc = R_HPPA; 3254 the_insn.format = 14; 3255 continue; 3256 } 3257 3258 /* Handle a 12 bit branch displacement. */ 3259 case 'w': 3260 the_insn.field_selector = pa_chk_field_selector (&s); 3261 get_expression (s); 3262 s = expr_end; 3263 the_insn.pcrel = 1; 3264 if (!the_insn.exp.X_add_symbol 3265 || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol), 3266 FAKE_LABEL_NAME)) 3267 { 3268 num = evaluate_absolute (&the_insn); 3269 if (num % 4) 3270 { 3271 as_bad (_("Branch to unaligned address")); 3272 break; 3273 } 3274 if (the_insn.exp.X_add_symbol) 3275 num -= 8; 3276 CHECK_FIELD (num, 8191, -8192, 0); 3277 opcode |= re_assemble_12 (num >> 2); 3278 continue; 3279 } 3280 else 3281 { 3282 the_insn.reloc = R_HPPA_PCREL_CALL; 3283 the_insn.format = 12; 3284 the_insn.arg_reloc = last_call_desc.arg_reloc; 3285 memset (&last_call_desc, 0, sizeof (struct call_desc)); 3286 s = expr_end; 3287 continue; 3288 } 3289 3290 /* Handle a 17 bit branch displacement. */ 3291 case 'W': 3292 the_insn.field_selector = pa_chk_field_selector (&s); 3293 get_expression (s); 3294 s = expr_end; 3295 the_insn.pcrel = 1; 3296 if (!the_insn.exp.X_add_symbol 3297 || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol), 3298 FAKE_LABEL_NAME)) 3299 { 3300 num = evaluate_absolute (&the_insn); 3301 if (num % 4) 3302 { 3303 as_bad (_("Branch to unaligned address")); 3304 break; 3305 } 3306 if (the_insn.exp.X_add_symbol) 3307 num -= 8; 3308 CHECK_FIELD (num, 262143, -262144, 0); 3309 opcode |= re_assemble_17 (num >> 2); 3310 continue; 3311 } 3312 else 3313 { 3314 the_insn.reloc = R_HPPA_PCREL_CALL; 3315 the_insn.format = 17; 3316 the_insn.arg_reloc = last_call_desc.arg_reloc; 3317 memset (&last_call_desc, 0, sizeof (struct call_desc)); 3318 continue; 3319 } 3320 3321 /* Handle a 22 bit branch displacement. */ 3322 case 'X': 3323 the_insn.field_selector = pa_chk_field_selector (&s); 3324 get_expression (s); 3325 s = expr_end; 3326 the_insn.pcrel = 1; 3327 if (!the_insn.exp.X_add_symbol 3328 || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol), 3329 FAKE_LABEL_NAME)) 3330 { 3331 num = evaluate_absolute (&the_insn); 3332 if (num % 4) 3333 { 3334 as_bad (_("Branch to unaligned address")); 3335 break; 3336 } 3337 if (the_insn.exp.X_add_symbol) 3338 num -= 8; 3339 CHECK_FIELD (num, 8388607, -8388608, 0); 3340 opcode |= re_assemble_22 (num >> 2); 3341 } 3342 else 3343 { 3344 the_insn.reloc = R_HPPA_PCREL_CALL; 3345 the_insn.format = 22; 3346 the_insn.arg_reloc = last_call_desc.arg_reloc; 3347 memset (&last_call_desc, 0, sizeof (struct call_desc)); 3348 continue; 3349 } 3350 3351 /* Handle an absolute 17 bit branch target. */ 3352 case 'z': 3353 the_insn.field_selector = pa_chk_field_selector (&s); 3354 get_expression (s); 3355 s = expr_end; 3356 the_insn.pcrel = 0; 3357 if (!the_insn.exp.X_add_symbol 3358 || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol), 3359 FAKE_LABEL_NAME)) 3360 { 3361 num = evaluate_absolute (&the_insn); 3362 if (num % 4) 3363 { 3364 as_bad (_("Branch to unaligned address")); 3365 break; 3366 } 3367 if (the_insn.exp.X_add_symbol) 3368 num -= 8; 3369 CHECK_FIELD (num, 262143, -262144, 0); 3370 opcode |= re_assemble_17 (num >> 2); 3371 continue; 3372 } 3373 else 3374 { 3375 the_insn.reloc = R_HPPA_ABS_CALL; 3376 the_insn.format = 17; 3377 the_insn.arg_reloc = last_call_desc.arg_reloc; 3378 memset (&last_call_desc, 0, sizeof (struct call_desc)); 3379 continue; 3380 } 3381 3382 /* Handle '%r1' implicit operand of addil instruction. */ 3383 case 'Z': 3384 if (*s == ',' && *(s + 1) == '%' && *(s + 3) == '1' 3385 && (*(s + 2) == 'r' || *(s + 2) == 'R')) 3386 { 3387 s += 4; 3388 continue; 3389 } 3390 else 3391 break; 3392 3393 /* Handle '%sr0,%r31' implicit operand of be,l instruction. */ 3394 case 'Y': 3395 if (strncasecmp (s, "%sr0,%r31", 9) != 0) 3396 break; 3397 s += 9; 3398 continue; 3399 3400 /* Handle immediate value of 0 for ordered load/store instructions. */ 3401 case '@': 3402 if (*s != '0') 3403 break; 3404 s++; 3405 continue; 3406 3407 /* Handle a 2 bit shift count at 25. */ 3408 case '.': 3409 num = pa_get_absolute_expression (&the_insn, &s); 3410 if (strict && the_insn.exp.X_op != O_constant) 3411 break; 3412 s = expr_end; 3413 CHECK_FIELD (num, 3, 1, strict); 3414 INSERT_FIELD_AND_CONTINUE (opcode, num, 6); 3415 3416 /* Handle a 4 bit shift count at 25. */ 3417 case '*': 3418 num = pa_get_absolute_expression (&the_insn, &s); 3419 if (strict && the_insn.exp.X_op != O_constant) 3420 break; 3421 s = expr_end; 3422 CHECK_FIELD (num, 15, 0, strict); 3423 INSERT_FIELD_AND_CONTINUE (opcode, num, 6); 3424 3425 /* Handle a 5 bit shift count at 26. */ 3426 case 'p': 3427 num = pa_get_absolute_expression (&the_insn, &s); 3428 if (strict && the_insn.exp.X_op != O_constant) 3429 break; 3430 s = expr_end; 3431 CHECK_FIELD (num, 31, 0, strict); 3432 INSERT_FIELD_AND_CONTINUE (opcode, 31 - num, 5); 3433 3434 /* Handle a 6 bit shift count at 20,22:26. */ 3435 case '~': 3436 num = pa_get_absolute_expression (&the_insn, &s); 3437 if (strict && the_insn.exp.X_op != O_constant) 3438 break; 3439 s = expr_end; 3440 CHECK_FIELD (num, 63, 0, strict); 3441 num = 63 - num; 3442 opcode |= (num & 0x20) << 6; 3443 INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 5); 3444 3445 /* Handle a 6 bit field length at 23,27:31. */ 3446 case '%': 3447 flag = 0; 3448 num = pa_get_absolute_expression (&the_insn, &s); 3449 if (strict && the_insn.exp.X_op != O_constant) 3450 break; 3451 s = expr_end; 3452 CHECK_FIELD (num, 64, 1, strict); 3453 num--; 3454 opcode |= (num & 0x20) << 3; 3455 num = 31 - (num & 0x1f); 3456 INSERT_FIELD_AND_CONTINUE (opcode, num, 0); 3457 3458 /* Handle a 6 bit field length at 19,27:31. */ 3459 case '|': 3460 num = pa_get_absolute_expression (&the_insn, &s); 3461 if (strict && the_insn.exp.X_op != O_constant) 3462 break; 3463 s = expr_end; 3464 CHECK_FIELD (num, 64, 1, strict); 3465 num--; 3466 opcode |= (num & 0x20) << 7; 3467 num = 31 - (num & 0x1f); 3468 INSERT_FIELD_AND_CONTINUE (opcode, num, 0); 3469 3470 /* Handle a 5 bit bit position at 26. */ 3471 case 'P': 3472 num = pa_get_absolute_expression (&the_insn, &s); 3473 if (strict && the_insn.exp.X_op != O_constant) 3474 break; 3475 s = expr_end; 3476 CHECK_FIELD (num, 31, 0, strict); 3477 INSERT_FIELD_AND_CONTINUE (opcode, num, 5); 3478 3479 /* Handle a 6 bit bit position at 20,22:26. */ 3480 case 'q': 3481 num = pa_get_absolute_expression (&the_insn, &s); 3482 if (strict && the_insn.exp.X_op != O_constant) 3483 break; 3484 s = expr_end; 3485 CHECK_FIELD (num, 63, 0, strict); 3486 opcode |= (num & 0x20) << 6; 3487 INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 5); 3488 3489 /* Handle a 5 bit immediate at 10 with 'd' as the complement 3490 of the high bit of the immediate. */ 3491 case 'B': 3492 num = pa_get_absolute_expression (&the_insn, &s); 3493 if (strict && the_insn.exp.X_op != O_constant) 3494 break; 3495 s = expr_end; 3496 CHECK_FIELD (num, 63, 0, strict); 3497 if (num & 0x20) 3498 ; 3499 else 3500 opcode |= (1 << 13); 3501 INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 21); 3502 3503 /* Handle a 5 bit immediate at 10. */ 3504 case 'Q': 3505 num = pa_get_absolute_expression (&the_insn, &s); 3506 if (strict && the_insn.exp.X_op != O_constant) 3507 break; 3508 s = expr_end; 3509 CHECK_FIELD (num, 31, 0, strict); 3510 INSERT_FIELD_AND_CONTINUE (opcode, num, 21); 3511 3512 /* Handle a 9 bit immediate at 28. */ 3513 case '$': 3514 num = pa_get_absolute_expression (&the_insn, &s); 3515 if (strict && the_insn.exp.X_op != O_constant) 3516 break; 3517 s = expr_end; 3518 CHECK_FIELD (num, 511, 1, strict); 3519 INSERT_FIELD_AND_CONTINUE (opcode, num, 3); 3520 3521 /* Handle a 13 bit immediate at 18. */ 3522 case 'A': 3523 num = pa_get_absolute_expression (&the_insn, &s); 3524 if (strict && the_insn.exp.X_op != O_constant) 3525 break; 3526 s = expr_end; 3527 CHECK_FIELD (num, 8191, 0, strict); 3528 INSERT_FIELD_AND_CONTINUE (opcode, num, 13); 3529 3530 /* Handle a 26 bit immediate at 31. */ 3531 case 'D': 3532 num = pa_get_absolute_expression (&the_insn, &s); 3533 if (strict && the_insn.exp.X_op != O_constant) 3534 break; 3535 s = expr_end; 3536 CHECK_FIELD (num, 67108863, 0, strict); 3537 INSERT_FIELD_AND_CONTINUE (opcode, num, 0); 3538 3539 /* Handle a 3 bit SFU identifier at 25. */ 3540 case 'v': 3541 if (*s++ != ',') 3542 as_bad (_("Invalid SFU identifier")); 3543 num = pa_get_absolute_expression (&the_insn, &s); 3544 if (strict && the_insn.exp.X_op != O_constant) 3545 break; 3546 s = expr_end; 3547 CHECK_FIELD (num, 7, 0, strict); 3548 INSERT_FIELD_AND_CONTINUE (opcode, num, 6); 3549 3550 /* Handle a 20 bit SOP field for spop0. */ 3551 case 'O': 3552 num = pa_get_absolute_expression (&the_insn, &s); 3553 if (strict && the_insn.exp.X_op != O_constant) 3554 break; 3555 s = expr_end; 3556 CHECK_FIELD (num, 1048575, 0, strict); 3557 num = (num & 0x1f) | ((num & 0x000fffe0) << 6); 3558 INSERT_FIELD_AND_CONTINUE (opcode, num, 0); 3559 3560 /* Handle a 15bit SOP field for spop1. */ 3561 case 'o': 3562 num = pa_get_absolute_expression (&the_insn, &s); 3563 if (strict && the_insn.exp.X_op != O_constant) 3564 break; 3565 s = expr_end; 3566 CHECK_FIELD (num, 32767, 0, strict); 3567 INSERT_FIELD_AND_CONTINUE (opcode, num, 11); 3568 3569 /* Handle a 10bit SOP field for spop3. */ 3570 case '0': 3571 num = pa_get_absolute_expression (&the_insn, &s); 3572 if (strict && the_insn.exp.X_op != O_constant) 3573 break; 3574 s = expr_end; 3575 CHECK_FIELD (num, 1023, 0, strict); 3576 num = (num & 0x1f) | ((num & 0x000003e0) << 6); 3577 INSERT_FIELD_AND_CONTINUE (opcode, num, 0); 3578 3579 /* Handle a 15 bit SOP field for spop2. */ 3580 case '1': 3581 num = pa_get_absolute_expression (&the_insn, &s); 3582 if (strict && the_insn.exp.X_op != O_constant) 3583 break; 3584 s = expr_end; 3585 CHECK_FIELD (num, 32767, 0, strict); 3586 num = (num & 0x1f) | ((num & 0x00007fe0) << 6); 3587 INSERT_FIELD_AND_CONTINUE (opcode, num, 0); 3588 3589 /* Handle a 3-bit co-processor ID field. */ 3590 case 'u': 3591 if (*s++ != ',') 3592 as_bad (_("Invalid COPR identifier")); 3593 num = pa_get_absolute_expression (&the_insn, &s); 3594 if (strict && the_insn.exp.X_op != O_constant) 3595 break; 3596 s = expr_end; 3597 CHECK_FIELD (num, 7, 0, strict); 3598 INSERT_FIELD_AND_CONTINUE (opcode, num, 6); 3599 3600 /* Handle a 22bit SOP field for copr. */ 3601 case '2': 3602 num = pa_get_absolute_expression (&the_insn, &s); 3603 if (strict && the_insn.exp.X_op != O_constant) 3604 break; 3605 s = expr_end; 3606 CHECK_FIELD (num, 4194303, 0, strict); 3607 num = (num & 0x1f) | ((num & 0x003fffe0) << 4); 3608 INSERT_FIELD_AND_CONTINUE (opcode, num, 0); 3609 3610 /* Handle a source FP operand format completer. */ 3611 case '{': 3612 if (*s == ',' && *(s+1) == 't') 3613 { 3614 the_insn.trunc = 1; 3615 s += 2; 3616 } 3617 else 3618 the_insn.trunc = 0; 3619 flag = pa_parse_fp_cnv_format (&s); 3620 the_insn.fpof1 = flag; 3621 if (flag == W || flag == UW) 3622 flag = SGL; 3623 if (flag == DW || flag == UDW) 3624 flag = DBL; 3625 if (flag == QW || flag == UQW) 3626 flag = QUAD; 3627 INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); 3628 3629 /* Handle a destination FP operand format completer. */ 3630 case '_': 3631 /* pa_parse_format needs the ',' prefix. */ 3632 s--; 3633 flag = pa_parse_fp_cnv_format (&s); 3634 the_insn.fpof2 = flag; 3635 if (flag == W || flag == UW) 3636 flag = SGL; 3637 if (flag == DW || flag == UDW) 3638 flag = DBL; 3639 if (flag == QW || flag == UQW) 3640 flag = QUAD; 3641 opcode |= flag << 13; 3642 if (the_insn.fpof1 == SGL 3643 || the_insn.fpof1 == DBL 3644 || the_insn.fpof1 == QUAD) 3645 { 3646 if (the_insn.fpof2 == SGL 3647 || the_insn.fpof2 == DBL 3648 || the_insn.fpof2 == QUAD) 3649 flag = 0; 3650 else if (the_insn.fpof2 == W 3651 || the_insn.fpof2 == DW 3652 || the_insn.fpof2 == QW) 3653 flag = 2; 3654 else if (the_insn.fpof2 == UW 3655 || the_insn.fpof2 == UDW 3656 || the_insn.fpof2 == UQW) 3657 flag = 6; 3658 else 3659 abort (); 3660 } 3661 else if (the_insn.fpof1 == W 3662 || the_insn.fpof1 == DW 3663 || the_insn.fpof1 == QW) 3664 { 3665 if (the_insn.fpof2 == SGL 3666 || the_insn.fpof2 == DBL 3667 || the_insn.fpof2 == QUAD) 3668 flag = 1; 3669 else 3670 abort (); 3671 } 3672 else if (the_insn.fpof1 == UW 3673 || the_insn.fpof1 == UDW 3674 || the_insn.fpof1 == UQW) 3675 { 3676 if (the_insn.fpof2 == SGL 3677 || the_insn.fpof2 == DBL 3678 || the_insn.fpof2 == QUAD) 3679 flag = 5; 3680 else 3681 abort (); 3682 } 3683 flag |= the_insn.trunc; 3684 INSERT_FIELD_AND_CONTINUE (opcode, flag, 15); 3685 3686 /* Handle a source FP operand format completer. */ 3687 case 'F': 3688 flag = pa_parse_fp_format (&s); 3689 the_insn.fpof1 = flag; 3690 INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); 3691 3692 /* Handle a destination FP operand format completer. */ 3693 case 'G': 3694 /* pa_parse_format needs the ',' prefix. */ 3695 s--; 3696 flag = pa_parse_fp_format (&s); 3697 the_insn.fpof2 = flag; 3698 INSERT_FIELD_AND_CONTINUE (opcode, flag, 13); 3699 3700 /* Handle a source FP operand format completer at 20. */ 3701 case 'I': 3702 flag = pa_parse_fp_format (&s); 3703 the_insn.fpof1 = flag; 3704 INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); 3705 3706 /* Handle a floating point operand format at 26. 3707 Only allows single and double precision. */ 3708 case 'H': 3709 flag = pa_parse_fp_format (&s); 3710 switch (flag) 3711 { 3712 case SGL: 3713 opcode |= 0x20; 3714 case DBL: 3715 the_insn.fpof1 = flag; 3716 continue; 3717 3718 case QUAD: 3719 case ILLEGAL_FMT: 3720 default: 3721 as_bad (_("Invalid Floating Point Operand Format.")); 3722 } 3723 break; 3724 3725 /* Handle all floating point registers. */ 3726 case 'f': 3727 switch (*++args) 3728 { 3729 /* Float target register. */ 3730 case 't': 3731 if (!pa_parse_number (&s, 3)) 3732 break; 3733 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE; 3734 CHECK_FIELD (num, 31, 0, 0); 3735 INSERT_FIELD_AND_CONTINUE (opcode, num, 0); 3736 3737 /* Float target register with L/R selection. */ 3738 case 'T': 3739 { 3740 if (!pa_parse_number (&s, 1)) 3741 break; 3742 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE; 3743 CHECK_FIELD (num, 31, 0, 0); 3744 opcode |= num; 3745 3746 /* 0x30 opcodes are FP arithmetic operation opcodes 3747 and need to be turned into 0x38 opcodes. This 3748 is not necessary for loads/stores. */ 3749 if (need_pa11_opcode () 3750 && ((opcode & 0xfc000000) == 0x30000000)) 3751 opcode |= 1 << 27; 3752 3753 opcode |= (pa_number & FP_REG_RSEL ? 1 << 6 : 0); 3754 continue; 3755 } 3756 3757 /* Float operand 1. */ 3758 case 'a': 3759 { 3760 if (!pa_parse_number (&s, 1)) 3761 break; 3762 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE; 3763 CHECK_FIELD (num, 31, 0, 0); 3764 opcode |= num << 21; 3765 if (need_pa11_opcode ()) 3766 { 3767 opcode |= (pa_number & FP_REG_RSEL ? 1 << 7 : 0); 3768 opcode |= 1 << 27; 3769 } 3770 continue; 3771 } 3772 3773 /* Float operand 1 with L/R selection. */ 3774 case 'X': 3775 case 'A': 3776 { 3777 if (!pa_parse_number (&s, 1)) 3778 break; 3779 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE; 3780 CHECK_FIELD (num, 31, 0, 0); 3781 opcode |= num << 21; 3782 opcode |= (pa_number & FP_REG_RSEL ? 1 << 7 : 0); 3783 continue; 3784 } 3785 3786 /* Float operand 2. */ 3787 case 'b': 3788 { 3789 if (!pa_parse_number (&s, 1)) 3790 break; 3791 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE; 3792 CHECK_FIELD (num, 31, 0, 0); 3793 opcode |= num << 16; 3794 if (need_pa11_opcode ()) 3795 { 3796 opcode |= (pa_number & FP_REG_RSEL ? 1 << 12 : 0); 3797 opcode |= 1 << 27; 3798 } 3799 continue; 3800 } 3801 3802 /* Float operand 2 with L/R selection. */ 3803 case 'B': 3804 { 3805 if (!pa_parse_number (&s, 1)) 3806 break; 3807 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE; 3808 CHECK_FIELD (num, 31, 0, 0); 3809 opcode |= num << 16; 3810 opcode |= (pa_number & FP_REG_RSEL ? 1 << 12 : 0); 3811 continue; 3812 } 3813 3814 /* Float operand 3 for fmpyfadd, fmpynfadd. */ 3815 case 'C': 3816 { 3817 if (!pa_parse_number (&s, 1)) 3818 break; 3819 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE; 3820 CHECK_FIELD (num, 31, 0, 0); 3821 opcode |= (num & 0x1c) << 11; 3822 opcode |= (num & 0x03) << 9; 3823 opcode |= (pa_number & FP_REG_RSEL ? 1 << 8 : 0); 3824 continue; 3825 } 3826 3827 /* Float mult operand 1 for fmpyadd, fmpysub */ 3828 case 'i': 3829 { 3830 if (!pa_parse_number (&s, 1)) 3831 break; 3832 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE; 3833 CHECK_FIELD (num, 31, 0, 0); 3834 if (the_insn.fpof1 == SGL) 3835 { 3836 if (num < 16) 3837 { 3838 as_bad (_("Invalid register for single precision fmpyadd or fmpysub")); 3839 break; 3840 } 3841 num &= 0xF; 3842 num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0); 3843 } 3844 INSERT_FIELD_AND_CONTINUE (opcode, num, 21); 3845 } 3846 3847 /* Float mult operand 2 for fmpyadd, fmpysub */ 3848 case 'j': 3849 { 3850 if (!pa_parse_number (&s, 1)) 3851 break; 3852 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE; 3853 CHECK_FIELD (num, 31, 0, 0); 3854 if (the_insn.fpof1 == SGL) 3855 { 3856 if (num < 16) 3857 { 3858 as_bad (_("Invalid register for single precision fmpyadd or fmpysub")); 3859 break; 3860 } 3861 num &= 0xF; 3862 num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0); 3863 } 3864 INSERT_FIELD_AND_CONTINUE (opcode, num, 16); 3865 } 3866 3867 /* Float mult target for fmpyadd, fmpysub */ 3868 case 'k': 3869 { 3870 if (!pa_parse_number (&s, 1)) 3871 break; 3872 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE; 3873 CHECK_FIELD (num, 31, 0, 0); 3874 if (the_insn.fpof1 == SGL) 3875 { 3876 if (num < 16) 3877 { 3878 as_bad (_("Invalid register for single precision fmpyadd or fmpysub")); 3879 break; 3880 } 3881 num &= 0xF; 3882 num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0); 3883 } 3884 INSERT_FIELD_AND_CONTINUE (opcode, num, 0); 3885 } 3886 3887 /* Float add operand 1 for fmpyadd, fmpysub */ 3888 case 'l': 3889 { 3890 if (!pa_parse_number (&s, 1)) 3891 break; 3892 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE; 3893 CHECK_FIELD (num, 31, 0, 0); 3894 if (the_insn.fpof1 == SGL) 3895 { 3896 if (num < 16) 3897 { 3898 as_bad (_("Invalid register for single precision fmpyadd or fmpysub")); 3899 break; 3900 } 3901 num &= 0xF; 3902 num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0); 3903 } 3904 INSERT_FIELD_AND_CONTINUE (opcode, num, 6); 3905 } 3906 3907 /* Float add target for fmpyadd, fmpysub */ 3908 case 'm': 3909 { 3910 if (!pa_parse_number (&s, 1)) 3911 break; 3912 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE; 3913 CHECK_FIELD (num, 31, 0, 0); 3914 if (the_insn.fpof1 == SGL) 3915 { 3916 if (num < 16) 3917 { 3918 as_bad (_("Invalid register for single precision fmpyadd or fmpysub")); 3919 break; 3920 } 3921 num &= 0xF; 3922 num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0); 3923 } 3924 INSERT_FIELD_AND_CONTINUE (opcode, num, 11); 3925 } 3926 3927 /* Handle L/R register halves like 'x'. */ 3928 case 'E': 3929 case 'e': 3930 { 3931 if (!pa_parse_number (&s, 1)) 3932 break; 3933 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE; 3934 CHECK_FIELD (num, 31, 0, 0); 3935 opcode |= num << 16; 3936 if (need_pa11_opcode ()) 3937 { 3938 opcode |= (pa_number & FP_REG_RSEL ? 1 << 1 : 0); 3939 } 3940 continue; 3941 } 3942 3943 /* Float target register (PA 2.0 wide). */ 3944 case 'x': 3945 if (!pa_parse_number (&s, 3)) 3946 break; 3947 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE; 3948 CHECK_FIELD (num, 31, 0, 0); 3949 INSERT_FIELD_AND_CONTINUE (opcode, num, 16); 3950 3951 default: 3952 abort (); 3953 } 3954 break; 3955 3956 default: 3957 abort (); 3958 } 3959 break; 3960 } 3961 3962 failed: 3963 /* Check if the args matched. */ 3964 if (!match) 3965 { 3966 if (&insn[1] - pa_opcodes < (int) NUMOPCODES 3967 && !strcmp (insn->name, insn[1].name)) 3968 { 3969 ++insn; 3970 s = argstart; 3971 continue; 3972 } 3973 else 3974 { 3975 as_bad (_("Invalid operands %s"), error_message); 3976 return; 3977 } 3978 } 3979 break; 3980 } 3981 3982 the_insn.opcode = opcode; 3983 } 3984 3985 /* Turn a string in input_line_pointer into a floating point constant of type 3986 type, and store the appropriate bytes in *litP. The number of LITTLENUMS 3987 emitted is stored in *sizeP . An error message or NULL is returned. */ 3988 3989 #define MAX_LITTLENUMS 6 3990 3991 char * 3992 md_atof (type, litP, sizeP) 3993 char type; 3994 char *litP; 3995 int *sizeP; 3996 { 3997 int prec; 3998 LITTLENUM_TYPE words[MAX_LITTLENUMS]; 3999 LITTLENUM_TYPE *wordP; 4000 char *t; 4001 4002 switch (type) 4003 { 4004 4005 case 'f': 4006 case 'F': 4007 case 's': 4008 case 'S': 4009 prec = 2; 4010 break; 4011 4012 case 'd': 4013 case 'D': 4014 case 'r': 4015 case 'R': 4016 prec = 4; 4017 break; 4018 4019 case 'x': 4020 case 'X': 4021 prec = 6; 4022 break; 4023 4024 case 'p': 4025 case 'P': 4026 prec = 6; 4027 break; 4028 4029 default: 4030 *sizeP = 0; 4031 return _("Bad call to MD_ATOF()"); 4032 } 4033 t = atof_ieee (input_line_pointer, type, words); 4034 if (t) 4035 input_line_pointer = t; 4036 *sizeP = prec * sizeof (LITTLENUM_TYPE); 4037 for (wordP = words; prec--;) 4038 { 4039 md_number_to_chars (litP, (valueT) (*wordP++), sizeof (LITTLENUM_TYPE)); 4040 litP += sizeof (LITTLENUM_TYPE); 4041 } 4042 return NULL; 4043 } 4044 4045 /* Write out big-endian. */ 4046 4047 void 4048 md_number_to_chars (buf, val, n) 4049 char *buf; 4050 valueT val; 4051 int n; 4052 { 4053 number_to_chars_bigendian (buf, val, n); 4054 } 4055 4056 /* Translate internal representation of relocation info to BFD target 4057 format. */ 4058 4059 arelent ** 4060 tc_gen_reloc (section, fixp) 4061 asection *section; 4062 fixS *fixp; 4063 { 4064 arelent *reloc; 4065 struct hppa_fix_struct *hppa_fixp; 4066 static arelent *no_relocs = NULL; 4067 arelent **relocs; 4068 reloc_type **codes; 4069 reloc_type code; 4070 int n_relocs; 4071 int i; 4072 4073 hppa_fixp = (struct hppa_fix_struct *) fixp->tc_fix_data; 4074 if (fixp->fx_addsy == 0) 4075 return &no_relocs; 4076 4077 assert (hppa_fixp != 0); 4078 assert (section != 0); 4079 4080 reloc = (arelent *) xmalloc (sizeof (arelent)); 4081 4082 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); 4083 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); 4084 codes = hppa_gen_reloc_type (stdoutput, 4085 fixp->fx_r_type, 4086 hppa_fixp->fx_r_format, 4087 hppa_fixp->fx_r_field, 4088 fixp->fx_subsy != NULL, 4089 symbol_get_bfdsym (fixp->fx_addsy)); 4090 4091 if (codes == NULL) 4092 { 4093 as_bad_where (fixp->fx_file, fixp->fx_line, _("Cannot handle fixup")); 4094 abort (); 4095 } 4096 4097 for (n_relocs = 0; codes[n_relocs]; n_relocs++) 4098 ; 4099 4100 relocs = (arelent **) xmalloc (sizeof (arelent *) * n_relocs + 1); 4101 reloc = (arelent *) xmalloc (sizeof (arelent) * n_relocs); 4102 for (i = 0; i < n_relocs; i++) 4103 relocs[i] = &reloc[i]; 4104 4105 relocs[n_relocs] = NULL; 4106 4107 #ifdef OBJ_ELF 4108 switch (fixp->fx_r_type) 4109 { 4110 default: 4111 assert (n_relocs == 1); 4112 4113 code = *codes[0]; 4114 4115 /* Now, do any processing that is dependent on the relocation type. */ 4116 switch (code) 4117 { 4118 case R_PARISC_DLTREL21L: 4119 case R_PARISC_DLTREL14R: 4120 case R_PARISC_DLTREL14F: 4121 case R_PARISC_PLABEL32: 4122 case R_PARISC_PLABEL21L: 4123 case R_PARISC_PLABEL14R: 4124 /* For plabel relocations, the addend of the 4125 relocation should be either 0 (no static link) or 2 4126 (static link required). This adjustment is done in 4127 bfd/elf32-hppa.c:elf32_hppa_relocate_section. 4128 4129 We also slam a zero addend into the DLT relative relocs; 4130 it doesn't make a lot of sense to use any addend since 4131 it gets you a different (eg unknown) DLT entry. */ 4132 reloc->addend = 0; 4133 break; 4134 4135 #ifdef ELF_ARG_RELOC 4136 case R_PARISC_PCREL17R: 4137 case R_PARISC_PCREL17F: 4138 case R_PARISC_PCREL17C: 4139 case R_PARISC_DIR17R: 4140 case R_PARISC_DIR17F: 4141 case R_PARISC_PCREL21L: 4142 case R_PARISC_DIR21L: 4143 reloc->addend = HPPA_R_ADDEND (hppa_fixp->fx_arg_reloc, 4144 fixp->fx_offset); 4145 break; 4146 #endif 4147 4148 case R_PARISC_DIR32: 4149 /* Facilitate hand-crafted unwind info. */ 4150 if (strcmp (section->name, UNWIND_SECTION_NAME) == 0) 4151 code = R_PARISC_SEGREL32; 4152 /* Fall thru */ 4153 4154 default: 4155 reloc->addend = fixp->fx_offset; 4156 break; 4157 } 4158 4159 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); 4160 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); 4161 reloc->howto = bfd_reloc_type_lookup (stdoutput, 4162 (bfd_reloc_code_real_type) code); 4163 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; 4164 4165 assert (reloc->howto && (unsigned int) code == reloc->howto->type); 4166 break; 4167 } 4168 #else /* OBJ_SOM */ 4169 4170 /* Walk over reach relocation returned by the BFD backend. */ 4171 for (i = 0; i < n_relocs; i++) 4172 { 4173 code = *codes[i]; 4174 4175 relocs[i]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); 4176 *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); 4177 relocs[i]->howto = 4178 bfd_reloc_type_lookup (stdoutput, 4179 (bfd_reloc_code_real_type) code); 4180 relocs[i]->address = fixp->fx_frag->fr_address + fixp->fx_where; 4181 4182 switch (code) 4183 { 4184 case R_COMP2: 4185 /* The only time we ever use a R_COMP2 fixup is for the difference 4186 of two symbols. With that in mind we fill in all four 4187 relocs now and break out of the loop. */ 4188 assert (i == 1); 4189 relocs[0]->sym_ptr_ptr = (asymbol **) &(bfd_abs_symbol); 4190 relocs[0]->howto = 4191 bfd_reloc_type_lookup (stdoutput, 4192 (bfd_reloc_code_real_type) *codes[0]); 4193 relocs[0]->address = fixp->fx_frag->fr_address + fixp->fx_where; 4194 relocs[0]->addend = 0; 4195 relocs[1]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); 4196 *relocs[1]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); 4197 relocs[1]->howto = 4198 bfd_reloc_type_lookup (stdoutput, 4199 (bfd_reloc_code_real_type) *codes[1]); 4200 relocs[1]->address = fixp->fx_frag->fr_address + fixp->fx_where; 4201 relocs[1]->addend = 0; 4202 relocs[2]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); 4203 *relocs[2]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_subsy); 4204 relocs[2]->howto = 4205 bfd_reloc_type_lookup (stdoutput, 4206 (bfd_reloc_code_real_type) *codes[2]); 4207 relocs[2]->address = fixp->fx_frag->fr_address + fixp->fx_where; 4208 relocs[2]->addend = 0; 4209 relocs[3]->sym_ptr_ptr = (asymbol **) &(bfd_abs_symbol); 4210 relocs[3]->howto = 4211 bfd_reloc_type_lookup (stdoutput, 4212 (bfd_reloc_code_real_type) *codes[3]); 4213 relocs[3]->address = fixp->fx_frag->fr_address + fixp->fx_where; 4214 relocs[3]->addend = 0; 4215 relocs[4]->sym_ptr_ptr = (asymbol **) &(bfd_abs_symbol); 4216 relocs[4]->howto = 4217 bfd_reloc_type_lookup (stdoutput, 4218 (bfd_reloc_code_real_type) *codes[4]); 4219 relocs[4]->address = fixp->fx_frag->fr_address + fixp->fx_where; 4220 relocs[4]->addend = 0; 4221 goto done; 4222 case R_PCREL_CALL: 4223 case R_ABS_CALL: 4224 relocs[i]->addend = HPPA_R_ADDEND (hppa_fixp->fx_arg_reloc, 0); 4225 break; 4226 4227 case R_DLT_REL: 4228 case R_DATA_PLABEL: 4229 case R_CODE_PLABEL: 4230 /* For plabel relocations, the addend of the 4231 relocation should be either 0 (no static link) or 2 4232 (static link required). 4233 4234 FIXME: We always assume no static link! 4235 4236 We also slam a zero addend into the DLT relative relocs; 4237 it doesn't make a lot of sense to use any addend since 4238 it gets you a different (eg unknown) DLT entry. */ 4239 relocs[i]->addend = 0; 4240 break; 4241 4242 case R_N_MODE: 4243 case R_S_MODE: 4244 case R_D_MODE: 4245 case R_R_MODE: 4246 case R_FSEL: 4247 case R_LSEL: 4248 case R_RSEL: 4249 case R_BEGIN_BRTAB: 4250 case R_END_BRTAB: 4251 case R_BEGIN_TRY: 4252 case R_N0SEL: 4253 case R_N1SEL: 4254 /* There is no symbol or addend associated with these fixups. */ 4255 relocs[i]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); 4256 *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol); 4257 relocs[i]->addend = 0; 4258 break; 4259 4260 case R_END_TRY: 4261 case R_ENTRY: 4262 case R_EXIT: 4263 /* There is no symbol associated with these fixups. */ 4264 relocs[i]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); 4265 *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol); 4266 relocs[i]->addend = fixp->fx_offset; 4267 break; 4268 4269 default: 4270 relocs[i]->addend = fixp->fx_offset; 4271 } 4272 } 4273 4274 done: 4275 #endif 4276 4277 return relocs; 4278 } 4279 4280 /* Process any machine dependent frag types. */ 4281 4282 void 4283 md_convert_frag (abfd, sec, fragP) 4284 register bfd *abfd ATTRIBUTE_UNUSED; 4285 register asection *sec ATTRIBUTE_UNUSED; 4286 register fragS *fragP; 4287 { 4288 unsigned int address; 4289 4290 if (fragP->fr_type == rs_machine_dependent) 4291 { 4292 switch ((int) fragP->fr_subtype) 4293 { 4294 case 0: 4295 fragP->fr_type = rs_fill; 4296 know (fragP->fr_var == 1); 4297 know (fragP->fr_next); 4298 address = fragP->fr_address + fragP->fr_fix; 4299 if (address % fragP->fr_offset) 4300 { 4301 fragP->fr_offset = 4302 fragP->fr_next->fr_address 4303 - fragP->fr_address 4304 - fragP->fr_fix; 4305 } 4306 else 4307 fragP->fr_offset = 0; 4308 break; 4309 } 4310 } 4311 } 4312 4313 /* Round up a section size to the appropriate boundary. */ 4314 4315 valueT 4316 md_section_align (segment, size) 4317 asection *segment; 4318 valueT size; 4319 { 4320 int align = bfd_get_section_alignment (stdoutput, segment); 4321 int align2 = (1 << align) - 1; 4322 4323 return (size + align2) & ~align2; 4324 } 4325 4326 /* Return the approximate size of a frag before relaxation has occurred. */ 4327 int 4328 md_estimate_size_before_relax (fragP, segment) 4329 register fragS *fragP; 4330 asection *segment ATTRIBUTE_UNUSED; 4331 { 4332 int size; 4333 4334 size = 0; 4335 4336 while ((fragP->fr_fix + size) % fragP->fr_offset) 4337 size++; 4338 4339 return size; 4340 } 4341 4342 #ifdef OBJ_ELF 4343 # ifdef WARN_COMMENTS 4344 const char *md_shortopts = "Vc"; 4345 # else 4346 const char *md_shortopts = "V"; 4347 # endif 4348 #else 4349 # ifdef WARN_COMMENTS 4350 const char *md_shortopts = "c"; 4351 # else 4352 const char *md_shortopts = ""; 4353 # endif 4354 #endif 4355 4356 struct option md_longopts[] = { 4357 #ifdef WARN_COMMENTS 4358 {"warn-comment", no_argument, NULL, 'c'}, 4359 #endif 4360 {NULL, no_argument, NULL, 0} 4361 }; 4362 size_t md_longopts_size = sizeof (md_longopts); 4363 4364 int 4365 md_parse_option (c, arg) 4366 int c ATTRIBUTE_UNUSED; 4367 char *arg ATTRIBUTE_UNUSED; 4368 { 4369 switch (c) 4370 { 4371 default: 4372 return 0; 4373 4374 #ifdef OBJ_ELF 4375 case 'V': 4376 print_version_id (); 4377 break; 4378 #endif 4379 #ifdef WARN_COMMENTS 4380 case 'c': 4381 warn_comment = 1; 4382 break; 4383 #endif 4384 } 4385 4386 return 1; 4387 } 4388 4389 void 4390 md_show_usage (stream) 4391 FILE *stream ATTRIBUTE_UNUSED; 4392 { 4393 #ifdef OBJ_ELF 4394 fprintf (stream, _("\ 4395 -Q ignored\n")); 4396 #endif 4397 #ifdef WARN_COMMENTS 4398 fprintf (stream, _("\ 4399 -c print a warning if a comment is found\n")); 4400 #endif 4401 } 4402 4403 /* We have no need to default values of symbols. */ 4404 4405 symbolS * 4406 md_undefined_symbol (name) 4407 char *name ATTRIBUTE_UNUSED; 4408 { 4409 return 0; 4410 } 4411 4412 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC) 4413 #define nonzero_dibits(x) \ 4414 ((x) | (((x) & 0x55555555) << 1) | (((x) & 0xAAAAAAAA) >> 1)) 4415 #define arg_reloc_stub_needed(CALLER, CALLEE) \ 4416 (((CALLER) ^ (CALLEE)) & nonzero_dibits (CALLER) & nonzero_dibits (CALLEE)) 4417 #else 4418 #define arg_reloc_stub_needed(CALLER, CALLEE) 0 4419 #endif 4420 4421 /* Apply a fixup to an instruction. */ 4422 4423 void 4424 md_apply_fix3 (fixP, valP, seg) 4425 fixS *fixP; 4426 valueT *valP; 4427 segT seg ATTRIBUTE_UNUSED; 4428 { 4429 unsigned char *buf; 4430 struct hppa_fix_struct *hppa_fixP; 4431 offsetT new_val; 4432 int insn, val, fmt; 4433 4434 /* SOM uses R_HPPA_ENTRY and R_HPPA_EXIT relocations which can 4435 never be "applied" (they are just markers). Likewise for 4436 R_HPPA_BEGIN_BRTAB and R_HPPA_END_BRTAB. */ 4437 #ifdef OBJ_SOM 4438 if (fixP->fx_r_type == R_HPPA_ENTRY 4439 || fixP->fx_r_type == R_HPPA_EXIT 4440 || fixP->fx_r_type == R_HPPA_BEGIN_BRTAB 4441 || fixP->fx_r_type == R_HPPA_END_BRTAB 4442 || fixP->fx_r_type == R_HPPA_BEGIN_TRY) 4443 return; 4444 4445 /* Disgusting. We must set fx_offset ourselves -- R_HPPA_END_TRY 4446 fixups are considered not adjustable, which in turn causes 4447 adjust_reloc_syms to not set fx_offset. Ugh. */ 4448 if (fixP->fx_r_type == R_HPPA_END_TRY) 4449 { 4450 fixP->fx_offset = * valP; 4451 return; 4452 } 4453 #endif 4454 #ifdef OBJ_ELF 4455 if (fixP->fx_r_type == (int) R_PARISC_GNU_VTENTRY 4456 || fixP->fx_r_type == (int) R_PARISC_GNU_VTINHERIT) 4457 return; 4458 #endif 4459 4460 if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0) 4461 fixP->fx_done = 1; 4462 4463 /* There should have been an HPPA specific fixup associated 4464 with the GAS fixup. */ 4465 hppa_fixP = (struct hppa_fix_struct *) fixP->tc_fix_data; 4466 if (hppa_fixP == NULL) 4467 { 4468 as_bad_where (fixP->fx_file, fixP->fx_line, 4469 _("no hppa_fixup entry for fixup type 0x%x"), 4470 fixP->fx_r_type); 4471 return; 4472 } 4473 4474 buf = (unsigned char *) (fixP->fx_frag->fr_literal + fixP->fx_where); 4475 insn = bfd_get_32 (stdoutput, buf); 4476 fmt = bfd_hppa_insn2fmt (stdoutput, insn); 4477 4478 /* If there is a symbol associated with this fixup, then it's something 4479 which will need a SOM relocation (except for some PC-relative relocs). 4480 In such cases we should treat the "val" or "addend" as zero since it 4481 will be added in as needed from fx_offset in tc_gen_reloc. */ 4482 if ((fixP->fx_addsy != NULL 4483 || fixP->fx_r_type == (int) R_HPPA_NONE) 4484 #ifdef OBJ_SOM 4485 && fmt != 32 4486 #endif 4487 ) 4488 new_val = ((fmt == 12 || fmt == 17 || fmt == 22) ? 8 : 0); 4489 #ifdef OBJ_SOM 4490 /* These field selectors imply that we do not want an addend. */ 4491 else if (hppa_fixP->fx_r_field == e_psel 4492 || hppa_fixP->fx_r_field == e_rpsel 4493 || hppa_fixP->fx_r_field == e_lpsel 4494 || hppa_fixP->fx_r_field == e_tsel 4495 || hppa_fixP->fx_r_field == e_rtsel 4496 || hppa_fixP->fx_r_field == e_ltsel) 4497 new_val = ((fmt == 12 || fmt == 17 || fmt == 22) ? 8 : 0); 4498 #endif 4499 else 4500 new_val = hppa_field_adjust (* valP, 0, hppa_fixP->fx_r_field); 4501 4502 /* Handle pc-relative exceptions from above. */ 4503 if ((fmt == 12 || fmt == 17 || fmt == 22) 4504 && fixP->fx_addsy 4505 && fixP->fx_pcrel 4506 && !arg_reloc_stub_needed (symbol_arg_reloc_info (fixP->fx_addsy), 4507 hppa_fixP->fx_arg_reloc) 4508 #ifdef OBJ_ELF 4509 && (* valP - 8 + 8192 < 16384 4510 || (fmt == 17 && * valP - 8 + 262144 < 524288) 4511 || (fmt == 22 && * valP - 8 + 8388608 < 16777216)) 4512 #endif 4513 #ifdef OBJ_SOM 4514 && (* valP - 8 + 262144 < 524288 4515 || (fmt == 22 && * valP - 8 + 8388608 < 16777216)) 4516 #endif 4517 && !S_IS_EXTERNAL (fixP->fx_addsy) 4518 && !S_IS_WEAK (fixP->fx_addsy) 4519 && S_GET_SEGMENT (fixP->fx_addsy) == hppa_fixP->segment 4520 && !(fixP->fx_subsy 4521 && S_GET_SEGMENT (fixP->fx_subsy) != hppa_fixP->segment)) 4522 { 4523 new_val = hppa_field_adjust (* valP, 0, hppa_fixP->fx_r_field); 4524 } 4525 4526 switch (fmt) 4527 { 4528 case 10: 4529 CHECK_FIELD_WHERE (new_val, 8191, -8192, 4530 fixP->fx_file, fixP->fx_line); 4531 val = new_val; 4532 4533 insn = (insn & ~ 0x3ff1) | (((val & 0x1ff8) << 1) 4534 | ((val & 0x2000) >> 13)); 4535 break; 4536 case -11: 4537 CHECK_FIELD_WHERE (new_val, 8191, -8192, 4538 fixP->fx_file, fixP->fx_line); 4539 val = new_val; 4540 4541 insn = (insn & ~ 0x3ff9) | (((val & 0x1ffc) << 1) 4542 | ((val & 0x2000) >> 13)); 4543 break; 4544 /* Handle all opcodes with the 'j' operand type. */ 4545 case 14: 4546 CHECK_FIELD_WHERE (new_val, 8191, -8192, 4547 fixP->fx_file, fixP->fx_line); 4548 val = new_val; 4549 4550 insn = ((insn & ~ 0x3fff) | low_sign_unext (val, 14)); 4551 break; 4552 4553 /* Handle all opcodes with the 'k' operand type. */ 4554 case 21: 4555 CHECK_FIELD_WHERE (new_val, 1048575, -1048576, 4556 fixP->fx_file, fixP->fx_line); 4557 val = new_val; 4558 4559 insn = (insn & ~ 0x1fffff) | re_assemble_21 (val); 4560 break; 4561 4562 /* Handle all the opcodes with the 'i' operand type. */ 4563 case 11: 4564 CHECK_FIELD_WHERE (new_val, 1023, -1024, 4565 fixP->fx_file, fixP->fx_line); 4566 val = new_val; 4567 4568 insn = (insn & ~ 0x7ff) | low_sign_unext (val, 11); 4569 break; 4570 4571 /* Handle all the opcodes with the 'w' operand type. */ 4572 case 12: 4573 CHECK_FIELD_WHERE (new_val - 8, 8191, -8192, 4574 fixP->fx_file, fixP->fx_line); 4575 val = new_val - 8; 4576 4577 insn = (insn & ~ 0x1ffd) | re_assemble_12 (val >> 2); 4578 break; 4579 4580 /* Handle some of the opcodes with the 'W' operand type. */ 4581 case 17: 4582 { 4583 offsetT distance = * valP; 4584 4585 /* If this is an absolute branch (ie no link) with an out of 4586 range target, then we want to complain. */ 4587 if (fixP->fx_r_type == (int) R_HPPA_PCREL_CALL 4588 && (insn & 0xffe00000) == 0xe8000000) 4589 CHECK_FIELD_WHERE (distance - 8, 262143, -262144, 4590 fixP->fx_file, fixP->fx_line); 4591 4592 CHECK_FIELD_WHERE (new_val - 8, 262143, -262144, 4593 fixP->fx_file, fixP->fx_line); 4594 val = new_val - 8; 4595 4596 insn = (insn & ~ 0x1f1ffd) | re_assemble_17 (val >> 2); 4597 break; 4598 } 4599 4600 case 22: 4601 { 4602 offsetT distance = * valP; 4603 4604 /* If this is an absolute branch (ie no link) with an out of 4605 range target, then we want to complain. */ 4606 if (fixP->fx_r_type == (int) R_HPPA_PCREL_CALL 4607 && (insn & 0xffe00000) == 0xe8000000) 4608 CHECK_FIELD_WHERE (distance - 8, 8388607, -8388608, 4609 fixP->fx_file, fixP->fx_line); 4610 4611 CHECK_FIELD_WHERE (new_val - 8, 8388607, -8388608, 4612 fixP->fx_file, fixP->fx_line); 4613 val = new_val - 8; 4614 4615 insn = (insn & ~ 0x3ff1ffd) | re_assemble_22 (val >> 2); 4616 break; 4617 } 4618 4619 case -10: 4620 val = new_val; 4621 insn = (insn & ~ 0xfff1) | re_assemble_16 (val & -8); 4622 break; 4623 4624 case -16: 4625 val = new_val; 4626 insn = (insn & ~ 0xfff9) | re_assemble_16 (val & -4); 4627 break; 4628 4629 case 16: 4630 val = new_val; 4631 insn = (insn & ~ 0xffff) | re_assemble_16 (val); 4632 break; 4633 4634 case 32: 4635 insn = new_val; 4636 break; 4637 4638 default: 4639 as_bad_where (fixP->fx_file, fixP->fx_line, 4640 _("Unknown relocation encountered in md_apply_fix.")); 4641 return; 4642 } 4643 4644 /* Insert the relocation. */ 4645 bfd_put_32 (stdoutput, insn, buf); 4646 } 4647 4648 /* Exactly what point is a PC-relative offset relative TO? 4649 On the PA, they're relative to the address of the offset. */ 4650 4651 long 4652 md_pcrel_from (fixP) 4653 fixS *fixP; 4654 { 4655 return fixP->fx_where + fixP->fx_frag->fr_address; 4656 } 4657 4658 /* Return nonzero if the input line pointer is at the end of 4659 a statement. */ 4660 4661 static int 4662 is_end_of_statement () 4663 { 4664 return ((*input_line_pointer == '\n') 4665 || (*input_line_pointer == ';') 4666 || (*input_line_pointer == '!')); 4667 } 4668 4669 /* Read a number from S. The number might come in one of many forms, 4670 the most common will be a hex or decimal constant, but it could be 4671 a pre-defined register (Yuk!), or an absolute symbol. 4672 4673 Return 1 on success or 0 on failure. If STRICT, then a missing 4674 register prefix will cause a failure. The number itself is 4675 returned in `pa_number'. 4676 4677 IS_FLOAT indicates that a PA-89 FP register number should be 4678 parsed; A `l' or `r' suffix is checked for if but 2 of IS_FLOAT is 4679 not set. 4680 4681 pa_parse_number can not handle negative constants and will fail 4682 horribly if it is passed such a constant. */ 4683 4684 static int 4685 pa_parse_number (s, is_float) 4686 char **s; 4687 int is_float; 4688 { 4689 int num; 4690 char *name; 4691 char c; 4692 symbolS *sym; 4693 int status; 4694 char *p = *s; 4695 bfd_boolean have_prefix; 4696 4697 /* Skip whitespace before the number. */ 4698 while (*p == ' ' || *p == '\t') 4699 p = p + 1; 4700 4701 pa_number = -1; 4702 have_prefix = 0; 4703 num = 0; 4704 if (!strict && ISDIGIT (*p)) 4705 { 4706 /* Looks like a number. */ 4707 4708 if (*p == '0' && (*(p + 1) == 'x' || *(p + 1) == 'X')) 4709 { 4710 /* The number is specified in hex. */ 4711 p += 2; 4712 while (ISDIGIT (*p) || ((*p >= 'a') && (*p <= 'f')) 4713 || ((*p >= 'A') && (*p <= 'F'))) 4714 { 4715 if (ISDIGIT (*p)) 4716 num = num * 16 + *p - '0'; 4717 else if (*p >= 'a' && *p <= 'f') 4718 num = num * 16 + *p - 'a' + 10; 4719 else 4720 num = num * 16 + *p - 'A' + 10; 4721 ++p; 4722 } 4723 } 4724 else 4725 { 4726 /* The number is specified in decimal. */ 4727 while (ISDIGIT (*p)) 4728 { 4729 num = num * 10 + *p - '0'; 4730 ++p; 4731 } 4732 } 4733 4734 pa_number = num; 4735 4736 /* Check for a `l' or `r' suffix. */ 4737 if (is_float) 4738 { 4739 pa_number += FP_REG_BASE; 4740 if (! (is_float & 2)) 4741 { 4742 if (IS_R_SELECT (p)) 4743 { 4744 pa_number += FP_REG_RSEL; 4745 ++p; 4746 } 4747 else if (IS_L_SELECT (p)) 4748 { 4749 ++p; 4750 } 4751 } 4752 } 4753 } 4754 else if (*p == '%') 4755 { 4756 /* The number might be a predefined register. */ 4757 have_prefix = 1; 4758 name = p; 4759 p++; 4760 c = *p; 4761 /* Tege hack: Special case for general registers as the general 4762 code makes a binary search with case translation, and is VERY 4763 slow. */ 4764 if (c == 'r') 4765 { 4766 p++; 4767 if (*p == 'e' && *(p + 1) == 't' 4768 && (*(p + 2) == '0' || *(p + 2) == '1')) 4769 { 4770 p += 2; 4771 num = *p - '0' + 28; 4772 p++; 4773 } 4774 else if (*p == 'p') 4775 { 4776 num = 2; 4777 p++; 4778 } 4779 else if (!ISDIGIT (*p)) 4780 { 4781 if (print_errors) 4782 as_bad (_("Undefined register: '%s'."), name); 4783 num = -1; 4784 } 4785 else 4786 { 4787 do 4788 num = num * 10 + *p++ - '0'; 4789 while (ISDIGIT (*p)); 4790 } 4791 } 4792 else 4793 { 4794 /* Do a normal register search. */ 4795 while (is_part_of_name (c)) 4796 { 4797 p = p + 1; 4798 c = *p; 4799 } 4800 *p = 0; 4801 status = reg_name_search (name); 4802 if (status >= 0) 4803 num = status; 4804 else 4805 { 4806 if (print_errors) 4807 as_bad (_("Undefined register: '%s'."), name); 4808 num = -1; 4809 } 4810 *p = c; 4811 } 4812 4813 pa_number = num; 4814 } 4815 else 4816 { 4817 /* And finally, it could be a symbol in the absolute section which 4818 is effectively a constant, or a register alias symbol. */ 4819 name = p; 4820 c = *p; 4821 while (is_part_of_name (c)) 4822 { 4823 p = p + 1; 4824 c = *p; 4825 } 4826 *p = 0; 4827 if ((sym = symbol_find (name)) != NULL) 4828 { 4829 if (S_GET_SEGMENT (sym) == reg_section) 4830 { 4831 num = S_GET_VALUE (sym); 4832 /* Well, we don't really have one, but we do have a 4833 register, so... */ 4834 have_prefix = TRUE; 4835 } 4836 else if (S_GET_SEGMENT (sym) == &bfd_abs_section) 4837 num = S_GET_VALUE (sym); 4838 else if (!strict) 4839 { 4840 if (print_errors) 4841 as_bad (_("Non-absolute symbol: '%s'."), name); 4842 num = -1; 4843 } 4844 } 4845 else if (!strict) 4846 { 4847 /* There is where we'd come for an undefined symbol 4848 or for an empty string. For an empty string we 4849 will return zero. That's a concession made for 4850 compatibility with the braindamaged HP assemblers. */ 4851 if (*name == 0) 4852 num = 0; 4853 else 4854 { 4855 if (print_errors) 4856 as_bad (_("Undefined absolute constant: '%s'."), name); 4857 num = -1; 4858 } 4859 } 4860 *p = c; 4861 4862 pa_number = num; 4863 } 4864 4865 if (!strict || have_prefix) 4866 { 4867 *s = p; 4868 return 1; 4869 } 4870 return 0; 4871 } 4872 4873 #define REG_NAME_CNT (sizeof (pre_defined_registers) / sizeof (struct pd_reg)) 4874 4875 /* Given NAME, find the register number associated with that name, return 4876 the integer value associated with the given name or -1 on failure. */ 4877 4878 static int 4879 reg_name_search (name) 4880 char *name; 4881 { 4882 int middle, low, high; 4883 int cmp; 4884 4885 low = 0; 4886 high = REG_NAME_CNT - 1; 4887 4888 do 4889 { 4890 middle = (low + high) / 2; 4891 cmp = strcasecmp (name, pre_defined_registers[middle].name); 4892 if (cmp < 0) 4893 high = middle - 1; 4894 else if (cmp > 0) 4895 low = middle + 1; 4896 else 4897 return pre_defined_registers[middle].value; 4898 } 4899 while (low <= high); 4900 4901 return -1; 4902 } 4903 4904 /* Return nonzero if the given INSN and L/R information will require 4905 a new PA-1.1 opcode. */ 4906 4907 static int 4908 need_pa11_opcode () 4909 { 4910 if ((pa_number & FP_REG_RSEL) != 0 4911 && !(the_insn.fpof1 == DBL && the_insn.fpof2 == DBL)) 4912 { 4913 /* If this instruction is specific to a particular architecture, 4914 then set a new architecture. */ 4915 if (bfd_get_mach (stdoutput) < pa11) 4916 { 4917 if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, pa11)) 4918 as_warn (_("could not update architecture and machine")); 4919 } 4920 return TRUE; 4921 } 4922 else 4923 return FALSE; 4924 } 4925 4926 /* Parse a condition for a fcmp instruction. Return the numerical 4927 code associated with the condition. */ 4928 4929 static int 4930 pa_parse_fp_cmp_cond (s) 4931 char **s; 4932 { 4933 int cond, i; 4934 4935 cond = 0; 4936 4937 for (i = 0; i < 32; i++) 4938 { 4939 if (strncasecmp (*s, fp_cond_map[i].string, 4940 strlen (fp_cond_map[i].string)) == 0) 4941 { 4942 cond = fp_cond_map[i].cond; 4943 *s += strlen (fp_cond_map[i].string); 4944 /* If not a complete match, back up the input string and 4945 report an error. */ 4946 if (**s != ' ' && **s != '\t') 4947 { 4948 *s -= strlen (fp_cond_map[i].string); 4949 break; 4950 } 4951 while (**s == ' ' || **s == '\t') 4952 *s = *s + 1; 4953 return cond; 4954 } 4955 } 4956 4957 as_bad (_("Invalid FP Compare Condition: %s"), *s); 4958 4959 /* Advance over the bogus completer. */ 4960 while (**s != ',' && **s != ' ' && **s != '\t') 4961 *s += 1; 4962 4963 return 0; 4964 } 4965 4966 /* Parse a graphics test complete for ftest. */ 4967 4968 static int 4969 pa_parse_ftest_gfx_completer (s) 4970 char **s; 4971 { 4972 int value; 4973 4974 value = 0; 4975 if (strncasecmp (*s, "acc8", 4) == 0) 4976 { 4977 value = 5; 4978 *s += 4; 4979 } 4980 else if (strncasecmp (*s, "acc6", 4) == 0) 4981 { 4982 value = 9; 4983 *s += 4; 4984 } 4985 else if (strncasecmp (*s, "acc4", 4) == 0) 4986 { 4987 value = 13; 4988 *s += 4; 4989 } 4990 else if (strncasecmp (*s, "acc2", 4) == 0) 4991 { 4992 value = 17; 4993 *s += 4; 4994 } 4995 else if (strncasecmp (*s, "acc", 3) == 0) 4996 { 4997 value = 1; 4998 *s += 3; 4999 } 5000 else if (strncasecmp (*s, "rej8", 4) == 0) 5001 { 5002 value = 6; 5003 *s += 4; 5004 } 5005 else if (strncasecmp (*s, "rej", 3) == 0) 5006 { 5007 value = 2; 5008 *s += 3; 5009 } 5010 else 5011 { 5012 value = 0; 5013 as_bad (_("Invalid FTEST completer: %s"), *s); 5014 } 5015 5016 return value; 5017 } 5018 5019 /* Parse an FP operand format completer returning the completer 5020 type. */ 5021 5022 static fp_operand_format 5023 pa_parse_fp_cnv_format (s) 5024 char **s; 5025 { 5026 int format; 5027 5028 format = SGL; 5029 if (**s == ',') 5030 { 5031 *s += 1; 5032 if (strncasecmp (*s, "sgl", 3) == 0) 5033 { 5034 format = SGL; 5035 *s += 4; 5036 } 5037 else if (strncasecmp (*s, "dbl", 3) == 0) 5038 { 5039 format = DBL; 5040 *s += 4; 5041 } 5042 else if (strncasecmp (*s, "quad", 4) == 0) 5043 { 5044 format = QUAD; 5045 *s += 5; 5046 } 5047 else if (strncasecmp (*s, "w", 1) == 0) 5048 { 5049 format = W; 5050 *s += 2; 5051 } 5052 else if (strncasecmp (*s, "uw", 2) == 0) 5053 { 5054 format = UW; 5055 *s += 3; 5056 } 5057 else if (strncasecmp (*s, "dw", 2) == 0) 5058 { 5059 format = DW; 5060 *s += 3; 5061 } 5062 else if (strncasecmp (*s, "udw", 3) == 0) 5063 { 5064 format = UDW; 5065 *s += 4; 5066 } 5067 else if (strncasecmp (*s, "qw", 2) == 0) 5068 { 5069 format = QW; 5070 *s += 3; 5071 } 5072 else if (strncasecmp (*s, "uqw", 3) == 0) 5073 { 5074 format = UQW; 5075 *s += 4; 5076 } 5077 else 5078 { 5079 format = ILLEGAL_FMT; 5080 as_bad (_("Invalid FP Operand Format: %3s"), *s); 5081 } 5082 } 5083 5084 return format; 5085 } 5086 5087 /* Parse an FP operand format completer returning the completer 5088 type. */ 5089 5090 static fp_operand_format 5091 pa_parse_fp_format (s) 5092 char **s; 5093 { 5094 int format; 5095 5096 format = SGL; 5097 if (**s == ',') 5098 { 5099 *s += 1; 5100 if (strncasecmp (*s, "sgl", 3) == 0) 5101 { 5102 format = SGL; 5103 *s += 4; 5104 } 5105 else if (strncasecmp (*s, "dbl", 3) == 0) 5106 { 5107 format = DBL; 5108 *s += 4; 5109 } 5110 else if (strncasecmp (*s, "quad", 4) == 0) 5111 { 5112 format = QUAD; 5113 *s += 5; 5114 } 5115 else 5116 { 5117 format = ILLEGAL_FMT; 5118 as_bad (_("Invalid FP Operand Format: %3s"), *s); 5119 } 5120 } 5121 5122 return format; 5123 } 5124 5125 /* Convert from a selector string into a selector type. */ 5126 5127 static int 5128 pa_chk_field_selector (str) 5129 char **str; 5130 { 5131 int middle, low, high; 5132 int cmp; 5133 char name[4]; 5134 5135 /* Read past any whitespace. */ 5136 /* FIXME: should we read past newlines and formfeeds??? */ 5137 while (**str == ' ' || **str == '\t' || **str == '\n' || **str == '\f') 5138 *str = *str + 1; 5139 5140 if ((*str)[1] == '\'' || (*str)[1] == '%') 5141 name[0] = TOLOWER ((*str)[0]), 5142 name[1] = 0; 5143 else if ((*str)[2] == '\'' || (*str)[2] == '%') 5144 name[0] = TOLOWER ((*str)[0]), 5145 name[1] = TOLOWER ((*str)[1]), 5146 name[2] = 0; 5147 else if ((*str)[3] == '\'' || (*str)[3] == '%') 5148 name[0] = TOLOWER ((*str)[0]), 5149 name[1] = TOLOWER ((*str)[1]), 5150 name[2] = TOLOWER ((*str)[2]), 5151 name[3] = 0; 5152 else 5153 return e_fsel; 5154 5155 low = 0; 5156 high = sizeof (selector_table) / sizeof (struct selector_entry) - 1; 5157 5158 do 5159 { 5160 middle = (low + high) / 2; 5161 cmp = strcmp (name, selector_table[middle].prefix); 5162 if (cmp < 0) 5163 high = middle - 1; 5164 else if (cmp > 0) 5165 low = middle + 1; 5166 else 5167 { 5168 *str += strlen (name) + 1; 5169 #ifndef OBJ_SOM 5170 if (selector_table[middle].field_selector == e_nsel) 5171 return e_fsel; 5172 #endif 5173 return selector_table[middle].field_selector; 5174 } 5175 } 5176 while (low <= high); 5177 5178 return e_fsel; 5179 } 5180 5181 /* Mark (via expr_end) the end of an expression (I think). FIXME. */ 5182 5183 static int 5184 get_expression (str) 5185 char *str; 5186 { 5187 char *save_in; 5188 asection *seg; 5189 5190 save_in = input_line_pointer; 5191 input_line_pointer = str; 5192 seg = expression (&the_insn.exp); 5193 if (!(seg == absolute_section 5194 || seg == undefined_section 5195 || SEG_NORMAL (seg))) 5196 { 5197 as_warn (_("Bad segment in expression.")); 5198 expr_end = input_line_pointer; 5199 input_line_pointer = save_in; 5200 return 1; 5201 } 5202 expr_end = input_line_pointer; 5203 input_line_pointer = save_in; 5204 return 0; 5205 } 5206 5207 /* Mark (via expr_end) the end of an absolute expression. FIXME. */ 5208 static int 5209 pa_get_absolute_expression (insn, strp) 5210 struct pa_it *insn; 5211 char **strp; 5212 { 5213 char *save_in; 5214 5215 insn->field_selector = pa_chk_field_selector (strp); 5216 save_in = input_line_pointer; 5217 input_line_pointer = *strp; 5218 expression (&insn->exp); 5219 /* This is not perfect, but is a huge improvement over doing nothing. 5220 5221 The PA assembly syntax is ambiguous in a variety of ways. Consider 5222 this string "4 %r5" Is that the number 4 followed by the register 5223 r5, or is that 4 MOD r5? 5224 5225 If we get a modulo expression when looking for an absolute, we try 5226 again cutting off the input string at the first whitespace character. */ 5227 if (insn->exp.X_op == O_modulus) 5228 { 5229 char *s, c; 5230 int retval; 5231 5232 input_line_pointer = *strp; 5233 s = *strp; 5234 while (*s != ',' && *s != ' ' && *s != '\t') 5235 s++; 5236 5237 c = *s; 5238 *s = 0; 5239 5240 retval = pa_get_absolute_expression (insn, strp); 5241 5242 input_line_pointer = save_in; 5243 *s = c; 5244 return evaluate_absolute (insn); 5245 } 5246 /* When in strict mode we have a non-match, fix up the pointers 5247 and return to our caller. */ 5248 if (insn->exp.X_op != O_constant && strict) 5249 { 5250 expr_end = input_line_pointer; 5251 input_line_pointer = save_in; 5252 return 0; 5253 } 5254 if (insn->exp.X_op != O_constant) 5255 { 5256 as_bad (_("Bad segment (should be absolute).")); 5257 expr_end = input_line_pointer; 5258 input_line_pointer = save_in; 5259 return 0; 5260 } 5261 expr_end = input_line_pointer; 5262 input_line_pointer = save_in; 5263 return evaluate_absolute (insn); 5264 } 5265 5266 /* Evaluate an absolute expression EXP which may be modified by 5267 the selector FIELD_SELECTOR. Return the value of the expression. */ 5268 static int 5269 evaluate_absolute (insn) 5270 struct pa_it *insn; 5271 { 5272 offsetT value; 5273 expressionS exp; 5274 int field_selector = insn->field_selector; 5275 5276 exp = insn->exp; 5277 value = exp.X_add_number; 5278 5279 return hppa_field_adjust (0, value, field_selector); 5280 } 5281 5282 /* Given an argument location specification return the associated 5283 argument location number. */ 5284 5285 static unsigned int 5286 pa_build_arg_reloc (type_name) 5287 char *type_name; 5288 { 5289 5290 if (strncasecmp (type_name, "no", 2) == 0) 5291 return 0; 5292 if (strncasecmp (type_name, "gr", 2) == 0) 5293 return 1; 5294 else if (strncasecmp (type_name, "fr", 2) == 0) 5295 return 2; 5296 else if (strncasecmp (type_name, "fu", 2) == 0) 5297 return 3; 5298 else 5299 as_bad (_("Invalid argument location: %s\n"), type_name); 5300 5301 return 0; 5302 } 5303 5304 /* Encode and return an argument relocation specification for 5305 the given register in the location specified by arg_reloc. */ 5306 5307 static unsigned int 5308 pa_align_arg_reloc (reg, arg_reloc) 5309 unsigned int reg; 5310 unsigned int arg_reloc; 5311 { 5312 unsigned int new_reloc; 5313 5314 new_reloc = arg_reloc; 5315 switch (reg) 5316 { 5317 case 0: 5318 new_reloc <<= 8; 5319 break; 5320 case 1: 5321 new_reloc <<= 6; 5322 break; 5323 case 2: 5324 new_reloc <<= 4; 5325 break; 5326 case 3: 5327 new_reloc <<= 2; 5328 break; 5329 default: 5330 as_bad (_("Invalid argument description: %d"), reg); 5331 } 5332 5333 return new_reloc; 5334 } 5335 5336 /* Parse a PA nullification completer (,n). Return nonzero if the 5337 completer was found; return zero if no completer was found. */ 5338 5339 static int 5340 pa_parse_nullif (s) 5341 char **s; 5342 { 5343 int nullif; 5344 5345 nullif = 0; 5346 if (**s == ',') 5347 { 5348 *s = *s + 1; 5349 if (strncasecmp (*s, "n", 1) == 0) 5350 nullif = 1; 5351 else 5352 { 5353 as_bad (_("Invalid Nullification: (%c)"), **s); 5354 nullif = 0; 5355 } 5356 *s = *s + 1; 5357 } 5358 5359 return nullif; 5360 } 5361 5362 /* Parse a non-negated compare/subtract completer returning the 5363 number (for encoding in instructions) of the given completer. */ 5364 5365 static int 5366 pa_parse_nonneg_cmpsub_cmpltr (s) 5367 char **s; 5368 { 5369 int cmpltr; 5370 char *name = *s + 1; 5371 char c; 5372 char *save_s = *s; 5373 int nullify = 0; 5374 5375 cmpltr = 0; 5376 if (**s == ',') 5377 { 5378 *s += 1; 5379 while (**s != ',' && **s != ' ' && **s != '\t') 5380 *s += 1; 5381 c = **s; 5382 **s = 0x00; 5383 5384 if (strcmp (name, "=") == 0) 5385 { 5386 cmpltr = 1; 5387 } 5388 else if (strcmp (name, "<") == 0) 5389 { 5390 cmpltr = 2; 5391 } 5392 else if (strcmp (name, "<=") == 0) 5393 { 5394 cmpltr = 3; 5395 } 5396 else if (strcmp (name, "<<") == 0) 5397 { 5398 cmpltr = 4; 5399 } 5400 else if (strcmp (name, "<<=") == 0) 5401 { 5402 cmpltr = 5; 5403 } 5404 else if (strcasecmp (name, "sv") == 0) 5405 { 5406 cmpltr = 6; 5407 } 5408 else if (strcasecmp (name, "od") == 0) 5409 { 5410 cmpltr = 7; 5411 } 5412 /* If we have something like addb,n then there is no condition 5413 completer. */ 5414 else if (strcasecmp (name, "n") == 0) 5415 { 5416 cmpltr = 0; 5417 nullify = 1; 5418 } 5419 else 5420 { 5421 cmpltr = -1; 5422 } 5423 **s = c; 5424 } 5425 5426 /* Reset pointers if this was really a ,n for a branch instruction. */ 5427 if (nullify) 5428 *s = save_s; 5429 5430 return cmpltr; 5431 } 5432 5433 /* Parse a negated compare/subtract completer returning the 5434 number (for encoding in instructions) of the given completer. */ 5435 5436 static int 5437 pa_parse_neg_cmpsub_cmpltr (s) 5438 char **s; 5439 { 5440 int cmpltr; 5441 char *name = *s + 1; 5442 char c; 5443 char *save_s = *s; 5444 int nullify = 0; 5445 5446 cmpltr = 0; 5447 if (**s == ',') 5448 { 5449 *s += 1; 5450 while (**s != ',' && **s != ' ' && **s != '\t') 5451 *s += 1; 5452 c = **s; 5453 **s = 0x00; 5454 5455 if (strcasecmp (name, "tr") == 0) 5456 { 5457 cmpltr = 0; 5458 } 5459 else if (strcmp (name, "<>") == 0) 5460 { 5461 cmpltr = 1; 5462 } 5463 else if (strcmp (name, ">=") == 0) 5464 { 5465 cmpltr = 2; 5466 } 5467 else if (strcmp (name, ">") == 0) 5468 { 5469 cmpltr = 3; 5470 } 5471 else if (strcmp (name, ">>=") == 0) 5472 { 5473 cmpltr = 4; 5474 } 5475 else if (strcmp (name, ">>") == 0) 5476 { 5477 cmpltr = 5; 5478 } 5479 else if (strcasecmp (name, "nsv") == 0) 5480 { 5481 cmpltr = 6; 5482 } 5483 else if (strcasecmp (name, "ev") == 0) 5484 { 5485 cmpltr = 7; 5486 } 5487 /* If we have something like addb,n then there is no condition 5488 completer. */ 5489 else if (strcasecmp (name, "n") == 0) 5490 { 5491 cmpltr = 0; 5492 nullify = 1; 5493 } 5494 else 5495 { 5496 cmpltr = -1; 5497 } 5498 **s = c; 5499 } 5500 5501 /* Reset pointers if this was really a ,n for a branch instruction. */ 5502 if (nullify) 5503 *s = save_s; 5504 5505 return cmpltr; 5506 } 5507 5508 /* Parse a 64 bit compare and branch completer returning the number (for 5509 encoding in instructions) of the given completer. 5510 5511 Nonnegated comparisons are returned as 0-7, negated comparisons are 5512 returned as 8-15. */ 5513 5514 static int 5515 pa_parse_cmpb_64_cmpltr (s) 5516 char **s; 5517 { 5518 int cmpltr; 5519 char *name = *s + 1; 5520 char c; 5521 5522 cmpltr = -1; 5523 if (**s == ',') 5524 { 5525 *s += 1; 5526 while (**s != ',' && **s != ' ' && **s != '\t') 5527 *s += 1; 5528 c = **s; 5529 **s = 0x00; 5530 5531 if (strcmp (name, "*") == 0) 5532 { 5533 cmpltr = 0; 5534 } 5535 else if (strcmp (name, "*=") == 0) 5536 { 5537 cmpltr = 1; 5538 } 5539 else if (strcmp (name, "*<") == 0) 5540 { 5541 cmpltr = 2; 5542 } 5543 else if (strcmp (name, "*<=") == 0) 5544 { 5545 cmpltr = 3; 5546 } 5547 else if (strcmp (name, "*<<") == 0) 5548 { 5549 cmpltr = 4; 5550 } 5551 else if (strcmp (name, "*<<=") == 0) 5552 { 5553 cmpltr = 5; 5554 } 5555 else if (strcasecmp (name, "*sv") == 0) 5556 { 5557 cmpltr = 6; 5558 } 5559 else if (strcasecmp (name, "*od") == 0) 5560 { 5561 cmpltr = 7; 5562 } 5563 else if (strcasecmp (name, "*tr") == 0) 5564 { 5565 cmpltr = 8; 5566 } 5567 else if (strcmp (name, "*<>") == 0) 5568 { 5569 cmpltr = 9; 5570 } 5571 else if (strcmp (name, "*>=") == 0) 5572 { 5573 cmpltr = 10; 5574 } 5575 else if (strcmp (name, "*>") == 0) 5576 { 5577 cmpltr = 11; 5578 } 5579 else if (strcmp (name, "*>>=") == 0) 5580 { 5581 cmpltr = 12; 5582 } 5583 else if (strcmp (name, "*>>") == 0) 5584 { 5585 cmpltr = 13; 5586 } 5587 else if (strcasecmp (name, "*nsv") == 0) 5588 { 5589 cmpltr = 14; 5590 } 5591 else if (strcasecmp (name, "*ev") == 0) 5592 { 5593 cmpltr = 15; 5594 } 5595 else 5596 { 5597 cmpltr = -1; 5598 } 5599 **s = c; 5600 } 5601 5602 return cmpltr; 5603 } 5604 5605 /* Parse a 64 bit compare immediate and branch completer returning the number 5606 (for encoding in instructions) of the given completer. */ 5607 5608 static int 5609 pa_parse_cmpib_64_cmpltr (s) 5610 char **s; 5611 { 5612 int cmpltr; 5613 char *name = *s + 1; 5614 char c; 5615 5616 cmpltr = -1; 5617 if (**s == ',') 5618 { 5619 *s += 1; 5620 while (**s != ',' && **s != ' ' && **s != '\t') 5621 *s += 1; 5622 c = **s; 5623 **s = 0x00; 5624 5625 if (strcmp (name, "*<<") == 0) 5626 { 5627 cmpltr = 0; 5628 } 5629 else if (strcmp (name, "*=") == 0) 5630 { 5631 cmpltr = 1; 5632 } 5633 else if (strcmp (name, "*<") == 0) 5634 { 5635 cmpltr = 2; 5636 } 5637 else if (strcmp (name, "*<=") == 0) 5638 { 5639 cmpltr = 3; 5640 } 5641 else if (strcmp (name, "*>>=") == 0) 5642 { 5643 cmpltr = 4; 5644 } 5645 else if (strcmp (name, "*<>") == 0) 5646 { 5647 cmpltr = 5; 5648 } 5649 else if (strcasecmp (name, "*>=") == 0) 5650 { 5651 cmpltr = 6; 5652 } 5653 else if (strcasecmp (name, "*>") == 0) 5654 { 5655 cmpltr = 7; 5656 } 5657 else 5658 { 5659 cmpltr = -1; 5660 } 5661 **s = c; 5662 } 5663 5664 return cmpltr; 5665 } 5666 5667 /* Parse a non-negated addition completer returning the number 5668 (for encoding in instructions) of the given completer. */ 5669 5670 static int 5671 pa_parse_nonneg_add_cmpltr (s) 5672 char **s; 5673 { 5674 int cmpltr; 5675 char *name = *s + 1; 5676 char c; 5677 char *save_s = *s; 5678 int nullify = 0; 5679 5680 cmpltr = 0; 5681 if (**s == ',') 5682 { 5683 *s += 1; 5684 while (**s != ',' && **s != ' ' && **s != '\t') 5685 *s += 1; 5686 c = **s; 5687 **s = 0x00; 5688 if (strcmp (name, "=") == 0) 5689 { 5690 cmpltr = 1; 5691 } 5692 else if (strcmp (name, "<") == 0) 5693 { 5694 cmpltr = 2; 5695 } 5696 else if (strcmp (name, "<=") == 0) 5697 { 5698 cmpltr = 3; 5699 } 5700 else if (strcasecmp (name, "nuv") == 0) 5701 { 5702 cmpltr = 4; 5703 } 5704 else if (strcasecmp (name, "znv") == 0) 5705 { 5706 cmpltr = 5; 5707 } 5708 else if (strcasecmp (name, "sv") == 0) 5709 { 5710 cmpltr = 6; 5711 } 5712 else if (strcasecmp (name, "od") == 0) 5713 { 5714 cmpltr = 7; 5715 } 5716 /* If we have something like addb,n then there is no condition 5717 completer. */ 5718 else if (strcasecmp (name, "n") == 0) 5719 { 5720 cmpltr = 0; 5721 nullify = 1; 5722 } 5723 else 5724 { 5725 cmpltr = -1; 5726 } 5727 **s = c; 5728 } 5729 5730 /* Reset pointers if this was really a ,n for a branch instruction. */ 5731 if (nullify) 5732 *s = save_s; 5733 5734 return cmpltr; 5735 } 5736 5737 /* Parse a negated addition completer returning the number 5738 (for encoding in instructions) of the given completer. */ 5739 5740 static int 5741 pa_parse_neg_add_cmpltr (s) 5742 char **s; 5743 { 5744 int cmpltr; 5745 char *name = *s + 1; 5746 char c; 5747 char *save_s = *s; 5748 int nullify = 0; 5749 5750 cmpltr = 0; 5751 if (**s == ',') 5752 { 5753 *s += 1; 5754 while (**s != ',' && **s != ' ' && **s != '\t') 5755 *s += 1; 5756 c = **s; 5757 **s = 0x00; 5758 if (strcasecmp (name, "tr") == 0) 5759 { 5760 cmpltr = 0; 5761 } 5762 else if (strcmp (name, "<>") == 0) 5763 { 5764 cmpltr = 1; 5765 } 5766 else if (strcmp (name, ">=") == 0) 5767 { 5768 cmpltr = 2; 5769 } 5770 else if (strcmp (name, ">") == 0) 5771 { 5772 cmpltr = 3; 5773 } 5774 else if (strcasecmp (name, "uv") == 0) 5775 { 5776 cmpltr = 4; 5777 } 5778 else if (strcasecmp (name, "vnz") == 0) 5779 { 5780 cmpltr = 5; 5781 } 5782 else if (strcasecmp (name, "nsv") == 0) 5783 { 5784 cmpltr = 6; 5785 } 5786 else if (strcasecmp (name, "ev") == 0) 5787 { 5788 cmpltr = 7; 5789 } 5790 /* If we have something like addb,n then there is no condition 5791 completer. */ 5792 else if (strcasecmp (name, "n") == 0) 5793 { 5794 cmpltr = 0; 5795 nullify = 1; 5796 } 5797 else 5798 { 5799 cmpltr = -1; 5800 } 5801 **s = c; 5802 } 5803 5804 /* Reset pointers if this was really a ,n for a branch instruction. */ 5805 if (nullify) 5806 *s = save_s; 5807 5808 return cmpltr; 5809 } 5810 5811 /* Parse a 64 bit wide mode add and branch completer returning the number (for 5812 encoding in instructions) of the given completer. */ 5813 5814 static int 5815 pa_parse_addb_64_cmpltr (s) 5816 char **s; 5817 { 5818 int cmpltr; 5819 char *name = *s + 1; 5820 char c; 5821 char *save_s = *s; 5822 int nullify = 0; 5823 5824 cmpltr = 0; 5825 if (**s == ',') 5826 { 5827 *s += 1; 5828 while (**s != ',' && **s != ' ' && **s != '\t') 5829 *s += 1; 5830 c = **s; 5831 **s = 0x00; 5832 if (strcmp (name, "=") == 0) 5833 { 5834 cmpltr = 1; 5835 } 5836 else if (strcmp (name, "<") == 0) 5837 { 5838 cmpltr = 2; 5839 } 5840 else if (strcmp (name, "<=") == 0) 5841 { 5842 cmpltr = 3; 5843 } 5844 else if (strcasecmp (name, "nuv") == 0) 5845 { 5846 cmpltr = 4; 5847 } 5848 else if (strcasecmp (name, "*=") == 0) 5849 { 5850 cmpltr = 5; 5851 } 5852 else if (strcasecmp (name, "*<") == 0) 5853 { 5854 cmpltr = 6; 5855 } 5856 else if (strcasecmp (name, "*<=") == 0) 5857 { 5858 cmpltr = 7; 5859 } 5860 else if (strcmp (name, "tr") == 0) 5861 { 5862 cmpltr = 8; 5863 } 5864 else if (strcmp (name, "<>") == 0) 5865 { 5866 cmpltr = 9; 5867 } 5868 else if (strcmp (name, ">=") == 0) 5869 { 5870 cmpltr = 10; 5871 } 5872 else if (strcmp (name, ">") == 0) 5873 { 5874 cmpltr = 11; 5875 } 5876 else if (strcasecmp (name, "uv") == 0) 5877 { 5878 cmpltr = 12; 5879 } 5880 else if (strcasecmp (name, "*<>") == 0) 5881 { 5882 cmpltr = 13; 5883 } 5884 else if (strcasecmp (name, "*>=") == 0) 5885 { 5886 cmpltr = 14; 5887 } 5888 else if (strcasecmp (name, "*>") == 0) 5889 { 5890 cmpltr = 15; 5891 } 5892 /* If we have something like addb,n then there is no condition 5893 completer. */ 5894 else if (strcasecmp (name, "n") == 0) 5895 { 5896 cmpltr = 0; 5897 nullify = 1; 5898 } 5899 else 5900 { 5901 cmpltr = -1; 5902 } 5903 **s = c; 5904 } 5905 5906 /* Reset pointers if this was really a ,n for a branch instruction. */ 5907 if (nullify) 5908 *s = save_s; 5909 5910 return cmpltr; 5911 } 5912 5913 #ifdef OBJ_SOM 5914 /* Handle an alignment directive. Special so that we can update the 5915 alignment of the subspace if necessary. */ 5916 static void 5917 pa_align (bytes) 5918 int bytes; 5919 { 5920 /* We must have a valid space and subspace. */ 5921 pa_check_current_space_and_subspace (); 5922 5923 /* Let the generic gas code do most of the work. */ 5924 s_align_bytes (bytes); 5925 5926 /* If bytes is a power of 2, then update the current subspace's 5927 alignment if necessary. */ 5928 if (log2 (bytes) != -1) 5929 record_alignment (current_subspace->ssd_seg, log2 (bytes)); 5930 } 5931 #endif 5932 5933 /* Handle a .BLOCK type pseudo-op. */ 5934 5935 static void 5936 pa_block (z) 5937 int z ATTRIBUTE_UNUSED; 5938 { 5939 char *p; 5940 long int temp_fill; 5941 unsigned int temp_size; 5942 unsigned int i; 5943 5944 #ifdef OBJ_SOM 5945 /* We must have a valid space and subspace. */ 5946 pa_check_current_space_and_subspace (); 5947 #endif 5948 5949 temp_size = get_absolute_expression (); 5950 5951 /* Always fill with zeros, that's what the HP assembler does. */ 5952 temp_fill = 0; 5953 5954 p = frag_var (rs_fill, (int) temp_size, (int) temp_size, 5955 (relax_substateT) 0, (symbolS *) 0, (offsetT) 1, NULL); 5956 memset (p, 0, temp_size); 5957 5958 /* Convert 2 bytes at a time. */ 5959 5960 for (i = 0; i < temp_size; i += 2) 5961 { 5962 md_number_to_chars (p + i, 5963 (valueT) temp_fill, 5964 (int) ((temp_size - i) > 2 ? 2 : (temp_size - i))); 5965 } 5966 5967 pa_undefine_label (); 5968 demand_empty_rest_of_line (); 5969 } 5970 5971 /* Handle a .begin_brtab and .end_brtab pseudo-op. */ 5972 5973 static void 5974 pa_brtab (begin) 5975 int begin ATTRIBUTE_UNUSED; 5976 { 5977 5978 #ifdef OBJ_SOM 5979 /* The BRTAB relocations are only available in SOM (to denote 5980 the beginning and end of branch tables). */ 5981 char *where = frag_more (0); 5982 5983 fix_new_hppa (frag_now, where - frag_now->fr_literal, 0, 5984 NULL, (offsetT) 0, NULL, 5985 0, begin ? R_HPPA_BEGIN_BRTAB : R_HPPA_END_BRTAB, 5986 e_fsel, 0, 0, 0); 5987 #endif 5988 5989 demand_empty_rest_of_line (); 5990 } 5991 5992 /* Handle a .begin_try and .end_try pseudo-op. */ 5993 5994 static void 5995 pa_try (begin) 5996 int begin ATTRIBUTE_UNUSED; 5997 { 5998 #ifdef OBJ_SOM 5999 expressionS exp; 6000 char *where = frag_more (0); 6001 6002 if (! begin) 6003 expression (&exp); 6004 6005 /* The TRY relocations are only available in SOM (to denote 6006 the beginning and end of exception handling regions). */ 6007 6008 fix_new_hppa (frag_now, where - frag_now->fr_literal, 0, 6009 NULL, (offsetT) 0, begin ? NULL : &exp, 6010 0, begin ? R_HPPA_BEGIN_TRY : R_HPPA_END_TRY, 6011 e_fsel, 0, 0, 0); 6012 #endif 6013 6014 demand_empty_rest_of_line (); 6015 } 6016 6017 /* Handle a .CALL pseudo-op. This involves storing away information 6018 about where arguments are to be found so the linker can detect 6019 (and correct) argument location mismatches between caller and callee. */ 6020 6021 static void 6022 pa_call (unused) 6023 int unused ATTRIBUTE_UNUSED; 6024 { 6025 #ifdef OBJ_SOM 6026 /* We must have a valid space and subspace. */ 6027 pa_check_current_space_and_subspace (); 6028 #endif 6029 6030 pa_call_args (&last_call_desc); 6031 demand_empty_rest_of_line (); 6032 } 6033 6034 /* Do the dirty work of building a call descriptor which describes 6035 where the caller placed arguments to a function call. */ 6036 6037 static void 6038 pa_call_args (call_desc) 6039 struct call_desc *call_desc; 6040 { 6041 char *name, c, *p; 6042 unsigned int temp, arg_reloc; 6043 6044 while (!is_end_of_statement ()) 6045 { 6046 name = input_line_pointer; 6047 c = get_symbol_end (); 6048 /* Process a source argument. */ 6049 if ((strncasecmp (name, "argw", 4) == 0)) 6050 { 6051 temp = atoi (name + 4); 6052 p = input_line_pointer; 6053 *p = c; 6054 input_line_pointer++; 6055 name = input_line_pointer; 6056 c = get_symbol_end (); 6057 arg_reloc = pa_build_arg_reloc (name); 6058 call_desc->arg_reloc |= pa_align_arg_reloc (temp, arg_reloc); 6059 } 6060 /* Process a return value. */ 6061 else if ((strncasecmp (name, "rtnval", 6) == 0)) 6062 { 6063 p = input_line_pointer; 6064 *p = c; 6065 input_line_pointer++; 6066 name = input_line_pointer; 6067 c = get_symbol_end (); 6068 arg_reloc = pa_build_arg_reloc (name); 6069 call_desc->arg_reloc |= (arg_reloc & 0x3); 6070 } 6071 else 6072 { 6073 as_bad (_("Invalid .CALL argument: %s"), name); 6074 } 6075 p = input_line_pointer; 6076 *p = c; 6077 if (!is_end_of_statement ()) 6078 input_line_pointer++; 6079 } 6080 } 6081 6082 /* Return TRUE if FRAG1 and FRAG2 are the same. */ 6083 6084 static int 6085 is_same_frag (frag1, frag2) 6086 fragS *frag1; 6087 fragS *frag2; 6088 { 6089 6090 if (frag1 == NULL) 6091 return (FALSE); 6092 else if (frag2 == NULL) 6093 return (FALSE); 6094 else if (frag1 == frag2) 6095 return (TRUE); 6096 else if (frag2->fr_type == rs_fill && frag2->fr_fix == 0) 6097 return (is_same_frag (frag1, frag2->fr_next)); 6098 else 6099 return (FALSE); 6100 } 6101 6102 #ifdef OBJ_ELF 6103 /* Build an entry in the UNWIND subspace from the given function 6104 attributes in CALL_INFO. This is not needed for SOM as using 6105 R_ENTRY and R_EXIT relocations allow the linker to handle building 6106 of the unwind spaces. */ 6107 6108 static void 6109 pa_build_unwind_subspace (call_info) 6110 struct call_info *call_info; 6111 { 6112 asection *seg, *save_seg; 6113 subsegT save_subseg; 6114 unsigned int unwind; 6115 int reloc; 6116 char *p; 6117 6118 if ((bfd_get_section_flags (stdoutput, now_seg) 6119 & (SEC_ALLOC | SEC_LOAD | SEC_READONLY)) 6120 != (SEC_ALLOC | SEC_LOAD | SEC_READONLY)) 6121 return; 6122 6123 reloc = R_PARISC_SEGREL32; 6124 save_seg = now_seg; 6125 save_subseg = now_subseg; 6126 /* Get into the right seg/subseg. This may involve creating 6127 the seg the first time through. Make sure to have the 6128 old seg/subseg so that we can reset things when we are done. */ 6129 seg = bfd_get_section_by_name (stdoutput, UNWIND_SECTION_NAME); 6130 if (seg == ASEC_NULL) 6131 { 6132 seg = subseg_new (UNWIND_SECTION_NAME, 0); 6133 bfd_set_section_flags (stdoutput, seg, 6134 SEC_READONLY | SEC_HAS_CONTENTS 6135 | SEC_LOAD | SEC_RELOC | SEC_ALLOC | SEC_DATA); 6136 bfd_set_section_alignment (stdoutput, seg, 2); 6137 } 6138 6139 subseg_set (seg, 0); 6140 6141 /* Get some space to hold relocation information for the unwind 6142 descriptor. */ 6143 p = frag_more (16); 6144 6145 /* Relocation info. for start offset of the function. */ 6146 md_number_to_chars (p, 0, 4); 6147 fix_new_hppa (frag_now, p - frag_now->fr_literal, 4, 6148 call_info->start_symbol, (offsetT) 0, 6149 (expressionS *) NULL, 0, reloc, 6150 e_fsel, 32, 0, 0); 6151 6152 /* Relocation info. for end offset of the function. 6153 6154 Because we allow reductions of 32bit relocations for ELF, this will be 6155 reduced to section_sym + offset which avoids putting the temporary 6156 symbol into the symbol table. It (should) end up giving the same 6157 value as call_info->start_symbol + function size once the linker is 6158 finished with its work. */ 6159 md_number_to_chars (p + 4, 0, 4); 6160 fix_new_hppa (frag_now, p + 4 - frag_now->fr_literal, 4, 6161 call_info->end_symbol, (offsetT) 0, 6162 (expressionS *) NULL, 0, reloc, 6163 e_fsel, 32, 0, 0); 6164 6165 /* Dump the descriptor. */ 6166 unwind = UNWIND_LOW32 (&call_info->ci_unwind.descriptor); 6167 md_number_to_chars (p + 8, unwind, 4); 6168 6169 unwind = UNWIND_HIGH32 (&call_info->ci_unwind.descriptor); 6170 md_number_to_chars (p + 12, unwind, 4); 6171 6172 /* Return back to the original segment/subsegment. */ 6173 subseg_set (save_seg, save_subseg); 6174 } 6175 #endif 6176 6177 /* Process a .CALLINFO pseudo-op. This information is used later 6178 to build unwind descriptors and maybe one day to support 6179 .ENTER and .LEAVE. */ 6180 6181 static void 6182 pa_callinfo (unused) 6183 int unused ATTRIBUTE_UNUSED; 6184 { 6185 char *name, c, *p; 6186 int temp; 6187 6188 #ifdef OBJ_SOM 6189 /* We must have a valid space and subspace. */ 6190 pa_check_current_space_and_subspace (); 6191 #endif 6192 6193 /* .CALLINFO must appear within a procedure definition. */ 6194 if (!within_procedure) 6195 as_bad (_(".callinfo is not within a procedure definition")); 6196 6197 /* Mark the fact that we found the .CALLINFO for the 6198 current procedure. */ 6199 callinfo_found = TRUE; 6200 6201 /* Iterate over the .CALLINFO arguments. */ 6202 while (!is_end_of_statement ()) 6203 { 6204 name = input_line_pointer; 6205 c = get_symbol_end (); 6206 /* Frame size specification. */ 6207 if ((strncasecmp (name, "frame", 5) == 0)) 6208 { 6209 p = input_line_pointer; 6210 *p = c; 6211 input_line_pointer++; 6212 temp = get_absolute_expression (); 6213 if ((temp & 0x3) != 0) 6214 { 6215 as_bad (_("FRAME parameter must be a multiple of 8: %d\n"), temp); 6216 temp = 0; 6217 } 6218 6219 /* callinfo is in bytes and unwind_desc is in 8 byte units. */ 6220 last_call_info->ci_unwind.descriptor.frame_size = temp / 8; 6221 6222 } 6223 /* Entry register (GR, GR and SR) specifications. */ 6224 else if ((strncasecmp (name, "entry_gr", 8) == 0)) 6225 { 6226 p = input_line_pointer; 6227 *p = c; 6228 input_line_pointer++; 6229 temp = get_absolute_expression (); 6230 /* The HP assembler accepts 19 as the high bound for ENTRY_GR 6231 even though %r19 is caller saved. I think this is a bug in 6232 the HP assembler, and we are not going to emulate it. */ 6233 if (temp < 3 || temp > 18) 6234 as_bad (_("Value for ENTRY_GR must be in the range 3..18\n")); 6235 last_call_info->ci_unwind.descriptor.entry_gr = temp - 2; 6236 } 6237 else if ((strncasecmp (name, "entry_fr", 8) == 0)) 6238 { 6239 p = input_line_pointer; 6240 *p = c; 6241 input_line_pointer++; 6242 temp = get_absolute_expression (); 6243 /* Similarly the HP assembler takes 31 as the high bound even 6244 though %fr21 is the last callee saved floating point register. */ 6245 if (temp < 12 || temp > 21) 6246 as_bad (_("Value for ENTRY_FR must be in the range 12..21\n")); 6247 last_call_info->ci_unwind.descriptor.entry_fr = temp - 11; 6248 } 6249 else if ((strncasecmp (name, "entry_sr", 8) == 0)) 6250 { 6251 p = input_line_pointer; 6252 *p = c; 6253 input_line_pointer++; 6254 temp = get_absolute_expression (); 6255 if (temp != 3) 6256 as_bad (_("Value for ENTRY_SR must be 3\n")); 6257 } 6258 /* Note whether or not this function performs any calls. */ 6259 else if ((strncasecmp (name, "calls", 5) == 0) || 6260 (strncasecmp (name, "caller", 6) == 0)) 6261 { 6262 p = input_line_pointer; 6263 *p = c; 6264 } 6265 else if ((strncasecmp (name, "no_calls", 8) == 0)) 6266 { 6267 p = input_line_pointer; 6268 *p = c; 6269 } 6270 /* Should RP be saved into the stack. */ 6271 else if ((strncasecmp (name, "save_rp", 7) == 0)) 6272 { 6273 p = input_line_pointer; 6274 *p = c; 6275 last_call_info->ci_unwind.descriptor.save_rp = 1; 6276 } 6277 /* Likewise for SP. */ 6278 else if ((strncasecmp (name, "save_sp", 7) == 0)) 6279 { 6280 p = input_line_pointer; 6281 *p = c; 6282 last_call_info->ci_unwind.descriptor.save_sp = 1; 6283 } 6284 /* Is this an unwindable procedure. If so mark it so 6285 in the unwind descriptor. */ 6286 else if ((strncasecmp (name, "no_unwind", 9) == 0)) 6287 { 6288 p = input_line_pointer; 6289 *p = c; 6290 last_call_info->ci_unwind.descriptor.cannot_unwind = 1; 6291 } 6292 /* Is this an interrupt routine. If so mark it in the 6293 unwind descriptor. */ 6294 else if ((strncasecmp (name, "hpux_int", 7) == 0)) 6295 { 6296 p = input_line_pointer; 6297 *p = c; 6298 last_call_info->ci_unwind.descriptor.hpux_interrupt_marker = 1; 6299 } 6300 /* Is this a millicode routine. "millicode" isn't in my 6301 assembler manual, but my copy is old. The HP assembler 6302 accepts it, and there's a place in the unwind descriptor 6303 to drop the information, so we'll accept it too. */ 6304 else if ((strncasecmp (name, "millicode", 9) == 0)) 6305 { 6306 p = input_line_pointer; 6307 *p = c; 6308 last_call_info->ci_unwind.descriptor.millicode = 1; 6309 } 6310 else 6311 { 6312 as_bad (_("Invalid .CALLINFO argument: %s"), name); 6313 *input_line_pointer = c; 6314 } 6315 if (!is_end_of_statement ()) 6316 input_line_pointer++; 6317 } 6318 6319 demand_empty_rest_of_line (); 6320 } 6321 6322 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD))) 6323 /* Switch to the text space. Like s_text, but delete our 6324 label when finished. */ 6325 static void 6326 pa_text (unused) 6327 int unused ATTRIBUTE_UNUSED; 6328 { 6329 #ifdef OBJ_SOM 6330 current_space = is_defined_space ("$TEXT$"); 6331 current_subspace 6332 = pa_subsegment_to_subspace (current_space->sd_seg, 0); 6333 #endif 6334 6335 s_text (0); 6336 pa_undefine_label (); 6337 } 6338 6339 /* Switch to the data space. As usual delete our label. */ 6340 static void 6341 pa_data (unused) 6342 int unused ATTRIBUTE_UNUSED; 6343 { 6344 #ifdef OBJ_SOM 6345 current_space = is_defined_space ("$PRIVATE$"); 6346 current_subspace 6347 = pa_subsegment_to_subspace (current_space->sd_seg, 0); 6348 #endif 6349 s_data (0); 6350 pa_undefine_label (); 6351 } 6352 6353 /* This is different than the standard GAS s_comm(). On HP9000/800 machines, 6354 the .comm pseudo-op has the following symtax: 6355 6356 <label> .comm <length> 6357 6358 where <label> is optional and is a symbol whose address will be the start of 6359 a block of memory <length> bytes long. <length> must be an absolute 6360 expression. <length> bytes will be allocated in the current space 6361 and subspace. 6362 6363 Also note the label may not even be on the same line as the .comm. 6364 6365 This difference in syntax means the colon function will be called 6366 on the symbol before we arrive in pa_comm. colon will set a number 6367 of attributes of the symbol that need to be fixed here. In particular 6368 the value, section pointer, fragment pointer, flags, etc. What 6369 a pain. 6370 6371 This also makes error detection all but impossible. */ 6372 6373 static void 6374 pa_comm (unused) 6375 int unused ATTRIBUTE_UNUSED; 6376 { 6377 unsigned int size; 6378 symbolS *symbol; 6379 label_symbol_struct *label_symbol = pa_get_label (); 6380 6381 if (label_symbol) 6382 symbol = label_symbol->lss_label; 6383 else 6384 symbol = NULL; 6385 6386 SKIP_WHITESPACE (); 6387 size = get_absolute_expression (); 6388 6389 if (symbol) 6390 { 6391 symbol_get_bfdsym (symbol)->flags |= BSF_OBJECT; 6392 S_SET_VALUE (symbol, size); 6393 S_SET_SEGMENT (symbol, bfd_und_section_ptr); 6394 S_SET_EXTERNAL (symbol); 6395 6396 /* colon() has already set the frag to the current location in the 6397 current subspace; we need to reset the fragment to the zero address 6398 fragment. We also need to reset the segment pointer. */ 6399 symbol_set_frag (symbol, &zero_address_frag); 6400 } 6401 demand_empty_rest_of_line (); 6402 } 6403 #endif /* !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD))) */ 6404 6405 /* Process a .END pseudo-op. */ 6406 6407 static void 6408 pa_end (unused) 6409 int unused ATTRIBUTE_UNUSED; 6410 { 6411 demand_empty_rest_of_line (); 6412 } 6413 6414 /* Process a .ENTER pseudo-op. This is not supported. */ 6415 static void 6416 pa_enter (unused) 6417 int unused ATTRIBUTE_UNUSED; 6418 { 6419 #ifdef OBJ_SOM 6420 /* We must have a valid space and subspace. */ 6421 pa_check_current_space_and_subspace (); 6422 #endif 6423 6424 as_bad (_("The .ENTER pseudo-op is not supported")); 6425 demand_empty_rest_of_line (); 6426 } 6427 6428 /* Process a .ENTRY pseudo-op. .ENTRY marks the beginning of the 6429 procedure. */ 6430 static void 6431 pa_entry (unused) 6432 int unused ATTRIBUTE_UNUSED; 6433 { 6434 #ifdef OBJ_SOM 6435 /* We must have a valid space and subspace. */ 6436 pa_check_current_space_and_subspace (); 6437 #endif 6438 6439 if (!within_procedure) 6440 as_bad (_("Misplaced .entry. Ignored.")); 6441 else 6442 { 6443 if (!callinfo_found) 6444 as_bad (_("Missing .callinfo.")); 6445 } 6446 demand_empty_rest_of_line (); 6447 within_entry_exit = TRUE; 6448 6449 #ifdef OBJ_SOM 6450 /* SOM defers building of unwind descriptors until the link phase. 6451 The assembler is responsible for creating an R_ENTRY relocation 6452 to mark the beginning of a region and hold the unwind bits, and 6453 for creating an R_EXIT relocation to mark the end of the region. 6454 6455 FIXME. ELF should be using the same conventions! The problem 6456 is an unwind requires too much relocation space. Hmmm. Maybe 6457 if we split the unwind bits up between the relocations which 6458 denote the entry and exit points. */ 6459 if (last_call_info->start_symbol != NULL) 6460 { 6461 char *where; 6462 unsigned int u; 6463 6464 where = frag_more (0); 6465 u = UNWIND_LOW32 (&last_call_info->ci_unwind.descriptor); 6466 fix_new_hppa (frag_now, where - frag_now->fr_literal, 0, 6467 NULL, (offsetT) 0, NULL, 6468 0, R_HPPA_ENTRY, e_fsel, 0, 0, u); 6469 } 6470 #endif 6471 } 6472 6473 /* Silly nonsense for pa_equ. The only half-sensible use for this is 6474 being able to subtract two register symbols that specify a range of 6475 registers, to get the size of the range. */ 6476 static int fudge_reg_expressions; 6477 6478 int 6479 hppa_force_reg_syms_absolute (resultP, op, rightP) 6480 expressionS *resultP; 6481 operatorT op ATTRIBUTE_UNUSED; 6482 expressionS *rightP; 6483 { 6484 if (fudge_reg_expressions 6485 && rightP->X_op == O_register 6486 && resultP->X_op == O_register) 6487 { 6488 rightP->X_op = O_constant; 6489 resultP->X_op = O_constant; 6490 } 6491 return 0; /* Continue normal expr handling. */ 6492 } 6493 6494 /* Handle a .EQU pseudo-op. */ 6495 6496 static void 6497 pa_equ (reg) 6498 int reg; 6499 { 6500 label_symbol_struct *label_symbol = pa_get_label (); 6501 symbolS *symbol; 6502 6503 if (label_symbol) 6504 { 6505 symbol = label_symbol->lss_label; 6506 if (reg) 6507 { 6508 strict = 1; 6509 if (!pa_parse_number (&input_line_pointer, 0)) 6510 as_bad (_(".REG expression must be a register")); 6511 S_SET_VALUE (symbol, pa_number); 6512 S_SET_SEGMENT (symbol, reg_section); 6513 } 6514 else 6515 { 6516 expressionS exp; 6517 segT seg; 6518 6519 fudge_reg_expressions = 1; 6520 seg = expression (&exp); 6521 fudge_reg_expressions = 0; 6522 if (exp.X_op != O_constant 6523 && exp.X_op != O_register) 6524 { 6525 if (exp.X_op != O_absent) 6526 as_bad (_("bad or irreducible absolute expression; zero assumed")); 6527 exp.X_add_number = 0; 6528 seg = absolute_section; 6529 } 6530 S_SET_VALUE (symbol, (unsigned int) exp.X_add_number); 6531 S_SET_SEGMENT (symbol, seg); 6532 } 6533 } 6534 else 6535 { 6536 if (reg) 6537 as_bad (_(".REG must use a label")); 6538 else 6539 as_bad (_(".EQU must use a label")); 6540 } 6541 6542 pa_undefine_label (); 6543 demand_empty_rest_of_line (); 6544 } 6545 6546 /* Helper function. Does processing for the end of a function. This 6547 usually involves creating some relocations or building special 6548 symbols to mark the end of the function. */ 6549 6550 static void 6551 process_exit () 6552 { 6553 char *where; 6554 6555 where = frag_more (0); 6556 6557 #ifdef OBJ_ELF 6558 /* Mark the end of the function, stuff away the location of the frag 6559 for the end of the function, and finally call pa_build_unwind_subspace 6560 to add an entry in the unwind table. */ 6561 hppa_elf_mark_end_of_function (); 6562 pa_build_unwind_subspace (last_call_info); 6563 #else 6564 /* SOM defers building of unwind descriptors until the link phase. 6565 The assembler is responsible for creating an R_ENTRY relocation 6566 to mark the beginning of a region and hold the unwind bits, and 6567 for creating an R_EXIT relocation to mark the end of the region. 6568 6569 FIXME. ELF should be using the same conventions! The problem 6570 is an unwind requires too much relocation space. Hmmm. Maybe 6571 if we split the unwind bits up between the relocations which 6572 denote the entry and exit points. */ 6573 fix_new_hppa (frag_now, where - frag_now->fr_literal, 0, 6574 NULL, (offsetT) 0, 6575 NULL, 0, R_HPPA_EXIT, e_fsel, 0, 0, 6576 UNWIND_HIGH32 (&last_call_info->ci_unwind.descriptor)); 6577 #endif 6578 } 6579 6580 /* Process a .EXIT pseudo-op. */ 6581 6582 static void 6583 pa_exit (unused) 6584 int unused ATTRIBUTE_UNUSED; 6585 { 6586 #ifdef OBJ_SOM 6587 /* We must have a valid space and subspace. */ 6588 pa_check_current_space_and_subspace (); 6589 #endif 6590 6591 if (!within_procedure) 6592 as_bad (_(".EXIT must appear within a procedure")); 6593 else 6594 { 6595 if (!callinfo_found) 6596 as_bad (_("Missing .callinfo")); 6597 else 6598 { 6599 if (!within_entry_exit) 6600 as_bad (_("No .ENTRY for this .EXIT")); 6601 else 6602 { 6603 within_entry_exit = FALSE; 6604 process_exit (); 6605 } 6606 } 6607 } 6608 demand_empty_rest_of_line (); 6609 } 6610 6611 /* Process a .EXPORT directive. This makes functions external 6612 and provides information such as argument relocation entries 6613 to callers. */ 6614 6615 static void 6616 pa_export (unused) 6617 int unused ATTRIBUTE_UNUSED; 6618 { 6619 char *name, c, *p; 6620 symbolS *symbol; 6621 6622 name = input_line_pointer; 6623 c = get_symbol_end (); 6624 /* Make sure the given symbol exists. */ 6625 if ((symbol = symbol_find_or_make (name)) == NULL) 6626 { 6627 as_bad (_("Cannot define export symbol: %s\n"), name); 6628 p = input_line_pointer; 6629 *p = c; 6630 input_line_pointer++; 6631 } 6632 else 6633 { 6634 /* OK. Set the external bits and process argument relocations. 6635 For the HP, weak and global are not mutually exclusive. 6636 S_SET_EXTERNAL will not set BSF_GLOBAL if WEAK is set. 6637 Call S_SET_EXTERNAL to get the other processing. Manually 6638 set BSF_GLOBAL when we get back. */ 6639 S_SET_EXTERNAL (symbol); 6640 symbol_get_bfdsym (symbol)->flags |= BSF_GLOBAL; 6641 p = input_line_pointer; 6642 *p = c; 6643 if (!is_end_of_statement ()) 6644 { 6645 input_line_pointer++; 6646 pa_type_args (symbol, 1); 6647 } 6648 } 6649 6650 demand_empty_rest_of_line (); 6651 } 6652 6653 /* Helper function to process arguments to a .EXPORT pseudo-op. */ 6654 6655 static void 6656 pa_type_args (symbolP, is_export) 6657 symbolS *symbolP; 6658 int is_export; 6659 { 6660 char *name, c, *p; 6661 unsigned int temp, arg_reloc; 6662 pa_symbol_type type = SYMBOL_TYPE_UNKNOWN; 6663 asymbol *bfdsym = symbol_get_bfdsym (symbolP); 6664 6665 if (strncasecmp (input_line_pointer, "absolute", 8) == 0) 6666 6667 { 6668 input_line_pointer += 8; 6669 bfdsym->flags &= ~BSF_FUNCTION; 6670 S_SET_SEGMENT (symbolP, bfd_abs_section_ptr); 6671 type = SYMBOL_TYPE_ABSOLUTE; 6672 } 6673 else if (strncasecmp (input_line_pointer, "code", 4) == 0) 6674 { 6675 input_line_pointer += 4; 6676 /* IMPORTing/EXPORTing CODE types for functions is meaningless for SOM, 6677 instead one should be IMPORTing/EXPORTing ENTRY types. 6678 6679 Complain if one tries to EXPORT a CODE type since that's never 6680 done. Both GCC and HP C still try to IMPORT CODE types, so 6681 silently fix them to be ENTRY types. */ 6682 if (S_IS_FUNCTION (symbolP)) 6683 { 6684 if (is_export) 6685 as_tsktsk (_("Using ENTRY rather than CODE in export directive for %s"), 6686 S_GET_NAME (symbolP)); 6687 6688 bfdsym->flags |= BSF_FUNCTION; 6689 type = SYMBOL_TYPE_ENTRY; 6690 } 6691 else 6692 { 6693 bfdsym->flags &= ~BSF_FUNCTION; 6694 type = SYMBOL_TYPE_CODE; 6695 } 6696 } 6697 else if (strncasecmp (input_line_pointer, "data", 4) == 0) 6698 { 6699 input_line_pointer += 4; 6700 bfdsym->flags &= ~BSF_FUNCTION; 6701 bfdsym->flags |= BSF_OBJECT; 6702 type = SYMBOL_TYPE_DATA; 6703 } 6704 else if ((strncasecmp (input_line_pointer, "entry", 5) == 0)) 6705 { 6706 input_line_pointer += 5; 6707 bfdsym->flags |= BSF_FUNCTION; 6708 type = SYMBOL_TYPE_ENTRY; 6709 } 6710 else if (strncasecmp (input_line_pointer, "millicode", 9) == 0) 6711 { 6712 input_line_pointer += 9; 6713 bfdsym->flags |= BSF_FUNCTION; 6714 #ifdef OBJ_ELF 6715 { 6716 elf_symbol_type *elfsym = (elf_symbol_type *) bfdsym; 6717 elfsym->internal_elf_sym.st_info = 6718 ELF_ST_INFO (ELF_ST_BIND (elfsym->internal_elf_sym.st_info), 6719 STT_PARISC_MILLI); 6720 } 6721 #endif 6722 type = SYMBOL_TYPE_MILLICODE; 6723 } 6724 else if (strncasecmp (input_line_pointer, "plabel", 6) == 0) 6725 { 6726 input_line_pointer += 6; 6727 bfdsym->flags &= ~BSF_FUNCTION; 6728 type = SYMBOL_TYPE_PLABEL; 6729 } 6730 else if (strncasecmp (input_line_pointer, "pri_prog", 8) == 0) 6731 { 6732 input_line_pointer += 8; 6733 bfdsym->flags |= BSF_FUNCTION; 6734 type = SYMBOL_TYPE_PRI_PROG; 6735 } 6736 else if (strncasecmp (input_line_pointer, "sec_prog", 8) == 0) 6737 { 6738 input_line_pointer += 8; 6739 bfdsym->flags |= BSF_FUNCTION; 6740 type = SYMBOL_TYPE_SEC_PROG; 6741 } 6742 6743 /* SOM requires much more information about symbol types 6744 than BFD understands. This is how we get this information 6745 to the SOM BFD backend. */ 6746 #ifdef obj_set_symbol_type 6747 obj_set_symbol_type (bfdsym, (int) type); 6748 #endif 6749 6750 /* Now that the type of the exported symbol has been handled, 6751 handle any argument relocation information. */ 6752 while (!is_end_of_statement ()) 6753 { 6754 if (*input_line_pointer == ',') 6755 input_line_pointer++; 6756 name = input_line_pointer; 6757 c = get_symbol_end (); 6758 /* Argument sources. */ 6759 if ((strncasecmp (name, "argw", 4) == 0)) 6760 { 6761 p = input_line_pointer; 6762 *p = c; 6763 input_line_pointer++; 6764 temp = atoi (name + 4); 6765 name = input_line_pointer; 6766 c = get_symbol_end (); 6767 arg_reloc = pa_align_arg_reloc (temp, pa_build_arg_reloc (name)); 6768 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC) 6769 symbol_arg_reloc_info (symbolP) |= arg_reloc; 6770 #endif 6771 *input_line_pointer = c; 6772 } 6773 /* The return value. */ 6774 else if ((strncasecmp (name, "rtnval", 6)) == 0) 6775 { 6776 p = input_line_pointer; 6777 *p = c; 6778 input_line_pointer++; 6779 name = input_line_pointer; 6780 c = get_symbol_end (); 6781 arg_reloc = pa_build_arg_reloc (name); 6782 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC) 6783 symbol_arg_reloc_info (symbolP) |= arg_reloc; 6784 #endif 6785 *input_line_pointer = c; 6786 } 6787 /* Privilege level. */ 6788 else if ((strncasecmp (name, "priv_lev", 8)) == 0) 6789 { 6790 p = input_line_pointer; 6791 *p = c; 6792 input_line_pointer++; 6793 temp = atoi (input_line_pointer); 6794 #ifdef OBJ_SOM 6795 ((obj_symbol_type *) bfdsym)->tc_data.ap.hppa_priv_level = temp; 6796 #endif 6797 c = get_symbol_end (); 6798 *input_line_pointer = c; 6799 } 6800 else 6801 { 6802 as_bad (_("Undefined .EXPORT/.IMPORT argument (ignored): %s"), name); 6803 p = input_line_pointer; 6804 *p = c; 6805 } 6806 if (!is_end_of_statement ()) 6807 input_line_pointer++; 6808 } 6809 } 6810 6811 /* Handle an .IMPORT pseudo-op. Any symbol referenced in a given 6812 assembly file must either be defined in the assembly file, or 6813 explicitly IMPORTED from another. */ 6814 6815 static void 6816 pa_import (unused) 6817 int unused ATTRIBUTE_UNUSED; 6818 { 6819 char *name, c, *p; 6820 symbolS *symbol; 6821 6822 name = input_line_pointer; 6823 c = get_symbol_end (); 6824 6825 symbol = symbol_find (name); 6826 /* Ugh. We might be importing a symbol defined earlier in the file, 6827 in which case all the code below will really screw things up 6828 (set the wrong segment, symbol flags & type, etc). */ 6829 if (symbol == NULL || !S_IS_DEFINED (symbol)) 6830 { 6831 symbol = symbol_find_or_make (name); 6832 p = input_line_pointer; 6833 *p = c; 6834 6835 if (!is_end_of_statement ()) 6836 { 6837 input_line_pointer++; 6838 pa_type_args (symbol, 0); 6839 } 6840 else 6841 { 6842 /* Sigh. To be compatible with the HP assembler and to help 6843 poorly written assembly code, we assign a type based on 6844 the current segment. Note only BSF_FUNCTION really 6845 matters, we do not need to set the full SYMBOL_TYPE_* info. */ 6846 if (now_seg == text_section) 6847 symbol_get_bfdsym (symbol)->flags |= BSF_FUNCTION; 6848 6849 /* If the section is undefined, then the symbol is undefined 6850 Since this is an import, leave the section undefined. */ 6851 S_SET_SEGMENT (symbol, bfd_und_section_ptr); 6852 } 6853 } 6854 else 6855 { 6856 /* The symbol was already defined. Just eat everything up to 6857 the end of the current statement. */ 6858 while (!is_end_of_statement ()) 6859 input_line_pointer++; 6860 } 6861 6862 demand_empty_rest_of_line (); 6863 } 6864 6865 /* Handle a .LABEL pseudo-op. */ 6866 6867 static void 6868 pa_label (unused) 6869 int unused ATTRIBUTE_UNUSED; 6870 { 6871 char *name, c, *p; 6872 6873 name = input_line_pointer; 6874 c = get_symbol_end (); 6875 6876 if (strlen (name) > 0) 6877 { 6878 colon (name); 6879 p = input_line_pointer; 6880 *p = c; 6881 } 6882 else 6883 { 6884 as_warn (_("Missing label name on .LABEL")); 6885 } 6886 6887 if (!is_end_of_statement ()) 6888 { 6889 as_warn (_("extra .LABEL arguments ignored.")); 6890 ignore_rest_of_line (); 6891 } 6892 demand_empty_rest_of_line (); 6893 } 6894 6895 /* Handle a .LEAVE pseudo-op. This is not supported yet. */ 6896 6897 static void 6898 pa_leave (unused) 6899 int unused ATTRIBUTE_UNUSED; 6900 { 6901 #ifdef OBJ_SOM 6902 /* We must have a valid space and subspace. */ 6903 pa_check_current_space_and_subspace (); 6904 #endif 6905 6906 as_bad (_("The .LEAVE pseudo-op is not supported")); 6907 demand_empty_rest_of_line (); 6908 } 6909 6910 /* Handle a .LEVEL pseudo-op. */ 6911 6912 static void 6913 pa_level (unused) 6914 int unused ATTRIBUTE_UNUSED; 6915 { 6916 char *level; 6917 6918 level = input_line_pointer; 6919 if (strncmp (level, "1.0", 3) == 0) 6920 { 6921 input_line_pointer += 3; 6922 if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 10)) 6923 as_warn (_("could not set architecture and machine")); 6924 } 6925 else if (strncmp (level, "1.1", 3) == 0) 6926 { 6927 input_line_pointer += 3; 6928 if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 11)) 6929 as_warn (_("could not set architecture and machine")); 6930 } 6931 else if (strncmp (level, "2.0w", 4) == 0) 6932 { 6933 input_line_pointer += 4; 6934 if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 25)) 6935 as_warn (_("could not set architecture and machine")); 6936 } 6937 else if (strncmp (level, "2.0", 3) == 0) 6938 { 6939 input_line_pointer += 3; 6940 if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 20)) 6941 as_warn (_("could not set architecture and machine")); 6942 } 6943 else 6944 { 6945 as_bad (_("Unrecognized .LEVEL argument\n")); 6946 ignore_rest_of_line (); 6947 } 6948 demand_empty_rest_of_line (); 6949 } 6950 6951 /* Handle a .ORIGIN pseudo-op. */ 6952 6953 static void 6954 pa_origin (unused) 6955 int unused ATTRIBUTE_UNUSED; 6956 { 6957 #ifdef OBJ_SOM 6958 /* We must have a valid space and subspace. */ 6959 pa_check_current_space_and_subspace (); 6960 #endif 6961 6962 s_org (0); 6963 pa_undefine_label (); 6964 } 6965 6966 /* Handle a .PARAM pseudo-op. This is much like a .EXPORT, except it 6967 is for static functions. FIXME. Should share more code with .EXPORT. */ 6968 6969 static void 6970 pa_param (unused) 6971 int unused ATTRIBUTE_UNUSED; 6972 { 6973 char *name, c, *p; 6974 symbolS *symbol; 6975 6976 name = input_line_pointer; 6977 c = get_symbol_end (); 6978 6979 if ((symbol = symbol_find_or_make (name)) == NULL) 6980 { 6981 as_bad (_("Cannot define static symbol: %s\n"), name); 6982 p = input_line_pointer; 6983 *p = c; 6984 input_line_pointer++; 6985 } 6986 else 6987 { 6988 S_CLEAR_EXTERNAL (symbol); 6989 p = input_line_pointer; 6990 *p = c; 6991 if (!is_end_of_statement ()) 6992 { 6993 input_line_pointer++; 6994 pa_type_args (symbol, 0); 6995 } 6996 } 6997 6998 demand_empty_rest_of_line (); 6999 } 7000 7001 /* Handle a .PROC pseudo-op. It is used to mark the beginning 7002 of a procedure from a syntactical point of view. */ 7003 7004 static void 7005 pa_proc (unused) 7006 int unused ATTRIBUTE_UNUSED; 7007 { 7008 struct call_info *call_info; 7009 7010 #ifdef OBJ_SOM 7011 /* We must have a valid space and subspace. */ 7012 pa_check_current_space_and_subspace (); 7013 #endif 7014 7015 if (within_procedure) 7016 as_fatal (_("Nested procedures")); 7017 7018 /* Reset global variables for new procedure. */ 7019 callinfo_found = FALSE; 7020 within_procedure = TRUE; 7021 7022 /* Create another call_info structure. */ 7023 call_info = (struct call_info *) xmalloc (sizeof (struct call_info)); 7024 7025 if (!call_info) 7026 as_fatal (_("Cannot allocate unwind descriptor\n")); 7027 7028 memset (call_info, 0, sizeof (struct call_info)); 7029 7030 call_info->ci_next = NULL; 7031 7032 if (call_info_root == NULL) 7033 { 7034 call_info_root = call_info; 7035 last_call_info = call_info; 7036 } 7037 else 7038 { 7039 last_call_info->ci_next = call_info; 7040 last_call_info = call_info; 7041 } 7042 7043 /* set up defaults on call_info structure */ 7044 7045 call_info->ci_unwind.descriptor.cannot_unwind = 0; 7046 call_info->ci_unwind.descriptor.region_desc = 1; 7047 call_info->ci_unwind.descriptor.hpux_interrupt_marker = 0; 7048 7049 /* If we got a .PROC pseudo-op, we know that the function is defined 7050 locally. Make sure it gets into the symbol table. */ 7051 { 7052 label_symbol_struct *label_symbol = pa_get_label (); 7053 7054 if (label_symbol) 7055 { 7056 if (label_symbol->lss_label) 7057 { 7058 last_call_info->start_symbol = label_symbol->lss_label; 7059 symbol_get_bfdsym (label_symbol->lss_label)->flags |= BSF_FUNCTION; 7060 } 7061 else 7062 as_bad (_("Missing function name for .PROC (corrupted label chain)")); 7063 } 7064 else 7065 last_call_info->start_symbol = NULL; 7066 } 7067 7068 demand_empty_rest_of_line (); 7069 } 7070 7071 /* Process the syntactical end of a procedure. Make sure all the 7072 appropriate pseudo-ops were found within the procedure. */ 7073 7074 static void 7075 pa_procend (unused) 7076 int unused ATTRIBUTE_UNUSED; 7077 { 7078 7079 #ifdef OBJ_SOM 7080 /* We must have a valid space and subspace. */ 7081 pa_check_current_space_and_subspace (); 7082 #endif 7083 7084 /* If we are within a procedure definition, make sure we've 7085 defined a label for the procedure; handle case where the 7086 label was defined after the .PROC directive. 7087 7088 Note there's not need to diddle with the segment or fragment 7089 for the label symbol in this case. We have already switched 7090 into the new $CODE$ subspace at this point. */ 7091 if (within_procedure && last_call_info->start_symbol == NULL) 7092 { 7093 label_symbol_struct *label_symbol = pa_get_label (); 7094 7095 if (label_symbol) 7096 { 7097 if (label_symbol->lss_label) 7098 { 7099 last_call_info->start_symbol = label_symbol->lss_label; 7100 symbol_get_bfdsym (label_symbol->lss_label)->flags 7101 |= BSF_FUNCTION; 7102 #ifdef OBJ_SOM 7103 /* Also handle allocation of a fixup to hold the unwind 7104 information when the label appears after the proc/procend. */ 7105 if (within_entry_exit) 7106 { 7107 char *where; 7108 unsigned int u; 7109 7110 where = frag_more (0); 7111 u = UNWIND_LOW32 (&last_call_info->ci_unwind.descriptor); 7112 fix_new_hppa (frag_now, where - frag_now->fr_literal, 0, 7113 NULL, (offsetT) 0, NULL, 7114 0, R_HPPA_ENTRY, e_fsel, 0, 0, u); 7115 } 7116 #endif 7117 } 7118 else 7119 as_bad (_("Missing function name for .PROC (corrupted label chain)")); 7120 } 7121 else 7122 as_bad (_("Missing function name for .PROC")); 7123 } 7124 7125 if (!within_procedure) 7126 as_bad (_("misplaced .procend")); 7127 7128 if (!callinfo_found) 7129 as_bad (_("Missing .callinfo for this procedure")); 7130 7131 if (within_entry_exit) 7132 as_bad (_("Missing .EXIT for a .ENTRY")); 7133 7134 #ifdef OBJ_ELF 7135 /* ELF needs to mark the end of each function so that it can compute 7136 the size of the function (apparently its needed in the symbol table). */ 7137 hppa_elf_mark_end_of_function (); 7138 #endif 7139 7140 within_procedure = FALSE; 7141 demand_empty_rest_of_line (); 7142 pa_undefine_label (); 7143 } 7144 7145 #ifdef OBJ_SOM 7146 /* If VALUE is an exact power of two between zero and 2^31, then 7147 return log2 (VALUE). Else return -1. */ 7148 7149 static int 7150 log2 (value) 7151 int value; 7152 { 7153 int shift = 0; 7154 7155 while ((1 << shift) != value && shift < 32) 7156 shift++; 7157 7158 if (shift >= 32) 7159 return -1; 7160 else 7161 return shift; 7162 } 7163 7164 /* Check to make sure we have a valid space and subspace. */ 7165 7166 static void 7167 pa_check_current_space_and_subspace () 7168 { 7169 if (current_space == NULL) 7170 as_fatal (_("Not in a space.\n")); 7171 7172 if (current_subspace == NULL) 7173 as_fatal (_("Not in a subspace.\n")); 7174 } 7175 7176 /* Parse the parameters to a .SPACE directive; if CREATE_FLAG is nonzero, 7177 then create a new space entry to hold the information specified 7178 by the parameters to the .SPACE directive. */ 7179 7180 static sd_chain_struct * 7181 pa_parse_space_stmt (space_name, create_flag) 7182 char *space_name; 7183 int create_flag; 7184 { 7185 char *name, *ptemp, c; 7186 char loadable, defined, private, sort; 7187 int spnum; 7188 asection *seg = NULL; 7189 sd_chain_struct *space; 7190 7191 /* load default values */ 7192 spnum = 0; 7193 sort = 0; 7194 loadable = TRUE; 7195 defined = TRUE; 7196 private = FALSE; 7197 if (strcmp (space_name, "$TEXT$") == 0) 7198 { 7199 seg = pa_def_spaces[0].segment; 7200 defined = pa_def_spaces[0].defined; 7201 private = pa_def_spaces[0].private; 7202 sort = pa_def_spaces[0].sort; 7203 spnum = pa_def_spaces[0].spnum; 7204 } 7205 else if (strcmp (space_name, "$PRIVATE$") == 0) 7206 { 7207 seg = pa_def_spaces[1].segment; 7208 defined = pa_def_spaces[1].defined; 7209 private = pa_def_spaces[1].private; 7210 sort = pa_def_spaces[1].sort; 7211 spnum = pa_def_spaces[1].spnum; 7212 } 7213 7214 if (!is_end_of_statement ()) 7215 { 7216 print_errors = FALSE; 7217 ptemp = input_line_pointer + 1; 7218 /* First see if the space was specified as a number rather than 7219 as a name. According to the PA assembly manual the rest of 7220 the line should be ignored. */ 7221 strict = 0; 7222 pa_parse_number (&ptemp, 0); 7223 if (pa_number >= 0) 7224 { 7225 spnum = pa_number; 7226 input_line_pointer = ptemp; 7227 } 7228 else 7229 { 7230 while (!is_end_of_statement ()) 7231 { 7232 input_line_pointer++; 7233 name = input_line_pointer; 7234 c = get_symbol_end (); 7235 if ((strncasecmp (name, "spnum", 5) == 0)) 7236 { 7237 *input_line_pointer = c; 7238 input_line_pointer++; 7239 spnum = get_absolute_expression (); 7240 } 7241 else if ((strncasecmp (name, "sort", 4) == 0)) 7242 { 7243 *input_line_pointer = c; 7244 input_line_pointer++; 7245 sort = get_absolute_expression (); 7246 } 7247 else if ((strncasecmp (name, "unloadable", 10) == 0)) 7248 { 7249 *input_line_pointer = c; 7250 loadable = FALSE; 7251 } 7252 else if ((strncasecmp (name, "notdefined", 10) == 0)) 7253 { 7254 *input_line_pointer = c; 7255 defined = FALSE; 7256 } 7257 else if ((strncasecmp (name, "private", 7) == 0)) 7258 { 7259 *input_line_pointer = c; 7260 private = TRUE; 7261 } 7262 else 7263 { 7264 as_bad (_("Invalid .SPACE argument")); 7265 *input_line_pointer = c; 7266 if (!is_end_of_statement ()) 7267 input_line_pointer++; 7268 } 7269 } 7270 } 7271 print_errors = TRUE; 7272 } 7273 7274 if (create_flag && seg == NULL) 7275 seg = subseg_new (space_name, 0); 7276 7277 /* If create_flag is nonzero, then create the new space with 7278 the attributes computed above. Else set the values in 7279 an already existing space -- this can only happen for 7280 the first occurrence of a built-in space. */ 7281 if (create_flag) 7282 space = create_new_space (space_name, spnum, loadable, defined, 7283 private, sort, seg, 1); 7284 else 7285 { 7286 space = is_defined_space (space_name); 7287 SPACE_SPNUM (space) = spnum; 7288 SPACE_DEFINED (space) = defined & 1; 7289 SPACE_USER_DEFINED (space) = 1; 7290 } 7291 7292 #ifdef obj_set_section_attributes 7293 obj_set_section_attributes (seg, defined, private, sort, spnum); 7294 #endif 7295 7296 return space; 7297 } 7298 7299 /* Handle a .SPACE pseudo-op; this switches the current space to the 7300 given space, creating the new space if necessary. */ 7301 7302 static void 7303 pa_space (unused) 7304 int unused ATTRIBUTE_UNUSED; 7305 { 7306 char *name, c, *space_name, *save_s; 7307 sd_chain_struct *sd_chain; 7308 7309 if (within_procedure) 7310 { 7311 as_bad (_("Can\'t change spaces within a procedure definition. Ignored")); 7312 ignore_rest_of_line (); 7313 } 7314 else 7315 { 7316 /* Check for some of the predefined spaces. FIXME: most of the code 7317 below is repeated several times, can we extract the common parts 7318 and place them into a subroutine or something similar? */ 7319 /* FIXME Is this (and the next IF stmt) really right? 7320 What if INPUT_LINE_POINTER points to "$TEXT$FOO"? */ 7321 if (strncmp (input_line_pointer, "$TEXT$", 6) == 0) 7322 { 7323 input_line_pointer += 6; 7324 sd_chain = is_defined_space ("$TEXT$"); 7325 if (sd_chain == NULL) 7326 sd_chain = pa_parse_space_stmt ("$TEXT$", 1); 7327 else if (SPACE_USER_DEFINED (sd_chain) == 0) 7328 sd_chain = pa_parse_space_stmt ("$TEXT$", 0); 7329 7330 current_space = sd_chain; 7331 subseg_set (text_section, sd_chain->sd_last_subseg); 7332 current_subspace 7333 = pa_subsegment_to_subspace (text_section, 7334 sd_chain->sd_last_subseg); 7335 demand_empty_rest_of_line (); 7336 return; 7337 } 7338 if (strncmp (input_line_pointer, "$PRIVATE$", 9) == 0) 7339 { 7340 input_line_pointer += 9; 7341 sd_chain = is_defined_space ("$PRIVATE$"); 7342 if (sd_chain == NULL) 7343 sd_chain = pa_parse_space_stmt ("$PRIVATE$", 1); 7344 else if (SPACE_USER_DEFINED (sd_chain) == 0) 7345 sd_chain = pa_parse_space_stmt ("$PRIVATE$", 0); 7346 7347 current_space = sd_chain; 7348 subseg_set (data_section, sd_chain->sd_last_subseg); 7349 current_subspace 7350 = pa_subsegment_to_subspace (data_section, 7351 sd_chain->sd_last_subseg); 7352 demand_empty_rest_of_line (); 7353 return; 7354 } 7355 if (!strncasecmp (input_line_pointer, 7356 GDB_DEBUG_SPACE_NAME, 7357 strlen (GDB_DEBUG_SPACE_NAME))) 7358 { 7359 input_line_pointer += strlen (GDB_DEBUG_SPACE_NAME); 7360 sd_chain = is_defined_space (GDB_DEBUG_SPACE_NAME); 7361 if (sd_chain == NULL) 7362 sd_chain = pa_parse_space_stmt (GDB_DEBUG_SPACE_NAME, 1); 7363 else if (SPACE_USER_DEFINED (sd_chain) == 0) 7364 sd_chain = pa_parse_space_stmt (GDB_DEBUG_SPACE_NAME, 0); 7365 7366 current_space = sd_chain; 7367 7368 { 7369 asection *gdb_section 7370 = bfd_make_section_old_way (stdoutput, GDB_DEBUG_SPACE_NAME); 7371 7372 subseg_set (gdb_section, sd_chain->sd_last_subseg); 7373 current_subspace 7374 = pa_subsegment_to_subspace (gdb_section, 7375 sd_chain->sd_last_subseg); 7376 } 7377 demand_empty_rest_of_line (); 7378 return; 7379 } 7380 7381 /* It could be a space specified by number. */ 7382 print_errors = 0; 7383 save_s = input_line_pointer; 7384 strict = 0; 7385 pa_parse_number (&input_line_pointer, 0); 7386 if (pa_number >= 0) 7387 { 7388 if ((sd_chain = pa_find_space_by_number (pa_number))) 7389 { 7390 current_space = sd_chain; 7391 7392 subseg_set (sd_chain->sd_seg, sd_chain->sd_last_subseg); 7393 current_subspace 7394 = pa_subsegment_to_subspace (sd_chain->sd_seg, 7395 sd_chain->sd_last_subseg); 7396 demand_empty_rest_of_line (); 7397 return; 7398 } 7399 } 7400 7401 /* Not a number, attempt to create a new space. */ 7402 print_errors = 1; 7403 input_line_pointer = save_s; 7404 name = input_line_pointer; 7405 c = get_symbol_end (); 7406 space_name = xmalloc (strlen (name) + 1); 7407 strcpy (space_name, name); 7408 *input_line_pointer = c; 7409 7410 sd_chain = pa_parse_space_stmt (space_name, 1); 7411 current_space = sd_chain; 7412 7413 subseg_set (sd_chain->sd_seg, sd_chain->sd_last_subseg); 7414 current_subspace = pa_subsegment_to_subspace (sd_chain->sd_seg, 7415 sd_chain->sd_last_subseg); 7416 demand_empty_rest_of_line (); 7417 } 7418 } 7419 7420 /* Switch to a new space. (I think). FIXME. */ 7421 7422 static void 7423 pa_spnum (unused) 7424 int unused ATTRIBUTE_UNUSED; 7425 { 7426 char *name; 7427 char c; 7428 char *p; 7429 sd_chain_struct *space; 7430 7431 name = input_line_pointer; 7432 c = get_symbol_end (); 7433 space = is_defined_space (name); 7434 if (space) 7435 { 7436 p = frag_more (4); 7437 md_number_to_chars (p, SPACE_SPNUM (space), 4); 7438 } 7439 else 7440 as_warn (_("Undefined space: '%s' Assuming space number = 0."), name); 7441 7442 *input_line_pointer = c; 7443 demand_empty_rest_of_line (); 7444 } 7445 7446 /* Handle a .SUBSPACE pseudo-op; this switches the current subspace to the 7447 given subspace, creating the new subspace if necessary. 7448 7449 FIXME. Should mirror pa_space more closely, in particular how 7450 they're broken up into subroutines. */ 7451 7452 static void 7453 pa_subspace (create_new) 7454 int create_new; 7455 { 7456 char *name, *ss_name, c; 7457 char loadable, code_only, common, dup_common, zero, sort; 7458 int i, access, space_index, alignment, quadrant, applicable, flags; 7459 sd_chain_struct *space; 7460 ssd_chain_struct *ssd; 7461 asection *section; 7462 7463 if (current_space == NULL) 7464 as_fatal (_("Must be in a space before changing or declaring subspaces.\n")); 7465 7466 if (within_procedure) 7467 { 7468 as_bad (_("Can\'t change subspaces within a procedure definition. Ignored")); 7469 ignore_rest_of_line (); 7470 } 7471 else 7472 { 7473 name = input_line_pointer; 7474 c = get_symbol_end (); 7475 ss_name = xmalloc (strlen (name) + 1); 7476 strcpy (ss_name, name); 7477 *input_line_pointer = c; 7478 7479 /* Load default values. */ 7480 sort = 0; 7481 access = 0x7f; 7482 loadable = 1; 7483 common = 0; 7484 dup_common = 0; 7485 code_only = 0; 7486 zero = 0; 7487 space_index = ~0; 7488 alignment = 1; 7489 quadrant = 0; 7490 7491 space = current_space; 7492 if (create_new) 7493 ssd = NULL; 7494 else 7495 ssd = is_defined_subspace (ss_name); 7496 /* Allow user to override the builtin attributes of subspaces. But 7497 only allow the attributes to be changed once! */ 7498 if (ssd && SUBSPACE_DEFINED (ssd)) 7499 { 7500 subseg_set (ssd->ssd_seg, ssd->ssd_subseg); 7501 current_subspace = ssd; 7502 if (!is_end_of_statement ()) 7503 as_warn (_("Parameters of an existing subspace can\'t be modified")); 7504 demand_empty_rest_of_line (); 7505 return; 7506 } 7507 else 7508 { 7509 /* A new subspace. Load default values if it matches one of 7510 the builtin subspaces. */ 7511 i = 0; 7512 while (pa_def_subspaces[i].name) 7513 { 7514 if (strcasecmp (pa_def_subspaces[i].name, ss_name) == 0) 7515 { 7516 loadable = pa_def_subspaces[i].loadable; 7517 common = pa_def_subspaces[i].common; 7518 dup_common = pa_def_subspaces[i].dup_common; 7519 code_only = pa_def_subspaces[i].code_only; 7520 zero = pa_def_subspaces[i].zero; 7521 space_index = pa_def_subspaces[i].space_index; 7522 alignment = pa_def_subspaces[i].alignment; 7523 quadrant = pa_def_subspaces[i].quadrant; 7524 access = pa_def_subspaces[i].access; 7525 sort = pa_def_subspaces[i].sort; 7526 break; 7527 } 7528 i++; 7529 } 7530 } 7531 7532 /* We should be working with a new subspace now. Fill in 7533 any information as specified by the user. */ 7534 if (!is_end_of_statement ()) 7535 { 7536 input_line_pointer++; 7537 while (!is_end_of_statement ()) 7538 { 7539 name = input_line_pointer; 7540 c = get_symbol_end (); 7541 if ((strncasecmp (name, "quad", 4) == 0)) 7542 { 7543 *input_line_pointer = c; 7544 input_line_pointer++; 7545 quadrant = get_absolute_expression (); 7546 } 7547 else if ((strncasecmp (name, "align", 5) == 0)) 7548 { 7549 *input_line_pointer = c; 7550 input_line_pointer++; 7551 alignment = get_absolute_expression (); 7552 if (log2 (alignment) == -1) 7553 { 7554 as_bad (_("Alignment must be a power of 2")); 7555 alignment = 1; 7556 } 7557 } 7558 else if ((strncasecmp (name, "access", 6) == 0)) 7559 { 7560 *input_line_pointer = c; 7561 input_line_pointer++; 7562 access = get_absolute_expression (); 7563 } 7564 else if ((strncasecmp (name, "sort", 4) == 0)) 7565 { 7566 *input_line_pointer = c; 7567 input_line_pointer++; 7568 sort = get_absolute_expression (); 7569 } 7570 else if ((strncasecmp (name, "code_only", 9) == 0)) 7571 { 7572 *input_line_pointer = c; 7573 code_only = 1; 7574 } 7575 else if ((strncasecmp (name, "unloadable", 10) == 0)) 7576 { 7577 *input_line_pointer = c; 7578 loadable = 0; 7579 } 7580 else if ((strncasecmp (name, "common", 6) == 0)) 7581 { 7582 *input_line_pointer = c; 7583 common = 1; 7584 } 7585 else if ((strncasecmp (name, "dup_comm", 8) == 0)) 7586 { 7587 *input_line_pointer = c; 7588 dup_common = 1; 7589 } 7590 else if ((strncasecmp (name, "zero", 4) == 0)) 7591 { 7592 *input_line_pointer = c; 7593 zero = 1; 7594 } 7595 else if ((strncasecmp (name, "first", 5) == 0)) 7596 as_bad (_("FIRST not supported as a .SUBSPACE argument")); 7597 else 7598 as_bad (_("Invalid .SUBSPACE argument")); 7599 if (!is_end_of_statement ()) 7600 input_line_pointer++; 7601 } 7602 } 7603 7604 /* Compute a reasonable set of BFD flags based on the information 7605 in the .subspace directive. */ 7606 applicable = bfd_applicable_section_flags (stdoutput); 7607 flags = 0; 7608 if (loadable) 7609 flags |= (SEC_ALLOC | SEC_LOAD); 7610 if (code_only) 7611 flags |= SEC_CODE; 7612 if (common || dup_common) 7613 flags |= SEC_IS_COMMON; 7614 7615 flags |= SEC_RELOC | SEC_HAS_CONTENTS; 7616 7617 /* This is a zero-filled subspace (eg BSS). */ 7618 if (zero) 7619 flags &= ~(SEC_LOAD | SEC_HAS_CONTENTS); 7620 7621 applicable &= flags; 7622 7623 /* If this is an existing subspace, then we want to use the 7624 segment already associated with the subspace. 7625 7626 FIXME NOW! ELF BFD doesn't appear to be ready to deal with 7627 lots of sections. It might be a problem in the PA ELF 7628 code, I do not know yet. For now avoid creating anything 7629 but the "standard" sections for ELF. */ 7630 if (create_new) 7631 section = subseg_force_new (ss_name, 0); 7632 else if (ssd) 7633 section = ssd->ssd_seg; 7634 else 7635 section = subseg_new (ss_name, 0); 7636 7637 if (zero) 7638 seg_info (section)->bss = 1; 7639 7640 /* Now set the flags. */ 7641 bfd_set_section_flags (stdoutput, section, applicable); 7642 7643 /* Record any alignment request for this section. */ 7644 record_alignment (section, log2 (alignment)); 7645 7646 /* Set the starting offset for this section. */ 7647 bfd_set_section_vma (stdoutput, section, 7648 pa_subspace_start (space, quadrant)); 7649 7650 /* Now that all the flags are set, update an existing subspace, 7651 or create a new one. */ 7652 if (ssd) 7653 7654 current_subspace = update_subspace (space, ss_name, loadable, 7655 code_only, common, dup_common, 7656 sort, zero, access, space_index, 7657 alignment, quadrant, 7658 section); 7659 else 7660 current_subspace = create_new_subspace (space, ss_name, loadable, 7661 code_only, common, 7662 dup_common, zero, sort, 7663 access, space_index, 7664 alignment, quadrant, section); 7665 7666 demand_empty_rest_of_line (); 7667 current_subspace->ssd_seg = section; 7668 subseg_set (current_subspace->ssd_seg, current_subspace->ssd_subseg); 7669 } 7670 SUBSPACE_DEFINED (current_subspace) = 1; 7671 } 7672 7673 /* Create default space and subspace dictionaries. */ 7674 7675 static void 7676 pa_spaces_begin () 7677 { 7678 int i; 7679 7680 space_dict_root = NULL; 7681 space_dict_last = NULL; 7682 7683 i = 0; 7684 while (pa_def_spaces[i].name) 7685 { 7686 char *name; 7687 7688 /* Pick the right name to use for the new section. */ 7689 name = pa_def_spaces[i].name; 7690 7691 pa_def_spaces[i].segment = subseg_new (name, 0); 7692 create_new_space (pa_def_spaces[i].name, pa_def_spaces[i].spnum, 7693 pa_def_spaces[i].loadable, pa_def_spaces[i].defined, 7694 pa_def_spaces[i].private, pa_def_spaces[i].sort, 7695 pa_def_spaces[i].segment, 0); 7696 i++; 7697 } 7698 7699 i = 0; 7700 while (pa_def_subspaces[i].name) 7701 { 7702 char *name; 7703 int applicable, subsegment; 7704 asection *segment = NULL; 7705 sd_chain_struct *space; 7706 7707 /* Pick the right name for the new section and pick the right 7708 subsegment number. */ 7709 name = pa_def_subspaces[i].name; 7710 subsegment = 0; 7711 7712 /* Create the new section. */ 7713 segment = subseg_new (name, subsegment); 7714 7715 /* For SOM we want to replace the standard .text, .data, and .bss 7716 sections with our own. We also want to set BFD flags for 7717 all the built-in subspaces. */ 7718 if (!strcmp (pa_def_subspaces[i].name, "$CODE$")) 7719 { 7720 text_section = segment; 7721 applicable = bfd_applicable_section_flags (stdoutput); 7722 bfd_set_section_flags (stdoutput, segment, 7723 applicable & (SEC_ALLOC | SEC_LOAD 7724 | SEC_RELOC | SEC_CODE 7725 | SEC_READONLY 7726 | SEC_HAS_CONTENTS)); 7727 } 7728 else if (!strcmp (pa_def_subspaces[i].name, "$DATA$")) 7729 { 7730 data_section = segment; 7731 applicable = bfd_applicable_section_flags (stdoutput); 7732 bfd_set_section_flags (stdoutput, segment, 7733 applicable & (SEC_ALLOC | SEC_LOAD 7734 | SEC_RELOC 7735 | SEC_HAS_CONTENTS)); 7736 7737 } 7738 else if (!strcmp (pa_def_subspaces[i].name, "$BSS$")) 7739 { 7740 bss_section = segment; 7741 applicable = bfd_applicable_section_flags (stdoutput); 7742 bfd_set_section_flags (stdoutput, segment, 7743 applicable & SEC_ALLOC); 7744 } 7745 else if (!strcmp (pa_def_subspaces[i].name, "$LIT$")) 7746 { 7747 applicable = bfd_applicable_section_flags (stdoutput); 7748 bfd_set_section_flags (stdoutput, segment, 7749 applicable & (SEC_ALLOC | SEC_LOAD 7750 | SEC_RELOC 7751 | SEC_READONLY 7752 | SEC_HAS_CONTENTS)); 7753 } 7754 else if (!strcmp (pa_def_subspaces[i].name, "$MILLICODE$")) 7755 { 7756 applicable = bfd_applicable_section_flags (stdoutput); 7757 bfd_set_section_flags (stdoutput, segment, 7758 applicable & (SEC_ALLOC | SEC_LOAD 7759 | SEC_RELOC 7760 | SEC_READONLY 7761 | SEC_HAS_CONTENTS)); 7762 } 7763 else if (!strcmp (pa_def_subspaces[i].name, "$UNWIND$")) 7764 { 7765 applicable = bfd_applicable_section_flags (stdoutput); 7766 bfd_set_section_flags (stdoutput, segment, 7767 applicable & (SEC_ALLOC | SEC_LOAD 7768 | SEC_RELOC 7769 | SEC_READONLY 7770 | SEC_HAS_CONTENTS)); 7771 } 7772 7773 /* Find the space associated with this subspace. */ 7774 space = pa_segment_to_space (pa_def_spaces[pa_def_subspaces[i]. 7775 def_space_index].segment); 7776 if (space == NULL) 7777 { 7778 as_fatal (_("Internal error: Unable to find containing space for %s."), 7779 pa_def_subspaces[i].name); 7780 } 7781 7782 create_new_subspace (space, name, 7783 pa_def_subspaces[i].loadable, 7784 pa_def_subspaces[i].code_only, 7785 pa_def_subspaces[i].common, 7786 pa_def_subspaces[i].dup_common, 7787 pa_def_subspaces[i].zero, 7788 pa_def_subspaces[i].sort, 7789 pa_def_subspaces[i].access, 7790 pa_def_subspaces[i].space_index, 7791 pa_def_subspaces[i].alignment, 7792 pa_def_subspaces[i].quadrant, 7793 segment); 7794 i++; 7795 } 7796 } 7797 7798 /* Create a new space NAME, with the appropriate flags as defined 7799 by the given parameters. */ 7800 7801 static sd_chain_struct * 7802 create_new_space (name, spnum, loadable, defined, private, 7803 sort, seg, user_defined) 7804 char *name; 7805 int spnum; 7806 int loadable; 7807 int defined; 7808 int private; 7809 int sort; 7810 asection *seg; 7811 int user_defined; 7812 { 7813 sd_chain_struct *chain_entry; 7814 7815 chain_entry = (sd_chain_struct *) xmalloc (sizeof (sd_chain_struct)); 7816 if (!chain_entry) 7817 as_fatal (_("Out of memory: could not allocate new space chain entry: %s\n"), 7818 name); 7819 7820 SPACE_NAME (chain_entry) = (char *) xmalloc (strlen (name) + 1); 7821 strcpy (SPACE_NAME (chain_entry), name); 7822 SPACE_DEFINED (chain_entry) = defined; 7823 SPACE_USER_DEFINED (chain_entry) = user_defined; 7824 SPACE_SPNUM (chain_entry) = spnum; 7825 7826 chain_entry->sd_seg = seg; 7827 chain_entry->sd_last_subseg = -1; 7828 chain_entry->sd_subspaces = NULL; 7829 chain_entry->sd_next = NULL; 7830 7831 /* Find spot for the new space based on its sort key. */ 7832 if (!space_dict_last) 7833 space_dict_last = chain_entry; 7834 7835 if (space_dict_root == NULL) 7836 space_dict_root = chain_entry; 7837 else 7838 { 7839 sd_chain_struct *chain_pointer; 7840 sd_chain_struct *prev_chain_pointer; 7841 7842 chain_pointer = space_dict_root; 7843 prev_chain_pointer = NULL; 7844 7845 while (chain_pointer) 7846 { 7847 prev_chain_pointer = chain_pointer; 7848 chain_pointer = chain_pointer->sd_next; 7849 } 7850 7851 /* At this point we've found the correct place to add the new 7852 entry. So add it and update the linked lists as appropriate. */ 7853 if (prev_chain_pointer) 7854 { 7855 chain_entry->sd_next = chain_pointer; 7856 prev_chain_pointer->sd_next = chain_entry; 7857 } 7858 else 7859 { 7860 space_dict_root = chain_entry; 7861 chain_entry->sd_next = chain_pointer; 7862 } 7863 7864 if (chain_entry->sd_next == NULL) 7865 space_dict_last = chain_entry; 7866 } 7867 7868 /* This is here to catch predefined spaces which do not get 7869 modified by the user's input. Another call is found at 7870 the bottom of pa_parse_space_stmt to handle cases where 7871 the user modifies a predefined space. */ 7872 #ifdef obj_set_section_attributes 7873 obj_set_section_attributes (seg, defined, private, sort, spnum); 7874 #endif 7875 7876 return chain_entry; 7877 } 7878 7879 /* Create a new subspace NAME, with the appropriate flags as defined 7880 by the given parameters. 7881 7882 Add the new subspace to the subspace dictionary chain in numerical 7883 order as defined by the SORT entries. */ 7884 7885 static ssd_chain_struct * 7886 create_new_subspace (space, name, loadable, code_only, common, 7887 dup_common, is_zero, sort, access, space_index, 7888 alignment, quadrant, seg) 7889 sd_chain_struct *space; 7890 char *name; 7891 int loadable, code_only, common, dup_common, is_zero; 7892 int sort; 7893 int access; 7894 int space_index; 7895 int alignment; 7896 int quadrant; 7897 asection *seg; 7898 { 7899 ssd_chain_struct *chain_entry; 7900 7901 chain_entry = (ssd_chain_struct *) xmalloc (sizeof (ssd_chain_struct)); 7902 if (!chain_entry) 7903 as_fatal (_("Out of memory: could not allocate new subspace chain entry: %s\n"), name); 7904 7905 SUBSPACE_NAME (chain_entry) = (char *) xmalloc (strlen (name) + 1); 7906 strcpy (SUBSPACE_NAME (chain_entry), name); 7907 7908 /* Initialize subspace_defined. When we hit a .subspace directive 7909 we'll set it to 1 which "locks-in" the subspace attributes. */ 7910 SUBSPACE_DEFINED (chain_entry) = 0; 7911 7912 chain_entry->ssd_subseg = 0; 7913 chain_entry->ssd_seg = seg; 7914 chain_entry->ssd_next = NULL; 7915 7916 /* Find spot for the new subspace based on its sort key. */ 7917 if (space->sd_subspaces == NULL) 7918 space->sd_subspaces = chain_entry; 7919 else 7920 { 7921 ssd_chain_struct *chain_pointer; 7922 ssd_chain_struct *prev_chain_pointer; 7923 7924 chain_pointer = space->sd_subspaces; 7925 prev_chain_pointer = NULL; 7926 7927 while (chain_pointer) 7928 { 7929 prev_chain_pointer = chain_pointer; 7930 chain_pointer = chain_pointer->ssd_next; 7931 } 7932 7933 /* Now we have somewhere to put the new entry. Insert it and update 7934 the links. */ 7935 if (prev_chain_pointer) 7936 { 7937 chain_entry->ssd_next = chain_pointer; 7938 prev_chain_pointer->ssd_next = chain_entry; 7939 } 7940 else 7941 { 7942 space->sd_subspaces = chain_entry; 7943 chain_entry->ssd_next = chain_pointer; 7944 } 7945 } 7946 7947 #ifdef obj_set_subsection_attributes 7948 obj_set_subsection_attributes (seg, space->sd_seg, access, 7949 sort, quadrant); 7950 #endif 7951 7952 return chain_entry; 7953 } 7954 7955 /* Update the information for the given subspace based upon the 7956 various arguments. Return the modified subspace chain entry. */ 7957 7958 static ssd_chain_struct * 7959 update_subspace (space, name, loadable, code_only, common, dup_common, sort, 7960 zero, access, space_index, alignment, quadrant, section) 7961 sd_chain_struct *space; 7962 char *name; 7963 int loadable; 7964 int code_only; 7965 int common; 7966 int dup_common; 7967 int zero; 7968 int sort; 7969 int access; 7970 int space_index; 7971 int alignment; 7972 int quadrant; 7973 asection *section; 7974 { 7975 ssd_chain_struct *chain_entry; 7976 7977 chain_entry = is_defined_subspace (name); 7978 7979 #ifdef obj_set_subsection_attributes 7980 obj_set_subsection_attributes (section, space->sd_seg, access, 7981 sort, quadrant); 7982 #endif 7983 7984 return chain_entry; 7985 } 7986 7987 /* Return the space chain entry for the space with the name NAME or 7988 NULL if no such space exists. */ 7989 7990 static sd_chain_struct * 7991 is_defined_space (name) 7992 char *name; 7993 { 7994 sd_chain_struct *chain_pointer; 7995 7996 for (chain_pointer = space_dict_root; 7997 chain_pointer; 7998 chain_pointer = chain_pointer->sd_next) 7999 { 8000 if (strcmp (SPACE_NAME (chain_pointer), name) == 0) 8001 return chain_pointer; 8002 } 8003 8004 /* No mapping from segment to space was found. Return NULL. */ 8005 return NULL; 8006 } 8007 8008 /* Find and return the space associated with the given seg. If no mapping 8009 from the given seg to a space is found, then return NULL. 8010 8011 Unlike subspaces, the number of spaces is not expected to grow much, 8012 so a linear exhaustive search is OK here. */ 8013 8014 static sd_chain_struct * 8015 pa_segment_to_space (seg) 8016 asection *seg; 8017 { 8018 sd_chain_struct *space_chain; 8019 8020 /* Walk through each space looking for the correct mapping. */ 8021 for (space_chain = space_dict_root; 8022 space_chain; 8023 space_chain = space_chain->sd_next) 8024 { 8025 if (space_chain->sd_seg == seg) 8026 return space_chain; 8027 } 8028 8029 /* Mapping was not found. Return NULL. */ 8030 return NULL; 8031 } 8032 8033 /* Return the space chain entry for the subspace with the name NAME or 8034 NULL if no such subspace exists. 8035 8036 Uses a linear search through all the spaces and subspaces, this may 8037 not be appropriate if we ever being placing each function in its 8038 own subspace. */ 8039 8040 static ssd_chain_struct * 8041 is_defined_subspace (name) 8042 char *name; 8043 { 8044 sd_chain_struct *space_chain; 8045 ssd_chain_struct *subspace_chain; 8046 8047 /* Walk through each space. */ 8048 for (space_chain = space_dict_root; 8049 space_chain; 8050 space_chain = space_chain->sd_next) 8051 { 8052 /* Walk through each subspace looking for a name which matches. */ 8053 for (subspace_chain = space_chain->sd_subspaces; 8054 subspace_chain; 8055 subspace_chain = subspace_chain->ssd_next) 8056 if (strcmp (SUBSPACE_NAME (subspace_chain), name) == 0) 8057 return subspace_chain; 8058 } 8059 8060 /* Subspace wasn't found. Return NULL. */ 8061 return NULL; 8062 } 8063 8064 /* Find and return the subspace associated with the given seg. If no 8065 mapping from the given seg to a subspace is found, then return NULL. 8066 8067 If we ever put each procedure/function within its own subspace 8068 (to make life easier on the compiler and linker), then this will have 8069 to become more efficient. */ 8070 8071 static ssd_chain_struct * 8072 pa_subsegment_to_subspace (seg, subseg) 8073 asection *seg; 8074 subsegT subseg; 8075 { 8076 sd_chain_struct *space_chain; 8077 ssd_chain_struct *subspace_chain; 8078 8079 /* Walk through each space. */ 8080 for (space_chain = space_dict_root; 8081 space_chain; 8082 space_chain = space_chain->sd_next) 8083 { 8084 if (space_chain->sd_seg == seg) 8085 { 8086 /* Walk through each subspace within each space looking for 8087 the correct mapping. */ 8088 for (subspace_chain = space_chain->sd_subspaces; 8089 subspace_chain; 8090 subspace_chain = subspace_chain->ssd_next) 8091 if (subspace_chain->ssd_subseg == (int) subseg) 8092 return subspace_chain; 8093 } 8094 } 8095 8096 /* No mapping from subsegment to subspace found. Return NULL. */ 8097 return NULL; 8098 } 8099 8100 /* Given a number, try and find a space with the name number. 8101 8102 Return a pointer to a space dictionary chain entry for the space 8103 that was found or NULL on failure. */ 8104 8105 static sd_chain_struct * 8106 pa_find_space_by_number (number) 8107 int number; 8108 { 8109 sd_chain_struct *space_chain; 8110 8111 for (space_chain = space_dict_root; 8112 space_chain; 8113 space_chain = space_chain->sd_next) 8114 { 8115 if (SPACE_SPNUM (space_chain) == (unsigned int) number) 8116 return space_chain; 8117 } 8118 8119 /* No appropriate space found. Return NULL. */ 8120 return NULL; 8121 } 8122 8123 /* Return the starting address for the given subspace. If the starting 8124 address is unknown then return zero. */ 8125 8126 static unsigned int 8127 pa_subspace_start (space, quadrant) 8128 sd_chain_struct *space; 8129 int quadrant; 8130 { 8131 /* FIXME. Assumes everyone puts read/write data at 0x4000000, this 8132 is not correct for the PA OSF1 port. */ 8133 if ((strcmp (SPACE_NAME (space), "$PRIVATE$") == 0) && quadrant == 1) 8134 return 0x40000000; 8135 else if (space->sd_seg == data_section && quadrant == 1) 8136 return 0x40000000; 8137 else 8138 return 0; 8139 return 0; 8140 } 8141 8142 /* FIXME. Needs documentation. */ 8143 static int 8144 pa_next_subseg (space) 8145 sd_chain_struct *space; 8146 { 8147 8148 space->sd_last_subseg++; 8149 return space->sd_last_subseg; 8150 } 8151 #endif 8152 8153 /* Helper function for pa_stringer. Used to find the end of 8154 a string. */ 8155 8156 static unsigned int 8157 pa_stringer_aux (s) 8158 char *s; 8159 { 8160 unsigned int c = *s & CHAR_MASK; 8161 8162 switch (c) 8163 { 8164 case '\"': 8165 c = NOT_A_CHAR; 8166 break; 8167 default: 8168 break; 8169 } 8170 return c; 8171 } 8172 8173 /* Handle a .STRING type pseudo-op. */ 8174 8175 static void 8176 pa_stringer (append_zero) 8177 int append_zero; 8178 { 8179 char *s, num_buf[4]; 8180 unsigned int c; 8181 int i; 8182 8183 /* Preprocess the string to handle PA-specific escape sequences. 8184 For example, \xDD where DD is a hexadecimal number should be 8185 changed to \OOO where OOO is an octal number. */ 8186 8187 #ifdef OBJ_SOM 8188 /* We must have a valid space and subspace. */ 8189 pa_check_current_space_and_subspace (); 8190 #endif 8191 8192 /* Skip the opening quote. */ 8193 s = input_line_pointer + 1; 8194 8195 while (is_a_char (c = pa_stringer_aux (s++))) 8196 { 8197 if (c == '\\') 8198 { 8199 c = *s; 8200 switch (c) 8201 { 8202 /* Handle \x<num>. */ 8203 case 'x': 8204 { 8205 unsigned int number; 8206 int num_digit; 8207 char dg; 8208 char *s_start = s; 8209 8210 /* Get past the 'x'. */ 8211 s++; 8212 for (num_digit = 0, number = 0, dg = *s; 8213 num_digit < 2 8214 && (ISDIGIT (dg) || (dg >= 'a' && dg <= 'f') 8215 || (dg >= 'A' && dg <= 'F')); 8216 num_digit++) 8217 { 8218 if (ISDIGIT (dg)) 8219 number = number * 16 + dg - '0'; 8220 else if (dg >= 'a' && dg <= 'f') 8221 number = number * 16 + dg - 'a' + 10; 8222 else 8223 number = number * 16 + dg - 'A' + 10; 8224 8225 s++; 8226 dg = *s; 8227 } 8228 if (num_digit > 0) 8229 { 8230 switch (num_digit) 8231 { 8232 case 1: 8233 sprintf (num_buf, "%02o", number); 8234 break; 8235 case 2: 8236 sprintf (num_buf, "%03o", number); 8237 break; 8238 } 8239 for (i = 0; i <= num_digit; i++) 8240 s_start[i] = num_buf[i]; 8241 } 8242 break; 8243 } 8244 /* This might be a "\"", skip over the escaped char. */ 8245 default: 8246 s++; 8247 break; 8248 } 8249 } 8250 } 8251 stringer (append_zero); 8252 pa_undefine_label (); 8253 } 8254 8255 /* Handle a .VERSION pseudo-op. */ 8256 8257 static void 8258 pa_version (unused) 8259 int unused ATTRIBUTE_UNUSED; 8260 { 8261 obj_version (0); 8262 pa_undefine_label (); 8263 } 8264 8265 #ifdef OBJ_SOM 8266 8267 /* Handle a .COMPILER pseudo-op. */ 8268 8269 static void 8270 pa_compiler (unused) 8271 int unused ATTRIBUTE_UNUSED; 8272 { 8273 obj_som_compiler (0); 8274 pa_undefine_label (); 8275 } 8276 8277 #endif 8278 8279 /* Handle a .COPYRIGHT pseudo-op. */ 8280 8281 static void 8282 pa_copyright (unused) 8283 int unused ATTRIBUTE_UNUSED; 8284 { 8285 obj_copyright (0); 8286 pa_undefine_label (); 8287 } 8288 8289 /* Just like a normal cons, but when finished we have to undefine 8290 the latest space label. */ 8291 8292 static void 8293 pa_cons (nbytes) 8294 int nbytes; 8295 { 8296 cons (nbytes); 8297 pa_undefine_label (); 8298 } 8299 8300 /* Like float_cons, but we need to undefine our label. */ 8301 8302 static void 8303 pa_float_cons (float_type) 8304 int float_type; 8305 { 8306 float_cons (float_type); 8307 pa_undefine_label (); 8308 } 8309 8310 /* Like s_fill, but delete our label when finished. */ 8311 8312 static void 8313 pa_fill (unused) 8314 int unused ATTRIBUTE_UNUSED; 8315 { 8316 #ifdef OBJ_SOM 8317 /* We must have a valid space and subspace. */ 8318 pa_check_current_space_and_subspace (); 8319 #endif 8320 8321 s_fill (0); 8322 pa_undefine_label (); 8323 } 8324 8325 /* Like lcomm, but delete our label when finished. */ 8326 8327 static void 8328 pa_lcomm (needs_align) 8329 int needs_align; 8330 { 8331 #ifdef OBJ_SOM 8332 /* We must have a valid space and subspace. */ 8333 pa_check_current_space_and_subspace (); 8334 #endif 8335 8336 s_lcomm (needs_align); 8337 pa_undefine_label (); 8338 } 8339 8340 /* Like lsym, but delete our label when finished. */ 8341 8342 static void 8343 pa_lsym (unused) 8344 int unused ATTRIBUTE_UNUSED; 8345 { 8346 #ifdef OBJ_SOM 8347 /* We must have a valid space and subspace. */ 8348 pa_check_current_space_and_subspace (); 8349 #endif 8350 8351 s_lsym (0); 8352 pa_undefine_label (); 8353 } 8354 8355 /* On the PA relocations which involve function symbols must not be 8356 adjusted. This so that the linker can know when/how to create argument 8357 relocation stubs for indirect calls and calls to static functions. 8358 8359 "T" field selectors create DLT relative fixups for accessing 8360 globals and statics in PIC code; each DLT relative fixup creates 8361 an entry in the DLT table. The entries contain the address of 8362 the final target (eg accessing "foo" would create a DLT entry 8363 with the address of "foo"). 8364 8365 Unfortunately, the HP linker doesn't take into account any addend 8366 when generating the DLT; so accessing $LIT$+8 puts the address of 8367 $LIT$ into the DLT rather than the address of $LIT$+8. 8368 8369 The end result is we can't perform relocation symbol reductions for 8370 any fixup which creates entries in the DLT (eg they use "T" field 8371 selectors). 8372 8373 Reject reductions involving symbols with external scope; such 8374 reductions make life a living hell for object file editors. 8375 8376 FIXME. Also reject R_HPPA relocations which are 32bits wide in 8377 the code space. The SOM BFD backend doesn't know how to pull the 8378 right bits out of an instruction. */ 8379 8380 int 8381 hppa_fix_adjustable (fixp) 8382 fixS *fixp; 8383 { 8384 reloc_type code; 8385 struct hppa_fix_struct *hppa_fix; 8386 8387 hppa_fix = (struct hppa_fix_struct *) fixp->tc_fix_data; 8388 8389 #ifdef OBJ_SOM 8390 /* Reject reductions of symbols in 32bit relocs. */ 8391 if (fixp->fx_r_type == R_HPPA && hppa_fix->fx_r_format == 32) 8392 return 0; 8393 #endif 8394 8395 #ifdef OBJ_ELF 8396 /* LR/RR selectors are implicitly used for a number of different relocation 8397 types. We must ensure that none of these types are adjusted (see below) 8398 even if they occur with a different selector. */ 8399 code = elf_hppa_reloc_final_type (stdoutput, fixp->fx_r_type, 8400 hppa_fix->fx_r_format, 8401 hppa_fix->fx_r_field); 8402 8403 switch (code) 8404 { 8405 /* Relocation types which use e_lrsel. */ 8406 case R_PARISC_DIR21L: 8407 case R_PARISC_DLTREL21L: 8408 case R_PARISC_DPREL21L: 8409 case R_PARISC_PLTOFF21L: 8410 8411 /* Relocation types which use e_rrsel. */ 8412 case R_PARISC_DIR14R: 8413 case R_PARISC_DIR14DR: 8414 case R_PARISC_DIR14WR: 8415 case R_PARISC_DIR17R: 8416 case R_PARISC_DLTREL14R: 8417 case R_PARISC_DLTREL14DR: 8418 case R_PARISC_DLTREL14WR: 8419 case R_PARISC_DPREL14R: 8420 case R_PARISC_DPREL14DR: 8421 case R_PARISC_DPREL14WR: 8422 case R_PARISC_PLTOFF14R: 8423 case R_PARISC_PLTOFF14DR: 8424 case R_PARISC_PLTOFF14WR: 8425 8426 /* Other types that we reject for reduction. */ 8427 case R_PARISC_GNU_VTENTRY: 8428 case R_PARISC_GNU_VTINHERIT: 8429 return 0; 8430 default: 8431 break; 8432 } 8433 #endif 8434 8435 /* Reject reductions of symbols in sym1-sym2 expressions when 8436 the fixup will occur in a CODE subspace. 8437 8438 XXX FIXME: Long term we probably want to reject all of these; 8439 for example reducing in the debug section would lose if we ever 8440 supported using the optimizing hp linker. */ 8441 if (fixp->fx_addsy 8442 && fixp->fx_subsy 8443 && (hppa_fix->segment->flags & SEC_CODE)) 8444 return 0; 8445 8446 /* We can't adjust any relocs that use LR% and RR% field selectors. 8447 8448 If a symbol is reduced to a section symbol, the assembler will 8449 adjust the addend unless the symbol happens to reside right at 8450 the start of the section. Additionally, the linker has no choice 8451 but to manipulate the addends when coalescing input sections for 8452 "ld -r". Since an LR% field selector is defined to round the 8453 addend, we can't change the addend without risking that a LR% and 8454 it's corresponding (possible multiple) RR% field will no longer 8455 sum to the right value. 8456 8457 eg. Suppose we have 8458 . ldil LR%foo+0,%r21 8459 . ldw RR%foo+0(%r21),%r26 8460 . ldw RR%foo+4(%r21),%r25 8461 8462 If foo is at address 4092 (decimal) in section `sect', then after 8463 reducing to the section symbol we get 8464 . LR%sect+4092 == (L%sect)+0 8465 . RR%sect+4092 == (R%sect)+4092 8466 . RR%sect+4096 == (R%sect)-4096 8467 and the last address loses because rounding the addend to 8k 8468 multiples takes us up to 8192 with an offset of -4096. 8469 8470 In cases where the LR% expression is identical to the RR% one we 8471 will never have a problem, but is so happens that gcc rounds 8472 addends involved in LR% field selectors to work around a HP 8473 linker bug. ie. We often have addresses like the last case 8474 above where the LR% expression is offset from the RR% one. */ 8475 8476 if (hppa_fix->fx_r_field == e_lrsel 8477 || hppa_fix->fx_r_field == e_rrsel 8478 || hppa_fix->fx_r_field == e_nlrsel) 8479 return 0; 8480 8481 /* Reject reductions of symbols in DLT relative relocs, 8482 relocations with plabels. */ 8483 if (hppa_fix->fx_r_field == e_tsel 8484 || hppa_fix->fx_r_field == e_ltsel 8485 || hppa_fix->fx_r_field == e_rtsel 8486 || hppa_fix->fx_r_field == e_psel 8487 || hppa_fix->fx_r_field == e_rpsel 8488 || hppa_fix->fx_r_field == e_lpsel) 8489 return 0; 8490 8491 /* Reject absolute calls (jumps). */ 8492 if (hppa_fix->fx_r_type == R_HPPA_ABS_CALL) 8493 return 0; 8494 8495 /* Reject reductions of function symbols. */ 8496 if (fixp->fx_addsy != 0 && S_IS_FUNCTION (fixp->fx_addsy)) 8497 return 0; 8498 8499 return 1; 8500 } 8501 8502 /* Return nonzero if the fixup in FIXP will require a relocation, 8503 even it if appears that the fixup could be completely handled 8504 within GAS. */ 8505 8506 int 8507 hppa_force_relocation (fixp) 8508 struct fix *fixp; 8509 { 8510 struct hppa_fix_struct *hppa_fixp; 8511 8512 hppa_fixp = (struct hppa_fix_struct *) fixp->tc_fix_data; 8513 #ifdef OBJ_SOM 8514 if (fixp->fx_r_type == (int) R_HPPA_ENTRY 8515 || fixp->fx_r_type == (int) R_HPPA_EXIT 8516 || fixp->fx_r_type == (int) R_HPPA_BEGIN_BRTAB 8517 || fixp->fx_r_type == (int) R_HPPA_END_BRTAB 8518 || fixp->fx_r_type == (int) R_HPPA_BEGIN_TRY 8519 || fixp->fx_r_type == (int) R_HPPA_END_TRY 8520 || (fixp->fx_addsy != NULL && fixp->fx_subsy != NULL 8521 && (hppa_fixp->segment->flags & SEC_CODE) != 0)) 8522 return 1; 8523 #endif 8524 #ifdef OBJ_ELF 8525 if (fixp->fx_r_type == (int) R_PARISC_GNU_VTINHERIT 8526 || fixp->fx_r_type == (int) R_PARISC_GNU_VTENTRY) 8527 return 1; 8528 #endif 8529 8530 assert (fixp->fx_addsy != NULL); 8531 8532 /* Ensure we emit a relocation for global symbols so that dynamic 8533 linking works. */ 8534 if (S_FORCE_RELOC (fixp->fx_addsy, 1)) 8535 return 1; 8536 8537 /* It is necessary to force PC-relative calls/jumps to have a relocation 8538 entry if they're going to need either an argument relocation or long 8539 call stub. */ 8540 if (fixp->fx_pcrel 8541 && arg_reloc_stub_needed (symbol_arg_reloc_info (fixp->fx_addsy), 8542 hppa_fixp->fx_arg_reloc)) 8543 return 1; 8544 8545 /* Now check to see if we're going to need a long-branch stub. */ 8546 if (fixp->fx_r_type == (int) R_HPPA_PCREL_CALL) 8547 { 8548 long pc = md_pcrel_from (fixp); 8549 valueT distance, min_stub_distance; 8550 8551 distance = fixp->fx_offset + S_GET_VALUE (fixp->fx_addsy) - pc - 8; 8552 8553 /* Distance to the closest possible stub. This will detect most 8554 but not all circumstances where a stub will not work. */ 8555 min_stub_distance = pc + 16; 8556 #ifdef OBJ_SOM 8557 if (last_call_info != NULL) 8558 min_stub_distance -= S_GET_VALUE (last_call_info->start_symbol); 8559 #endif 8560 8561 if ((distance + 8388608 >= 16777216 8562 && min_stub_distance <= 8388608) 8563 || (hppa_fixp->fx_r_format == 17 8564 && distance + 262144 >= 524288 8565 && min_stub_distance <= 262144) 8566 || (hppa_fixp->fx_r_format == 12 8567 && distance + 8192 >= 16384 8568 && min_stub_distance <= 8192) 8569 ) 8570 return 1; 8571 } 8572 8573 if (fixp->fx_r_type == (int) R_HPPA_ABS_CALL) 8574 return 1; 8575 8576 /* No need (yet) to force another relocations to be emitted. */ 8577 return 0; 8578 } 8579 8580 /* Now for some ELF specific code. FIXME. */ 8581 #ifdef OBJ_ELF 8582 /* Mark the end of a function so that it's possible to compute 8583 the size of the function in elf_hppa_final_processing. */ 8584 8585 static void 8586 hppa_elf_mark_end_of_function () 8587 { 8588 /* ELF does not have EXIT relocations. All we do is create a 8589 temporary symbol marking the end of the function. */ 8590 char *name; 8591 8592 if (last_call_info == NULL || last_call_info->start_symbol == NULL) 8593 { 8594 /* We have already warned about a missing label, 8595 or other problems. */ 8596 return; 8597 } 8598 8599 name = (char *) xmalloc (strlen ("L$\001end_") 8600 + strlen (S_GET_NAME (last_call_info->start_symbol)) 8601 + 1); 8602 if (name) 8603 { 8604 symbolS *symbolP; 8605 8606 strcpy (name, "L$\001end_"); 8607 strcat (name, S_GET_NAME (last_call_info->start_symbol)); 8608 8609 /* If we have a .exit followed by a .procend, then the 8610 symbol will have already been defined. */ 8611 symbolP = symbol_find (name); 8612 if (symbolP) 8613 { 8614 /* The symbol has already been defined! This can 8615 happen if we have a .exit followed by a .procend. 8616 8617 This is *not* an error. All we want to do is free 8618 the memory we just allocated for the name and continue. */ 8619 xfree (name); 8620 } 8621 else 8622 { 8623 /* symbol value should be the offset of the 8624 last instruction of the function */ 8625 symbolP = symbol_new (name, now_seg, (valueT) (frag_now_fix () - 4), 8626 frag_now); 8627 8628 assert (symbolP); 8629 S_CLEAR_EXTERNAL (symbolP); 8630 symbol_table_insert (symbolP); 8631 } 8632 8633 if (symbolP) 8634 last_call_info->end_symbol = symbolP; 8635 else 8636 as_bad (_("Symbol '%s' could not be created."), name); 8637 8638 } 8639 else 8640 as_bad (_("No memory for symbol name.")); 8641 8642 } 8643 8644 /* For ELF, this function serves one purpose: to setup the st_size 8645 field of STT_FUNC symbols. To do this, we need to scan the 8646 call_info structure list, determining st_size in by taking the 8647 difference in the address of the beginning/end marker symbols. */ 8648 8649 void 8650 elf_hppa_final_processing () 8651 { 8652 struct call_info *call_info_pointer; 8653 8654 for (call_info_pointer = call_info_root; 8655 call_info_pointer; 8656 call_info_pointer = call_info_pointer->ci_next) 8657 { 8658 elf_symbol_type *esym 8659 = ((elf_symbol_type *) 8660 symbol_get_bfdsym (call_info_pointer->start_symbol)); 8661 esym->internal_elf_sym.st_size = 8662 S_GET_VALUE (call_info_pointer->end_symbol) 8663 - S_GET_VALUE (call_info_pointer->start_symbol) + 4; 8664 } 8665 } 8666 8667 static void 8668 pa_vtable_entry (ignore) 8669 int ignore ATTRIBUTE_UNUSED; 8670 { 8671 struct fix *new_fix; 8672 8673 new_fix = obj_elf_vtable_entry (0); 8674 8675 if (new_fix) 8676 { 8677 struct hppa_fix_struct *hppa_fix = (struct hppa_fix_struct *) 8678 obstack_alloc (¬es, sizeof (struct hppa_fix_struct)); 8679 hppa_fix->fx_r_type = R_HPPA; 8680 hppa_fix->fx_r_field = e_fsel; 8681 hppa_fix->fx_r_format = 32; 8682 hppa_fix->fx_arg_reloc = 0; 8683 hppa_fix->segment = now_seg; 8684 new_fix->tc_fix_data = (void *) hppa_fix; 8685 new_fix->fx_r_type = (int) R_PARISC_GNU_VTENTRY; 8686 } 8687 } 8688 8689 static void 8690 pa_vtable_inherit (ignore) 8691 int ignore ATTRIBUTE_UNUSED; 8692 { 8693 struct fix *new_fix; 8694 8695 new_fix = obj_elf_vtable_inherit (0); 8696 8697 if (new_fix) 8698 { 8699 struct hppa_fix_struct *hppa_fix = (struct hppa_fix_struct *) 8700 obstack_alloc (¬es, sizeof (struct hppa_fix_struct)); 8701 hppa_fix->fx_r_type = R_HPPA; 8702 hppa_fix->fx_r_field = e_fsel; 8703 hppa_fix->fx_r_format = 32; 8704 hppa_fix->fx_arg_reloc = 0; 8705 hppa_fix->segment = now_seg; 8706 new_fix->tc_fix_data = (void *) hppa_fix; 8707 new_fix->fx_r_type = (int) R_PARISC_GNU_VTINHERIT; 8708 } 8709 } 8710 #endif 8711