1 /* TI PRU assembler. 2 Copyright (C) 2014-2018 Free Software Foundation, Inc. 3 Contributed by Dimitar Dimitrov <dimitar@dinux.eu> 4 Based on tc-nios2.c 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 #include "as.h" 24 #include "bfd_stdint.h" 25 #include "opcode/pru.h" 26 #include "elf/pru.h" 27 #include "tc-pru.h" 28 #include "bfd.h" 29 #include "dwarf2dbg.h" 30 #include "subsegs.h" 31 #include "safe-ctype.h" 32 #include "dw2gencfi.h" 33 34 #ifndef OBJ_ELF 35 /* We are not supporting any other target so we throw a compile time error. */ 36 #error "OBJ_ELF not defined" 37 #endif 38 39 /* This array holds the chars that always start a comment. If the 40 pre-processor is disabled, these aren't very useful. */ 41 const char comment_chars[] = "#;"; 42 43 /* This array holds the chars that only start a comment at the beginning of 44 a line. If the line seems to have the form '# 123 filename' 45 .line and .file directives will appear in the pre-processed output. */ 46 /* Note that input_file.c hand checks for '#' at the beginning of the 47 first line of the input file. This is because the compiler outputs 48 #NO_APP at the beginning of its output. */ 49 /* Also note that C style comments are always supported. */ 50 const char line_comment_chars[] = "#;*"; 51 52 /* This array holds machine specific line separator characters. */ 53 const char line_separator_chars[] = ""; 54 55 /* Chars that can be used to separate mant from exp in floating point nums. */ 56 const char EXP_CHARS[] = "eE"; 57 58 /* Chars that mean this number is a floating point constant. 59 As in 0f12.456 60 or 0d1.2345e12 */ 61 const char FLT_CHARS[] = "rRsSfFdDxXpP"; 62 63 /* Machine-dependent command-line options. */ 64 65 struct pru_opt_s 66 { 67 /* -mno-link-relax / -mlink-relax: generate (or not) 68 relocations for linker relaxation. */ 69 bfd_boolean link_relax; 70 71 /* -mno-warn-regname-label: do not output a warning that a label name 72 matches a register name. */ 73 bfd_boolean warn_regname_label; 74 }; 75 76 static struct pru_opt_s pru_opt = { TRUE, TRUE }; 77 78 const char *md_shortopts = "r"; 79 80 enum options 81 { 82 OPTION_LINK_RELAX = OPTION_MD_BASE + 1, 83 OPTION_NO_LINK_RELAX, 84 OPTION_NO_WARN_REGNAME_LABEL, 85 }; 86 87 struct option md_longopts[] = { 88 { "mlink-relax", no_argument, NULL, OPTION_LINK_RELAX }, 89 { "mno-link-relax", no_argument, NULL, OPTION_NO_LINK_RELAX }, 90 { "mno-warn-regname-label", no_argument, NULL, 91 OPTION_NO_WARN_REGNAME_LABEL }, 92 { NULL, no_argument, NULL, 0 } 93 }; 94 95 size_t md_longopts_size = sizeof (md_longopts); 96 97 typedef struct pru_insn_reloc 98 { 99 /* Any expression in the instruction is parsed into this field, 100 which is passed to fix_new_exp () to generate a fixup. */ 101 expressionS reloc_expression; 102 103 /* The type of the relocation to be applied. */ 104 bfd_reloc_code_real_type reloc_type; 105 106 /* PC-relative. */ 107 unsigned int reloc_pcrel; 108 109 /* The next relocation to be applied to the instruction. */ 110 struct pru_insn_reloc *reloc_next; 111 } pru_insn_relocS; 112 113 /* This struct is used to hold state when assembling instructions. */ 114 typedef struct pru_insn_info 115 { 116 /* Assembled instruction. */ 117 unsigned long insn_code; 118 /* Used for assembling LDI32. */ 119 unsigned long ldi32_imm32; 120 121 /* Pointer to the relevant bit of the opcode table. */ 122 const struct pru_opcode *insn_pru_opcode; 123 /* After parsing ptrs to the tokens in the instruction fill this array 124 it is terminated with a null pointer (hence the first +1). 125 The second +1 is because in some parts of the code the opcode 126 is not counted as a token, but still placed in this array. */ 127 const char *insn_tokens[PRU_MAX_INSN_TOKENS + 1 + 1]; 128 129 /* This holds information used to generate fixups 130 and eventually relocations if it is not null. */ 131 pru_insn_relocS *insn_reloc; 132 } pru_insn_infoS; 133 134 /* Opcode hash table. */ 135 static struct hash_control *pru_opcode_hash = NULL; 136 #define pru_opcode_lookup(NAME) \ 137 ((struct pru_opcode *) hash_find (pru_opcode_hash, (NAME))) 138 139 /* Register hash table. */ 140 static struct hash_control *pru_reg_hash = NULL; 141 #define pru_reg_lookup(NAME) \ 142 ((struct pru_reg *) hash_find (pru_reg_hash, (NAME))) 143 144 /* The known current alignment of the current section. */ 145 static int pru_current_align; 146 static segT pru_current_align_seg; 147 148 static int pru_auto_align_on = 1; 149 150 /* The last seen label in the current section. This is used to auto-align 151 labels preceding instructions. */ 152 static symbolS *pru_last_label; 153 154 155 /** Utility routines. */ 156 /* Function md_chars_to_number takes the sequence of 157 bytes in buf and returns the corresponding value 158 in an int. n must be 1, 2, 4 or 8. */ 159 static uint64_t 160 md_chars_to_number (char *buf, int n) 161 { 162 int i; 163 uint64_t val; 164 165 gas_assert (n == 1 || n == 2 || n == 4 || n == 8); 166 167 val = 0; 168 for (i = 0; i < n; ++i) 169 val = val | ((buf[i] & 0xff) << 8 * i); 170 return val; 171 } 172 173 174 /* This function turns a C long int, short int or char 175 into the series of bytes that represent the number 176 on the target machine. */ 177 void 178 md_number_to_chars (char *buf, valueT val, int n) 179 { 180 gas_assert (n == 1 || n == 2 || n == 4 || n == 8); 181 number_to_chars_littleendian (buf, val, n); 182 } 183 184 /* Turn a string in input_line_pointer into a floating point constant 185 of type TYPE, and store the appropriate bytes in *LITP. The number 186 of LITTLENUMS emitted is stored in *SIZEP. An error message is 187 returned, or NULL on OK. */ 188 const char * 189 md_atof (int type, char *litP, int *sizeP) 190 { 191 return ieee_md_atof (type, litP, sizeP, FALSE); 192 } 193 194 /* Return true if STR starts with PREFIX, which should be a string literal. */ 195 #define strprefix(STR, PREFIX) \ 196 (strncmp ((STR), PREFIX, strlen (PREFIX)) == 0) 197 198 /* nop fill pattern for text section. */ 199 static char const nop[4] = { 0xe0, 0xe0, 0xe0, 0x12 }; 200 201 /* Handles all machine-dependent alignment needs. */ 202 static void 203 pru_align (int log_size, const char *pfill, symbolS *label) 204 { 205 int align; 206 long max_alignment = 15; 207 208 /* The front end is prone to changing segments out from under us 209 temporarily when -g is in effect. */ 210 int switched_seg_p = (pru_current_align_seg != now_seg); 211 212 align = log_size; 213 if (align > max_alignment) 214 { 215 align = max_alignment; 216 as_bad (_("Alignment too large: %d assumed"), align); 217 } 218 else if (align < 0) 219 { 220 as_warn (_("Alignment negative: 0 assumed")); 221 align = 0; 222 } 223 224 if (align != 0) 225 { 226 if (subseg_text_p (now_seg) && align >= 2) 227 { 228 /* First, make sure we're on a four-byte boundary, in case 229 someone has been putting .byte values the text section. */ 230 if (pru_current_align < 2 || switched_seg_p) 231 frag_align (2, 0, 0); 232 233 /* Now fill in the alignment pattern. */ 234 if (pfill != NULL) 235 frag_align_pattern (align, pfill, sizeof nop, 0); 236 else 237 frag_align (align, 0, 0); 238 } 239 else 240 frag_align (align, 0, 0); 241 242 if (!switched_seg_p) 243 pru_current_align = align; 244 245 /* If the last label was in a different section we can't align it. */ 246 if (label != NULL && !switched_seg_p) 247 { 248 symbolS *sym; 249 int label_seen = FALSE; 250 struct frag *old_frag; 251 valueT old_value; 252 valueT new_value; 253 254 gas_assert (S_GET_SEGMENT (label) == now_seg); 255 256 old_frag = symbol_get_frag (label); 257 old_value = S_GET_VALUE (label); 258 new_value = (valueT) frag_now_fix (); 259 260 /* It is possible to have more than one label at a particular 261 address, especially if debugging is enabled, so we must 262 take care to adjust all the labels at this address in this 263 fragment. To save time we search from the end of the symbol 264 list, backwards, since the symbols we are interested in are 265 almost certainly the ones that were most recently added. 266 Also to save time we stop searching once we have seen at least 267 one matching label, and we encounter a label that is no longer 268 in the target fragment. Note, this search is guaranteed to 269 find at least one match when sym == label, so no special case 270 code is necessary. */ 271 for (sym = symbol_lastP; sym != NULL; sym = symbol_previous (sym)) 272 if (symbol_get_frag (sym) == old_frag 273 && S_GET_VALUE (sym) == old_value) 274 { 275 label_seen = TRUE; 276 symbol_set_frag (sym, frag_now); 277 S_SET_VALUE (sym, new_value); 278 } 279 else if (label_seen && symbol_get_frag (sym) != old_frag) 280 break; 281 } 282 record_alignment (now_seg, align); 283 } 284 } 285 286 287 /** Support for self-check mode. */ 288 289 /* Mode of the assembler. */ 290 typedef enum 291 { 292 PRU_MODE_ASSEMBLE, /* Ordinary operation. */ 293 PRU_MODE_TEST /* Hidden mode used for self testing. */ 294 } PRU_MODE; 295 296 static PRU_MODE pru_mode = PRU_MODE_ASSEMBLE; 297 298 /* This function is used to in self-checking mode 299 to check the assembled instruction. 300 OPCODE should be the assembled opcode, and exp_opcode 301 the parsed string representing the expected opcode. */ 302 303 static void 304 pru_check_assembly (unsigned int opcode, const char *exp_opcode) 305 { 306 if (pru_mode == PRU_MODE_TEST) 307 { 308 if (exp_opcode == NULL) 309 as_bad (_("expecting opcode string in self test mode")); 310 else if (opcode != strtoul (exp_opcode, NULL, 16)) 311 as_bad (_("assembly 0x%08x, expected %s"), opcode, exp_opcode); 312 } 313 } 314 315 316 /** Support for machine-dependent assembler directives. */ 317 /* Handle the .align pseudo-op. This aligns to a power of two. It 318 also adjusts any current instruction label. We treat this the same 319 way the MIPS port does: .align 0 turns off auto alignment. */ 320 static void 321 s_pru_align (int ignore ATTRIBUTE_UNUSED) 322 { 323 int align; 324 char fill; 325 const char *pfill = NULL; 326 long max_alignment = 15; 327 328 align = get_absolute_expression (); 329 if (align > max_alignment) 330 { 331 align = max_alignment; 332 as_bad (_("Alignment too large: %d assumed"), align); 333 } 334 else if (align < 0) 335 { 336 as_warn (_("Alignment negative: 0 assumed")); 337 align = 0; 338 } 339 340 if (*input_line_pointer == ',') 341 { 342 input_line_pointer++; 343 fill = get_absolute_expression (); 344 pfill = (const char *) &fill; 345 } 346 else if (subseg_text_p (now_seg)) 347 pfill = (const char *) &nop; 348 else 349 { 350 pfill = NULL; 351 pru_last_label = NULL; 352 } 353 354 if (align != 0) 355 { 356 pru_auto_align_on = 1; 357 pru_align (align, pfill, pru_last_label); 358 pru_last_label = NULL; 359 } 360 else 361 pru_auto_align_on = 0; 362 363 demand_empty_rest_of_line (); 364 } 365 366 /* Handle the .text pseudo-op. This is like the usual one, but it 367 clears the saved last label and resets known alignment. */ 368 static void 369 s_pru_text (int i) 370 { 371 s_text (i); 372 pru_last_label = NULL; 373 pru_current_align = 0; 374 pru_current_align_seg = now_seg; 375 } 376 377 /* Handle the .data pseudo-op. This is like the usual one, but it 378 clears the saved last label and resets known alignment. */ 379 static void 380 s_pru_data (int i) 381 { 382 s_data (i); 383 pru_last_label = NULL; 384 pru_current_align = 0; 385 pru_current_align_seg = now_seg; 386 } 387 388 /* Handle the .section pseudo-op. This is like the usual one, but it 389 clears the saved last label and resets known alignment. */ 390 static void 391 s_pru_section (int ignore) 392 { 393 obj_elf_section (ignore); 394 pru_last_label = NULL; 395 pru_current_align = 0; 396 pru_current_align_seg = now_seg; 397 } 398 399 /* Explicitly unaligned cons. */ 400 static void 401 s_pru_ucons (int nbytes) 402 { 403 int hold; 404 hold = pru_auto_align_on; 405 pru_auto_align_on = 0; 406 cons (nbytes); 407 pru_auto_align_on = hold; 408 } 409 410 /* .set sets assembler options. */ 411 static void 412 s_pru_set (int equiv) 413 { 414 char *save = input_line_pointer; 415 char *directive; 416 char delim = get_symbol_name (&directive); 417 char *endline = input_line_pointer; 418 419 (void) restore_line_pointer (delim); 420 421 /* We only want to handle ".set XXX" if the 422 user has tried ".set XXX, YYY" they are not 423 trying a directive. This prevents 424 us from polluting the name space. */ 425 SKIP_WHITESPACE (); 426 if (is_end_of_line[(unsigned char) *input_line_pointer]) 427 { 428 bfd_boolean done = TRUE; 429 *endline = 0; 430 431 if (!strcmp (directive, "no_warn_regname_label")) 432 pru_opt.warn_regname_label = FALSE; 433 else 434 done = FALSE; 435 436 if (done) 437 { 438 *endline = delim; 439 demand_empty_rest_of_line (); 440 return; 441 } 442 } 443 444 /* If we fall through to here, either we have ".set XXX, YYY" 445 or we have ".set XXX" where XXX is unknown or we have 446 a syntax error. */ 447 input_line_pointer = save; 448 s_set (equiv); 449 } 450 451 /* Machine-dependent assembler directives. 452 Format of each entry is: 453 { "directive", handler_func, param } */ 454 const pseudo_typeS md_pseudo_table[] = { 455 {"align", s_pru_align, 0}, 456 {"text", s_pru_text, 0}, 457 {"data", s_pru_data, 0}, 458 {"section", s_pru_section, 0}, 459 {"section.s", s_pru_section, 0}, 460 {"sect", s_pru_section, 0}, 461 {"sect.s", s_pru_section, 0}, 462 /* .dword and .half are included for compatibility with MIPS. */ 463 {"dword", cons, 8}, 464 {"half", cons, 2}, 465 /* PRU native word size is 4 bytes, so we override 466 the GAS default of 2. */ 467 {"word", cons, 4}, 468 /* Explicitly unaligned directives. */ 469 {"2byte", s_pru_ucons, 2}, 470 {"4byte", s_pru_ucons, 4}, 471 {"8byte", s_pru_ucons, 8}, 472 {"16byte", s_pru_ucons, 16}, 473 {"set", s_pru_set, 0}, 474 {NULL, NULL, 0} 475 }; 476 477 478 int 479 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED, 480 asection *seg ATTRIBUTE_UNUSED) 481 { 482 abort (); 483 return 0; 484 } 485 486 void 487 md_convert_frag (bfd *headers ATTRIBUTE_UNUSED, segT segment ATTRIBUTE_UNUSED, 488 fragS *fragp ATTRIBUTE_UNUSED) 489 { 490 abort (); 491 } 492 493 494 static bfd_boolean 495 relaxable_section (asection *sec) 496 { 497 return ((sec->flags & SEC_DEBUGGING) == 0 498 && (sec->flags & SEC_CODE) != 0 499 && (sec->flags & SEC_ALLOC) != 0); 500 } 501 502 /* Does whatever the xtensa port does. */ 503 int 504 pru_validate_fix_sub (fixS *fix) 505 { 506 segT add_symbol_segment, sub_symbol_segment; 507 508 /* The difference of two symbols should be resolved by the assembler when 509 linkrelax is not set. If the linker may relax the section containing 510 the symbols, then an Xtensa DIFF relocation must be generated so that 511 the linker knows to adjust the difference value. */ 512 if (!linkrelax || fix->fx_addsy == NULL) 513 return 0; 514 515 /* Make sure both symbols are in the same segment, and that segment is 516 "normal" and relaxable. If the segment is not "normal", then the 517 fix is not valid. If the segment is not "relaxable", then the fix 518 should have been handled earlier. */ 519 add_symbol_segment = S_GET_SEGMENT (fix->fx_addsy); 520 if (! SEG_NORMAL (add_symbol_segment) 521 || ! relaxable_section (add_symbol_segment)) 522 return 0; 523 524 sub_symbol_segment = S_GET_SEGMENT (fix->fx_subsy); 525 return (sub_symbol_segment == add_symbol_segment); 526 } 527 528 /* TC_FORCE_RELOCATION hook. */ 529 530 /* If linkrelax is turned on, and the symbol to relocate 531 against is in a relaxable segment, don't compute the value - 532 generate a relocation instead. */ 533 int 534 pru_force_relocation (fixS *fix) 535 { 536 if (linkrelax && fix->fx_addsy 537 && relaxable_section (S_GET_SEGMENT (fix->fx_addsy))) 538 return 1; 539 540 return generic_force_reloc (fix); 541 } 542 543 544 545 /** Fixups and overflow checking. */ 546 547 /* Check a fixup for overflow. */ 548 static bfd_reloc_status_type 549 pru_check_overflow (valueT fixup, reloc_howto_type *howto) 550 { 551 bfd_reloc_status_type ret; 552 553 ret = bfd_check_overflow (howto->complain_on_overflow, 554 howto->bitsize, 555 howto->rightshift, 556 bfd_get_reloc_size (howto) * 8, 557 fixup); 558 559 return ret; 560 } 561 562 /* Emit diagnostic for fixup overflow. */ 563 static void 564 pru_diagnose_overflow (valueT fixup, reloc_howto_type *howto, 565 fixS *fixP, valueT value) 566 { 567 if (fixP->fx_r_type == BFD_RELOC_8 568 || fixP->fx_r_type == BFD_RELOC_16 569 || fixP->fx_r_type == BFD_RELOC_32) 570 /* These relocs are against data, not instructions. */ 571 as_bad_where (fixP->fx_file, fixP->fx_line, 572 _("immediate value 0x%x truncated to 0x%x"), 573 (unsigned int) fixup, 574 (unsigned int) (~(~(valueT) 0 << howto->bitsize) & fixup)); 575 else 576 { 577 /* What opcode is the instruction? This will determine 578 whether we check for overflow in immediate values 579 and what error message we get. */ 580 const struct pru_opcode *opcode; 581 enum overflow_type overflow_msg_type; 582 unsigned int range_min; 583 unsigned int range_max; 584 unsigned int address; 585 gas_assert (fixP->fx_size == 4); 586 opcode = pru_find_opcode (value); 587 gas_assert (opcode); 588 overflow_msg_type = opcode->overflow_msg; 589 switch (overflow_msg_type) 590 { 591 case call_target_overflow: 592 range_min 593 = ((fixP->fx_frag->fr_address + fixP->fx_where) & 0xf0000000); 594 range_max = range_min + 0x0fffffff; 595 address = fixup | range_min; 596 597 as_bad_where (fixP->fx_file, fixP->fx_line, 598 _("call target address 0x%08x out of range 0x%08x to 0x%08x"), 599 address, range_min, range_max); 600 break; 601 case qbranch_target_overflow: 602 as_bad_where (fixP->fx_file, fixP->fx_line, 603 _("quick branch offset %d out of range %d to %d"), 604 (int)fixup, -((1<<9) * 4), (1 << 9) * 4); 605 break; 606 case address_offset_overflow: 607 as_bad_where (fixP->fx_file, fixP->fx_line, 608 _("%s offset %d out of range %d to %d"), 609 opcode->name, (int)fixup, -32768, 32767); 610 break; 611 case signed_immed16_overflow: 612 as_bad_where (fixP->fx_file, fixP->fx_line, 613 _("immediate value %d out of range %d to %d"), 614 (int)fixup, -32768, 32767); 615 break; 616 case unsigned_immed32_overflow: 617 as_bad_where (fixP->fx_file, fixP->fx_line, 618 _("immediate value %llu out of range %u to %lu"), 619 (unsigned long long)fixup, 0, 0xfffffffflu); 620 break; 621 case unsigned_immed16_overflow: 622 as_bad_where (fixP->fx_file, fixP->fx_line, 623 _("immediate value %u out of range %u to %u"), 624 (unsigned int)fixup, 0, 65535); 625 break; 626 case unsigned_immed5_overflow: 627 as_bad_where (fixP->fx_file, fixP->fx_line, 628 _("immediate value %u out of range %u to %u"), 629 (unsigned int)fixup, 0, 31); 630 break; 631 default: 632 as_bad_where (fixP->fx_file, fixP->fx_line, 633 _("overflow in immediate argument")); 634 break; 635 } 636 } 637 } 638 639 /* Apply a fixup to the object file. */ 640 void 641 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) 642 { 643 unsigned char *where; 644 valueT value = *valP; 645 long n; 646 647 /* Assert that the fixup is one we can handle. */ 648 gas_assert (fixP != NULL && valP != NULL 649 && (fixP->fx_r_type == BFD_RELOC_8 650 || fixP->fx_r_type == BFD_RELOC_16 651 || fixP->fx_r_type == BFD_RELOC_32 652 || fixP->fx_r_type == BFD_RELOC_64 653 || fixP->fx_r_type == BFD_RELOC_PRU_LDI32 654 || fixP->fx_r_type == BFD_RELOC_PRU_U16 655 || fixP->fx_r_type == BFD_RELOC_PRU_U16_PMEMIMM 656 || fixP->fx_r_type == BFD_RELOC_PRU_S10_PCREL 657 || fixP->fx_r_type == BFD_RELOC_PRU_U8_PCREL 658 || fixP->fx_r_type == BFD_RELOC_PRU_32_PMEM 659 || fixP->fx_r_type == BFD_RELOC_PRU_16_PMEM 660 /* Add other relocs here as we generate them. */ 661 )); 662 663 if (fixP->fx_r_type == BFD_RELOC_64) 664 { 665 /* We may reach here due to .8byte directives, but we never output 666 BFD_RELOC_64; it must be resolved. */ 667 if (fixP->fx_addsy != NULL) 668 as_bad_where (fixP->fx_file, fixP->fx_line, 669 _("cannot create 64-bit relocation")); 670 else 671 { 672 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where, 673 *valP, 8); 674 fixP->fx_done = 1; 675 } 676 return; 677 } 678 679 /* gas_assert (had_errors () || !fixP->fx_subsy); */ 680 681 /* In general, fix instructions with immediate 682 constants. But leave LDI32 for the linker, 683 which is prepared to shorten insns. */ 684 if (fixP->fx_addsy == (symbolS *) NULL 685 && fixP->fx_r_type != BFD_RELOC_PRU_LDI32) 686 fixP->fx_done = 1; 687 688 else if (fixP->fx_pcrel) 689 { 690 segT s = S_GET_SEGMENT (fixP->fx_addsy); 691 692 if (s == seg || s == absolute_section) 693 { 694 /* Blindly copied from AVR, but I don't understand why 695 this is needed in the first place. Fail hard to catch 696 when this curious code snippet is utilized. */ 697 as_bad_where (fixP->fx_file, fixP->fx_line, 698 _("unexpected PC relative expression")); 699 value += S_GET_VALUE (fixP->fx_addsy); 700 fixP->fx_done = 1; 701 } 702 } 703 else if (linkrelax && fixP->fx_subsy) 704 { 705 /* For a subtraction relocation expression, generate one 706 of the DIFF relocs, with the value being the difference. 707 Note that a sym1 - sym2 expression is adjusted into a 708 section_start_sym + sym4_offset_from_section_start - sym1 709 expression. fixP->fx_addsy holds the section start symbol, 710 fixP->fx_offset holds sym2's offset, and fixP->fx_subsy 711 holds sym1. Calculate the current difference and write value, 712 but leave fx_offset as is - during relaxation, 713 fx_offset - value gives sym1's value. */ 714 715 offsetT diffval; /* valueT is unsigned, so use offsetT. */ 716 717 diffval = S_GET_VALUE (fixP->fx_addsy) 718 + fixP->fx_offset - S_GET_VALUE (fixP->fx_subsy); 719 720 switch (fixP->fx_r_type) 721 { 722 case BFD_RELOC_8: 723 fixP->fx_r_type = BFD_RELOC_PRU_GNU_DIFF8; 724 break; 725 case BFD_RELOC_16: 726 fixP->fx_r_type = BFD_RELOC_PRU_GNU_DIFF16; 727 break; 728 case BFD_RELOC_32: 729 fixP->fx_r_type = BFD_RELOC_PRU_GNU_DIFF32; 730 break; 731 case BFD_RELOC_PRU_16_PMEM: 732 fixP->fx_r_type = BFD_RELOC_PRU_GNU_DIFF16_PMEM; 733 if (diffval % 4) 734 as_bad_where (fixP->fx_file, fixP->fx_line, 735 _("residual low bits in pmem diff relocation")); 736 diffval /= 4; 737 break; 738 case BFD_RELOC_PRU_32_PMEM: 739 fixP->fx_r_type = BFD_RELOC_PRU_GNU_DIFF32_PMEM; 740 if (diffval % 4) 741 as_bad_where (fixP->fx_file, fixP->fx_line, 742 _("residual low bits in pmem diff relocation")); 743 diffval /= 4; 744 break; 745 default: 746 as_bad_where (fixP->fx_file, fixP->fx_line, 747 _("expression too complex")); 748 break; 749 } 750 751 value = *valP = diffval; 752 753 fixP->fx_subsy = NULL; 754 } 755 /* We don't actually support subtracting a symbol. */ 756 if (fixP->fx_subsy != (symbolS *) NULL) 757 as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex")); 758 759 /* For the DIFF relocs, write the value into the object file while still 760 keeping fx_done FALSE, as both the difference (recorded in the object file) 761 and the sym offset (part of fixP) are needed at link relax time. */ 762 where = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where; 763 switch (fixP->fx_r_type) 764 { 765 case BFD_RELOC_PRU_GNU_DIFF8: 766 *where = value; 767 break; 768 case BFD_RELOC_PRU_GNU_DIFF16: 769 case BFD_RELOC_PRU_GNU_DIFF16_PMEM: 770 bfd_putl16 ((bfd_vma) value, where); 771 break; 772 case BFD_RELOC_PRU_GNU_DIFF32: 773 case BFD_RELOC_PRU_GNU_DIFF32_PMEM: 774 bfd_putl32 ((bfd_vma) value, where); 775 break; 776 default: 777 break; 778 } 779 780 if (fixP->fx_done) 781 /* Fully resolved fixup. */ 782 { 783 reloc_howto_type *howto 784 = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type); 785 786 if (howto == NULL) 787 as_bad_where (fixP->fx_file, fixP->fx_line, 788 _("relocation is not supported")); 789 else 790 { 791 valueT fixup = value; 792 uint64_t insn; 793 char *buf; 794 795 /* Get the instruction or data to be fixed up. */ 796 buf = fixP->fx_frag->fr_literal + fixP->fx_where; 797 insn = md_chars_to_number (buf, fixP->fx_size); 798 799 /* Check for overflow, emitting a diagnostic if necessary. */ 800 if (pru_check_overflow (fixup, howto) != bfd_reloc_ok) 801 pru_diagnose_overflow (fixup, howto, fixP, insn); 802 803 /* Apply the right shift. */ 804 fixup = ((offsetT)fixup) >> howto->rightshift; 805 806 /* Truncate the fixup to right size. */ 807 n = sizeof (fixup) * 8 - howto->bitsize; 808 fixup = (fixup << n) >> n; 809 810 /* Fix up the instruction. Non-contiguous bitfields need 811 special handling. */ 812 if (fixP->fx_r_type == BFD_RELOC_PRU_LDI32) 813 { 814 /* As the only 64-bit "insn", LDI32 needs special handling. */ 815 uint32_t insn1 = insn & 0xffffffff; 816 uint32_t insn2 = insn >> 32; 817 SET_INSN_FIELD (IMM16, insn1, fixup >> 16); 818 SET_INSN_FIELD (IMM16, insn2, fixup & 0xffff); 819 820 SET_INSN_FIELD (RDSEL, insn1, RSEL_31_16); 821 SET_INSN_FIELD (RDSEL, insn2, RSEL_15_0); 822 823 md_number_to_chars (buf, insn1, 4); 824 md_number_to_chars (buf + 4, insn2, 4); 825 } 826 else 827 { 828 if (fixP->fx_r_type == BFD_RELOC_PRU_S10_PCREL) 829 SET_BROFF_URAW (insn, fixup); 830 else 831 insn = (insn & ~howto->dst_mask) | (fixup << howto->bitpos); 832 md_number_to_chars (buf, insn, fixP->fx_size); 833 } 834 } 835 836 fixP->fx_done = 1; 837 } 838 839 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT) 840 { 841 fixP->fx_done = 0; 842 if (fixP->fx_addsy 843 && !S_IS_DEFINED (fixP->fx_addsy) && !S_IS_WEAK (fixP->fx_addsy)) 844 S_SET_WEAK (fixP->fx_addsy); 845 } 846 else if (fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY) 847 fixP->fx_done = 0; 848 } 849 850 851 852 /** Instruction parsing support. */ 853 854 /* Creates a new pru_insn_relocS and returns a pointer to it. */ 855 static pru_insn_relocS * 856 pru_insn_reloc_new (bfd_reloc_code_real_type reloc_type, unsigned int pcrel) 857 { 858 pru_insn_relocS *retval; 859 retval = XNEW (pru_insn_relocS); 860 if (retval == NULL) 861 { 862 as_bad (_("can't create relocation")); 863 abort (); 864 } 865 866 /* Fill out the fields with default values. */ 867 retval->reloc_next = NULL; 868 retval->reloc_type = reloc_type; 869 retval->reloc_pcrel = pcrel; 870 return retval; 871 } 872 873 /* Frees up memory previously allocated by pru_insn_reloc_new (). */ 874 static void 875 pru_insn_reloc_destroy (pru_insn_relocS *reloc) 876 { 877 pru_insn_relocS *next; 878 879 while (reloc) 880 { 881 next = reloc->reloc_next; 882 free (reloc); 883 reloc = next; 884 } 885 } 886 887 /* The various pru_assemble_* functions call this 888 function to generate an expression from a string representing an expression. 889 It then tries to evaluate the expression, and if it can, returns its value. 890 If not, it creates a new pru_insn_relocS and stores the expression and 891 reloc_type for future use. */ 892 static unsigned long 893 pru_assemble_expression (const char *exprstr, 894 pru_insn_infoS *insn, 895 pru_insn_relocS *prev_reloc, 896 bfd_reloc_code_real_type reloc_type, 897 unsigned int pcrel) 898 { 899 expressionS *ep; 900 pru_insn_relocS *reloc; 901 char *saved_line_ptr; 902 unsigned short value; 903 904 gas_assert (exprstr != NULL); 905 gas_assert (insn != NULL); 906 907 /* We use this blank keyword to distinguish register from 908 label operands. */ 909 if (strstr (exprstr, "%label") != NULL) 910 { 911 exprstr += strlen ("%label") + 1; 912 } 913 914 /* Check for pmem relocation operator. 915 Change the relocation type and advance the ptr to the start of 916 the expression proper. */ 917 if (strstr (exprstr, "%pmem") != NULL) 918 { 919 reloc_type = BFD_RELOC_PRU_U16_PMEMIMM; 920 exprstr += strlen ("%pmem") + 1; 921 } 922 923 /* We potentially have a relocation. */ 924 reloc = pru_insn_reloc_new (reloc_type, pcrel); 925 if (prev_reloc != NULL) 926 prev_reloc->reloc_next = reloc; 927 else 928 insn->insn_reloc = reloc; 929 930 /* Parse the expression string. */ 931 ep = &reloc->reloc_expression; 932 saved_line_ptr = input_line_pointer; 933 input_line_pointer = (char *) exprstr; 934 SKIP_WHITESPACE (); 935 expression (ep); 936 SKIP_WHITESPACE (); 937 if (*input_line_pointer) 938 as_bad (_("trailing garbage after expression: %s"), input_line_pointer); 939 input_line_pointer = saved_line_ptr; 940 941 942 if (ep->X_op == O_illegal || ep->X_op == O_absent) 943 as_bad (_("expected expression, got %s"), exprstr); 944 945 /* This is redundant as the fixup will put this into 946 the instruction, but it is included here so that 947 self-test mode (-r) works. */ 948 value = 0; 949 if (pru_mode == PRU_MODE_TEST && ep->X_op == O_constant) 950 value = ep->X_add_number; 951 952 return (unsigned long) value; 953 } 954 955 /* Try to parse a non-relocatable expression. */ 956 static unsigned long 957 pru_assemble_noreloc_expression (const char *exprstr) 958 { 959 expressionS exp; 960 char *saved_line_ptr; 961 unsigned long val; 962 963 gas_assert (exprstr != NULL); 964 965 saved_line_ptr = input_line_pointer; 966 input_line_pointer = (char *) exprstr; 967 SKIP_WHITESPACE (); 968 expression (&exp); 969 SKIP_WHITESPACE (); 970 if (*input_line_pointer) 971 as_bad (_("trailing garbage after expression: %s"), input_line_pointer); 972 input_line_pointer = saved_line_ptr; 973 974 val = 0; 975 if (exp.X_op != O_constant) 976 as_bad (_("expected constant expression, got %s"), exprstr); 977 else 978 val = exp.X_add_number; 979 980 return val; 981 } 982 983 /* Argument assemble functions. 984 All take an instruction argument string, and a pointer 985 to an instruction opcode. Upon return the insn_opcode 986 has the relevant fields filled in to represent the arg 987 string. The return value is NULL if successful, or 988 an error message if an error was detected. */ 989 990 static void 991 pru_assemble_arg_d (pru_insn_infoS *insn_info, const char *argstr) 992 { 993 struct pru_reg *dst = pru_reg_lookup (argstr); 994 995 if (dst == NULL) 996 as_bad (_("unknown register %s"), argstr); 997 else 998 { 999 SET_INSN_FIELD (RD, insn_info->insn_code, dst->index); 1000 SET_INSN_FIELD (RDSEL, insn_info->insn_code, dst->regsel); 1001 } 1002 } 1003 1004 static void 1005 pru_assemble_arg_D (pru_insn_infoS *insn_info, const char *argstr) 1006 { 1007 struct pru_reg *dst; 1008 1009 /* The leading & before an address register is optional. */ 1010 if (*argstr == '&') 1011 argstr++; 1012 1013 dst = pru_reg_lookup (argstr); 1014 1015 if (dst == NULL) 1016 as_bad (_("unknown register %s"), argstr); 1017 else 1018 { 1019 unsigned long rxb = 0; 1020 1021 switch (dst->regsel) 1022 { 1023 case RSEL_31_0: rxb = 0; break; /* whole register defaults to .b0 */ 1024 case RSEL_7_0: rxb = 0; break; 1025 case RSEL_15_8: rxb = 1; break; 1026 case RSEL_23_16: rxb = 2; break; 1027 case RSEL_31_24: rxb = 3; break; 1028 default: 1029 as_bad (_("data transfer register cannot be halfword")); 1030 } 1031 1032 SET_INSN_FIELD (RD, insn_info->insn_code, dst->index); 1033 SET_INSN_FIELD (RDB, insn_info->insn_code, rxb); 1034 } 1035 } 1036 1037 static void 1038 pru_assemble_arg_R (pru_insn_infoS *insn_info, const char *argstr) 1039 { 1040 struct pru_reg *dst = pru_reg_lookup (argstr); 1041 1042 if (dst == NULL) 1043 as_bad (_("unknown register %s"), argstr); 1044 else 1045 { 1046 if (dst->regsel != RSEL_31_0) 1047 { 1048 as_bad (_("destination register must be full-word")); 1049 } 1050 1051 SET_INSN_FIELD (RD, insn_info->insn_code, dst->index); 1052 SET_INSN_FIELD (RDSEL, insn_info->insn_code, dst->regsel); 1053 } 1054 } 1055 1056 static void 1057 pru_assemble_arg_s (pru_insn_infoS *insn_info, const char *argstr) 1058 { 1059 struct pru_reg *src1 = pru_reg_lookup (argstr); 1060 1061 if (src1 == NULL) 1062 as_bad (_("unknown register %s"), argstr); 1063 else 1064 { 1065 SET_INSN_FIELD (RS1, insn_info->insn_code, src1->index); 1066 SET_INSN_FIELD (RS1SEL, insn_info->insn_code, src1->regsel); 1067 } 1068 } 1069 1070 static void 1071 pru_assemble_arg_S (pru_insn_infoS *insn_info, const char *argstr) 1072 { 1073 struct pru_reg *src1 = pru_reg_lookup (argstr); 1074 1075 if (src1 == NULL) 1076 as_bad (_("unknown register %s"), argstr); 1077 else 1078 { 1079 if (src1->regsel != RSEL_31_0) 1080 as_bad (_("cannot use partial register %s for addressing"), argstr); 1081 SET_INSN_FIELD (RS1, insn_info->insn_code, src1->index); 1082 } 1083 } 1084 1085 static void 1086 pru_assemble_arg_b (pru_insn_infoS *insn_info, const char *argstr) 1087 { 1088 struct pru_reg *src2 = pru_reg_lookup (argstr); 1089 if (src2 == NULL) 1090 { 1091 unsigned long imm8 = pru_assemble_noreloc_expression (argstr); 1092 if (imm8 >= 0x100) 1093 as_bad (_("value %lu is too large for a byte operand"), imm8); 1094 SET_INSN_FIELD (IMM8, insn_info->insn_code, imm8); 1095 SET_INSN_FIELD (IO, insn_info->insn_code, 1); 1096 } 1097 else 1098 { 1099 SET_INSN_FIELD (IO, insn_info->insn_code, 0); 1100 SET_INSN_FIELD (RS2, insn_info->insn_code, src2->index); 1101 SET_INSN_FIELD (RS2SEL, insn_info->insn_code, src2->regsel); 1102 } 1103 1104 } 1105 1106 static void 1107 pru_assemble_arg_B (pru_insn_infoS *insn_info, const char *argstr) 1108 { 1109 struct pru_reg *src2 = pru_reg_lookup (argstr); 1110 if (src2 == NULL) 1111 { 1112 unsigned long imm8; 1113 imm8 = pru_assemble_noreloc_expression (argstr); 1114 if (!imm8 || imm8 > 0xff) 1115 as_bad (_("loop count constant %ld is out of range [1..%d]"), 1116 imm8, 0xff); 1117 /* Note: HW expects the immediate loop count field 1118 to be one less than the actual loop count. */ 1119 SET_INSN_FIELD (IMM8, insn_info->insn_code, imm8 - 1); 1120 SET_INSN_FIELD (IO, insn_info->insn_code, 1); 1121 } 1122 else 1123 { 1124 SET_INSN_FIELD (IO, insn_info->insn_code, 0); 1125 SET_INSN_FIELD (RS2, insn_info->insn_code, src2->index); 1126 SET_INSN_FIELD (RS2SEL, insn_info->insn_code, src2->regsel); 1127 } 1128 } 1129 1130 static void 1131 pru_assemble_arg_i (pru_insn_infoS *insn_info, const char *argstr) 1132 { 1133 unsigned long imm32; 1134 1135 /* We must not generate PRU_LDI32 relocation if relaxation is disabled in 1136 GAS. Consider the following scenario: GAS relaxation is disabled, so 1137 DIFF* expressions are fixed and not emitted as relocations. Then if LD 1138 has relaxation enabled, it may shorten LDI32 but will not update 1139 accordingly the DIFF expressions. */ 1140 if (pru_opt.link_relax) 1141 imm32 = pru_assemble_expression (argstr, insn_info, 1142 insn_info->insn_reloc, 1143 BFD_RELOC_PRU_LDI32, 0); 1144 else 1145 imm32 = pru_assemble_noreloc_expression (argstr); 1146 1147 /* QUIRK: LDI must clear IO bit high, even though it has immediate arg. */ 1148 SET_INSN_FIELD (IO, insn_info->insn_code, 0); 1149 SET_INSN_FIELD (RDSEL, insn_info->insn_code, RSEL_31_16); 1150 SET_INSN_FIELD (IMM16, insn_info->insn_code, imm32 >> 16); 1151 insn_info->ldi32_imm32 = imm32; 1152 } 1153 1154 static void 1155 pru_assemble_arg_j (pru_insn_infoS *insn_info, const char *argstr) 1156 { 1157 struct pru_reg *src2 = pru_reg_lookup (argstr); 1158 1159 if (src2 == NULL) 1160 { 1161 unsigned long imm16 = pru_assemble_expression (argstr, insn_info, 1162 insn_info->insn_reloc, 1163 BFD_RELOC_PRU_U16_PMEMIMM, 1164 0); 1165 SET_INSN_FIELD (IMM16, insn_info->insn_code, imm16); 1166 SET_INSN_FIELD (IO, insn_info->insn_code, 1); 1167 } 1168 else 1169 { 1170 SET_INSN_FIELD (IO, insn_info->insn_code, 0); 1171 SET_INSN_FIELD (RS2, insn_info->insn_code, src2->index); 1172 SET_INSN_FIELD (RS2SEL, insn_info->insn_code, src2->regsel); 1173 } 1174 } 1175 1176 static void 1177 pru_assemble_arg_W (pru_insn_infoS *insn_info, const char *argstr) 1178 { 1179 unsigned long imm16 = pru_assemble_expression (argstr, insn_info, 1180 insn_info->insn_reloc, 1181 BFD_RELOC_PRU_U16, 0); 1182 /* QUIRK: LDI must clear IO bit high, even though it has immediate arg. */ 1183 SET_INSN_FIELD (IO, insn_info->insn_code, 0); 1184 SET_INSN_FIELD (IMM16, insn_info->insn_code, imm16); 1185 } 1186 1187 static void 1188 pru_assemble_arg_o (pru_insn_infoS *insn_info, const char *argstr) 1189 { 1190 unsigned long imm10 = pru_assemble_expression (argstr, insn_info, 1191 insn_info->insn_reloc, 1192 BFD_RELOC_PRU_S10_PCREL, 1); 1193 SET_BROFF_URAW (insn_info->insn_code, imm10); 1194 } 1195 1196 static void 1197 pru_assemble_arg_O (pru_insn_infoS *insn_info, const char *argstr) 1198 { 1199 unsigned long imm8 = pru_assemble_expression (argstr, insn_info, 1200 insn_info->insn_reloc, 1201 BFD_RELOC_PRU_U8_PCREL, 1); 1202 SET_INSN_FIELD (LOOP_JMPOFFS, insn_info->insn_code, imm8); 1203 } 1204 1205 static void 1206 pru_assemble_arg_l (pru_insn_infoS *insn_info, const char *argstr) 1207 { 1208 unsigned long burstlen = 0; 1209 struct pru_reg *blreg = pru_reg_lookup (argstr); 1210 1211 if (blreg == NULL) 1212 { 1213 burstlen = pru_assemble_noreloc_expression (argstr); 1214 if (!burstlen || burstlen > LSSBBO_BYTECOUNT_R0_BITS7_0) 1215 as_bad (_("byte count constant %ld is out of range [1..%d]"), 1216 burstlen, LSSBBO_BYTECOUNT_R0_BITS7_0); 1217 burstlen--; 1218 } 1219 else 1220 { 1221 if (blreg->index != 0) 1222 as_bad (_("only r0 can be used as byte count register")); 1223 else if (blreg->regsel > RSEL_31_24) 1224 as_bad (_("only r0.bX byte fields of r0 can be used as byte count")); 1225 else 1226 burstlen = LSSBBO_BYTECOUNT_R0_BITS7_0 + blreg->regsel; 1227 } 1228 SET_BURSTLEN (insn_info->insn_code, burstlen); 1229 } 1230 1231 static void 1232 pru_assemble_arg_n (pru_insn_infoS *insn_info, const char *argstr) 1233 { 1234 unsigned long burstlen = 0; 1235 struct pru_reg *blreg = pru_reg_lookup (argstr); 1236 1237 if (blreg == NULL) 1238 { 1239 burstlen = pru_assemble_noreloc_expression (argstr); 1240 if (!burstlen || burstlen > LSSBBO_BYTECOUNT_R0_BITS7_0) 1241 as_bad (_("byte count constant %ld is out of range [1..%d]"), 1242 burstlen, LSSBBO_BYTECOUNT_R0_BITS7_0); 1243 burstlen--; 1244 } 1245 else 1246 { 1247 if (blreg->index != 0) 1248 as_bad (_("only r0 can be used as byte count register")); 1249 else if (blreg->regsel > RSEL_31_24) 1250 as_bad (_("only r0.bX byte fields of r0 can be used as byte count")); 1251 else 1252 burstlen = LSSBBO_BYTECOUNT_R0_BITS7_0 + blreg->regsel; 1253 } 1254 SET_INSN_FIELD (XFR_LENGTH, insn_info->insn_code, burstlen); 1255 } 1256 1257 static void 1258 pru_assemble_arg_c (pru_insn_infoS *insn_info, const char *argstr) 1259 { 1260 unsigned long cb = pru_assemble_noreloc_expression (argstr); 1261 1262 if (cb > 31) 1263 as_bad (_("invalid constant table offset %ld"), cb); 1264 else 1265 SET_INSN_FIELD (CB, insn_info->insn_code, cb); 1266 } 1267 1268 static void 1269 pru_assemble_arg_w (pru_insn_infoS *insn_info, const char *argstr) 1270 { 1271 unsigned long wk = pru_assemble_noreloc_expression (argstr); 1272 1273 if (wk != 0 && wk != 1) 1274 as_bad (_("invalid WakeOnStatus %ld"), wk); 1275 else 1276 SET_INSN_FIELD (WAKEONSTATUS, insn_info->insn_code, wk); 1277 } 1278 1279 static void 1280 pru_assemble_arg_x (pru_insn_infoS *insn_info, const char *argstr) 1281 { 1282 unsigned long wba = pru_assemble_noreloc_expression (argstr); 1283 1284 if (wba > 255) 1285 as_bad (_("invalid XFR WideBus Address %ld"), wba); 1286 else 1287 SET_INSN_FIELD (XFR_WBA, insn_info->insn_code, wba); 1288 } 1289 1290 /* The function consume_arg takes a pointer into a string 1291 of instruction tokens (args) and a pointer into a string 1292 representing the expected sequence of tokens and separators. 1293 It checks whether the first argument in argstr is of the 1294 expected type, throwing an error if it is not, and returns 1295 the pointer argstr. */ 1296 static char * 1297 pru_consume_arg (char *argstr, const char *parsestr) 1298 { 1299 char *temp; 1300 1301 switch (*parsestr) 1302 { 1303 case 'W': 1304 if (*argstr == '%') 1305 { 1306 if (strprefix (argstr, "%pmem") || strprefix (argstr, "%label")) 1307 { 1308 /* We zap the parentheses because we don't want them confused 1309 with separators. */ 1310 temp = strchr (argstr, '('); 1311 if (temp != NULL) 1312 *temp = ' '; 1313 temp = strchr (argstr, ')'); 1314 if (temp != NULL) 1315 *temp = ' '; 1316 } 1317 else 1318 as_bad (_("badly formed expression near %s"), argstr); 1319 } 1320 break; 1321 1322 case 'j': 1323 case 'o': 1324 case 'O': 1325 if (*argstr == '%') 1326 { 1327 /* Only 'j' really requires %label for distinguishing registers 1328 from labels, but we include 'o' and 'O' here to avoid 1329 confusing assembler programmers. Thus for completeness all 1330 jump operands can be prefixed with %label. */ 1331 if (strprefix (argstr, "%label")) 1332 { 1333 /* We zap the parentheses because we don't want them confused 1334 with separators. */ 1335 temp = strchr (argstr, '('); 1336 if (temp != NULL) 1337 *temp = ' '; 1338 temp = strchr (argstr, ')'); 1339 if (temp != NULL) 1340 *temp = ' '; 1341 } 1342 else 1343 as_bad (_("badly formed expression near %s"), argstr); 1344 } 1345 break; 1346 1347 case 'b': 1348 case 'B': 1349 case 'c': 1350 case 'd': 1351 case 'D': 1352 case 'E': 1353 case 'i': 1354 case 's': 1355 case 'S': 1356 case 'l': 1357 case 'n': 1358 case 'R': 1359 case 'w': 1360 case 'x': 1361 /* We can't have %pmem here. */ 1362 if (*argstr == '%') 1363 as_bad (_("badly formed expression near %s"), argstr); 1364 break; 1365 default: 1366 BAD_CASE (*parsestr); 1367 break; 1368 } 1369 1370 return argstr; 1371 } 1372 1373 /* The function consume_separator takes a pointer into a string 1374 of instruction tokens (args) and a pointer into a string representing 1375 the expected sequence of tokens and separators. It finds the first 1376 instance of the character pointed to by separator in argstr, and 1377 returns a pointer to the next element of argstr, which is the 1378 following token in the sequence. */ 1379 static char * 1380 pru_consume_separator (char *argstr, const char *separator) 1381 { 1382 char *p; 1383 1384 p = strchr (argstr, *separator); 1385 1386 if (p != NULL) 1387 *p++ = 0; 1388 else 1389 as_bad (_("expecting %c near %s"), *separator, argstr); 1390 return p; 1391 } 1392 1393 1394 /* The principal argument parsing function which takes a string argstr 1395 representing the instruction arguments for insn, and extracts the argument 1396 tokens matching parsestr into parsed_args. */ 1397 static void 1398 pru_parse_args (pru_insn_infoS *insn ATTRIBUTE_UNUSED, char *argstr, 1399 const char *parsestr, char **parsed_args) 1400 { 1401 char *p; 1402 char *end = NULL; 1403 int i; 1404 p = argstr; 1405 i = 0; 1406 bfd_boolean terminate = FALSE; 1407 1408 /* This rest of this function is it too fragile and it mostly works, 1409 therefore special case this one. */ 1410 if (*parsestr == 0 && argstr != 0) 1411 { 1412 as_bad (_("too many arguments")); 1413 parsed_args[0] = NULL; 1414 return; 1415 } 1416 1417 while (p != NULL && !terminate && i < PRU_MAX_INSN_TOKENS) 1418 { 1419 parsed_args[i] = pru_consume_arg (p, parsestr); 1420 ++parsestr; 1421 if (*parsestr != '\0') 1422 { 1423 p = pru_consume_separator (p, parsestr); 1424 ++parsestr; 1425 } 1426 else 1427 { 1428 /* Check that the argument string has no trailing arguments. */ 1429 /* If we've got a %pmem relocation, we've zapped the parens with 1430 spaces. */ 1431 if (strprefix (p, "%pmem") || strprefix (p, "%label")) 1432 end = strpbrk (p, ","); 1433 else 1434 end = strpbrk (p, " ,"); 1435 1436 if (end != NULL) 1437 as_bad (_("too many arguments")); 1438 } 1439 1440 if (*parsestr == '\0' || (p != NULL && *p == '\0')) 1441 terminate = TRUE; 1442 ++i; 1443 } 1444 1445 parsed_args[i] = NULL; 1446 1447 /* There are no instructions with optional arguments; complain. */ 1448 if (*parsestr != '\0') 1449 as_bad (_("missing argument")); 1450 } 1451 1452 1453 /** Assembler output support. */ 1454 1455 /* Output a normal instruction. */ 1456 static void 1457 output_insn (pru_insn_infoS *insn) 1458 { 1459 char *f; 1460 pru_insn_relocS *reloc; 1461 1462 f = frag_more (4); 1463 /* This allocates enough space for the instruction 1464 and puts it in the current frag. */ 1465 md_number_to_chars (f, insn->insn_code, 4); 1466 /* Emit debug info. */ 1467 dwarf2_emit_insn (4); 1468 /* Create any fixups to be acted on later. */ 1469 for (reloc = insn->insn_reloc; reloc != NULL; reloc = reloc->reloc_next) 1470 fix_new_exp (frag_now, f - frag_now->fr_literal, 4, 1471 &reloc->reloc_expression, reloc->reloc_pcrel, 1472 reloc->reloc_type); 1473 } 1474 1475 /* Output two LDI instructions from LDI32 macro */ 1476 static void 1477 output_insn_ldi32 (pru_insn_infoS *insn) 1478 { 1479 char *f; 1480 pru_insn_relocS *reloc; 1481 unsigned long insn2; 1482 1483 f = frag_more (8); 1484 SET_INSN_FIELD (IMM16, insn->insn_code, insn->ldi32_imm32 >> 16); 1485 SET_INSN_FIELD (RDSEL, insn->insn_code, RSEL_31_16); 1486 md_number_to_chars (f, insn->insn_code, 4); 1487 1488 insn2 = insn->insn_code; 1489 SET_INSN_FIELD (IMM16, insn2, insn->ldi32_imm32 & 0xffff); 1490 SET_INSN_FIELD (RDSEL, insn2, RSEL_15_0); 1491 md_number_to_chars (f + 4, insn2, 4); 1492 1493 /* Emit debug info. */ 1494 dwarf2_emit_insn (8); 1495 1496 /* Create any fixups to be acted on later. */ 1497 for (reloc = insn->insn_reloc; reloc != NULL; reloc = reloc->reloc_next) 1498 fix_new_exp (frag_now, f - frag_now->fr_literal, 4, 1499 &reloc->reloc_expression, reloc->reloc_pcrel, 1500 reloc->reloc_type); 1501 } 1502 1503 1504 /** External interfaces. */ 1505 1506 /* The following functions are called by machine-independent parts of 1507 the assembler. */ 1508 int 1509 md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED) 1510 { 1511 switch (c) 1512 { 1513 case 'r': 1514 /* Hidden option for self-test mode. */ 1515 pru_mode = PRU_MODE_TEST; 1516 break; 1517 case OPTION_LINK_RELAX: 1518 pru_opt.link_relax = TRUE; 1519 break; 1520 case OPTION_NO_LINK_RELAX: 1521 pru_opt.link_relax = FALSE; 1522 break; 1523 case OPTION_NO_WARN_REGNAME_LABEL: 1524 pru_opt.warn_regname_label = FALSE; 1525 break; 1526 default: 1527 return 0; 1528 break; 1529 } 1530 1531 return 1; 1532 } 1533 1534 const char * 1535 pru_target_format (void) 1536 { 1537 return "elf32-pru"; 1538 } 1539 1540 /* Machine-dependent usage message. */ 1541 void 1542 md_show_usage (FILE *stream) 1543 { 1544 fprintf (stream, 1545 _("PRU options:\n" 1546 " -mlink-relax generate relocations for linker relaxation (default).\n" 1547 " -mno-link-relax don't generate relocations for linker relaxation.\n" 1548 )); 1549 1550 } 1551 1552 /* This function is called once, at assembler startup time. 1553 It should set up all the tables, etc. that the MD part of the 1554 assembler will need. */ 1555 void 1556 md_begin (void) 1557 { 1558 int i; 1559 const char *inserted; 1560 1561 /* Create and fill a hashtable for the PRU opcodes, registers and 1562 arguments. */ 1563 pru_opcode_hash = hash_new (); 1564 pru_reg_hash = hash_new (); 1565 1566 for (i = 0; i < NUMOPCODES; ++i) 1567 { 1568 inserted 1569 = hash_insert (pru_opcode_hash, pru_opcodes[i].name, 1570 (PTR) & pru_opcodes[i]); 1571 if (inserted != NULL) 1572 { 1573 fprintf (stderr, _("internal error: can't hash `%s': %s\n"), 1574 pru_opcodes[i].name, inserted); 1575 /* Probably a memory allocation problem? Give up now. */ 1576 as_fatal (_("Broken assembler. No assembly attempted.")); 1577 } 1578 } 1579 1580 for (i = 0; i < pru_num_regs; ++i) 1581 { 1582 inserted 1583 = hash_insert (pru_reg_hash, pru_regs[i].name, 1584 (PTR) & pru_regs[i]); 1585 if (inserted != NULL) 1586 { 1587 fprintf (stderr, _("internal error: can't hash `%s': %s\n"), 1588 pru_regs[i].name, inserted); 1589 /* Probably a memory allocation problem? Give up now. */ 1590 as_fatal (_("Broken assembler. No assembly attempted.")); 1591 } 1592 1593 } 1594 1595 linkrelax = pru_opt.link_relax; 1596 /* Initialize the alignment data. */ 1597 pru_current_align_seg = now_seg; 1598 pru_last_label = NULL; 1599 pru_current_align = 0; 1600 } 1601 1602 1603 /* Assembles a single line of PRU assembly language. */ 1604 void 1605 md_assemble (char *op_str) 1606 { 1607 char *argstr; 1608 char *op_strdup = NULL; 1609 pru_insn_infoS thisinsn; 1610 pru_insn_infoS *insn = &thisinsn; 1611 1612 /* Make sure we are aligned on a 4-byte boundary. */ 1613 if (pru_current_align < 2) 1614 pru_align (2, NULL, pru_last_label); 1615 else if (pru_current_align > 2) 1616 pru_current_align = 2; 1617 pru_last_label = NULL; 1618 1619 /* We don't want to clobber to op_str 1620 because we want to be able to use it in messages. */ 1621 op_strdup = strdup (op_str); 1622 insn->insn_tokens[0] = strtok (op_strdup, " "); 1623 argstr = strtok (NULL, ""); 1624 1625 /* Assemble the opcode. */ 1626 insn->insn_pru_opcode = pru_opcode_lookup (insn->insn_tokens[0]); 1627 insn->insn_reloc = NULL; 1628 1629 if (insn->insn_pru_opcode != NULL) 1630 { 1631 const char *argsfmt = insn->insn_pru_opcode->args; 1632 const char **argtk = &insn->insn_tokens[1]; 1633 const char *argp; 1634 1635 /* Set the opcode for the instruction. */ 1636 insn->insn_code = insn->insn_pru_opcode->match; 1637 1638 if (pru_mode == PRU_MODE_TEST) 1639 { 1640 /* Add the "expected" instruction parameter used for validation. */ 1641 argsfmt = malloc (strlen (argsfmt) + 3); 1642 sprintf ((char *)argsfmt, "%s,E", insn->insn_pru_opcode->args); 1643 } 1644 pru_parse_args (insn, argstr, argsfmt, 1645 (char **) &insn->insn_tokens[1]); 1646 1647 for (argp = argsfmt; !had_errors () && *argp && *argtk; ++argp) 1648 { 1649 gas_assert (argtk <= &insn->insn_tokens[PRU_MAX_INSN_TOKENS]); 1650 1651 switch (*argp) 1652 { 1653 case ',': 1654 continue; 1655 1656 case 'd': 1657 pru_assemble_arg_d (insn, *argtk++); 1658 continue; 1659 case 'D': 1660 pru_assemble_arg_D (insn, *argtk++); 1661 continue; 1662 case 'R': 1663 pru_assemble_arg_R (insn, *argtk++); 1664 continue; 1665 case 's': 1666 pru_assemble_arg_s (insn, *argtk++); 1667 continue; 1668 case 'S': 1669 pru_assemble_arg_S (insn, *argtk++); 1670 continue; 1671 case 'b': 1672 pru_assemble_arg_b (insn, *argtk++); 1673 continue; 1674 case 'B': 1675 pru_assemble_arg_B (insn, *argtk++); 1676 continue; 1677 case 'i': 1678 pru_assemble_arg_i (insn, *argtk++); 1679 continue; 1680 case 'j': 1681 pru_assemble_arg_j (insn, *argtk++); 1682 continue; 1683 case 'W': 1684 pru_assemble_arg_W (insn, *argtk++); 1685 continue; 1686 case 'o': 1687 pru_assemble_arg_o (insn, *argtk++); 1688 continue; 1689 case 'O': 1690 pru_assemble_arg_O (insn, *argtk++); 1691 continue; 1692 case 'l': 1693 pru_assemble_arg_l (insn, *argtk++); 1694 continue; 1695 case 'n': 1696 pru_assemble_arg_n (insn, *argtk++); 1697 continue; 1698 case 'c': 1699 pru_assemble_arg_c (insn, *argtk++); 1700 continue; 1701 case 'w': 1702 pru_assemble_arg_w (insn, *argtk++); 1703 continue; 1704 case 'x': 1705 pru_assemble_arg_x (insn, *argtk++); 1706 continue; 1707 1708 case 'E': 1709 pru_check_assembly (insn->insn_code, *argtk++); 1710 continue; 1711 1712 default: 1713 BAD_CASE (*argp); 1714 } 1715 } 1716 1717 if (*argp && !had_errors ()) 1718 as_bad (_("missing argument")); 1719 1720 if (!had_errors ()) 1721 { 1722 if (insn->insn_pru_opcode->pinfo & PRU_INSN_LDI32) 1723 { 1724 output_insn_ldi32 (insn); 1725 } 1726 else 1727 { 1728 output_insn (insn); 1729 } 1730 } 1731 1732 if (pru_mode == PRU_MODE_TEST) 1733 free ((char *)argsfmt); 1734 } 1735 else 1736 /* Unrecognised instruction - error. */ 1737 as_bad (_("unrecognised instruction %s"), insn->insn_tokens[0]); 1738 1739 /* Don't leak memory. */ 1740 pru_insn_reloc_destroy (insn->insn_reloc); 1741 free (op_strdup); 1742 } 1743 1744 /* Round up section size. */ 1745 valueT 1746 md_section_align (asection *seg, valueT addr) 1747 { 1748 int align = bfd_get_section_alignment (stdoutput, seg); 1749 return ((addr + (1 << align) - 1) & (-((valueT) 1 << align))); 1750 } 1751 1752 /* Implement tc_fix_adjustable. */ 1753 int 1754 pru_fix_adjustable (fixS *fixp) 1755 { 1756 if (fixp->fx_addsy == NULL) 1757 return 1; 1758 1759 /* Prevent all adjustments to global symbols. */ 1760 if (OUTPUT_FLAVOR == bfd_target_elf_flavour 1761 && (S_IS_EXTERNAL (fixp->fx_addsy) || S_IS_WEAK (fixp->fx_addsy))) 1762 return 0; 1763 1764 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT 1765 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY) 1766 return 0; 1767 1768 /* Preserve relocations against symbols with function type. */ 1769 if (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION) 1770 return 0; 1771 1772 return 1; 1773 } 1774 1775 /* The function tc_gen_reloc creates a relocation structure for the 1776 fixup fixp, and returns a pointer to it. This structure is passed 1777 to bfd_install_relocation so that it can be written to the object 1778 file for linking. */ 1779 arelent * 1780 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp) 1781 { 1782 arelent *reloc = XNEW (arelent); 1783 reloc->sym_ptr_ptr = XNEW (asymbol *); 1784 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); 1785 1786 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; 1787 reloc->addend = fixp->fx_offset; /* fixp->fx_addnumber; */ 1788 1789 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type); 1790 if (reloc->howto == NULL) 1791 { 1792 as_bad_where (fixp->fx_file, fixp->fx_line, 1793 _("can't represent relocation type %s"), 1794 bfd_get_reloc_code_name (fixp->fx_r_type)); 1795 1796 /* Set howto to a garbage value so that we can keep going. */ 1797 reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32); 1798 gas_assert (reloc->howto != NULL); 1799 } 1800 return reloc; 1801 } 1802 1803 long 1804 md_pcrel_from (fixS *fixP ATTRIBUTE_UNUSED) 1805 { 1806 return fixP->fx_where + fixP->fx_frag->fr_address; 1807 } 1808 1809 /* Called just before the assembler exits. */ 1810 void 1811 md_end (void) 1812 { 1813 hash_die (pru_opcode_hash); 1814 hash_die (pru_reg_hash); 1815 } 1816 1817 symbolS * 1818 md_undefined_symbol (char *name ATTRIBUTE_UNUSED) 1819 { 1820 return NULL; 1821 } 1822 1823 /* Implement tc_frob_label. */ 1824 void 1825 pru_frob_label (symbolS *lab) 1826 { 1827 /* Emit dwarf information. */ 1828 dwarf2_emit_label (lab); 1829 1830 /* Update the label's address with the current output pointer. */ 1831 symbol_set_frag (lab, frag_now); 1832 S_SET_VALUE (lab, (valueT) frag_now_fix ()); 1833 1834 /* Record this label for future adjustment after we find out what 1835 kind of data it references, and the required alignment therewith. */ 1836 pru_last_label = lab; 1837 1838 if (pru_opt.warn_regname_label && pru_reg_lookup (S_GET_NAME (lab))) 1839 as_warn (_("Label \"%s\" matches a CPU register name"), S_GET_NAME (lab)); 1840 } 1841 1842 static inline char * 1843 skip_space (char *s) 1844 { 1845 while (*s == ' ' || *s == '\t') 1846 ++s; 1847 return s; 1848 } 1849 1850 /* Parse special CONS expression: pmem (expression). Idea from AVR. 1851 1852 Used to catch and mark code (program memory) in constant expression 1853 relocations. Return non-zero for program memory. */ 1854 1855 int 1856 pru_parse_cons_expression (expressionS *exp, int nbytes) 1857 { 1858 int is_pmem = FALSE; 1859 char *tmp; 1860 1861 tmp = input_line_pointer = skip_space (input_line_pointer); 1862 1863 if (nbytes == 4 || nbytes == 2) 1864 { 1865 const char *pmem_str = "%pmem"; 1866 int len = strlen (pmem_str); 1867 1868 if (strncasecmp (input_line_pointer, pmem_str, len) == 0) 1869 { 1870 input_line_pointer = skip_space (input_line_pointer + len); 1871 1872 if (*input_line_pointer == '(') 1873 { 1874 input_line_pointer = skip_space (input_line_pointer + 1); 1875 is_pmem = TRUE; 1876 expression (exp); 1877 1878 if (*input_line_pointer == ')') 1879 ++input_line_pointer; 1880 else 1881 { 1882 as_bad (_("`)' required")); 1883 is_pmem = FALSE; 1884 } 1885 1886 return is_pmem; 1887 } 1888 1889 input_line_pointer = tmp; 1890 } 1891 } 1892 1893 expression (exp); 1894 1895 return is_pmem; 1896 } 1897 1898 /* Implement TC_CONS_FIX_NEW. */ 1899 void 1900 pru_cons_fix_new (fragS *frag, int where, unsigned int nbytes, 1901 expressionS *exp, const int is_pmem) 1902 { 1903 bfd_reloc_code_real_type r; 1904 1905 switch (nbytes | (!!is_pmem << 8)) 1906 { 1907 case 1 | (0 << 8): r = BFD_RELOC_8; break; 1908 case 2 | (0 << 8): r = BFD_RELOC_16; break; 1909 case 4 | (0 << 8): r = BFD_RELOC_32; break; 1910 case 8 | (0 << 8): r = BFD_RELOC_64; break; 1911 case 2 | (1 << 8): r = BFD_RELOC_PRU_16_PMEM; break; 1912 case 4 | (1 << 8): r = BFD_RELOC_PRU_32_PMEM; break; 1913 default: 1914 as_bad (_("illegal %s relocation size: %d"), 1915 is_pmem ? "text" : "data", nbytes); 1916 return; 1917 } 1918 1919 fix_new_exp (frag, where, (int) nbytes, exp, 0, r); 1920 } 1921 1922 /* Implement tc_regname_to_dw2regnum, to convert REGNAME to a DWARF-2 1923 register number. */ 1924 int 1925 pru_regname_to_dw2regnum (char *regname) 1926 { 1927 struct pru_reg *r = pru_reg_lookup (regname); 1928 if (r == NULL) 1929 return -1; 1930 return r->index; 1931 } 1932 1933 /* Implement tc_cfi_frame_initial_instructions, to initialize the DWARF-2 1934 unwind information for this procedure. */ 1935 void 1936 pru_frame_initial_instructions (void) 1937 { 1938 const unsigned fp_regno = 4; 1939 cfi_add_CFA_def_cfa (fp_regno, 0); 1940 } 1941 1942 bfd_boolean 1943 pru_allow_local_subtract (expressionS * left, 1944 expressionS * right, 1945 segT section) 1946 { 1947 /* If we are not in relaxation mode, subtraction is OK. */ 1948 if (!linkrelax) 1949 return TRUE; 1950 1951 /* If the symbols are not in a code section then they are OK. */ 1952 if ((section->flags & SEC_CODE) == 0) 1953 return TRUE; 1954 1955 if (left->X_add_symbol == right->X_add_symbol) 1956 return TRUE; 1957 1958 /* We have to assume that there may be instructions between the 1959 two symbols and that relaxation may increase the distance between 1960 them. */ 1961 return FALSE; 1962 } 1963