1 1.1 christos /* tc-sh.c -- Assemble code for the Renesas / SuperH SH 2 1.10 christos Copyright (C) 1993-2025 Free Software Foundation, Inc. 3 1.1 christos 4 1.1 christos This file is part of GAS, the GNU Assembler. 5 1.1 christos 6 1.1 christos GAS is free software; you can redistribute it and/or modify 7 1.1 christos it under the terms of the GNU General Public License as published by 8 1.1 christos the Free Software Foundation; either version 3, or (at your option) 9 1.1 christos any later version. 10 1.1 christos 11 1.1 christos GAS is distributed in the hope that it will be useful, 12 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of 13 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 1.1 christos GNU General Public License for more details. 15 1.1 christos 16 1.1 christos You should have received a copy of the GNU General Public License 17 1.1 christos along with GAS; see the file COPYING. If not, write to 18 1.1 christos the Free Software Foundation, 51 Franklin Street - Fifth Floor, 19 1.1 christos Boston, MA 02110-1301, USA. */ 20 1.1 christos 21 1.1 christos /* Written By Steve Chamberlain <sac (at) cygnus.com> */ 22 1.1 christos 23 1.1 christos #include "as.h" 24 1.1 christos #include "subsegs.h" 25 1.1 christos #define DEFINE_TABLE 26 1.1 christos #include "opcodes/sh-opc.h" 27 1.1 christos #include "safe-ctype.h" 28 1.1 christos 29 1.1 christos #ifdef OBJ_ELF 30 1.1 christos #include "elf/sh.h" 31 1.1 christos #endif 32 1.1 christos 33 1.1 christos #include "dwarf2dbg.h" 34 1.1 christos #include "dw2gencfi.h" 35 1.1 christos 36 1.1 christos typedef struct 37 1.1 christos { 38 1.1 christos sh_arg_type type; 39 1.1 christos int reg; 40 1.1 christos expressionS immediate; 41 1.1 christos } 42 1.1 christos sh_operand_info; 43 1.1 christos 44 1.1 christos const char comment_chars[] = "!"; 45 1.1 christos const char line_separator_chars[] = ";"; 46 1.1 christos const char line_comment_chars[] = "!#"; 47 1.1 christos 48 1.1 christos static void s_uses (int); 49 1.1 christos static void s_uacons (int); 50 1.1 christos 51 1.1 christos #ifdef OBJ_ELF 52 1.1 christos static void sh_elf_cons (int); 53 1.1 christos 54 1.1 christos symbolS *GOT_symbol; /* Pre-defined "_GLOBAL_OFFSET_TABLE_" */ 55 1.1 christos #endif 56 1.1 christos 57 1.1 christos static void 58 1.1 christos big (int ignore ATTRIBUTE_UNUSED) 59 1.1 christos { 60 1.1 christos if (! target_big_endian) 61 1.1 christos as_bad (_("directive .big encountered when option -big required")); 62 1.1 christos 63 1.1 christos /* Stop further messages. */ 64 1.1 christos target_big_endian = 1; 65 1.1 christos } 66 1.1 christos 67 1.1 christos static void 68 1.1 christos little (int ignore ATTRIBUTE_UNUSED) 69 1.1 christos { 70 1.1 christos if (target_big_endian) 71 1.1 christos as_bad (_("directive .little encountered when option -little required")); 72 1.1 christos 73 1.1 christos /* Stop further messages. */ 74 1.1 christos target_big_endian = 0; 75 1.1 christos } 76 1.1 christos 77 1.1 christos /* This table describes all the machine specific pseudo-ops the assembler 78 1.1 christos has to support. The fields are: 79 1.1 christos pseudo-op name without dot 80 1.1 christos function to call to execute this pseudo-op 81 1.1 christos Integer arg to pass to the function. */ 82 1.1 christos 83 1.1 christos const pseudo_typeS md_pseudo_table[] = 84 1.1 christos { 85 1.1 christos #ifdef OBJ_ELF 86 1.1 christos {"long", sh_elf_cons, 4}, 87 1.1 christos {"int", sh_elf_cons, 4}, 88 1.1 christos {"word", sh_elf_cons, 2}, 89 1.1 christos {"short", sh_elf_cons, 2}, 90 1.1 christos #else 91 1.1 christos {"int", cons, 4}, 92 1.1 christos {"word", cons, 2}, 93 1.1 christos #endif /* OBJ_ELF */ 94 1.1 christos {"big", big, 0}, 95 1.1 christos {"form", listing_psize, 0}, 96 1.1 christos {"little", little, 0}, 97 1.1 christos {"heading", listing_title, 0}, 98 1.1 christos {"import", s_ignore, 0}, 99 1.1 christos {"page", listing_eject, 0}, 100 1.1 christos {"program", s_ignore, 0}, 101 1.1 christos {"uses", s_uses, 0}, 102 1.1 christos {"uaword", s_uacons, 2}, 103 1.1 christos {"ualong", s_uacons, 4}, 104 1.1 christos {"uaquad", s_uacons, 8}, 105 1.1 christos {"2byte", s_uacons, 2}, 106 1.1 christos {"4byte", s_uacons, 4}, 107 1.1 christos {"8byte", s_uacons, 8}, 108 1.1 christos {0, 0, 0} 109 1.1 christos }; 110 1.1 christos 111 1.1 christos int sh_relax; /* set if -relax seen */ 112 1.1 christos 113 1.1 christos /* Whether -small was seen. */ 114 1.1 christos 115 1.1 christos int sh_small; 116 1.1 christos 117 1.1 christos /* Flag to generate relocations against symbol values for local symbols. */ 118 1.1 christos 119 1.1 christos static int dont_adjust_reloc_32; 120 1.1 christos 121 1.1 christos /* Flag to indicate that '$' is allowed as a register prefix. */ 122 1.1 christos 123 1.1 christos static int allow_dollar_register_prefix; 124 1.1 christos 125 1.1 christos /* Preset architecture set, if given; zero otherwise. */ 126 1.1 christos 127 1.1 christos static unsigned int preset_target_arch; 128 1.1 christos 129 1.1 christos /* The bit mask of architectures that could 130 1.1 christos accommodate the insns seen so far. */ 131 1.1 christos static unsigned int valid_arch; 132 1.1 christos 133 1.1 christos #ifdef OBJ_ELF 134 1.1 christos /* Whether --fdpic was given. */ 135 1.1 christos static int sh_fdpic; 136 1.1 christos #endif 137 1.1 christos 138 1.1 christos const char EXP_CHARS[] = "eE"; 139 1.1 christos 140 1.1 christos /* Chars that mean this number is a floating point constant. */ 141 1.1 christos /* As in 0f12.456 */ 142 1.1 christos /* or 0d1.2345e12 */ 143 1.1 christos const char FLT_CHARS[] = "rRsSfFdDxXpP"; 144 1.1 christos 145 1.1 christos #define C(a,b) ENCODE_RELAX(a,b) 146 1.1 christos 147 1.1 christos #define ENCODE_RELAX(what,length) (((what) << 4) + (length)) 148 1.1 christos #define GET_WHAT(x) ((x>>4)) 149 1.1 christos 150 1.1 christos /* These are the three types of relaxable instruction. */ 151 1.1 christos /* These are the types of relaxable instructions; except for END which is 152 1.1 christos a marker. */ 153 1.1 christos #define COND_JUMP 1 154 1.1 christos #define COND_JUMP_DELAY 2 155 1.1 christos #define UNCOND_JUMP 3 156 1.1 christos 157 1.1 christos #define END 4 158 1.1 christos 159 1.1 christos #define UNDEF_DISP 0 160 1.1 christos #define COND8 1 161 1.1 christos #define COND12 2 162 1.1 christos #define COND32 3 163 1.1 christos #define UNDEF_WORD_DISP 4 164 1.1 christos 165 1.1 christos #define UNCOND12 1 166 1.1 christos #define UNCOND32 2 167 1.1 christos 168 1.1 christos /* Branch displacements are from the address of the branch plus 169 1.1 christos four, thus all minimum and maximum values have 4 added to them. */ 170 1.1 christos #define COND8_F 258 171 1.1 christos #define COND8_M -252 172 1.1 christos #define COND8_LENGTH 2 173 1.1 christos 174 1.1 christos /* There is one extra instruction before the branch, so we must add 175 1.1 christos two more bytes to account for it. */ 176 1.1 christos #define COND12_F 4100 177 1.1 christos #define COND12_M -4090 178 1.1 christos #define COND12_LENGTH 6 179 1.1 christos 180 1.1 christos #define COND12_DELAY_LENGTH 4 181 1.1 christos 182 1.1 christos /* ??? The minimum and maximum values are wrong, but this does not matter 183 1.1 christos since this relocation type is not supported yet. */ 184 1.1 christos #define COND32_F (1<<30) 185 1.1 christos #define COND32_M -(1<<30) 186 1.1 christos #define COND32_LENGTH 14 187 1.1 christos 188 1.1 christos #define UNCOND12_F 4098 189 1.1 christos #define UNCOND12_M -4092 190 1.1 christos #define UNCOND12_LENGTH 2 191 1.1 christos 192 1.1 christos /* ??? The minimum and maximum values are wrong, but this does not matter 193 1.1 christos since this relocation type is not supported yet. */ 194 1.1 christos #define UNCOND32_F (1<<30) 195 1.1 christos #define UNCOND32_M -(1<<30) 196 1.1 christos #define UNCOND32_LENGTH 14 197 1.1 christos 198 1.1 christos #define EMPTY { 0, 0, 0, 0 } 199 1.1 christos 200 1.1 christos const relax_typeS md_relax_table[C (END, 0)] = { 201 1.1 christos EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, 202 1.1 christos EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, 203 1.1 christos 204 1.1 christos EMPTY, 205 1.1 christos /* C (COND_JUMP, COND8) */ 206 1.1 christos { COND8_F, COND8_M, COND8_LENGTH, C (COND_JUMP, COND12) }, 207 1.1 christos /* C (COND_JUMP, COND12) */ 208 1.1 christos { COND12_F, COND12_M, COND12_LENGTH, C (COND_JUMP, COND32), }, 209 1.1 christos /* C (COND_JUMP, COND32) */ 210 1.1 christos { COND32_F, COND32_M, COND32_LENGTH, 0, }, 211 1.1 christos /* C (COND_JUMP, UNDEF_WORD_DISP) */ 212 1.1 christos { 0, 0, COND32_LENGTH, 0, }, 213 1.1 christos EMPTY, EMPTY, EMPTY, 214 1.1 christos EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, 215 1.1 christos 216 1.1 christos EMPTY, 217 1.1 christos /* C (COND_JUMP_DELAY, COND8) */ 218 1.1 christos { COND8_F, COND8_M, COND8_LENGTH, C (COND_JUMP_DELAY, COND12) }, 219 1.1 christos /* C (COND_JUMP_DELAY, COND12) */ 220 1.1 christos { COND12_F, COND12_M, COND12_DELAY_LENGTH, C (COND_JUMP_DELAY, COND32), }, 221 1.1 christos /* C (COND_JUMP_DELAY, COND32) */ 222 1.1 christos { COND32_F, COND32_M, COND32_LENGTH, 0, }, 223 1.1 christos /* C (COND_JUMP_DELAY, UNDEF_WORD_DISP) */ 224 1.1 christos { 0, 0, COND32_LENGTH, 0, }, 225 1.1 christos EMPTY, EMPTY, EMPTY, 226 1.1 christos EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, 227 1.1 christos 228 1.1 christos EMPTY, 229 1.1 christos /* C (UNCOND_JUMP, UNCOND12) */ 230 1.1 christos { UNCOND12_F, UNCOND12_M, UNCOND12_LENGTH, C (UNCOND_JUMP, UNCOND32), }, 231 1.1 christos /* C (UNCOND_JUMP, UNCOND32) */ 232 1.1 christos { UNCOND32_F, UNCOND32_M, UNCOND32_LENGTH, 0, }, 233 1.1 christos EMPTY, 234 1.1 christos /* C (UNCOND_JUMP, UNDEF_WORD_DISP) */ 235 1.1 christos { 0, 0, UNCOND32_LENGTH, 0, }, 236 1.1 christos EMPTY, EMPTY, EMPTY, 237 1.1 christos EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, 238 1.1 christos 239 1.1 christos }; 240 1.1 christos 241 1.1 christos #undef EMPTY 242 1.1 christos 243 1.8 christos static htab_t opcode_hash_control; /* Opcode mnemonics */ 244 1.1 christos 245 1.1 christos 246 1.1 christos #ifdef OBJ_ELF 248 1.1 christos /* Determine whether the symbol needs any kind of PIC relocation. */ 249 1.1 christos 250 1.1 christos inline static int 251 1.1 christos sh_PIC_related_p (symbolS *sym) 252 1.1 christos { 253 1.1 christos expressionS *exp; 254 1.1 christos 255 1.1 christos if (! sym) 256 1.1 christos return 0; 257 1.1 christos 258 1.1 christos if (sym == GOT_symbol) 259 1.1 christos return 1; 260 1.1 christos 261 1.1 christos exp = symbol_get_value_expression (sym); 262 1.1 christos 263 1.1 christos return (exp->X_op == O_PIC_reloc 264 1.1 christos || sh_PIC_related_p (exp->X_add_symbol) 265 1.1 christos || sh_PIC_related_p (exp->X_op_symbol)); 266 1.1 christos } 267 1.1 christos 268 1.1 christos /* Determine the relocation type to be used to represent the 269 1.1 christos expression, that may be rearranged. */ 270 1.1 christos 271 1.1 christos static int 272 1.1 christos sh_check_fixup (expressionS *main_exp, bfd_reloc_code_real_type *r_type_p) 273 1.1 christos { 274 1.1 christos expressionS *exp = main_exp; 275 1.1 christos 276 1.1 christos /* This is here for backward-compatibility only. GCC used to generated: 277 1.1 christos 278 1.1 christos f@PLT + . - (.LPCS# + 2) 279 1.1 christos 280 1.1 christos but we'd rather be able to handle this as a PIC-related reference 281 1.1 christos plus/minus a symbol. However, gas' parser gives us: 282 1.1 christos 283 1.1 christos O_subtract (O_add (f@PLT, .), .LPCS#+2) 284 1.1 christos 285 1.1 christos so we attempt to transform this into: 286 1.1 christos 287 1.1 christos O_subtract (f@PLT, O_subtract (.LPCS#+2, .)) 288 1.1 christos 289 1.1 christos which we can handle simply below. */ 290 1.1 christos if (exp->X_op == O_subtract) 291 1.1 christos { 292 1.1 christos if (sh_PIC_related_p (exp->X_op_symbol)) 293 1.1 christos return 1; 294 1.1 christos 295 1.1 christos exp = symbol_get_value_expression (exp->X_add_symbol); 296 1.1 christos 297 1.1 christos if (exp && sh_PIC_related_p (exp->X_op_symbol)) 298 1.1 christos return 1; 299 1.1 christos 300 1.1 christos if (exp && exp->X_op == O_add 301 1.1 christos && sh_PIC_related_p (exp->X_add_symbol)) 302 1.1 christos { 303 1.1 christos symbolS *sym = exp->X_add_symbol; 304 1.1 christos 305 1.1 christos exp->X_op = O_subtract; 306 1.1 christos exp->X_add_symbol = main_exp->X_op_symbol; 307 1.1 christos 308 1.1 christos main_exp->X_op_symbol = main_exp->X_add_symbol; 309 1.1 christos main_exp->X_add_symbol = sym; 310 1.1 christos 311 1.1 christos main_exp->X_add_number += exp->X_add_number; 312 1.1 christos exp->X_add_number = 0; 313 1.1 christos } 314 1.1 christos 315 1.1 christos exp = main_exp; 316 1.1 christos } 317 1.1 christos else if (exp->X_op == O_add && sh_PIC_related_p (exp->X_op_symbol)) 318 1.1 christos return 1; 319 1.1 christos 320 1.1 christos if (exp->X_op == O_symbol || exp->X_op == O_add || exp->X_op == O_subtract) 321 1.1 christos { 322 1.1 christos if (exp->X_add_symbol && exp->X_add_symbol == GOT_symbol) 323 1.1 christos { 324 1.1 christos *r_type_p = BFD_RELOC_SH_GOTPC; 325 1.1 christos return 0; 326 1.1 christos } 327 1.1 christos exp = symbol_get_value_expression (exp->X_add_symbol); 328 1.1 christos if (! exp) 329 1.1 christos return 0; 330 1.1 christos } 331 1.1 christos 332 1.1 christos if (exp->X_op == O_PIC_reloc) 333 1.1 christos { 334 1.1 christos switch (*r_type_p) 335 1.1 christos { 336 1.1 christos case BFD_RELOC_NONE: 337 1.1 christos case BFD_RELOC_UNUSED: 338 1.1 christos *r_type_p = exp->X_md; 339 1.1 christos break; 340 1.1 christos 341 1.1 christos case BFD_RELOC_SH_DISP20: 342 1.1 christos switch (exp->X_md) 343 1.1 christos { 344 1.1 christos case BFD_RELOC_32_GOT_PCREL: 345 1.1 christos *r_type_p = BFD_RELOC_SH_GOT20; 346 1.1 christos break; 347 1.1 christos 348 1.1 christos case BFD_RELOC_32_GOTOFF: 349 1.1 christos *r_type_p = BFD_RELOC_SH_GOTOFF20; 350 1.1 christos break; 351 1.1 christos 352 1.1 christos case BFD_RELOC_SH_GOTFUNCDESC: 353 1.1 christos *r_type_p = BFD_RELOC_SH_GOTFUNCDESC20; 354 1.1 christos break; 355 1.1 christos 356 1.1 christos case BFD_RELOC_SH_GOTOFFFUNCDESC: 357 1.1 christos *r_type_p = BFD_RELOC_SH_GOTOFFFUNCDESC20; 358 1.1 christos break; 359 1.1 christos 360 1.1 christos default: 361 1.1 christos abort (); 362 1.1 christos } 363 1.1 christos break; 364 1.1 christos 365 1.1 christos default: 366 1.1 christos abort (); 367 1.1 christos } 368 1.1 christos if (exp == main_exp) 369 1.1 christos exp->X_op = O_symbol; 370 1.1 christos else 371 1.1 christos { 372 1.1 christos main_exp->X_add_symbol = exp->X_add_symbol; 373 1.1 christos main_exp->X_add_number += exp->X_add_number; 374 1.1 christos } 375 1.1 christos } 376 1.1 christos else 377 1.1 christos return (sh_PIC_related_p (exp->X_add_symbol) 378 1.1 christos || sh_PIC_related_p (exp->X_op_symbol)); 379 1.1 christos 380 1.1 christos return 0; 381 1.1 christos } 382 1.1 christos 383 1.1 christos /* Add expression EXP of SIZE bytes to offset OFF of fragment FRAG. */ 384 1.1 christos 385 1.3 christos void 386 1.3 christos sh_cons_fix_new (fragS *frag, int off, int size, expressionS *exp, 387 1.1 christos bfd_reloc_code_real_type r_type) 388 1.3 christos { 389 1.1 christos r_type = BFD_RELOC_UNUSED; 390 1.1 christos 391 1.1 christos if (sh_check_fixup (exp, &r_type)) 392 1.1 christos as_bad (_("Invalid PIC expression.")); 393 1.1 christos 394 1.1 christos if (r_type == BFD_RELOC_UNUSED) 395 1.1 christos switch (size) 396 1.1 christos { 397 1.1 christos case 1: 398 1.1 christos r_type = BFD_RELOC_8; 399 1.1 christos break; 400 1.1 christos 401 1.1 christos case 2: 402 1.1 christos r_type = BFD_RELOC_16; 403 1.1 christos break; 404 1.1 christos 405 1.1 christos case 4: 406 1.1 christos r_type = BFD_RELOC_32; 407 1.1 christos break; 408 1.1 christos 409 1.1 christos case 8: 410 1.1 christos r_type = BFD_RELOC_64; 411 1.1 christos break; 412 1.1 christos 413 1.1 christos default: 414 1.1 christos goto error; 415 1.1 christos } 416 1.1 christos else if (size != 4) 417 1.1 christos { 418 1.1 christos error: 419 1.1 christos as_bad (_("unsupported BFD relocation size %u"), size); 420 1.1 christos r_type = BFD_RELOC_UNUSED; 421 1.1 christos } 422 1.1 christos 423 1.1 christos fix_new_exp (frag, off, size, exp, 0, r_type); 424 1.1 christos } 425 1.1 christos 426 1.1 christos /* The regular cons() function, that reads constants, doesn't support 427 1.1 christos suffixes such as @GOT, @GOTOFF and @PLT, that generate 428 1.1 christos machine-specific relocation types. So we must define it here. */ 429 1.1 christos /* Clobbers input_line_pointer, checks end-of-line. */ 430 1.1 christos /* NBYTES 1=.byte, 2=.word, 4=.long */ 431 1.3 christos static void 432 1.1 christos sh_elf_cons (int nbytes) 433 1.1 christos { 434 1.1 christos expressionS exp; 435 1.1 christos 436 1.1 christos if (is_it_end_of_statement ()) 437 1.1 christos { 438 1.1 christos demand_empty_rest_of_line (); 439 1.1 christos return; 440 1.1 christos } 441 1.1 christos 442 1.1 christos #ifdef md_cons_align 443 1.1 christos md_cons_align (nbytes); 444 1.1 christos #endif 445 1.1 christos 446 1.1 christos do 447 1.1 christos { 448 1.10 christos expression (&exp); 449 1.1 christos emit_expr (&exp, nbytes); 450 1.1 christos } 451 1.1 christos while (*input_line_pointer++ == ','); 452 1.1 christos 453 1.1 christos input_line_pointer--; /* Put terminator back into stream. */ 454 1.1 christos if (*input_line_pointer == '#' || *input_line_pointer == '!') 455 1.10 christos { 456 1.1 christos while (! is_end_of_stmt (*input_line_pointer++)); 457 1.1 christos } 458 1.1 christos else 459 1.1 christos demand_empty_rest_of_line (); 460 1.1 christos } 461 1.1 christos 462 1.1 christos /* The regular frag_offset_fixed_p doesn't work for rs_align_test 463 1.1 christos frags. */ 464 1.8 christos 465 1.1 christos static bool 466 1.1 christos align_test_frag_offset_fixed_p (const fragS *frag1, const fragS *frag2, 467 1.1 christos bfd_vma *offset) 468 1.1 christos { 469 1.1 christos const fragS *frag; 470 1.1 christos bfd_vma off; 471 1.1 christos 472 1.1 christos /* Start with offset initialised to difference between the two frags. 473 1.1 christos Prior to assigning frag addresses this will be zero. */ 474 1.1 christos off = frag1->fr_address - frag2->fr_address; 475 1.1 christos if (frag1 == frag2) 476 1.1 christos { 477 1.8 christos *offset = off; 478 1.1 christos return true; 479 1.1 christos } 480 1.1 christos 481 1.1 christos /* Maybe frag2 is after frag1. */ 482 1.1 christos frag = frag1; 483 1.1 christos while (frag->fr_type == rs_fill 484 1.1 christos || frag->fr_type == rs_align_test) 485 1.1 christos { 486 1.1 christos if (frag->fr_type == rs_fill) 487 1.1 christos off += frag->fr_fix + frag->fr_offset * frag->fr_var; 488 1.1 christos else 489 1.1 christos off += frag->fr_fix; 490 1.1 christos frag = frag->fr_next; 491 1.1 christos if (frag == NULL) 492 1.1 christos break; 493 1.1 christos if (frag == frag2) 494 1.1 christos { 495 1.8 christos *offset = off; 496 1.1 christos return true; 497 1.1 christos } 498 1.1 christos } 499 1.1 christos 500 1.1 christos /* Maybe frag1 is after frag2. */ 501 1.1 christos off = frag1->fr_address - frag2->fr_address; 502 1.1 christos frag = frag2; 503 1.1 christos while (frag->fr_type == rs_fill 504 1.1 christos || frag->fr_type == rs_align_test) 505 1.1 christos { 506 1.1 christos if (frag->fr_type == rs_fill) 507 1.1 christos off -= frag->fr_fix + frag->fr_offset * frag->fr_var; 508 1.1 christos else 509 1.1 christos off -= frag->fr_fix; 510 1.1 christos frag = frag->fr_next; 511 1.1 christos if (frag == NULL) 512 1.1 christos break; 513 1.1 christos if (frag == frag1) 514 1.1 christos { 515 1.8 christos *offset = off; 516 1.1 christos return true; 517 1.1 christos } 518 1.1 christos } 519 1.8 christos 520 1.1 christos return false; 521 1.1 christos } 522 1.1 christos 523 1.1 christos /* Optimize a difference of symbols which have rs_align_test frag if 524 1.1 christos possible. */ 525 1.1 christos 526 1.1 christos int 527 1.1 christos sh_optimize_expr (expressionS *l, operatorT op, expressionS *r) 528 1.1 christos { 529 1.1 christos bfd_vma frag_off; 530 1.1 christos 531 1.1 christos if (op == O_subtract 532 1.1 christos && l->X_op == O_symbol 533 1.1 christos && r->X_op == O_symbol 534 1.1 christos && S_GET_SEGMENT (l->X_add_symbol) == S_GET_SEGMENT (r->X_add_symbol) 535 1.1 christos && (SEG_NORMAL (S_GET_SEGMENT (l->X_add_symbol)) 536 1.1 christos || r->X_add_symbol == l->X_add_symbol) 537 1.1 christos && align_test_frag_offset_fixed_p (symbol_get_frag (l->X_add_symbol), 538 1.1 christos symbol_get_frag (r->X_add_symbol), 539 1.1 christos &frag_off)) 540 1.3 christos { 541 1.3 christos offsetT symval_diff = S_GET_VALUE (l->X_add_symbol) 542 1.3 christos - S_GET_VALUE (r->X_add_symbol); 543 1.3 christos subtract_from_result (l, r->X_add_number, r->X_extrabit); 544 1.3 christos subtract_from_result (l, frag_off / OCTETS_PER_BYTE, 0); 545 1.1 christos add_to_result (l, symval_diff, symval_diff < 0); 546 1.1 christos l->X_op = O_constant; 547 1.10 christos l->X_add_symbol = 0; 548 1.1 christos l->X_unsigned = 0; 549 1.1 christos return 1; 550 1.1 christos } 551 1.1 christos return 0; 552 1.1 christos } 553 1.1 christos #endif /* OBJ_ELF */ 554 1.1 christos 555 1.1 christos /* This function is called once, at assembler startup time. This should 557 1.1 christos set up all the tables, etc that the MD part of the assembler needs. */ 558 1.1 christos 559 1.1 christos void 560 1.1 christos md_begin (void) 561 1.5 christos { 562 1.1 christos const sh_opcode_info *opcode; 563 1.1 christos const char *prev_name = ""; 564 1.1 christos unsigned int target_arch; 565 1.1 christos 566 1.1 christos target_arch 567 1.1 christos = preset_target_arch ? preset_target_arch : arch_sh_up & ~arch_sh_has_dsp; 568 1.8 christos valid_arch = target_arch; 569 1.1 christos 570 1.1 christos opcode_hash_control = str_htab_create (); 571 1.1 christos 572 1.1 christos /* Insert unique names into hash table. */ 573 1.1 christos for (opcode = sh_table; opcode->name; opcode++) 574 1.1 christos { 575 1.1 christos if (strcmp (prev_name, opcode->name) != 0) 576 1.1 christos { 577 1.1 christos if (!SH_MERGE_ARCH_SET_VALID (opcode->arch, target_arch)) 578 1.8 christos continue; 579 1.1 christos prev_name = opcode->name; 580 1.1 christos str_hash_insert (opcode_hash_control, opcode->name, opcode, 0); 581 1.1 christos } 582 1.1 christos } 583 1.1 christos } 584 1.1 christos 585 1.1 christos static int reg_m; 586 1.1 christos static int reg_n; 587 1.1 christos static int reg_x, reg_y; 588 1.1 christos static int reg_efg; 589 1.1 christos static int reg_b; 590 1.1 christos 591 1.1 christos #define IDENT_CHAR(c) (ISALNUM (c) || (c) == '_') 592 1.1 christos 593 1.1 christos /* Try to parse a reg name. Return the number of chars consumed. */ 594 1.5 christos 595 1.1 christos static unsigned int 596 1.1 christos parse_reg_without_prefix (char *src, sh_arg_type *mode, int *reg) 597 1.1 christos { 598 1.1 christos char l0 = TOLOWER (src[0]); 599 1.1 christos char l1 = l0 ? TOLOWER (src[1]) : 0; 600 1.1 christos 601 1.1 christos /* We use ! IDENT_CHAR for the next character after the register name, to 602 1.1 christos make sure that we won't accidentally recognize a symbol name such as 603 1.1 christos 'sram' or sr_ram as being a reference to the register 'sr'. */ 604 1.1 christos 605 1.1 christos if (l0 == 'r') 606 1.1 christos { 607 1.1 christos if (l1 == '1') 608 1.10 christos { 609 1.1 christos if (src[2] >= '0' && src[2] <= '5' 610 1.1 christos && ! IDENT_CHAR (src[3])) 611 1.1 christos { 612 1.1 christos *mode = A_REG_N; 613 1.1 christos *reg = 10 + src[2] - '0'; 614 1.1 christos return 3; 615 1.1 christos } 616 1.10 christos } 617 1.1 christos if (l1 >= '0' && l1 <= '9' 618 1.1 christos && ! IDENT_CHAR (src[2])) 619 1.1 christos { 620 1.1 christos *mode = A_REG_N; 621 1.1 christos *reg = (l1 - '0'); 622 1.1 christos return 2; 623 1.10 christos } 624 1.1 christos if (l1 >= '0' && l1 <= '7' && strncasecmp (&src[2], "_bank", 5) == 0 625 1.1 christos && ! IDENT_CHAR (src[7])) 626 1.1 christos { 627 1.1 christos *mode = A_REG_B; 628 1.1 christos *reg = (l1 - '0'); 629 1.1 christos return 7; 630 1.10 christos } 631 1.1 christos 632 1.1 christos if (l1 == 'e' && ! IDENT_CHAR (src[2])) 633 1.1 christos { 634 1.1 christos *mode = A_RE; 635 1.10 christos return 2; 636 1.1 christos } 637 1.1 christos if (l1 == 's' && ! IDENT_CHAR (src[2])) 638 1.1 christos { 639 1.1 christos *mode = A_RS; 640 1.1 christos return 2; 641 1.1 christos } 642 1.1 christos } 643 1.1 christos 644 1.1 christos if (l0 == 'a') 645 1.1 christos { 646 1.10 christos if (l1 == '0') 647 1.1 christos { 648 1.1 christos if (! IDENT_CHAR (src[2])) 649 1.1 christos { 650 1.1 christos *mode = DSP_REG_N; 651 1.1 christos *reg = A_A0_NUM; 652 1.10 christos return 2; 653 1.1 christos } 654 1.1 christos if (TOLOWER (src[2]) == 'g' && ! IDENT_CHAR (src[3])) 655 1.1 christos { 656 1.1 christos *mode = DSP_REG_N; 657 1.1 christos *reg = A_A0G_NUM; 658 1.1 christos return 3; 659 1.1 christos } 660 1.1 christos } 661 1.10 christos if (l1 == '1') 662 1.1 christos { 663 1.1 christos if (! IDENT_CHAR (src[2])) 664 1.1 christos { 665 1.1 christos *mode = DSP_REG_N; 666 1.1 christos *reg = A_A1_NUM; 667 1.10 christos return 2; 668 1.1 christos } 669 1.1 christos if (TOLOWER (src[2]) == 'g' && ! IDENT_CHAR (src[3])) 670 1.1 christos { 671 1.1 christos *mode = DSP_REG_N; 672 1.1 christos *reg = A_A1G_NUM; 673 1.1 christos return 3; 674 1.1 christos } 675 1.1 christos } 676 1.10 christos 677 1.1 christos if (l1 == 'x' && src[2] >= '0' && src[2] <= '1' 678 1.1 christos && ! IDENT_CHAR (src[3])) 679 1.1 christos { 680 1.1 christos *mode = A_REG_N; 681 1.1 christos *reg = 4 + (l1 - '0'); 682 1.1 christos return 3; 683 1.10 christos } 684 1.1 christos if (l1 == 'y' && src[2] >= '0' && src[2] <= '1' 685 1.1 christos && ! IDENT_CHAR (src[3])) 686 1.1 christos { 687 1.1 christos *mode = A_REG_N; 688 1.1 christos *reg = 6 + (l1 - '0'); 689 1.1 christos return 3; 690 1.10 christos } 691 1.1 christos if (l1 == 's' && src[2] >= '0' && src[2] <= '3' 692 1.1 christos && ! IDENT_CHAR (src[3])) 693 1.1 christos { 694 1.1 christos int n = l1 - '0'; 695 1.1 christos 696 1.1 christos *mode = A_REG_N; 697 1.1 christos *reg = n | ((~n & 2) << 1); 698 1.1 christos return 3; 699 1.1 christos } 700 1.10 christos } 701 1.1 christos 702 1.1 christos if (l0 == 'i' && l1 && ! IDENT_CHAR (src[2])) 703 1.1 christos { 704 1.1 christos if (l1 == 's') 705 1.1 christos { 706 1.1 christos *mode = A_REG_N; 707 1.1 christos *reg = 8; 708 1.1 christos return 2; 709 1.1 christos } 710 1.1 christos if (l1 == 'x') 711 1.1 christos { 712 1.1 christos *mode = A_REG_N; 713 1.1 christos *reg = 8; 714 1.1 christos return 2; 715 1.1 christos } 716 1.1 christos if (l1 == 'y') 717 1.1 christos { 718 1.1 christos *mode = A_REG_N; 719 1.1 christos *reg = 9; 720 1.1 christos return 2; 721 1.1 christos } 722 1.1 christos } 723 1.10 christos 724 1.1 christos if (l0 == 'x' && l1 >= '0' && l1 <= '1' 725 1.1 christos && ! IDENT_CHAR (src[2])) 726 1.1 christos { 727 1.1 christos *mode = DSP_REG_N; 728 1.1 christos *reg = A_X0_NUM + l1 - '0'; 729 1.1 christos return 2; 730 1.1 christos } 731 1.10 christos 732 1.1 christos if (l0 == 'y' && l1 >= '0' && l1 <= '1' 733 1.1 christos && ! IDENT_CHAR (src[2])) 734 1.1 christos { 735 1.1 christos *mode = DSP_REG_N; 736 1.1 christos *reg = A_Y0_NUM + l1 - '0'; 737 1.1 christos return 2; 738 1.1 christos } 739 1.10 christos 740 1.1 christos if (l0 == 'm' && l1 >= '0' && l1 <= '1' 741 1.1 christos && ! IDENT_CHAR (src[2])) 742 1.1 christos { 743 1.1 christos *mode = DSP_REG_N; 744 1.1 christos *reg = l1 == '0' ? A_M0_NUM : A_M1_NUM; 745 1.1 christos return 2; 746 1.1 christos } 747 1.1 christos 748 1.10 christos if (l0 == 's' 749 1.1 christos && l1 == 's' 750 1.1 christos && TOLOWER (src[2]) == 'r' && ! IDENT_CHAR (src[3])) 751 1.1 christos { 752 1.1 christos *mode = A_SSR; 753 1.1 christos return 3; 754 1.1 christos } 755 1.10 christos 756 1.1 christos if (l0 == 's' && l1 == 'p' && TOLOWER (src[2]) == 'c' 757 1.1 christos && ! IDENT_CHAR (src[3])) 758 1.1 christos { 759 1.1 christos *mode = A_SPC; 760 1.1 christos return 3; 761 1.1 christos } 762 1.10 christos 763 1.1 christos if (l0 == 's' && l1 == 'g' && TOLOWER (src[2]) == 'r' 764 1.1 christos && ! IDENT_CHAR (src[3])) 765 1.1 christos { 766 1.1 christos *mode = A_SGR; 767 1.1 christos return 3; 768 1.1 christos } 769 1.10 christos 770 1.1 christos if (l0 == 'd' && l1 == 's' && TOLOWER (src[2]) == 'r' 771 1.1 christos && ! IDENT_CHAR (src[3])) 772 1.1 christos { 773 1.1 christos *mode = A_DSR; 774 1.1 christos return 3; 775 1.1 christos } 776 1.10 christos 777 1.1 christos if (l0 == 'd' && l1 == 'b' && TOLOWER (src[2]) == 'r' 778 1.1 christos && ! IDENT_CHAR (src[3])) 779 1.1 christos { 780 1.1 christos *mode = A_DBR; 781 1.1 christos return 3; 782 1.10 christos } 783 1.1 christos 784 1.1 christos if (l0 == 's' && l1 == 'r' && ! IDENT_CHAR (src[2])) 785 1.1 christos { 786 1.1 christos *mode = A_SR; 787 1.1 christos return 2; 788 1.10 christos } 789 1.1 christos 790 1.1 christos if (l0 == 's' && l1 == 'p' && ! IDENT_CHAR (src[2])) 791 1.1 christos { 792 1.1 christos *mode = A_REG_N; 793 1.1 christos *reg = 15; 794 1.1 christos return 2; 795 1.10 christos } 796 1.1 christos 797 1.1 christos if (l0 == 'p' && l1 == 'r' && ! IDENT_CHAR (src[2])) 798 1.1 christos { 799 1.1 christos *mode = A_PR; 800 1.10 christos return 2; 801 1.1 christos } 802 1.1 christos if (l0 == 'p' && l1 == 'c' && ! IDENT_CHAR (src[2])) 803 1.1 christos { 804 1.1 christos /* Don't use A_DISP_PC here - that would accept stuff like 'mova pc,r0' 805 1.1 christos and use an uninitialized immediate. */ 806 1.1 christos *mode = A_PC; 807 1.1 christos return 2; 808 1.10 christos } 809 1.1 christos if (l0 == 'g' && l1 == 'b' && TOLOWER (src[2]) == 'r' 810 1.1 christos && ! IDENT_CHAR (src[3])) 811 1.1 christos { 812 1.1 christos *mode = A_GBR; 813 1.1 christos return 3; 814 1.10 christos } 815 1.1 christos if (l0 == 'v' && l1 == 'b' && TOLOWER (src[2]) == 'r' 816 1.1 christos && ! IDENT_CHAR (src[3])) 817 1.1 christos { 818 1.1 christos *mode = A_VBR; 819 1.1 christos return 3; 820 1.1 christos } 821 1.10 christos 822 1.1 christos if (l0 == 't' && l1 == 'b' && TOLOWER (src[2]) == 'r' 823 1.1 christos && ! IDENT_CHAR (src[3])) 824 1.1 christos { 825 1.1 christos *mode = A_TBR; 826 1.1 christos return 3; 827 1.10 christos } 828 1.1 christos if (l0 == 'm' && l1 == 'a' && TOLOWER (src[2]) == 'c' 829 1.1 christos && ! IDENT_CHAR (src[4])) 830 1.1 christos { 831 1.1 christos if (TOLOWER (src[3]) == 'l') 832 1.1 christos { 833 1.1 christos *mode = A_MACL; 834 1.1 christos return 4; 835 1.1 christos } 836 1.1 christos if (TOLOWER (src[3]) == 'h') 837 1.1 christos { 838 1.1 christos *mode = A_MACH; 839 1.1 christos return 4; 840 1.1 christos } 841 1.10 christos } 842 1.1 christos if (l0 == 'm' && l1 == 'o' && TOLOWER (src[2]) == 'd' 843 1.1 christos && ! IDENT_CHAR (src[3])) 844 1.1 christos { 845 1.1 christos *mode = A_MOD; 846 1.1 christos return 3; 847 1.1 christos } 848 1.1 christos if (l0 == 'f' && l1 == 'r') 849 1.1 christos { 850 1.1 christos if (src[2] == '1') 851 1.10 christos { 852 1.1 christos if (src[3] >= '0' && src[3] <= '5' 853 1.1 christos && ! IDENT_CHAR (src[4])) 854 1.1 christos { 855 1.1 christos *mode = F_REG_N; 856 1.1 christos *reg = 10 + src[3] - '0'; 857 1.1 christos return 4; 858 1.1 christos } 859 1.10 christos } 860 1.1 christos if (src[2] >= '0' && src[2] <= '9' 861 1.1 christos && ! IDENT_CHAR (src[3])) 862 1.1 christos { 863 1.1 christos *mode = F_REG_N; 864 1.1 christos *reg = (src[2] - '0'); 865 1.1 christos return 3; 866 1.1 christos } 867 1.1 christos } 868 1.1 christos if (l0 == 'd' && l1 == 'r') 869 1.1 christos { 870 1.1 christos if (src[2] == '1') 871 1.10 christos { 872 1.1 christos if (src[3] >= '0' && src[3] <= '4' && ! ((src[3] - '0') & 1) 873 1.1 christos && ! IDENT_CHAR (src[4])) 874 1.1 christos { 875 1.1 christos *mode = D_REG_N; 876 1.1 christos *reg = 10 + src[3] - '0'; 877 1.1 christos return 4; 878 1.1 christos } 879 1.10 christos } 880 1.1 christos if (src[2] >= '0' && src[2] <= '8' && ! ((src[2] - '0') & 1) 881 1.1 christos && ! IDENT_CHAR (src[3])) 882 1.1 christos { 883 1.1 christos *mode = D_REG_N; 884 1.1 christos *reg = (src[2] - '0'); 885 1.1 christos return 3; 886 1.1 christos } 887 1.1 christos } 888 1.1 christos if (l0 == 'x' && l1 == 'd') 889 1.1 christos { 890 1.1 christos if (src[2] == '1') 891 1.10 christos { 892 1.1 christos if (src[3] >= '0' && src[3] <= '4' && ! ((src[3] - '0') & 1) 893 1.1 christos && ! IDENT_CHAR (src[4])) 894 1.1 christos { 895 1.1 christos *mode = X_REG_N; 896 1.1 christos *reg = 11 + src[3] - '0'; 897 1.1 christos return 4; 898 1.1 christos } 899 1.10 christos } 900 1.1 christos if (src[2] >= '0' && src[2] <= '8' && ! ((src[2] - '0') & 1) 901 1.1 christos && ! IDENT_CHAR (src[3])) 902 1.1 christos { 903 1.1 christos *mode = X_REG_N; 904 1.1 christos *reg = (src[2] - '0') + 1; 905 1.1 christos return 3; 906 1.1 christos } 907 1.1 christos } 908 1.10 christos if (l0 == 'f' && l1 == 'v') 909 1.1 christos { 910 1.1 christos if (src[2] == '1'&& src[3] == '2' && ! IDENT_CHAR (src[4])) 911 1.1 christos { 912 1.1 christos *mode = V_REG_N; 913 1.1 christos *reg = 12; 914 1.1 christos return 4; 915 1.10 christos } 916 1.1 christos if ((src[2] == '0' || src[2] == '4' || src[2] == '8') 917 1.1 christos && ! IDENT_CHAR (src[3])) 918 1.1 christos { 919 1.1 christos *mode = V_REG_N; 920 1.1 christos *reg = (src[2] - '0'); 921 1.1 christos return 3; 922 1.1 christos } 923 1.1 christos } 924 1.10 christos if (l0 == 'f' && l1 == 'p' && TOLOWER (src[2]) == 'u' 925 1.1 christos && TOLOWER (src[3]) == 'l' 926 1.1 christos && ! IDENT_CHAR (src[4])) 927 1.1 christos { 928 1.1 christos *mode = FPUL_N; 929 1.1 christos return 4; 930 1.1 christos } 931 1.1 christos 932 1.10 christos if (l0 == 'f' && l1 == 'p' && TOLOWER (src[2]) == 's' 933 1.1 christos && TOLOWER (src[3]) == 'c' 934 1.1 christos && TOLOWER (src[4]) == 'r' && ! IDENT_CHAR (src[5])) 935 1.1 christos { 936 1.1 christos *mode = FPSCR_N; 937 1.1 christos return 5; 938 1.1 christos } 939 1.1 christos 940 1.10 christos if (l0 == 'x' && l1 == 'm' && TOLOWER (src[2]) == 't' 941 1.1 christos && TOLOWER (src[3]) == 'r' 942 1.1 christos && TOLOWER (src[4]) == 'x' && ! IDENT_CHAR (src[5])) 943 1.1 christos { 944 1.1 christos *mode = XMTRX_M4; 945 1.1 christos return 5; 946 1.1 christos } 947 1.1 christos 948 1.1 christos return 0; 949 1.1 christos } 950 1.1 christos 951 1.1 christos /* Like parse_reg_without_prefix, but this version supports 952 1.1 christos $-prefixed register names if enabled by the user. */ 953 1.5 christos 954 1.1 christos static unsigned int 955 1.1 christos parse_reg (char *src, sh_arg_type *mode, int *reg) 956 1.1 christos { 957 1.1 christos unsigned int prefix; 958 1.1 christos unsigned int consumed; 959 1.1 christos 960 1.1 christos if (src[0] == '$') 961 1.1 christos { 962 1.1 christos if (allow_dollar_register_prefix) 963 1.1 christos { 964 1.1 christos src ++; 965 1.1 christos prefix = 1; 966 1.1 christos } 967 1.1 christos else 968 1.1 christos return 0; 969 1.1 christos } 970 1.3 christos else 971 1.1 christos prefix = 0; 972 1.1 christos 973 1.1 christos consumed = parse_reg_without_prefix (src, mode, reg); 974 1.1 christos 975 1.1 christos if (consumed == 0) 976 1.1 christos return 0; 977 1.1 christos 978 1.1 christos return consumed + prefix; 979 1.1 christos } 980 1.1 christos 981 1.1 christos static char * 982 1.1 christos parse_exp (char *s, sh_operand_info *op) 983 1.1 christos { 984 1.1 christos char *save; 985 1.1 christos char *new_pointer; 986 1.1 christos 987 1.1 christos save = input_line_pointer; 988 1.1 christos input_line_pointer = s; 989 1.1 christos expression (&op->immediate); 990 1.1 christos if (op->immediate.X_op == O_absent) 991 1.1 christos as_bad (_("missing operand")); 992 1.1 christos new_pointer = input_line_pointer; 993 1.1 christos input_line_pointer = save; 994 1.1 christos return new_pointer; 995 1.1 christos } 996 1.1 christos 997 1.1 christos /* The many forms of operand: 998 1.1 christos 999 1.1 christos Rn Register direct 1000 1.1 christos @Rn Register indirect 1001 1.1 christos @Rn+ Autoincrement 1002 1.1 christos @-Rn Autodecrement 1003 1.1 christos @(disp:4,Rn) 1004 1.1 christos @(disp:8,GBR) 1005 1.1 christos @(disp:8,PC) 1006 1.1 christos 1007 1.1 christos @(R0,Rn) 1008 1.1 christos @(R0,GBR) 1009 1.1 christos 1010 1.1 christos disp:8 1011 1.1 christos disp:12 1012 1.1 christos #imm8 1013 1.1 christos pr, gbr, vbr, macl, mach 1014 1.1 christos */ 1015 1.1 christos 1016 1.1 christos static char * 1017 1.1 christos parse_at (char *src, sh_operand_info *op) 1018 1.5 christos { 1019 1.1 christos int len; 1020 1.1 christos sh_arg_type mode; 1021 1.1 christos src++; 1022 1.1 christos if (src[0] == '@') 1023 1.1 christos { 1024 1.1 christos src = parse_at (src, op); 1025 1.1 christos if (op->type == A_DISP_TBR) 1026 1.1 christos op->type = A_DISP2_TBR; 1027 1.1 christos else 1028 1.1 christos as_bad (_("illegal double indirection")); 1029 1.1 christos } 1030 1.1 christos else if (src[0] == '-') 1031 1.1 christos { 1032 1.1 christos /* Must be predecrement. */ 1033 1.1 christos src++; 1034 1.1 christos 1035 1.1 christos len = parse_reg (src, &mode, &(op->reg)); 1036 1.1 christos if (mode != A_REG_N) 1037 1.1 christos as_bad (_("illegal register after @-")); 1038 1.1 christos 1039 1.1 christos op->type = A_DEC_N; 1040 1.1 christos src += len; 1041 1.1 christos } 1042 1.1 christos else if (src[0] == '(') 1043 1.1 christos { 1044 1.1 christos /* Could be @(disp, rn), @(disp, gbr), @(disp, pc), @(r0, gbr) or 1045 1.1 christos @(r0, rn). */ 1046 1.1 christos src++; 1047 1.1 christos len = parse_reg (src, &mode, &(op->reg)); 1048 1.1 christos if (len && mode == A_REG_N) 1049 1.1 christos { 1050 1.1 christos src += len; 1051 1.1 christos if (op->reg != 0) 1052 1.1 christos { 1053 1.1 christos as_bad (_("must be @(r0,...)")); 1054 1.1 christos } 1055 1.1 christos if (src[0] == ',') 1056 1.1 christos { 1057 1.1 christos src++; 1058 1.1 christos /* Now can be rn or gbr. */ 1059 1.1 christos len = parse_reg (src, &mode, &(op->reg)); 1060 1.1 christos } 1061 1.1 christos else 1062 1.1 christos { 1063 1.1 christos len = 0; 1064 1.1 christos } 1065 1.1 christos if (len) 1066 1.1 christos { 1067 1.1 christos if (mode == A_GBR) 1068 1.1 christos { 1069 1.1 christos op->type = A_R0_GBR; 1070 1.1 christos } 1071 1.1 christos else if (mode == A_REG_N) 1072 1.1 christos { 1073 1.1 christos op->type = A_IND_R0_REG_N; 1074 1.1 christos } 1075 1.1 christos else 1076 1.1 christos { 1077 1.1 christos as_bad (_("syntax error in @(r0,...)")); 1078 1.1 christos } 1079 1.1 christos } 1080 1.1 christos else 1081 1.1 christos { 1082 1.1 christos as_bad (_("syntax error in @(r0...)")); 1083 1.1 christos } 1084 1.1 christos } 1085 1.1 christos else 1086 1.1 christos { 1087 1.1 christos /* Must be an @(disp,.. thing). */ 1088 1.1 christos src = parse_exp (src, op); 1089 1.1 christos if (src[0] == ',') 1090 1.1 christos src++; 1091 1.1 christos /* Now can be rn, gbr or pc. */ 1092 1.1 christos len = parse_reg (src, &mode, &op->reg); 1093 1.1 christos if (len) 1094 1.1 christos { 1095 1.1 christos if (mode == A_REG_N) 1096 1.1 christos { 1097 1.1 christos op->type = A_DISP_REG_N; 1098 1.1 christos } 1099 1.1 christos else if (mode == A_GBR) 1100 1.1 christos { 1101 1.1 christos op->type = A_DISP_GBR; 1102 1.1 christos } 1103 1.1 christos else if (mode == A_TBR) 1104 1.1 christos { 1105 1.1 christos op->type = A_DISP_TBR; 1106 1.1 christos } 1107 1.1 christos else if (mode == A_PC) 1108 1.1 christos { 1109 1.1 christos /* We want @(expr, pc) to uniformly address . + expr, 1110 1.1 christos no matter if expr is a constant, or a more complex 1111 1.1 christos expression, e.g. sym-. or sym1-sym2. 1112 1.1 christos However, we also used to accept @(sym,pc) 1113 1.1 christos as addressing sym, i.e. meaning the same as plain sym. 1114 1.1 christos Some existing code does use the @(sym,pc) syntax, so 1115 1.1 christos we give it the old semantics for now, but warn about 1116 1.1 christos its use, so that users have some time to fix their code. 1117 1.1 christos 1118 1.1 christos Note that due to this backward compatibility hack, 1119 1.1 christos we'll get unexpected results when @(offset, pc) is used, 1120 1.1 christos and offset is a symbol that is set later to an an address 1121 1.1 christos difference, or an external symbol that is set to an 1122 1.1 christos address difference in another source file, so we want to 1123 1.1 christos eventually remove it. */ 1124 1.1 christos if (op->immediate.X_op == O_symbol) 1125 1.1 christos { 1126 1.1 christos op->type = A_DISP_PC; 1127 1.1 christos as_warn (_("Deprecated syntax.")); 1128 1.1 christos } 1129 1.1 christos else 1130 1.1 christos { 1131 1.1 christos op->type = A_DISP_PC_ABS; 1132 1.1 christos /* Such operands don't get corrected for PC==.+4, so 1133 1.1 christos make the correction here. */ 1134 1.1 christos op->immediate.X_add_number -= 4; 1135 1.1 christos } 1136 1.1 christos } 1137 1.1 christos else 1138 1.1 christos { 1139 1.1 christos as_bad (_("syntax error in @(disp,[Rn, gbr, pc])")); 1140 1.1 christos } 1141 1.1 christos } 1142 1.1 christos else 1143 1.1 christos { 1144 1.1 christos as_bad (_("syntax error in @(disp,[Rn, gbr, pc])")); 1145 1.1 christos } 1146 1.1 christos } 1147 1.1 christos src += len; 1148 1.1 christos if (src[0] != ')') 1149 1.1 christos as_bad (_("expecting )")); 1150 1.1 christos else 1151 1.1 christos src++; 1152 1.1 christos } 1153 1.1 christos else 1154 1.1 christos { 1155 1.1 christos src += parse_reg (src, &mode, &(op->reg)); 1156 1.1 christos if (mode != A_REG_N) 1157 1.1 christos as_bad (_("illegal register after @")); 1158 1.1 christos 1159 1.1 christos if (src[0] == '+') 1160 1.1 christos { 1161 1.1 christos char l0, l1; 1162 1.1 christos 1163 1.1 christos src++; 1164 1.1 christos l0 = TOLOWER (src[0]); 1165 1.1 christos l1 = TOLOWER (src[1]); 1166 1.1 christos 1167 1.1 christos if ((l0 == 'r' && l1 == '8') 1168 1.1 christos || (l0 == 'i' && (l1 == 'x' || l1 == 's'))) 1169 1.1 christos { 1170 1.1 christos src += 2; 1171 1.1 christos op->type = AX_PMOD_N; 1172 1.1 christos } 1173 1.1 christos else if ( (l0 == 'r' && l1 == '9') 1174 1.1 christos || (l0 == 'i' && l1 == 'y')) 1175 1.1 christos { 1176 1.1 christos src += 2; 1177 1.1 christos op->type = AY_PMOD_N; 1178 1.1 christos } 1179 1.1 christos else 1180 1.1 christos op->type = A_INC_N; 1181 1.1 christos } 1182 1.1 christos else 1183 1.1 christos op->type = A_IND_N; 1184 1.1 christos } 1185 1.1 christos return src; 1186 1.1 christos } 1187 1.1 christos 1188 1.1 christos static void 1189 1.1 christos get_operand (char **ptr, sh_operand_info *op) 1190 1.5 christos { 1191 1.1 christos char *src = *ptr; 1192 1.1 christos sh_arg_type mode = (sh_arg_type) -1; 1193 1.1 christos unsigned int len; 1194 1.1 christos 1195 1.1 christos if (src[0] == '#') 1196 1.1 christos { 1197 1.1 christos src++; 1198 1.1 christos *ptr = parse_exp (src, op); 1199 1.1 christos op->type = A_IMM; 1200 1.1 christos return; 1201 1.1 christos } 1202 1.1 christos 1203 1.1 christos else if (src[0] == '@') 1204 1.1 christos { 1205 1.1 christos *ptr = parse_at (src, op); 1206 1.1 christos return; 1207 1.1 christos } 1208 1.1 christos len = parse_reg (src, &mode, &(op->reg)); 1209 1.1 christos if (len) 1210 1.1 christos { 1211 1.1 christos *ptr = src + len; 1212 1.1 christos op->type = mode; 1213 1.1 christos return; 1214 1.1 christos } 1215 1.1 christos else 1216 1.1 christos { 1217 1.1 christos /* Not a reg, the only thing left is a displacement. */ 1218 1.1 christos *ptr = parse_exp (src, op); 1219 1.1 christos op->type = A_DISP_PC; 1220 1.1 christos return; 1221 1.1 christos } 1222 1.1 christos } 1223 1.1 christos 1224 1.1 christos static char * 1225 1.1 christos get_operands (sh_opcode_info *info, char *args, sh_operand_info *operand) 1226 1.9 christos { 1227 1.9 christos char *ptr = args; 1228 1.9 christos 1229 1.9 christos operand[0].type = 0; 1230 1.1 christos operand[1].type = 0; 1231 1.1 christos operand[2].type = 0; 1232 1.1 christos if (info->arg[0]) 1233 1.1 christos { 1234 1.1 christos /* The pre-processor will eliminate whitespace in front of '@' 1235 1.10 christos after the first argument; we may be called multiple times 1236 1.1 christos from assemble_ppi, so don't insist on finding whitespace here. */ 1237 1.1 christos if (is_whitespace (*ptr)) 1238 1.1 christos ptr++; 1239 1.1 christos 1240 1.1 christos get_operand (&ptr, operand + 0); 1241 1.1 christos if (info->arg[1]) 1242 1.9 christos { 1243 1.1 christos if (*ptr == ',') 1244 1.1 christos ptr++; 1245 1.1 christos get_operand (&ptr, operand + 1); 1246 1.1 christos /* ??? Hack: psha/pshl have a varying operand number depending on 1247 1.1 christos the type of the first operand. We handle this by having the 1248 1.1 christos three-operand version first and reducing the number of operands 1249 1.1 christos parsed to two if we see that the first operand is an immediate. 1250 1.1 christos This works because no insn with three operands has an immediate 1251 1.1 christos as first operand. */ 1252 1.1 christos if (info->arg[2] && operand[0].type != A_IMM) 1253 1.9 christos { 1254 1.1 christos if (*ptr == ',') 1255 1.1 christos ptr++; 1256 1.1 christos get_operand (&ptr, operand + 2); 1257 1.1 christos } 1258 1.1 christos } 1259 1.1 christos } 1260 1.1 christos return ptr; 1261 1.1 christos } 1262 1.1 christos 1263 1.1 christos /* Passed a pointer to a list of opcodes which use different 1264 1.1 christos addressing modes, return the opcode which matches the opcodes 1265 1.1 christos provided. */ 1266 1.1 christos 1267 1.1 christos static sh_opcode_info * 1268 1.1 christos get_specific (sh_opcode_info *opcode, sh_operand_info *operands) 1269 1.5 christos { 1270 1.1 christos sh_opcode_info *this_try = opcode; 1271 1.1 christos const char *name = opcode->name; 1272 1.1 christos int n = 0; 1273 1.1 christos 1274 1.1 christos while (opcode->name) 1275 1.1 christos { 1276 1.1 christos this_try = opcode++; 1277 1.1 christos if ((this_try->name != name) && (strcmp (this_try->name, name) != 0)) 1278 1.1 christos { 1279 1.1 christos /* We've looked so far down the table that we've run out of 1280 1.1 christos opcodes with the same name. */ 1281 1.1 christos return 0; 1282 1.1 christos } 1283 1.1 christos 1284 1.1 christos /* Look at both operands needed by the opcodes and provided by 1285 1.1 christos the user - since an arg test will often fail on the same arg 1286 1.1 christos again and again, we'll try and test the last failing arg the 1287 1.1 christos first on each opcode try. */ 1288 1.1 christos for (n = 0; this_try->arg[n]; n++) 1289 1.1 christos { 1290 1.1 christos sh_operand_info *user = operands + n; 1291 1.1 christos sh_arg_type arg = this_try->arg[n]; 1292 1.1 christos 1293 1.1 christos switch (arg) 1294 1.1 christos { 1295 1.1 christos case A_DISP_PC: 1296 1.1 christos if (user->type == A_DISP_PC_ABS) 1297 1.1 christos break; 1298 1.1 christos /* Fall through. */ 1299 1.1 christos case A_IMM: 1300 1.1 christos case A_BDISP12: 1301 1.1 christos case A_BDISP8: 1302 1.1 christos case A_DISP_GBR: 1303 1.1 christos case A_DISP2_TBR: 1304 1.1 christos case A_MACH: 1305 1.1 christos case A_PR: 1306 1.1 christos case A_MACL: 1307 1.1 christos if (user->type != arg) 1308 1.1 christos goto fail; 1309 1.1 christos break; 1310 1.1 christos case A_R0: 1311 1.1 christos /* opcode needs r0 */ 1312 1.1 christos if (user->type != A_REG_N || user->reg != 0) 1313 1.1 christos goto fail; 1314 1.1 christos break; 1315 1.1 christos case A_R0_GBR: 1316 1.1 christos if (user->type != A_R0_GBR || user->reg != 0) 1317 1.1 christos goto fail; 1318 1.1 christos break; 1319 1.1 christos case F_FR0: 1320 1.1 christos if (user->type != F_REG_N || user->reg != 0) 1321 1.1 christos goto fail; 1322 1.1 christos break; 1323 1.1 christos 1324 1.1 christos case A_REG_N: 1325 1.1 christos case A_INC_N: 1326 1.1 christos case A_DEC_N: 1327 1.1 christos case A_IND_N: 1328 1.1 christos case A_IND_R0_REG_N: 1329 1.1 christos case A_DISP_REG_N: 1330 1.1 christos case F_REG_N: 1331 1.1 christos case D_REG_N: 1332 1.1 christos case X_REG_N: 1333 1.1 christos case V_REG_N: 1334 1.1 christos case FPUL_N: 1335 1.1 christos case FPSCR_N: 1336 1.1 christos case DSP_REG_N: 1337 1.1 christos /* Opcode needs rn */ 1338 1.1 christos if (user->type != arg) 1339 1.1 christos goto fail; 1340 1.1 christos reg_n = user->reg; 1341 1.1 christos break; 1342 1.1 christos case DX_REG_N: 1343 1.1 christos if (user->type != D_REG_N && user->type != X_REG_N) 1344 1.1 christos goto fail; 1345 1.1 christos reg_n = user->reg; 1346 1.1 christos break; 1347 1.1 christos case A_GBR: 1348 1.1 christos case A_TBR: 1349 1.1 christos case A_SR: 1350 1.1 christos case A_VBR: 1351 1.1 christos case A_DSR: 1352 1.1 christos case A_MOD: 1353 1.1 christos case A_RE: 1354 1.1 christos case A_RS: 1355 1.1 christos case A_SSR: 1356 1.1 christos case A_SPC: 1357 1.1 christos case A_SGR: 1358 1.1 christos case A_DBR: 1359 1.1 christos if (user->type != arg) 1360 1.1 christos goto fail; 1361 1.1 christos break; 1362 1.1 christos 1363 1.1 christos case A_REG_B: 1364 1.1 christos if (user->type != arg) 1365 1.1 christos goto fail; 1366 1.1 christos reg_b = user->reg; 1367 1.1 christos break; 1368 1.1 christos 1369 1.1 christos case A_INC_R15: 1370 1.1 christos if (user->type != A_INC_N) 1371 1.1 christos goto fail; 1372 1.1 christos if (user->reg != 15) 1373 1.1 christos goto fail; 1374 1.1 christos reg_n = user->reg; 1375 1.1 christos break; 1376 1.1 christos 1377 1.1 christos case A_DEC_R15: 1378 1.1 christos if (user->type != A_DEC_N) 1379 1.1 christos goto fail; 1380 1.1 christos if (user->reg != 15) 1381 1.1 christos goto fail; 1382 1.1 christos reg_n = user->reg; 1383 1.1 christos break; 1384 1.1 christos 1385 1.1 christos case A_REG_M: 1386 1.1 christos case A_INC_M: 1387 1.1 christos case A_DEC_M: 1388 1.1 christos case A_IND_M: 1389 1.1 christos case A_IND_R0_REG_M: 1390 1.1 christos case A_DISP_REG_M: 1391 1.1 christos case DSP_REG_M: 1392 1.1 christos /* Opcode needs rn */ 1393 1.1 christos if (user->type != arg - A_REG_M + A_REG_N) 1394 1.1 christos goto fail; 1395 1.1 christos reg_m = user->reg; 1396 1.1 christos break; 1397 1.1 christos 1398 1.1 christos case AS_DEC_N: 1399 1.1 christos if (user->type != A_DEC_N) 1400 1.1 christos goto fail; 1401 1.1 christos if (user->reg < 2 || user->reg > 5) 1402 1.1 christos goto fail; 1403 1.1 christos reg_n = user->reg; 1404 1.1 christos break; 1405 1.1 christos 1406 1.1 christos case AS_INC_N: 1407 1.1 christos if (user->type != A_INC_N) 1408 1.1 christos goto fail; 1409 1.1 christos if (user->reg < 2 || user->reg > 5) 1410 1.1 christos goto fail; 1411 1.1 christos reg_n = user->reg; 1412 1.1 christos break; 1413 1.1 christos 1414 1.1 christos case AS_IND_N: 1415 1.1 christos if (user->type != A_IND_N) 1416 1.1 christos goto fail; 1417 1.1 christos if (user->reg < 2 || user->reg > 5) 1418 1.1 christos goto fail; 1419 1.1 christos reg_n = user->reg; 1420 1.1 christos break; 1421 1.1 christos 1422 1.1 christos case AS_PMOD_N: 1423 1.1 christos if (user->type != AX_PMOD_N) 1424 1.1 christos goto fail; 1425 1.1 christos if (user->reg < 2 || user->reg > 5) 1426 1.1 christos goto fail; 1427 1.1 christos reg_n = user->reg; 1428 1.1 christos break; 1429 1.1 christos 1430 1.1 christos case AX_INC_N: 1431 1.1 christos if (user->type != A_INC_N) 1432 1.1 christos goto fail; 1433 1.1 christos if (user->reg < 4 || user->reg > 5) 1434 1.1 christos goto fail; 1435 1.1 christos reg_n = user->reg; 1436 1.1 christos break; 1437 1.1 christos 1438 1.1 christos case AX_IND_N: 1439 1.1 christos if (user->type != A_IND_N) 1440 1.1 christos goto fail; 1441 1.1 christos if (user->reg < 4 || user->reg > 5) 1442 1.1 christos goto fail; 1443 1.1 christos reg_n = user->reg; 1444 1.1 christos break; 1445 1.1 christos 1446 1.1 christos case AX_PMOD_N: 1447 1.1 christos if (user->type != AX_PMOD_N) 1448 1.1 christos goto fail; 1449 1.1 christos if (user->reg < 4 || user->reg > 5) 1450 1.1 christos goto fail; 1451 1.1 christos reg_n = user->reg; 1452 1.1 christos break; 1453 1.1 christos 1454 1.1 christos case AXY_INC_N: 1455 1.1 christos if (user->type != A_INC_N) 1456 1.1 christos goto fail; 1457 1.1 christos if ((user->reg < 4 || user->reg > 5) 1458 1.1 christos && (user->reg < 0 || user->reg > 1)) 1459 1.1 christos goto fail; 1460 1.1 christos reg_n = user->reg; 1461 1.1 christos break; 1462 1.1 christos 1463 1.1 christos case AXY_IND_N: 1464 1.1 christos if (user->type != A_IND_N) 1465 1.1 christos goto fail; 1466 1.1 christos if ((user->reg < 4 || user->reg > 5) 1467 1.1 christos && (user->reg < 0 || user->reg > 1)) 1468 1.1 christos goto fail; 1469 1.1 christos reg_n = user->reg; 1470 1.1 christos break; 1471 1.1 christos 1472 1.1 christos case AXY_PMOD_N: 1473 1.1 christos if (user->type != AX_PMOD_N) 1474 1.1 christos goto fail; 1475 1.1 christos if ((user->reg < 4 || user->reg > 5) 1476 1.1 christos && (user->reg < 0 || user->reg > 1)) 1477 1.1 christos goto fail; 1478 1.1 christos reg_n = user->reg; 1479 1.1 christos break; 1480 1.1 christos 1481 1.1 christos case AY_INC_N: 1482 1.1 christos if (user->type != A_INC_N) 1483 1.1 christos goto fail; 1484 1.1 christos if (user->reg < 6 || user->reg > 7) 1485 1.1 christos goto fail; 1486 1.1 christos reg_n = user->reg; 1487 1.1 christos break; 1488 1.1 christos 1489 1.1 christos case AY_IND_N: 1490 1.1 christos if (user->type != A_IND_N) 1491 1.1 christos goto fail; 1492 1.1 christos if (user->reg < 6 || user->reg > 7) 1493 1.1 christos goto fail; 1494 1.1 christos reg_n = user->reg; 1495 1.1 christos break; 1496 1.1 christos 1497 1.1 christos case AY_PMOD_N: 1498 1.1 christos if (user->type != AY_PMOD_N) 1499 1.1 christos goto fail; 1500 1.1 christos if (user->reg < 6 || user->reg > 7) 1501 1.1 christos goto fail; 1502 1.1 christos reg_n = user->reg; 1503 1.1 christos break; 1504 1.1 christos 1505 1.1 christos case AYX_INC_N: 1506 1.1 christos if (user->type != A_INC_N) 1507 1.1 christos goto fail; 1508 1.1 christos if ((user->reg < 6 || user->reg > 7) 1509 1.1 christos && (user->reg < 2 || user->reg > 3)) 1510 1.1 christos goto fail; 1511 1.1 christos reg_n = user->reg; 1512 1.1 christos break; 1513 1.1 christos 1514 1.1 christos case AYX_IND_N: 1515 1.1 christos if (user->type != A_IND_N) 1516 1.1 christos goto fail; 1517 1.1 christos if ((user->reg < 6 || user->reg > 7) 1518 1.1 christos && (user->reg < 2 || user->reg > 3)) 1519 1.1 christos goto fail; 1520 1.1 christos reg_n = user->reg; 1521 1.1 christos break; 1522 1.1 christos 1523 1.1 christos case AYX_PMOD_N: 1524 1.1 christos if (user->type != AY_PMOD_N) 1525 1.1 christos goto fail; 1526 1.1 christos if ((user->reg < 6 || user->reg > 7) 1527 1.1 christos && (user->reg < 2 || user->reg > 3)) 1528 1.1 christos goto fail; 1529 1.1 christos reg_n = user->reg; 1530 1.1 christos break; 1531 1.1 christos 1532 1.1 christos case DSP_REG_A_M: 1533 1.1 christos if (user->type != DSP_REG_N) 1534 1.1 christos goto fail; 1535 1.1 christos if (user->reg != A_A0_NUM 1536 1.1 christos && user->reg != A_A1_NUM) 1537 1.1 christos goto fail; 1538 1.1 christos reg_m = user->reg; 1539 1.1 christos break; 1540 1.1 christos 1541 1.1 christos case DSP_REG_AX: 1542 1.1 christos if (user->type != DSP_REG_N) 1543 1.1 christos goto fail; 1544 1.1 christos switch (user->reg) 1545 1.1 christos { 1546 1.1 christos case A_A0_NUM: 1547 1.1 christos reg_x = 0; 1548 1.1 christos break; 1549 1.1 christos case A_A1_NUM: 1550 1.1 christos reg_x = 2; 1551 1.1 christos break; 1552 1.1 christos case A_X0_NUM: 1553 1.1 christos reg_x = 1; 1554 1.1 christos break; 1555 1.1 christos case A_X1_NUM: 1556 1.1 christos reg_x = 3; 1557 1.1 christos break; 1558 1.1 christos default: 1559 1.1 christos goto fail; 1560 1.1 christos } 1561 1.1 christos break; 1562 1.1 christos 1563 1.1 christos case DSP_REG_XY: 1564 1.1 christos if (user->type != DSP_REG_N) 1565 1.1 christos goto fail; 1566 1.1 christos switch (user->reg) 1567 1.1 christos { 1568 1.1 christos case A_X0_NUM: 1569 1.1 christos reg_x = 0; 1570 1.1 christos break; 1571 1.1 christos case A_X1_NUM: 1572 1.1 christos reg_x = 2; 1573 1.1 christos break; 1574 1.1 christos case A_Y0_NUM: 1575 1.1 christos reg_x = 1; 1576 1.1 christos break; 1577 1.1 christos case A_Y1_NUM: 1578 1.1 christos reg_x = 3; 1579 1.1 christos break; 1580 1.1 christos default: 1581 1.1 christos goto fail; 1582 1.1 christos } 1583 1.1 christos break; 1584 1.1 christos 1585 1.1 christos case DSP_REG_AY: 1586 1.1 christos if (user->type != DSP_REG_N) 1587 1.1 christos goto fail; 1588 1.1 christos switch (user->reg) 1589 1.1 christos { 1590 1.1 christos case A_A0_NUM: 1591 1.1 christos reg_y = 0; 1592 1.1 christos break; 1593 1.1 christos case A_A1_NUM: 1594 1.1 christos reg_y = 1; 1595 1.1 christos break; 1596 1.1 christos case A_Y0_NUM: 1597 1.1 christos reg_y = 2; 1598 1.1 christos break; 1599 1.1 christos case A_Y1_NUM: 1600 1.1 christos reg_y = 3; 1601 1.1 christos break; 1602 1.1 christos default: 1603 1.1 christos goto fail; 1604 1.1 christos } 1605 1.1 christos break; 1606 1.1 christos 1607 1.1 christos case DSP_REG_YX: 1608 1.1 christos if (user->type != DSP_REG_N) 1609 1.1 christos goto fail; 1610 1.1 christos switch (user->reg) 1611 1.1 christos { 1612 1.1 christos case A_Y0_NUM: 1613 1.1 christos reg_y = 0; 1614 1.1 christos break; 1615 1.1 christos case A_Y1_NUM: 1616 1.1 christos reg_y = 1; 1617 1.1 christos break; 1618 1.1 christos case A_X0_NUM: 1619 1.1 christos reg_y = 2; 1620 1.1 christos break; 1621 1.1 christos case A_X1_NUM: 1622 1.1 christos reg_y = 3; 1623 1.1 christos break; 1624 1.1 christos default: 1625 1.1 christos goto fail; 1626 1.1 christos } 1627 1.1 christos break; 1628 1.1 christos 1629 1.1 christos case DSP_REG_X: 1630 1.1 christos if (user->type != DSP_REG_N) 1631 1.1 christos goto fail; 1632 1.1 christos switch (user->reg) 1633 1.1 christos { 1634 1.1 christos case A_X0_NUM: 1635 1.1 christos reg_x = 0; 1636 1.1 christos break; 1637 1.1 christos case A_X1_NUM: 1638 1.1 christos reg_x = 1; 1639 1.1 christos break; 1640 1.1 christos case A_A0_NUM: 1641 1.1 christos reg_x = 2; 1642 1.1 christos break; 1643 1.1 christos case A_A1_NUM: 1644 1.1 christos reg_x = 3; 1645 1.1 christos break; 1646 1.1 christos default: 1647 1.1 christos goto fail; 1648 1.1 christos } 1649 1.1 christos break; 1650 1.1 christos 1651 1.1 christos case DSP_REG_Y: 1652 1.1 christos if (user->type != DSP_REG_N) 1653 1.1 christos goto fail; 1654 1.1 christos switch (user->reg) 1655 1.1 christos { 1656 1.1 christos case A_Y0_NUM: 1657 1.1 christos reg_y = 0; 1658 1.1 christos break; 1659 1.1 christos case A_Y1_NUM: 1660 1.1 christos reg_y = 1; 1661 1.1 christos break; 1662 1.1 christos case A_M0_NUM: 1663 1.1 christos reg_y = 2; 1664 1.1 christos break; 1665 1.1 christos case A_M1_NUM: 1666 1.1 christos reg_y = 3; 1667 1.1 christos break; 1668 1.1 christos default: 1669 1.1 christos goto fail; 1670 1.1 christos } 1671 1.1 christos break; 1672 1.1 christos 1673 1.1 christos case DSP_REG_E: 1674 1.1 christos if (user->type != DSP_REG_N) 1675 1.1 christos goto fail; 1676 1.1 christos switch (user->reg) 1677 1.1 christos { 1678 1.1 christos case A_X0_NUM: 1679 1.1 christos reg_efg = 0 << 10; 1680 1.1 christos break; 1681 1.1 christos case A_X1_NUM: 1682 1.1 christos reg_efg = 1 << 10; 1683 1.1 christos break; 1684 1.1 christos case A_Y0_NUM: 1685 1.1 christos reg_efg = 2 << 10; 1686 1.1 christos break; 1687 1.1 christos case A_A1_NUM: 1688 1.1 christos reg_efg = 3 << 10; 1689 1.1 christos break; 1690 1.1 christos default: 1691 1.1 christos goto fail; 1692 1.1 christos } 1693 1.1 christos break; 1694 1.1 christos 1695 1.1 christos case DSP_REG_F: 1696 1.1 christos if (user->type != DSP_REG_N) 1697 1.1 christos goto fail; 1698 1.1 christos switch (user->reg) 1699 1.1 christos { 1700 1.1 christos case A_Y0_NUM: 1701 1.1 christos reg_efg |= 0 << 8; 1702 1.1 christos break; 1703 1.1 christos case A_Y1_NUM: 1704 1.1 christos reg_efg |= 1 << 8; 1705 1.1 christos break; 1706 1.1 christos case A_X0_NUM: 1707 1.1 christos reg_efg |= 2 << 8; 1708 1.1 christos break; 1709 1.1 christos case A_A1_NUM: 1710 1.1 christos reg_efg |= 3 << 8; 1711 1.1 christos break; 1712 1.1 christos default: 1713 1.1 christos goto fail; 1714 1.1 christos } 1715 1.1 christos break; 1716 1.1 christos 1717 1.1 christos case DSP_REG_G: 1718 1.1 christos if (user->type != DSP_REG_N) 1719 1.1 christos goto fail; 1720 1.1 christos switch (user->reg) 1721 1.1 christos { 1722 1.1 christos case A_M0_NUM: 1723 1.1 christos reg_efg |= 0 << 2; 1724 1.1 christos break; 1725 1.1 christos case A_M1_NUM: 1726 1.1 christos reg_efg |= 1 << 2; 1727 1.1 christos break; 1728 1.1 christos case A_A0_NUM: 1729 1.1 christos reg_efg |= 2 << 2; 1730 1.1 christos break; 1731 1.1 christos case A_A1_NUM: 1732 1.1 christos reg_efg |= 3 << 2; 1733 1.1 christos break; 1734 1.1 christos default: 1735 1.1 christos goto fail; 1736 1.1 christos } 1737 1.1 christos break; 1738 1.1 christos 1739 1.1 christos case A_A0: 1740 1.1 christos if (user->type != DSP_REG_N || user->reg != A_A0_NUM) 1741 1.1 christos goto fail; 1742 1.1 christos break; 1743 1.1 christos case A_X0: 1744 1.1 christos if (user->type != DSP_REG_N || user->reg != A_X0_NUM) 1745 1.1 christos goto fail; 1746 1.1 christos break; 1747 1.1 christos case A_X1: 1748 1.1 christos if (user->type != DSP_REG_N || user->reg != A_X1_NUM) 1749 1.1 christos goto fail; 1750 1.1 christos break; 1751 1.1 christos case A_Y0: 1752 1.1 christos if (user->type != DSP_REG_N || user->reg != A_Y0_NUM) 1753 1.1 christos goto fail; 1754 1.1 christos break; 1755 1.1 christos case A_Y1: 1756 1.1 christos if (user->type != DSP_REG_N || user->reg != A_Y1_NUM) 1757 1.1 christos goto fail; 1758 1.1 christos break; 1759 1.1 christos 1760 1.1 christos case F_REG_M: 1761 1.1 christos case D_REG_M: 1762 1.1 christos case X_REG_M: 1763 1.1 christos case V_REG_M: 1764 1.1 christos case FPUL_M: 1765 1.1 christos case FPSCR_M: 1766 1.1 christos /* Opcode needs rn */ 1767 1.1 christos if (user->type != arg - F_REG_M + F_REG_N) 1768 1.1 christos goto fail; 1769 1.1 christos reg_m = user->reg; 1770 1.1 christos break; 1771 1.1 christos case DX_REG_M: 1772 1.1 christos if (user->type != D_REG_N && user->type != X_REG_N) 1773 1.1 christos goto fail; 1774 1.1 christos reg_m = user->reg; 1775 1.1 christos break; 1776 1.1 christos case XMTRX_M4: 1777 1.1 christos if (user->type != XMTRX_M4) 1778 1.1 christos goto fail; 1779 1.1 christos reg_m = 4; 1780 1.1 christos break; 1781 1.1 christos 1782 1.1 christos default: 1783 1.1 christos printf (_("unhandled %d\n"), arg); 1784 1.1 christos goto fail; 1785 1.1 christos } 1786 1.1 christos if (SH_MERGE_ARCH_SET_VALID (valid_arch, arch_sh2a_nofpu_up) 1787 1.1 christos && ( arg == A_DISP_REG_M 1788 1.1 christos || arg == A_DISP_REG_N)) 1789 1.1 christos { 1790 1.1 christos /* Check a few key IMM* fields for overflow. */ 1791 1.1 christos int opf; 1792 1.1 christos long val = user->immediate.X_add_number; 1793 1.1 christos 1794 1.1 christos for (opf = 0; opf < 4; opf ++) 1795 1.1 christos switch (this_try->nibbles[opf]) 1796 1.1 christos { 1797 1.1 christos case IMM0_4: 1798 1.1 christos case IMM1_4: 1799 1.1 christos if (val < 0 || val > 15) 1800 1.1 christos goto fail; 1801 1.1 christos break; 1802 1.1 christos case IMM0_4BY2: 1803 1.1 christos case IMM1_4BY2: 1804 1.1 christos if (val < 0 || val > 15 * 2) 1805 1.1 christos goto fail; 1806 1.1 christos break; 1807 1.1 christos case IMM0_4BY4: 1808 1.1 christos case IMM1_4BY4: 1809 1.1 christos if (val < 0 || val > 15 * 4) 1810 1.1 christos goto fail; 1811 1.1 christos break; 1812 1.1 christos default: 1813 1.1 christos break; 1814 1.1 christos } 1815 1.1 christos } 1816 1.1 christos } 1817 1.1 christos if ( !SH_MERGE_ARCH_SET_VALID (valid_arch, this_try->arch)) 1818 1.1 christos goto fail; 1819 1.1 christos valid_arch = SH_MERGE_ARCH_SET (valid_arch, this_try->arch); 1820 1.1 christos return this_try; 1821 1.1 christos fail: 1822 1.1 christos ; 1823 1.1 christos } 1824 1.1 christos 1825 1.1 christos return 0; 1826 1.1 christos } 1827 1.5 christos 1828 1.5 christos static void 1829 1.1 christos insert (char *where, bfd_reloc_code_real_type how, int pcrel, 1830 1.1 christos sh_operand_info *op) 1831 1.1 christos { 1832 1.1 christos fix_new_exp (frag_now, 1833 1.1 christos where - frag_now->fr_literal, 1834 1.1 christos 2, 1835 1.1 christos &op->immediate, 1836 1.1 christos pcrel, 1837 1.1 christos how); 1838 1.1 christos } 1839 1.5 christos 1840 1.5 christos static void 1841 1.1 christos insert4 (char * where, bfd_reloc_code_real_type how, int pcrel, 1842 1.1 christos sh_operand_info * op) 1843 1.1 christos { 1844 1.1 christos fix_new_exp (frag_now, 1845 1.1 christos where - frag_now->fr_literal, 1846 1.1 christos 4, 1847 1.1 christos & op->immediate, 1848 1.1 christos pcrel, 1849 1.1 christos how); 1850 1.1 christos } 1851 1.1 christos static void 1852 1.1 christos build_relax (sh_opcode_info *opcode, sh_operand_info *op) 1853 1.1 christos { 1854 1.1 christos int high_byte = target_big_endian ? 0 : 1; 1855 1.1 christos char *p; 1856 1.1 christos 1857 1.1 christos if (opcode->arg[0] == A_BDISP8) 1858 1.1 christos { 1859 1.1 christos int what = (opcode->nibbles[1] & 4) ? COND_JUMP_DELAY : COND_JUMP; 1860 1.1 christos p = frag_var (rs_machine_dependent, 1861 1.1 christos md_relax_table[C (what, COND32)].rlx_length, 1862 1.1 christos md_relax_table[C (what, COND8)].rlx_length, 1863 1.1 christos C (what, 0), 1864 1.1 christos op->immediate.X_add_symbol, 1865 1.1 christos op->immediate.X_add_number, 1866 1.1 christos 0); 1867 1.1 christos p[high_byte] = (opcode->nibbles[0] << 4) | (opcode->nibbles[1]); 1868 1.1 christos } 1869 1.1 christos else if (opcode->arg[0] == A_BDISP12) 1870 1.1 christos { 1871 1.1 christos p = frag_var (rs_machine_dependent, 1872 1.1 christos md_relax_table[C (UNCOND_JUMP, UNCOND32)].rlx_length, 1873 1.1 christos md_relax_table[C (UNCOND_JUMP, UNCOND12)].rlx_length, 1874 1.1 christos C (UNCOND_JUMP, 0), 1875 1.1 christos op->immediate.X_add_symbol, 1876 1.1 christos op->immediate.X_add_number, 1877 1.1 christos 0); 1878 1.1 christos p[high_byte] = (opcode->nibbles[0] << 4); 1879 1.1 christos } 1880 1.1 christos 1881 1.1 christos } 1882 1.1 christos 1883 1.1 christos /* Insert ldrs & ldre with fancy relocations that relaxation can recognize. */ 1884 1.1 christos 1885 1.1 christos static char * 1886 1.1 christos insert_loop_bounds (char *output, sh_operand_info *operand) 1887 1.1 christos { 1888 1.1 christos symbolS *end_sym; 1889 1.1 christos 1890 1.1 christos /* Since the low byte of the opcode will be overwritten by the reloc, we 1891 1.1 christos can just stash the high byte into both bytes and ignore endianness. */ 1892 1.1 christos output[0] = 0x8c; 1893 1.1 christos output[1] = 0x8c; 1894 1.1 christos insert (output, BFD_RELOC_SH_LOOP_START, 1, operand); 1895 1.1 christos insert (output, BFD_RELOC_SH_LOOP_END, 1, operand + 1); 1896 1.1 christos 1897 1.1 christos if (sh_relax) 1898 1.5 christos { 1899 1.7 christos static int count = 0; 1900 1.1 christos char name[11]; 1901 1.1 christos expressionS *symval; 1902 1.1 christos 1903 1.1 christos /* If the last loop insn is a two-byte-insn, it is in danger of being 1904 1.1 christos swapped with the insn after it. To prevent this, create a new 1905 1.1 christos symbol - complete with SH_LABEL reloc - after the last loop insn. 1906 1.1 christos If the last loop insn is four bytes long, the symbol will be 1907 1.1 christos right in the middle, but four byte insns are not swapped anyways. */ 1908 1.1 christos /* A REPEAT takes 6 bytes. The SH has a 32 bit address space. 1909 1.8 christos Hence a 9 digit number should be enough to count all REPEATs. */ 1910 1.1 christos sprintf (name, "_R%x", count++ & 0x3fffffff); 1911 1.1 christos end_sym = symbol_new (name, undefined_section, &zero_address_frag, 0); 1912 1.1 christos /* Make this a local symbol. */ 1913 1.1 christos #ifdef OBJ_COFF 1914 1.1 christos SF_SET_LOCAL (end_sym); 1915 1.7 christos #endif /* OBJ_COFF */ 1916 1.7 christos symbol_table_insert (end_sym); 1917 1.7 christos symval = symbol_get_value_expression (end_sym); 1918 1.1 christos *symval = operand[1].immediate; 1919 1.1 christos symval->X_add_number += 2; 1920 1.1 christos fix_new (frag_now, frag_now_fix (), 2, end_sym, 0, 1, BFD_RELOC_SH_LABEL); 1921 1.1 christos } 1922 1.1 christos 1923 1.1 christos output = frag_more (2); 1924 1.1 christos output[0] = 0x8e; 1925 1.1 christos output[1] = 0x8e; 1926 1.1 christos insert (output, BFD_RELOC_SH_LOOP_START, 1, operand); 1927 1.1 christos insert (output, BFD_RELOC_SH_LOOP_END, 1, operand + 1); 1928 1.1 christos 1929 1.1 christos return frag_more (2); 1930 1.1 christos } 1931 1.1 christos 1932 1.1 christos /* Now we know what sort of opcodes it is, let's build the bytes. */ 1933 1.1 christos 1934 1.1 christos static unsigned int 1935 1.1 christos build_Mytes (sh_opcode_info *opcode, sh_operand_info *operand) 1936 1.1 christos { 1937 1.1 christos int indx; 1938 1.1 christos char nbuf[8]; 1939 1.1 christos char *output; 1940 1.1 christos unsigned int size = 2; 1941 1.1 christos int low_byte = target_big_endian ? 1 : 0; 1942 1.1 christos int max_index = 4; 1943 1.1 christos bfd_reloc_code_real_type r_type; 1944 1.1 christos #ifdef OBJ_ELF 1945 1.1 christos int unhandled_pic = 0; 1946 1.1 christos #endif 1947 1.1 christos 1948 1.1 christos nbuf[0] = 0; 1949 1.1 christos nbuf[1] = 0; 1950 1.1 christos nbuf[2] = 0; 1951 1.1 christos nbuf[3] = 0; 1952 1.1 christos nbuf[4] = 0; 1953 1.1 christos nbuf[5] = 0; 1954 1.1 christos nbuf[6] = 0; 1955 1.1 christos nbuf[7] = 0; 1956 1.1 christos 1957 1.1 christos #ifdef OBJ_ELF 1958 1.1 christos for (indx = 0; indx < 3; indx++) 1959 1.1 christos if (opcode->arg[indx] == A_IMM 1960 1.1 christos && operand[indx].type == A_IMM 1961 1.1 christos && (operand[indx].immediate.X_op == O_PIC_reloc 1962 1.1 christos || sh_PIC_related_p (operand[indx].immediate.X_add_symbol) 1963 1.1 christos || sh_PIC_related_p (operand[indx].immediate.X_op_symbol))) 1964 1.1 christos unhandled_pic = 1; 1965 1.1 christos #endif 1966 1.1 christos 1967 1.1 christos if (SH_MERGE_ARCH_SET (opcode->arch, arch_op32)) 1968 1.1 christos { 1969 1.1 christos output = frag_more (4); 1970 1.1 christos size = 4; 1971 1.1 christos max_index = 8; 1972 1.1 christos } 1973 1.1 christos else 1974 1.1 christos output = frag_more (2); 1975 1.1 christos 1976 1.1 christos for (indx = 0; indx < max_index; indx++) 1977 1.1 christos { 1978 1.1 christos sh_nibble_type i = opcode->nibbles[indx]; 1979 1.1 christos if (i < 16) 1980 1.1 christos { 1981 1.1 christos nbuf[indx] = i; 1982 1.1 christos } 1983 1.1 christos else 1984 1.1 christos { 1985 1.1 christos switch (i) 1986 1.1 christos { 1987 1.1 christos case REG_N: 1988 1.1 christos case REG_N_D: 1989 1.1 christos nbuf[indx] = reg_n; 1990 1.1 christos break; 1991 1.1 christos case REG_M: 1992 1.1 christos nbuf[indx] = reg_m; 1993 1.1 christos break; 1994 1.1 christos case SDT_REG_N: 1995 1.1 christos if (reg_n < 2 || reg_n > 5) 1996 1.1 christos as_bad (_("Invalid register: 'r%d'"), reg_n); 1997 1.1 christos nbuf[indx] = (reg_n & 3) | 4; 1998 1.1 christos break; 1999 1.1 christos case REG_NM: 2000 1.1 christos nbuf[indx] = reg_n | (reg_m >> 2); 2001 1.1 christos break; 2002 1.1 christos case REG_B: 2003 1.1 christos nbuf[indx] = reg_b | 0x08; 2004 1.1 christos break; 2005 1.1 christos case REG_N_B01: 2006 1.1 christos nbuf[indx] = reg_n | 0x01; 2007 1.1 christos break; 2008 1.6 christos case IMM0_3s: 2009 1.1 christos nbuf[indx] |= 0x08; 2010 1.1 christos /* Fall through. */ 2011 1.1 christos case IMM0_3c: 2012 1.1 christos insert (output + low_byte, BFD_RELOC_SH_IMM3, 0, operand); 2013 1.1 christos break; 2014 1.6 christos case IMM0_3Us: 2015 1.1 christos nbuf[indx] |= 0x80; 2016 1.1 christos /* Fall through. */ 2017 1.1 christos case IMM0_3Uc: 2018 1.1 christos insert (output + low_byte, BFD_RELOC_SH_IMM3U, 0, operand); 2019 1.1 christos break; 2020 1.1 christos case DISP0_12: 2021 1.1 christos insert (output + 2, BFD_RELOC_SH_DISP12, 0, operand); 2022 1.1 christos break; 2023 1.1 christos case DISP0_12BY2: 2024 1.1 christos insert (output + 2, BFD_RELOC_SH_DISP12BY2, 0, operand); 2025 1.1 christos break; 2026 1.1 christos case DISP0_12BY4: 2027 1.1 christos insert (output + 2, BFD_RELOC_SH_DISP12BY4, 0, operand); 2028 1.1 christos break; 2029 1.1 christos case DISP0_12BY8: 2030 1.1 christos insert (output + 2, BFD_RELOC_SH_DISP12BY8, 0, operand); 2031 1.1 christos break; 2032 1.1 christos case DISP1_12: 2033 1.1 christos insert (output + 2, BFD_RELOC_SH_DISP12, 0, operand+1); 2034 1.1 christos break; 2035 1.1 christos case DISP1_12BY2: 2036 1.1 christos insert (output + 2, BFD_RELOC_SH_DISP12BY2, 0, operand+1); 2037 1.1 christos break; 2038 1.1 christos case DISP1_12BY4: 2039 1.1 christos insert (output + 2, BFD_RELOC_SH_DISP12BY4, 0, operand+1); 2040 1.1 christos break; 2041 1.1 christos case DISP1_12BY8: 2042 1.1 christos insert (output + 2, BFD_RELOC_SH_DISP12BY8, 0, operand+1); 2043 1.1 christos break; 2044 1.1 christos case IMM0_20_4: 2045 1.1 christos break; 2046 1.1 christos case IMM0_20: 2047 1.1 christos r_type = BFD_RELOC_SH_DISP20; 2048 1.1 christos #ifdef OBJ_ELF 2049 1.1 christos if (sh_check_fixup (&operand->immediate, &r_type)) 2050 1.1 christos as_bad (_("Invalid PIC expression.")); 2051 1.1 christos unhandled_pic = 0; 2052 1.1 christos #endif 2053 1.1 christos insert4 (output, r_type, 0, operand); 2054 1.1 christos break; 2055 1.1 christos case IMM0_20BY8: 2056 1.1 christos insert4 (output, BFD_RELOC_SH_DISP20BY8, 0, operand); 2057 1.1 christos break; 2058 1.1 christos case IMM0_4BY4: 2059 1.1 christos insert (output + low_byte, BFD_RELOC_SH_IMM4BY4, 0, operand); 2060 1.1 christos break; 2061 1.1 christos case IMM0_4BY2: 2062 1.1 christos insert (output + low_byte, BFD_RELOC_SH_IMM4BY2, 0, operand); 2063 1.1 christos break; 2064 1.1 christos case IMM0_4: 2065 1.1 christos insert (output + low_byte, BFD_RELOC_SH_IMM4, 0, operand); 2066 1.1 christos break; 2067 1.1 christos case IMM1_4BY4: 2068 1.1 christos insert (output + low_byte, BFD_RELOC_SH_IMM4BY4, 0, operand + 1); 2069 1.1 christos break; 2070 1.1 christos case IMM1_4BY2: 2071 1.1 christos insert (output + low_byte, BFD_RELOC_SH_IMM4BY2, 0, operand + 1); 2072 1.1 christos break; 2073 1.1 christos case IMM1_4: 2074 1.1 christos insert (output + low_byte, BFD_RELOC_SH_IMM4, 0, operand + 1); 2075 1.1 christos break; 2076 1.1 christos case IMM0_8BY4: 2077 1.1 christos insert (output + low_byte, BFD_RELOC_SH_IMM8BY4, 0, operand); 2078 1.1 christos break; 2079 1.1 christos case IMM0_8BY2: 2080 1.8 christos insert (output + low_byte, BFD_RELOC_SH_IMM8BY2, 0, operand); 2081 1.8 christos break; 2082 1.1 christos case IMM0_8U: 2083 1.1 christos case IMM0_8S: 2084 1.1 christos insert (output + low_byte, BFD_RELOC_SH_IMM8, 0, operand); 2085 1.1 christos break; 2086 1.1 christos case IMM1_8BY4: 2087 1.1 christos insert (output + low_byte, BFD_RELOC_SH_IMM8BY4, 0, operand + 1); 2088 1.1 christos break; 2089 1.1 christos case IMM1_8BY2: 2090 1.1 christos insert (output + low_byte, BFD_RELOC_SH_IMM8BY2, 0, operand + 1); 2091 1.1 christos break; 2092 1.1 christos case IMM1_8: 2093 1.1 christos insert (output + low_byte, BFD_RELOC_SH_IMM8, 0, operand + 1); 2094 1.1 christos break; 2095 1.1 christos case PCRELIMM_8BY4: 2096 1.1 christos insert (output, BFD_RELOC_SH_PCRELIMM8BY4, 2097 1.1 christos operand->type != A_DISP_PC_ABS, operand); 2098 1.1 christos break; 2099 1.1 christos case PCRELIMM_8BY2: 2100 1.1 christos insert (output, BFD_RELOC_SH_PCRELIMM8BY2, 2101 1.1 christos operand->type != A_DISP_PC_ABS, operand); 2102 1.1 christos break; 2103 1.1 christos case REPEAT: 2104 1.1 christos output = insert_loop_bounds (output, operand); 2105 1.1 christos nbuf[indx] = opcode->nibbles[3]; 2106 1.1 christos operand += 2; 2107 1.1 christos break; 2108 1.1 christos default: 2109 1.1 christos printf (_("failed for %d\n"), i); 2110 1.1 christos } 2111 1.1 christos } 2112 1.1 christos } 2113 1.1 christos #ifdef OBJ_ELF 2114 1.1 christos if (unhandled_pic) 2115 1.1 christos as_bad (_("misplaced PIC operand")); 2116 1.1 christos #endif 2117 1.1 christos if (!target_big_endian) 2118 1.1 christos { 2119 1.1 christos output[1] = (nbuf[0] << 4) | (nbuf[1]); 2120 1.1 christos output[0] = (nbuf[2] << 4) | (nbuf[3]); 2121 1.1 christos } 2122 1.1 christos else 2123 1.1 christos { 2124 1.1 christos output[0] = (nbuf[0] << 4) | (nbuf[1]); 2125 1.1 christos output[1] = (nbuf[2] << 4) | (nbuf[3]); 2126 1.1 christos } 2127 1.1 christos if (SH_MERGE_ARCH_SET (opcode->arch, arch_op32)) 2128 1.1 christos { 2129 1.1 christos if (!target_big_endian) 2130 1.1 christos { 2131 1.1 christos output[3] = (nbuf[4] << 4) | (nbuf[5]); 2132 1.1 christos output[2] = (nbuf[6] << 4) | (nbuf[7]); 2133 1.1 christos } 2134 1.1 christos else 2135 1.1 christos { 2136 1.1 christos output[2] = (nbuf[4] << 4) | (nbuf[5]); 2137 1.1 christos output[3] = (nbuf[6] << 4) | (nbuf[7]); 2138 1.1 christos } 2139 1.1 christos } 2140 1.1 christos return size; 2141 1.1 christos } 2142 1.1 christos 2143 1.1 christos /* Find an opcode at the start of *STR_P in the hash table, and set 2144 1.1 christos *STR_P to the first character after the last one read. */ 2145 1.1 christos 2146 1.1 christos static sh_opcode_info * 2147 1.1 christos find_cooked_opcode (char **str_p) 2148 1.1 christos { 2149 1.1 christos char *str = *str_p; 2150 1.1 christos unsigned char *op_start; 2151 1.1 christos unsigned char *op_end; 2152 1.1 christos char name[20]; 2153 1.1 christos unsigned int nlen = 0; 2154 1.10 christos 2155 1.1 christos /* Drop leading whitespace. */ 2156 1.1 christos while (is_whitespace (*str)) 2157 1.1 christos str++; 2158 1.1 christos 2159 1.1 christos /* Find the op code end. 2160 1.1 christos The pre-processor will eliminate whitespace in front of 2161 1.1 christos any '@' after the first argument; we may be called from 2162 1.10 christos assemble_ppi, so the opcode might be terminated by an '@'. */ 2163 1.10 christos for (op_start = op_end = (unsigned char *) str; 2164 1.1 christos nlen < sizeof (name) - 1 2165 1.1 christos && !is_end_of_stmt (*op_end) && !is_whitespace (*op_end) && *op_end != '@'; 2166 1.1 christos op_end++) 2167 1.1 christos { 2168 1.1 christos unsigned char c = op_start[nlen]; 2169 1.1 christos 2170 1.1 christos /* The machine independent code will convert CMP/EQ into cmp/EQ 2171 1.1 christos because it thinks the '/' is the end of the symbol. Moreover, 2172 1.1 christos all but the first sub-insn is a parallel processing insn won't 2173 1.1 christos be capitalized. Instead of hacking up the machine independent 2174 1.1 christos code, we just deal with it here. */ 2175 1.1 christos c = TOLOWER (c); 2176 1.1 christos name[nlen] = c; 2177 1.1 christos nlen++; 2178 1.1 christos } 2179 1.1 christos 2180 1.1 christos name[nlen] = 0; 2181 1.1 christos *str_p = (char *) op_end; 2182 1.1 christos 2183 1.1 christos if (nlen == 0) 2184 1.10 christos as_bad (_("can't find opcode ")); 2185 1.1 christos 2186 1.1 christos return str_hash_find (opcode_hash_control, name); 2187 1.1 christos } 2188 1.1 christos 2189 1.1 christos /* Assemble a parallel processing insn. */ 2190 1.1 christos #define DDT_BASE 0xf000 /* Base value for double data transfer insns */ 2191 1.1 christos 2192 1.1 christos static unsigned int 2193 1.8 christos assemble_ppi (char *op_end, sh_opcode_info *opcode) 2194 1.8 christos { 2195 1.8 christos unsigned int movx = 0; 2196 1.8 christos unsigned int movy = 0; 2197 1.1 christos unsigned int cond = 0; 2198 1.8 christos unsigned int field_b = 0; 2199 1.1 christos char *output; 2200 1.1 christos unsigned int move_code; 2201 1.1 christos unsigned int size; 2202 1.1 christos 2203 1.1 christos for (;;) 2204 1.1 christos { 2205 1.1 christos sh_operand_info operand[3]; 2206 1.1 christos 2207 1.1 christos /* Some insn ignore one or more register fields, e.g. psts machl,a0. 2208 1.1 christos Make sure we encode a defined insn pattern. */ 2209 1.1 christos reg_x = 0; 2210 1.1 christos reg_y = 0; 2211 1.1 christos reg_n = 0; 2212 1.1 christos 2213 1.1 christos if (opcode->arg[0] != A_END) 2214 1.1 christos op_end = get_operands (opcode, op_end, operand); 2215 1.1 christos try_another_opcode: 2216 1.1 christos opcode = get_specific (opcode, operand); 2217 1.1 christos if (opcode == 0) 2218 1.1 christos { 2219 1.1 christos /* Couldn't find an opcode which matched the operands. */ 2220 1.1 christos char *where = frag_more (2); 2221 1.1 christos size = 2; 2222 1.1 christos 2223 1.1 christos where[0] = 0x0; 2224 1.1 christos where[1] = 0x0; 2225 1.1 christos as_bad (_("invalid operands for opcode")); 2226 1.1 christos return size; 2227 1.1 christos } 2228 1.1 christos 2229 1.1 christos if (opcode->nibbles[0] != PPI) 2230 1.1 christos as_bad (_("insn can't be combined with parallel processing insn")); 2231 1.1 christos 2232 1.1 christos switch (opcode->nibbles[1]) 2233 1.1 christos { 2234 1.1 christos 2235 1.1 christos case NOPX: 2236 1.1 christos if (movx) 2237 1.1 christos as_bad (_("multiple movx specifications")); 2238 1.1 christos movx = DDT_BASE; 2239 1.1 christos break; 2240 1.1 christos case NOPY: 2241 1.1 christos if (movy) 2242 1.1 christos as_bad (_("multiple movy specifications")); 2243 1.1 christos movy = DDT_BASE; 2244 1.1 christos break; 2245 1.1 christos 2246 1.1 christos case MOVX_NOPY: 2247 1.1 christos if (movx) 2248 1.1 christos as_bad (_("multiple movx specifications")); 2249 1.1 christos if ((reg_n < 4 || reg_n > 5) 2250 1.1 christos && (reg_n < 0 || reg_n > 1)) 2251 1.1 christos as_bad (_("invalid movx address register")); 2252 1.1 christos if (movy && movy != DDT_BASE) 2253 1.1 christos as_bad (_("insn cannot be combined with non-nopy")); 2254 1.1 christos movx = ((((reg_n & 1) != 0) << 9) 2255 1.1 christos + (((reg_n & 4) == 0) << 8) 2256 1.1 christos + (reg_x << 6) 2257 1.1 christos + (opcode->nibbles[2] << 4) 2258 1.1 christos + opcode->nibbles[3] 2259 1.1 christos + DDT_BASE); 2260 1.1 christos break; 2261 1.1 christos 2262 1.1 christos case MOVY_NOPX: 2263 1.1 christos if (movy) 2264 1.1 christos as_bad (_("multiple movy specifications")); 2265 1.1 christos if ((reg_n < 6 || reg_n > 7) 2266 1.1 christos && (reg_n < 2 || reg_n > 3)) 2267 1.1 christos as_bad (_("invalid movy address register")); 2268 1.1 christos if (movx && movx != DDT_BASE) 2269 1.1 christos as_bad (_("insn cannot be combined with non-nopx")); 2270 1.1 christos movy = ((((reg_n & 1) != 0) << 8) 2271 1.1 christos + (((reg_n & 4) == 0) << 9) 2272 1.1 christos + (reg_y << 6) 2273 1.1 christos + (opcode->nibbles[2] << 4) 2274 1.1 christos + opcode->nibbles[3] 2275 1.1 christos + DDT_BASE); 2276 1.1 christos break; 2277 1.1 christos 2278 1.1 christos case MOVX: 2279 1.1 christos if (movx) 2280 1.1 christos as_bad (_("multiple movx specifications")); 2281 1.1 christos if (movy & 0x2ac) 2282 1.1 christos as_bad (_("previous movy requires nopx")); 2283 1.1 christos if (reg_n < 4 || reg_n > 5) 2284 1.1 christos as_bad (_("invalid movx address register")); 2285 1.1 christos if (opcode->nibbles[2] & 8) 2286 1.1 christos { 2287 1.1 christos if (reg_m == A_A1_NUM) 2288 1.1 christos movx = 1 << 7; 2289 1.1 christos else if (reg_m != A_A0_NUM) 2290 1.1 christos as_bad (_("invalid movx dsp register")); 2291 1.1 christos } 2292 1.1 christos else 2293 1.1 christos { 2294 1.1 christos if (reg_x > 1) 2295 1.1 christos as_bad (_("invalid movx dsp register")); 2296 1.1 christos movx = reg_x << 7; 2297 1.1 christos } 2298 1.1 christos movx += ((reg_n - 4) << 9) + (opcode->nibbles[2] << 2) + DDT_BASE; 2299 1.1 christos break; 2300 1.1 christos 2301 1.1 christos case MOVY: 2302 1.1 christos if (movy) 2303 1.1 christos as_bad (_("multiple movy specifications")); 2304 1.1 christos if (movx & 0x153) 2305 1.1 christos as_bad (_("previous movx requires nopy")); 2306 1.1 christos if (opcode->nibbles[2] & 8) 2307 1.1 christos { 2308 1.1 christos /* Bit 3 in nibbles[2] is intended for bit 4 of the opcode, 2309 1.1 christos so add 8 more. */ 2310 1.1 christos movy = 8; 2311 1.1 christos if (reg_m == A_A1_NUM) 2312 1.1 christos movy += 1 << 6; 2313 1.1 christos else if (reg_m != A_A0_NUM) 2314 1.1 christos as_bad (_("invalid movy dsp register")); 2315 1.1 christos } 2316 1.1 christos else 2317 1.1 christos { 2318 1.1 christos if (reg_y > 1) 2319 1.1 christos as_bad (_("invalid movy dsp register")); 2320 1.1 christos movy = reg_y << 6; 2321 1.1 christos } 2322 1.1 christos if (reg_n < 6 || reg_n > 7) 2323 1.1 christos as_bad (_("invalid movy address register")); 2324 1.1 christos movy += ((reg_n - 6) << 8) + opcode->nibbles[2] + DDT_BASE; 2325 1.1 christos break; 2326 1.1 christos 2327 1.1 christos case PSH: 2328 1.1 christos if (operand[0].immediate.X_op != O_constant) 2329 1.1 christos as_bad (_("dsp immediate shift value not constant")); 2330 1.1 christos field_b = ((opcode->nibbles[2] << 12) 2331 1.1 christos | (operand[0].immediate.X_add_number & 127) << 4 2332 1.1 christos | reg_n); 2333 1.1 christos break; 2334 1.1 christos case PPI3NC: 2335 1.1 christos if (cond) 2336 1.1 christos { 2337 1.1 christos opcode++; 2338 1.1 christos goto try_another_opcode; 2339 1.1 christos } 2340 1.1 christos /* Fall through. */ 2341 1.1 christos case PPI3: 2342 1.1 christos if (field_b) 2343 1.1 christos as_bad (_("multiple parallel processing specifications")); 2344 1.1 christos field_b = ((opcode->nibbles[2] << 12) + (opcode->nibbles[3] << 8) 2345 1.1 christos + (reg_x << 6) + (reg_y << 4) + reg_n); 2346 1.1 christos switch (opcode->nibbles[4]) 2347 1.1 christos { 2348 1.1 christos case HEX_0: 2349 1.1 christos case HEX_XX00: 2350 1.1 christos case HEX_00YY: 2351 1.1 christos break; 2352 1.1 christos case HEX_1: 2353 1.1 christos case HEX_4: 2354 1.1 christos field_b += opcode->nibbles[4] << 4; 2355 1.1 christos break; 2356 1.1 christos default: 2357 1.1 christos abort (); 2358 1.1 christos } 2359 1.1 christos break; 2360 1.1 christos case PDC: 2361 1.1 christos if (cond) 2362 1.1 christos as_bad (_("multiple condition specifications")); 2363 1.1 christos cond = opcode->nibbles[2] << 8; 2364 1.1 christos if (*op_end) 2365 1.1 christos goto skip_cond_check; 2366 1.1 christos break; 2367 1.1 christos case PPIC: 2368 1.1 christos if (field_b) 2369 1.1 christos as_bad (_("multiple parallel processing specifications")); 2370 1.1 christos field_b = ((opcode->nibbles[2] << 12) + (opcode->nibbles[3] << 8) 2371 1.1 christos + cond + (reg_x << 6) + (reg_y << 4) + reg_n); 2372 1.1 christos cond = 0; 2373 1.1 christos switch (opcode->nibbles[4]) 2374 1.1 christos { 2375 1.1 christos case HEX_0: 2376 1.1 christos case HEX_XX00: 2377 1.1 christos case HEX_00YY: 2378 1.1 christos break; 2379 1.1 christos case HEX_1: 2380 1.1 christos case HEX_4: 2381 1.1 christos field_b += opcode->nibbles[4] << 4; 2382 1.1 christos break; 2383 1.1 christos default: 2384 1.1 christos abort (); 2385 1.1 christos } 2386 1.1 christos break; 2387 1.1 christos case PMUL: 2388 1.1 christos if (field_b) 2389 1.1 christos { 2390 1.1 christos if ((field_b & 0xef00) == 0xa100) 2391 1.1 christos field_b -= 0x8100; 2392 1.1 christos /* pclr Dz pmuls Se,Sf,Dg */ 2393 1.1 christos else if ((field_b & 0xff00) == 0x8d00 2394 1.1 christos && (SH_MERGE_ARCH_SET_VALID (valid_arch, arch_sh4al_dsp_up))) 2395 1.1 christos { 2396 1.1 christos valid_arch = SH_MERGE_ARCH_SET (valid_arch, arch_sh4al_dsp_up); 2397 1.1 christos field_b -= 0x8cf0; 2398 1.1 christos } 2399 1.1 christos else 2400 1.1 christos as_bad (_("insn cannot be combined with pmuls")); 2401 1.1 christos switch (field_b & 0xf) 2402 1.1 christos { 2403 1.1 christos case A_X0_NUM: 2404 1.1 christos field_b += 0 - A_X0_NUM; 2405 1.1 christos break; 2406 1.1 christos case A_Y0_NUM: 2407 1.1 christos field_b += 1 - A_Y0_NUM; 2408 1.1 christos break; 2409 1.1 christos case A_A0_NUM: 2410 1.1 christos field_b += 2 - A_A0_NUM; 2411 1.1 christos break; 2412 1.1 christos case A_A1_NUM: 2413 1.1 christos field_b += 3 - A_A1_NUM; 2414 1.1 christos break; 2415 1.1 christos default: 2416 1.1 christos as_bad (_("bad combined pmuls output operand")); 2417 1.1 christos } 2418 1.1 christos /* Generate warning if the destination register for padd / psub 2419 1.1 christos and pmuls is the same ( only for A0 or A1 ). 2420 1.1 christos If the last nibble is 1010 then A0 is used in both 2421 1.1 christos padd / psub and pmuls. If it is 1111 then A1 is used 2422 1.1 christos as destination register in both padd / psub and pmuls. */ 2423 1.1 christos 2424 1.1 christos if ((((field_b | reg_efg) & 0x000F) == 0x000A) 2425 1.1 christos || (((field_b | reg_efg) & 0x000F) == 0x000F)) 2426 1.1 christos as_warn (_("destination register is same for parallel insns")); 2427 1.1 christos } 2428 1.1 christos field_b += 0x4000 + reg_efg; 2429 1.1 christos break; 2430 1.1 christos default: 2431 1.1 christos abort (); 2432 1.1 christos } 2433 1.1 christos if (cond) 2434 1.1 christos { 2435 1.1 christos as_bad (_("condition not followed by conditionalizable insn")); 2436 1.1 christos cond = 0; 2437 1.1 christos } 2438 1.1 christos if (! *op_end) 2439 1.1 christos break; 2440 1.1 christos skip_cond_check: 2441 1.1 christos opcode = find_cooked_opcode (&op_end); 2442 1.1 christos if (opcode == NULL) 2443 1.1 christos { 2444 1.1 christos (as_bad 2445 1.1 christos (_("unrecognized characters at end of parallel processing insn"))); 2446 1.1 christos break; 2447 1.1 christos } 2448 1.1 christos } 2449 1.1 christos 2450 1.1 christos move_code = movx | movy; 2451 1.1 christos if (field_b) 2452 1.8 christos { 2453 1.1 christos /* Parallel processing insn. */ 2454 1.1 christos unsigned int ppi_code = (movx | movy | 0xf800) << 16 | field_b; 2455 1.1 christos 2456 1.1 christos output = frag_more (4); 2457 1.1 christos size = 4; 2458 1.1 christos if (! target_big_endian) 2459 1.1 christos { 2460 1.1 christos output[3] = ppi_code >> 8; 2461 1.1 christos output[2] = ppi_code; 2462 1.1 christos } 2463 1.1 christos else 2464 1.1 christos { 2465 1.1 christos output[2] = ppi_code >> 8; 2466 1.1 christos output[3] = ppi_code; 2467 1.1 christos } 2468 1.1 christos move_code |= 0xf800; 2469 1.1 christos } 2470 1.1 christos else 2471 1.1 christos { 2472 1.1 christos /* Just a double data transfer. */ 2473 1.1 christos output = frag_more (2); 2474 1.1 christos size = 2; 2475 1.1 christos } 2476 1.1 christos if (! target_big_endian) 2477 1.1 christos { 2478 1.1 christos output[1] = move_code >> 8; 2479 1.1 christos output[0] = move_code; 2480 1.1 christos } 2481 1.1 christos else 2482 1.1 christos { 2483 1.1 christos output[0] = move_code >> 8; 2484 1.1 christos output[1] = move_code; 2485 1.1 christos } 2486 1.1 christos return size; 2487 1.1 christos } 2488 1.1 christos 2489 1.1 christos /* This is the guts of the machine-dependent assembler. STR points to a 2490 1.1 christos machine dependent instruction. This function is supposed to emit 2491 1.1 christos the frags/bytes it assembles to. */ 2492 1.1 christos 2493 1.1 christos void 2494 1.1 christos md_assemble (char *str) 2495 1.1 christos { 2496 1.1 christos char *op_end; 2497 1.1 christos sh_operand_info operand[3]; 2498 1.1 christos sh_opcode_info *opcode; 2499 1.1 christos unsigned int size = 0; 2500 1.1 christos char *initial_str = str; 2501 1.1 christos 2502 1.1 christos opcode = find_cooked_opcode (&str); 2503 1.1 christos op_end = str; 2504 1.1 christos 2505 1.1 christos if (opcode == NULL) 2506 1.1 christos { 2507 1.1 christos /* The opcode is not in the hash table. 2508 1.1 christos This means we definitely have an assembly failure, 2509 1.1 christos but the instruction may be valid in another CPU variant. 2510 1.1 christos In this case emit something better than 'unknown opcode'. 2511 1.1 christos Search the full table in sh-opc.h to check. */ 2512 1.1 christos 2513 1.1 christos char *name = initial_str; 2514 1.8 christos int name_length = 0; 2515 1.1 christos const sh_opcode_info *op; 2516 1.7 christos bool found = false; 2517 1.10 christos 2518 1.7 christos /* Identify opcode in string. */ 2519 1.7 christos while (is_whitespace (*name)) 2520 1.10 christos name++; 2521 1.10 christos 2522 1.7 christos while (!is_end_of_stmt (name[name_length]) 2523 1.1 christos && !is_whitespace (name[name_length])) 2524 1.7 christos name_length++; 2525 1.1 christos 2526 1.1 christos /* Search for opcode in full list. */ 2527 1.1 christos for (op = sh_table; op->name; op++) 2528 1.1 christos { 2529 1.1 christos if (strncasecmp (op->name, name, name_length) == 0 2530 1.8 christos && op->name[name_length] == '\0') 2531 1.1 christos { 2532 1.1 christos found = true; 2533 1.1 christos break; 2534 1.1 christos } 2535 1.7 christos } 2536 1.7 christos 2537 1.1 christos if (found) 2538 1.7 christos as_bad (_("opcode not valid for this cpu variant")); 2539 1.7 christos else 2540 1.1 christos as_bad (_("unknown opcode")); 2541 1.1 christos 2542 1.1 christos return; 2543 1.1 christos } 2544 1.1 christos 2545 1.1 christos if (sh_relax 2546 1.1 christos && ! seg_info (now_seg)->tc_segment_info_data.in_code) 2547 1.1 christos { 2548 1.1 christos /* Output a CODE reloc to tell the linker that the following 2549 1.1 christos bytes are instructions, not data. */ 2550 1.1 christos fix_new (frag_now, frag_now_fix (), 2, &abs_symbol, 0, 0, 2551 1.1 christos BFD_RELOC_SH_CODE); 2552 1.1 christos seg_info (now_seg)->tc_segment_info_data.in_code = 1; 2553 1.1 christos } 2554 1.1 christos 2555 1.1 christos if (opcode->nibbles[0] == PPI) 2556 1.1 christos { 2557 1.1 christos size = assemble_ppi (op_end, opcode); 2558 1.1 christos } 2559 1.1 christos else 2560 1.1 christos { 2561 1.1 christos if (opcode->arg[0] == A_BDISP12 2562 1.1 christos || opcode->arg[0] == A_BDISP8) 2563 1.1 christos { 2564 1.1 christos /* Since we skip get_specific here, we have to check & update 2565 1.1 christos valid_arch now. */ 2566 1.1 christos if (SH_MERGE_ARCH_SET_VALID (valid_arch, opcode->arch)) 2567 1.1 christos valid_arch = SH_MERGE_ARCH_SET (valid_arch, opcode->arch); 2568 1.1 christos else 2569 1.1 christos as_bad (_("Delayed branches not available on SH1")); 2570 1.1 christos parse_exp (op_end + 1, &operand[0]); 2571 1.1 christos build_relax (opcode, &operand[0]); 2572 1.1 christos 2573 1.1 christos /* All branches are currently 16 bit. */ 2574 1.1 christos size = 2; 2575 1.1 christos } 2576 1.1 christos else 2577 1.1 christos { 2578 1.1 christos if (opcode->arg[0] == A_END) 2579 1.1 christos { 2580 1.10 christos /* Ignore trailing whitespace. If there is any, it has already 2581 1.1 christos been compressed to a single space. */ 2582 1.1 christos if (is_whitespace (*op_end)) 2583 1.1 christos op_end++; 2584 1.1 christos } 2585 1.1 christos else 2586 1.1 christos { 2587 1.1 christos op_end = get_operands (opcode, op_end, operand); 2588 1.1 christos } 2589 1.1 christos opcode = get_specific (opcode, operand); 2590 1.1 christos 2591 1.1 christos if (opcode == 0) 2592 1.1 christos { 2593 1.1 christos /* Couldn't find an opcode which matched the operands. */ 2594 1.1 christos char *where = frag_more (2); 2595 1.1 christos size = 2; 2596 1.1 christos 2597 1.1 christos where[0] = 0x0; 2598 1.1 christos where[1] = 0x0; 2599 1.1 christos as_bad (_("invalid operands for opcode")); 2600 1.1 christos } 2601 1.1 christos else 2602 1.1 christos { 2603 1.1 christos if (*op_end) 2604 1.1 christos as_bad (_("excess operands: '%s'"), op_end); 2605 1.1 christos 2606 1.1 christos size = build_Mytes (opcode, operand); 2607 1.1 christos } 2608 1.1 christos } 2609 1.1 christos } 2610 1.1 christos 2611 1.1 christos dwarf2_emit_insn (size); 2612 1.1 christos } 2613 1.1 christos 2614 1.1 christos /* This routine is called each time a label definition is seen. It 2615 1.1 christos emits a BFD_RELOC_SH_LABEL reloc if necessary. */ 2616 1.1 christos 2617 1.1 christos void 2618 1.1 christos sh_frob_label (symbolS *sym) 2619 1.1 christos { 2620 1.1 christos static fragS *last_label_frag; 2621 1.1 christos static int last_label_offset; 2622 1.1 christos 2623 1.1 christos if (sh_relax 2624 1.1 christos && seg_info (now_seg)->tc_segment_info_data.in_code) 2625 1.1 christos { 2626 1.1 christos int offset; 2627 1.1 christos 2628 1.1 christos offset = frag_now_fix (); 2629 1.1 christos if (frag_now != last_label_frag 2630 1.1 christos || offset != last_label_offset) 2631 1.1 christos { 2632 1.1 christos fix_new (frag_now, offset, 2, &abs_symbol, 0, 0, BFD_RELOC_SH_LABEL); 2633 1.1 christos last_label_frag = frag_now; 2634 1.1 christos last_label_offset = offset; 2635 1.1 christos } 2636 1.1 christos } 2637 1.1 christos 2638 1.1 christos dwarf2_emit_label (sym); 2639 1.1 christos } 2640 1.1 christos 2641 1.1 christos /* This routine is called when the assembler is about to output some 2642 1.1 christos data. It emits a BFD_RELOC_SH_DATA reloc if necessary. */ 2643 1.1 christos 2644 1.1 christos void 2645 1.1 christos sh_flush_pending_output (void) 2646 1.1 christos { 2647 1.1 christos if (sh_relax 2648 1.1 christos && seg_info (now_seg)->tc_segment_info_data.in_code) 2649 1.1 christos { 2650 1.1 christos fix_new (frag_now, frag_now_fix (), 2, &abs_symbol, 0, 0, 2651 1.1 christos BFD_RELOC_SH_DATA); 2652 1.1 christos seg_info (now_seg)->tc_segment_info_data.in_code = 0; 2653 1.1 christos } 2654 1.1 christos } 2655 1.1 christos 2656 1.1 christos symbolS * 2657 1.1 christos md_undefined_symbol (char *name ATTRIBUTE_UNUSED) 2658 1.1 christos { 2659 1.1 christos return 0; 2660 1.1 christos } 2661 1.1 christos 2662 1.5 christos /* Various routines to kill one day. */ 2663 1.1 christos 2664 1.1 christos const char * 2665 1.1 christos md_atof (int type, char *litP, int *sizeP) 2666 1.1 christos { 2667 1.1 christos return ieee_md_atof (type, litP, sizeP, target_big_endian); 2668 1.1 christos } 2669 1.1 christos 2670 1.1 christos /* Handle the .uses pseudo-op. This pseudo-op is used just before a 2671 1.1 christos call instruction. It refers to a label of the instruction which 2672 1.1 christos loads the register which the call uses. We use it to generate a 2673 1.1 christos special reloc for the linker. */ 2674 1.1 christos 2675 1.1 christos static void 2676 1.1 christos s_uses (int ignore ATTRIBUTE_UNUSED) 2677 1.1 christos { 2678 1.1 christos expressionS ex; 2679 1.1 christos 2680 1.1 christos if (! sh_relax) 2681 1.1 christos as_warn (_(".uses pseudo-op seen when not relaxing")); 2682 1.1 christos 2683 1.1 christos expression (&ex); 2684 1.1 christos 2685 1.1 christos if (ex.X_op != O_symbol || ex.X_add_number != 0) 2686 1.1 christos { 2687 1.1 christos as_bad (_("bad .uses format")); 2688 1.1 christos ignore_rest_of_line (); 2689 1.1 christos return; 2690 1.1 christos } 2691 1.1 christos 2692 1.1 christos fix_new_exp (frag_now, frag_now_fix (), 2, &ex, 1, BFD_RELOC_SH_USES); 2693 1.1 christos 2694 1.1 christos demand_empty_rest_of_line (); 2695 1.1 christos } 2696 1.1 christos 2697 1.1 christos enum options 2699 1.1 christos { 2700 1.1 christos OPTION_RELAX = OPTION_MD_BASE, 2701 1.1 christos OPTION_BIG, 2702 1.1 christos OPTION_LITTLE, 2703 1.1 christos OPTION_SMALL, 2704 1.1 christos OPTION_DSP, 2705 1.1 christos OPTION_ISA, 2706 1.1 christos OPTION_RENESAS, 2707 1.1 christos OPTION_ALLOW_REG_PREFIX, 2708 1.1 christos OPTION_H_TICK_HEX, 2709 1.1 christos #ifdef OBJ_ELF 2710 1.1 christos OPTION_FDPIC, 2711 1.1 christos #endif 2712 1.10 christos OPTION_DUMMY /* Not used. This is just here to make it easy to add and subtract options from this enum. */ 2713 1.10 christos }; 2714 1.1 christos 2715 1.1 christos const char md_shortopts[] = ""; 2716 1.1 christos const struct option md_longopts[] = 2717 1.1 christos { 2718 1.1 christos {"relax", no_argument, NULL, OPTION_RELAX}, 2719 1.1 christos {"big", no_argument, NULL, OPTION_BIG}, 2720 1.1 christos {"little", no_argument, NULL, OPTION_LITTLE}, 2721 1.1 christos /* The next two switches are here because the 2722 1.1 christos generic parts of the linker testsuite uses them. */ 2723 1.1 christos {"EB", no_argument, NULL, OPTION_BIG}, 2724 1.1 christos {"EL", no_argument, NULL, OPTION_LITTLE}, 2725 1.1 christos {"small", no_argument, NULL, OPTION_SMALL}, 2726 1.1 christos {"dsp", no_argument, NULL, OPTION_DSP}, 2727 1.1 christos {"isa", required_argument, NULL, OPTION_ISA}, 2728 1.1 christos {"renesas", no_argument, NULL, OPTION_RENESAS}, 2729 1.1 christos {"allow-reg-prefix", no_argument, NULL, OPTION_ALLOW_REG_PREFIX}, 2730 1.1 christos 2731 1.1 christos { "h-tick-hex", no_argument, NULL, OPTION_H_TICK_HEX }, 2732 1.1 christos 2733 1.1 christos #ifdef OBJ_ELF 2734 1.1 christos {"fdpic", no_argument, NULL, OPTION_FDPIC}, 2735 1.1 christos #endif 2736 1.10 christos 2737 1.1 christos {NULL, no_argument, NULL, 0} 2738 1.1 christos }; 2739 1.5 christos const size_t md_longopts_size = sizeof (md_longopts); 2740 1.1 christos 2741 1.1 christos int 2742 1.1 christos md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED) 2743 1.1 christos { 2744 1.1 christos switch (c) 2745 1.1 christos { 2746 1.1 christos case OPTION_RELAX: 2747 1.1 christos sh_relax = 1; 2748 1.1 christos break; 2749 1.1 christos 2750 1.1 christos case OPTION_BIG: 2751 1.1 christos target_big_endian = 1; 2752 1.1 christos break; 2753 1.1 christos 2754 1.1 christos case OPTION_LITTLE: 2755 1.1 christos target_big_endian = 0; 2756 1.1 christos break; 2757 1.1 christos 2758 1.1 christos case OPTION_SMALL: 2759 1.1 christos sh_small = 1; 2760 1.1 christos break; 2761 1.1 christos 2762 1.1 christos case OPTION_DSP: 2763 1.1 christos preset_target_arch = arch_sh_up & ~(arch_sh_sp_fpu|arch_sh_dp_fpu); 2764 1.1 christos break; 2765 1.1 christos 2766 1.1 christos case OPTION_RENESAS: 2767 1.1 christos dont_adjust_reloc_32 = 1; 2768 1.1 christos break; 2769 1.1 christos 2770 1.1 christos case OPTION_ALLOW_REG_PREFIX: 2771 1.1 christos allow_dollar_register_prefix = 1; 2772 1.1 christos break; 2773 1.1 christos 2774 1.1 christos case OPTION_ISA: 2775 1.1 christos if (strcasecmp (arg, "dsp") == 0) 2776 1.1 christos preset_target_arch = arch_sh_up & ~(arch_sh_sp_fpu|arch_sh_dp_fpu); 2777 1.1 christos else if (strcasecmp (arg, "fp") == 0) 2778 1.1 christos preset_target_arch = arch_sh_up & ~arch_sh_has_dsp; 2779 1.1 christos else if (strcasecmp (arg, "any") == 0) 2780 1.1 christos preset_target_arch = arch_sh_up; 2781 1.1 christos else 2782 1.1 christos { 2783 1.1 christos extern const bfd_arch_info_type bfd_sh_arch; 2784 1.1 christos bfd_arch_info_type const *bfd_arch = &bfd_sh_arch; 2785 1.1 christos 2786 1.1 christos preset_target_arch = 0; 2787 1.3 christos for (; bfd_arch; bfd_arch=bfd_arch->next) 2788 1.1 christos { 2789 1.1 christos int len = strlen(bfd_arch->printable_name); 2790 1.1 christos 2791 1.1 christos if (strncasecmp (bfd_arch->printable_name, arg, len) != 0) 2792 1.1 christos continue; 2793 1.1 christos 2794 1.1 christos if (arg[len] == '\0') 2795 1.1 christos preset_target_arch = 2796 1.1 christos sh_get_arch_from_bfd_mach (bfd_arch->mach); 2797 1.1 christos else if (strcasecmp(&arg[len], "-up") == 0) 2798 1.1 christos preset_target_arch = 2799 1.1 christos sh_get_arch_up_from_bfd_mach (bfd_arch->mach); 2800 1.1 christos else 2801 1.3 christos continue; 2802 1.1 christos break; 2803 1.1 christos } 2804 1.1 christos 2805 1.1 christos if (!preset_target_arch) 2806 1.1 christos as_bad (_("Invalid argument to --isa option: %s"), arg); 2807 1.1 christos } 2808 1.1 christos break; 2809 1.1 christos 2810 1.1 christos case OPTION_H_TICK_HEX: 2811 1.1 christos enable_h_tick_hex = 1; 2812 1.1 christos break; 2813 1.8 christos 2814 1.1 christos #ifdef OBJ_ELF 2815 1.1 christos case OPTION_FDPIC: 2816 1.1 christos sh_fdpic = true; 2817 1.1 christos break; 2818 1.1 christos #endif /* OBJ_ELF */ 2819 1.1 christos 2820 1.1 christos default: 2821 1.1 christos return 0; 2822 1.1 christos } 2823 1.1 christos 2824 1.1 christos return 1; 2825 1.1 christos } 2826 1.1 christos 2827 1.1 christos void 2828 1.1 christos md_show_usage (FILE *stream) 2829 1.1 christos { 2830 1.1 christos fprintf (stream, _("\ 2831 1.1 christos SH options:\n\ 2832 1.1 christos --little generate little endian code\n\ 2833 1.1 christos --big generate big endian code\n\ 2834 1.1 christos --relax alter jump instructions for long displacements\n\ 2835 1.1 christos --renesas disable optimization with section symbol for\n\ 2836 1.1 christos compatibility with Renesas assembler.\n\ 2837 1.1 christos --small align sections to 4 byte boundaries, not 16\n\ 2838 1.1 christos --dsp enable sh-dsp insns, and disable floating-point ISAs.\n\ 2839 1.1 christos --allow-reg-prefix allow '$' as a register name prefix.\n\ 2840 1.1 christos --isa=[any use most appropriate isa\n\ 2841 1.1 christos | dsp same as '-dsp'\n\ 2842 1.1 christos | fp")); 2843 1.1 christos { 2844 1.1 christos extern const bfd_arch_info_type bfd_sh_arch; 2845 1.6 christos bfd_arch_info_type const *bfd_arch = &bfd_sh_arch; 2846 1.6 christos 2847 1.6 christos for (; bfd_arch; bfd_arch=bfd_arch->next) 2848 1.6 christos { 2849 1.1 christos fprintf (stream, "\n | %s", bfd_arch->printable_name); 2850 1.1 christos fprintf (stream, "\n | %s-up", bfd_arch->printable_name); 2851 1.1 christos } 2852 1.1 christos } 2853 1.1 christos fprintf (stream, "]\n"); 2854 1.1 christos #ifdef OBJ_ELF 2855 1.1 christos fprintf (stream, _("\ 2856 1.1 christos --fdpic generate an FDPIC object file\n")); 2857 1.1 christos #endif /* OBJ_ELF */ 2858 1.1 christos } 2859 1.1 christos 2860 1.1 christos /* This struct is used to pass arguments to sh_count_relocs through 2862 1.1 christos bfd_map_over_sections. */ 2863 1.1 christos 2864 1.1 christos struct sh_count_relocs 2865 1.1 christos { 2866 1.1 christos /* Symbol we are looking for. */ 2867 1.1 christos symbolS *sym; 2868 1.1 christos /* Count of relocs found. */ 2869 1.1 christos int count; 2870 1.1 christos }; 2871 1.1 christos 2872 1.1 christos /* Count the number of fixups in a section which refer to a particular 2873 1.1 christos symbol. This is called via bfd_map_over_sections. */ 2874 1.10 christos 2875 1.1 christos static void 2876 1.1 christos sh_count_relocs (bfd *abfd ATTRIBUTE_UNUSED, segT sec, void *data) 2877 1.1 christos { 2878 1.1 christos struct sh_count_relocs *info = data; 2879 1.1 christos segment_info_type *seginfo; 2880 1.1 christos symbolS *sym; 2881 1.1 christos fixS *fix; 2882 1.1 christos 2883 1.1 christos seginfo = seg_info (sec); 2884 1.1 christos if (seginfo == NULL) 2885 1.1 christos return; 2886 1.1 christos 2887 1.1 christos sym = info->sym; 2888 1.1 christos for (fix = seginfo->fix_root; fix != NULL; fix = fix->fx_next) 2889 1.1 christos { 2890 1.1 christos if (fix->fx_addsy == sym) 2891 1.1 christos { 2892 1.1 christos ++info->count; 2893 1.1 christos fix->fx_tcbit = 1; 2894 1.1 christos } 2895 1.1 christos } 2896 1.1 christos } 2897 1.1 christos 2898 1.1 christos /* Handle the count relocs for a particular section. 2899 1.1 christos This is called via bfd_map_over_sections. */ 2900 1.1 christos 2901 1.1 christos static void 2902 1.1 christos sh_frob_section (bfd *abfd ATTRIBUTE_UNUSED, segT sec, 2903 1.1 christos void *ignore ATTRIBUTE_UNUSED) 2904 1.1 christos { 2905 1.1 christos segment_info_type *seginfo; 2906 1.1 christos fixS *fix; 2907 1.1 christos 2908 1.1 christos seginfo = seg_info (sec); 2909 1.1 christos if (seginfo == NULL) 2910 1.1 christos return; 2911 1.1 christos 2912 1.1 christos for (fix = seginfo->fix_root; fix != NULL; fix = fix->fx_next) 2913 1.1 christos { 2914 1.1 christos symbolS *sym; 2915 1.1 christos bfd_vma val; 2916 1.1 christos fixS *fscan; 2917 1.1 christos struct sh_count_relocs info; 2918 1.1 christos 2919 1.1 christos if (fix->fx_r_type != BFD_RELOC_SH_USES) 2920 1.1 christos continue; 2921 1.1 christos 2922 1.1 christos /* The BFD_RELOC_SH_USES reloc should refer to a defined local 2923 1.1 christos symbol in the same section. */ 2924 1.1 christos sym = fix->fx_addsy; 2925 1.1 christos if (sym == NULL 2926 1.1 christos || fix->fx_subsy != NULL 2927 1.1 christos || fix->fx_addnumber != 0 2928 1.1 christos || S_GET_SEGMENT (sym) != sec 2929 1.1 christos || S_IS_EXTERNAL (sym)) 2930 1.1 christos { 2931 1.1 christos as_warn_where (fix->fx_file, fix->fx_line, 2932 1.1 christos _(".uses does not refer to a local symbol in the same section")); 2933 1.1 christos continue; 2934 1.1 christos } 2935 1.1 christos 2936 1.1 christos /* Look through the fixups again, this time looking for one 2937 1.1 christos at the same location as sym. */ 2938 1.1 christos val = S_GET_VALUE (sym); 2939 1.1 christos for (fscan = seginfo->fix_root; 2940 1.1 christos fscan != NULL; 2941 1.1 christos fscan = fscan->fx_next) 2942 1.1 christos if (val == fscan->fx_frag->fr_address + fscan->fx_where 2943 1.1 christos && fscan->fx_r_type != BFD_RELOC_SH_ALIGN 2944 1.1 christos && fscan->fx_r_type != BFD_RELOC_SH_CODE 2945 1.1 christos && fscan->fx_r_type != BFD_RELOC_SH_DATA 2946 1.1 christos && fscan->fx_r_type != BFD_RELOC_SH_LABEL) 2947 1.1 christos break; 2948 1.1 christos if (fscan == NULL) 2949 1.1 christos { 2950 1.1 christos as_warn_where (fix->fx_file, fix->fx_line, 2951 1.1 christos _("can't find fixup pointed to by .uses")); 2952 1.1 christos continue; 2953 1.1 christos } 2954 1.1 christos 2955 1.1 christos if (fscan->fx_tcbit) 2956 1.1 christos { 2957 1.1 christos /* We've already done this one. */ 2958 1.1 christos continue; 2959 1.1 christos } 2960 1.1 christos 2961 1.1 christos /* The variable fscan should also be a fixup to a local symbol 2962 1.1 christos in the same section. */ 2963 1.1 christos sym = fscan->fx_addsy; 2964 1.1 christos if (sym == NULL 2965 1.1 christos || fscan->fx_subsy != NULL 2966 1.1 christos || fscan->fx_addnumber != 0 2967 1.1 christos || S_GET_SEGMENT (sym) != sec 2968 1.1 christos || S_IS_EXTERNAL (sym)) 2969 1.1 christos { 2970 1.1 christos as_warn_where (fix->fx_file, fix->fx_line, 2971 1.1 christos _(".uses target does not refer to a local symbol in the same section")); 2972 1.1 christos continue; 2973 1.1 christos } 2974 1.1 christos 2975 1.1 christos /* Now we look through all the fixups of all the sections, 2976 1.1 christos counting the number of times we find a reference to sym. */ 2977 1.1 christos info.sym = sym; 2978 1.1 christos info.count = 0; 2979 1.1 christos bfd_map_over_sections (stdoutput, sh_count_relocs, &info); 2980 1.1 christos 2981 1.1 christos if (info.count < 1) 2982 1.1 christos abort (); 2983 1.1 christos 2984 1.1 christos /* Generate a BFD_RELOC_SH_COUNT fixup at the location of sym. 2985 1.1 christos We have already adjusted the value of sym to include the 2986 1.1 christos fragment address, so we undo that adjustment here. */ 2987 1.1 christos subseg_change (sec, 0); 2988 1.1 christos fix_new (fscan->fx_frag, 2989 1.1 christos S_GET_VALUE (sym) - fscan->fx_frag->fr_address, 2990 1.1 christos 4, &abs_symbol, info.count, 0, BFD_RELOC_SH_COUNT); 2991 1.1 christos } 2992 1.1 christos } 2993 1.1 christos 2994 1.1 christos /* This function is called after the symbol table has been completed, 2995 1.1 christos but before the relocs or section contents have been written out. 2996 1.1 christos If we have seen any .uses pseudo-ops, they point to an instruction 2997 1.1 christos which loads a register with the address of a function. We look 2998 1.1 christos through the fixups to find where the function address is being 2999 1.1 christos loaded from. We then generate a COUNT reloc giving the number of 3000 1.1 christos times that function address is referred to. The linker uses this 3001 1.1 christos information when doing relaxing, to decide when it can eliminate 3002 1.1 christos the stored function address entirely. */ 3003 1.1 christos 3004 1.1 christos void 3005 1.1 christos sh_frob_file (void) 3006 1.1 christos { 3007 1.1 christos if (! sh_relax) 3008 1.1 christos return; 3009 1.1 christos 3010 1.1 christos bfd_map_over_sections (stdoutput, sh_frob_section, NULL); 3011 1.1 christos } 3012 1.1 christos 3013 1.1 christos /* Called after relaxing. Set the correct sizes of the fragments, and 3014 1.1 christos create relocs so that md_apply_fix will fill in the correct values. */ 3015 1.1 christos 3016 1.1 christos void 3017 1.1 christos md_convert_frag (bfd *headers ATTRIBUTE_UNUSED, segT seg, fragS *fragP) 3018 1.1 christos { 3019 1.1 christos int donerelax = 0; 3020 1.1 christos 3021 1.1 christos switch (fragP->fr_subtype) 3022 1.1 christos { 3023 1.1 christos case C (COND_JUMP, COND8): 3024 1.1 christos case C (COND_JUMP_DELAY, COND8): 3025 1.1 christos fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset, 3026 1.1 christos 1, BFD_RELOC_SH_PCDISP8BY2); 3027 1.1 christos fragP->fr_fix += 2; 3028 1.1 christos fragP->fr_var = 0; 3029 1.1 christos break; 3030 1.1 christos 3031 1.1 christos case C (UNCOND_JUMP, UNCOND12): 3032 1.1 christos fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset, 3033 1.1 christos 1, BFD_RELOC_SH_PCDISP12BY2); 3034 1.1 christos fragP->fr_fix += 2; 3035 1.1 christos fragP->fr_var = 0; 3036 1.1 christos break; 3037 1.1 christos 3038 1.1 christos case C (UNCOND_JUMP, UNCOND32): 3039 1.1 christos case C (UNCOND_JUMP, UNDEF_WORD_DISP): 3040 1.1 christos if (fragP->fr_symbol == NULL) 3041 1.1 christos as_bad_where (fragP->fr_file, fragP->fr_line, 3042 1.1 christos _("displacement overflows 12-bit field")); 3043 1.1 christos else if (S_IS_DEFINED (fragP->fr_symbol)) 3044 1.1 christos as_bad_where (fragP->fr_file, fragP->fr_line, 3045 1.1 christos _("displacement to defined symbol %s overflows 12-bit field"), 3046 1.1 christos S_GET_NAME (fragP->fr_symbol)); 3047 1.1 christos else 3048 1.1 christos as_bad_where (fragP->fr_file, fragP->fr_line, 3049 1.1 christos _("displacement to undefined symbol %s overflows 12-bit field"), 3050 1.1 christos S_GET_NAME (fragP->fr_symbol)); 3051 1.1 christos /* Stabilize this frag, so we don't trip an assert. */ 3052 1.1 christos fragP->fr_fix += fragP->fr_var; 3053 1.1 christos fragP->fr_var = 0; 3054 1.1 christos break; 3055 1.1 christos 3056 1.1 christos case C (COND_JUMP, COND12): 3057 1.1 christos case C (COND_JUMP_DELAY, COND12): 3058 1.1 christos /* A bcond won't fit, so turn it into a b!cond; bra disp; nop. */ 3059 1.1 christos /* I found that a relax failure for gcc.c-torture/execute/930628-1.c 3060 1.1 christos was due to gas incorrectly relaxing an out-of-range conditional 3061 1.1 christos branch with delay slot. It turned: 3062 1.1 christos bf.s L6 (slot mov.l r12,@(44,r0)) 3063 1.1 christos into: 3064 1.1 christos 3065 1.1 christos 2c: 8f 01 a0 8b bf.s 32 <_main+32> (slot bra L6) 3066 1.1 christos 30: 00 09 nop 3067 1.1 christos 32: 10 cb mov.l r12,@(44,r0) 3068 1.8 christos Therefore, branches with delay slots have to be handled 3069 1.1 christos differently from ones without delay slots. */ 3070 1.1 christos { 3071 1.1 christos unsigned char *buffer = 3072 1.1 christos (unsigned char *) (fragP->fr_fix + &fragP->fr_literal[0]); 3073 1.1 christos int highbyte = target_big_endian ? 0 : 1; 3074 1.1 christos int lowbyte = target_big_endian ? 1 : 0; 3075 1.1 christos int delay = fragP->fr_subtype == C (COND_JUMP_DELAY, COND12); 3076 1.1 christos 3077 1.1 christos /* Toggle the true/false bit of the bcond. */ 3078 1.1 christos buffer[highbyte] ^= 0x2; 3079 1.1 christos 3080 1.1 christos /* If this is a delayed branch, we may not put the bra in the 3081 1.1 christos slot. So we change it to a non-delayed branch, like that: 3082 1.1 christos b! cond slot_label; bra disp; slot_label: slot_insn 3083 1.1 christos ??? We should try if swapping the conditional branch and 3084 1.1 christos its delay-slot insn already makes the branch reach. */ 3085 1.1 christos 3086 1.1 christos /* Build a relocation to six / four bytes farther on. */ 3087 1.1 christos fix_new (fragP, fragP->fr_fix, 2, section_symbol (seg), 3088 1.1 christos fragP->fr_address + fragP->fr_fix + (delay ? 4 : 6), 3089 1.1 christos 1, BFD_RELOC_SH_PCDISP8BY2); 3090 1.1 christos 3091 1.1 christos /* Set up a jump instruction. */ 3092 1.1 christos buffer[highbyte + 2] = 0xa0; 3093 1.1 christos buffer[lowbyte + 2] = 0; 3094 1.1 christos fix_new (fragP, fragP->fr_fix + 2, 2, fragP->fr_symbol, 3095 1.1 christos fragP->fr_offset, 1, BFD_RELOC_SH_PCDISP12BY2); 3096 1.1 christos 3097 1.1 christos if (delay) 3098 1.1 christos { 3099 1.1 christos buffer[highbyte] &= ~0x4; /* Removes delay slot from branch. */ 3100 1.1 christos fragP->fr_fix += 4; 3101 1.1 christos } 3102 1.1 christos else 3103 1.1 christos { 3104 1.1 christos /* Fill in a NOP instruction. */ 3105 1.1 christos buffer[highbyte + 4] = 0x0; 3106 1.1 christos buffer[lowbyte + 4] = 0x9; 3107 1.1 christos 3108 1.1 christos fragP->fr_fix += 6; 3109 1.1 christos } 3110 1.1 christos fragP->fr_var = 0; 3111 1.1 christos donerelax = 1; 3112 1.1 christos } 3113 1.1 christos break; 3114 1.1 christos 3115 1.1 christos case C (COND_JUMP, COND32): 3116 1.1 christos case C (COND_JUMP_DELAY, COND32): 3117 1.1 christos case C (COND_JUMP, UNDEF_WORD_DISP): 3118 1.1 christos case C (COND_JUMP_DELAY, UNDEF_WORD_DISP): 3119 1.1 christos if (fragP->fr_symbol == NULL) 3120 1.1 christos as_bad_where (fragP->fr_file, fragP->fr_line, 3121 1.1 christos _("displacement overflows 8-bit field")); 3122 1.1 christos else if (S_IS_DEFINED (fragP->fr_symbol)) 3123 1.1 christos as_bad_where (fragP->fr_file, fragP->fr_line, 3124 1.1 christos _("displacement to defined symbol %s overflows 8-bit field"), 3125 1.1 christos S_GET_NAME (fragP->fr_symbol)); 3126 1.1 christos else 3127 1.1 christos as_bad_where (fragP->fr_file, fragP->fr_line, 3128 1.1 christos _("displacement to undefined symbol %s overflows 8-bit field "), 3129 1.1 christos S_GET_NAME (fragP->fr_symbol)); 3130 1.1 christos /* Stabilize this frag, so we don't trip an assert. */ 3131 1.1 christos fragP->fr_fix += fragP->fr_var; 3132 1.1 christos fragP->fr_var = 0; 3133 1.1 christos break; 3134 1.1 christos 3135 1.1 christos default: 3136 1.1 christos abort (); 3137 1.1 christos } 3138 1.1 christos 3139 1.1 christos if (donerelax && !sh_relax) 3140 1.1 christos as_warn_where (fragP->fr_file, fragP->fr_line, 3141 1.1 christos _("overflow in branch to %s; converted into longer instruction sequence"), 3142 1.1 christos (fragP->fr_symbol != NULL 3143 1.1 christos ? S_GET_NAME (fragP->fr_symbol) 3144 1.1 christos : "")); 3145 1.1 christos } 3146 1.1 christos 3147 1.1 christos valueT 3148 1.1 christos md_section_align (segT seg ATTRIBUTE_UNUSED, valueT size) 3149 1.7 christos { 3150 1.7 christos #ifdef OBJ_ELF 3151 1.1 christos return size; 3152 1.1 christos #else /* ! OBJ_ELF */ 3153 1.1 christos return ((size + (1 << bfd_section_alignment (seg)) - 1) 3154 1.1 christos & -(1 << bfd_section_alignment (seg))); 3155 1.1 christos #endif /* ! OBJ_ELF */ 3156 1.1 christos } 3157 1.1 christos 3158 1.1 christos /* This static variable is set by s_uacons to tell sh_cons_align that 3159 1.1 christos the expression does not need to be aligned. */ 3160 1.1 christos 3161 1.1 christos static int sh_no_align_cons = 0; 3162 1.1 christos 3163 1.1 christos /* This handles the unaligned space allocation pseudo-ops, such as 3164 1.1 christos .uaword. .uaword is just like .word, but the value does not need 3165 1.1 christos to be aligned. */ 3166 1.1 christos 3167 1.1 christos static void 3168 1.1 christos s_uacons (int bytes) 3169 1.1 christos { 3170 1.1 christos /* Tell sh_cons_align not to align this value. */ 3171 1.1 christos sh_no_align_cons = 1; 3172 1.1 christos cons (bytes); 3173 1.1 christos } 3174 1.1 christos 3175 1.1 christos /* If a .word, et. al., pseud-op is seen, warn if the value is not 3176 1.1 christos aligned correctly. Note that this can cause warnings to be issued 3177 1.1 christos when assembling initialized structured which were declared with the 3178 1.1 christos packed attribute. FIXME: Perhaps we should require an option to 3179 1.1 christos enable this warning? */ 3180 1.1 christos 3181 1.1 christos void 3182 1.1 christos sh_cons_align (int nbytes) 3183 1.1 christos { 3184 1.1 christos int nalign; 3185 1.1 christos 3186 1.1 christos if (sh_no_align_cons) 3187 1.1 christos { 3188 1.1 christos /* This is an unaligned pseudo-op. */ 3189 1.1 christos sh_no_align_cons = 0; 3190 1.1 christos return; 3191 1.1 christos } 3192 1.1 christos 3193 1.1 christos nalign = 0; 3194 1.1 christos while ((nbytes & 1) == 0) 3195 1.1 christos { 3196 1.1 christos ++nalign; 3197 1.1 christos nbytes >>= 1; 3198 1.1 christos } 3199 1.1 christos 3200 1.1 christos if (nalign == 0) 3201 1.1 christos return; 3202 1.1 christos 3203 1.1 christos if (now_seg == absolute_section) 3204 1.1 christos { 3205 1.1 christos if ((abs_section_offset & ((1 << nalign) - 1)) != 0) 3206 1.10 christos as_warn (_("misaligned data")); 3207 1.1 christos return; 3208 1.1 christos } 3209 1.1 christos 3210 1.1 christos frag_var (rs_align_test, 1, 1, 0, NULL, nalign, NULL); 3211 1.1 christos 3212 1.1 christos record_alignment (now_seg, nalign); 3213 1.1 christos } 3214 1.1 christos 3215 1.1 christos /* When relaxing, we need to output a reloc for any .align directive 3216 1.1 christos that requests alignment to a four byte boundary or larger. This is 3217 1.1 christos also where we check for misaligned data. */ 3218 1.1 christos 3219 1.1 christos void 3220 1.1 christos sh_handle_align (fragS *frag) 3221 1.1 christos { 3222 1.1 christos int bytes = frag->fr_next->fr_address - frag->fr_address - frag->fr_fix; 3223 1.1 christos 3224 1.1 christos if (frag->fr_type == rs_align_code) 3225 1.1 christos { 3226 1.1 christos static const unsigned char big_nop_pattern[] = { 0x00, 0x09 }; 3227 1.1 christos static const unsigned char little_nop_pattern[] = { 0x09, 0x00 }; 3228 1.1 christos 3229 1.1 christos char *p = frag->fr_literal + frag->fr_fix; 3230 1.1 christos 3231 1.1 christos if (bytes & 1) 3232 1.1 christos { 3233 1.1 christos *p++ = 0; 3234 1.1 christos bytes--; 3235 1.1 christos frag->fr_fix += 1; 3236 1.1 christos } 3237 1.1 christos 3238 1.1 christos if (target_big_endian) 3239 1.1 christos { 3240 1.1 christos memcpy (p, big_nop_pattern, sizeof big_nop_pattern); 3241 1.1 christos frag->fr_var = sizeof big_nop_pattern; 3242 1.1 christos } 3243 1.1 christos else 3244 1.1 christos { 3245 1.1 christos memcpy (p, little_nop_pattern, sizeof little_nop_pattern); 3246 1.1 christos frag->fr_var = sizeof little_nop_pattern; 3247 1.1 christos } 3248 1.1 christos } 3249 1.1 christos else if (frag->fr_type == rs_align_test) 3250 1.1 christos { 3251 1.1 christos if (bytes != 0) 3252 1.1 christos as_bad_where (frag->fr_file, frag->fr_line, _("misaligned data")); 3253 1.1 christos } 3254 1.1 christos 3255 1.1 christos if (sh_relax 3256 1.1 christos && (frag->fr_type == rs_align 3257 1.1 christos || frag->fr_type == rs_align_code) 3258 1.1 christos && frag->fr_address + frag->fr_fix > 0 3259 1.1 christos && frag->fr_offset > 1 3260 1.1 christos && now_seg != bss_section) 3261 1.1 christos fix_new (frag, frag->fr_fix, 2, &abs_symbol, frag->fr_offset, 0, 3262 1.1 christos BFD_RELOC_SH_ALIGN); 3263 1.8 christos } 3264 1.1 christos 3265 1.1 christos /* See whether the relocation should be resolved locally. */ 3266 1.1 christos 3267 1.1 christos static bool 3268 1.1 christos sh_local_pcrel (fixS *fix) 3269 1.1 christos { 3270 1.1 christos return (! sh_relax 3271 1.1 christos && (fix->fx_r_type == BFD_RELOC_SH_PCDISP8BY2 3272 1.1 christos || fix->fx_r_type == BFD_RELOC_SH_PCDISP12BY2 3273 1.1 christos || fix->fx_r_type == BFD_RELOC_SH_PCRELIMM8BY2 3274 1.1 christos || fix->fx_r_type == BFD_RELOC_SH_PCRELIMM8BY4 3275 1.1 christos || fix->fx_r_type == BFD_RELOC_8_PCREL 3276 1.1 christos || fix->fx_r_type == BFD_RELOC_SH_SWITCH16 3277 1.1 christos || fix->fx_r_type == BFD_RELOC_SH_SWITCH32)); 3278 1.1 christos } 3279 1.1 christos 3280 1.1 christos /* See whether we need to force a relocation into the output file. 3281 1.1 christos This is used to force out switch and PC relative relocations when 3282 1.1 christos relaxing. */ 3283 1.1 christos 3284 1.1 christos int 3285 1.1 christos sh_force_relocation (fixS *fix) 3286 1.1 christos { 3287 1.1 christos /* These relocations can't make it into a DSO, so no use forcing 3288 1.1 christos them for global symbols. */ 3289 1.1 christos if (sh_local_pcrel (fix)) 3290 1.1 christos return 0; 3291 1.1 christos 3292 1.1 christos /* Make sure some relocations get emitted. */ 3293 1.1 christos if (fix->fx_r_type == BFD_RELOC_SH_LOOP_START 3294 1.1 christos || fix->fx_r_type == BFD_RELOC_SH_LOOP_END 3295 1.1 christos || fix->fx_r_type == BFD_RELOC_SH_TLS_GD_32 3296 1.1 christos || fix->fx_r_type == BFD_RELOC_SH_TLS_LD_32 3297 1.1 christos || fix->fx_r_type == BFD_RELOC_SH_TLS_IE_32 3298 1.1 christos || fix->fx_r_type == BFD_RELOC_SH_TLS_LDO_32 3299 1.1 christos || fix->fx_r_type == BFD_RELOC_SH_TLS_LE_32 3300 1.1 christos || generic_force_reloc (fix)) 3301 1.1 christos return 1; 3302 1.1 christos 3303 1.1 christos if (! sh_relax) 3304 1.1 christos return 0; 3305 1.1 christos 3306 1.1 christos return (fix->fx_pcrel 3307 1.1 christos || SWITCH_TABLE (fix) 3308 1.1 christos || fix->fx_r_type == BFD_RELOC_SH_COUNT 3309 1.1 christos || fix->fx_r_type == BFD_RELOC_SH_ALIGN 3310 1.1 christos || fix->fx_r_type == BFD_RELOC_SH_CODE 3311 1.1 christos || fix->fx_r_type == BFD_RELOC_SH_DATA 3312 1.8 christos || fix->fx_r_type == BFD_RELOC_SH_LABEL); 3313 1.1 christos } 3314 1.1 christos 3315 1.1 christos #ifdef OBJ_ELF 3316 1.1 christos bool 3317 1.1 christos sh_fix_adjustable (fixS *fixP) 3318 1.1 christos { 3319 1.1 christos if (fixP->fx_r_type == BFD_RELOC_32_PLT_PCREL 3320 1.1 christos || fixP->fx_r_type == BFD_RELOC_32_GOT_PCREL 3321 1.1 christos || fixP->fx_r_type == BFD_RELOC_SH_GOT20 3322 1.1 christos || fixP->fx_r_type == BFD_RELOC_SH_GOTPC 3323 1.1 christos || fixP->fx_r_type == BFD_RELOC_SH_GOTFUNCDESC 3324 1.1 christos || fixP->fx_r_type == BFD_RELOC_SH_GOTFUNCDESC20 3325 1.1 christos || fixP->fx_r_type == BFD_RELOC_SH_GOTOFFFUNCDESC 3326 1.1 christos || fixP->fx_r_type == BFD_RELOC_SH_GOTOFFFUNCDESC20 3327 1.1 christos || fixP->fx_r_type == BFD_RELOC_SH_FUNCDESC 3328 1.1 christos || ((fixP->fx_r_type == BFD_RELOC_32) && dont_adjust_reloc_32) 3329 1.1 christos || fixP->fx_r_type == BFD_RELOC_RVA) 3330 1.1 christos return 0; 3331 1.1 christos 3332 1.1 christos /* We need the symbol name for the VTABLE entries */ 3333 1.1 christos if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT 3334 1.1 christos || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY) 3335 1.1 christos return 0; 3336 1.1 christos 3337 1.1 christos return 1; 3338 1.1 christos } 3339 1.1 christos 3340 1.1 christos void 3341 1.1 christos sh_elf_final_processing (void) 3342 1.1 christos { 3343 1.6 christos int val; 3344 1.1 christos 3345 1.1 christos /* Set file-specific flags to indicate if this code needs 3346 1.1 christos a processor with the sh-dsp / sh2e ISA to execute. */ 3347 1.1 christos val = sh_find_elf_flags (valid_arch); 3348 1.1 christos 3349 1.1 christos elf_elfheader (stdoutput)->e_flags &= ~EF_SH_MACH_MASK; 3350 1.1 christos elf_elfheader (stdoutput)->e_flags |= val; 3351 1.1 christos 3352 1.1 christos if (sh_fdpic) 3353 1.1 christos elf_elfheader (stdoutput)->e_flags |= EF_SH_FDPIC; 3354 1.1 christos } 3355 1.1 christos #endif 3356 1.1 christos 3357 1.1 christos #ifdef TE_UCLINUX 3358 1.1 christos /* Return the target format for uClinux. */ 3359 1.1 christos 3360 1.1 christos const char * 3361 1.1 christos sh_uclinux_target_format (void) 3362 1.1 christos { 3363 1.1 christos if (sh_fdpic) 3364 1.1 christos return (!target_big_endian ? "elf32-sh-fdpic" : "elf32-shbig-fdpic"); 3365 1.1 christos else 3366 1.1 christos return (!target_big_endian ? "elf32-shl" : "elf32-sh"); 3367 1.1 christos } 3368 1.1 christos #endif 3369 1.1 christos 3370 1.1 christos /* Apply fixup FIXP to SIZE-byte field BUF given that VAL is its 3371 1.1 christos assembly-time value. If we're generating a reloc for FIXP, 3372 1.1 christos see whether the addend should be stored in-place or whether 3373 1.1 christos it should be in an ELF r_addend field. */ 3374 1.1 christos 3375 1.1 christos static void 3376 1.1 christos apply_full_field_fix (fixS *fixP, char *buf, bfd_vma val, int size) 3377 1.1 christos { 3378 1.1 christos reloc_howto_type *howto; 3379 1.1 christos 3380 1.1 christos if (fixP->fx_addsy != NULL || fixP->fx_pcrel) 3381 1.1 christos { 3382 1.1 christos howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type); 3383 1.1 christos if (howto && !howto->partial_inplace) 3384 1.1 christos { 3385 1.1 christos fixP->fx_addnumber = val; 3386 1.1 christos return; 3387 1.1 christos } 3388 1.1 christos } 3389 1.1 christos md_number_to_chars (buf, val, size); 3390 1.1 christos } 3391 1.1 christos 3392 1.1 christos /* Apply a fixup to the object file. */ 3393 1.1 christos 3394 1.1 christos void 3395 1.1 christos md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) 3396 1.10 christos { 3397 1.1 christos char *buf = fixP->fx_where + fixP->fx_frag->fr_literal; 3398 1.1 christos int lowbyte = target_big_endian ? 1 : 0; 3399 1.1 christos int highbyte = target_big_endian ? 0 : 1; 3400 1.1 christos long val = *valP; 3401 1.1 christos long max, min; 3402 1.1 christos int shift; 3403 1.1 christos 3404 1.1 christos /* A difference between two symbols, the second of which is in the 3405 1.1 christos current section, is transformed in a PC-relative relocation to 3406 1.1 christos the other symbol. We have to adjust the relocation type here. */ 3407 1.1 christos if (fixP->fx_pcrel) 3408 1.1 christos { 3409 1.1 christos switch (fixP->fx_r_type) 3410 1.1 christos { 3411 1.1 christos default: 3412 1.1 christos break; 3413 1.1 christos 3414 1.1 christos case BFD_RELOC_32: 3415 1.1 christos fixP->fx_r_type = BFD_RELOC_32_PCREL; 3416 1.1 christos break; 3417 1.1 christos 3418 1.1 christos /* Currently, we only support 32-bit PCREL relocations. 3419 1.1 christos We'd need a new reloc type to handle 16_PCREL, and 3420 1.1 christos 8_PCREL is already taken for R_SH_SWITCH8, which 3421 1.1 christos apparently does something completely different than what 3422 1.1 christos we need. FIXME. */ 3423 1.1 christos case BFD_RELOC_16: 3424 1.1 christos bfd_set_error (bfd_error_bad_value); 3425 1.1 christos return; 3426 1.1 christos 3427 1.1 christos case BFD_RELOC_8: 3428 1.1 christos bfd_set_error (bfd_error_bad_value); 3429 1.1 christos return; 3430 1.1 christos } 3431 1.1 christos } 3432 1.1 christos 3433 1.1 christos /* The function adjust_reloc_syms won't convert a reloc against a weak 3434 1.1 christos symbol into a reloc against a section, but bfd_install_relocation 3435 1.1 christos will screw up if the symbol is defined, so we have to adjust val here 3436 1.1 christos to avoid the screw up later. 3437 1.1 christos 3438 1.1 christos For ordinary relocs, this does not happen for ELF, since for ELF, 3439 1.1 christos bfd_install_relocation uses the "special function" field of the 3440 1.1 christos howto, and does not execute the code that needs to be undone, as long 3441 1.1 christos as the special function does not return bfd_reloc_continue. 3442 1.1 christos It can happen for GOT- and PLT-type relocs the way they are 3443 1.1 christos described in elf32-sh.c as they use bfd_elf_generic_reloc, but it 3444 1.1 christos doesn't matter here since those relocs don't use VAL; see below. */ 3445 1.1 christos if (OUTPUT_FLAVOR != bfd_target_elf_flavour 3446 1.1 christos && fixP->fx_addsy != NULL 3447 1.1 christos && S_IS_WEAK (fixP->fx_addsy)) 3448 1.1 christos val -= S_GET_VALUE (fixP->fx_addsy); 3449 1.1 christos 3450 1.1 christos if (SWITCH_TABLE (fixP)) 3451 1.1 christos val -= S_GET_VALUE (fixP->fx_subsy); 3452 1.1 christos 3453 1.1 christos max = min = 0; 3454 1.1 christos shift = 0; 3455 1.1 christos switch (fixP->fx_r_type) 3456 1.1 christos { 3457 1.1 christos case BFD_RELOC_SH_IMM3: 3458 1.1 christos max = 0x7; 3459 1.1 christos * buf = (* buf & 0xf8) | (val & 0x7); 3460 1.1 christos break; 3461 1.1 christos case BFD_RELOC_SH_IMM3U: 3462 1.1 christos max = 0x7; 3463 1.1 christos * buf = (* buf & 0x8f) | ((val & 0x7) << 4); 3464 1.1 christos break; 3465 1.1 christos case BFD_RELOC_SH_DISP12: 3466 1.1 christos max = 0xfff; 3467 1.1 christos buf[lowbyte] = val & 0xff; 3468 1.1 christos buf[highbyte] |= (val >> 8) & 0x0f; 3469 1.1 christos break; 3470 1.1 christos case BFD_RELOC_SH_DISP12BY2: 3471 1.1 christos max = 0xfff; 3472 1.1 christos shift = 1; 3473 1.1 christos buf[lowbyte] = (val >> 1) & 0xff; 3474 1.1 christos buf[highbyte] |= (val >> 9) & 0x0f; 3475 1.1 christos break; 3476 1.1 christos case BFD_RELOC_SH_DISP12BY4: 3477 1.1 christos max = 0xfff; 3478 1.1 christos shift = 2; 3479 1.1 christos buf[lowbyte] = (val >> 2) & 0xff; 3480 1.1 christos buf[highbyte] |= (val >> 10) & 0x0f; 3481 1.1 christos break; 3482 1.1 christos case BFD_RELOC_SH_DISP12BY8: 3483 1.1 christos max = 0xfff; 3484 1.1 christos shift = 3; 3485 1.1 christos buf[lowbyte] = (val >> 3) & 0xff; 3486 1.1 christos buf[highbyte] |= (val >> 11) & 0x0f; 3487 1.1 christos break; 3488 1.1 christos case BFD_RELOC_SH_DISP20: 3489 1.1 christos if (! target_big_endian) 3490 1.1 christos abort(); 3491 1.1 christos max = 0x7ffff; 3492 1.1 christos min = -0x80000; 3493 1.1 christos buf[1] = (buf[1] & 0x0f) | ((val >> 12) & 0xf0); 3494 1.1 christos buf[2] = (val >> 8) & 0xff; 3495 1.1 christos buf[3] = val & 0xff; 3496 1.1 christos break; 3497 1.1 christos case BFD_RELOC_SH_DISP20BY8: 3498 1.1 christos if (!target_big_endian) 3499 1.1 christos abort(); 3500 1.1 christos max = 0x7ffff; 3501 1.1 christos min = -0x80000; 3502 1.1 christos shift = 8; 3503 1.1 christos buf[1] = (buf[1] & 0x0f) | ((val >> 20) & 0xf0); 3504 1.1 christos buf[2] = (val >> 16) & 0xff; 3505 1.1 christos buf[3] = (val >> 8) & 0xff; 3506 1.1 christos break; 3507 1.1 christos 3508 1.1 christos case BFD_RELOC_SH_IMM4: 3509 1.1 christos max = 0xf; 3510 1.1 christos *buf = (*buf & 0xf0) | (val & 0xf); 3511 1.1 christos break; 3512 1.1 christos 3513 1.1 christos case BFD_RELOC_SH_IMM4BY2: 3514 1.1 christos max = 0xf; 3515 1.1 christos shift = 1; 3516 1.1 christos *buf = (*buf & 0xf0) | ((val >> 1) & 0xf); 3517 1.1 christos break; 3518 1.1 christos 3519 1.1 christos case BFD_RELOC_SH_IMM4BY4: 3520 1.1 christos max = 0xf; 3521 1.1 christos shift = 2; 3522 1.1 christos *buf = (*buf & 0xf0) | ((val >> 2) & 0xf); 3523 1.1 christos break; 3524 1.1 christos 3525 1.1 christos case BFD_RELOC_SH_IMM8BY2: 3526 1.1 christos max = 0xff; 3527 1.1 christos shift = 1; 3528 1.1 christos *buf = val >> 1; 3529 1.1 christos break; 3530 1.1 christos 3531 1.1 christos case BFD_RELOC_SH_IMM8BY4: 3532 1.1 christos max = 0xff; 3533 1.1 christos shift = 2; 3534 1.1 christos *buf = val >> 2; 3535 1.1 christos break; 3536 1.1 christos 3537 1.1 christos case BFD_RELOC_8: 3538 1.1 christos case BFD_RELOC_SH_IMM8: 3539 1.1 christos /* Sometimes the 8 bit value is sign extended (e.g., add) and 3540 1.1 christos sometimes it is not (e.g., and). We permit any 8 bit value. 3541 1.1 christos Note that adding further restrictions may invalidate 3542 1.1 christos reasonable looking assembly code, such as ``and -0x1,r0''. */ 3543 1.1 christos max = 0xff; 3544 1.1 christos min = -0xff; 3545 1.1 christos *buf++ = val; 3546 1.1 christos break; 3547 1.1 christos 3548 1.1 christos case BFD_RELOC_SH_PCRELIMM8BY4: 3549 1.1 christos /* If we are dealing with a known destination ... */ 3550 1.1 christos if ((fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) 3551 1.1 christos && (fixP->fx_subsy == NULL || S_IS_DEFINED (fixP->fx_addsy))) 3552 1.1 christos { 3553 1.1 christos /* Don't silently move the destination due to misalignment. 3554 1.1 christos The absolute address is the fragment base plus the offset into 3555 1.1 christos the fragment plus the pc relative offset to the label. */ 3556 1.1 christos if ((fixP->fx_frag->fr_address + fixP->fx_where + val) & 3) 3557 1.1 christos as_bad_where (fixP->fx_file, fixP->fx_line, 3558 1.1 christos _("offset to unaligned destination")); 3559 1.1 christos 3560 1.1 christos /* The displacement cannot be zero or backward even if aligned. 3561 1.1 christos Allow -2 because val has already been adjusted somewhere. */ 3562 1.1 christos if (val < -2) 3563 1.1 christos as_bad_where (fixP->fx_file, fixP->fx_line, _("negative offset")); 3564 1.1 christos } 3565 1.1 christos 3566 1.1 christos /* The lower two bits of the PC are cleared before the 3567 1.1 christos displacement is added in. We can assume that the destination 3568 1.1 christos is on a 4 byte boundary. If this instruction is also on a 4 3569 1.1 christos byte boundary, then we want 3570 1.1 christos (target - here) / 4 3571 1.1 christos and target - here is a multiple of 4. 3572 1.1 christos Otherwise, we are on a 2 byte boundary, and we want 3573 1.1 christos (target - (here - 2)) / 4 3574 1.1 christos and target - here is not a multiple of 4. Computing 3575 1.1 christos (target - (here - 2)) / 4 == (target - here + 2) / 4 3576 1.1 christos works for both cases, since in the first case the addition of 3577 1.1 christos 2 will be removed by the division. target - here is in the 3578 1.1 christos variable val. */ 3579 1.1 christos val = (val + 2) / 4; 3580 1.1 christos if (val & ~0xff) 3581 1.1 christos as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far")); 3582 1.1 christos buf[lowbyte] = val; 3583 1.1 christos break; 3584 1.1 christos 3585 1.1 christos case BFD_RELOC_SH_PCRELIMM8BY2: 3586 1.1 christos val /= 2; 3587 1.1 christos if (val & ~0xff) 3588 1.1 christos as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far")); 3589 1.1 christos buf[lowbyte] = val; 3590 1.1 christos break; 3591 1.1 christos 3592 1.1 christos case BFD_RELOC_SH_PCDISP8BY2: 3593 1.1 christos val /= 2; 3594 1.1 christos if (val < -0x80 || val > 0x7f) 3595 1.1 christos as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far")); 3596 1.1 christos buf[lowbyte] = val; 3597 1.1 christos break; 3598 1.1 christos 3599 1.1 christos case BFD_RELOC_SH_PCDISP12BY2: 3600 1.1 christos val /= 2; 3601 1.1 christos if (val < -0x800 || val > 0x7ff) 3602 1.1 christos as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far")); 3603 1.1 christos buf[lowbyte] = val & 0xff; 3604 1.1 christos buf[highbyte] |= (val >> 8) & 0xf; 3605 1.1 christos break; 3606 1.1 christos 3607 1.1 christos case BFD_RELOC_32: 3608 1.1 christos case BFD_RELOC_32_PCREL: 3609 1.1 christos apply_full_field_fix (fixP, buf, val, 4); 3610 1.1 christos break; 3611 1.1 christos 3612 1.1 christos case BFD_RELOC_16: 3613 1.1 christos apply_full_field_fix (fixP, buf, val, 2); 3614 1.1 christos break; 3615 1.1 christos 3616 1.1 christos case BFD_RELOC_SH_USES: 3617 1.1 christos /* Pass the value into sh_reloc(). */ 3618 1.1 christos fixP->fx_addnumber = val; 3619 1.1 christos break; 3620 1.1 christos 3621 1.1 christos case BFD_RELOC_SH_COUNT: 3622 1.1 christos case BFD_RELOC_SH_ALIGN: 3623 1.1 christos case BFD_RELOC_SH_CODE: 3624 1.1 christos case BFD_RELOC_SH_DATA: 3625 1.1 christos case BFD_RELOC_SH_LABEL: 3626 1.1 christos /* Nothing to do here. */ 3627 1.1 christos break; 3628 1.1 christos 3629 1.1 christos case BFD_RELOC_SH_LOOP_START: 3630 1.1 christos case BFD_RELOC_SH_LOOP_END: 3631 1.1 christos 3632 1.1 christos case BFD_RELOC_VTABLE_INHERIT: 3633 1.1 christos case BFD_RELOC_VTABLE_ENTRY: 3634 1.1 christos fixP->fx_done = 0; 3635 1.1 christos return; 3636 1.1 christos 3637 1.1 christos #ifdef OBJ_ELF 3638 1.1 christos case BFD_RELOC_32_PLT_PCREL: 3639 1.1 christos /* Make the jump instruction point to the address of the operand. At 3640 1.1 christos runtime we merely add the offset to the actual PLT entry. */ 3641 1.1 christos * valP = 0xfffffffc; 3642 1.1 christos val = fixP->fx_offset; 3643 1.1 christos if (fixP->fx_subsy) 3644 1.1 christos val -= S_GET_VALUE (fixP->fx_subsy); 3645 1.1 christos apply_full_field_fix (fixP, buf, val, 4); 3646 1.1 christos break; 3647 1.1 christos 3648 1.1 christos case BFD_RELOC_SH_GOTPC: 3649 1.1 christos /* This is tough to explain. We end up with this one if we have 3650 1.1 christos operands that look like "_GLOBAL_OFFSET_TABLE_+[.-.L284]". 3651 1.1 christos The goal here is to obtain the absolute address of the GOT, 3652 1.1 christos and it is strongly preferable from a performance point of 3653 1.1 christos view to avoid using a runtime relocation for this. There are 3654 1.1 christos cases where you have something like: 3655 1.1 christos 3656 1.1 christos .long _GLOBAL_OFFSET_TABLE_+[.-.L66] 3657 1.1 christos 3658 1.1 christos and here no correction would be required. Internally in the 3659 1.1 christos assembler we treat operands of this form as not being pcrel 3660 1.1 christos since the '.' is explicitly mentioned, and I wonder whether 3661 1.1 christos it would simplify matters to do it this way. Who knows. In 3662 1.1 christos earlier versions of the PIC patches, the pcrel_adjust field 3663 1.1 christos was used to store the correction, but since the expression is 3664 1.1 christos not pcrel, I felt it would be confusing to do it this way. */ 3665 1.1 christos * valP -= 1; 3666 1.1 christos apply_full_field_fix (fixP, buf, val, 4); 3667 1.1 christos break; 3668 1.1 christos 3669 1.1 christos case BFD_RELOC_SH_TLS_GD_32: 3670 1.1 christos case BFD_RELOC_SH_TLS_LD_32: 3671 1.1 christos case BFD_RELOC_SH_TLS_IE_32: 3672 1.1 christos S_SET_THREAD_LOCAL (fixP->fx_addsy); 3673 1.1 christos /* Fallthrough */ 3674 1.1 christos case BFD_RELOC_32_GOT_PCREL: 3675 1.1 christos case BFD_RELOC_SH_GOT20: 3676 1.1 christos case BFD_RELOC_SH_GOTPLT32: 3677 1.1 christos case BFD_RELOC_SH_GOTFUNCDESC: 3678 1.1 christos case BFD_RELOC_SH_GOTFUNCDESC20: 3679 1.1 christos case BFD_RELOC_SH_GOTOFFFUNCDESC: 3680 1.1 christos case BFD_RELOC_SH_GOTOFFFUNCDESC20: 3681 1.1 christos case BFD_RELOC_SH_FUNCDESC: 3682 1.1 christos * valP = 0; /* Fully resolved at runtime. No addend. */ 3683 1.1 christos apply_full_field_fix (fixP, buf, 0, 4); 3684 1.1 christos break; 3685 1.1 christos 3686 1.1 christos case BFD_RELOC_SH_TLS_LDO_32: 3687 1.1 christos case BFD_RELOC_SH_TLS_LE_32: 3688 1.1 christos S_SET_THREAD_LOCAL (fixP->fx_addsy); 3689 1.1 christos /* Fallthrough */ 3690 1.1 christos case BFD_RELOC_32_GOTOFF: 3691 1.1 christos case BFD_RELOC_SH_GOTOFF20: 3692 1.1 christos apply_full_field_fix (fixP, buf, val, 4); 3693 1.1 christos break; 3694 1.1 christos #endif 3695 1.1 christos 3696 1.1 christos default: 3697 1.1 christos abort (); 3698 1.1 christos } 3699 1.1 christos 3700 1.1 christos if (shift != 0) 3701 1.1 christos { 3702 1.1 christos if ((val & ((1 << shift) - 1)) != 0) 3703 1.10 christos as_bad_where (fixP->fx_file, fixP->fx_line, _("misaligned offset")); 3704 1.1 christos if (val >= 0) 3705 1.1 christos val >>= shift; 3706 1.1 christos else 3707 1.1 christos val = (val >> shift) | (-1L & ~ (-1L >> shift)); 3708 1.1 christos } 3709 1.1 christos 3710 1.1 christos /* Extend sign for 64-bit host. */ 3711 1.6 christos val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000; 3712 1.1 christos if (max != 0 && (val < min || val > max)) 3713 1.1 christos as_bad_where (fixP->fx_file, fixP->fx_line, _("offset out of range")); 3714 1.1 christos else if (max != 0) 3715 1.1 christos /* Stop the generic code from trying to overflow check the value as well. 3716 1.1 christos It may not have the correct value anyway, as we do not store val back 3717 1.1 christos into *valP. */ 3718 1.1 christos fixP->fx_no_overflow = 1; 3719 1.1 christos 3720 1.1 christos if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0) 3721 1.1 christos fixP->fx_done = 1; 3722 1.1 christos } 3723 1.1 christos 3724 1.1 christos /* Called just before address relaxation. Return the length 3725 1.1 christos by which a fragment must grow to reach it's destination. */ 3726 1.1 christos 3727 1.1 christos int 3728 1.1 christos md_estimate_size_before_relax (fragS *fragP, segT segment_type) 3729 1.1 christos { 3730 1.1 christos int what; 3731 1.1 christos 3732 1.1 christos switch (fragP->fr_subtype) 3733 1.1 christos { 3734 1.1 christos default: 3735 1.1 christos abort (); 3736 1.1 christos 3737 1.1 christos case C (UNCOND_JUMP, UNDEF_DISP): 3738 1.1 christos /* Used to be a branch to somewhere which was unknown. */ 3739 1.1 christos if (!fragP->fr_symbol) 3740 1.1 christos { 3741 1.1 christos fragP->fr_subtype = C (UNCOND_JUMP, UNCOND12); 3742 1.1 christos } 3743 1.1 christos else if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type) 3744 1.1 christos { 3745 1.1 christos fragP->fr_subtype = C (UNCOND_JUMP, UNCOND12); 3746 1.1 christos } 3747 1.1 christos else 3748 1.1 christos { 3749 1.1 christos fragP->fr_subtype = C (UNCOND_JUMP, UNDEF_WORD_DISP); 3750 1.1 christos } 3751 1.1 christos break; 3752 1.1 christos 3753 1.1 christos case C (COND_JUMP, UNDEF_DISP): 3754 1.1 christos case C (COND_JUMP_DELAY, UNDEF_DISP): 3755 1.1 christos what = GET_WHAT (fragP->fr_subtype); 3756 1.1 christos /* Used to be a branch to somewhere which was unknown. */ 3757 1.1 christos if (fragP->fr_symbol 3758 1.1 christos && S_GET_SEGMENT (fragP->fr_symbol) == segment_type) 3759 1.1 christos { 3760 1.1 christos /* Got a symbol and it's defined in this segment, become byte 3761 1.1 christos sized - maybe it will fix up. */ 3762 1.6 christos fragP->fr_subtype = C (what, COND8); 3763 1.1 christos } 3764 1.1 christos else if (fragP->fr_symbol) 3765 1.1 christos { 3766 1.1 christos /* It's got a segment, but it's not ours, so it will always be long. */ 3767 1.1 christos fragP->fr_subtype = C (what, UNDEF_WORD_DISP); 3768 1.1 christos } 3769 1.1 christos else 3770 1.1 christos { 3771 1.1 christos /* We know the abs value. */ 3772 1.1 christos fragP->fr_subtype = C (what, COND8); 3773 1.1 christos } 3774 1.1 christos break; 3775 1.1 christos 3776 1.1 christos case C (UNCOND_JUMP, UNCOND12): 3777 1.1 christos case C (UNCOND_JUMP, UNCOND32): 3778 1.1 christos case C (UNCOND_JUMP, UNDEF_WORD_DISP): 3779 1.1 christos case C (COND_JUMP, COND8): 3780 1.1 christos case C (COND_JUMP, COND12): 3781 1.1 christos case C (COND_JUMP, COND32): 3782 1.1 christos case C (COND_JUMP, UNDEF_WORD_DISP): 3783 1.1 christos case C (COND_JUMP_DELAY, COND8): 3784 1.1 christos case C (COND_JUMP_DELAY, COND12): 3785 1.1 christos case C (COND_JUMP_DELAY, COND32): 3786 1.1 christos case C (COND_JUMP_DELAY, UNDEF_WORD_DISP): 3787 1.1 christos /* When relaxing a section for the second time, we don't need to 3788 1.1 christos do anything besides return the current size. */ 3789 1.1 christos break; 3790 1.1 christos } 3791 1.1 christos 3792 1.1 christos fragP->fr_var = md_relax_table[fragP->fr_subtype].rlx_length; 3793 1.1 christos return fragP->fr_var; 3794 1.1 christos } 3795 1.1 christos 3796 1.1 christos /* Put number into target byte order. */ 3797 1.1 christos 3798 1.1 christos void 3799 1.1 christos md_number_to_chars (char *ptr, valueT use, int nbytes) 3800 1.1 christos { 3801 1.1 christos if (! target_big_endian) 3802 1.1 christos number_to_chars_littleendian (ptr, use, nbytes); 3803 1.1 christos else 3804 1.1 christos number_to_chars_bigendian (ptr, use, nbytes); 3805 1.1 christos } 3806 1.1 christos 3807 1.1 christos /* This version is used in obj-coff.c eg. for the sh-hms target. */ 3808 1.1 christos 3809 1.1 christos long 3810 1.1 christos md_pcrel_from (fixS *fixP) 3811 1.1 christos { 3812 1.1 christos return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address + 2; 3813 1.1 christos } 3814 1.1 christos 3815 1.10 christos long 3816 1.1 christos md_pcrel_from_section (fixS *fixP, segT sec) 3817 1.1 christos { 3818 1.1 christos if (! sh_local_pcrel (fixP) 3819 1.1 christos && fixP->fx_addsy != NULL 3820 1.1 christos && (generic_force_reloc (fixP) 3821 1.1 christos || S_GET_SEGMENT (fixP->fx_addsy) != sec)) 3822 1.1 christos { 3823 1.1 christos /* The symbol is undefined (or is defined but not in this section, 3824 1.1 christos or we're not sure about it being the final definition). Let the 3825 1.1 christos linker figure it out. We need to adjust the subtraction of a 3826 1.1 christos symbol to the position of the relocated data, though. */ 3827 1.1 christos return fixP->fx_subsy ? fixP->fx_where + fixP->fx_frag->fr_address : 0; 3828 1.1 christos } 3829 1.1 christos 3830 1.1 christos return md_pcrel_from (fixP); 3831 1.1 christos } 3832 1.1 christos 3833 1.1 christos /* Create a reloc. */ 3834 1.1 christos 3835 1.1 christos arelent * 3836 1.1 christos tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp) 3837 1.10 christos { 3838 1.10 christos arelent *rel; 3839 1.1 christos bfd_reloc_code_real_type r_type; 3840 1.1 christos 3841 1.1 christos rel = notes_alloc (sizeof (arelent)); 3842 1.1 christos rel->sym_ptr_ptr = notes_alloc (sizeof (asymbol *)); 3843 1.1 christos *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); 3844 1.1 christos rel->address = fixp->fx_frag->fr_address + fixp->fx_where; 3845 1.1 christos 3846 1.1 christos r_type = fixp->fx_r_type; 3847 1.3 christos 3848 1.1 christos if (SWITCH_TABLE (fixp)) 3849 1.1 christos { 3850 1.1 christos *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_subsy); 3851 1.1 christos rel->addend = rel->address - S_GET_VALUE(fixp->fx_subsy); 3852 1.1 christos if (r_type == BFD_RELOC_16) 3853 1.1 christos r_type = BFD_RELOC_SH_SWITCH16; 3854 1.1 christos else if (r_type == BFD_RELOC_8) 3855 1.1 christos r_type = BFD_RELOC_8_PCREL; 3856 1.1 christos else if (r_type == BFD_RELOC_32) 3857 1.1 christos r_type = BFD_RELOC_SH_SWITCH32; 3858 1.1 christos else 3859 1.1 christos abort (); 3860 1.1 christos } 3861 1.1 christos else if (r_type == BFD_RELOC_SH_USES) 3862 1.1 christos rel->addend = fixp->fx_addnumber; 3863 1.1 christos else if (r_type == BFD_RELOC_SH_COUNT) 3864 1.1 christos rel->addend = fixp->fx_offset; 3865 1.1 christos else if (r_type == BFD_RELOC_SH_ALIGN) 3866 1.1 christos rel->addend = fixp->fx_offset; 3867 1.1 christos else if (r_type == BFD_RELOC_VTABLE_INHERIT 3868 1.1 christos || r_type == BFD_RELOC_VTABLE_ENTRY) 3869 1.1 christos rel->addend = fixp->fx_offset; 3870 1.1 christos else if (r_type == BFD_RELOC_SH_LOOP_START 3871 1.1 christos || r_type == BFD_RELOC_SH_LOOP_END) 3872 1.1 christos rel->addend = fixp->fx_offset; 3873 1.1 christos else if (r_type == BFD_RELOC_SH_LABEL && fixp->fx_pcrel) 3874 1.1 christos { 3875 1.1 christos rel->addend = 0; 3876 1.1 christos rel->address = rel->addend = fixp->fx_offset; 3877 1.1 christos } 3878 1.1 christos else 3879 1.1 christos rel->addend = fixp->fx_addnumber; 3880 1.1 christos 3881 1.1 christos rel->howto = bfd_reloc_type_lookup (stdoutput, r_type); 3882 1.1 christos 3883 1.1 christos if (rel->howto == NULL) 3884 1.1 christos { 3885 1.1 christos as_bad_where (fixp->fx_file, fixp->fx_line, 3886 1.1 christos _("Cannot represent relocation type %s"), 3887 1.1 christos bfd_get_reloc_code_name (r_type)); 3888 1.1 christos /* Set howto to a garbage value so that we can keep going. */ 3889 1.1 christos rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32); 3890 1.1 christos gas_assert (rel->howto != NULL); 3891 1.1 christos } 3892 1.1 christos #ifdef OBJ_ELF 3893 1.1 christos else if (rel->howto->type == R_SH_IND12W) 3894 1.1 christos rel->addend += fixp->fx_offset - 4; 3895 1.1 christos #endif 3896 1.1 christos 3897 1.1 christos return rel; 3898 1.5 christos } 3899 1.1 christos 3900 1.1 christos #ifdef OBJ_ELF 3901 1.1 christos inline static char * 3902 1.1 christos sh_end_of_match (char *cont, const char *what) 3903 1.1 christos { 3904 1.1 christos int len = strlen (what); 3905 1.1 christos 3906 1.1 christos if (strncasecmp (cont, what, strlen (what)) == 0 3907 1.1 christos && ! is_part_of_name (cont[len])) 3908 1.1 christos return cont + len; 3909 1.1 christos 3910 1.1 christos return NULL; 3911 1.1 christos } 3912 1.1 christos 3913 1.1 christos int 3914 1.1 christos sh_parse_name (char const *name, 3915 1.1 christos expressionS *exprP, 3916 1.1 christos enum expr_mode mode, 3917 1.1 christos char *nextcharP) 3918 1.1 christos { 3919 1.1 christos char *next = input_line_pointer; 3920 1.1 christos char *next_end; 3921 1.1 christos int reloc_type; 3922 1.1 christos segT segment; 3923 1.1 christos 3924 1.1 christos exprP->X_op_symbol = NULL; 3925 1.1 christos 3926 1.1 christos if (strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0) 3927 1.1 christos { 3928 1.1 christos if (! GOT_symbol) 3929 1.1 christos GOT_symbol = symbol_find_or_make (name); 3930 1.1 christos 3931 1.1 christos exprP->X_add_symbol = GOT_symbol; 3932 1.10 christos no_suffix: 3933 1.1 christos /* If we have an absolute symbol or a reg, then we know its 3934 1.1 christos value now. */ 3935 1.1 christos segment = S_GET_SEGMENT (exprP->X_add_symbol); 3936 1.1 christos if (!expr_defer_p (mode) && segment == absolute_section) 3937 1.1 christos { 3938 1.10 christos exprP->X_op = O_constant; 3939 1.1 christos exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol); 3940 1.1 christos exprP->X_add_symbol = NULL; 3941 1.1 christos } 3942 1.1 christos else if (!expr_defer_p (mode) && segment == reg_section) 3943 1.1 christos { 3944 1.1 christos exprP->X_op = O_register; 3945 1.1 christos exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol); 3946 1.1 christos exprP->X_add_symbol = NULL; 3947 1.1 christos } 3948 1.1 christos else 3949 1.1 christos { 3950 1.1 christos exprP->X_op = O_symbol; 3951 1.1 christos exprP->X_add_number = 0; 3952 1.1 christos } 3953 1.1 christos 3954 1.1 christos return 1; 3955 1.1 christos } 3956 1.1 christos 3957 1.1 christos exprP->X_add_symbol = symbol_find_or_make (name); 3958 1.1 christos 3959 1.1 christos if (*nextcharP != '@') 3960 1.1 christos goto no_suffix; 3961 1.1 christos else if ((next_end = sh_end_of_match (next + 1, "GOTOFF"))) 3962 1.1 christos reloc_type = BFD_RELOC_32_GOTOFF; 3963 1.1 christos else if ((next_end = sh_end_of_match (next + 1, "GOTPLT"))) 3964 1.1 christos reloc_type = BFD_RELOC_SH_GOTPLT32; 3965 1.1 christos else if ((next_end = sh_end_of_match (next + 1, "GOT"))) 3966 1.1 christos reloc_type = BFD_RELOC_32_GOT_PCREL; 3967 1.1 christos else if ((next_end = sh_end_of_match (next + 1, "PLT"))) 3968 1.1 christos reloc_type = BFD_RELOC_32_PLT_PCREL; 3969 1.1 christos else if ((next_end = sh_end_of_match (next + 1, "TLSGD"))) 3970 1.1 christos reloc_type = BFD_RELOC_SH_TLS_GD_32; 3971 1.1 christos else if ((next_end = sh_end_of_match (next + 1, "TLSLDM"))) 3972 1.1 christos reloc_type = BFD_RELOC_SH_TLS_LD_32; 3973 1.1 christos else if ((next_end = sh_end_of_match (next + 1, "GOTTPOFF"))) 3974 1.1 christos reloc_type = BFD_RELOC_SH_TLS_IE_32; 3975 1.1 christos else if ((next_end = sh_end_of_match (next + 1, "TPOFF"))) 3976 1.1 christos reloc_type = BFD_RELOC_SH_TLS_LE_32; 3977 1.1 christos else if ((next_end = sh_end_of_match (next + 1, "DTPOFF"))) 3978 1.1 christos reloc_type = BFD_RELOC_SH_TLS_LDO_32; 3979 1.1 christos else if ((next_end = sh_end_of_match (next + 1, "PCREL"))) 3980 1.1 christos reloc_type = BFD_RELOC_32_PCREL; 3981 1.1 christos else if ((next_end = sh_end_of_match (next + 1, "GOTFUNCDESC"))) 3982 1.1 christos reloc_type = BFD_RELOC_SH_GOTFUNCDESC; 3983 1.1 christos else if ((next_end = sh_end_of_match (next + 1, "GOTOFFFUNCDESC"))) 3984 1.1 christos reloc_type = BFD_RELOC_SH_GOTOFFFUNCDESC; 3985 1.1 christos else if ((next_end = sh_end_of_match (next + 1, "FUNCDESC"))) 3986 1.1 christos reloc_type = BFD_RELOC_SH_FUNCDESC; 3987 1.1 christos else 3988 1.1 christos goto no_suffix; 3989 1.1 christos 3990 1.1 christos *input_line_pointer = *nextcharP; 3991 1.1 christos input_line_pointer = next_end; 3992 1.1 christos *nextcharP = *input_line_pointer; 3993 1.1 christos *input_line_pointer = '\0'; 3994 1.1 christos 3995 1.1 christos exprP->X_op = O_PIC_reloc; 3996 1.1 christos exprP->X_add_number = 0; 3997 1.1 christos exprP->X_md = reloc_type; 3998 1.1 christos 3999 1.1 christos return 1; 4000 1.1 christos } 4001 1.1 christos 4002 1.1 christos void 4003 1.1 christos sh_cfi_frame_initial_instructions (void) 4004 1.1 christos { 4005 1.1 christos cfi_add_CFA_def_cfa (15, 0); 4006 1.1 christos } 4007 1.1 christos 4008 1.1 christos int 4009 1.1 christos sh_regname_to_dw2regnum (char *regname) 4010 1.1 christos { 4011 1.5 christos unsigned int regnum = -1; 4012 1.1 christos unsigned int i; 4013 1.1 christos const char *p; 4014 1.1 christos char *q; 4015 1.1 christos static struct { const char *name; int dw2regnum; } regnames[] = 4016 1.1 christos { 4017 1.1 christos { "pr", 17 }, { "t", 18 }, { "gbr", 19 }, { "mach", 20 }, 4018 1.1 christos { "macl", 21 }, { "fpul", 23 } 4019 1.1 christos }; 4020 1.1 christos 4021 1.1 christos for (i = 0; i < ARRAY_SIZE (regnames); ++i) 4022 1.1 christos if (strcmp (regnames[i].name, regname) == 0) 4023 1.1 christos return regnames[i].dw2regnum; 4024 1.1 christos 4025 1.1 christos if (regname[0] == 'r') 4026 1.1 christos { 4027 1.1 christos p = regname + 1; 4028 1.1 christos regnum = strtoul (p, &q, 10); 4029 1.1 christos if (p == q || *q || regnum >= 16) 4030 1.1 christos return -1; 4031 1.1 christos } 4032 1.1 christos else if (regname[0] == 'f' && regname[1] == 'r') 4033 1.1 christos { 4034 1.1 christos p = regname + 2; 4035 1.1 christos regnum = strtoul (p, &q, 10); 4036 1.1 christos if (p == q || *q || regnum >= 16) 4037 1.1 christos return -1; 4038 1.1 christos regnum += 25; 4039 1.1 christos } 4040 1.1 christos else if (regname[0] == 'x' && regname[1] == 'd') 4041 1.1 christos { 4042 1.1 christos p = regname + 2; 4043 1.1 christos regnum = strtoul (p, &q, 10); 4044 1.1 christos if (p == q || *q || regnum >= 8) 4045 1.1 christos return -1; 4046 1.1 christos regnum += 87; 4047 } 4048 return regnum; 4049 } 4050 #endif /* OBJ_ELF */ 4051