1 1.1 christos /* tc-mn10300.c -- Assembler code for the Matsushita 10300 2 1.10 christos Copyright (C) 1996-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 #include "as.h" 22 1.1 christos #include "safe-ctype.h" 23 1.1 christos #include "subsegs.h" 24 1.1 christos #include "opcode/mn10300.h" 25 1.1 christos #include "dwarf2dbg.h" 26 1.1 christos #include "libiberty.h" 27 1.1 christos 28 1.1 christos /* Structure to hold information about predefined registers. */ 30 1.1 christos struct reg_name 31 1.1 christos { 32 1.1 christos const char *name; 33 1.1 christos int value; 34 1.1 christos }; 35 1.1 christos 36 1.1 christos /* Generic assembler global variables which must be defined by all 37 1.1 christos targets. */ 38 1.1 christos 39 1.1 christos /* Characters which always start a comment. */ 40 1.1 christos const char comment_chars[] = "#"; 41 1.1 christos 42 1.1 christos /* Characters which start a comment at the beginning of a line. */ 43 1.1 christos const char line_comment_chars[] = ";#"; 44 1.1 christos 45 1.1 christos /* Characters which may be used to separate multiple commands on a 46 1.1 christos single line. */ 47 1.1 christos const char line_separator_chars[] = ";"; 48 1.1 christos 49 1.1 christos /* Characters which are used to indicate an exponent in a floating 50 1.1 christos point number. */ 51 1.1 christos const char EXP_CHARS[] = "eE"; 52 1.1 christos 53 1.1 christos /* Characters which mean that a number is a floating point constant, 54 1.1 christos as in 0d1.0. */ 55 1.1 christos const char FLT_CHARS[] = "dD"; 56 1.1 christos 57 1.1 christos const relax_typeS md_relax_table[] = 59 1.1 christos { 60 1.1 christos /* The plus values for the bCC and fBCC instructions in the table below 61 1.1 christos are because the branch instruction is translated into a jump 62 1.1 christos instruction that is now +2 or +3 bytes further on in memory, and the 63 1.1 christos correct size of jump instruction must be selected. */ 64 1.1 christos /* bCC relaxing. */ 65 1.1 christos {0x7f, -0x80, 2, 1}, 66 1.1 christos {0x7fff + 2, -0x8000 + 2, 5, 2}, 67 1.1 christos {0x7fffffff, -0x80000000, 7, 0}, 68 1.1 christos 69 1.1 christos /* bCC relaxing (uncommon cases for 3byte length instructions) */ 70 1.1 christos {0x7f, -0x80, 3, 4}, 71 1.1 christos {0x7fff + 3, -0x8000 + 3, 6, 5}, 72 1.1 christos {0x7fffffff, -0x80000000, 8, 0}, 73 1.1 christos 74 1.1 christos /* call relaxing. */ 75 1.1 christos {0x7fff, -0x8000, 5, 7}, 76 1.1 christos {0x7fffffff, -0x80000000, 7, 0}, 77 1.1 christos 78 1.1 christos /* calls relaxing. */ 79 1.1 christos {0x7fff, -0x8000, 4, 9}, 80 1.1 christos {0x7fffffff, -0x80000000, 6, 0}, 81 1.1 christos 82 1.1 christos /* jmp relaxing. */ 83 1.1 christos {0x7f, -0x80, 2, 11}, 84 1.1 christos {0x7fff, -0x8000, 3, 12}, 85 1.1 christos {0x7fffffff, -0x80000000, 5, 0}, 86 1.1 christos 87 1.1 christos /* fbCC relaxing. */ 88 1.1 christos {0x7f, -0x80, 3, 14}, 89 1.1 christos {0x7fff + 3, -0x8000 + 3, 6, 15}, 90 1.1 christos {0x7fffffff, -0x80000000, 8, 0}, 91 1.1 christos 92 1.1 christos }; 93 1.1 christos 94 1.1 christos static int current_machine; 95 1.1 christos 96 1.1 christos /* Fixups. */ 97 1.1 christos #define MAX_INSN_FIXUPS 5 98 1.1 christos 99 1.1 christos struct mn10300_fixup 100 1.1 christos { 101 1.1 christos expressionS exp; 102 1.1 christos int opindex; 103 1.1 christos bfd_reloc_code_real_type reloc; 104 1.1 christos }; 105 1.1 christos struct mn10300_fixup fixups[MAX_INSN_FIXUPS]; 106 1.1 christos static int fc; 107 1.1 christos 108 1.1 christos /* We must store the value of each register operand so that we can 109 1.1 christos verify that certain registers do not match. */ 110 1.10 christos int mn10300_reg_operands[MN10300_MAX_OPERANDS]; 111 1.1 christos 112 1.10 christos const char md_shortopts[] = ""; 114 1.1 christos 115 1.1 christos const struct option md_longopts[] = 116 1.1 christos { 117 1.10 christos {NULL, no_argument, NULL, 0} 118 1.1 christos }; 119 1.1 christos 120 1.1 christos const size_t md_longopts_size = sizeof (md_longopts); 121 1.1 christos 122 1.1 christos #define HAVE_AM33_2 (current_machine == AM33_2) 123 1.1 christos #define HAVE_AM33 (current_machine == AM33 || HAVE_AM33_2) 124 1.8 christos #define HAVE_AM30 (current_machine == AM30) 125 1.1 christos 126 1.1 christos /* Opcode hash table. */ 127 1.1 christos static htab_t mn10300_hash; 128 1.1 christos 129 1.1 christos /* This table is sorted. Suitable for searching by a binary search. */ 130 1.1 christos static const struct reg_name data_registers[] = 131 1.1 christos { 132 1.1 christos { "d0", 0 }, 133 1.1 christos { "d1", 1 }, 134 1.1 christos { "d2", 2 }, 135 1.1 christos { "d3", 3 }, 136 1.1 christos }; 137 1.1 christos 138 1.1 christos static const struct reg_name address_registers[] = 139 1.1 christos { 140 1.1 christos { "a0", 0 }, 141 1.1 christos { "a1", 1 }, 142 1.1 christos { "a2", 2 }, 143 1.1 christos { "a3", 3 }, 144 1.1 christos }; 145 1.1 christos 146 1.1 christos static const struct reg_name r_registers[] = 147 1.1 christos { 148 1.1 christos { "a0", 8 }, 149 1.1 christos { "a1", 9 }, 150 1.1 christos { "a2", 10 }, 151 1.1 christos { "a3", 11 }, 152 1.1 christos { "d0", 12 }, 153 1.1 christos { "d1", 13 }, 154 1.1 christos { "d2", 14 }, 155 1.1 christos { "d3", 15 }, 156 1.1 christos { "e0", 0 }, 157 1.1 christos { "e1", 1 }, 158 1.1 christos { "e10", 10 }, 159 1.1 christos { "e11", 11 }, 160 1.1 christos { "e12", 12 }, 161 1.1 christos { "e13", 13 }, 162 1.1 christos { "e14", 14 }, 163 1.1 christos { "e15", 15 }, 164 1.1 christos { "e2", 2 }, 165 1.1 christos { "e3", 3 }, 166 1.1 christos { "e4", 4 }, 167 1.1 christos { "e5", 5 }, 168 1.1 christos { "e6", 6 }, 169 1.1 christos { "e7", 7 }, 170 1.1 christos { "e8", 8 }, 171 1.1 christos { "e9", 9 }, 172 1.1 christos { "r0", 0 }, 173 1.1 christos { "r1", 1 }, 174 1.1 christos { "r10", 10 }, 175 1.1 christos { "r11", 11 }, 176 1.1 christos { "r12", 12 }, 177 1.1 christos { "r13", 13 }, 178 1.1 christos { "r14", 14 }, 179 1.1 christos { "r15", 15 }, 180 1.1 christos { "r2", 2 }, 181 1.1 christos { "r3", 3 }, 182 1.1 christos { "r4", 4 }, 183 1.1 christos { "r5", 5 }, 184 1.1 christos { "r6", 6 }, 185 1.1 christos { "r7", 7 }, 186 1.1 christos { "r8", 8 }, 187 1.1 christos { "r9", 9 }, 188 1.1 christos }; 189 1.1 christos 190 1.1 christos static const struct reg_name xr_registers[] = 191 1.1 christos { 192 1.1 christos { "mcrh", 2 }, 193 1.1 christos { "mcrl", 3 }, 194 1.1 christos { "mcvf", 4 }, 195 1.1 christos { "mdrq", 1 }, 196 1.1 christos { "sp", 0 }, 197 1.1 christos { "xr0", 0 }, 198 1.1 christos { "xr1", 1 }, 199 1.1 christos { "xr10", 10 }, 200 1.1 christos { "xr11", 11 }, 201 1.1 christos { "xr12", 12 }, 202 1.1 christos { "xr13", 13 }, 203 1.1 christos { "xr14", 14 }, 204 1.1 christos { "xr15", 15 }, 205 1.1 christos { "xr2", 2 }, 206 1.1 christos { "xr3", 3 }, 207 1.1 christos { "xr4", 4 }, 208 1.1 christos { "xr5", 5 }, 209 1.1 christos { "xr6", 6 }, 210 1.1 christos { "xr7", 7 }, 211 1.1 christos { "xr8", 8 }, 212 1.1 christos { "xr9", 9 }, 213 1.1 christos }; 214 1.1 christos 215 1.1 christos static const struct reg_name float_registers[] = 216 1.1 christos { 217 1.1 christos { "fs0", 0 }, 218 1.1 christos { "fs1", 1 }, 219 1.1 christos { "fs10", 10 }, 220 1.1 christos { "fs11", 11 }, 221 1.1 christos { "fs12", 12 }, 222 1.1 christos { "fs13", 13 }, 223 1.1 christos { "fs14", 14 }, 224 1.1 christos { "fs15", 15 }, 225 1.1 christos { "fs16", 16 }, 226 1.1 christos { "fs17", 17 }, 227 1.1 christos { "fs18", 18 }, 228 1.1 christos { "fs19", 19 }, 229 1.1 christos { "fs2", 2 }, 230 1.1 christos { "fs20", 20 }, 231 1.1 christos { "fs21", 21 }, 232 1.1 christos { "fs22", 22 }, 233 1.1 christos { "fs23", 23 }, 234 1.1 christos { "fs24", 24 }, 235 1.1 christos { "fs25", 25 }, 236 1.1 christos { "fs26", 26 }, 237 1.1 christos { "fs27", 27 }, 238 1.1 christos { "fs28", 28 }, 239 1.1 christos { "fs29", 29 }, 240 1.1 christos { "fs3", 3 }, 241 1.1 christos { "fs30", 30 }, 242 1.1 christos { "fs31", 31 }, 243 1.1 christos { "fs4", 4 }, 244 1.1 christos { "fs5", 5 }, 245 1.1 christos { "fs6", 6 }, 246 1.1 christos { "fs7", 7 }, 247 1.1 christos { "fs8", 8 }, 248 1.1 christos { "fs9", 9 }, 249 1.1 christos }; 250 1.1 christos 251 1.1 christos static const struct reg_name double_registers[] = 252 1.1 christos { 253 1.1 christos { "fd0", 0 }, 254 1.1 christos { "fd10", 10 }, 255 1.1 christos { "fd12", 12 }, 256 1.1 christos { "fd14", 14 }, 257 1.1 christos { "fd16", 16 }, 258 1.1 christos { "fd18", 18 }, 259 1.1 christos { "fd2", 2 }, 260 1.1 christos { "fd20", 20 }, 261 1.1 christos { "fd22", 22 }, 262 1.1 christos { "fd24", 24 }, 263 1.1 christos { "fd26", 26 }, 264 1.1 christos { "fd28", 28 }, 265 1.1 christos { "fd30", 30 }, 266 1.1 christos { "fd4", 4 }, 267 1.1 christos { "fd6", 6 }, 268 1.1 christos { "fd8", 8 }, 269 1.1 christos }; 270 1.1 christos 271 1.1 christos /* We abuse the `value' field, that would be otherwise unused, to 272 1.1 christos encode the architecture on which (access to) the register was 273 1.1 christos introduced. FIXME: we should probably warn when we encounter a 274 1.1 christos register name when assembling for an architecture that doesn't 275 1.1 christos support it, before parsing it as a symbol name. */ 276 1.1 christos static const struct reg_name other_registers[] = 277 1.1 christos { 278 1.1 christos { "epsw", AM33 }, 279 1.1 christos { "mdr", 0 }, 280 1.1 christos { "pc", AM33 }, 281 1.1 christos { "psw", 0 }, 282 1.1 christos { "sp", 0 }, 283 1.1 christos { "ssp", 0 }, 284 1.1 christos { "usp", 0 }, 285 1.1 christos }; 286 1.1 christos 287 1.6 christos #define OTHER_REG_NAME_CNT ARRAY_SIZE (other_registers) 288 1.1 christos 289 1.1 christos /* Perform a binary search of the given register table REGS to see 290 1.1 christos if NAME is a valid register name. Returns the register number from 291 1.1 christos the array on success, or -1 on failure. */ 292 1.1 christos 293 1.1 christos static int 294 1.1 christos reg_name_search (const struct reg_name *regs, 295 1.1 christos int regcount, 296 1.1 christos const char *name) 297 1.1 christos { 298 1.1 christos int low, high; 299 1.1 christos 300 1.1 christos low = 0; 301 1.1 christos high = regcount - 1; 302 1.1 christos 303 1.1 christos do 304 1.1 christos { 305 1.1 christos int cmp, middle; 306 1.1 christos 307 1.1 christos middle = (low + high) / 2; 308 1.1 christos cmp = strcasecmp (name, regs[middle].name); 309 1.1 christos if (cmp < 0) 310 1.1 christos high = middle - 1; 311 1.1 christos else if (cmp > 0) 312 1.1 christos low = middle + 1; 313 1.1 christos else 314 1.1 christos return regs[middle].value; 315 1.1 christos } 316 1.1 christos while (low <= high); 317 1.1 christos 318 1.1 christos return -1; 319 1.1 christos } 320 1.1 christos 321 1.1 christos /* Looks at the current position in the input line to see if it is 322 1.1 christos the name of a register in TABLE. If it is, then the name is 323 1.1 christos converted into an expression returned in EXPRESSIONP (with X_op 324 1.1 christos set to O_register and X_add_number set to the register number), the 325 1.1 christos input pointer is left pointing at the first non-blank character after 326 1.8 christos the name and the function returns TRUE. Otherwise the input pointer 327 1.1 christos is left alone and the function returns FALSE. */ 328 1.1 christos 329 1.1 christos static bool 330 1.1 christos get_register_name (expressionS * expressionP, 331 1.1 christos const struct reg_name * table, 332 1.1 christos size_t table_length) 333 1.1 christos { 334 1.1 christos int reg_number; 335 1.1 christos char *name; 336 1.1 christos char *start; 337 1.3 christos char c; 338 1.1 christos 339 1.3 christos /* Find the spelling of the operand. */ 340 1.1 christos start = input_line_pointer; 341 1.1 christos 342 1.1 christos c = get_symbol_name (&name); 343 1.3 christos reg_number = reg_name_search (table, table_length, name); 344 1.1 christos 345 1.1 christos /* Put back the delimiting char. */ 346 1.1 christos (void) restore_line_pointer (c); 347 1.1 christos 348 1.1 christos /* Look to see if it's in the register table. */ 349 1.1 christos if (reg_number >= 0) 350 1.1 christos { 351 1.1 christos expressionP->X_op = O_register; 352 1.1 christos expressionP->X_add_number = reg_number; 353 1.1 christos 354 1.1 christos /* Make the rest nice. */ 355 1.8 christos expressionP->X_add_symbol = NULL; 356 1.1 christos expressionP->X_op_symbol = NULL; 357 1.1 christos 358 1.1 christos return true; 359 1.1 christos } 360 1.8 christos 361 1.1 christos /* Reset the line as if we had not done anything. */ 362 1.1 christos input_line_pointer = start; 363 1.8 christos return false; 364 1.1 christos } 365 1.1 christos 366 1.1 christos static bool 367 1.1 christos r_register_name (expressionS *expressionP) 368 1.1 christos { 369 1.1 christos return get_register_name (expressionP, r_registers, ARRAY_SIZE (r_registers)); 370 1.8 christos } 371 1.1 christos 372 1.1 christos 373 1.1 christos static bool 374 1.1 christos xr_register_name (expressionS *expressionP) 375 1.1 christos { 376 1.8 christos return get_register_name (expressionP, xr_registers, ARRAY_SIZE (xr_registers)); 377 1.1 christos } 378 1.1 christos 379 1.1 christos static bool 380 1.1 christos data_register_name (expressionS *expressionP) 381 1.1 christos { 382 1.8 christos return get_register_name (expressionP, data_registers, ARRAY_SIZE (data_registers)); 383 1.1 christos } 384 1.1 christos 385 1.1 christos static bool 386 1.1 christos address_register_name (expressionS *expressionP) 387 1.1 christos { 388 1.8 christos return get_register_name (expressionP, address_registers, ARRAY_SIZE (address_registers)); 389 1.1 christos } 390 1.1 christos 391 1.1 christos static bool 392 1.1 christos float_register_name (expressionS *expressionP) 393 1.1 christos { 394 1.8 christos return get_register_name (expressionP, float_registers, ARRAY_SIZE (float_registers)); 395 1.1 christos } 396 1.1 christos 397 1.1 christos static bool 398 1.1 christos double_register_name (expressionS *expressionP) 399 1.1 christos { 400 1.8 christos return get_register_name (expressionP, double_registers, ARRAY_SIZE (double_registers)); 401 1.1 christos } 402 1.1 christos 403 1.1 christos static bool 404 1.1 christos other_register_name (expressionS *expressionP) 405 1.1 christos { 406 1.1 christos int reg_number; 407 1.1 christos char *name; 408 1.1 christos char *start; 409 1.3 christos char c; 410 1.1 christos 411 1.3 christos /* Find the spelling of the operand. */ 412 1.1 christos start = input_line_pointer; 413 1.1 christos 414 1.1 christos c = get_symbol_name (&name); 415 1.3 christos reg_number = reg_name_search (other_registers, ARRAY_SIZE (other_registers), name); 416 1.1 christos 417 1.1 christos /* Put back the delimiting char. */ 418 1.1 christos (void) restore_line_pointer (c); 419 1.1 christos 420 1.1 christos /* Look to see if it's in the register table. */ 421 1.1 christos if (reg_number == 0 422 1.1 christos || (reg_number == AM33 && HAVE_AM33)) 423 1.1 christos { 424 1.1 christos expressionP->X_op = O_register; 425 1.1 christos expressionP->X_add_number = 0; 426 1.1 christos 427 1.1 christos /* Make the rest nice. */ 428 1.8 christos expressionP->X_add_symbol = NULL; 429 1.1 christos expressionP->X_op_symbol = NULL; 430 1.1 christos 431 1.1 christos return true; 432 1.1 christos } 433 1.8 christos 434 1.1 christos /* Reset the line as if we had not done anything. */ 435 1.1 christos input_line_pointer = start; 436 1.1 christos return false; 437 1.1 christos } 438 1.1 christos 439 1.1 christos void 440 1.1 christos md_show_usage (FILE *stream) 441 1.1 christos { 442 1.1 christos fprintf (stream, _("MN10300 assembler options:\n\ 443 1.1 christos none yet\n")); 444 1.5 christos } 445 1.1 christos 446 1.1 christos int 447 1.1 christos md_parse_option (int c ATTRIBUTE_UNUSED, const char *arg ATTRIBUTE_UNUSED) 448 1.1 christos { 449 1.1 christos return 0; 450 1.1 christos } 451 1.1 christos 452 1.1 christos symbolS * 453 1.1 christos md_undefined_symbol (char *name ATTRIBUTE_UNUSED) 454 1.1 christos { 455 1.5 christos return 0; 456 1.1 christos } 457 1.1 christos 458 1.8 christos const char * 459 1.1 christos md_atof (int type, char *litp, int *sizep) 460 1.1 christos { 461 1.1 christos return ieee_md_atof (type, litp, sizep, false); 462 1.1 christos } 463 1.1 christos 464 1.1 christos void 465 1.1 christos md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, 466 1.1 christos asection *sec, 467 1.1 christos fragS *fragP) 468 1.1 christos { 469 1.1 christos static unsigned long label_count = 0; 470 1.1 christos char buf[40]; 471 1.1 christos 472 1.1 christos if (fragP->fr_subtype == 0) 473 1.1 christos { 474 1.1 christos fix_new (fragP, fragP->fr_fix + 1, 1, fragP->fr_symbol, 475 1.1 christos fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL); 476 1.1 christos fragP->fr_var = 0; 477 1.1 christos fragP->fr_fix += 2; 478 1.1 christos } 479 1.1 christos else if (fragP->fr_subtype == 1) 480 1.1 christos { 481 1.1 christos /* Reverse the condition of the first branch. */ 482 1.1 christos int offset = fragP->fr_fix; 483 1.1 christos int opcode = fragP->fr_literal[offset] & 0xff; 484 1.1 christos 485 1.1 christos switch (opcode) 486 1.1 christos { 487 1.1 christos case 0xc8: 488 1.1 christos opcode = 0xc9; 489 1.1 christos break; 490 1.1 christos case 0xc9: 491 1.1 christos opcode = 0xc8; 492 1.1 christos break; 493 1.1 christos case 0xc0: 494 1.1 christos opcode = 0xc2; 495 1.1 christos break; 496 1.1 christos case 0xc2: 497 1.1 christos opcode = 0xc0; 498 1.1 christos break; 499 1.1 christos case 0xc3: 500 1.1 christos opcode = 0xc1; 501 1.1 christos break; 502 1.1 christos case 0xc1: 503 1.1 christos opcode = 0xc3; 504 1.1 christos break; 505 1.1 christos case 0xc4: 506 1.1 christos opcode = 0xc6; 507 1.1 christos break; 508 1.1 christos case 0xc6: 509 1.1 christos opcode = 0xc4; 510 1.1 christos break; 511 1.1 christos case 0xc7: 512 1.1 christos opcode = 0xc5; 513 1.1 christos break; 514 1.1 christos case 0xc5: 515 1.1 christos opcode = 0xc7; 516 1.1 christos break; 517 1.1 christos default: 518 1.1 christos abort (); 519 1.1 christos } 520 1.1 christos fragP->fr_literal[offset] = opcode; 521 1.1 christos 522 1.8 christos /* Create a fixup for the reversed conditional branch. */ 523 1.1 christos sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++); 524 1.1 christos fix_new (fragP, fragP->fr_fix + 1, 1, 525 1.1 christos symbol_new (buf, sec, fragP->fr_next, 0), 526 1.1 christos fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL); 527 1.1 christos 528 1.1 christos /* Now create the unconditional branch + fixup to the 529 1.1 christos final target. */ 530 1.1 christos fragP->fr_literal[offset + 2] = 0xcc; 531 1.1 christos fix_new (fragP, fragP->fr_fix + 3, 2, fragP->fr_symbol, 532 1.1 christos fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL); 533 1.1 christos fragP->fr_var = 0; 534 1.1 christos fragP->fr_fix += 5; 535 1.1 christos } 536 1.1 christos else if (fragP->fr_subtype == 2) 537 1.1 christos { 538 1.1 christos /* Reverse the condition of the first branch. */ 539 1.1 christos int offset = fragP->fr_fix; 540 1.1 christos int opcode = fragP->fr_literal[offset] & 0xff; 541 1.1 christos 542 1.1 christos switch (opcode) 543 1.1 christos { 544 1.1 christos case 0xc8: 545 1.1 christos opcode = 0xc9; 546 1.1 christos break; 547 1.1 christos case 0xc9: 548 1.1 christos opcode = 0xc8; 549 1.1 christos break; 550 1.1 christos case 0xc0: 551 1.1 christos opcode = 0xc2; 552 1.1 christos break; 553 1.1 christos case 0xc2: 554 1.1 christos opcode = 0xc0; 555 1.1 christos break; 556 1.1 christos case 0xc3: 557 1.1 christos opcode = 0xc1; 558 1.1 christos break; 559 1.1 christos case 0xc1: 560 1.1 christos opcode = 0xc3; 561 1.1 christos break; 562 1.1 christos case 0xc4: 563 1.1 christos opcode = 0xc6; 564 1.1 christos break; 565 1.1 christos case 0xc6: 566 1.1 christos opcode = 0xc4; 567 1.1 christos break; 568 1.1 christos case 0xc7: 569 1.1 christos opcode = 0xc5; 570 1.1 christos break; 571 1.1 christos case 0xc5: 572 1.1 christos opcode = 0xc7; 573 1.1 christos break; 574 1.1 christos default: 575 1.1 christos abort (); 576 1.1 christos } 577 1.1 christos fragP->fr_literal[offset] = opcode; 578 1.1 christos 579 1.8 christos /* Create a fixup for the reversed conditional branch. */ 580 1.1 christos sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++); 581 1.1 christos fix_new (fragP, fragP->fr_fix + 1, 1, 582 1.1 christos symbol_new (buf, sec, fragP->fr_next, 0), 583 1.1 christos fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL); 584 1.1 christos 585 1.1 christos /* Now create the unconditional branch + fixup to the 586 1.1 christos final target. */ 587 1.1 christos fragP->fr_literal[offset + 2] = 0xdc; 588 1.1 christos fix_new (fragP, fragP->fr_fix + 3, 4, fragP->fr_symbol, 589 1.1 christos fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL); 590 1.1 christos fragP->fr_var = 0; 591 1.1 christos fragP->fr_fix += 7; 592 1.1 christos } 593 1.1 christos else if (fragP->fr_subtype == 3) 594 1.1 christos { 595 1.1 christos fix_new (fragP, fragP->fr_fix + 2, 1, fragP->fr_symbol, 596 1.1 christos fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL); 597 1.1 christos fragP->fr_var = 0; 598 1.1 christos fragP->fr_fix += 3; 599 1.1 christos } 600 1.1 christos else if (fragP->fr_subtype == 4) 601 1.1 christos { 602 1.1 christos /* Reverse the condition of the first branch. */ 603 1.1 christos int offset = fragP->fr_fix; 604 1.1 christos int opcode = fragP->fr_literal[offset + 1] & 0xff; 605 1.1 christos 606 1.1 christos switch (opcode) 607 1.1 christos { 608 1.1 christos case 0xe8: 609 1.1 christos opcode = 0xe9; 610 1.1 christos break; 611 1.1 christos case 0xe9: 612 1.1 christos opcode = 0xe8; 613 1.1 christos break; 614 1.1 christos case 0xea: 615 1.1 christos opcode = 0xeb; 616 1.1 christos break; 617 1.1 christos case 0xeb: 618 1.1 christos opcode = 0xea; 619 1.1 christos break; 620 1.1 christos default: 621 1.1 christos abort (); 622 1.1 christos } 623 1.1 christos fragP->fr_literal[offset + 1] = opcode; 624 1.1 christos 625 1.8 christos /* Create a fixup for the reversed conditional branch. */ 626 1.1 christos sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++); 627 1.1 christos fix_new (fragP, fragP->fr_fix + 2, 1, 628 1.1 christos symbol_new (buf, sec, fragP->fr_next, 0), 629 1.1 christos fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL); 630 1.1 christos 631 1.1 christos /* Now create the unconditional branch + fixup to the 632 1.1 christos final target. */ 633 1.1 christos fragP->fr_literal[offset + 3] = 0xcc; 634 1.1 christos fix_new (fragP, fragP->fr_fix + 4, 2, fragP->fr_symbol, 635 1.1 christos fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL); 636 1.1 christos fragP->fr_var = 0; 637 1.1 christos fragP->fr_fix += 6; 638 1.1 christos } 639 1.1 christos else if (fragP->fr_subtype == 5) 640 1.1 christos { 641 1.1 christos /* Reverse the condition of the first branch. */ 642 1.1 christos int offset = fragP->fr_fix; 643 1.1 christos int opcode = fragP->fr_literal[offset + 1] & 0xff; 644 1.1 christos 645 1.1 christos switch (opcode) 646 1.1 christos { 647 1.1 christos case 0xe8: 648 1.1 christos opcode = 0xe9; 649 1.1 christos break; 650 1.1 christos case 0xea: 651 1.1 christos opcode = 0xeb; 652 1.1 christos break; 653 1.1 christos case 0xeb: 654 1.1 christos opcode = 0xea; 655 1.1 christos break; 656 1.1 christos default: 657 1.1 christos abort (); 658 1.1 christos } 659 1.1 christos fragP->fr_literal[offset + 1] = opcode; 660 1.1 christos 661 1.8 christos /* Create a fixup for the reversed conditional branch. */ 662 1.1 christos sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++); 663 1.1 christos fix_new (fragP, fragP->fr_fix + 2, 1, 664 1.1 christos symbol_new (buf, sec, fragP->fr_next, 0), 665 1.1 christos fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL); 666 1.1 christos 667 1.1 christos /* Now create the unconditional branch + fixup to the 668 1.1 christos final target. */ 669 1.1 christos fragP->fr_literal[offset + 3] = 0xdc; 670 1.1 christos fix_new (fragP, fragP->fr_fix + 4, 4, fragP->fr_symbol, 671 1.1 christos fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL); 672 1.1 christos fragP->fr_var = 0; 673 1.1 christos fragP->fr_fix += 8; 674 1.1 christos } 675 1.1 christos else if (fragP->fr_subtype == 6) 676 1.1 christos { 677 1.1 christos int offset = fragP->fr_fix; 678 1.1 christos 679 1.1 christos fragP->fr_literal[offset] = 0xcd; 680 1.1 christos fix_new (fragP, fragP->fr_fix + 1, 2, fragP->fr_symbol, 681 1.1 christos fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL); 682 1.1 christos fragP->fr_var = 0; 683 1.1 christos fragP->fr_fix += 5; 684 1.1 christos } 685 1.1 christos else if (fragP->fr_subtype == 7) 686 1.1 christos { 687 1.1 christos int offset = fragP->fr_fix; 688 1.1 christos 689 1.1 christos fragP->fr_literal[offset] = 0xdd; 690 1.1 christos fragP->fr_literal[offset + 5] = fragP->fr_literal[offset + 3]; 691 1.1 christos fragP->fr_literal[offset + 6] = fragP->fr_literal[offset + 4]; 692 1.1 christos fragP->fr_literal[offset + 3] = 0; 693 1.1 christos fragP->fr_literal[offset + 4] = 0; 694 1.1 christos 695 1.1 christos fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol, 696 1.1 christos fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL); 697 1.1 christos fragP->fr_var = 0; 698 1.1 christos fragP->fr_fix += 7; 699 1.1 christos } 700 1.1 christos else if (fragP->fr_subtype == 8) 701 1.1 christos { 702 1.1 christos int offset = fragP->fr_fix; 703 1.1 christos 704 1.1 christos fragP->fr_literal[offset] = 0xfa; 705 1.1 christos fragP->fr_literal[offset + 1] = 0xff; 706 1.1 christos fix_new (fragP, fragP->fr_fix + 2, 2, fragP->fr_symbol, 707 1.1 christos fragP->fr_offset + 2, 1, BFD_RELOC_16_PCREL); 708 1.1 christos fragP->fr_var = 0; 709 1.1 christos fragP->fr_fix += 4; 710 1.1 christos } 711 1.1 christos else if (fragP->fr_subtype == 9) 712 1.1 christos { 713 1.1 christos int offset = fragP->fr_fix; 714 1.1 christos 715 1.1 christos fragP->fr_literal[offset] = 0xfc; 716 1.1 christos fragP->fr_literal[offset + 1] = 0xff; 717 1.1 christos 718 1.1 christos fix_new (fragP, fragP->fr_fix + 2, 4, fragP->fr_symbol, 719 1.1 christos fragP->fr_offset + 2, 1, BFD_RELOC_32_PCREL); 720 1.1 christos fragP->fr_var = 0; 721 1.1 christos fragP->fr_fix += 6; 722 1.1 christos } 723 1.1 christos else if (fragP->fr_subtype == 10) 724 1.1 christos { 725 1.1 christos fragP->fr_literal[fragP->fr_fix] = 0xca; 726 1.1 christos fix_new (fragP, fragP->fr_fix + 1, 1, fragP->fr_symbol, 727 1.1 christos fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL); 728 1.1 christos fragP->fr_var = 0; 729 1.1 christos fragP->fr_fix += 2; 730 1.1 christos } 731 1.1 christos else if (fragP->fr_subtype == 11) 732 1.1 christos { 733 1.1 christos int offset = fragP->fr_fix; 734 1.1 christos 735 1.1 christos fragP->fr_literal[offset] = 0xcc; 736 1.1 christos 737 1.1 christos fix_new (fragP, fragP->fr_fix + 1, 2, fragP->fr_symbol, 738 1.1 christos fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL); 739 1.1 christos fragP->fr_var = 0; 740 1.1 christos fragP->fr_fix += 3; 741 1.1 christos } 742 1.1 christos else if (fragP->fr_subtype == 12) 743 1.1 christos { 744 1.1 christos int offset = fragP->fr_fix; 745 1.1 christos 746 1.1 christos fragP->fr_literal[offset] = 0xdc; 747 1.1 christos 748 1.1 christos fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol, 749 1.1 christos fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL); 750 1.1 christos fragP->fr_var = 0; 751 1.1 christos fragP->fr_fix += 5; 752 1.1 christos } 753 1.1 christos else if (fragP->fr_subtype == 13) 754 1.1 christos { 755 1.1 christos fix_new (fragP, fragP->fr_fix + 2, 1, fragP->fr_symbol, 756 1.1 christos fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL); 757 1.1 christos fragP->fr_var = 0; 758 1.1 christos fragP->fr_fix += 3; 759 1.1 christos } 760 1.1 christos else if (fragP->fr_subtype == 14) 761 1.1 christos { 762 1.1 christos /* Reverse the condition of the first branch. */ 763 1.1 christos int offset = fragP->fr_fix; 764 1.1 christos int opcode = fragP->fr_literal[offset + 1] & 0xff; 765 1.1 christos 766 1.1 christos switch (opcode) 767 1.1 christos { 768 1.1 christos case 0xd0: 769 1.1 christos opcode = 0xd1; 770 1.1 christos break; 771 1.1 christos case 0xd1: 772 1.1 christos opcode = 0xd0; 773 1.1 christos break; 774 1.1 christos case 0xd2: 775 1.1 christos opcode = 0xdc; 776 1.1 christos break; 777 1.1 christos case 0xd3: 778 1.1 christos opcode = 0xdb; 779 1.1 christos break; 780 1.1 christos case 0xd4: 781 1.1 christos opcode = 0xda; 782 1.1 christos break; 783 1.1 christos case 0xd5: 784 1.1 christos opcode = 0xd9; 785 1.1 christos break; 786 1.1 christos case 0xd6: 787 1.1 christos opcode = 0xd8; 788 1.1 christos break; 789 1.1 christos case 0xd7: 790 1.1 christos opcode = 0xdd; 791 1.1 christos break; 792 1.1 christos case 0xd8: 793 1.1 christos opcode = 0xd6; 794 1.1 christos break; 795 1.1 christos case 0xd9: 796 1.1 christos opcode = 0xd5; 797 1.1 christos break; 798 1.1 christos case 0xda: 799 1.1 christos opcode = 0xd4; 800 1.1 christos break; 801 1.1 christos case 0xdb: 802 1.1 christos opcode = 0xd3; 803 1.1 christos break; 804 1.1 christos case 0xdc: 805 1.1 christos opcode = 0xd2; 806 1.1 christos break; 807 1.1 christos case 0xdd: 808 1.1 christos opcode = 0xd7; 809 1.1 christos break; 810 1.1 christos default: 811 1.1 christos abort (); 812 1.1 christos } 813 1.1 christos fragP->fr_literal[offset + 1] = opcode; 814 1.1 christos 815 1.8 christos /* Create a fixup for the reversed conditional branch. */ 816 1.1 christos sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++); 817 1.1 christos fix_new (fragP, fragP->fr_fix + 2, 1, 818 1.1 christos symbol_new (buf, sec, fragP->fr_next, 0), 819 1.1 christos fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL); 820 1.1 christos 821 1.1 christos /* Now create the unconditional branch + fixup to the 822 1.1 christos final target. */ 823 1.1 christos fragP->fr_literal[offset + 3] = 0xcc; 824 1.1 christos fix_new (fragP, fragP->fr_fix + 4, 2, fragP->fr_symbol, 825 1.1 christos fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL); 826 1.1 christos fragP->fr_var = 0; 827 1.1 christos fragP->fr_fix += 6; 828 1.1 christos } 829 1.1 christos else if (fragP->fr_subtype == 15) 830 1.1 christos { 831 1.1 christos /* Reverse the condition of the first branch. */ 832 1.1 christos int offset = fragP->fr_fix; 833 1.1 christos int opcode = fragP->fr_literal[offset + 1] & 0xff; 834 1.1 christos 835 1.1 christos switch (opcode) 836 1.1 christos { 837 1.1 christos case 0xd0: 838 1.1 christos opcode = 0xd1; 839 1.1 christos break; 840 1.1 christos case 0xd1: 841 1.1 christos opcode = 0xd0; 842 1.1 christos break; 843 1.1 christos case 0xd2: 844 1.1 christos opcode = 0xdc; 845 1.1 christos break; 846 1.1 christos case 0xd3: 847 1.1 christos opcode = 0xdb; 848 1.1 christos break; 849 1.1 christos case 0xd4: 850 1.1 christos opcode = 0xda; 851 1.1 christos break; 852 1.1 christos case 0xd5: 853 1.1 christos opcode = 0xd9; 854 1.1 christos break; 855 1.1 christos case 0xd6: 856 1.1 christos opcode = 0xd8; 857 1.1 christos break; 858 1.1 christos case 0xd7: 859 1.1 christos opcode = 0xdd; 860 1.1 christos break; 861 1.1 christos case 0xd8: 862 1.1 christos opcode = 0xd6; 863 1.1 christos break; 864 1.1 christos case 0xd9: 865 1.1 christos opcode = 0xd5; 866 1.1 christos break; 867 1.1 christos case 0xda: 868 1.1 christos opcode = 0xd4; 869 1.1 christos break; 870 1.1 christos case 0xdb: 871 1.1 christos opcode = 0xd3; 872 1.1 christos break; 873 1.1 christos case 0xdc: 874 1.1 christos opcode = 0xd2; 875 1.1 christos break; 876 1.1 christos case 0xdd: 877 1.1 christos opcode = 0xd7; 878 1.1 christos break; 879 1.1 christos default: 880 1.1 christos abort (); 881 1.1 christos } 882 1.1 christos fragP->fr_literal[offset + 1] = opcode; 883 1.1 christos 884 1.8 christos /* Create a fixup for the reversed conditional branch. */ 885 1.1 christos sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++); 886 1.1 christos fix_new (fragP, fragP->fr_fix + 2, 1, 887 1.1 christos symbol_new (buf, sec, fragP->fr_next, 0), 888 1.1 christos fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL); 889 1.1 christos 890 1.1 christos /* Now create the unconditional branch + fixup to the 891 1.1 christos final target. */ 892 1.1 christos fragP->fr_literal[offset + 3] = 0xdc; 893 1.1 christos fix_new (fragP, fragP->fr_fix + 4, 4, fragP->fr_symbol, 894 1.1 christos fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL); 895 1.1 christos fragP->fr_var = 0; 896 1.1 christos fragP->fr_fix += 8; 897 1.1 christos } 898 1.1 christos else 899 1.1 christos abort (); 900 1.1 christos } 901 1.1 christos 902 1.7 christos valueT 903 1.1 christos md_section_align (asection *seg, valueT addr) 904 1.10 christos { 905 1.1 christos int align = bfd_section_alignment (seg); 906 1.1 christos 907 1.1 christos return (addr + ((valueT) 1 << align) - 1) & -((valueT) 1 << align); 908 1.1 christos } 909 1.1 christos 910 1.5 christos void 911 1.1 christos md_begin (void) 912 1.1 christos { 913 1.8 christos const char *prev_name = ""; 914 1.1 christos const struct mn10300_opcode *op; 915 1.1 christos 916 1.1 christos mn10300_hash = str_htab_create (); 917 1.1 christos 918 1.1 christos /* Insert unique names into hash table. The MN10300 instruction set 919 1.1 christos has many identical opcode names that have different opcodes based 920 1.1 christos on the operands. This hash table then provides a quick index to 921 1.1 christos the first opcode with a particular name in the opcode table. */ 922 1.1 christos 923 1.1 christos op = mn10300_opcodes; 924 1.1 christos while (op->name) 925 1.10 christos { 926 1.8 christos if (strcmp (prev_name, op->name)) 927 1.1 christos { 928 1.1 christos prev_name = op->name; 929 1.1 christos str_hash_insert (mn10300_hash, op->name, op, 0); 930 1.1 christos } 931 1.1 christos op++; 932 1.1 christos } 933 1.1 christos 934 1.1 christos /* Set the default machine type. */ 935 1.1 christos #ifdef TE_LINUX 936 1.1 christos if (!bfd_set_arch_mach (stdoutput, bfd_arch_mn10300, AM33_2)) 937 1.3 christos as_warn (_("could not set architecture and machine")); 938 1.1 christos 939 1.1 christos current_machine = AM33_2; 940 1.1 christos #else 941 1.1 christos if (!bfd_set_arch_mach (stdoutput, bfd_arch_mn10300, MN103)) 942 1.1 christos as_warn (_("could not set architecture and machine")); 943 1.5 christos 944 1.5 christos current_machine = MN103; 945 1.5 christos #endif 946 1.1 christos 947 1.1 christos /* Set linkrelax here to avoid fixups in most sections. */ 948 1.1 christos linkrelax = 1; 949 1.1 christos } 950 1.1 christos 951 1.1 christos static symbolS *GOT_symbol; 952 1.1 christos 953 1.1 christos static inline int 954 1.1 christos mn10300_PIC_related_p (symbolS *sym) 955 1.1 christos { 956 1.1 christos expressionS *exp; 957 1.1 christos 958 1.1 christos if (! sym) 959 1.1 christos return 0; 960 1.1 christos 961 1.1 christos if (sym == GOT_symbol) 962 1.1 christos return 1; 963 1.1 christos 964 1.1 christos exp = symbol_get_value_expression (sym); 965 1.1 christos 966 1.1 christos return (exp->X_op == O_PIC_reloc 967 1.1 christos || mn10300_PIC_related_p (exp->X_add_symbol) 968 1.1 christos || mn10300_PIC_related_p (exp->X_op_symbol)); 969 1.1 christos } 970 1.1 christos 971 1.1 christos static inline int 972 1.1 christos mn10300_check_fixup (struct mn10300_fixup *fixup) 973 1.1 christos { 974 1.1 christos expressionS *exp = &fixup->exp; 975 1.1 christos 976 1.1 christos repeat: 977 1.1 christos switch (exp->X_op) 978 1.1 christos { 979 1.1 christos case O_add: 980 1.1 christos case O_subtract: /* If we're sufficiently unlucky that the label 981 1.1 christos and the expression that references it happen 982 1.1 christos to end up in different frags, the subtract 983 1.1 christos won't be simplified within expression(). */ 984 1.1 christos /* The PIC-related operand must be the first operand of a sum. */ 985 1.1 christos if (exp != &fixup->exp || mn10300_PIC_related_p (exp->X_op_symbol)) 986 1.1 christos return 1; 987 1.1 christos 988 1.1 christos if (exp->X_add_symbol && exp->X_add_symbol == GOT_symbol) 989 1.1 christos fixup->reloc = BFD_RELOC_32_GOT_PCREL; 990 1.1 christos 991 1.1 christos exp = symbol_get_value_expression (exp->X_add_symbol); 992 1.1 christos goto repeat; 993 1.1 christos 994 1.1 christos case O_symbol: 995 1.1 christos if (exp->X_add_symbol && exp->X_add_symbol == GOT_symbol) 996 1.1 christos fixup->reloc = BFD_RELOC_32_GOT_PCREL; 997 1.1 christos break; 998 1.1 christos 999 1.1 christos case O_PIC_reloc: 1000 1.1 christos fixup->reloc = exp->X_md; 1001 1.1 christos exp->X_op = O_symbol; 1002 1.1 christos if (fixup->reloc == BFD_RELOC_32_PLT_PCREL 1003 1.1 christos && fixup->opindex >= 0 1004 1.1 christos && (mn10300_operands[fixup->opindex].flags 1005 1.1 christos & MN10300_OPERAND_RELAX)) 1006 1.1 christos return 1; 1007 1.1 christos break; 1008 1.1 christos 1009 1.1 christos default: 1010 1.1 christos return (mn10300_PIC_related_p (exp->X_add_symbol) 1011 1.1 christos || mn10300_PIC_related_p (exp->X_op_symbol)); 1012 1.1 christos } 1013 1.1 christos 1014 1.1 christos return 0; 1015 1.3 christos } 1016 1.3 christos 1017 1.1 christos void 1018 1.1 christos mn10300_cons_fix_new (fragS *frag, int off, int size, expressionS *exp, 1019 1.1 christos bfd_reloc_code_real_type r ATTRIBUTE_UNUSED) 1020 1.1 christos { 1021 1.1 christos struct mn10300_fixup fixup; 1022 1.1 christos 1023 1.1 christos fixup.opindex = -1; 1024 1.1 christos fixup.exp = *exp; 1025 1.1 christos fixup.reloc = BFD_RELOC_UNUSED; 1026 1.1 christos 1027 1.1 christos mn10300_check_fixup (&fixup); 1028 1.1 christos 1029 1.1 christos if (fixup.reloc == BFD_RELOC_MN10300_GOT32) 1030 1.1 christos switch (size) 1031 1.1 christos { 1032 1.1 christos case 2: 1033 1.1 christos fixup.reloc = BFD_RELOC_MN10300_GOT16; 1034 1.1 christos break; 1035 1.1 christos 1036 1.1 christos case 3: 1037 1.1 christos fixup.reloc = BFD_RELOC_MN10300_GOT24; 1038 1.1 christos break; 1039 1.1 christos 1040 1.1 christos case 4: 1041 1.1 christos break; 1042 1.1 christos 1043 1.1 christos default: 1044 1.1 christos goto error; 1045 1.1 christos } 1046 1.1 christos else if (fixup.reloc == BFD_RELOC_UNUSED) 1047 1.1 christos switch (size) 1048 1.1 christos { 1049 1.1 christos case 1: 1050 1.1 christos fixup.reloc = BFD_RELOC_8; 1051 1.1 christos break; 1052 1.1 christos 1053 1.1 christos case 2: 1054 1.1 christos fixup.reloc = BFD_RELOC_16; 1055 1.1 christos break; 1056 1.1 christos 1057 1.1 christos case 3: 1058 1.1 christos fixup.reloc = BFD_RELOC_24; 1059 1.1 christos break; 1060 1.1 christos 1061 1.1 christos case 4: 1062 1.1 christos fixup.reloc = BFD_RELOC_32; 1063 1.1 christos break; 1064 1.1 christos 1065 1.1 christos default: 1066 1.1 christos goto error; 1067 1.1 christos } 1068 1.1 christos else if (size != 4) 1069 1.1 christos { 1070 1.1 christos error: 1071 1.3 christos as_bad (_("unsupported BFD relocation size %u"), size); 1072 1.1 christos fixup.reloc = BFD_RELOC_UNUSED; 1073 1.1 christos } 1074 1.1 christos 1075 1.8 christos fix_new_exp (frag, off, size, &fixup.exp, 0, fixup.reloc); 1076 1.1 christos } 1077 1.1 christos 1078 1.1 christos static bool 1079 1.1 christos check_operand (const struct mn10300_operand *operand, 1080 1.1 christos offsetT val) 1081 1.1 christos { 1082 1.1 christos /* No need to check 32bit operands for a bit. Note that 1083 1.1 christos MN10300_OPERAND_SPLIT is an implicit 32bit operand. */ 1084 1.1 christos if (operand->bits != 32 1085 1.1 christos && (operand->flags & MN10300_OPERAND_SPLIT) == 0) 1086 1.1 christos { 1087 1.1 christos long min, max; 1088 1.1 christos offsetT test; 1089 1.1 christos int bits; 1090 1.1 christos 1091 1.1 christos bits = operand->bits; 1092 1.1 christos if (operand->flags & MN10300_OPERAND_24BIT) 1093 1.1 christos bits = 24; 1094 1.1 christos 1095 1.1 christos if ((operand->flags & MN10300_OPERAND_SIGNED) != 0) 1096 1.1 christos { 1097 1.1 christos max = (1 << (bits - 1)) - 1; 1098 1.1 christos min = - (1 << (bits - 1)); 1099 1.1 christos } 1100 1.1 christos else 1101 1.1 christos { 1102 1.1 christos max = (1 << bits) - 1; 1103 1.1 christos min = 0; 1104 1.1 christos } 1105 1.10 christos 1106 1.8 christos test = val; 1107 1.1 christos 1108 1.8 christos if (test < min || test > max) 1109 1.1 christos return false; 1110 1.1 christos } 1111 1.1 christos return true; 1112 1.1 christos } 1113 1.1 christos 1114 1.1 christos /* Insert an operand value into an instruction. */ 1115 1.1 christos 1116 1.1 christos static void 1117 1.1 christos mn10300_insert_operand (unsigned long *insnp, 1118 1.1 christos unsigned long *extensionp, 1119 1.1 christos const struct mn10300_operand *operand, 1120 1.1 christos offsetT val, 1121 1.1 christos char *file, 1122 1.1 christos unsigned int line, 1123 1.1 christos unsigned int shift) 1124 1.1 christos { 1125 1.1 christos /* No need to check 32bit operands for a bit. Note that 1126 1.1 christos MN10300_OPERAND_SPLIT is an implicit 32bit operand. */ 1127 1.1 christos if (operand->bits != 32 1128 1.1 christos && (operand->flags & MN10300_OPERAND_SPLIT) == 0) 1129 1.1 christos { 1130 1.1 christos long min, max; 1131 1.1 christos offsetT test; 1132 1.1 christos int bits; 1133 1.1 christos 1134 1.1 christos bits = operand->bits; 1135 1.1 christos if (operand->flags & MN10300_OPERAND_24BIT) 1136 1.1 christos bits = 24; 1137 1.1 christos 1138 1.1 christos if ((operand->flags & MN10300_OPERAND_SIGNED) != 0) 1139 1.1 christos { 1140 1.1 christos max = (1 << (bits - 1)) - 1; 1141 1.1 christos min = - (1 << (bits - 1)); 1142 1.1 christos } 1143 1.1 christos else 1144 1.1 christos { 1145 1.1 christos max = (1 << bits) - 1; 1146 1.1 christos min = 0; 1147 1.1 christos } 1148 1.10 christos 1149 1.10 christos test = val; 1150 1.10 christos 1151 1.1 christos if (test < min || test > max) 1152 1.1 christos as_warn_value_out_of_range (_("operand"), test, (offsetT) min, 1153 1.1 christos (offsetT) max, file, line); 1154 1.1 christos } 1155 1.1 christos 1156 1.1 christos if ((operand->flags & MN10300_OPERAND_SPLIT) != 0) 1157 1.1 christos { 1158 1.1 christos *insnp |= (val >> (32 - operand->bits)) & ((1 << operand->bits) - 1); 1159 1.1 christos *extensionp |= ((val & ((1 << (32 - operand->bits)) - 1)) 1160 1.1 christos << operand->shift); 1161 1.1 christos } 1162 1.1 christos else if ((operand->flags & MN10300_OPERAND_24BIT) != 0) 1163 1.1 christos { 1164 1.1 christos *insnp |= (val >> (24 - operand->bits)) & ((1 << operand->bits) - 1); 1165 1.1 christos *extensionp |= ((val & ((1 << (24 - operand->bits)) - 1)) 1166 1.1 christos << operand->shift); 1167 1.1 christos } 1168 1.1 christos else if ((operand->flags & (MN10300_OPERAND_FSREG | MN10300_OPERAND_FDREG))) 1169 1.1 christos { 1170 1.1 christos /* See devo/opcodes/m10300-opc.c just before #define FSM0 for an 1171 1.1 christos explanation of these variables. Note that FMT-implied shifts 1172 1.1 christos are not taken into account for FP registers. */ 1173 1.1 christos unsigned long mask_low, mask_high; 1174 1.1 christos int shl_low, shr_high, shl_high; 1175 1.1 christos 1176 1.1 christos switch (operand->bits) 1177 1.1 christos { 1178 1.1 christos case 5: 1179 1.1 christos /* Handle regular FP registers. */ 1180 1.1 christos if (operand->shift >= 0) 1181 1.1 christos { 1182 1.1 christos /* This is an `m' register. */ 1183 1.1 christos shl_low = operand->shift; 1184 1.1 christos shl_high = 8 + (8 & shl_low) + (shl_low & 4) / 4; 1185 1.1 christos } 1186 1.1 christos else 1187 1.1 christos { 1188 1.1 christos /* This is an `n' register. */ 1189 1.1 christos shl_low = -operand->shift; 1190 1.1 christos shl_high = shl_low / 4; 1191 1.1 christos } 1192 1.1 christos 1193 1.1 christos mask_low = 0x0f; 1194 1.1 christos mask_high = 0x10; 1195 1.1 christos shr_high = 4; 1196 1.1 christos break; 1197 1.1 christos 1198 1.1 christos case 3: 1199 1.1 christos /* Handle accumulators. */ 1200 1.1 christos shl_low = -operand->shift; 1201 1.1 christos shl_high = 0; 1202 1.1 christos mask_low = 0x03; 1203 1.1 christos mask_high = 0x04; 1204 1.1 christos shr_high = 2; 1205 1.1 christos break; 1206 1.1 christos 1207 1.1 christos default: 1208 1.1 christos abort (); 1209 1.1 christos } 1210 1.1 christos *insnp |= ((((val & mask_high) >> shr_high) << shl_high) 1211 1.1 christos | ((val & mask_low) << shl_low)); 1212 1.10 christos } 1213 1.1 christos else if ((operand->flags & MN10300_OPERAND_EXTENDED) == 0) 1214 1.1 christos { 1215 1.1 christos *insnp |= ((val & ((1 << operand->bits) - 1)) 1216 1.10 christos << (operand->shift + shift)); 1217 1.1 christos 1218 1.1 christos if ((operand->flags & MN10300_OPERAND_REPEATED) != 0) 1219 1.1 christos *insnp |= ((val & ((1 << operand->bits) - 1)) 1220 1.1 christos << (operand->shift + shift + operand->bits)); 1221 1.10 christos } 1222 1.1 christos else 1223 1.1 christos { 1224 1.1 christos *extensionp |= ((val & ((1 << operand->bits) - 1)) 1225 1.10 christos << (operand->shift + shift)); 1226 1.1 christos 1227 1.1 christos if ((operand->flags & MN10300_OPERAND_REPEATED) != 0) 1228 1.1 christos *extensionp |= ((val & ((1 << operand->bits) - 1)) 1229 1.1 christos << (operand->shift + shift + operand->bits)); 1230 1.1 christos } 1231 1.1 christos } 1232 1.1 christos 1233 1.1 christos void 1234 1.1 christos md_assemble (char *str) 1235 1.1 christos { 1236 1.1 christos char *s; 1237 1.1 christos struct mn10300_opcode *opcode; 1238 1.1 christos struct mn10300_opcode *next_opcode; 1239 1.1 christos const unsigned char *opindex_ptr; 1240 1.1 christos int next_opindex, relaxable; 1241 1.1 christos unsigned long insn, extension, size = 0; 1242 1.1 christos char *f; 1243 1.1 christos int i; 1244 1.10 christos int match; 1245 1.1 christos 1246 1.1 christos /* Get the opcode. */ 1247 1.1 christos for (s = str; !is_end_of_stmt (*s) && !is_whitespace (*s); s++) 1248 1.1 christos ; 1249 1.1 christos if (*s != '\0') 1250 1.10 christos *s++ = '\0'; 1251 1.1 christos 1252 1.1 christos /* Find the first opcode with the proper name. */ 1253 1.1 christos opcode = str_hash_find (mn10300_hash, str); 1254 1.1 christos if (opcode == NULL) 1255 1.1 christos { 1256 1.1 christos as_bad (_("Unrecognized opcode: `%s'"), str); 1257 1.1 christos return; 1258 1.10 christos } 1259 1.1 christos 1260 1.1 christos str = s; 1261 1.1 christos while (is_whitespace (*str)) 1262 1.1 christos ++str; 1263 1.1 christos 1264 1.1 christos input_line_pointer = str; 1265 1.1 christos 1266 1.1 christos for (;;) 1267 1.1 christos { 1268 1.1 christos const char *errmsg; 1269 1.1 christos int op_idx; 1270 1.1 christos char *hold; 1271 1.1 christos int extra_shift = 0; 1272 1.1 christos 1273 1.1 christos errmsg = _("Invalid opcode/operands"); 1274 1.1 christos 1275 1.1 christos /* Reset the array of register operands. */ 1276 1.1 christos memset (mn10300_reg_operands, -1, sizeof (mn10300_reg_operands)); 1277 1.1 christos 1278 1.1 christos relaxable = 0; 1279 1.1 christos fc = 0; 1280 1.1 christos match = 0; 1281 1.1 christos next_opindex = 0; 1282 1.1 christos insn = opcode->opcode; 1283 1.1 christos extension = 0; 1284 1.1 christos 1285 1.1 christos /* If the instruction is not available on the current machine 1286 1.1 christos then it can not possibly match. */ 1287 1.1 christos if (opcode->machine 1288 1.1 christos && !(opcode->machine == AM33_2 && HAVE_AM33_2) 1289 1.1 christos && !(opcode->machine == AM33 && HAVE_AM33) 1290 1.1 christos && !(opcode->machine == AM30 && HAVE_AM30)) 1291 1.1 christos goto error; 1292 1.1 christos 1293 1.1 christos for (op_idx = 1, opindex_ptr = opcode->operands; 1294 1.1 christos *opindex_ptr != 0; 1295 1.1 christos opindex_ptr++, op_idx++) 1296 1.1 christos { 1297 1.1 christos const struct mn10300_operand *operand; 1298 1.1 christos expressionS ex; 1299 1.1 christos 1300 1.1 christos if (next_opindex == 0) 1301 1.1 christos { 1302 1.1 christos operand = &mn10300_operands[*opindex_ptr]; 1303 1.1 christos } 1304 1.1 christos else 1305 1.1 christos { 1306 1.1 christos operand = &mn10300_operands[next_opindex]; 1307 1.10 christos next_opindex = 0; 1308 1.1 christos } 1309 1.1 christos 1310 1.1 christos while (is_whitespace (*str) || *str == ',') 1311 1.1 christos ++str; 1312 1.1 christos 1313 1.1 christos if (operand->flags & MN10300_OPERAND_RELAX) 1314 1.1 christos relaxable = 1; 1315 1.1 christos 1316 1.1 christos /* Gather the operand. */ 1317 1.1 christos hold = input_line_pointer; 1318 1.1 christos input_line_pointer = str; 1319 1.1 christos 1320 1.1 christos if (operand->flags & MN10300_OPERAND_PAREN) 1321 1.1 christos { 1322 1.1 christos if (*input_line_pointer != ')' && *input_line_pointer != '(') 1323 1.1 christos { 1324 1.1 christos input_line_pointer = hold; 1325 1.1 christos str = hold; 1326 1.1 christos goto error; 1327 1.1 christos } 1328 1.1 christos input_line_pointer++; 1329 1.1 christos goto keep_going; 1330 1.1 christos } 1331 1.1 christos /* See if we can match the operands. */ 1332 1.1 christos else if (operand->flags & MN10300_OPERAND_DREG) 1333 1.1 christos { 1334 1.1 christos if (!data_register_name (&ex)) 1335 1.1 christos { 1336 1.1 christos input_line_pointer = hold; 1337 1.1 christos str = hold; 1338 1.1 christos goto error; 1339 1.1 christos } 1340 1.1 christos } 1341 1.1 christos else if (operand->flags & MN10300_OPERAND_AREG) 1342 1.1 christos { 1343 1.1 christos if (!address_register_name (&ex)) 1344 1.1 christos { 1345 1.1 christos input_line_pointer = hold; 1346 1.1 christos str = hold; 1347 1.1 christos goto error; 1348 1.1 christos } 1349 1.3 christos } 1350 1.3 christos else if (operand->flags & MN10300_OPERAND_SP) 1351 1.1 christos { 1352 1.1 christos char *start; 1353 1.1 christos char c = get_symbol_name (&start); 1354 1.3 christos 1355 1.1 christos if (strcasecmp (start, "sp") != 0) 1356 1.1 christos { 1357 1.1 christos (void) restore_line_pointer (c); 1358 1.1 christos input_line_pointer = hold; 1359 1.3 christos str = hold; 1360 1.1 christos goto error; 1361 1.1 christos } 1362 1.1 christos (void) restore_line_pointer (c); 1363 1.1 christos goto keep_going; 1364 1.1 christos } 1365 1.1 christos else if (operand->flags & MN10300_OPERAND_RREG) 1366 1.1 christos { 1367 1.1 christos if (!r_register_name (&ex)) 1368 1.1 christos { 1369 1.1 christos input_line_pointer = hold; 1370 1.1 christos str = hold; 1371 1.1 christos goto error; 1372 1.1 christos } 1373 1.1 christos } 1374 1.1 christos else if (operand->flags & MN10300_OPERAND_XRREG) 1375 1.1 christos { 1376 1.1 christos if (!xr_register_name (&ex)) 1377 1.1 christos { 1378 1.1 christos input_line_pointer = hold; 1379 1.1 christos str = hold; 1380 1.1 christos goto error; 1381 1.1 christos } 1382 1.1 christos } 1383 1.1 christos else if (operand->flags & MN10300_OPERAND_FSREG) 1384 1.1 christos { 1385 1.1 christos if (!float_register_name (&ex)) 1386 1.1 christos { 1387 1.1 christos input_line_pointer = hold; 1388 1.1 christos str = hold; 1389 1.1 christos goto error; 1390 1.1 christos } 1391 1.1 christos } 1392 1.1 christos else if (operand->flags & MN10300_OPERAND_FDREG) 1393 1.1 christos { 1394 1.1 christos if (!double_register_name (&ex)) 1395 1.1 christos { 1396 1.1 christos input_line_pointer = hold; 1397 1.1 christos str = hold; 1398 1.1 christos goto error; 1399 1.1 christos } 1400 1.3 christos } 1401 1.3 christos else if (operand->flags & MN10300_OPERAND_FPCR) 1402 1.1 christos { 1403 1.1 christos char *start; 1404 1.1 christos char c = get_symbol_name (&start); 1405 1.3 christos 1406 1.1 christos if (strcasecmp (start, "fpcr") != 0) 1407 1.1 christos { 1408 1.1 christos (void) restore_line_pointer (c); 1409 1.1 christos input_line_pointer = hold; 1410 1.3 christos str = hold; 1411 1.1 christos goto error; 1412 1.1 christos } 1413 1.1 christos (void) restore_line_pointer (c); 1414 1.1 christos goto keep_going; 1415 1.3 christos } 1416 1.3 christos else if (operand->flags & MN10300_OPERAND_USP) 1417 1.1 christos { 1418 1.1 christos char *start; 1419 1.1 christos char c = get_symbol_name (&start); 1420 1.3 christos 1421 1.1 christos if (strcasecmp (start, "usp") != 0) 1422 1.1 christos { 1423 1.1 christos (void) restore_line_pointer (c); 1424 1.1 christos input_line_pointer = hold; 1425 1.3 christos str = hold; 1426 1.1 christos goto error; 1427 1.1 christos } 1428 1.1 christos (void) restore_line_pointer (c); 1429 1.1 christos goto keep_going; 1430 1.3 christos } 1431 1.3 christos else if (operand->flags & MN10300_OPERAND_SSP) 1432 1.1 christos { 1433 1.1 christos char *start; 1434 1.1 christos char c = get_symbol_name (&start); 1435 1.3 christos 1436 1.1 christos if (strcasecmp (start, "ssp") != 0) 1437 1.1 christos { 1438 1.1 christos (void) restore_line_pointer (c); 1439 1.1 christos input_line_pointer = hold; 1440 1.3 christos str = hold; 1441 1.1 christos goto error; 1442 1.1 christos } 1443 1.1 christos (void) restore_line_pointer (c); 1444 1.1 christos goto keep_going; 1445 1.3 christos } 1446 1.3 christos else if (operand->flags & MN10300_OPERAND_MSP) 1447 1.1 christos { 1448 1.1 christos char *start; 1449 1.1 christos char c = get_symbol_name (&start); 1450 1.3 christos 1451 1.1 christos if (strcasecmp (start, "msp") != 0) 1452 1.1 christos { 1453 1.1 christos (void) restore_line_pointer (c); 1454 1.1 christos input_line_pointer = hold; 1455 1.3 christos str = hold; 1456 1.1 christos goto error; 1457 1.1 christos } 1458 1.1 christos (void) restore_line_pointer (c); 1459 1.1 christos goto keep_going; 1460 1.3 christos } 1461 1.3 christos else if (operand->flags & MN10300_OPERAND_PC) 1462 1.1 christos { 1463 1.1 christos char *start; 1464 1.1 christos char c = get_symbol_name (&start); 1465 1.3 christos 1466 1.1 christos if (strcasecmp (start, "pc") != 0) 1467 1.1 christos { 1468 1.1 christos (void) restore_line_pointer (c); 1469 1.1 christos input_line_pointer = hold; 1470 1.3 christos str = hold; 1471 1.1 christos goto error; 1472 1.1 christos } 1473 1.1 christos (void) restore_line_pointer (c); 1474 1.1 christos goto keep_going; 1475 1.3 christos } 1476 1.3 christos else if (operand->flags & MN10300_OPERAND_EPSW) 1477 1.1 christos { 1478 1.1 christos char *start; 1479 1.1 christos char c = get_symbol_name (&start); 1480 1.3 christos 1481 1.1 christos if (strcasecmp (start, "epsw") != 0) 1482 1.1 christos { 1483 1.1 christos (void) restore_line_pointer (c); 1484 1.1 christos input_line_pointer = hold; 1485 1.3 christos str = hold; 1486 1.1 christos goto error; 1487 1.1 christos } 1488 1.1 christos (void) restore_line_pointer (c); 1489 1.1 christos goto keep_going; 1490 1.1 christos } 1491 1.1 christos else if (operand->flags & MN10300_OPERAND_PLUS) 1492 1.1 christos { 1493 1.1 christos if (*input_line_pointer != '+') 1494 1.1 christos { 1495 1.1 christos input_line_pointer = hold; 1496 1.1 christos str = hold; 1497 1.1 christos goto error; 1498 1.1 christos } 1499 1.1 christos input_line_pointer++; 1500 1.1 christos goto keep_going; 1501 1.3 christos } 1502 1.3 christos else if (operand->flags & MN10300_OPERAND_PSW) 1503 1.1 christos { 1504 1.1 christos char *start; 1505 1.1 christos char c = get_symbol_name (&start); 1506 1.3 christos 1507 1.1 christos if (strcasecmp (start, "psw") != 0) 1508 1.1 christos { 1509 1.1 christos (void) restore_line_pointer (c); 1510 1.1 christos input_line_pointer = hold; 1511 1.3 christos str = hold; 1512 1.1 christos goto error; 1513 1.1 christos } 1514 1.1 christos (void) restore_line_pointer (c); 1515 1.1 christos goto keep_going; 1516 1.3 christos } 1517 1.3 christos else if (operand->flags & MN10300_OPERAND_MDR) 1518 1.1 christos { 1519 1.1 christos char *start; 1520 1.1 christos char c = get_symbol_name (&start); 1521 1.3 christos 1522 1.1 christos if (strcasecmp (start, "mdr") != 0) 1523 1.1 christos { 1524 1.1 christos (void) restore_line_pointer (c); 1525 1.1 christos input_line_pointer = hold; 1526 1.3 christos str = hold; 1527 1.1 christos goto error; 1528 1.1 christos } 1529 1.1 christos (void) restore_line_pointer (c); 1530 1.1 christos goto keep_going; 1531 1.1 christos } 1532 1.1 christos else if (operand->flags & MN10300_OPERAND_REG_LIST) 1533 1.1 christos { 1534 1.1 christos unsigned int value = 0; 1535 1.1 christos if (*input_line_pointer != '[') 1536 1.1 christos { 1537 1.1 christos input_line_pointer = hold; 1538 1.1 christos str = hold; 1539 1.1 christos goto error; 1540 1.1 christos } 1541 1.1 christos 1542 1.1 christos /* Eat the '['. */ 1543 1.1 christos input_line_pointer++; 1544 1.1 christos 1545 1.1 christos /* We used to reject a null register list here; however, 1546 1.1 christos we accept it now so the compiler can emit "call" 1547 1.1 christos instructions for all calls to named functions. 1548 1.1 christos 1549 1.1 christos The linker can then fill in the appropriate bits for the 1550 1.1 christos register list and stack size or change the instruction 1551 1.1 christos into a "calls" if using "call" is not profitable. */ 1552 1.1 christos while (*input_line_pointer != ']') 1553 1.1 christos { 1554 1.1 christos char *start; 1555 1.1 christos char c; 1556 1.1 christos 1557 1.3 christos if (*input_line_pointer == ',') 1558 1.1 christos input_line_pointer++; 1559 1.1 christos 1560 1.1 christos c = get_symbol_name (&start); 1561 1.1 christos 1562 1.3 christos if (strcasecmp (start, "d2") == 0) 1563 1.1 christos { 1564 1.1 christos value |= 0x80; 1565 1.1 christos (void) restore_line_pointer (c); 1566 1.1 christos } 1567 1.3 christos else if (strcasecmp (start, "d3") == 0) 1568 1.1 christos { 1569 1.1 christos value |= 0x40; 1570 1.1 christos (void) restore_line_pointer (c); 1571 1.1 christos } 1572 1.3 christos else if (strcasecmp (start, "a2") == 0) 1573 1.1 christos { 1574 1.1 christos value |= 0x20; 1575 1.1 christos (void) restore_line_pointer (c); 1576 1.1 christos } 1577 1.3 christos else if (strcasecmp (start, "a3") == 0) 1578 1.1 christos { 1579 1.1 christos value |= 0x10; 1580 1.1 christos (void) restore_line_pointer (c); 1581 1.1 christos } 1582 1.3 christos else if (strcasecmp (start, "other") == 0) 1583 1.1 christos { 1584 1.1 christos value |= 0x08; 1585 1.1 christos (void) restore_line_pointer (c); 1586 1.1 christos } 1587 1.1 christos else if (HAVE_AM33 1588 1.3 christos && strcasecmp (start, "exreg0") == 0) 1589 1.1 christos { 1590 1.1 christos value |= 0x04; 1591 1.1 christos (void) restore_line_pointer (c); 1592 1.1 christos } 1593 1.1 christos else if (HAVE_AM33 1594 1.3 christos && strcasecmp (start, "exreg1") == 0) 1595 1.1 christos { 1596 1.1 christos value |= 0x02; 1597 1.1 christos (void) restore_line_pointer (c); 1598 1.1 christos } 1599 1.1 christos else if (HAVE_AM33 1600 1.3 christos && strcasecmp (start, "exother") == 0) 1601 1.1 christos { 1602 1.1 christos value |= 0x01; 1603 1.1 christos (void) restore_line_pointer (c); 1604 1.1 christos } 1605 1.1 christos else if (HAVE_AM33 1606 1.3 christos && strcasecmp (start, "all") == 0) 1607 1.1 christos { 1608 1.1 christos value |= 0xff; 1609 1.1 christos (void) restore_line_pointer (c); 1610 1.1 christos } 1611 1.1 christos else 1612 1.1 christos { 1613 1.1 christos input_line_pointer = hold; 1614 1.1 christos str = hold; 1615 1.1 christos goto error; 1616 1.1 christos } 1617 1.1 christos } 1618 1.1 christos input_line_pointer++; 1619 1.1 christos mn10300_insert_operand (& insn, & extension, operand, 1620 1.1 christos value, NULL, 0, 0); 1621 1.1 christos goto keep_going; 1622 1.1 christos 1623 1.1 christos } 1624 1.1 christos else if (data_register_name (&ex)) 1625 1.1 christos { 1626 1.1 christos input_line_pointer = hold; 1627 1.1 christos str = hold; 1628 1.1 christos goto error; 1629 1.1 christos } 1630 1.1 christos else if (address_register_name (&ex)) 1631 1.1 christos { 1632 1.1 christos input_line_pointer = hold; 1633 1.1 christos str = hold; 1634 1.1 christos goto error; 1635 1.1 christos } 1636 1.1 christos else if (other_register_name (&ex)) 1637 1.1 christos { 1638 1.1 christos input_line_pointer = hold; 1639 1.1 christos str = hold; 1640 1.1 christos goto error; 1641 1.1 christos } 1642 1.1 christos else if (HAVE_AM33 && r_register_name (&ex)) 1643 1.1 christos { 1644 1.1 christos input_line_pointer = hold; 1645 1.1 christos str = hold; 1646 1.1 christos goto error; 1647 1.1 christos } 1648 1.1 christos else if (HAVE_AM33 && xr_register_name (&ex)) 1649 1.1 christos { 1650 1.1 christos input_line_pointer = hold; 1651 1.1 christos str = hold; 1652 1.1 christos goto error; 1653 1.1 christos } 1654 1.1 christos else if (HAVE_AM33_2 && float_register_name (&ex)) 1655 1.1 christos { 1656 1.1 christos input_line_pointer = hold; 1657 1.1 christos str = hold; 1658 1.1 christos goto error; 1659 1.1 christos } 1660 1.1 christos else if (HAVE_AM33_2 && double_register_name (&ex)) 1661 1.1 christos { 1662 1.1 christos input_line_pointer = hold; 1663 1.1 christos str = hold; 1664 1.1 christos goto error; 1665 1.1 christos } 1666 1.1 christos else if (*str == ')' || *str == '(') 1667 1.1 christos { 1668 1.1 christos input_line_pointer = hold; 1669 1.1 christos str = hold; 1670 1.1 christos goto error; 1671 1.1 christos } 1672 1.9 christos else 1673 1.1 christos { 1674 1.1 christos expression (&ex); 1675 1.1 christos resolve_register (&ex); 1676 1.1 christos } 1677 1.1 christos 1678 1.1 christos switch (ex.X_op) 1679 1.1 christos { 1680 1.1 christos case O_illegal: 1681 1.1 christos errmsg = _("illegal operand"); 1682 1.1 christos goto error; 1683 1.1 christos case O_absent: 1684 1.1 christos errmsg = _("missing operand"); 1685 1.1 christos goto error; 1686 1.1 christos case O_register: 1687 1.1 christos { 1688 1.1 christos int mask; 1689 1.1 christos 1690 1.1 christos mask = MN10300_OPERAND_DREG | MN10300_OPERAND_AREG; 1691 1.1 christos if (HAVE_AM33) 1692 1.1 christos mask |= MN10300_OPERAND_RREG | MN10300_OPERAND_XRREG; 1693 1.1 christos if (HAVE_AM33_2) 1694 1.1 christos mask |= MN10300_OPERAND_FSREG | MN10300_OPERAND_FDREG; 1695 1.1 christos if ((operand->flags & mask) == 0) 1696 1.1 christos { 1697 1.1 christos input_line_pointer = hold; 1698 1.1 christos str = hold; 1699 1.1 christos goto error; 1700 1.1 christos } 1701 1.1 christos 1702 1.1 christos if (opcode->format == FMT_D1 || opcode->format == FMT_S1) 1703 1.1 christos extra_shift = 8; 1704 1.1 christos else if (opcode->format == FMT_D2 1705 1.1 christos || opcode->format == FMT_D4 1706 1.1 christos || opcode->format == FMT_S2 1707 1.1 christos || opcode->format == FMT_S4 1708 1.1 christos || opcode->format == FMT_S6 1709 1.1 christos || opcode->format == FMT_D5) 1710 1.1 christos extra_shift = 16; 1711 1.1 christos else if (opcode->format == FMT_D7) 1712 1.1 christos extra_shift = 8; 1713 1.1 christos else if (opcode->format == FMT_D8 || opcode->format == FMT_D9) 1714 1.1 christos extra_shift = 8; 1715 1.1 christos else 1716 1.1 christos extra_shift = 0; 1717 1.1 christos 1718 1.1 christos mn10300_insert_operand (& insn, & extension, operand, 1719 1.1 christos ex.X_add_number, NULL, 1720 1.1 christos 0, extra_shift); 1721 1.1 christos 1722 1.1 christos /* And note the register number in the register array. */ 1723 1.1 christos mn10300_reg_operands[op_idx - 1] = ex.X_add_number; 1724 1.1 christos break; 1725 1.1 christos } 1726 1.1 christos 1727 1.1 christos case O_constant: 1728 1.1 christos /* If this operand can be promoted, and it doesn't 1729 1.1 christos fit into the allocated bitfield for this insn, 1730 1.1 christos then promote it (ie this opcode does not match). */ 1731 1.1 christos if (operand->flags 1732 1.1 christos & (MN10300_OPERAND_PROMOTE | MN10300_OPERAND_RELAX) 1733 1.1 christos && !check_operand (operand, ex.X_add_number)) 1734 1.1 christos { 1735 1.1 christos input_line_pointer = hold; 1736 1.1 christos str = hold; 1737 1.1 christos goto error; 1738 1.1 christos } 1739 1.1 christos 1740 1.1 christos mn10300_insert_operand (& insn, & extension, operand, 1741 1.1 christos ex.X_add_number, NULL, 0, 0); 1742 1.1 christos break; 1743 1.1 christos 1744 1.1 christos default: 1745 1.1 christos /* If this operand can be promoted, then this opcode didn't 1746 1.1 christos match since we can't know if it needed promotion! */ 1747 1.1 christos if (operand->flags & MN10300_OPERAND_PROMOTE) 1748 1.1 christos { 1749 1.1 christos input_line_pointer = hold; 1750 1.1 christos str = hold; 1751 1.1 christos goto error; 1752 1.1 christos } 1753 1.1 christos 1754 1.1 christos /* We need to generate a fixup for this expression. */ 1755 1.1 christos if (fc >= MAX_INSN_FIXUPS) 1756 1.1 christos as_fatal (_("too many fixups")); 1757 1.1 christos fixups[fc].exp = ex; 1758 1.1 christos fixups[fc].opindex = *opindex_ptr; 1759 1.1 christos fixups[fc].reloc = BFD_RELOC_UNUSED; 1760 1.1 christos if (mn10300_check_fixup (& fixups[fc])) 1761 1.1 christos goto error; 1762 1.1 christos ++fc; 1763 1.8 christos break; 1764 1.1 christos } 1765 1.1 christos 1766 1.1 christos keep_going: 1767 1.10 christos str = input_line_pointer; 1768 1.1 christos input_line_pointer = hold; 1769 1.1 christos 1770 1.1 christos while (is_whitespace (*str) || *str == ',') 1771 1.1 christos ++str; 1772 1.1 christos } 1773 1.1 christos 1774 1.1 christos /* Make sure we used all the operands! */ 1775 1.1 christos if (*str != ',') 1776 1.1 christos match = 1; 1777 1.1 christos 1778 1.1 christos /* If this instruction has registers that must not match, verify 1779 1.1 christos that they do indeed not match. */ 1780 1.1 christos if (opcode->no_match_operands) 1781 1.1 christos { 1782 1.1 christos /* Look at each operand to see if it's marked. */ 1783 1.1 christos for (i = 0; i < MN10300_MAX_OPERANDS; i++) 1784 1.1 christos { 1785 1.1 christos if ((1 << i) & opcode->no_match_operands) 1786 1.1 christos { 1787 1.1 christos int j; 1788 1.1 christos 1789 1.1 christos /* operand I is marked. Check that it does not match any 1790 1.1 christos operands > I which are marked. */ 1791 1.1 christos for (j = i + 1; j < MN10300_MAX_OPERANDS; j++) 1792 1.1 christos { 1793 1.1 christos if (((1 << j) & opcode->no_match_operands) 1794 1.1 christos && mn10300_reg_operands[i] == mn10300_reg_operands[j]) 1795 1.1 christos { 1796 1.1 christos errmsg = _("Invalid register specification."); 1797 1.1 christos match = 0; 1798 1.1 christos goto error; 1799 1.1 christos } 1800 1.1 christos } 1801 1.1 christos } 1802 1.1 christos } 1803 1.1 christos } 1804 1.1 christos 1805 1.1 christos error: 1806 1.1 christos if (match == 0) 1807 1.1 christos { 1808 1.1 christos next_opcode = opcode + 1; 1809 1.1 christos if (!strcmp (next_opcode->name, opcode->name)) 1810 1.1 christos { 1811 1.1 christos opcode = next_opcode; 1812 1.1 christos continue; 1813 1.1 christos } 1814 1.1 christos 1815 1.1 christos as_bad ("%s", errmsg); 1816 1.1 christos return; 1817 1.1 christos } 1818 1.10 christos break; 1819 1.1 christos } 1820 1.1 christos 1821 1.10 christos while (is_whitespace (*str)) 1822 1.1 christos ++str; 1823 1.1 christos 1824 1.1 christos if (!is_end_of_stmt (*str)) 1825 1.1 christos as_bad (_("junk at end of line: `%s'"), str); 1826 1.1 christos 1827 1.1 christos input_line_pointer = str; 1828 1.1 christos 1829 1.1 christos /* Determine the size of the instruction. */ 1830 1.1 christos if (opcode->format == FMT_S0) 1831 1.1 christos size = 1; 1832 1.1 christos 1833 1.1 christos if (opcode->format == FMT_S1 || opcode->format == FMT_D0) 1834 1.1 christos size = 2; 1835 1.1 christos 1836 1.1 christos if (opcode->format == FMT_S2 || opcode->format == FMT_D1) 1837 1.1 christos size = 3; 1838 1.1 christos 1839 1.1 christos if (opcode->format == FMT_D6) 1840 1.1 christos size = 3; 1841 1.1 christos 1842 1.1 christos if (opcode->format == FMT_D7 || opcode->format == FMT_D10) 1843 1.1 christos size = 4; 1844 1.1 christos 1845 1.1 christos if (opcode->format == FMT_D8) 1846 1.1 christos size = 6; 1847 1.1 christos 1848 1.1 christos if (opcode->format == FMT_D9) 1849 1.1 christos size = 7; 1850 1.1 christos 1851 1.1 christos if (opcode->format == FMT_S4) 1852 1.1 christos size = 5; 1853 1.1 christos 1854 1.1 christos if (opcode->format == FMT_S6 || opcode->format == FMT_D5) 1855 1.1 christos size = 7; 1856 1.1 christos 1857 1.1 christos if (opcode->format == FMT_D2) 1858 1.1 christos size = 4; 1859 1.1 christos 1860 1.1 christos if (opcode->format == FMT_D3) 1861 1.1 christos size = 5; 1862 1.1 christos 1863 1.1 christos if (opcode->format == FMT_D4) 1864 1.1 christos size = 6; 1865 1.1 christos 1866 1.1 christos if (relaxable && fc > 0) 1867 1.1 christos { 1868 1.1 christos /* On a 64-bit host the size of an 'int' is not the same 1869 1.6 christos as the size of a pointer, so we need a union to convert 1870 1.1 christos the opindex field of the fr_cgen structure into a char * 1871 1.1 christos so that it can be stored in the frag. We do not have 1872 1.1 christos to worry about losing accuracy as we are not going to 1873 1.1 christos be even close to the 32bit limit of the int. */ 1874 1.1 christos union 1875 1.1 christos { 1876 1.1 christos int opindex; 1877 1.1 christos char * ptr; 1878 1.1 christos } 1879 1.1 christos opindex_converter; 1880 1.1 christos int type; 1881 1.1 christos 1882 1.1 christos /* We want to anchor the line info to the previous frag (if 1883 1.1 christos there isn't one, create it), so that, when the insn is 1884 1.1 christos resized, we still get the right address for the beginning of 1885 1.1 christos the region. */ 1886 1.1 christos f = frag_more (0); 1887 1.1 christos dwarf2_emit_insn (0); 1888 1.1 christos 1889 1.1 christos /* bCC */ 1890 1.1 christos if (size == 2) 1891 1.1 christos { 1892 1.1 christos /* Handle bra specially. Basically treat it like jmp so 1893 1.1 christos that we automatically handle 8, 16 and 32 bit offsets 1894 1.1 christos correctly as well as jumps to an undefined address. 1895 1.1 christos 1896 1.1 christos It is also important to not treat it like other bCC 1897 1.1 christos instructions since the long forms of bra is different 1898 1.1 christos from other bCC instructions. */ 1899 1.1 christos if (opcode->opcode == 0xca00) 1900 1.1 christos type = 10; 1901 1.1 christos else 1902 1.1 christos type = 0; 1903 1.1 christos } 1904 1.1 christos /* call */ 1905 1.1 christos else if (size == 5) 1906 1.1 christos type = 6; 1907 1.1 christos /* calls */ 1908 1.1 christos else if (size == 4) 1909 1.1 christos type = 8; 1910 1.1 christos /* jmp */ 1911 1.1 christos else if (size == 3 && opcode->opcode == 0xcc0000) 1912 1.1 christos type = 10; 1913 1.1 christos else if (size == 3 && (opcode->opcode & 0xfff000) == 0xf8d000) 1914 1.1 christos type = 13; 1915 1.1 christos /* bCC (uncommon cases) */ 1916 1.1 christos else 1917 1.1 christos type = 3; 1918 1.1 christos 1919 1.1 christos opindex_converter.opindex = fixups[0].opindex; 1920 1.1 christos f = frag_var (rs_machine_dependent, 8, 8 - size, type, 1921 1.1 christos fixups[0].exp.X_add_symbol, 1922 1.1 christos fixups[0].exp.X_add_number, 1923 1.1 christos opindex_converter.ptr); 1924 1.1 christos 1925 1.1 christos /* This is pretty hokey. We basically just care about the 1926 1.1 christos opcode, so we have to write out the first word big endian. 1927 1.1 christos 1928 1.1 christos The exception is "call", which has two operands that we 1929 1.1 christos care about. 1930 1.1 christos 1931 1.1 christos The first operand (the register list) happens to be in the 1932 1.1 christos first instruction word, and will be in the right place if 1933 1.1 christos we output the first word in big endian mode. 1934 1.1 christos 1935 1.1 christos The second operand (stack size) is in the extension word, 1936 1.1 christos and we want it to appear as the first character in the extension 1937 1.1 christos word (as it appears in memory). Luckily, writing the extension 1938 1.1 christos word in big endian format will do what we want. */ 1939 1.1 christos number_to_chars_bigendian (f, insn, size > 4 ? 4 : size); 1940 1.1 christos if (size > 8) 1941 1.1 christos { 1942 1.1 christos number_to_chars_bigendian (f + 4, extension, 4); 1943 1.1 christos number_to_chars_bigendian (f + 8, 0, size - 8); 1944 1.1 christos } 1945 1.1 christos else if (size > 4) 1946 1.1 christos number_to_chars_bigendian (f + 4, extension, size - 4); 1947 1.1 christos } 1948 1.1 christos else 1949 1.1 christos { 1950 1.1 christos /* Allocate space for the instruction. */ 1951 1.1 christos f = frag_more (size); 1952 1.1 christos 1953 1.1 christos /* Fill in bytes for the instruction. Note that opcode fields 1954 1.1 christos are written big-endian, 16 & 32bit immediates are written 1955 1.1 christos little endian. Egad. */ 1956 1.1 christos if (opcode->format == FMT_S0 1957 1.1 christos || opcode->format == FMT_S1 1958 1.1 christos || opcode->format == FMT_D0 1959 1.1 christos || opcode->format == FMT_D6 1960 1.1 christos || opcode->format == FMT_D7 1961 1.1 christos || opcode->format == FMT_D10 1962 1.1 christos || opcode->format == FMT_D1) 1963 1.1 christos { 1964 1.1 christos number_to_chars_bigendian (f, insn, size); 1965 1.1 christos } 1966 1.1 christos else if (opcode->format == FMT_S2 1967 1.1 christos && opcode->opcode != 0xdf0000 1968 1.1 christos && opcode->opcode != 0xde0000) 1969 1.1 christos { 1970 1.1 christos /* A format S2 instruction that is _not_ "ret" and "retf". */ 1971 1.1 christos number_to_chars_bigendian (f, (insn >> 16) & 0xff, 1); 1972 1.1 christos number_to_chars_littleendian (f + 1, insn & 0xffff, 2); 1973 1.1 christos } 1974 1.1 christos else if (opcode->format == FMT_S2) 1975 1.1 christos { 1976 1.1 christos /* This must be a ret or retf, which is written entirely in 1977 1.1 christos big-endian format. */ 1978 1.1 christos number_to_chars_bigendian (f, insn, 3); 1979 1.1 christos } 1980 1.1 christos else if (opcode->format == FMT_S4 1981 1.1 christos && opcode->opcode != 0xdc000000) 1982 1.1 christos { 1983 1.1 christos /* This must be a format S4 "call" instruction. What a pain. */ 1984 1.1 christos unsigned long temp = (insn >> 8) & 0xffff; 1985 1.1 christos number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1); 1986 1.1 christos number_to_chars_littleendian (f + 1, temp, 2); 1987 1.1 christos number_to_chars_bigendian (f + 3, insn & 0xff, 1); 1988 1.1 christos number_to_chars_bigendian (f + 4, extension & 0xff, 1); 1989 1.1 christos } 1990 1.1 christos else if (opcode->format == FMT_S4) 1991 1.1 christos { 1992 1.1 christos /* This must be a format S4 "jmp" instruction. */ 1993 1.1 christos unsigned long temp = ((insn & 0xffffff) << 8) | (extension & 0xff); 1994 1.1 christos number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1); 1995 1.1 christos number_to_chars_littleendian (f + 1, temp, 4); 1996 1.1 christos } 1997 1.1 christos else if (opcode->format == FMT_S6) 1998 1.1 christos { 1999 1.1 christos unsigned long temp = ((insn & 0xffffff) << 8) 2000 1.1 christos | ((extension >> 16) & 0xff); 2001 1.1 christos number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1); 2002 1.1 christos number_to_chars_littleendian (f + 1, temp, 4); 2003 1.1 christos number_to_chars_bigendian (f + 5, (extension >> 8) & 0xff, 1); 2004 1.1 christos number_to_chars_bigendian (f + 6, extension & 0xff, 1); 2005 1.1 christos } 2006 1.1 christos else if (opcode->format == FMT_D2 2007 1.1 christos && opcode->opcode != 0xfaf80000 2008 1.1 christos && opcode->opcode != 0xfaf00000 2009 1.1 christos && opcode->opcode != 0xfaf40000) 2010 1.1 christos { 2011 1.1 christos /* A format D2 instruction where the 16bit immediate is 2012 1.1 christos really a single 16bit value, not two 8bit values. */ 2013 1.1 christos number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2); 2014 1.1 christos number_to_chars_littleendian (f + 2, insn & 0xffff, 2); 2015 1.1 christos } 2016 1.1 christos else if (opcode->format == FMT_D2) 2017 1.1 christos { 2018 1.1 christos /* A format D2 instruction where the 16bit immediate 2019 1.1 christos is really two 8bit immediates. */ 2020 1.1 christos number_to_chars_bigendian (f, insn, 4); 2021 1.1 christos } 2022 1.1 christos else if (opcode->format == FMT_D3) 2023 1.1 christos { 2024 1.1 christos number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2); 2025 1.1 christos number_to_chars_littleendian (f + 2, insn & 0xffff, 2); 2026 1.1 christos number_to_chars_bigendian (f + 4, extension & 0xff, 1); 2027 1.1 christos } 2028 1.1 christos else if (opcode->format == FMT_D4) 2029 1.1 christos { 2030 1.1 christos unsigned long temp = ((insn & 0xffff) << 16) | (extension & 0xffff); 2031 1.1 christos 2032 1.1 christos number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2); 2033 1.1 christos number_to_chars_littleendian (f + 2, temp, 4); 2034 1.1 christos } 2035 1.1 christos else if (opcode->format == FMT_D5) 2036 1.1 christos { 2037 1.1 christos unsigned long temp = (((insn & 0xffff) << 16) 2038 1.1 christos | ((extension >> 8) & 0xffff)); 2039 1.1 christos 2040 1.1 christos number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2); 2041 1.1 christos number_to_chars_littleendian (f + 2, temp, 4); 2042 1.1 christos number_to_chars_bigendian (f + 6, extension & 0xff, 1); 2043 1.1 christos } 2044 1.1 christos else if (opcode->format == FMT_D8) 2045 1.1 christos { 2046 1.1 christos unsigned long temp = ((insn & 0xff) << 16) | (extension & 0xffff); 2047 1.1 christos 2048 1.1 christos number_to_chars_bigendian (f, (insn >> 8) & 0xffffff, 3); 2049 1.1 christos number_to_chars_bigendian (f + 3, (temp & 0xff), 1); 2050 1.1 christos number_to_chars_littleendian (f + 4, temp >> 8, 2); 2051 1.1 christos } 2052 1.1 christos else if (opcode->format == FMT_D9) 2053 1.1 christos { 2054 1.1 christos unsigned long temp = ((insn & 0xff) << 24) | (extension & 0xffffff); 2055 1.1 christos 2056 1.1 christos number_to_chars_bigendian (f, (insn >> 8) & 0xffffff, 3); 2057 1.1 christos number_to_chars_littleendian (f + 3, temp, 4); 2058 1.1 christos } 2059 1.1 christos 2060 1.1 christos /* Create any fixups. */ 2061 1.1 christos for (i = 0; i < fc; i++) 2062 1.1 christos { 2063 1.1 christos const struct mn10300_operand *operand; 2064 1.1 christos int reloc_size; 2065 1.1 christos 2066 1.1 christos operand = &mn10300_operands[fixups[i].opindex]; 2067 1.1 christos if (fixups[i].reloc != BFD_RELOC_UNUSED 2068 1.1 christos && fixups[i].reloc != BFD_RELOC_32_GOT_PCREL 2069 1.1 christos && fixups[i].reloc != BFD_RELOC_32_GOTOFF 2070 1.1 christos && fixups[i].reloc != BFD_RELOC_32_PLT_PCREL 2071 1.1 christos && fixups[i].reloc != BFD_RELOC_MN10300_TLS_GD 2072 1.1 christos && fixups[i].reloc != BFD_RELOC_MN10300_TLS_LD 2073 1.1 christos && fixups[i].reloc != BFD_RELOC_MN10300_TLS_LDO 2074 1.1 christos && fixups[i].reloc != BFD_RELOC_MN10300_TLS_GOTIE 2075 1.1 christos && fixups[i].reloc != BFD_RELOC_MN10300_TLS_IE 2076 1.1 christos && fixups[i].reloc != BFD_RELOC_MN10300_TLS_LE 2077 1.1 christos && fixups[i].reloc != BFD_RELOC_MN10300_GOT32) 2078 1.1 christos { 2079 1.1 christos reloc_howto_type *reloc_howto; 2080 1.1 christos int offset; 2081 1.1 christos 2082 1.1 christos reloc_howto = bfd_reloc_type_lookup (stdoutput, 2083 1.1 christos fixups[i].reloc); 2084 1.1 christos 2085 1.1 christos if (!reloc_howto) 2086 1.1 christos abort (); 2087 1.1 christos 2088 1.1 christos reloc_size = bfd_get_reloc_size (reloc_howto); 2089 1.1 christos 2090 1.1 christos if (reloc_size < 1 || reloc_size > 4) 2091 1.1 christos abort (); 2092 1.1 christos 2093 1.1 christos offset = 4 - size; 2094 1.1 christos fix_new_exp (frag_now, f - frag_now->fr_literal + offset, 2095 1.1 christos reloc_size, &fixups[i].exp, 2096 1.1 christos reloc_howto->pc_relative, 2097 1.1 christos fixups[i].reloc); 2098 1.1 christos } 2099 1.1 christos else 2100 1.1 christos { 2101 1.1 christos int reloc, pcrel, offset; 2102 1.1 christos fixS *fixP; 2103 1.1 christos 2104 1.1 christos reloc = BFD_RELOC_NONE; 2105 1.1 christos if (fixups[i].reloc != BFD_RELOC_UNUSED) 2106 1.1 christos reloc = fixups[i].reloc; 2107 1.1 christos /* How big is the reloc? Remember SPLIT relocs are 2108 1.1 christos implicitly 32bits. */ 2109 1.1 christos if ((operand->flags & MN10300_OPERAND_SPLIT) != 0) 2110 1.1 christos reloc_size = 32; 2111 1.1 christos else if ((operand->flags & MN10300_OPERAND_24BIT) != 0) 2112 1.1 christos reloc_size = 24; 2113 1.1 christos else 2114 1.1 christos reloc_size = operand->bits; 2115 1.1 christos 2116 1.1 christos /* Is the reloc pc-relative? */ 2117 1.1 christos pcrel = (operand->flags & MN10300_OPERAND_PCREL) != 0; 2118 1.1 christos if (reloc != BFD_RELOC_NONE) 2119 1.1 christos pcrel = bfd_reloc_type_lookup (stdoutput, reloc)->pc_relative; 2120 1.1 christos 2121 1.1 christos offset = size - (reloc_size + operand->shift) / 8; 2122 1.1 christos 2123 1.1 christos /* Choose a proper BFD relocation type. */ 2124 1.1 christos if (reloc != BFD_RELOC_NONE) 2125 1.1 christos ; 2126 1.1 christos else if (pcrel) 2127 1.1 christos { 2128 1.1 christos if (reloc_size == 32) 2129 1.1 christos reloc = BFD_RELOC_32_PCREL; 2130 1.1 christos else if (reloc_size == 16) 2131 1.1 christos reloc = BFD_RELOC_16_PCREL; 2132 1.1 christos else if (reloc_size == 8) 2133 1.1 christos reloc = BFD_RELOC_8_PCREL; 2134 1.1 christos else 2135 1.1 christos abort (); 2136 1.1 christos } 2137 1.1 christos else 2138 1.1 christos { 2139 1.1 christos if (reloc_size == 32) 2140 1.1 christos reloc = BFD_RELOC_32; 2141 1.1 christos else if (reloc_size == 16) 2142 1.1 christos reloc = BFD_RELOC_16; 2143 1.1 christos else if (reloc_size == 8) 2144 1.1 christos reloc = BFD_RELOC_8; 2145 1.1 christos else 2146 1.1 christos abort (); 2147 1.1 christos } 2148 1.10 christos 2149 1.1 christos fixP = fix_new_exp (frag_now, f - frag_now->fr_literal + offset, 2150 1.1 christos reloc_size / 8, &fixups[i].exp, pcrel, 2151 1.1 christos reloc); 2152 1.1 christos 2153 1.1 christos if (pcrel) 2154 1.1 christos fixP->fx_offset += offset; 2155 1.1 christos } 2156 1.1 christos } 2157 1.1 christos 2158 1.1 christos dwarf2_emit_insn (size); 2159 1.8 christos } 2160 1.1 christos 2161 1.1 christos /* Label this frag as one that contains instructions. */ 2162 1.1 christos frag_now->tc_frag_data = true; 2163 1.1 christos } 2164 1.1 christos 2165 1.1 christos /* If while processing a fixup, a reloc really needs to be created 2166 1.1 christos then it is done here. */ 2167 1.1 christos 2168 1.1 christos arelent ** 2169 1.1 christos tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp) 2170 1.1 christos { 2171 1.1 christos static arelent * no_relocs = NULL; 2172 1.10 christos static arelent * relocs[MAX_RELOC_EXPANSION + 1]; 2173 1.1 christos arelent *reloc; 2174 1.1 christos 2175 1.1 christos reloc = notes_alloc (sizeof (arelent)); 2176 1.1 christos 2177 1.1 christos reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type); 2178 1.1 christos if (reloc->howto == NULL) 2179 1.1 christos { 2180 1.10 christos as_bad_where (fixp->fx_file, fixp->fx_line, 2181 1.1 christos _("reloc %d not supported by object file format"), 2182 1.1 christos (int) fixp->fx_r_type); 2183 1.1 christos return &no_relocs; 2184 1.1 christos } 2185 1.1 christos 2186 1.1 christos reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; 2187 1.1 christos relocs[0] = reloc; 2188 1.1 christos relocs[1] = NULL; 2189 1.1 christos 2190 1.1 christos if (fixp->fx_subsy 2191 1.1 christos && S_GET_SEGMENT (fixp->fx_subsy) == absolute_section) 2192 1.1 christos { 2193 1.1 christos fixp->fx_offset -= S_GET_VALUE (fixp->fx_subsy); 2194 1.1 christos fixp->fx_subsy = NULL; 2195 1.1 christos } 2196 1.1 christos 2197 1.1 christos if (fixp->fx_addsy && fixp->fx_subsy) 2198 1.1 christos { 2199 1.1 christos asection *asec, *ssec; 2200 1.1 christos 2201 1.1 christos asec = S_GET_SEGMENT (fixp->fx_addsy); 2202 1.1 christos ssec = S_GET_SEGMENT (fixp->fx_subsy); 2203 1.1 christos 2204 1.1 christos /* If we have a difference between two (non-absolute) symbols we must 2205 1.1 christos generate two relocs (one for each symbol) and allow the linker to 2206 1.1 christos resolve them - relaxation may change the distances between symbols, 2207 1.10 christos even local symbols defined in the same section. */ 2208 1.1 christos if (ssec != absolute_section || asec != absolute_section) 2209 1.1 christos { 2210 1.1 christos arelent *reloc2 = notes_alloc (sizeof (arelent)); 2211 1.1 christos 2212 1.1 christos relocs[0] = reloc2; 2213 1.1 christos relocs[1] = reloc; 2214 1.1 christos 2215 1.10 christos reloc2->address = reloc->address; 2216 1.1 christos reloc2->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_MN10300_SYM_DIFF); 2217 1.1 christos reloc2->addend = - S_GET_VALUE (fixp->fx_subsy); 2218 1.3 christos reloc2->sym_ptr_ptr = notes_alloc (sizeof (asymbol *)); 2219 1.1 christos *reloc2->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_subsy); 2220 1.1 christos 2221 1.1 christos reloc->addend = fixp->fx_offset; 2222 1.10 christos if (asec == absolute_section) 2223 1.1 christos { 2224 1.1 christos reloc->addend += S_GET_VALUE (fixp->fx_addsy); 2225 1.1 christos reloc->sym_ptr_ptr = &bfd_abs_section_ptr->symbol; 2226 1.10 christos } 2227 1.1 christos else 2228 1.1 christos { 2229 1.1 christos reloc->sym_ptr_ptr = notes_alloc (sizeof (asymbol *)); 2230 1.1 christos *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); 2231 1.1 christos } 2232 1.1 christos 2233 1.1 christos fixp->fx_pcrel = 0; 2234 1.1 christos fixp->fx_done = 1; 2235 1.1 christos return relocs; 2236 1.1 christos } 2237 1.1 christos else 2238 1.1 christos { 2239 1.1 christos char *fixpos = fixp->fx_where + fixp->fx_frag->fr_literal; 2240 1.1 christos 2241 1.1 christos reloc->addend = (S_GET_VALUE (fixp->fx_addsy) 2242 1.1 christos - S_GET_VALUE (fixp->fx_subsy) + fixp->fx_offset); 2243 1.1 christos 2244 1.1 christos switch (fixp->fx_r_type) 2245 1.1 christos { 2246 1.1 christos case BFD_RELOC_8: 2247 1.1 christos md_number_to_chars (fixpos, reloc->addend, 1); 2248 1.1 christos break; 2249 1.1 christos 2250 1.1 christos case BFD_RELOC_16: 2251 1.1 christos md_number_to_chars (fixpos, reloc->addend, 2); 2252 1.1 christos break; 2253 1.1 christos 2254 1.1 christos case BFD_RELOC_24: 2255 1.1 christos md_number_to_chars (fixpos, reloc->addend, 3); 2256 1.1 christos break; 2257 1.1 christos 2258 1.1 christos case BFD_RELOC_32: 2259 1.1 christos md_number_to_chars (fixpos, reloc->addend, 4); 2260 1.10 christos break; 2261 1.1 christos 2262 1.1 christos default: 2263 1.1 christos reloc->sym_ptr_ptr = &bfd_abs_section_ptr->symbol; 2264 1.10 christos return relocs; 2265 1.1 christos } 2266 1.1 christos 2267 1.1 christos return &no_relocs; 2268 1.1 christos } 2269 1.10 christos } 2270 1.1 christos else 2271 1.1 christos { 2272 1.1 christos reloc->sym_ptr_ptr = notes_alloc (sizeof (asymbol *)); 2273 1.1 christos *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); 2274 1.1 christos reloc->addend = fixp->fx_offset; 2275 1.1 christos } 2276 1.1 christos return relocs; 2277 1.1 christos } 2278 1.1 christos 2279 1.8 christos /* Returns true iff the symbol attached to the frag is at a known location 2280 1.1 christos in the given section, (and hence the relocation to it can be relaxed by 2281 1.1 christos the assembler). */ 2282 1.1 christos static inline bool 2283 1.3 christos has_known_symbol_location (fragS * fragp, asection * sec) 2284 1.1 christos { 2285 1.1 christos symbolS * sym = fragp->fr_symbol; 2286 1.1 christos 2287 1.1 christos return sym != NULL 2288 1.1 christos && S_IS_DEFINED (sym) 2289 1.1 christos && ! S_IS_WEAK (sym) 2290 1.1 christos && S_GET_SEGMENT (sym) == sec; 2291 1.1 christos } 2292 1.1 christos 2293 1.1 christos int 2294 1.1 christos md_estimate_size_before_relax (fragS *fragp, asection *seg) 2295 1.1 christos { 2296 1.1 christos if (fragp->fr_subtype == 6 2297 1.1 christos && ! has_known_symbol_location (fragp, seg)) 2298 1.1 christos fragp->fr_subtype = 7; 2299 1.1 christos else if (fragp->fr_subtype == 8 2300 1.1 christos && ! has_known_symbol_location (fragp, seg)) 2301 1.1 christos fragp->fr_subtype = 9; 2302 1.1 christos else if (fragp->fr_subtype == 10 2303 1.1 christos && ! has_known_symbol_location (fragp, seg)) 2304 1.1 christos fragp->fr_subtype = 12; 2305 1.1 christos 2306 1.1 christos if (fragp->fr_subtype == 13) 2307 1.1 christos return 3; 2308 1.1 christos 2309 1.1 christos if (fragp->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0])) 2310 1.1 christos abort (); 2311 1.1 christos 2312 1.1 christos return md_relax_table[fragp->fr_subtype].rlx_length; 2313 1.1 christos } 2314 1.1 christos 2315 1.10 christos long 2316 1.1 christos md_pcrel_from (fixS *fixp) 2317 1.1 christos { 2318 1.1 christos if (fixp->fx_addsy != NULL 2319 1.1 christos && (!S_IS_DEFINED (fixp->fx_addsy) || S_IS_WEAK (fixp->fx_addsy))) 2320 1.1 christos /* The symbol is undefined or weak. Let the linker figure it out. */ 2321 1.1 christos return 0; 2322 1.1 christos 2323 1.1 christos return fixp->fx_frag->fr_address + fixp->fx_where; 2324 1.1 christos } 2325 1.1 christos 2326 1.1 christos void 2327 1.1 christos md_apply_fix (fixS * fixP, valueT * valP, segT seg) 2328 1.10 christos { 2329 1.1 christos char * fixpos = fixP->fx_where + fixP->fx_frag->fr_literal; 2330 1.1 christos int size = 0; 2331 1.1 christos int value = *valP; 2332 1.1 christos 2333 1.1 christos gas_assert (fixP->fx_r_type < BFD_RELOC_UNUSED); 2334 1.1 christos 2335 1.1 christos /* This should never happen. */ 2336 1.1 christos if (seg->flags & SEC_ALLOC) 2337 1.1 christos abort (); 2338 1.1 christos 2339 1.1 christos /* The value we are passed in *valuep includes the symbol values. 2340 1.1 christos If we are doing this relocation the code in write.c is going to 2341 1.1 christos call bfd_install_relocation, which is also going to use the symbol 2342 1.1 christos value. That means that if the reloc is fully resolved we want to 2343 1.1 christos use *valuep since bfd_install_relocation is not being used. 2344 1.1 christos 2345 1.1 christos However, if the reloc is not fully resolved we do not want to use 2346 1.1 christos *valuep, and must use fx_offset instead. However, if the reloc 2347 1.1 christos is PC relative, we do want to use *valuep since it includes the 2348 1.1 christos result of md_pcrel_from. */ 2349 1.1 christos if (fixP->fx_addsy != NULL && ! fixP->fx_pcrel) 2350 1.1 christos value = fixP->fx_offset; 2351 1.1 christos 2352 1.1 christos /* If the fix is relative to a symbol which is not defined, or not 2353 1.1 christos in the same segment as the fix, we cannot resolve it here. */ 2354 1.1 christos if (fixP->fx_addsy != NULL 2355 1.1 christos && (! S_IS_DEFINED (fixP->fx_addsy) 2356 1.1 christos || (S_GET_SEGMENT (fixP->fx_addsy) != seg))) 2357 1.1 christos { 2358 1.1 christos fixP->fx_done = 0; 2359 1.1 christos return; 2360 1.1 christos } 2361 1.1 christos 2362 1.1 christos switch (fixP->fx_r_type) 2363 1.1 christos { 2364 1.1 christos case BFD_RELOC_8: 2365 1.1 christos case BFD_RELOC_8_PCREL: 2366 1.1 christos size = 1; 2367 1.1 christos break; 2368 1.1 christos 2369 1.1 christos case BFD_RELOC_16: 2370 1.1 christos case BFD_RELOC_16_PCREL: 2371 1.1 christos size = 2; 2372 1.1 christos break; 2373 1.1 christos 2374 1.1 christos case BFD_RELOC_32: 2375 1.1 christos case BFD_RELOC_32_PCREL: 2376 1.1 christos size = 4; 2377 1.1 christos break; 2378 1.1 christos 2379 1.1 christos case BFD_RELOC_VTABLE_INHERIT: 2380 1.1 christos case BFD_RELOC_VTABLE_ENTRY: 2381 1.1 christos fixP->fx_done = 0; 2382 1.1 christos return; 2383 1.1 christos 2384 1.3 christos case BFD_RELOC_MN10300_ALIGN: 2385 1.1 christos fixP->fx_done = 1; 2386 1.1 christos return; 2387 1.1 christos 2388 1.1 christos case BFD_RELOC_NONE: 2389 1.1 christos default: 2390 1.1 christos as_bad_where (fixP->fx_file, fixP->fx_line, 2391 1.1 christos _("Bad relocation fixup type (%d)"), fixP->fx_r_type); 2392 1.1 christos } 2393 1.1 christos 2394 1.1 christos md_number_to_chars (fixpos, value, size); 2395 1.1 christos 2396 1.1 christos /* If a symbol remains, pass the fixup, as a reloc, onto the linker. */ 2397 1.1 christos if (fixP->fx_addsy == NULL) 2398 1.1 christos fixP->fx_done = 1; 2399 1.1 christos } 2400 1.1 christos 2401 1.8 christos /* Return zero if the fixup in fixp should be left alone and not 2402 1.1 christos adjusted. */ 2403 1.1 christos 2404 1.1 christos bool 2405 1.1 christos mn10300_fix_adjustable (struct fix *fixp) 2406 1.1 christos { 2407 1.8 christos if (fixp->fx_pcrel) 2408 1.1 christos { 2409 1.1 christos if (TC_FORCE_RELOCATION_LOCAL (fixp)) 2410 1.1 christos return false; 2411 1.1 christos } 2412 1.8 christos /* Non-relative relocs can (and must) be adjusted if they do 2413 1.1 christos not meet the criteria below, or the generic criteria. */ 2414 1.1 christos else if (TC_FORCE_RELOCATION (fixp)) 2415 1.1 christos return false; 2416 1.1 christos 2417 1.1 christos /* Do not adjust relocations involving symbols in code sections, 2418 1.1 christos because it breaks linker relaxations. This could be fixed in the 2419 1.8 christos linker, but this fix is simpler, and it pretty much only affects 2420 1.1 christos object size a little bit. */ 2421 1.1 christos if (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_CODE) 2422 1.1 christos return false; 2423 1.6 christos 2424 1.1 christos /* Likewise, do not adjust symbols that won't be merged, or debug 2425 1.1 christos symbols, because they too break relaxation. We do want to adjust 2426 1.8 christos other mergeable symbols, like .rodata, because code relaxations 2427 1.1 christos need section-relative symbols to properly relax them. */ 2428 1.8 christos if (! (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE)) 2429 1.8 christos return false; 2430 1.1 christos 2431 1.8 christos if (startswith (S_GET_SEGMENT (fixp->fx_addsy)->name, ".debug")) 2432 1.1 christos return false; 2433 1.1 christos 2434 1.1 christos return true; 2435 1.1 christos } 2436 1.1 christos 2437 1.1 christos static void 2438 1.1 christos set_arch_mach (int mach) 2439 1.1 christos { 2440 1.1 christos if (!bfd_set_arch_mach (stdoutput, bfd_arch_mn10300, mach)) 2441 1.1 christos as_warn (_("could not set architecture and machine")); 2442 1.1 christos 2443 1.1 christos current_machine = mach; 2444 1.5 christos } 2445 1.1 christos 2446 1.1 christos static inline char * 2447 1.1 christos mn10300_end_of_match (char *cont, const char *what) 2448 1.8 christos { 2449 1.1 christos int len = strlen (what); 2450 1.1 christos 2451 1.1 christos if (startswith (cont, what) 2452 1.1 christos && ! is_part_of_name (cont[len])) 2453 1.3 christos return cont + len; 2454 1.1 christos 2455 1.1 christos return NULL; 2456 1.1 christos } 2457 1.1 christos 2458 1.1 christos int 2459 1.1 christos mn10300_parse_name (char const *name, 2460 1.1 christos expressionS *exprP, 2461 1.1 christos enum expr_mode mode, 2462 1.1 christos char *nextcharP) 2463 1.1 christos { 2464 1.1 christos char *next = input_line_pointer; 2465 1.1 christos char *next_end; 2466 1.1 christos int reloc_type; 2467 1.1 christos segT segment; 2468 1.1 christos 2469 1.1 christos exprP->X_op_symbol = NULL; 2470 1.1 christos 2471 1.1 christos if (strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0) 2472 1.1 christos { 2473 1.1 christos if (! GOT_symbol) 2474 1.1 christos GOT_symbol = symbol_find_or_make (name); 2475 1.1 christos 2476 1.1 christos exprP->X_add_symbol = GOT_symbol; 2477 1.1 christos no_suffix: 2478 1.10 christos /* If we have an absolute symbol or a reg, 2479 1.1 christos then we know its value now. */ 2480 1.1 christos segment = S_GET_SEGMENT (exprP->X_add_symbol); 2481 1.1 christos if (!expr_defer_p (mode) && segment == absolute_section) 2482 1.1 christos { 2483 1.1 christos exprP->X_op = O_constant; 2484 1.10 christos exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol); 2485 1.1 christos exprP->X_add_symbol = NULL; 2486 1.1 christos } 2487 1.1 christos else if (!expr_defer_p (mode) && segment == reg_section) 2488 1.1 christos { 2489 1.1 christos exprP->X_op = O_register; 2490 1.1 christos exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol); 2491 1.1 christos exprP->X_add_symbol = NULL; 2492 1.1 christos } 2493 1.1 christos else 2494 1.1 christos { 2495 1.1 christos exprP->X_op = O_symbol; 2496 1.1 christos exprP->X_add_number = 0; 2497 1.1 christos } 2498 1.1 christos 2499 1.1 christos return 1; 2500 1.3 christos } 2501 1.1 christos 2502 1.1 christos exprP->X_add_symbol = symbol_find_or_make (name); 2503 1.1 christos 2504 1.1 christos if (*nextcharP != '@') 2505 1.1 christos goto no_suffix; 2506 1.1 christos else if ((next_end = mn10300_end_of_match (next + 1, "GOTOFF"))) 2507 1.1 christos reloc_type = BFD_RELOC_32_GOTOFF; 2508 1.1 christos else if ((next_end = mn10300_end_of_match (next + 1, "GOT"))) 2509 1.1 christos reloc_type = BFD_RELOC_MN10300_GOT32; 2510 1.1 christos else if ((next_end = mn10300_end_of_match (next + 1, "PLT"))) 2511 1.1 christos reloc_type = BFD_RELOC_32_PLT_PCREL; 2512 1.1 christos else if ((next_end = mn10300_end_of_match (next + 1, "tlsgd"))) 2513 1.1 christos reloc_type = BFD_RELOC_MN10300_TLS_GD; 2514 1.1 christos else if ((next_end = mn10300_end_of_match (next + 1, "tlsldm"))) 2515 1.1 christos reloc_type = BFD_RELOC_MN10300_TLS_LD; 2516 1.1 christos else if ((next_end = mn10300_end_of_match (next + 1, "dtpoff"))) 2517 1.1 christos reloc_type = BFD_RELOC_MN10300_TLS_LDO; 2518 1.1 christos else if ((next_end = mn10300_end_of_match (next + 1, "gotntpoff"))) 2519 1.1 christos reloc_type = BFD_RELOC_MN10300_TLS_GOTIE; 2520 1.1 christos else if ((next_end = mn10300_end_of_match (next + 1, "indntpoff"))) 2521 1.1 christos reloc_type = BFD_RELOC_MN10300_TLS_IE; 2522 1.1 christos else if ((next_end = mn10300_end_of_match (next + 1, "tpoff"))) 2523 1.1 christos reloc_type = BFD_RELOC_MN10300_TLS_LE; 2524 1.1 christos else 2525 1.1 christos goto no_suffix; 2526 1.1 christos 2527 1.1 christos *input_line_pointer = *nextcharP; 2528 1.1 christos input_line_pointer = next_end; 2529 1.1 christos *nextcharP = *input_line_pointer; 2530 1.1 christos *input_line_pointer = '\0'; 2531 1.1 christos 2532 1.1 christos exprP->X_op = O_PIC_reloc; 2533 1.1 christos exprP->X_add_number = 0; 2534 1.1 christos exprP->X_md = reloc_type; 2535 1.1 christos 2536 1.1 christos return 1; 2537 1.1 christos } 2538 1.1 christos 2539 1.1 christos /* The target specific pseudo-ops which we support. */ 2540 1.1 christos const pseudo_typeS md_pseudo_table[] = 2541 1.1 christos { 2542 1.1 christos { "am30", set_arch_mach, AM30 }, 2543 1.1 christos { "am33", set_arch_mach, AM33 }, 2544 1.1 christos { "am33_2", set_arch_mach, AM33_2 }, 2545 1.1 christos { "mn10300", set_arch_mach, MN103 }, 2546 1.1 christos {NULL, 0, 0} 2547 1.1 christos }; 2548 1.1 christos 2549 1.1 christos /* Returns FALSE if there is some mn10300 specific reason why the 2550 1.8 christos subtraction of two same-section symbols cannot be computed by 2551 1.1 christos the assembler. */ 2552 1.1 christos 2553 1.8 christos bool 2554 1.1 christos mn10300_allow_local_subtract (expressionS * left, expressionS * right, segT section) 2555 1.1 christos { 2556 1.1 christos bool result; 2557 1.1 christos fragS * left_frag; 2558 1.1 christos fragS * right_frag; 2559 1.1 christos fragS * frag; 2560 1.1 christos 2561 1.8 christos /* If we are not performing linker relaxation then we have nothing 2562 1.1 christos to worry about. */ 2563 1.1 christos if (linkrelax == 0) 2564 1.1 christos return true; 2565 1.8 christos 2566 1.1 christos /* If the symbols are not in a code section then they are OK. */ 2567 1.1 christos if ((section->flags & SEC_CODE) == 0) 2568 1.1 christos return true; 2569 1.1 christos 2570 1.1 christos /* Otherwise we have to scan the fragments between the two symbols. 2571 1.1 christos If any instructions are found then we have to assume that linker 2572 1.1 christos relaxation may change their size and so we must delay resolving 2573 1.1 christos the subtraction until the final link. */ 2574 1.1 christos left_frag = symbol_get_frag (left->X_add_symbol); 2575 1.1 christos right_frag = symbol_get_frag (right->X_add_symbol); 2576 1.1 christos 2577 1.8 christos if (left_frag == right_frag) 2578 1.1 christos return ! left_frag->tc_frag_data; 2579 1.1 christos 2580 1.1 christos result = true; 2581 1.8 christos for (frag = left_frag; frag != NULL; frag = frag->fr_next) 2582 1.1 christos { 2583 1.1 christos if (frag->tc_frag_data) 2584 1.1 christos result = false; 2585 1.1 christos if (frag == right_frag) 2586 1.1 christos break; 2587 1.1 christos } 2588 1.1 christos 2589 1.1 christos if (frag == NULL) 2590 1.8 christos for (frag = right_frag; frag != NULL; frag = frag->fr_next) 2591 1.1 christos { 2592 1.1 christos if (frag->tc_frag_data) 2593 1.1 christos result = false; 2594 1.1 christos if (frag == left_frag) 2595 1.1 christos break; 2596 1.1 christos } 2597 1.1 christos 2598 1.8 christos if (frag == NULL) 2599 1.1 christos /* The two symbols are on disjoint fragment chains 2600 1.1 christos - we cannot possibly compute their difference. */ 2601 1.1 christos return false; 2602 1.1 christos 2603 1.1 christos return result; 2604 1.1 christos } 2605 1.1 christos 2606 1.1 christos /* When relaxing, we need to output a reloc for any .align directive 2607 1.1 christos that requests alignment to a two byte boundary or larger. */ 2608 1.1 christos 2609 1.1 christos void 2610 1.1 christos mn10300_handle_align (fragS *frag) 2611 1.1 christos { 2612 1.1 christos if (linkrelax 2613 1.1 christos && (frag->fr_type == rs_align 2614 1.1 christos || frag->fr_type == rs_align_code) 2615 1.1 christos && frag->fr_address + frag->fr_fix > 0 2616 1.1 christos && frag->fr_offset > 1 2617 1.7 christos && now_seg != bss_section 2618 1.1 christos /* Do not create relocs for the merging sections - such 2619 1.6 christos relocs will prevent the contents from being merged. */ 2620 1.1 christos && (bfd_section_flags (now_seg) & SEC_MERGE) == 0) 2621 1.1 christos /* Create a new fixup to record the alignment request. The symbol is 2622 1.1 christos irrelevant but must be present so we use the absolute section symbol. 2623 1.8 christos The offset from the symbol is used to record the power-of-two alignment 2624 1.1 christos value. The size is set to 0 because the frag may already be aligned, 2625 1.1 christos thus causing cvt_frag_to_fill to reduce the size of the frag to zero. */ 2626 1.1 christos fix_new (frag, frag->fr_fix, 0, & abs_symbol, frag->fr_offset, false, 2627 1.8 christos BFD_RELOC_MN10300_ALIGN); 2628 1.1 christos } 2629 1.1 christos 2630 1.1 christos bool 2631 1.1 christos mn10300_force_relocation (struct fix * fixp) 2632 1.1 christos { 2633 1.8 christos if (linkrelax 2634 1.1 christos && (fixp->fx_pcrel 2635 1.1 christos || fixp->fx_r_type == BFD_RELOC_MN10300_ALIGN)) 2636 1.1 christos return true; 2637 2638 return generic_force_reloc (fixp); 2639 } 2640