1 /* tc-i370.c -- Assembler for the IBM 360/370/390 instruction set. 2 Loosely based on the ppc files by Linas Vepstas <linas (at) linas.org> 1998, 99 3 Copyright (C) 1994-2014 Free Software Foundation, Inc. 4 Written by Ian Lance Taylor, Cygnus Support. 5 6 This file is part of GAS, the GNU Assembler. 7 8 GAS is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3, or (at your option) 11 any later version. 12 13 GAS is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with GAS; see the file COPYING. If not, write to the Free 20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 21 02110-1301, USA. */ 22 23 /* This assembler implements a very hacked version of an elf-like thing 24 that gcc emits (when gcc is suitably hacked). To make it behave more 25 HLASM-like, try turning on the -M or --mri flag (as there are various 26 similarities between HLASM and the MRI assemblers, such as section 27 names, lack of leading . in pseudo-ops, DC and DS, etc. */ 28 29 #include "as.h" 30 #include "safe-ctype.h" 31 #include "subsegs.h" 32 #include "struc-symbol.h" 33 34 #include "opcode/i370.h" 35 36 #ifdef OBJ_ELF 37 #include "elf/i370.h" 38 #endif 39 40 /* This is the assembler for the System/390 Architecture. */ 41 42 /* Tell the main code what the endianness is. */ 43 extern int target_big_endian; 44 45 46 /* Generic assembler global variables which must be defined by all 48 targets. */ 49 50 #ifdef OBJ_ELF 51 /* This string holds the chars that always start a comment. If the 52 pre-processor is disabled, these aren't very useful. The macro 53 tc_comment_chars points to this. We use this, rather than the 54 usual comment_chars, so that we can switch for Solaris conventions. */ 55 static const char i370_eabi_comment_chars[] = "#"; 56 57 const char *i370_comment_chars = i370_eabi_comment_chars; 58 #else 59 const char comment_chars[] = "#"; 60 #endif 61 62 /* Characters which start a comment at the beginning of a line. */ 63 const char line_comment_chars[] = "#*"; 64 65 /* Characters which may be used to separate multiple commands on a 66 single line. */ 67 const char line_separator_chars[] = ";"; 68 69 /* Characters which are used to indicate an exponent in a floating 70 point number. */ 71 const char EXP_CHARS[] = "eE"; 72 73 /* Characters which mean that a number is a floating point constant, 74 as in 0d1.0. */ 75 const char FLT_CHARS[] = "dD"; 76 77 void 78 md_show_usage (FILE *stream) 79 { 80 fprintf (stream, "\ 81 S/370 options: (these have not yet been tested and may not work) \n\ 82 -u ignored\n\ 83 -mregnames Allow symbolic names for registers\n\ 84 -mno-regnames Do not allow symbolic names for registers\n"); 85 #ifdef OBJ_ELF 86 fprintf (stream, "\ 87 -mrelocatable support for GCC's -mrelocatble option\n\ 88 -mrelocatable-lib support for GCC's -mrelocatble-lib option\n\ 89 -V print assembler version number\n"); 90 #endif 91 } 92 93 /* Whether to use user friendly register names. */ 94 #define TARGET_REG_NAMES_P TRUE 95 96 static bfd_boolean reg_names_p = TARGET_REG_NAMES_P; 97 98 99 /* Predefined register names if -mregnames 101 In general, there are lots of them, in an attempt to be compatible 102 with a number of assemblers. */ 103 104 /* Structure to hold information about predefined registers. */ 105 struct pd_reg 106 { 107 char *name; 108 int value; 109 }; 110 111 /* List of registers that are pre-defined: 112 113 Each general register has predefined names of the form: 114 1. r<reg_num> which has the value <reg_num>. 115 2. r.<reg_num> which has the value <reg_num>. 116 117 Each floating point register has predefined names of the form: 118 1. f<reg_num> which has the value <reg_num>. 119 2. f.<reg_num> which has the value <reg_num>. 120 121 There are only four floating point registers, and these are 122 commonly labelled 0,2,4 and 6. Thus, there is no f1, f3, etc. 123 124 There are individual registers as well: 125 rbase or r.base has the value 3 (base register) 126 rpgt or r.pgt has the value 4 (page origin table pointer) 127 rarg or r.arg has the value 11 (argument pointer) 128 rtca or r.tca has the value 12 (table of contents pointer) 129 rtoc or r.toc has the value 12 (table of contents pointer) 130 sp or r.sp has the value 13 (stack pointer) 131 dsa or r.dsa has the value 13 (stack pointer) 132 lr has the value 14 (link reg) 133 134 The table is sorted. Suitable for searching by a binary search. */ 135 136 static const struct pd_reg pre_defined_registers[] = 137 { 138 { "arg", 11 }, /* Argument Pointer. */ 139 { "base", 3 }, /* Base Reg. */ 140 141 { "f.0", 0 }, /* Floating point registers. */ 142 { "f.2", 2 }, 143 { "f.4", 4 }, 144 { "f.6", 6 }, 145 146 { "f0", 0 }, 147 { "f2", 2 }, 148 { "f4", 4 }, 149 { "f6", 6 }, 150 151 { "dsa",13 }, /* Stack pointer. */ 152 { "lr", 14 }, /* Link Register. */ 153 { "pgt", 4 }, /* Page Origin Table Pointer. */ 154 155 { "r.0", 0 }, /* General Purpose Registers. */ 156 { "r.1", 1 }, 157 { "r.10", 10 }, 158 { "r.11", 11 }, 159 { "r.12", 12 }, 160 { "r.13", 13 }, 161 { "r.14", 14 }, 162 { "r.15", 15 }, 163 { "r.2", 2 }, 164 { "r.3", 3 }, 165 { "r.4", 4 }, 166 { "r.5", 5 }, 167 { "r.6", 6 }, 168 { "r.7", 7 }, 169 { "r.8", 8 }, 170 { "r.9", 9 }, 171 172 { "r.arg", 11 }, /* Argument Pointer. */ 173 { "r.base", 3 }, /* Base Reg. */ 174 { "r.dsa", 13 }, /* Stack Pointer. */ 175 { "r.pgt", 4 }, /* Page Origin Table Pointer. */ 176 { "r.sp", 13 }, /* Stack Pointer. */ 177 178 { "r.tca", 12 }, /* Pointer to the table of contents. */ 179 { "r.toc", 12 }, /* Pointer to the table of contents. */ 180 181 { "r0", 0 }, /* More general purpose registers. */ 182 { "r1", 1 }, 183 { "r10", 10 }, 184 { "r11", 11 }, 185 { "r12", 12 }, 186 { "r13", 13 }, 187 { "r14", 14 }, 188 { "r15", 15 }, 189 { "r2", 2 }, 190 { "r3", 3 }, 191 { "r4", 4 }, 192 { "r5", 5 }, 193 { "r6", 6 }, 194 { "r7", 7 }, 195 { "r8", 8 }, 196 { "r9", 9 }, 197 198 { "rbase", 3 }, /* Base Reg. */ 199 200 { "rtca", 12 }, /* Pointer to the table of contents. */ 201 { "rtoc", 12 }, /* Pointer to the table of contents. */ 202 203 { "sp", 13 }, /* Stack Pointer. */ 204 205 }; 206 207 #define REG_NAME_CNT (sizeof (pre_defined_registers) / sizeof (struct pd_reg)) 208 209 /* Given NAME, find the register number associated with that name, return 210 the integer value associated with the given name or -1 on failure. */ 211 212 static int 213 reg_name_search (const struct pd_reg *regs, 214 int regcount, 215 const char *name) 216 { 217 int middle, low, high; 218 int cmp; 219 220 low = 0; 221 high = regcount - 1; 222 223 do 224 { 225 middle = (low + high) / 2; 226 cmp = strcasecmp (name, regs[middle].name); 227 if (cmp < 0) 228 high = middle - 1; 229 else if (cmp > 0) 230 low = middle + 1; 231 else 232 return regs[middle].value; 233 } 234 while (low <= high); 235 236 return -1; 237 } 238 239 /* Summary of register_name(). 240 241 in: Input_line_pointer points to 1st char of operand. 242 243 out: An expressionS. 244 The operand may have been a register: in this case, X_op == O_register, 245 X_add_number is set to the register number, and truth is returned. 246 Input_line_pointer->(next non-blank) char after operand, or is in its 247 original state. */ 248 249 static bfd_boolean 250 register_name (expressionS *expressionP) 251 { 252 int reg_number; 253 char *name; 254 char *start; 255 char c; 256 257 /* Find the spelling of the operand. */ 258 start = name = input_line_pointer; 259 if (name[0] == '%' && ISALPHA (name[1])) 260 name = ++input_line_pointer; 261 262 else if (!reg_names_p) 263 return FALSE; 264 265 while (' ' == *name) 266 name = ++input_line_pointer; 267 268 /* If it's a number, treat it as a number. If it's alpha, look to 269 see if it's in the register table. */ 270 if (!ISALPHA (name[0])) 271 reg_number = get_single_number (); 272 else 273 { 274 c = get_symbol_end (); 275 reg_number = reg_name_search (pre_defined_registers, REG_NAME_CNT, name); 276 277 /* Put back the delimiting char. */ 278 *input_line_pointer = c; 279 } 280 281 /* If numeric, make sure its not out of bounds. */ 282 if ((0 <= reg_number) && (16 >= reg_number)) 283 { 284 expressionP->X_op = O_register; 285 expressionP->X_add_number = reg_number; 286 287 /* Make the rest nice. */ 288 expressionP->X_add_symbol = NULL; 289 expressionP->X_op_symbol = NULL; 290 return TRUE; 291 } 292 293 /* Reset the line as if we had not done anything. */ 294 input_line_pointer = start; 295 return FALSE; 296 } 297 298 /* Local variables. */ 300 301 /* The type of processor we are assembling for. This is one or more 302 of the I370_OPCODE flags defined in opcode/i370.h. */ 303 static int i370_cpu = 0; 304 305 /* The base register to use for opcode with optional operands. 306 We define two of these: "text" and "other". Normally, "text" 307 would get used in the .text section for branches, while "other" 308 gets used in the .data section for address constants. 309 310 The idea of a second base register in a different section 311 is foreign to the usual HLASM-style semantics; however, it 312 allows us to provide support for dynamically loaded libraries, 313 by allowing us to place address constants in a section other 314 than the text section. The "other" section need not be the 315 .data section, it can be any section that isn't the .text section. 316 317 Note that HLASM defines a multiple, concurrent .using semantic 318 that we do not: in calculating offsets, it uses either the most 319 recent .using directive, or the one with the smallest displacement. 320 This allows HLASM to support a quasi-block-scope-like behaviour. 321 Handy for people writing assembly by hand ... but not supported 322 by us. */ 323 static int i370_using_text_regno = -1; 324 static int i370_using_other_regno = -1; 325 326 /* The base address for address literals. */ 327 static expressionS i370_using_text_baseaddr; 328 static expressionS i370_using_other_baseaddr; 329 330 /* the "other" section, used only for syntax error detection. */ 331 static segT i370_other_section = undefined_section; 332 333 /* Opcode hash table. */ 334 static struct hash_control *i370_hash; 335 336 /* Macro hash table. */ 337 static struct hash_control *i370_macro_hash; 338 339 #ifdef OBJ_ELF 340 /* What type of shared library support to use. */ 341 static enum { SHLIB_NONE, SHLIB_PIC, SHILB_MRELOCATABLE } shlib = SHLIB_NONE; 342 #endif 343 344 /* Flags to set in the elf header. */ 345 static flagword i370_flags = 0; 346 347 #ifndef WORKING_DOT_WORD 348 int md_short_jump_size = 4; 349 int md_long_jump_size = 4; 350 #endif 351 352 #ifdef OBJ_ELF 354 const char *md_shortopts = "l:um:K:VQ:"; 355 #else 356 const char *md_shortopts = "um:"; 357 #endif 358 struct option md_longopts[] = 359 { 360 {NULL, no_argument, NULL, 0} 361 }; 362 size_t md_longopts_size = sizeof (md_longopts); 363 364 int 365 md_parse_option (int c, char *arg) 366 { 367 switch (c) 368 { 369 case 'u': 370 /* -u means that any undefined symbols should be treated as 371 external, which is the default for gas anyhow. */ 372 break; 373 374 #ifdef OBJ_ELF 375 case 'K': 376 /* Recognize -K PIC */ 377 if (strcmp (arg, "PIC") == 0 || strcmp (arg, "pic") == 0) 378 { 379 shlib = SHLIB_PIC; 380 i370_flags |= EF_I370_RELOCATABLE_LIB; 381 } 382 else 383 return 0; 384 385 break; 386 #endif 387 388 case 'm': 389 390 /* -m360 mean to assemble for the ancient 360 architecture. */ 391 if (strcmp (arg, "360") == 0 || strcmp (arg, "i360") == 0) 392 i370_cpu = I370_OPCODE_360; 393 /* -mxa means to assemble for the IBM 370 XA. */ 394 else if (strcmp (arg, "xa") == 0) 395 i370_cpu = I370_OPCODE_370_XA; 396 /* -many means to assemble for any architecture (370/XA). */ 397 else if (strcmp (arg, "any") == 0) 398 i370_cpu = I370_OPCODE_370; 399 400 else if (strcmp (arg, "regnames") == 0) 401 reg_names_p = TRUE; 402 403 else if (strcmp (arg, "no-regnames") == 0) 404 reg_names_p = FALSE; 405 406 #ifdef OBJ_ELF 407 /* -mrelocatable/-mrelocatable-lib -- warn about 408 initializations that require relocation. */ 409 else if (strcmp (arg, "relocatable") == 0) 410 { 411 shlib = SHILB_MRELOCATABLE; 412 i370_flags |= EF_I370_RELOCATABLE; 413 } 414 else if (strcmp (arg, "relocatable-lib") == 0) 415 { 416 shlib = SHILB_MRELOCATABLE; 417 i370_flags |= EF_I370_RELOCATABLE_LIB; 418 } 419 #endif 420 else 421 { 422 as_bad (_("invalid switch -m%s"), arg); 423 return 0; 424 } 425 break; 426 427 #ifdef OBJ_ELF 428 /* -V: SVR4 argument to print version ID. */ 429 case 'V': 430 print_version_id (); 431 break; 432 433 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section 434 should be emitted or not. FIXME: Not implemented. */ 435 case 'Q': 436 break; 437 438 #endif 439 440 default: 441 return 0; 442 } 443 444 return 1; 445 } 446 447 448 /* Set i370_cpu if it is not already set. 450 Currently defaults to the reasonable superset; 451 but can be made more fine grained if desred. */ 452 453 static void 454 i370_set_cpu (void) 455 { 456 const char *default_os = TARGET_OS; 457 const char *default_cpu = TARGET_CPU; 458 459 /* Override with the superset for the moment. */ 460 i370_cpu = I370_OPCODE_ESA390_SUPERSET; 461 if (i370_cpu == 0) 462 { 463 if (strcmp (default_cpu, "i360") == 0) 464 i370_cpu = I370_OPCODE_360; 465 else if (strcmp (default_cpu, "i370") == 0) 466 i370_cpu = I370_OPCODE_370; 467 else if (strcmp (default_cpu, "XA") == 0) 468 i370_cpu = I370_OPCODE_370_XA; 469 else 470 as_fatal ("Unknown default cpu = %s, os = %s", default_cpu, default_os); 471 } 472 } 473 474 /* Figure out the BFD architecture to use. 475 FIXME: specify the different 370 architectures. */ 476 477 enum bfd_architecture 478 i370_arch (void) 479 { 480 return bfd_arch_i370; 481 } 482 483 /* This function is called when the assembler starts up. It is called 484 after the options have been parsed and the output file has been 485 opened. */ 486 487 void 488 md_begin (void) 489 { 490 const struct i370_opcode *op; 491 const struct i370_opcode *op_end; 492 const struct i370_macro *macro; 493 const struct i370_macro *macro_end; 494 bfd_boolean dup_insn = FALSE; 495 496 i370_set_cpu (); 497 498 #ifdef OBJ_ELF 499 /* Set the ELF flags if desired. */ 500 if (i370_flags) 501 bfd_set_private_flags (stdoutput, i370_flags); 502 #endif 503 504 /* Insert the opcodes into a hash table. */ 505 i370_hash = hash_new (); 506 507 op_end = i370_opcodes + i370_num_opcodes; 508 for (op = i370_opcodes; op < op_end; op++) 509 { 510 know ((op->opcode.i[0] & op->mask.i[0]) == op->opcode.i[0] 511 && (op->opcode.i[1] & op->mask.i[1]) == op->opcode.i[1]); 512 513 if ((op->flags & i370_cpu) != 0) 514 { 515 const char *retval; 516 517 retval = hash_insert (i370_hash, op->name, (void *) op); 518 if (retval != (const char *) NULL) 519 { 520 as_bad (_("Internal assembler error for instruction %s"), op->name); 521 dup_insn = TRUE; 522 } 523 } 524 } 525 526 /* Insert the macros into a hash table. */ 527 i370_macro_hash = hash_new (); 528 529 macro_end = i370_macros + i370_num_macros; 530 for (macro = i370_macros; macro < macro_end; macro++) 531 { 532 if ((macro->flags & i370_cpu) != 0) 533 { 534 const char *retval; 535 536 retval = hash_insert (i370_macro_hash, macro->name, (void *) macro); 537 if (retval != (const char *) NULL) 538 { 539 as_bad (_("Internal assembler error for macro %s"), macro->name); 540 dup_insn = TRUE; 541 } 542 } 543 } 544 545 if (dup_insn) 546 abort (); 547 } 548 549 /* Insert an operand value into an instruction. */ 550 551 static i370_insn_t 552 i370_insert_operand (i370_insn_t insn, 553 const struct i370_operand *operand, 554 offsetT val) 555 { 556 if (operand->insert) 557 { 558 const char *errmsg; 559 560 /* Used for 48-bit insn's. */ 561 errmsg = NULL; 562 insn = (*operand->insert) (insn, (long) val, &errmsg); 563 if (errmsg) 564 as_bad ("%s", errmsg); 565 } 566 else 567 /* This is used only for 16, 32 bit insn's. */ 568 insn.i[0] |= (((long) val & ((1 << operand->bits) - 1)) 569 << operand->shift); 570 571 return insn; 572 } 573 574 575 #ifdef OBJ_ELF 577 /* Parse @got, etc. and return the desired relocation. 578 Currently, i370 does not support (don't really need to support) any 579 of these fancier markups ... for example, no one is going to 580 write 'L 6,=V(bogus)@got' it just doesn't make sense (at least to me). 581 So basically, we could get away with this routine returning 582 BFD_RELOC_UNUSED in all circumstances. However, I'll leave 583 in for now in case someone ambitious finds a good use for this stuff ... 584 this routine was pretty much just copied from the powerpc code ... */ 585 586 static bfd_reloc_code_real_type 587 i370_elf_suffix (char **str_p, expressionS *exp_p) 588 { 589 struct map_bfd 590 { 591 char *string; 592 int length; 593 bfd_reloc_code_real_type reloc; 594 }; 595 596 char ident[20]; 597 char *str = *str_p; 598 char *str2; 599 int ch; 600 int len; 601 struct map_bfd *ptr; 602 603 #define MAP(str,reloc) { str, sizeof (str) - 1, reloc } 604 605 static struct map_bfd mapping[] = 606 { 607 /* warnings with -mrelocatable. */ 608 MAP ("fixup", BFD_RELOC_CTOR), 609 { (char *)0, 0, BFD_RELOC_UNUSED } 610 }; 611 612 if (*str++ != '@') 613 return BFD_RELOC_UNUSED; 614 615 for (ch = *str, str2 = ident; 616 (str2 < ident + sizeof (ident) - 1 617 && (ISALNUM (ch) || ch == '@')); 618 ch = *++str) 619 *str2++ = TOLOWER (ch); 620 621 *str2 = '\0'; 622 len = str2 - ident; 623 624 ch = ident[0]; 625 for (ptr = &mapping[0]; ptr->length > 0; ptr++) 626 if (ch == ptr->string[0] 627 && len == ptr->length 628 && memcmp (ident, ptr->string, ptr->length) == 0) 629 { 630 if (exp_p->X_add_number != 0 631 && (ptr->reloc == BFD_RELOC_16_GOTOFF 632 || ptr->reloc == BFD_RELOC_LO16_GOTOFF 633 || ptr->reloc == BFD_RELOC_HI16_GOTOFF 634 || ptr->reloc == BFD_RELOC_HI16_S_GOTOFF)) 635 as_warn (_("identifier+constant@got means identifier@got+constant")); 636 637 /* Now check for identifier@suffix+constant */ 638 if (*str == '-' || *str == '+') 639 { 640 char *orig_line = input_line_pointer; 641 expressionS new_exp; 642 643 input_line_pointer = str; 644 expression (&new_exp); 645 if (new_exp.X_op == O_constant) 646 { 647 exp_p->X_add_number += new_exp.X_add_number; 648 str = input_line_pointer; 649 } 650 651 if (&input_line_pointer != str_p) 652 input_line_pointer = orig_line; 653 } 654 655 *str_p = str; 656 return ptr->reloc; 657 } 658 659 return BFD_RELOC_UNUSED; 660 } 661 662 /* Like normal .long/.short/.word, except support @got, etc. 663 Clobbers input_line_pointer, checks end-of-line. */ 664 665 static void 666 i370_elf_cons (int nbytes) /* 1=.byte, 2=.word, 4=.long. */ 667 { 668 expressionS exp; 669 bfd_reloc_code_real_type reloc; 670 671 if (is_it_end_of_statement ()) 672 { 673 demand_empty_rest_of_line (); 674 return; 675 } 676 677 do 678 { 679 expression (&exp); 680 681 if (exp.X_op == O_symbol 682 && *input_line_pointer == '@' 683 && (reloc = i370_elf_suffix (&input_line_pointer, &exp)) != BFD_RELOC_UNUSED) 684 { 685 reloc_howto_type *reloc_howto = bfd_reloc_type_lookup (stdoutput, reloc); 686 int size = bfd_get_reloc_size (reloc_howto); 687 688 if (size > nbytes) 689 as_bad (_("%s relocations do not fit in %d bytes\n"), 690 reloc_howto->name, nbytes); 691 else 692 { 693 char *p = frag_more ((int) nbytes); 694 int offset = nbytes - size; 695 696 fix_new_exp (frag_now, p - frag_now->fr_literal + offset, size, &exp, 0, reloc); 697 } 698 } 699 else 700 emit_expr (&exp, (unsigned int) nbytes); 701 } 702 while (*input_line_pointer++ == ','); 703 704 input_line_pointer--; /* Put terminator back into stream. */ 705 demand_empty_rest_of_line (); 706 } 707 708 709 /* ASCII to EBCDIC conversion table. */ 711 static unsigned char ascebc[256] = 712 { 713 /*00 NL SH SX EX ET NQ AK BL */ 714 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, 715 /*08 BS HT LF VT FF CR SO SI */ 716 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 717 /*10 DL D1 D2 D3 D4 NK SN EB */ 718 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 719 /*18 CN EM SB EC FS GS RS US */ 720 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F, 721 /*20 SP ! " # $ % & ' */ 722 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 723 /*28 ( ) * + , - . / */ 724 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61, 725 /*30 0 1 2 3 4 5 6 7 */ 726 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 727 /*38 8 9 : ; < = > ? */ 728 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F, 729 /*40 @ A B C D E F G */ 730 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 731 /*48 H I J K L M N O */ 732 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 733 /*50 P Q R S T U V W */ 734 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 735 /*58 X Y Z [ \ ] ^ _ */ 736 0xE7, 0xE8, 0xE9, 0xAD, 0xE0, 0xBD, 0x5F, 0x6D, 737 /*60 ` a b c d e f g */ 738 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 739 /*68 h i j k l m n o */ 740 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 741 /*70 p q r s t u v w */ 742 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 743 /*78 x y z { | } ~ DL */ 744 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07, 745 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 746 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 747 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 748 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 749 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 750 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 751 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 752 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 753 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 754 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 755 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 756 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 757 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 758 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 759 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 760 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFF 761 }; 762 763 /* EBCDIC to ASCII conversion table. */ 764 unsigned char ebcasc[256] = 765 { 766 /*00 NU SH SX EX PF HT LC DL */ 767 0x00, 0x01, 0x02, 0x03, 0x00, 0x09, 0x00, 0x7F, 768 /*08 SM VT FF CR SO SI */ 769 0x00, 0x00, 0x00, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 770 /*10 DE D1 D2 TM RS NL BS IL */ 771 0x10, 0x11, 0x12, 0x13, 0x14, 0x0A, 0x08, 0x00, 772 /*18 CN EM CC C1 FS GS RS US */ 773 0x18, 0x19, 0x00, 0x00, 0x1C, 0x1D, 0x1E, 0x1F, 774 /*20 DS SS FS BP LF EB EC */ 775 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x17, 0x1B, 776 /*28 SM C2 EQ AK BL */ 777 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x07, 0x00, 778 /*30 SY PN RS UC ET */ 779 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 780 /*38 C3 D4 NK SU */ 781 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x00, 0x1A, 782 /*40 SP */ 783 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 784 /*48 . < ( + | */ 785 0x00, 0x00, 0x00, 0x2E, 0x3C, 0x28, 0x2B, 0x7C, 786 /*50 & */ 787 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 788 /*58 ! $ * ) ; ^ */ 789 0x00, 0x00, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x5E, 790 /*60 - / */ 791 0x2D, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 792 /*68 , % _ > ? */ 793 0x00, 0x00, 0x00, 0x2C, 0x25, 0x5F, 0x3E, 0x3F, 794 /*70 */ 795 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 796 /*78 ` : # @ ' = " */ 797 0x00, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22, 798 /*80 a b c d e f g */ 799 0x00, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 800 /*88 h i { */ 801 0x68, 0x69, 0x00, 0x7B, 0x00, 0x00, 0x00, 0x00, 802 /*90 j k l m n o p */ 803 0x00, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 804 /*98 q r } */ 805 0x71, 0x72, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x00, 806 /*A0 ~ s t u v w x */ 807 0x00, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 808 /*A8 y z [ */ 809 0x79, 0x7A, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 810 /*B0 */ 811 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 812 /*B8 ] */ 813 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 814 /*C0 { A B C D E F G */ 815 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 816 /*C8 H I */ 817 0x48, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 818 /*D0 } J K L M N O P */ 819 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 820 /*D8 Q R */ 821 0x51, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 822 /*E0 \ S T U V W X */ 823 0x5C, 0x00, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 824 /*E8 Y Z */ 825 0x59, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 826 /*F0 0 1 2 3 4 5 6 7 */ 827 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 828 /*F8 8 9 */ 829 0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF 830 }; 831 832 /* EBCDIC translation tables needed for 3270 support. */ 833 834 static void 835 i370_ebcdic (int unused ATTRIBUTE_UNUSED) 836 { 837 char *p, *end; 838 char delim = 0; 839 size_t nbytes; 840 841 nbytes = strlen (input_line_pointer); 842 end = input_line_pointer + nbytes; 843 while ('\r' == *end) end --; 844 while ('\n' == *end) end --; 845 846 delim = *input_line_pointer; 847 if (('\'' == delim) || ('\"' == delim)) 848 { 849 input_line_pointer ++; 850 end = rindex (input_line_pointer, delim); 851 } 852 853 if (end > input_line_pointer) 854 { 855 nbytes = end - input_line_pointer +1; 856 p = frag_more (nbytes); 857 while (end > input_line_pointer) 858 { 859 *p = ascebc [(unsigned char) (*input_line_pointer)]; 860 ++p; ++input_line_pointer; 861 } 862 *p = '\0'; 863 } 864 if (delim == *input_line_pointer) ++input_line_pointer; 865 } 866 867 868 /* Stub out a couple of routines. */ 870 871 static void 872 i370_rmode (int unused ATTRIBUTE_UNUSED) 873 { 874 as_tsktsk ("rmode ignored"); 875 } 876 877 static void 878 i370_dsect (int sect) 879 { 880 char *save_line = input_line_pointer; 881 static char section[] = ".data\n"; 882 883 /* Just pretend this is .section .data. */ 884 input_line_pointer = section; 885 obj_elf_section (sect); 886 887 input_line_pointer = save_line; 888 } 889 890 static void 891 i370_csect (int unused ATTRIBUTE_UNUSED) 892 { 893 as_tsktsk ("csect not supported"); 894 } 895 896 897 /* DC Define Const is only partially supported. 899 For samplecode on what to do, look at i370_elf_cons() above. 900 This code handles pseudoops of the style 901 DC D'3.141592653' # in sysv4, .double 3.14159265 902 DC F'1' # in sysv4, .long 1. */ 903 904 static void 905 i370_dc (int unused ATTRIBUTE_UNUSED) 906 { 907 char * p, tmp[50]; 908 int nbytes=0; 909 expressionS exp; 910 char type=0; 911 char * clse; 912 913 if (is_it_end_of_statement ()) 914 { 915 demand_empty_rest_of_line (); 916 return; 917 } 918 919 /* Figure out the size. */ 920 type = *input_line_pointer++; 921 switch (type) 922 { 923 case 'H': /* 16-bit */ 924 nbytes = 2; 925 break; 926 case 'E': /* 32-bit */ 927 case 'F': /* 32-bit */ 928 nbytes = 4; 929 break; 930 case 'D': /* 64-bit */ 931 nbytes = 8; 932 break; 933 default: 934 as_bad (_("unsupported DC type")); 935 return; 936 } 937 938 /* Get rid of pesky quotes. */ 939 if ('\'' == *input_line_pointer) 940 { 941 ++input_line_pointer; 942 clse = strchr (input_line_pointer, '\''); 943 if (clse) 944 *clse= ' '; 945 else 946 as_bad (_("missing end-quote")); 947 } 948 949 if ('\"' == *input_line_pointer) 950 { 951 ++input_line_pointer; 952 clse = strchr (input_line_pointer, '\"'); 953 if (clse) 954 *clse= ' '; 955 else 956 as_bad (_("missing end-quote")); 957 } 958 959 switch (type) 960 { 961 case 'H': /* 16-bit */ 962 case 'F': /* 32-bit */ 963 expression (&exp); 964 emit_expr (&exp, nbytes); 965 break; 966 case 'E': /* 32-bit */ 967 type = 'f'; 968 case 'D': /* 64-bit */ 969 md_atof (type, tmp, &nbytes); 970 p = frag_more (nbytes); 971 memcpy (p, tmp, nbytes); 972 break; 973 default: 974 as_bad (_("unsupported DC type")); 975 return; 976 } 977 978 demand_empty_rest_of_line (); 979 } 980 981 982 /* Provide minimal support for DS Define Storage. */ 984 985 static void 986 i370_ds (int unused ATTRIBUTE_UNUSED) 987 { 988 /* DS 0H or DS 0F or DS 0D. */ 989 if ('0' == *input_line_pointer) 990 { 991 int alignment = 0; /* Left shift 1 << align. */ 992 input_line_pointer ++; 993 switch (*input_line_pointer++) 994 { 995 case 'H': /* 16-bit */ 996 alignment = 1; 997 break; 998 case 'F': /* 32-bit */ 999 alignment = 2; 1000 break; 1001 case 'D': /* 64-bit */ 1002 alignment = 3; 1003 break; 1004 default: 1005 as_bad (_("unsupported alignment")); 1006 return; 1007 } 1008 frag_align (alignment, 0, 0); 1009 record_alignment (now_seg, alignment); 1010 } 1011 else 1012 as_bad (_("this DS form not yet supported")); 1013 } 1014 1015 /* Solaris pseudo op to change to the .rodata section. */ 1016 1017 static void 1018 i370_elf_rdata (int sect) 1019 { 1020 char *save_line = input_line_pointer; 1021 static char section[] = ".rodata\n"; 1022 1023 /* Just pretend this is .section .rodata. */ 1024 input_line_pointer = section; 1025 obj_elf_section (sect); 1026 1027 input_line_pointer = save_line; 1028 } 1029 1030 /* Pseudo op to make file scope bss items. */ 1031 1032 static void 1033 i370_elf_lcomm (int unused ATTRIBUTE_UNUSED) 1034 { 1035 char *name; 1036 char c; 1037 char *p; 1038 offsetT size; 1039 symbolS *symbolP; 1040 offsetT align; 1041 segT old_sec; 1042 int old_subsec; 1043 char *pfrag; 1044 int align2; 1045 1046 name = input_line_pointer; 1047 c = get_symbol_end (); 1048 1049 /* Just after name is now '\0'. */ 1050 p = input_line_pointer; 1051 *p = c; 1052 SKIP_WHITESPACE (); 1053 if (*input_line_pointer != ',') 1054 { 1055 as_bad (_("Expected comma after symbol-name: rest of line ignored.")); 1056 ignore_rest_of_line (); 1057 return; 1058 } 1059 1060 /* Skip ','. */ 1061 input_line_pointer++; 1062 if ((size = get_absolute_expression ()) < 0) 1063 { 1064 as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) size); 1065 ignore_rest_of_line (); 1066 return; 1067 } 1068 1069 /* The third argument to .lcomm is the alignment. */ 1070 if (*input_line_pointer != ',') 1071 align = 8; 1072 else 1073 { 1074 ++input_line_pointer; 1075 align = get_absolute_expression (); 1076 if (align <= 0) 1077 { 1078 as_warn (_("ignoring bad alignment")); 1079 align = 8; 1080 } 1081 } 1082 1083 *p = 0; 1084 symbolP = symbol_find_or_make (name); 1085 *p = c; 1086 1087 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP)) 1088 { 1089 as_bad (_("Ignoring attempt to re-define symbol `%s'."), 1090 S_GET_NAME (symbolP)); 1091 ignore_rest_of_line (); 1092 return; 1093 } 1094 1095 if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size) 1096 { 1097 as_bad (_("Length of .lcomm \"%s\" is already %ld. Not changed to %ld."), 1098 S_GET_NAME (symbolP), 1099 (long) S_GET_VALUE (symbolP), 1100 (long) size); 1101 1102 ignore_rest_of_line (); 1103 return; 1104 } 1105 1106 /* Allocate_bss: */ 1107 old_sec = now_seg; 1108 old_subsec = now_subseg; 1109 if (align) 1110 { 1111 /* Convert to a power of 2 alignment. */ 1112 for (align2 = 0; (align & 1) == 0; align >>= 1, ++align2) 1113 ; 1114 if (align != 1) 1115 { 1116 as_bad (_("Common alignment not a power of 2")); 1117 ignore_rest_of_line (); 1118 return; 1119 } 1120 } 1121 else 1122 align2 = 0; 1123 1124 record_alignment (bss_section, align2); 1125 subseg_set (bss_section, 0); 1126 if (align2) 1127 frag_align (align2, 0, 0); 1128 if (S_GET_SEGMENT (symbolP) == bss_section) 1129 symbol_get_frag (symbolP)->fr_symbol = 0; 1130 symbol_set_frag (symbolP, frag_now); 1131 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, size, 1132 (char *) 0); 1133 *pfrag = 0; 1134 S_SET_SIZE (symbolP, size); 1135 S_SET_SEGMENT (symbolP, bss_section); 1136 subseg_set (old_sec, old_subsec); 1137 demand_empty_rest_of_line (); 1138 } 1139 1140 /* Validate any relocations emitted for -mrelocatable, possibly adding 1141 fixups for word relocations in writable segments, so we can adjust 1142 them at runtime. */ 1143 1144 static void 1145 i370_elf_validate_fix (fixS *fixp, segT seg) 1146 { 1147 if (fixp->fx_done || fixp->fx_pcrel) 1148 return; 1149 1150 switch (shlib) 1151 { 1152 case SHLIB_NONE: 1153 case SHLIB_PIC: 1154 return; 1155 1156 case SHILB_MRELOCATABLE: 1157 if (fixp->fx_r_type <= BFD_RELOC_UNUSED 1158 && fixp->fx_r_type != BFD_RELOC_16_GOTOFF 1159 && fixp->fx_r_type != BFD_RELOC_HI16_GOTOFF 1160 && fixp->fx_r_type != BFD_RELOC_LO16_GOTOFF 1161 && fixp->fx_r_type != BFD_RELOC_HI16_S_GOTOFF 1162 && fixp->fx_r_type != BFD_RELOC_32_BASEREL 1163 && fixp->fx_r_type != BFD_RELOC_LO16_BASEREL 1164 && fixp->fx_r_type != BFD_RELOC_HI16_BASEREL 1165 && fixp->fx_r_type != BFD_RELOC_HI16_S_BASEREL 1166 && strcmp (segment_name (seg), ".got2") != 0 1167 && strcmp (segment_name (seg), ".dtors") != 0 1168 && strcmp (segment_name (seg), ".ctors") != 0 1169 && strcmp (segment_name (seg), ".fixup") != 0 1170 && strcmp (segment_name (seg), ".stab") != 0 1171 && strcmp (segment_name (seg), ".gcc_except_table") != 0 1172 && strcmp (segment_name (seg), ".ex_shared") != 0) 1173 { 1174 if ((seg->flags & (SEC_READONLY | SEC_CODE)) != 0 1175 || fixp->fx_r_type != BFD_RELOC_CTOR) 1176 as_bad_where (fixp->fx_file, fixp->fx_line, 1177 "Relocation cannot be done when using -mrelocatable"); 1178 } 1179 return; 1180 default: 1181 break; 1182 } 1183 } 1184 #endif /* OBJ_ELF */ 1185 1186 1187 #define LITERAL_POOL_SUPPORT 1189 #ifdef LITERAL_POOL_SUPPORT 1190 /* Provide support for literal pools within the text section. 1191 Loosely based on similar code from tc-arm.c. 1192 We will use four symbols to locate four parts of the literal pool. 1193 These four sections contain 64,32,16 and 8-bit constants; we use 1194 four sections so that all memory access can be appropriately aligned. 1195 That is, we want to avoid mixing these together so that we don't 1196 waste space padding out to alignments. The four pointers 1197 longlong_poolP, word_poolP, etc. point to a symbol labeling the 1198 start of each pool part. 1199 1200 lit_pool_num increments from zero to infinity and uniquely id's 1201 -- its used to generate the *_poolP symbol name. */ 1202 1203 #define MAX_LITERAL_POOL_SIZE 1024 1204 1205 typedef struct literalS 1206 { 1207 struct expressionS exp; 1208 char * sym_name; 1209 char size; /* 1,2,4 or 8 */ 1210 short offset; 1211 } literalT; 1212 1213 literalT literals[MAX_LITERAL_POOL_SIZE]; 1214 int next_literal_pool_place = 0; /* Next free entry in the pool. */ 1215 1216 static symbolS *longlong_poolP = NULL; /* 64-bit pool entries. */ 1217 static symbolS *word_poolP = NULL; /* 32-bit pool entries. */ 1218 static symbolS *short_poolP = NULL; /* 16-bit pool entries. */ 1219 static symbolS *byte_poolP = NULL; /* 8-bit pool entries. */ 1220 1221 static int lit_pool_num = 1; 1222 1223 /* Create a new, empty symbol. */ 1224 static symbolS * 1225 symbol_make_empty (void) 1226 { 1227 return symbol_create (FAKE_LABEL_NAME, undefined_section, 1228 (valueT) 0, &zero_address_frag); 1229 } 1230 1231 /* Make the first argument an address-relative expression 1232 by subtracting the second argument. */ 1233 1234 static void 1235 i370_make_relative (expressionS *exx, expressionS *baseaddr) 1236 { 1237 if (O_constant == baseaddr->X_op) 1238 { 1239 exx->X_op = O_symbol; 1240 exx->X_add_number -= baseaddr->X_add_number; 1241 } 1242 else if (O_symbol == baseaddr->X_op) 1243 { 1244 exx->X_op = O_subtract; 1245 exx->X_op_symbol = baseaddr->X_add_symbol; 1246 exx->X_add_number -= baseaddr->X_add_number; 1247 } 1248 else if (O_uminus == baseaddr->X_op) 1249 { 1250 exx->X_op = O_add; 1251 exx->X_op_symbol = baseaddr->X_add_symbol; 1252 exx->X_add_number += baseaddr->X_add_number; 1253 } 1254 else 1255 as_bad (_("Missing or bad .using directive")); 1256 } 1257 /* Add an expression to the literal pool. */ 1258 1259 static void 1260 add_to_lit_pool (expressionS *exx, char *name, int sz) 1261 { 1262 int lit_count = 0; 1263 int offset_in_pool = 0; 1264 1265 /* Start a new pool, if necessary. */ 1266 if (8 == sz && NULL == longlong_poolP) 1267 longlong_poolP = symbol_make_empty (); 1268 else if (4 == sz && NULL == word_poolP) 1269 word_poolP = symbol_make_empty (); 1270 else if (2 == sz && NULL == short_poolP) 1271 short_poolP = symbol_make_empty (); 1272 else if (1 == sz && NULL == byte_poolP) 1273 byte_poolP = symbol_make_empty (); 1274 1275 /* Check if this literal value is already in the pool. 1276 FIXME: We should probably be checking expressions 1277 of type O_symbol as well. 1278 FIXME: This is probably(certainly?) broken for O_big, 1279 which includes 64-bit long-longs. */ 1280 while (lit_count < next_literal_pool_place) 1281 { 1282 if (exx->X_op == O_constant 1283 && literals[lit_count].exp.X_op == exx->X_op 1284 && literals[lit_count].exp.X_add_number == exx->X_add_number 1285 && literals[lit_count].exp.X_unsigned == exx->X_unsigned 1286 && literals[lit_count].size == sz) 1287 break; 1288 else if (literals[lit_count].sym_name 1289 && name 1290 && !strcmp (name, literals[lit_count].sym_name)) 1291 break; 1292 if (sz == literals[lit_count].size) 1293 offset_in_pool += sz; 1294 lit_count ++; 1295 } 1296 1297 if (lit_count == next_literal_pool_place) /* new entry */ 1298 { 1299 if (next_literal_pool_place > MAX_LITERAL_POOL_SIZE) 1300 as_bad (_("Literal Pool Overflow")); 1301 1302 literals[next_literal_pool_place].exp = *exx; 1303 literals[next_literal_pool_place].size = sz; 1304 literals[next_literal_pool_place].offset = offset_in_pool; 1305 if (name) 1306 literals[next_literal_pool_place].sym_name = strdup (name); 1307 else 1308 literals[next_literal_pool_place].sym_name = NULL; 1309 next_literal_pool_place++; 1310 } 1311 1312 /* ???_poolP points to the beginning of the literal pool. 1313 X_add_number is the offset from the beginning of the 1314 literal pool to this expr minus the location of the most 1315 recent .using directive. Thus, the grand total value of the 1316 expression is the distance from .using to the literal. */ 1317 if (8 == sz) 1318 exx->X_add_symbol = longlong_poolP; 1319 else if (4 == sz) 1320 exx->X_add_symbol = word_poolP; 1321 else if (2 == sz) 1322 exx->X_add_symbol = short_poolP; 1323 else if (1 == sz) 1324 exx->X_add_symbol = byte_poolP; 1325 exx->X_add_number = offset_in_pool; 1326 exx->X_op_symbol = NULL; 1327 1328 /* If the user has set up a base reg in another section, 1329 use that; otherwise use the text section. */ 1330 if (0 < i370_using_other_regno) 1331 i370_make_relative (exx, &i370_using_other_baseaddr); 1332 else 1333 i370_make_relative (exx, &i370_using_text_baseaddr); 1334 } 1335 1336 /* The symbol setup for the literal pool is done in two steps. First, 1337 a symbol that represents the start of the literal pool is created, 1338 above, in the add_to_pool() routine. This sym ???_poolP. 1339 However, we don't know what fragment its in until a bit later. 1340 So we defer the frag_now thing, and the symbol name, until .ltorg time. */ 1341 1342 /* Can't use symbol_new here, so have to create a symbol and then at 1343 a later date assign it a value. Thats what these functions do. */ 1344 1345 static void 1346 symbol_locate (symbolS *symbolP, 1347 const char *name, /* It is copied, the caller can modify. */ 1348 segT segment, /* Segment identifier (SEG_<something>). */ 1349 valueT valu, /* Symbol value. */ 1350 fragS *frag) /* Associated fragment. */ 1351 { 1352 size_t name_length; 1353 char *preserved_copy_of_name; 1354 1355 name_length = strlen (name) + 1; /* +1 for \0 */ 1356 obstack_grow (¬es, name, name_length); 1357 preserved_copy_of_name = obstack_finish (¬es); 1358 1359 S_SET_NAME (symbolP, preserved_copy_of_name); 1360 1361 S_SET_SEGMENT (symbolP, segment); 1362 S_SET_VALUE (symbolP, valu); 1363 symbol_clear_list_pointers (symbolP); 1364 1365 symbol_set_frag (symbolP, frag); 1366 1367 /* Link to end of symbol chain. */ 1368 { 1369 extern int symbol_table_frozen; 1370 1371 if (symbol_table_frozen) 1372 abort (); 1373 } 1374 1375 symbol_append (symbolP, symbol_lastP, &symbol_rootP, &symbol_lastP); 1376 1377 obj_symbol_new_hook (symbolP); 1378 1379 #ifdef tc_symbol_new_hook 1380 tc_symbol_new_hook (symbolP); 1381 #endif 1382 1383 #define DEBUG_SYMS 1384 #ifdef DEBUG_SYMS 1385 verify_symbol_chain(symbol_rootP, symbol_lastP); 1386 #endif /* DEBUG_SYMS */ 1387 } 1388 1389 /* i370_addr_offset() will convert operand expressions 1390 that appear to be absolute into thier base-register 1391 relative form. These expressions come in two types: 1392 1393 (1) of the form "* + const" * where "*" means 1394 relative offset since the last using 1395 i.e. "*" means ".-using_baseaddr" 1396 1397 (2) labels, which are never absolute, but are always 1398 relative to the last "using". Anything with an alpha 1399 character is considered to be a label (since symbols 1400 can never be operands), and since we've already handled 1401 register operands. For example, "BL .L33" branch low 1402 to .L33 RX form insn frequently terminates for-loops. */ 1403 1404 static bfd_boolean 1405 i370_addr_offset (expressionS *exx) 1406 { 1407 char *dot, *lab; 1408 int islabel = 0; 1409 int all_digits = 0; 1410 1411 /* Search for a label; anything with an alpha char will do. 1412 Local labels consist of N digits followed by either b or f. */ 1413 lab = input_line_pointer; 1414 while (*lab && (',' != *lab) && ('(' != *lab)) 1415 { 1416 if (ISDIGIT (*lab)) 1417 all_digits = 1; 1418 else if (ISALPHA (*lab)) 1419 { 1420 if (!all_digits) 1421 { 1422 islabel = 1; 1423 break; 1424 } 1425 else if (('f' == *lab) || ('b' == *lab)) 1426 { 1427 islabel = 1; 1428 break; 1429 } 1430 if (all_digits) 1431 break; 1432 } 1433 else if ('.' != *lab) 1434 break; 1435 ++lab; 1436 } 1437 1438 /* See if operand has a * in it. */ 1439 dot = strchr (input_line_pointer, '*'); 1440 1441 if (!dot && !islabel) 1442 return FALSE; 1443 1444 /* Replace * with . and let expr munch on it. */ 1445 if (dot) 1446 *dot = '.'; 1447 expression (exx); 1448 1449 /* OK, now we have to subtract the "using" location. 1450 Normally branches appear in the text section only. */ 1451 if (0 == strncmp (now_seg->name, ".text", 5) || 0 > i370_using_other_regno) 1452 i370_make_relative (exx, &i370_using_text_baseaddr); 1453 else 1454 i370_make_relative (exx, &i370_using_other_baseaddr); 1455 1456 /* Put the * back. */ 1457 if (dot) 1458 *dot = '*'; 1459 1460 return TRUE; 1461 } 1462 1463 /* Handle address constants of various sorts. */ 1464 /* The currently supported types are 1465 =A(some_symb) 1466 =V(some_extern) 1467 =X'deadbeef' hexadecimal 1468 =F'1234' 32-bit const int 1469 =H'1234' 16-bit const int. */ 1470 1471 static bfd_boolean 1472 i370_addr_cons (expressionS *exp) 1473 { 1474 char *name; 1475 char *sym_name, delim; 1476 int name_len; 1477 int hex_len = 0; 1478 int cons_len = 0; 1479 1480 name = input_line_pointer; 1481 sym_name = input_line_pointer; 1482 /* Find the spelling of the operand. */ 1483 if (name[0] == '=' && ISALPHA (name[1])) 1484 name = ++input_line_pointer; 1485 else 1486 return FALSE; 1487 1488 switch (name[0]) 1489 { 1490 case 'A': /* A == address-of. */ 1491 case 'V': /* V == extern. */ 1492 ++input_line_pointer; 1493 expression (exp); 1494 1495 /* We use a simple string name to collapse together 1496 multiple refrences to the same address literal. */ 1497 name_len = strcspn (sym_name, ", "); 1498 delim = *(sym_name + name_len); 1499 *(sym_name + name_len) = 0x0; 1500 add_to_lit_pool (exp, sym_name, 4); 1501 *(sym_name + name_len) = delim; 1502 1503 break; 1504 case 'H': 1505 case 'F': 1506 case 'X': 1507 case 'E': /* Single-precision float point. */ 1508 case 'D': /* Double-precision float point. */ 1509 1510 /* H == 16-bit fixed-point const; expression must be const. */ 1511 /* F == fixed-point const; expression must be const. */ 1512 /* X == fixed-point const; expression must be const. */ 1513 if ('H' == name[0]) cons_len = 2; 1514 else if ('F' == name[0]) cons_len = 4; 1515 else if ('X' == name[0]) cons_len = -1; 1516 else if ('E' == name[0]) cons_len = 4; 1517 else if ('D' == name[0]) cons_len = 8; 1518 1519 /* Extract length, if it is present; 1520 FIXME: assume single-digit length. */ 1521 if ('L' == name[1]) 1522 { 1523 /* Should work for ASCII and EBCDIC. */ 1524 cons_len = name[2] - '0'; 1525 input_line_pointer += 2; 1526 } 1527 1528 ++input_line_pointer; 1529 1530 /* Get rid of pesky quotes. */ 1531 if ('\'' == *input_line_pointer) 1532 { 1533 char * clse; 1534 1535 ++input_line_pointer; 1536 clse = strchr (input_line_pointer, '\''); 1537 if (clse) 1538 *clse= ' '; 1539 else 1540 as_bad (_("missing end-quote")); 1541 } 1542 if ('\"' == *input_line_pointer) 1543 { 1544 char * clse; 1545 1546 ++input_line_pointer; 1547 clse = strchr (input_line_pointer, '\"'); 1548 if (clse) 1549 *clse= ' '; 1550 else 1551 as_bad (_("missing end-quote")); 1552 } 1553 if (('X' == name[0]) || ('E' == name[0]) || ('D' == name[0])) 1554 { 1555 char tmp[50]; 1556 char *save; 1557 1558 /* The length of hex constants is specified directly with L, 1559 or implied through the number of hex digits. For example: 1560 =X'AB' one byte 1561 =X'abcd' two bytes 1562 =X'000000AB' four bytes 1563 =XL4'AB' four bytes, left-padded withn zero. */ 1564 if (('X' == name[0]) && (0 > cons_len)) 1565 { 1566 save = input_line_pointer; 1567 while (*save) 1568 { 1569 if (ISXDIGIT (*save)) 1570 hex_len++; 1571 save++; 1572 } 1573 cons_len = (hex_len+1) /2; 1574 } 1575 /* I believe this works even for =XL8'dada0000beeebaaa' 1576 which should parse out to X_op == O_big 1577 Note that floats and doubles get represented as 1578 0d3.14159265358979 or 0f 2.7. */ 1579 tmp[0] = '0'; 1580 tmp[1] = name[0]; 1581 tmp[2] = 0; 1582 strcat (tmp, input_line_pointer); 1583 save = input_line_pointer; 1584 input_line_pointer = tmp; 1585 expression (exp); 1586 input_line_pointer = save + (input_line_pointer-tmp-2); 1587 1588 /* Fix up lengths for floats and doubles. */ 1589 if (O_big == exp->X_op) 1590 exp->X_add_number = cons_len / CHARS_PER_LITTLENUM; 1591 } 1592 else 1593 expression (exp); 1594 1595 /* O_big occurs when more than 4 bytes worth gets parsed. */ 1596 if ((exp->X_op != O_constant) && (exp->X_op != O_big)) 1597 { 1598 as_bad (_("expression not a constant")); 1599 return FALSE; 1600 } 1601 add_to_lit_pool (exp, 0x0, cons_len); 1602 break; 1603 1604 default: 1605 as_bad (_("Unknown/unsupported address literal type")); 1606 return FALSE; 1607 } 1608 1609 return TRUE; 1610 } 1611 1612 1613 /* Dump the contents of the literal pool that we've accumulated so far. 1615 This aligns the pool to the size of the largest literal in the pool. */ 1616 1617 static void 1618 i370_ltorg (int ignore ATTRIBUTE_UNUSED) 1619 { 1620 int litsize; 1621 int lit_count = 0; 1622 int biggest_literal_size = 0; 1623 int biggest_align = 0; 1624 char pool_name[20]; 1625 1626 if (strncmp (now_seg->name, ".text", 5)) 1627 { 1628 if (i370_other_section == undefined_section) 1629 as_bad (_(".ltorg without prior .using in section %s"), 1630 now_seg->name); 1631 1632 if (i370_other_section != now_seg) 1633 as_bad (_(".ltorg in section %s paired to .using in section %s"), 1634 now_seg->name, i370_other_section->name); 1635 } 1636 1637 if (! longlong_poolP 1638 && ! word_poolP 1639 && ! short_poolP 1640 && ! byte_poolP) 1641 /* Nothing to do. */ 1642 return; 1643 1644 /* Find largest literal .. 2 4 or 8. */ 1645 lit_count = 0; 1646 while (lit_count < next_literal_pool_place) 1647 { 1648 if (biggest_literal_size < literals[lit_count].size) 1649 biggest_literal_size = literals[lit_count].size; 1650 lit_count ++; 1651 } 1652 if (1 == biggest_literal_size) biggest_align = 0; 1653 else if (2 == biggest_literal_size) biggest_align = 1; 1654 else if (4 == biggest_literal_size) biggest_align = 2; 1655 else if (8 == biggest_literal_size) biggest_align = 3; 1656 else as_bad (_("bad alignment of %d bytes in literal pool"), biggest_literal_size); 1657 if (0 == biggest_align) biggest_align = 1; 1658 1659 /* Align pool for short, word, double word accesses. */ 1660 frag_align (biggest_align, 0, 0); 1661 record_alignment (now_seg, biggest_align); 1662 1663 /* Note that the gas listing will print only the first five 1664 entries in the pool .... wonder how to make it print more. */ 1665 /* Output largest literals first, then the smaller ones. */ 1666 for (litsize=8; litsize; litsize /=2) 1667 { 1668 symbolS *current_poolP = NULL; 1669 switch (litsize) 1670 { 1671 case 8: 1672 current_poolP = longlong_poolP; break; 1673 case 4: 1674 current_poolP = word_poolP; break; 1675 case 2: 1676 current_poolP = short_poolP; break; 1677 case 1: 1678 current_poolP = byte_poolP; break; 1679 default: 1680 as_bad (_("bad literal size\n")); 1681 } 1682 if (NULL == current_poolP) 1683 continue; 1684 sprintf (pool_name, ".LITP%01d%06d", litsize, lit_pool_num); 1685 symbol_locate (current_poolP, pool_name, now_seg, 1686 (valueT) frag_now_fix (), frag_now); 1687 symbol_table_insert (current_poolP); 1688 1689 lit_count = 0; 1690 while (lit_count < next_literal_pool_place) 1691 { 1692 if (litsize == literals[lit_count].size) 1693 { 1694 #define EMIT_ADDR_CONS_SYMBOLS 1695 #ifdef EMIT_ADDR_CONS_SYMBOLS 1696 /* Create a bogus symbol, add it to the pool ... 1697 For the most part, I think this is a useless exercise, 1698 except that having these symbol names in the objects 1699 is vaguely useful for debugging. */ 1700 if (literals[lit_count].sym_name) 1701 { 1702 symbolS * symP = symbol_make_empty (); 1703 symbol_locate (symP, literals[lit_count].sym_name, now_seg, 1704 (valueT) frag_now_fix (), frag_now); 1705 symbol_table_insert (symP); 1706 } 1707 #endif /* EMIT_ADDR_CONS_SYMBOLS */ 1708 1709 emit_expr (&(literals[lit_count].exp), literals[lit_count].size); 1710 } 1711 lit_count ++; 1712 } 1713 } 1714 1715 next_literal_pool_place = 0; 1716 longlong_poolP = NULL; 1717 word_poolP = NULL; 1718 short_poolP = NULL; 1719 byte_poolP = NULL; 1720 lit_pool_num++; 1721 } 1722 1723 #endif /* LITERAL_POOL_SUPPORT */ 1724 1725 1726 /* Add support for the HLASM-like USING directive to indicate 1728 the base register to use ... we don't support the full 1729 hlasm semantics for this ... we merely pluck a base address 1730 and a register number out. We print a warning if using is 1731 called multiple times. I suppose we should check to see 1732 if the regno is valid. */ 1733 1734 static void 1735 i370_using (int ignore ATTRIBUTE_UNUSED) 1736 { 1737 expressionS ex, baseaddr; 1738 int iregno; 1739 char *star; 1740 1741 /* If "*" appears in a using, it means "." 1742 replace it with "." so that expr doesn't get confused. */ 1743 star = strchr (input_line_pointer, '*'); 1744 if (star) 1745 *star = '.'; 1746 1747 /* The first arg to using will usually be ".", but it can 1748 be a more complex expression too. */ 1749 expression (&baseaddr); 1750 if (star) 1751 *star = '*'; 1752 if (O_constant != baseaddr.X_op 1753 && O_symbol != baseaddr.X_op 1754 && O_uminus != baseaddr.X_op) 1755 as_bad (_(".using: base address expression illegal or too complex")); 1756 1757 if (*input_line_pointer != '\0') ++input_line_pointer; 1758 1759 /* The second arg to using had better be a register. */ 1760 register_name (&ex); 1761 demand_empty_rest_of_line (); 1762 iregno = ex.X_add_number; 1763 1764 if (0 == strncmp (now_seg->name, ".text", 5)) 1765 { 1766 i370_using_text_baseaddr = baseaddr; 1767 i370_using_text_regno = iregno; 1768 } 1769 else 1770 { 1771 i370_using_other_baseaddr = baseaddr; 1772 i370_using_other_regno = iregno; 1773 i370_other_section = now_seg; 1774 } 1775 } 1776 1777 static void 1778 i370_drop (int ignore ATTRIBUTE_UNUSED) 1779 { 1780 expressionS ex; 1781 int iregno; 1782 1783 register_name (&ex); 1784 demand_empty_rest_of_line (); 1785 iregno = ex.X_add_number; 1786 1787 if (0 == strncmp (now_seg->name, ".text", 5)) 1788 { 1789 if (iregno != i370_using_text_regno) 1790 as_bad (_("droping register %d in section %s does not match using register %d"), 1791 iregno, now_seg->name, i370_using_text_regno); 1792 1793 i370_using_text_regno = -1; 1794 i370_using_text_baseaddr.X_op = O_absent; 1795 } 1796 else 1797 { 1798 if (iregno != i370_using_other_regno) 1799 as_bad (_("droping register %d in section %s does not match using register %d"), 1800 iregno, now_seg->name, i370_using_other_regno); 1801 1802 if (i370_other_section != now_seg) 1803 as_bad (_("droping register %d in section %s previously used in section %s"), 1804 iregno, now_seg->name, i370_other_section->name); 1805 1806 i370_using_other_regno = -1; 1807 i370_using_other_baseaddr.X_op = O_absent; 1808 i370_other_section = undefined_section; 1809 } 1810 } 1811 1812 1813 /* We need to keep a list of fixups. We can't simply generate them as 1815 we go, because that would require us to first create the frag, and 1816 that would screw up references to ``.''. */ 1817 1818 struct i370_fixup 1819 { 1820 expressionS exp; 1821 int opindex; 1822 bfd_reloc_code_real_type reloc; 1823 }; 1824 1825 #define MAX_INSN_FIXUPS 5 1826 1827 /* Handle a macro. Gather all the operands, transform them as 1828 described by the macro, and call md_assemble recursively. All the 1829 operands are separated by commas; we don't accept parentheses 1830 around operands here. */ 1831 1832 static void 1833 i370_macro (char *str, const struct i370_macro *macro) 1834 { 1835 char *operands[10]; 1836 unsigned int count; 1837 char *s; 1838 unsigned int len; 1839 const char *format; 1840 int arg; 1841 char *send; 1842 char *complete; 1843 1844 /* Gather the users operands into the operands array. */ 1845 count = 0; 1846 s = str; 1847 while (1) 1848 { 1849 if (count >= sizeof operands / sizeof operands[0]) 1850 break; 1851 operands[count++] = s; 1852 s = strchr (s, ','); 1853 if (s == (char *) NULL) 1854 break; 1855 *s++ = '\0'; 1856 } 1857 1858 if (count != macro->operands) 1859 { 1860 as_bad (_("wrong number of operands")); 1861 return; 1862 } 1863 1864 /* Work out how large the string must be (the size is unbounded 1865 because it includes user input). */ 1866 len = 0; 1867 format = macro->format; 1868 while (*format != '\0') 1869 { 1870 if (*format != '%') 1871 { 1872 ++len; 1873 ++format; 1874 } 1875 else 1876 { 1877 arg = strtol (format + 1, &send, 10); 1878 know (send != format && arg >= 0 && (unsigned) arg < count); 1879 len += strlen (operands[arg]); 1880 format = send; 1881 } 1882 } 1883 1884 /* Put the string together. */ 1885 complete = s = alloca (len + 1); 1886 format = macro->format; 1887 while (*format != '\0') 1888 { 1889 if (*format != '%') 1890 *s++ = *format++; 1891 else 1892 { 1893 arg = strtol (format + 1, &send, 10); 1894 strcpy (s, operands[arg]); 1895 s += strlen (s); 1896 format = send; 1897 } 1898 } 1899 *s = '\0'; 1900 1901 /* Assemble the constructed instruction. */ 1902 md_assemble (complete); 1903 } 1904 1905 /* This routine is called for each instruction to be assembled. */ 1906 1907 void 1908 md_assemble (char *str) 1909 { 1910 char *s; 1911 const struct i370_opcode *opcode; 1912 i370_insn_t insn; 1913 const unsigned char *opindex_ptr; 1914 int have_optional_index, have_optional_basereg, have_optional_reg; 1915 int skip_optional_index, skip_optional_basereg, skip_optional_reg; 1916 int use_text=0, use_other=0; 1917 int off_by_one; 1918 struct i370_fixup fixups[MAX_INSN_FIXUPS]; 1919 int fc; 1920 char *f; 1921 int i; 1922 #ifdef OBJ_ELF 1923 bfd_reloc_code_real_type reloc; 1924 #endif 1925 1926 /* Get the opcode. */ 1927 for (s = str; *s != '\0' && ! ISSPACE (*s); s++) 1928 ; 1929 if (*s != '\0') 1930 *s++ = '\0'; 1931 1932 /* Look up the opcode in the hash table. */ 1933 opcode = (const struct i370_opcode *) hash_find (i370_hash, str); 1934 if (opcode == (const struct i370_opcode *) NULL) 1935 { 1936 const struct i370_macro *macro; 1937 1938 gas_assert (i370_macro_hash); 1939 macro = (const struct i370_macro *) hash_find (i370_macro_hash, str); 1940 if (macro == (const struct i370_macro *) NULL) 1941 as_bad (_("Unrecognized opcode: `%s'"), str); 1942 else 1943 i370_macro (s, macro); 1944 1945 return; 1946 } 1947 1948 insn = opcode->opcode; 1949 1950 str = s; 1951 while (ISSPACE (*str)) 1952 ++str; 1953 1954 /* I370 operands are either expressions or address constants. 1955 Many operand types are optional. The optional operands 1956 are always surrounded by parens, and are used to denote the base 1957 register ... e.g. "A R1, D2" or "A R1, D2(,B2) as opposed to 1958 the fully-formed "A R1, D2(X2,B2)". Note also the = sign, 1959 such as A R1,=A(i) where the address-of operator =A implies 1960 use of both a base register, and a missing index register. 1961 1962 So, before we start seriously parsing the operands, we check 1963 to see if we have an optional operand, and, if we do, we count 1964 the number of commas to see which operand should be omitted. */ 1965 1966 have_optional_index = have_optional_basereg = have_optional_reg = 0; 1967 for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++) 1968 { 1969 const struct i370_operand *operand; 1970 1971 operand = &i370_operands[*opindex_ptr]; 1972 if ((operand->flags & I370_OPERAND_INDEX) != 0) 1973 have_optional_index = 1; 1974 if ((operand->flags & I370_OPERAND_BASE) != 0) 1975 have_optional_basereg = 1; 1976 if ((operand->flags & I370_OPERAND_OPTIONAL) != 0) 1977 have_optional_reg = 1; 1978 } 1979 1980 skip_optional_index = skip_optional_basereg = skip_optional_reg = 0; 1981 if (have_optional_index || have_optional_basereg) 1982 { 1983 unsigned int opcount, nwanted; 1984 1985 /* There is an optional operand. Count the number of 1986 commas and open-parens in the input line. */ 1987 if (*str == '\0') 1988 opcount = 0; 1989 else 1990 { 1991 opcount = 1; 1992 s = str; 1993 while ((s = strpbrk (s, ",(=")) != (char *) NULL) 1994 { 1995 ++opcount; 1996 ++s; 1997 if (',' == *s) ++s; /* avoid counting things like (, */ 1998 if ('=' == *s) { ++s; --opcount; } 1999 } 2000 } 2001 2002 /* If there are fewer operands in the line then are called 2003 for by the instruction, we want to skip the optional 2004 operand. */ 2005 nwanted = strlen ((char *) opcode->operands); 2006 if (have_optional_index) 2007 { 2008 if (opcount < nwanted) 2009 skip_optional_index = 1; 2010 if (have_optional_basereg && ((opcount+1) < nwanted)) 2011 skip_optional_basereg = 1; 2012 if (have_optional_reg && ((opcount+1) < nwanted)) 2013 skip_optional_reg = 1; 2014 } 2015 else 2016 { 2017 if (have_optional_basereg && (opcount < nwanted)) 2018 skip_optional_basereg = 1; 2019 if (have_optional_reg && (opcount < nwanted)) 2020 skip_optional_reg = 1; 2021 } 2022 } 2023 2024 /* Perform some off-by-one hacks on the length field of certain instructions. 2025 Its such a shame to have to do this, but the problem is that HLASM got 2026 defined so that the lengths differ by one from the actual machine instructions. 2027 this code should probably be moved to a special inster-operand routine. 2028 Sigh. Affected instructions are Compare Logical, Move and Exclusive OR 2029 hack alert -- aren't *all* SS instructions affected ?? */ 2030 off_by_one = 0; 2031 if (0 == strcasecmp ("CLC", opcode->name) 2032 || 0 == strcasecmp ("ED", opcode->name) 2033 || 0 == strcasecmp ("EDMK", opcode->name) 2034 || 0 == strcasecmp ("MVC", opcode->name) 2035 || 0 == strcasecmp ("MVCIN", opcode->name) 2036 || 0 == strcasecmp ("MVN", opcode->name) 2037 || 0 == strcasecmp ("MVZ", opcode->name) 2038 || 0 == strcasecmp ("NC", opcode->name) 2039 || 0 == strcasecmp ("OC", opcode->name) 2040 || 0 == strcasecmp ("XC", opcode->name)) 2041 off_by_one = 1; 2042 2043 /* Gather the operands. */ 2044 fc = 0; 2045 for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++) 2046 { 2047 const struct i370_operand *operand; 2048 char *hold; 2049 expressionS ex; 2050 2051 operand = &i370_operands[*opindex_ptr]; 2052 2053 /* If this is an index operand, and we are skipping it, 2054 just insert a zero. */ 2055 if (skip_optional_index && 2056 ((operand->flags & I370_OPERAND_INDEX) != 0)) 2057 { 2058 insn = i370_insert_operand (insn, operand, 0); 2059 continue; 2060 } 2061 2062 /* If this is the base operand, and we are skipping it, 2063 just insert the current using basreg. */ 2064 if (skip_optional_basereg && 2065 ((operand->flags & I370_OPERAND_BASE) != 0)) 2066 { 2067 int basereg = -1; 2068 if (use_text) 2069 { 2070 if (0 == strncmp (now_seg->name, ".text", 5) 2071 || 0 > i370_using_other_regno) 2072 basereg = i370_using_text_regno; 2073 else 2074 basereg = i370_using_other_regno; 2075 } 2076 else if (use_other) 2077 { 2078 if (0 > i370_using_other_regno) 2079 basereg = i370_using_text_regno; 2080 else 2081 basereg = i370_using_other_regno; 2082 } 2083 if (0 > basereg) 2084 as_bad (_("not using any base register")); 2085 2086 insn = i370_insert_operand (insn, operand, basereg); 2087 continue; 2088 } 2089 2090 /* If this is an optional operand, and we are skipping it, 2091 Use zero (since a non-zero value would denote a register) */ 2092 if (skip_optional_reg 2093 && ((operand->flags & I370_OPERAND_OPTIONAL) != 0)) 2094 { 2095 insn = i370_insert_operand (insn, operand, 0); 2096 continue; 2097 } 2098 2099 /* Gather the operand. */ 2100 hold = input_line_pointer; 2101 input_line_pointer = str; 2102 2103 /* Register names are only allowed where there are registers. */ 2104 if ((operand->flags & I370_OPERAND_GPR) != 0) 2105 { 2106 /* Quickie hack to get past things like (,r13). */ 2107 if (skip_optional_index && (',' == *input_line_pointer)) 2108 { 2109 *input_line_pointer = ' '; 2110 input_line_pointer ++; 2111 } 2112 2113 if (! register_name (&ex)) 2114 as_bad (_("expecting a register for operand %d"), 2115 (int) (opindex_ptr - opcode->operands + 1)); 2116 } 2117 2118 /* Check for an address constant expression. */ 2119 /* We will put PSW-relative addresses in the text section, 2120 and address literals in the .data (or other) section. */ 2121 else if (i370_addr_cons (&ex)) 2122 use_other = 1; 2123 else if (i370_addr_offset (&ex)) 2124 use_text = 1; 2125 else expression (&ex); 2126 2127 str = input_line_pointer; 2128 input_line_pointer = hold; 2129 2130 /* Perform some off-by-one hacks on the length field of certain instructions. 2131 Its such a shame to have to do this, but the problem is that HLASM got 2132 defined so that the programmer specifies a length that is one greater 2133 than what the machine instruction wants. Sigh. */ 2134 if (off_by_one && (0 == strcasecmp ("SS L", operand->name))) 2135 ex.X_add_number --; 2136 2137 if (ex.X_op == O_illegal) 2138 as_bad (_("illegal operand")); 2139 else if (ex.X_op == O_absent) 2140 as_bad (_("missing operand")); 2141 else if (ex.X_op == O_register) 2142 insn = i370_insert_operand (insn, operand, ex.X_add_number); 2143 else if (ex.X_op == O_constant) 2144 { 2145 #ifdef OBJ_ELF 2146 /* Allow @HA, @L, @H on constants. 2147 Well actually, no we don't; there really don't make sense 2148 (at least not to me) for the i370. However, this code is 2149 left here for any dubious future expansion reasons. */ 2150 char *orig_str = str; 2151 2152 if ((reloc = i370_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED) 2153 switch (reloc) 2154 { 2155 default: 2156 str = orig_str; 2157 break; 2158 2159 case BFD_RELOC_LO16: 2160 /* X_unsigned is the default, so if the user has done 2161 something which cleared it, we always produce a 2162 signed value. */ 2163 ex.X_add_number = (((ex.X_add_number & 0xffff) 2164 ^ 0x8000) 2165 - 0x8000); 2166 break; 2167 2168 case BFD_RELOC_HI16: 2169 ex.X_add_number = (ex.X_add_number >> 16) & 0xffff; 2170 break; 2171 2172 case BFD_RELOC_HI16_S: 2173 ex.X_add_number = (((ex.X_add_number >> 16) & 0xffff) 2174 + ((ex.X_add_number >> 15) & 1)); 2175 break; 2176 } 2177 #endif 2178 insn = i370_insert_operand (insn, operand, ex.X_add_number); 2179 } 2180 #ifdef OBJ_ELF 2181 else if ((reloc = i370_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED) 2182 { 2183 as_tsktsk ("md_assemble(): suffixed relocations not supported\n"); 2184 2185 /* We need to generate a fixup for this expression. */ 2186 if (fc >= MAX_INSN_FIXUPS) 2187 as_fatal ("too many fixups"); 2188 fixups[fc].exp = ex; 2189 fixups[fc].opindex = 0; 2190 fixups[fc].reloc = reloc; 2191 ++fc; 2192 } 2193 #endif /* OBJ_ELF */ 2194 else 2195 { 2196 /* We need to generate a fixup for this expression. */ 2197 /* Typically, the expression will just be a symbol ... 2198 printf ("insn %s needs fixup for %s \n", 2199 opcode->name, ex.X_add_symbol->bsym->name); */ 2200 2201 if (fc >= MAX_INSN_FIXUPS) 2202 as_fatal ("too many fixups"); 2203 fixups[fc].exp = ex; 2204 fixups[fc].opindex = *opindex_ptr; 2205 fixups[fc].reloc = BFD_RELOC_UNUSED; 2206 ++fc; 2207 } 2208 2209 /* Skip over delimiter (close paren, or comma). */ 2210 if ((')' == *str) && (',' == *(str+1))) 2211 ++str; 2212 if (*str != '\0') 2213 ++str; 2214 } 2215 2216 while (ISSPACE (*str)) 2217 ++str; 2218 2219 if (*str != '\0') 2220 as_bad (_("junk at end of line: `%s'"), str); 2221 2222 /* Write out the instruction. */ 2223 f = frag_more (opcode->len); 2224 if (4 >= opcode->len) 2225 md_number_to_chars (f, insn.i[0], opcode->len); 2226 else 2227 { 2228 md_number_to_chars (f, insn.i[0], 4); 2229 2230 if (6 == opcode->len) 2231 md_number_to_chars ((f + 4), ((insn.i[1])>>16), 2); 2232 else 2233 { 2234 /* Not used --- don't have any 8 byte instructions. */ 2235 as_bad (_("Internal Error: bad instruction length")); 2236 md_number_to_chars ((f + 4), insn.i[1], opcode->len -4); 2237 } 2238 } 2239 2240 /* Create any fixups. At this point we do not use a 2241 bfd_reloc_code_real_type, but instead just use the 2242 BFD_RELOC_UNUSED plus the operand index. This lets us easily 2243 handle fixups for any operand type, although that is admittedly 2244 not a very exciting feature. We pick a BFD reloc type in 2245 md_apply_fix. */ 2246 for (i = 0; i < fc; i++) 2247 { 2248 const struct i370_operand *operand; 2249 2250 operand = &i370_operands[fixups[i].opindex]; 2251 if (fixups[i].reloc != BFD_RELOC_UNUSED) 2252 { 2253 reloc_howto_type *reloc_howto = bfd_reloc_type_lookup (stdoutput, fixups[i].reloc); 2254 int size; 2255 fixS *fixP; 2256 2257 if (!reloc_howto) 2258 abort (); 2259 2260 size = bfd_get_reloc_size (reloc_howto); 2261 2262 if (size < 1 || size > 4) 2263 abort (); 2264 2265 printf (" gwana doo fixup %d \n", i); 2266 fixP = fix_new_exp (frag_now, f - frag_now->fr_literal, size, 2267 &fixups[i].exp, reloc_howto->pc_relative, 2268 fixups[i].reloc); 2269 2270 /* Turn off complaints that the addend is too large for things like 2271 foo+100000@ha. */ 2272 switch (fixups[i].reloc) 2273 { 2274 case BFD_RELOC_16_GOTOFF: 2275 case BFD_RELOC_LO16: 2276 case BFD_RELOC_HI16: 2277 case BFD_RELOC_HI16_S: 2278 fixP->fx_no_overflow = 1; 2279 break; 2280 default: 2281 break; 2282 } 2283 } 2284 else 2285 { 2286 fix_new_exp (frag_now, f - frag_now->fr_literal, opcode->len, 2287 &fixups[i].exp, 2288 (operand->flags & I370_OPERAND_RELATIVE) != 0, 2289 ((bfd_reloc_code_real_type) 2290 (fixups[i].opindex + (int) BFD_RELOC_UNUSED))); 2291 } 2292 } 2293 } 2294 2295 2296 /* Pseudo-op handling. */ 2298 2299 /* The .byte pseudo-op. This is similar to the normal .byte 2300 pseudo-op, but it can also take a single ASCII string. */ 2301 2302 static void 2303 i370_byte (int ignore ATTRIBUTE_UNUSED) 2304 { 2305 if (*input_line_pointer != '\"') 2306 { 2307 cons (1); 2308 return; 2309 } 2310 2311 /* Gather characters. A real double quote is doubled. Unusual 2312 characters are not permitted. */ 2313 ++input_line_pointer; 2314 while (1) 2315 { 2316 char c; 2317 2318 c = *input_line_pointer++; 2319 2320 if (c == '\"') 2321 { 2322 if (*input_line_pointer != '\"') 2323 break; 2324 ++input_line_pointer; 2325 } 2326 2327 FRAG_APPEND_1_CHAR (c); 2328 } 2329 2330 demand_empty_rest_of_line (); 2331 } 2332 2333 /* The .tc pseudo-op. This is used when generating XCOFF and ELF. 2335 This takes two or more arguments. 2336 2337 When generating XCOFF output, the first argument is the name to 2338 give to this location in the toc; this will be a symbol with class 2339 TC. The rest of the arguments are 4 byte values to actually put at 2340 this location in the TOC; often there is just one more argument, a 2341 relocatable symbol reference. 2342 2343 When not generating XCOFF output, the arguments are the same, but 2344 the first argument is simply ignored. */ 2345 2346 static void 2347 i370_tc (int ignore ATTRIBUTE_UNUSED) 2348 { 2349 2350 /* Skip the TOC symbol name. */ 2351 while (is_part_of_name (*input_line_pointer) 2352 || *input_line_pointer == '[' 2353 || *input_line_pointer == ']' 2354 || *input_line_pointer == '{' 2355 || *input_line_pointer == '}') 2356 ++input_line_pointer; 2357 2358 /* Align to a four byte boundary. */ 2359 frag_align (2, 0, 0); 2360 record_alignment (now_seg, 2); 2361 2362 if (*input_line_pointer != ',') 2363 demand_empty_rest_of_line (); 2364 else 2365 { 2366 ++input_line_pointer; 2367 cons (4); 2368 } 2369 } 2370 2371 char * 2373 md_atof (int type, char *litp, int *sizep) 2374 { 2375 /* 360/370/390 have two float formats: an old, funky 360 single-precision 2376 format, and the ieee format. Support only the ieee format. */ 2377 return ieee_md_atof (type, litp, sizep, TRUE); 2378 } 2379 2380 /* Write a value out to the object file, using the appropriate 2381 endianness. */ 2382 2383 void 2384 md_number_to_chars (char *buf, valueT val, int n) 2385 { 2386 number_to_chars_bigendian (buf, val, n); 2387 } 2388 2389 /* Align a section (I don't know why this is machine dependent). */ 2390 2391 valueT 2392 md_section_align (asection *seg, valueT addr) 2393 { 2394 int align = bfd_get_section_alignment (stdoutput, seg); 2395 2396 return (addr + (1 << align) - 1) & (-1 << align); 2397 } 2398 2399 /* We don't have any form of relaxing. */ 2400 2401 int 2402 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED, 2403 asection *seg ATTRIBUTE_UNUSED) 2404 { 2405 abort (); 2406 return 0; 2407 } 2408 2409 /* Convert a machine dependent frag. We never generate these. */ 2410 2411 void 2412 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, 2413 asection *sec ATTRIBUTE_UNUSED, 2414 fragS *fragp ATTRIBUTE_UNUSED) 2415 { 2416 abort (); 2417 } 2418 2419 /* We have no need to default values of symbols. */ 2420 2421 symbolS * 2422 md_undefined_symbol (char *name ATTRIBUTE_UNUSED) 2423 { 2424 return 0; 2425 } 2426 2427 /* Functions concerning relocs. */ 2429 2430 /* The location from which a PC relative jump should be calculated, 2431 given a PC relative reloc. */ 2432 2433 long 2434 md_pcrel_from_section (fixS *fixp, segT sec ATTRIBUTE_UNUSED) 2435 { 2436 return fixp->fx_frag->fr_address + fixp->fx_where; 2437 } 2438 2439 /* Apply a fixup to the object code. This is called for all the 2440 fixups we generated by the call to fix_new_exp, above. In the call 2441 above we used a reloc code which was the largest legal reloc code 2442 plus the operand index. Here we undo that to recover the operand 2443 index. At this point all symbol values should be fully resolved, 2444 and we attempt to completely resolve the reloc. If we can not do 2445 that, we determine the correct reloc code and put it back in the 2446 fixup. 2447 2448 See gas/cgen.c for more sample code and explanations of what's 2449 going on here. */ 2450 2451 void 2452 md_apply_fix (fixS *fixP, valueT * valP, segT seg) 2453 { 2454 valueT value = * valP; 2455 2456 if (fixP->fx_addsy != NULL) 2457 { 2458 #ifdef DEBUG 2459 printf ("\nmd_apply_fix: symbol %s at 0x%x (%s:%d) val=0x%x addend=0x%x\n", 2460 S_GET_NAME (fixP->fx_addsy), 2461 fixP->fx_frag->fr_address + fixP->fx_where, 2462 fixP->fx_file, fixP->fx_line, 2463 S_GET_VALUE (fixP->fx_addsy), value); 2464 #endif 2465 } 2466 else 2467 fixP->fx_done = 1; 2468 2469 /* Apply fixups to operands. Note that there should be no relocations 2470 for any operands, since no instruction ever takes an operand 2471 that requires reloc. */ 2472 if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED) 2473 { 2474 int opindex; 2475 const struct i370_operand *operand; 2476 char *where; 2477 i370_insn_t insn; 2478 2479 opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED; 2480 2481 operand = &i370_operands[opindex]; 2482 2483 #ifdef DEBUG 2484 printf ("\nmd_apply_fix: fixup operand %s at 0x%x in %s:%d addend=0x%x\n", 2485 operand->name, 2486 fixP->fx_frag->fr_address + fixP->fx_where, 2487 fixP->fx_file, fixP->fx_line, 2488 value); 2489 #endif 2490 /* Fetch the instruction, insert the fully resolved operand 2491 value, and stuff the instruction back again. 2492 fisxp->fx_size is the length of the instruction. */ 2493 where = fixP->fx_frag->fr_literal + fixP->fx_where; 2494 insn.i[0] = bfd_getb32 ((unsigned char *) where); 2495 2496 if (6 <= fixP->fx_size) 2497 /* Deal with 48-bit insn's. */ 2498 insn.i[1] = bfd_getb32 (((unsigned char *) where)+4); 2499 2500 insn = i370_insert_operand (insn, operand, (offsetT) value); 2501 bfd_putb32 ((bfd_vma) insn.i[0], (unsigned char *) where); 2502 2503 if (6 <= fixP->fx_size) 2504 /* Deal with 48-bit insn's. */ 2505 bfd_putb32 ((bfd_vma) insn.i[1], (((unsigned char *) where)+4)); 2506 2507 /* We are done, right? right !! */ 2508 fixP->fx_done = 1; 2509 if (fixP->fx_done) 2510 /* Nothing else to do here. */ 2511 return; 2512 2513 /* Determine a BFD reloc value based on the operand information. 2514 We are only prepared to turn a few of the operands into 2515 relocs. In fact, we support *zero* operand relocations ... 2516 Why? Because we are not expecting the compiler to generate 2517 any operands that need relocation. Due to the 12-bit naturew of 2518 i370 addressing, this would be unusual. */ 2519 { 2520 char *sfile; 2521 unsigned int sline; 2522 2523 /* Use expr_symbol_where to see if this is an expression 2524 symbol. */ 2525 if (expr_symbol_where (fixP->fx_addsy, &sfile, &sline)) 2526 as_bad_where (fixP->fx_file, fixP->fx_line, 2527 "unresolved expression that must be resolved"); 2528 else 2529 as_bad_where (fixP->fx_file, fixP->fx_line, 2530 "unsupported relocation type"); 2531 fixP->fx_done = 1; 2532 return; 2533 } 2534 } 2535 else 2536 { 2537 /* We branch to here if the fixup is not to a symbol that 2538 appears in an instruction operand, but is rather some 2539 declared storage. */ 2540 #ifdef OBJ_ELF 2541 i370_elf_validate_fix (fixP, seg); 2542 #endif 2543 #ifdef DEBUG 2544 printf ("md_apply_fix: reloc case %d in segment %s %s:%d\n", 2545 fixP->fx_r_type, segment_name (seg), fixP->fx_file, fixP->fx_line); 2546 printf ("\tcurrent fixup value is 0x%x \n", value); 2547 #endif 2548 switch (fixP->fx_r_type) 2549 { 2550 case BFD_RELOC_32: 2551 case BFD_RELOC_CTOR: 2552 if (fixP->fx_pcrel) 2553 fixP->fx_r_type = BFD_RELOC_32_PCREL; 2554 /* Fall through. */ 2555 2556 case BFD_RELOC_RVA: 2557 case BFD_RELOC_32_PCREL: 2558 case BFD_RELOC_32_BASEREL: 2559 #ifdef DEBUG 2560 printf ("\t32 bit relocation at 0x%x\n", 2561 fixP->fx_frag->fr_address + fixP->fx_where); 2562 #endif 2563 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where, 2564 value, 4); 2565 break; 2566 2567 case BFD_RELOC_LO16: 2568 case BFD_RELOC_16: 2569 if (fixP->fx_pcrel) 2570 as_bad_where (fixP->fx_file, fixP->fx_line, 2571 "cannot emit PC relative %s relocation%s%s", 2572 bfd_get_reloc_code_name (fixP->fx_r_type), 2573 fixP->fx_addsy != NULL ? " against " : "", 2574 (fixP->fx_addsy != NULL 2575 ? S_GET_NAME (fixP->fx_addsy) 2576 : "")); 2577 2578 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where, 2579 value, 2); 2580 break; 2581 2582 /* This case happens when you write, for example, 2583 lis %r3,(L1-L2)@ha 2584 where L1 and L2 are defined later. */ 2585 case BFD_RELOC_HI16: 2586 if (fixP->fx_pcrel) 2587 abort (); 2588 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where, 2589 value >> 16, 2); 2590 break; 2591 case BFD_RELOC_HI16_S: 2592 if (fixP->fx_pcrel) 2593 abort (); 2594 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where, 2595 (value + 0x8000) >> 16, 2); 2596 break; 2597 2598 case BFD_RELOC_8: 2599 if (fixP->fx_pcrel) 2600 abort (); 2601 2602 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where, 2603 value, 1); 2604 break; 2605 2606 default: 2607 fprintf (stderr, 2608 "Gas failure, reloc value %d\n", fixP->fx_r_type); 2609 fflush (stderr); 2610 abort (); 2611 } 2612 } 2613 2614 fixP->fx_addnumber = value; 2615 } 2616 2617 /* Generate a reloc for a fixup. */ 2618 2619 arelent * 2620 tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp) 2621 { 2622 arelent *reloc; 2623 2624 reloc = xmalloc (sizeof (arelent)); 2625 2626 reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *)); 2627 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); 2628 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; 2629 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type); 2630 if (reloc->howto == (reloc_howto_type *) NULL) 2631 { 2632 as_bad_where (fixp->fx_file, fixp->fx_line, 2633 "reloc %d not supported by object file format", (int)fixp->fx_r_type); 2634 return NULL; 2635 } 2636 reloc->addend = fixp->fx_addnumber; 2637 2638 #ifdef DEBUG 2639 printf ("\ngen_reloc(): sym %s (%s:%d) at addr 0x%x addend=0x%x\n", 2640 fixp->fx_addsy->bsym->name, 2641 fixp->fx_file, fixp->fx_line, 2642 reloc->address, reloc->addend); 2643 #endif 2644 2645 return reloc; 2646 } 2647 2648 /* The target specific pseudo-ops which we support. */ 2649 2650 const pseudo_typeS md_pseudo_table[] = 2651 { 2652 /* Pseudo-ops which must be overridden. */ 2653 { "byte", i370_byte, 0 }, 2654 2655 { "dc", i370_dc, 0 }, 2656 { "ds", i370_ds, 0 }, 2657 { "rmode", i370_rmode, 0 }, 2658 { "csect", i370_csect, 0 }, 2659 { "dsect", i370_dsect, 0 }, 2660 2661 /* enable ebcdic strings e.g. for 3270 support */ 2662 { "ebcdic", i370_ebcdic, 0 }, 2663 2664 #ifdef OBJ_ELF 2665 { "long", i370_elf_cons, 4 }, 2666 { "word", i370_elf_cons, 4 }, 2667 { "short", i370_elf_cons, 2 }, 2668 { "rdata", i370_elf_rdata, 0 }, 2669 { "rodata", i370_elf_rdata, 0 }, 2670 { "lcomm", i370_elf_lcomm, 0 }, 2671 #endif 2672 2673 /* This pseudo-op is used even when not generating XCOFF output. */ 2674 { "tc", i370_tc, 0 }, 2675 2676 /* dump the literal pool */ 2677 { "ltorg", i370_ltorg, 0 }, 2678 2679 /* support the hlasm-style USING directive */ 2680 { "using", i370_using, 0 }, 2681 { "drop", i370_drop, 0 }, 2682 2683 { NULL, NULL, 0 } 2684 }; 2685