1 1.1 skrll /* tc-m32r.c -- Assembler for the Renesas M32R. 2 1.1.1.11 christos Copyright (C) 1996-2026 Free Software Foundation, Inc. 3 1.1 skrll 4 1.1 skrll This file is part of GAS, the GNU Assembler. 5 1.1 skrll 6 1.1 skrll GAS is free software; you can redistribute it and/or modify 7 1.1 skrll it under the terms of the GNU General Public License as published by 8 1.1 skrll the Free Software Foundation; either version 3, or (at your option) 9 1.1 skrll any later version. 10 1.1 skrll 11 1.1 skrll GAS is distributed in the hope that it will be useful, 12 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of 13 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 1.1 skrll GNU General Public License for more details. 15 1.1 skrll 16 1.1 skrll You should have received a copy of the GNU General Public License 17 1.1 skrll along with GAS; see the file COPYING. If not, write to 18 1.1 skrll the Free Software Foundation, 51 Franklin Street - Fifth Floor, 19 1.1 skrll Boston, MA 02110-1301, USA. */ 20 1.1 skrll 21 1.1 skrll #include "as.h" 22 1.1 skrll #include "safe-ctype.h" 23 1.1 skrll #include "subsegs.h" 24 1.1 skrll #include "symcat.h" 25 1.1 skrll #include "opcodes/m32r-desc.h" 26 1.1 skrll #include "opcodes/m32r-opc.h" 27 1.1 skrll #include "cgen.h" 28 1.1 skrll #include "elf/m32r.h" 29 1.1 skrll 30 1.1 skrll /* Linked list of symbols that are debugging symbols to be defined as the 31 1.1 skrll beginning of the current instruction. */ 32 1.1 skrll typedef struct sym_link 33 1.1 skrll { 34 1.1 skrll struct sym_link *next; 35 1.1 skrll symbolS *symbol; 36 1.1 skrll } sym_linkS; 37 1.1 skrll 38 1.1.1.10 christos static sym_linkS *debug_sym_link = NULL; 39 1.1 skrll 40 1.1 skrll /* Structure to hold all of the different components describing 41 1.1 skrll an individual instruction. */ 42 1.1 skrll typedef struct 43 1.1 skrll { 44 1.1 skrll const CGEN_INSN *insn; 45 1.1 skrll const CGEN_INSN *orig_insn; 46 1.1 skrll CGEN_FIELDS fields; 47 1.1 skrll #if CGEN_INT_INSN_P 48 1.1 skrll CGEN_INSN_INT buffer[1]; 49 1.1 skrll #define INSN_VALUE(buf) (*(buf)) 50 1.1 skrll #else 51 1.1 skrll unsigned char buffer[CGEN_MAX_INSN_SIZE]; 52 1.1 skrll #define INSN_VALUE(buf) (buf) 53 1.1 skrll #endif 54 1.1 skrll char *addr; 55 1.1 skrll fragS *frag; 56 1.1 skrll int num_fixups; 57 1.1 skrll fixS *fixups[GAS_CGEN_MAX_FIXUPS]; 58 1.1 skrll int indices[MAX_OPERAND_INSTANCES]; 59 1.1 skrll sym_linkS *debug_sym_link; 60 1.1 skrll } 61 1.1 skrll m32r_insn; 62 1.1 skrll 63 1.1 skrll /* prev_insn.insn is non-null if last insn was a 16 bit insn on a 32 bit 64 1.1 skrll boundary (i.e. was the first of two 16 bit insns). */ 65 1.1 skrll static m32r_insn prev_insn; 66 1.1 skrll 67 1.1 skrll /* Non-zero if we've seen a relaxable insn since the last 32 bit 68 1.1 skrll alignment request. */ 69 1.1 skrll static int seen_relaxable_p = 0; 70 1.1 skrll 71 1.1 skrll /* Non-zero if we are generating PIC code. */ 72 1.1 skrll int pic_code; 73 1.1 skrll 74 1.1 skrll /* Non-zero if -relax specified, in which case sufficient relocs are output 75 1.1 skrll for the linker to do relaxing. 76 1.1 skrll We do simple forms of relaxing internally, but they are always done. 77 1.1 skrll This flag does not apply to them. */ 78 1.1 skrll static int m32r_relax; 79 1.1 skrll 80 1.1 skrll /* Non-zero if warn when a high/shigh reloc has no matching low reloc. 81 1.1 skrll Each high/shigh reloc must be paired with it's low cousin in order to 82 1.1 skrll properly calculate the addend in a relocatable link (since there is a 83 1.1 skrll potential carry from the low to the high/shigh). 84 1.1 skrll This option is off by default though for user-written assembler code it 85 1.1 skrll might make sense to make the default be on (i.e. have gcc pass a flag 86 1.1 skrll to turn it off). This warning must not be on for GCC created code as 87 1.1 skrll optimization may delete the low but not the high/shigh (at least we 88 1.1 skrll shouldn't assume or require it to). */ 89 1.1 skrll static int warn_unmatched_high = 0; 90 1.1 skrll 91 1.1 skrll /* 1 if -m32rx has been specified, in which case support for 92 1.1 skrll the extended M32RX instruction set should be enabled. 93 1.1 skrll 2 if -m32r2 has been specified, in which case support for 94 1.1 skrll the extended M32R2 instruction set should be enabled. */ 95 1.1 skrll static int enable_m32rx = 0; /* Default to M32R. */ 96 1.1 skrll 97 1.1 skrll /* Non-zero if -m32rx -hidden has been specified, in which case support for 98 1.1 skrll the special M32RX instruction set should be enabled. */ 99 1.1 skrll static int enable_special = 0; 100 1.1 skrll 101 1.1 skrll /* Non-zero if -bitinst has been specified, in which case support 102 1.1 skrll for extended M32R bit-field instruction set should be enabled. */ 103 1.1 skrll static int enable_special_m32r = 1; 104 1.1 skrll 105 1.1 skrll /* Non-zero if -float has been specified, in which case support for 106 1.1 skrll extended M32R floating point instruction set should be enabled. */ 107 1.1 skrll static int enable_special_float = 0; 108 1.1 skrll 109 1.1 skrll /* Non-zero if the programmer should be warned when an explicit parallel 110 1.1 skrll instruction might have constraint violations. */ 111 1.1 skrll static int warn_explicit_parallel_conflicts = 1; 112 1.1 skrll 113 1.1 skrll /* Non-zero if the programmer should not receive any messages about 114 1.1 skrll parallel instruction with potential or real constraint violations. 115 1.1 skrll The ability to suppress these messages is intended only for hardware 116 1.1.1.6 christos vendors testing the chip. It supersedes 117 1.1 skrll warn_explicit_parallel_conflicts. */ 118 1.1 skrll static int ignore_parallel_conflicts = 0; 119 1.1 skrll 120 1.1 skrll /* Non-zero if insns can be made parallel. */ 121 1.1 skrll static int use_parallel = 0; 122 1.1 skrll 123 1.1 skrll /* Non-zero if optimizations should be performed. */ 124 1.1 skrll static int optimize; 125 1.1 skrll 126 1.1 skrll /* m32r er_flags. */ 127 1.1 skrll static int m32r_flags = 0; 128 1.1 skrll 129 1.1 skrll /* Stuff for .scomm symbols. */ 130 1.1 skrll static segT sbss_section; 131 1.1 skrll static asection scom_section; 132 1.1 skrll static asymbol scom_symbol; 133 1.1 skrll 134 1.1 skrll const char comment_chars[] = ";"; 135 1.1 skrll const char line_comment_chars[] = "#"; 136 1.1 skrll const char line_separator_chars[] = "!"; 137 1.1 skrll const char EXP_CHARS[] = "eE"; 138 1.1 skrll const char FLT_CHARS[] = "dD"; 139 1.1 skrll 140 1.1 skrll /* Relocations against symbols are done in two 141 1.1 skrll parts, with a HI relocation and a LO relocation. Each relocation 142 1.1 skrll has only 16 bits of space to store an addend. This means that in 143 1.1 skrll order for the linker to handle carries correctly, it must be able 144 1.1 skrll to locate both the HI and the LO relocation. This means that the 145 1.1 skrll relocations must appear in order in the relocation table. 146 1.1 skrll 147 1.1 skrll In order to implement this, we keep track of each unmatched HI 148 1.1 skrll relocation. We then sort them so that they immediately precede the 149 1.1 skrll corresponding LO relocation. */ 150 1.1 skrll 151 1.1 skrll struct m32r_hi_fixup 152 1.1 skrll { 153 1.1 skrll /* Next HI fixup. */ 154 1.1 skrll struct m32r_hi_fixup *next; 155 1.1 skrll 156 1.1 skrll /* This fixup. */ 157 1.1 skrll fixS *fixp; 158 1.1 skrll 159 1.1 skrll /* The section this fixup is in. */ 160 1.1 skrll segT seg; 161 1.1 skrll }; 162 1.1 skrll 163 1.1 skrll /* The list of unmatched HI relocs. */ 164 1.1 skrll 165 1.1 skrll static struct m32r_hi_fixup *m32r_hi_fixup_list; 166 1.1 skrll 167 1.1.1.5 christos static const struct 169 1.1 skrll { 170 1.1 skrll enum bfd_architecture bfd_mach; 171 1.1 skrll int mach_flags; 172 1.1 skrll } mach_table[] = 173 1.1 skrll { 174 1.1 skrll { bfd_mach_m32r, (1<<MACH_M32R) }, 175 1.1 skrll { bfd_mach_m32rx, (1<<MACH_M32RX) }, 176 1.1 skrll { bfd_mach_m32r2, (1<<MACH_M32R2) } 177 1.1 skrll }; 178 1.1 skrll 179 1.1 skrll static void 180 1.1 skrll allow_m32rx (int on) 181 1.1 skrll { 182 1.1 skrll enable_m32rx = on; 183 1.1 skrll 184 1.1 skrll if (stdoutput != NULL) 185 1.1 skrll bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach_table[on].bfd_mach); 186 1.1 skrll 187 1.1 skrll if (gas_cgen_cpu_desc != NULL) 188 1.1 skrll gas_cgen_cpu_desc->machs = mach_table[on].mach_flags; 189 1.1 skrll } 190 1.1 skrll 191 1.1 skrll #define M32R_SHORTOPTS "O::K:" 193 1.1 skrll 194 1.1 skrll const char md_shortopts[] = M32R_SHORTOPTS; 195 1.1 skrll 196 1.1 skrll enum md_option_enums 197 1.1 skrll { 198 1.1 skrll OPTION_M32R = OPTION_MD_BASE, 199 1.1 skrll OPTION_M32RX, 200 1.1 skrll OPTION_M32R2, 201 1.1 skrll OPTION_BIG, 202 1.1 skrll OPTION_LITTLE, 203 1.1 skrll OPTION_PARALLEL, 204 1.1 skrll OPTION_NO_PARALLEL, 205 1.1 skrll OPTION_WARN_PARALLEL, 206 1.1 skrll OPTION_NO_WARN_PARALLEL, 207 1.1 skrll OPTION_IGNORE_PARALLEL, 208 1.1 skrll OPTION_NO_IGNORE_PARALLEL, 209 1.1 skrll OPTION_SPECIAL, 210 1.1 skrll OPTION_SPECIAL_M32R, 211 1.1 skrll OPTION_NO_SPECIAL_M32R, 212 1.1 skrll OPTION_SPECIAL_FLOAT, 213 1.1 skrll OPTION_WARN_UNMATCHED, 214 1.1 skrll OPTION_NO_WARN_UNMATCHED 215 1.1.1.10 christos }; 216 1.1 skrll 217 1.1 skrll const struct option md_longopts[] = 218 1.1 skrll { 219 1.1 skrll {"m32r", no_argument, NULL, OPTION_M32R}, 220 1.1 skrll {"m32rx", no_argument, NULL, OPTION_M32RX}, 221 1.1 skrll {"m32r2", no_argument, NULL, OPTION_M32R2}, 222 1.1 skrll {"big", no_argument, NULL, OPTION_BIG}, 223 1.1 skrll {"little", no_argument, NULL, OPTION_LITTLE}, 224 1.1 skrll {"EB", no_argument, NULL, OPTION_BIG}, 225 1.1 skrll {"EL", no_argument, NULL, OPTION_LITTLE}, 226 1.1 skrll {"parallel", no_argument, NULL, OPTION_PARALLEL}, 227 1.1 skrll {"no-parallel", no_argument, NULL, OPTION_NO_PARALLEL}, 228 1.1 skrll {"warn-explicit-parallel-conflicts", no_argument, NULL, OPTION_WARN_PARALLEL}, 229 1.1 skrll {"Wp", no_argument, NULL, OPTION_WARN_PARALLEL}, 230 1.1 skrll {"no-warn-explicit-parallel-conflicts", no_argument, NULL, OPTION_NO_WARN_PARALLEL}, 231 1.1 skrll {"Wnp", no_argument, NULL, OPTION_NO_WARN_PARALLEL}, 232 1.1 skrll {"ignore-parallel-conflicts", no_argument, NULL, OPTION_IGNORE_PARALLEL}, 233 1.1 skrll {"Ip", no_argument, NULL, OPTION_IGNORE_PARALLEL}, 234 1.1 skrll {"no-ignore-parallel-conflicts", no_argument, NULL, OPTION_NO_IGNORE_PARALLEL}, 235 1.1 skrll {"nIp", no_argument, NULL, OPTION_NO_IGNORE_PARALLEL}, 236 1.1 skrll {"hidden", no_argument, NULL, OPTION_SPECIAL}, 237 1.1 skrll {"bitinst", no_argument, NULL, OPTION_SPECIAL_M32R}, 238 1.1 skrll {"no-bitinst", no_argument, NULL, OPTION_NO_SPECIAL_M32R}, 239 1.1 skrll {"float", no_argument, NULL, OPTION_SPECIAL_FLOAT}, 240 1.1 skrll /* Sigh. I guess all warnings must now have both variants. */ 241 1.1 skrll {"warn-unmatched-high", no_argument, NULL, OPTION_WARN_UNMATCHED}, 242 1.1 skrll {"Wuh", no_argument, NULL, OPTION_WARN_UNMATCHED}, 243 1.1 skrll {"no-warn-unmatched-high", no_argument, NULL, OPTION_NO_WARN_UNMATCHED}, 244 1.1 skrll {"Wnuh", no_argument, NULL, OPTION_NO_WARN_UNMATCHED}, 245 1.1 skrll {NULL, no_argument, NULL, 0} 246 1.1.1.10 christos }; 247 1.1 skrll 248 1.1 skrll const size_t md_longopts_size = sizeof (md_longopts); 249 1.1 skrll 250 1.1 skrll static void 251 1.1 skrll little (int on) 252 1.1 skrll { 253 1.1 skrll target_big_endian = ! on; 254 1.1 skrll } 255 1.1 skrll 256 1.1 skrll /* Use parallel execution. */ 257 1.1 skrll 258 1.1 skrll static int 259 1.1 skrll parallel (void) 260 1.1 skrll { 261 1.1 skrll if (! enable_m32rx) 262 1.1 skrll return 0; 263 1.1 skrll 264 1.1 skrll if (use_parallel == 1) 265 1.1 skrll return 1; 266 1.1 skrll 267 1.1 skrll return 0; 268 1.1 skrll } 269 1.1.1.5 christos 270 1.1 skrll int 271 1.1 skrll md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED) 272 1.1 skrll { 273 1.1 skrll switch (c) 274 1.1 skrll { 275 1.1 skrll case 'O': 276 1.1 skrll optimize = 1; 277 1.1 skrll use_parallel = 1; 278 1.1 skrll break; 279 1.1 skrll 280 1.1 skrll case OPTION_M32R: 281 1.1 skrll allow_m32rx (0); 282 1.1 skrll break; 283 1.1 skrll 284 1.1 skrll case OPTION_M32RX: 285 1.1 skrll allow_m32rx (1); 286 1.1 skrll break; 287 1.1 skrll 288 1.1 skrll case OPTION_M32R2: 289 1.1 skrll allow_m32rx (2); 290 1.1 skrll enable_special = 1; 291 1.1 skrll enable_special_m32r = 1; 292 1.1 skrll break; 293 1.1 skrll 294 1.1 skrll case OPTION_BIG: 295 1.1 skrll target_big_endian = 1; 296 1.1 skrll break; 297 1.1 skrll 298 1.1 skrll case OPTION_LITTLE: 299 1.1 skrll target_big_endian = 0; 300 1.1 skrll break; 301 1.1 skrll 302 1.1 skrll case OPTION_PARALLEL: 303 1.1 skrll use_parallel = 1; 304 1.1 skrll break; 305 1.1 skrll 306 1.1 skrll case OPTION_NO_PARALLEL: 307 1.1 skrll use_parallel = 0; 308 1.1 skrll break; 309 1.1 skrll 310 1.1 skrll case OPTION_WARN_PARALLEL: 311 1.1 skrll warn_explicit_parallel_conflicts = 1; 312 1.1 skrll break; 313 1.1 skrll 314 1.1 skrll case OPTION_NO_WARN_PARALLEL: 315 1.1 skrll warn_explicit_parallel_conflicts = 0; 316 1.1 skrll break; 317 1.1 skrll 318 1.1 skrll case OPTION_IGNORE_PARALLEL: 319 1.1 skrll ignore_parallel_conflicts = 1; 320 1.1 skrll break; 321 1.1 skrll 322 1.1 skrll case OPTION_NO_IGNORE_PARALLEL: 323 1.1 skrll ignore_parallel_conflicts = 0; 324 1.1 skrll break; 325 1.1 skrll 326 1.1 skrll case OPTION_SPECIAL: 327 1.1 skrll if (enable_m32rx) 328 1.1 skrll enable_special = 1; 329 1.1 skrll else 330 1.1 skrll { 331 1.1 skrll /* Pretend that we do not recognise this option. */ 332 1.1 skrll as_bad (_("Unrecognised option: -hidden")); 333 1.1 skrll return 0; 334 1.1 skrll } 335 1.1 skrll break; 336 1.1 skrll 337 1.1 skrll case OPTION_SPECIAL_M32R: 338 1.1 skrll enable_special_m32r = 1; 339 1.1 skrll break; 340 1.1 skrll 341 1.1 skrll case OPTION_NO_SPECIAL_M32R: 342 1.1 skrll enable_special_m32r = 0; 343 1.1 skrll break; 344 1.1 skrll 345 1.1 skrll case OPTION_SPECIAL_FLOAT: 346 1.1 skrll enable_special_float = 1; 347 1.1 skrll break; 348 1.1 skrll 349 1.1 skrll case OPTION_WARN_UNMATCHED: 350 1.1 skrll warn_unmatched_high = 1; 351 1.1 skrll break; 352 1.1 skrll 353 1.1 skrll case OPTION_NO_WARN_UNMATCHED: 354 1.1 skrll warn_unmatched_high = 0; 355 1.1 skrll break; 356 1.1 skrll 357 1.1 skrll case 'K': 358 1.1 skrll if (strcmp (arg, "PIC") != 0) 359 1.1 skrll as_warn (_("Unrecognized option following -K")); 360 1.1 skrll else 361 1.1 skrll pic_code = 1; 362 1.1 skrll break; 363 1.1 skrll 364 1.1 skrll default: 365 1.1 skrll return 0; 366 1.1 skrll } 367 1.1 skrll 368 1.1 skrll return 1; 369 1.1 skrll } 370 1.1 skrll 371 1.1 skrll void 372 1.1 skrll md_show_usage (FILE *stream) 373 1.1 skrll { 374 1.1 skrll fprintf (stream, _(" M32R specific command line options:\n")); 375 1.1 skrll 376 1.1 skrll fprintf (stream, _("\ 377 1.1 skrll -m32r disable support for the m32rx instruction set\n")); 378 1.1 skrll fprintf (stream, _("\ 379 1.1 skrll -m32rx support the extended m32rx instruction set\n")); 380 1.1 skrll fprintf (stream, _("\ 381 1.1 skrll -m32r2 support the extended m32r2 instruction set\n")); 382 1.1 skrll fprintf (stream, _("\ 383 1.1 skrll -EL,-little produce little endian code and data\n")); 384 1.1 skrll fprintf (stream, _("\ 385 1.1 skrll -EB,-big produce big endian code and data\n")); 386 1.1 skrll fprintf (stream, _("\ 387 1.1 skrll -parallel try to combine instructions in parallel\n")); 388 1.1 skrll fprintf (stream, _("\ 389 1.1 skrll -no-parallel disable -parallel\n")); 390 1.1 skrll fprintf (stream, _("\ 391 1.1 skrll -no-bitinst disallow the M32R2's extended bit-field instructions\n")); 392 1.1 skrll fprintf (stream, _("\ 393 1.1 skrll -O try to optimize code. Implies -parallel\n")); 394 1.1 skrll 395 1.1 skrll fprintf (stream, _("\ 396 1.1.1.6 christos -warn-explicit-parallel-conflicts warn when parallel instructions\n")); 397 1.1 skrll fprintf (stream, _("\ 398 1.1 skrll might violate constraints\n")); 399 1.1 skrll fprintf (stream, _("\ 400 1.1.1.6 christos -no-warn-explicit-parallel-conflicts do not warn when parallel\n")); 401 1.1 skrll fprintf (stream, _("\ 402 1.1 skrll instructions might violate constraints\n")); 403 1.1 skrll fprintf (stream, _("\ 404 1.1 skrll -Wp synonym for -warn-explicit-parallel-conflicts\n")); 405 1.1 skrll fprintf (stream, _("\ 406 1.1 skrll -Wnp synonym for -no-warn-explicit-parallel-conflicts\n")); 407 1.1 skrll fprintf (stream, _("\ 408 1.1.1.3 christos -ignore-parallel-conflicts do not check parallel instructions\n")); 409 1.1 skrll fprintf (stream, _("\ 410 1.1 skrll for constraint violations\n")); 411 1.1 skrll fprintf (stream, _("\ 412 1.1.1.3 christos -no-ignore-parallel-conflicts check parallel instructions for\n")); 413 1.1 skrll fprintf (stream, _("\ 414 1.1 skrll constraint violations\n")); 415 1.1 skrll fprintf (stream, _("\ 416 1.1 skrll -Ip synonym for -ignore-parallel-conflicts\n")); 417 1.1 skrll fprintf (stream, _("\ 418 1.1 skrll -nIp synonym for -no-ignore-parallel-conflicts\n")); 419 1.1 skrll 420 1.1 skrll fprintf (stream, _("\ 421 1.1 skrll -warn-unmatched-high warn when an (s)high reloc has no matching low reloc\n")); 422 1.1 skrll fprintf (stream, _("\ 423 1.1 skrll -no-warn-unmatched-high do not warn about missing low relocs\n")); 424 1.1 skrll fprintf (stream, _("\ 425 1.1 skrll -Wuh synonym for -warn-unmatched-high\n")); 426 1.1 skrll fprintf (stream, _("\ 427 1.1 skrll -Wnuh synonym for -no-warn-unmatched-high\n")); 428 1.1 skrll 429 1.1 skrll fprintf (stream, _("\ 430 1.1 skrll -KPIC generate PIC\n")); 431 1.1 skrll } 432 1.1 skrll 433 1.1 skrll /* Set by md_assemble for use by m32r_fill_insn. */ 434 1.1 skrll static subsegT prev_subseg; 435 1.1 skrll static segT prev_seg; 436 1.1 skrll 437 1.1 skrll #define GOT_NAME "_GLOBAL_OFFSET_TABLE_" 438 1.1 skrll symbolS * GOT_symbol; 439 1.1 skrll 440 1.1 skrll static inline int 441 1.1 skrll m32r_PIC_related_p (symbolS *sym) 442 1.1 skrll { 443 1.1 skrll expressionS *exp; 444 1.1 skrll 445 1.1 skrll if (! sym) 446 1.1 skrll return 0; 447 1.1 skrll 448 1.1 skrll if (sym == GOT_symbol) 449 1.1 skrll return 1; 450 1.1 skrll 451 1.1 skrll exp = symbol_get_value_expression (sym); 452 1.1 skrll 453 1.1 skrll return (exp->X_op == O_PIC_reloc 454 1.1 skrll || exp->X_md == BFD_RELOC_M32R_26_PLTREL 455 1.1 skrll || m32r_PIC_related_p (exp->X_add_symbol) 456 1.1 skrll || m32r_PIC_related_p (exp->X_op_symbol)); 457 1.1 skrll } 458 1.1 skrll 459 1.1 skrll static inline int 460 1.1 skrll m32r_check_fixup (expressionS *main_exp, bfd_reloc_code_real_type *r_type_p) 461 1.1 skrll { 462 1.1 skrll expressionS *exp = main_exp; 463 1.1 skrll 464 1.1 skrll if (exp->X_op == O_add && m32r_PIC_related_p (exp->X_op_symbol)) 465 1.1 skrll return 1; 466 1.1 skrll 467 1.1 skrll if (exp->X_op == O_symbol && exp->X_add_symbol) 468 1.1 skrll { 469 1.1 skrll if (exp->X_add_symbol == GOT_symbol) 470 1.1 skrll { 471 1.1 skrll *r_type_p = BFD_RELOC_M32R_GOTPC24; 472 1.1 skrll return 0; 473 1.1 skrll } 474 1.1 skrll } 475 1.1 skrll else if (exp->X_op == O_add) 476 1.1 skrll { 477 1.1 skrll exp = symbol_get_value_expression (exp->X_add_symbol); 478 1.1 skrll if (! exp) 479 1.1 skrll return 0; 480 1.1 skrll } 481 1.1 skrll 482 1.1 skrll if (exp->X_op == O_PIC_reloc) 483 1.1 skrll { 484 1.1 skrll *r_type_p = exp->X_md; 485 1.1 skrll if (exp == main_exp) 486 1.1 skrll exp->X_op = O_symbol; 487 1.1 skrll else 488 1.1 skrll { 489 1.1 skrll main_exp->X_add_symbol = exp->X_add_symbol; 490 1.1 skrll main_exp->X_add_number += exp->X_add_number; 491 1.1 skrll } 492 1.1 skrll } 493 1.1 skrll else 494 1.1 skrll return (m32r_PIC_related_p (exp->X_add_symbol) 495 1.1 skrll || m32r_PIC_related_p (exp->X_op_symbol)); 496 1.1 skrll 497 1.1 skrll return 0; 498 1.1 skrll } 499 1.1 skrll 500 1.1 skrll /* FIXME: Should be machine generated. */ 501 1.1 skrll #define NOP_INSN 0x7000 502 1.1 skrll #define PAR_NOP_INSN 0xf000 /* Can only be used in 2nd slot. */ 503 1.1 skrll 504 1.1 skrll /* This is called from HANDLE_ALIGN in write.c. Fill in the contents 505 1.1 skrll of an rs_align_code fragment. */ 506 1.1 skrll 507 1.1 skrll void 508 1.1 skrll m32r_handle_align (fragS *fragp) 509 1.1 skrll { 510 1.1 skrll static const unsigned char nop_pattern[] = { 0xf0, 0x00 }; 511 1.1 skrll static const unsigned char multi_nop_pattern[] = { 0x70, 0x00, 0xf0, 0x00 }; 512 1.1 skrll 513 1.1 skrll int bytes, fix; 514 1.1 skrll char *p; 515 1.1 skrll 516 1.1 skrll if (fragp->fr_type != rs_align_code) 517 1.1 skrll return; 518 1.1 skrll 519 1.1 skrll bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix; 520 1.1 skrll p = fragp->fr_literal + fragp->fr_fix; 521 1.1 skrll fix = 0; 522 1.1 skrll 523 1.1 skrll if (bytes & 1) 524 1.1 skrll { 525 1.1 skrll fix = 1; 526 1.1 skrll *p++ = 0; 527 1.1 skrll bytes--; 528 1.1 skrll } 529 1.1 skrll 530 1.1 skrll if (bytes & 2) 531 1.1 skrll { 532 1.1 skrll memcpy (p, nop_pattern, 2); 533 1.1 skrll p += 2; 534 1.1 skrll bytes -= 2; 535 1.1 skrll fix += 2; 536 1.1 skrll } 537 1.1 skrll 538 1.1 skrll memcpy (p, multi_nop_pattern, 4); 539 1.1 skrll 540 1.1 skrll fragp->fr_fix += fix; 541 1.1 skrll fragp->fr_var = 4; 542 1.1 skrll } 543 1.1 skrll 544 1.1 skrll /* If the last instruction was the first of 2 16 bit insns, 545 1.1 skrll output a nop to move the PC to a 32 bit boundary. 546 1.1 skrll 547 1.1 skrll This is done via an alignment specification since branch relaxing 548 1.1 skrll may make it unnecessary. 549 1.1 skrll 550 1.1 skrll Internally, we need to output one of these each time a 32 bit insn is 551 1.1 skrll seen after an insn that is relaxable. */ 552 1.1 skrll 553 1.1 skrll static void 554 1.1 skrll fill_insn (int ignore ATTRIBUTE_UNUSED) 555 1.1 skrll { 556 1.1 skrll frag_align_code (2, 0); 557 1.1 skrll prev_insn.insn = NULL; 558 1.1 skrll seen_relaxable_p = 0; 559 1.1 skrll } 560 1.1 skrll 561 1.1 skrll /* Record the symbol so that when we output the insn, we can create 562 1.1 skrll a symbol that is at the start of the instruction. This is used 563 1.1 skrll to emit the label for the start of a breakpoint without causing 564 1.1 skrll the assembler to emit a NOP if the previous instruction was a 565 1.1 skrll 16 bit instruction. */ 566 1.1 skrll 567 1.1 skrll static void 568 1.1 skrll debug_sym (int ignore ATTRIBUTE_UNUSED) 569 1.1 skrll { 570 1.1 skrll char *name; 571 1.1.1.2 christos char delim; 572 1.1 skrll symbolS *symbolP; 573 1.1.1.4 christos sym_linkS *lnk; 574 1.1 skrll 575 1.1 skrll delim = get_symbol_name (&name); 576 1.1 skrll 577 1.1.1.8 christos if ((symbolP = symbol_find (name)) == NULL 578 1.1 skrll && (symbolP = md_undefined_symbol (name)) == NULL) 579 1.1 skrll symbolP = symbol_new (name, undefined_section, &zero_address_frag, 0); 580 1.1 skrll 581 1.1 skrll symbol_table_insert (symbolP); 582 1.1 skrll if (S_IS_DEFINED (symbolP) && (S_GET_SEGMENT (symbolP) != reg_section 583 1.1 skrll || S_IS_EXTERNAL (symbolP) 584 1.1 skrll || S_IS_WEAK (symbolP))) 585 1.1 skrll /* xgettext:c-format */ 586 1.1 skrll as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP)); 587 1.1 skrll 588 1.1.1.5 christos else 589 1.1.1.2 christos { 590 1.1.1.2 christos lnk = XNEW (sym_linkS); 591 1.1.1.2 christos lnk->symbol = symbolP; 592 1.1 skrll lnk->next = debug_sym_link; 593 1.1 skrll debug_sym_link = lnk; 594 1.1 skrll symbol_get_obj (symbolP)->local = 1; 595 1.1.1.4 christos } 596 1.1 skrll 597 1.1 skrll (void) restore_line_pointer (delim); 598 1.1 skrll demand_empty_rest_of_line (); 599 1.1 skrll } 600 1.1 skrll 601 1.1 skrll /* Second pass to expanding the debug symbols, go through linked 602 1.1 skrll list of symbols and reassign the address. */ 603 1.1 skrll 604 1.1 skrll static void 605 1.1 skrll expand_debug_syms (sym_linkS *syms, int align) 606 1.1 skrll { 607 1.1 skrll char *save_input_line = input_line_pointer; 608 1.1 skrll sym_linkS *next_syms; 609 1.1 skrll 610 1.1 skrll if (!syms) 611 1.1 skrll return; 612 1.1.1.10 christos 613 1.1 skrll (void) frag_align_code (align, 0); 614 1.1 skrll for (; syms != NULL; syms = next_syms) 615 1.1 skrll { 616 1.1.1.5 christos symbolS *symbolP = syms->symbol; 617 1.1 skrll next_syms = syms->next; 618 1.1.1.10 christos input_line_pointer = (char *) ".\n"; 619 1.1 skrll pseudo_set (symbolP); 620 1.1 skrll free (syms); 621 1.1 skrll } 622 1.1 skrll 623 1.1 skrll input_line_pointer = save_input_line; 624 1.1 skrll } 625 1.1 skrll 626 1.1 skrll void 627 1.1 skrll m32r_flush_pending_output (void) 628 1.1 skrll { 629 1.1 skrll if (debug_sym_link) 630 1.1.1.10 christos { 631 1.1 skrll expand_debug_syms (debug_sym_link, 1); 632 1.1 skrll debug_sym_link = NULL; 633 1.1 skrll } 634 1.1 skrll } 635 1.1 skrll 636 1.1 skrll /* Cover function to fill_insn called after a label and at end of assembly. 637 1.1 skrll The result is always 1: we're called in a conditional to see if the 638 1.1 skrll current line is a label. */ 639 1.1 skrll 640 1.1 skrll int 641 1.1 skrll m32r_fill_insn (int done) 642 1.1 skrll { 643 1.1 skrll if (prev_seg != NULL) 644 1.1 skrll { 645 1.1 skrll segT seg = now_seg; 646 1.1 skrll subsegT subseg = now_subseg; 647 1.1 skrll 648 1.1 skrll subseg_set (prev_seg, prev_subseg); 649 1.1 skrll 650 1.1 skrll fill_insn (0); 651 1.1 skrll 652 1.1 skrll subseg_set (seg, subseg); 653 1.1 skrll } 654 1.1 skrll 655 1.1 skrll if (done && debug_sym_link) 656 1.1.1.10 christos { 657 1.1 skrll expand_debug_syms (debug_sym_link, 1); 658 1.1 skrll debug_sym_link = NULL; 659 1.1 skrll } 660 1.1 skrll 661 1.1 skrll return 1; 662 1.1 skrll } 663 1.1 skrll 664 1.1 skrll /* The default target format to use. */ 666 1.1 skrll 667 1.1 skrll const char * 668 1.1 skrll m32r_target_format (void) 669 1.1 skrll { 670 1.1 skrll #ifdef TE_LINUX 671 1.1 skrll if (target_big_endian) 672 1.1 skrll return "elf32-m32r-linux"; 673 1.1 skrll else 674 1.1 skrll return "elf32-m32rle-linux"; 675 1.1 skrll #else 676 1.1 skrll if (target_big_endian) 677 1.1 skrll return "elf32-m32r"; 678 1.1 skrll else 679 1.1 skrll return "elf32-m32rle"; 680 1.1 skrll #endif 681 1.1 skrll } 682 1.1 skrll 683 1.1 skrll void 684 1.1 skrll md_begin (void) 685 1.1 skrll { 686 1.1 skrll flagword applicable; 687 1.1 skrll segT seg; 688 1.1 skrll subsegT subseg; 689 1.1 skrll 690 1.1 skrll /* Initialize the `cgen' interface. */ 691 1.1 skrll 692 1.1 skrll /* Set the machine number and endian. */ 693 1.1 skrll gas_cgen_cpu_desc = m32r_cgen_cpu_open (CGEN_CPU_OPEN_MACHS, 0, 694 1.1 skrll CGEN_CPU_OPEN_ENDIAN, 695 1.1 skrll (target_big_endian ? 696 1.1 skrll CGEN_ENDIAN_BIG : CGEN_ENDIAN_LITTLE), 697 1.1 skrll CGEN_CPU_OPEN_END); 698 1.1 skrll m32r_cgen_init_asm (gas_cgen_cpu_desc); 699 1.1 skrll 700 1.1 skrll /* The operand instance table is used during optimization to determine 701 1.1 skrll which insns can be executed in parallel. It is also used to give 702 1.1 skrll warnings regarding operand interference in parallel insns. */ 703 1.1 skrll m32r_cgen_init_opinst_table (gas_cgen_cpu_desc); 704 1.1 skrll 705 1.1 skrll /* This is a callback from cgen to gas to parse operands. */ 706 1.1 skrll cgen_set_parse_operand_fn (gas_cgen_cpu_desc, gas_cgen_parse_operand); 707 1.1 skrll 708 1.1 skrll /* Save the current subseg so we can restore it [it's the default one and 709 1.1 skrll we don't want the initial section to be .sbss]. */ 710 1.1 skrll seg = now_seg; 711 1.1 skrll subseg = now_subseg; 712 1.1 skrll 713 1.1 skrll /* The sbss section is for local .scomm symbols. */ 714 1.1 skrll sbss_section = subseg_new (".sbss", 0); 715 1.1 skrll seg_info (sbss_section)->bss = 1; 716 1.1.1.8 christos 717 1.1.1.8 christos /* This is copied from perform_an_assembly_pass. */ 718 1.1 skrll applicable = bfd_applicable_section_flags (stdoutput); 719 1.1 skrll bfd_set_section_flags (sbss_section, 720 1.1 skrll applicable & (SEC_ALLOC | SEC_SMALL_DATA)); 721 1.1 skrll 722 1.1 skrll subseg_set (seg, subseg); 723 1.1.1.3 christos 724 1.1 skrll /* We must construct a fake section similar to bfd_com_section 725 1.1.1.8 christos but with the name .scommon. */ 726 1.1 skrll scom_section = *bfd_com_section_ptr; 727 1.1 skrll scom_section.name = ".scommon"; 728 1.1.1.3 christos scom_section.flags = SEC_IS_COMMON | SEC_SMALL_DATA; 729 1.1 skrll scom_section.output_section = & scom_section; 730 1.1 skrll scom_section.symbol = & scom_symbol; 731 1.1 skrll scom_symbol = * bfd_com_section_ptr->symbol; 732 1.1 skrll scom_symbol.name = ".scommon"; 733 1.1 skrll scom_symbol.section = & scom_section; 734 1.1 skrll 735 1.1 skrll allow_m32rx (enable_m32rx); 736 1.1 skrll 737 1.1 skrll gas_cgen_initialize_saved_fixups_array (); 738 1.1 skrll } 739 1.1 skrll 740 1.1 skrll #define OPERAND_IS_COND_BIT(operand, indices, index) \ 741 1.1 skrll ((operand)->hw_type == HW_H_COND \ 742 1.1 skrll || ((operand)->hw_type == HW_H_PSW) \ 743 1.1 skrll || ((operand)->hw_type == HW_H_CR \ 744 1.1 skrll && (indices [index] == 0 || indices [index] == 1))) 745 1.1 skrll 746 1.1 skrll /* Returns true if an output of instruction 'a' is referenced by an operand 747 1.1 skrll of instruction 'b'. If 'check_outputs' is true then b's outputs are 748 1.1 skrll checked, otherwise its inputs are examined. */ 749 1.1 skrll 750 1.1 skrll static int 751 1.1 skrll first_writes_to_seconds_operands (m32r_insn *a, 752 1.1 skrll m32r_insn *b, 753 1.1 skrll const int check_outputs) 754 1.1 skrll { 755 1.1 skrll const CGEN_OPINST *a_operands = CGEN_INSN_OPERANDS (a->insn); 756 1.1 skrll const CGEN_OPINST *b_ops = CGEN_INSN_OPERANDS (b->insn); 757 1.1 skrll int a_index; 758 1.1 skrll 759 1.1 skrll if (ignore_parallel_conflicts) 760 1.1 skrll return 0; 761 1.1 skrll 762 1.1 skrll /* If at least one of the instructions takes no operands, then there is 763 1.1 skrll nothing to check. There really are instructions without operands, 764 1.1 skrll eg 'nop'. */ 765 1.1 skrll if (a_operands == NULL || b_ops == NULL) 766 1.1 skrll return 0; 767 1.1 skrll 768 1.1 skrll /* Scan the operand list of 'a' looking for an output operand. */ 769 1.1 skrll for (a_index = 0; 770 1.1 skrll a_operands->type != CGEN_OPINST_END; 771 1.1 skrll a_index ++, a_operands ++) 772 1.1 skrll { 773 1.1 skrll if (a_operands->type == CGEN_OPINST_OUTPUT) 774 1.1 skrll { 775 1.1 skrll int b_index; 776 1.1 skrll const CGEN_OPINST *b_operands = b_ops; 777 1.1 skrll 778 1.1 skrll /* Special Case: 779 1.1 skrll The Condition bit 'C' is a shadow of the CBR register (control 780 1.1 skrll register 1) and also a shadow of bit 31 of the program status 781 1.1 skrll word (control register 0). For now this is handled here, rather 782 1.1 skrll than by cgen.... */ 783 1.1 skrll 784 1.1 skrll if (OPERAND_IS_COND_BIT (a_operands, a->indices, a_index)) 785 1.1 skrll { 786 1.1 skrll /* Scan operand list of 'b' looking for another reference to the 787 1.1 skrll condition bit, which goes in the right direction. */ 788 1.1 skrll for (b_index = 0; 789 1.1 skrll b_operands->type != CGEN_OPINST_END; 790 1.1 skrll b_index++, b_operands++) 791 1.1 skrll { 792 1.1 skrll if ((b_operands->type 793 1.1 skrll == (check_outputs 794 1.1 skrll ? CGEN_OPINST_OUTPUT 795 1.1 skrll : CGEN_OPINST_INPUT)) 796 1.1 skrll && OPERAND_IS_COND_BIT (b_operands, b->indices, b_index)) 797 1.1 skrll return 1; 798 1.1 skrll } 799 1.1 skrll } 800 1.1 skrll else 801 1.1 skrll { 802 1.1 skrll /* Scan operand list of 'b' looking for an operand that 803 1.1 skrll references the same hardware element, and which goes in the 804 1.1 skrll right direction. */ 805 1.1 skrll for (b_index = 0; 806 1.1 skrll b_operands->type != CGEN_OPINST_END; 807 1.1 skrll b_index++, b_operands++) 808 1.1 skrll { 809 1.1 skrll if ((b_operands->type 810 1.1 skrll == (check_outputs 811 1.1 skrll ? CGEN_OPINST_OUTPUT 812 1.1 skrll : CGEN_OPINST_INPUT)) 813 1.1 skrll && (b_operands->hw_type == a_operands->hw_type) 814 1.1 skrll && (a->indices[a_index] == b->indices[b_index])) 815 1.1 skrll return 1; 816 1.1 skrll } 817 1.1 skrll } 818 1.1 skrll } 819 1.1 skrll } 820 1.1 skrll 821 1.1 skrll return 0; 822 1.1 skrll } 823 1.1 skrll 824 1.1 skrll /* Returns true if the insn can (potentially) alter the program counter. */ 825 1.1 skrll 826 1.1 skrll static int 827 1.1 skrll writes_to_pc (m32r_insn *a) 828 1.1 skrll { 829 1.1 skrll if (CGEN_INSN_ATTR_VALUE (a->insn, CGEN_INSN_UNCOND_CTI) 830 1.1 skrll || CGEN_INSN_ATTR_VALUE (a->insn, CGEN_INSN_COND_CTI)) 831 1.1 skrll return 1; 832 1.1 skrll return 0; 833 1.1 skrll } 834 1.1 skrll 835 1.1 skrll /* Return NULL if the two 16 bit insns can be executed in parallel. 836 1.1 skrll Otherwise return a pointer to an error message explaining why not. */ 837 1.1 skrll 838 1.1 skrll static const char * 839 1.1 skrll can_make_parallel (m32r_insn *a, m32r_insn *b) 840 1.1 skrll { 841 1.1 skrll PIPE_ATTR a_pipe; 842 1.1 skrll PIPE_ATTR b_pipe; 843 1.1 skrll 844 1.1 skrll /* Make sure the instructions are the right length. */ 845 1.1 skrll if (CGEN_FIELDS_BITSIZE (&a->fields) != 16 846 1.1.1.8 christos || CGEN_FIELDS_BITSIZE (&b->fields) != 16) 847 1.1 skrll abort (); 848 1.1 skrll 849 1.1 skrll if (first_writes_to_seconds_operands (a, b, true)) 850 1.1 skrll return _("instructions write to the same destination register."); 851 1.1 skrll 852 1.1 skrll a_pipe = CGEN_INSN_ATTR_VALUE (a->insn, CGEN_INSN_PIPE); 853 1.1 skrll b_pipe = CGEN_INSN_ATTR_VALUE (b->insn, CGEN_INSN_PIPE); 854 1.1 skrll 855 1.1 skrll /* Make sure that the instructions use the correct execution pipelines. */ 856 1.1 skrll if (a_pipe == PIPE_NONE 857 1.1 skrll || b_pipe == PIPE_NONE) 858 1.1 skrll return _("Instructions do not use parallel execution pipelines."); 859 1.1 skrll 860 1.1 skrll /* Leave this test for last, since it is the only test that can 861 1.1 skrll go away if the instructions are swapped, and we want to make 862 1.1 skrll sure that any other errors are detected before this happens. */ 863 1.1 skrll if (a_pipe == PIPE_S 864 1.1 skrll || b_pipe == PIPE_O 865 1.1 skrll || (b_pipe == PIPE_O_OS && (enable_m32rx != 2))) 866 1.1 skrll return _("Instructions share the same execution pipeline"); 867 1.1 skrll 868 1.1 skrll return NULL; 869 1.1 skrll } 870 1.1 skrll 871 1.1 skrll /* Force the top bit of the second 16-bit insn to be set. */ 872 1.1 skrll 873 1.1 skrll static void 874 1.1 skrll make_parallel (CGEN_INSN_BYTES_PTR buffer) 875 1.1 skrll { 876 1.1 skrll #if CGEN_INT_INSN_P 877 1.1 skrll *buffer |= 0x8000; 878 1.1 skrll #else 879 1.1 skrll buffer[CGEN_CPU_ENDIAN (gas_cgen_cpu_desc) == CGEN_ENDIAN_BIG ? 0 : 1] 880 1.1 skrll |= 0x80; 881 1.1 skrll #endif 882 1.1 skrll } 883 1.1 skrll 884 1.1 skrll /* Same as make_parallel except buffer contains the bytes in target order. */ 885 1.1 skrll 886 1.1 skrll static void 887 1.1 skrll target_make_parallel (char *buffer) 888 1.1 skrll { 889 1.1 skrll buffer[CGEN_CPU_ENDIAN (gas_cgen_cpu_desc) == CGEN_ENDIAN_BIG ? 0 : 1] 890 1.1 skrll |= 0x80; 891 1.1 skrll } 892 1.1 skrll 893 1.1 skrll /* Assemble two instructions with an explicit parallel operation (||) or 894 1.1 skrll sequential operation (->). */ 895 1.1 skrll 896 1.1 skrll static void 897 1.1 skrll assemble_two_insns (char *str1, char *str2, int parallel_p) 898 1.1 skrll { 899 1.1 skrll char *str3; 900 1.1 skrll m32r_insn first; 901 1.1 skrll m32r_insn second; 902 1.1 skrll char *errmsg; 903 1.1 skrll char save_str2 = *str2; 904 1.1 skrll 905 1.1 skrll /* Separate the two instructions. */ 906 1.1 skrll *str2 = 0; 907 1.1 skrll 908 1.1 skrll /* Make sure the two insns begin on a 32 bit boundary. 909 1.1 skrll This is also done for the serial case (foo -> bar), relaxing doesn't 910 1.1 skrll affect insns written like this. 911 1.1 skrll Note that we must always do this as we can't assume anything about 912 1.1 skrll whether we're currently on a 32 bit boundary or not. Relaxing may 913 1.1 skrll change this. */ 914 1.1.1.10 christos fill_insn (0); 915 1.1 skrll 916 1.1 skrll first.debug_sym_link = debug_sym_link; 917 1.1 skrll debug_sym_link = NULL; 918 1.1 skrll 919 1.1 skrll /* Parse the first instruction. */ 920 1.1.1.2 christos if (! (first.insn = m32r_cgen_assemble_insn 921 1.1 skrll (gas_cgen_cpu_desc, str1, & first.fields, first.buffer, & errmsg))) 922 1.1 skrll { 923 1.1 skrll as_bad ("%s", errmsg); 924 1.1 skrll return; 925 1.1 skrll } 926 1.1 skrll 927 1.1 skrll /* Check it. */ 928 1.1 skrll if (CGEN_FIELDS_BITSIZE (&first.fields) != 16) 929 1.1 skrll { 930 1.1 skrll /* xgettext:c-format */ 931 1.1 skrll as_bad (_("not a 16 bit instruction '%s'"), str1); 932 1.1 skrll return; 933 1.1 skrll } 934 1.1 skrll #ifdef E_M32R2_ARCH 935 1.1 skrll else if ((enable_m32rx == 1) 936 1.1 skrll /* FIXME: Need standard macro to perform this test. */ 937 1.1 skrll && ((CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH) 938 1.1 skrll & (1 << MACH_M32R2)) 939 1.1 skrll && !((CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH) 940 1.1 skrll & (1 << MACH_M32RX))))) 941 1.1 skrll { 942 1.1 skrll /* xgettext:c-format */ 943 1.1 skrll as_bad (_("instruction '%s' is for the M32R2 only"), str1); 944 1.1 skrll return; 945 1.1 skrll } 946 1.1 skrll else if ((! enable_special 947 1.1 skrll && CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL)) 948 1.1 skrll || (! enable_special_m32r 949 1.1 skrll && CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL_M32R))) 950 1.1 skrll #else 951 1.1 skrll else if (! enable_special 952 1.1 skrll && CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL)) 953 1.1 skrll #endif 954 1.1 skrll { 955 1.1 skrll /* xgettext:c-format */ 956 1.1 skrll as_bad (_("unknown instruction '%s'"), str1); 957 1.1 skrll return; 958 1.1 skrll } 959 1.1 skrll else if (! enable_m32rx 960 1.1 skrll /* FIXME: Need standard macro to perform this test. */ 961 1.1 skrll && (CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH) 962 1.1 skrll == (1 << MACH_M32RX))) 963 1.1 skrll { 964 1.1 skrll /* xgettext:c-format */ 965 1.1 skrll as_bad (_("instruction '%s' is for the M32RX only"), str1); 966 1.1 skrll return; 967 1.1 skrll } 968 1.1 skrll 969 1.1 skrll /* Check to see if this is an allowable parallel insn. */ 970 1.1 skrll if (parallel_p 971 1.1 skrll && CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_PIPE) == PIPE_NONE) 972 1.1 skrll { 973 1.1 skrll /* xgettext:c-format */ 974 1.1 skrll as_bad (_("instruction '%s' cannot be executed in parallel."), str1); 975 1.1 skrll return; 976 1.1 skrll } 977 1.1 skrll 978 1.1 skrll /* Restore the original assembly text, just in case it is needed. */ 979 1.1 skrll *str2 = save_str2; 980 1.1 skrll 981 1.1 skrll /* Save the original string pointer. */ 982 1.1 skrll str3 = str1; 983 1.1 skrll 984 1.1 skrll /* Advanced past the parsed string. */ 985 1.1 skrll str1 = str2 + 2; 986 1.1 skrll 987 1.1 skrll /* Remember the entire string in case it is needed for error 988 1.1 skrll messages. */ 989 1.1 skrll str2 = str3; 990 1.1 skrll 991 1.1 skrll /* Convert the opcode to lower case. */ 992 1.1.1.10 christos { 993 1.1 skrll char *s2 = str1; 994 1.1 skrll 995 1.1 skrll while (is_whitespace (*s2++)) 996 1.1 skrll continue; 997 1.1 skrll 998 1.1 skrll --s2; 999 1.1 skrll 1000 1.1 skrll while (ISALNUM (*s2)) 1001 1.1 skrll { 1002 1.1 skrll *s2 = TOLOWER (*s2); 1003 1.1 skrll s2++; 1004 1.1 skrll } 1005 1.1 skrll } 1006 1.1 skrll 1007 1.1 skrll /* Preserve any fixups that have been generated and reset the list 1008 1.1 skrll to empty. */ 1009 1.1 skrll gas_cgen_save_fixups (0); 1010 1.1 skrll 1011 1.1 skrll /* Get the indices of the operands of the instruction. */ 1012 1.1 skrll /* FIXME: CGEN_FIELDS is already recorded, but relying on that fact 1013 1.1 skrll doesn't seem right. Perhaps allow passing fields like we do insn. */ 1014 1.1 skrll /* FIXME: ALIAS insns do not have operands, so we use this function 1015 1.1 skrll to find the equivalent insn and overwrite the value stored in our 1016 1.1 skrll structure. We still need the original insn, however, since this 1017 1.1 skrll may have certain attributes that are not present in the unaliased 1018 1.1 skrll version (eg relaxability). When aliases behave differently this 1019 1.1 skrll may have to change. */ 1020 1.1 skrll first.orig_insn = first.insn; 1021 1.1 skrll { 1022 1.1 skrll CGEN_FIELDS tmp_fields; 1023 1.1 skrll first.insn = cgen_lookup_get_insn_operands 1024 1.1 skrll (gas_cgen_cpu_desc, NULL, INSN_VALUE (first.buffer), NULL, 16, 1025 1.1 skrll first.indices, &tmp_fields); 1026 1.1 skrll } 1027 1.1 skrll 1028 1.1 skrll if (first.insn == NULL) 1029 1.1 skrll as_fatal (_("internal error: lookup/get operands failed")); 1030 1.1 skrll 1031 1.1 skrll second.debug_sym_link = NULL; 1032 1.1 skrll 1033 1.1 skrll /* Parse the second instruction. */ 1034 1.1.1.2 christos if (! (second.insn = m32r_cgen_assemble_insn 1035 1.1 skrll (gas_cgen_cpu_desc, str1, & second.fields, second.buffer, & errmsg))) 1036 1.1 skrll { 1037 1.1 skrll as_bad ("%s", errmsg); 1038 1.1 skrll return; 1039 1.1 skrll } 1040 1.1 skrll 1041 1.1 skrll /* Check it. */ 1042 1.1 skrll if (CGEN_FIELDS_BITSIZE (&second.fields) != 16) 1043 1.1 skrll { 1044 1.1 skrll /* xgettext:c-format */ 1045 1.1 skrll as_bad (_("not a 16 bit instruction '%s'"), str1); 1046 1.1 skrll return; 1047 1.1 skrll } 1048 1.1 skrll #ifdef E_M32R2_ARCH 1049 1.1 skrll else if ((enable_m32rx == 1) 1050 1.1 skrll /* FIXME: Need standard macro to perform this test. */ 1051 1.1 skrll && ((CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH) 1052 1.1 skrll & (1 << MACH_M32R2)) 1053 1.1 skrll && !((CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH) 1054 1.1 skrll & (1 << MACH_M32RX))))) 1055 1.1 skrll { 1056 1.1 skrll /* xgettext:c-format */ 1057 1.1 skrll as_bad (_("instruction '%s' is for the M32R2 only"), str1); 1058 1.1 skrll return; 1059 1.1 skrll } 1060 1.1 skrll else if ((! enable_special 1061 1.1 skrll && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL)) 1062 1.1 skrll || (! enable_special_m32r 1063 1.1 skrll && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL_M32R))) 1064 1.1 skrll #else 1065 1.1 skrll else if (! enable_special 1066 1.1 skrll && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL)) 1067 1.1 skrll #endif 1068 1.1 skrll { 1069 1.1 skrll /* xgettext:c-format */ 1070 1.1 skrll as_bad (_("unknown instruction '%s'"), str1); 1071 1.1 skrll return; 1072 1.1 skrll } 1073 1.1 skrll else if (! enable_m32rx 1074 1.1 skrll && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_MACH) == (1 << MACH_M32RX)) 1075 1.1 skrll { 1076 1.1 skrll /* xgettext:c-format */ 1077 1.1 skrll as_bad (_("instruction '%s' is for the M32RX only"), str1); 1078 1.1 skrll return; 1079 1.1 skrll } 1080 1.1 skrll 1081 1.1 skrll /* Check to see if this is an allowable parallel insn. */ 1082 1.1 skrll if (parallel_p 1083 1.1 skrll && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_PIPE) == PIPE_NONE) 1084 1.1 skrll { 1085 1.1 skrll /* xgettext:c-format */ 1086 1.1 skrll as_bad (_("instruction '%s' cannot be executed in parallel."), str1); 1087 1.1 skrll return; 1088 1.1 skrll } 1089 1.1 skrll 1090 1.1 skrll if (parallel_p && ! enable_m32rx) 1091 1.1 skrll { 1092 1.1 skrll if (CGEN_INSN_NUM (first.insn) != M32R_INSN_NOP 1093 1.1 skrll && CGEN_INSN_NUM (second.insn) != M32R_INSN_NOP) 1094 1.1 skrll { 1095 1.1 skrll /* xgettext:c-format */ 1096 1.1 skrll as_bad (_("'%s': only the NOP instruction can be issued in parallel on the m32r"), str2); 1097 1.1 skrll return; 1098 1.1 skrll } 1099 1.1 skrll } 1100 1.1 skrll 1101 1.1 skrll /* Get the indices of the operands of the instruction. */ 1102 1.1 skrll second.orig_insn = second.insn; 1103 1.1 skrll { 1104 1.1 skrll CGEN_FIELDS tmp_fields; 1105 1.1 skrll second.insn = cgen_lookup_get_insn_operands 1106 1.1 skrll (gas_cgen_cpu_desc, NULL, INSN_VALUE (second.buffer), NULL, 16, 1107 1.1 skrll second.indices, &tmp_fields); 1108 1.1 skrll } 1109 1.1 skrll 1110 1.1 skrll if (second.insn == NULL) 1111 1.1 skrll as_fatal (_("internal error: lookup/get operands failed")); 1112 1.1 skrll 1113 1.1 skrll /* We assume that if the first instruction writes to a register that is 1114 1.1 skrll read by the second instruction it is because the programmer intended 1115 1.1 skrll this to happen, (after all they have explicitly requested that these 1116 1.1 skrll two instructions be executed in parallel). Although if the global 1117 1.1 skrll variable warn_explicit_parallel_conflicts is true then we do generate 1118 1.1 skrll a warning message. Similarly we assume that parallel branch and jump 1119 1.1 skrll instructions are deliberate and should not produce errors. */ 1120 1.1.1.8 christos 1121 1.1 skrll if (parallel_p && warn_explicit_parallel_conflicts) 1122 1.1 skrll { 1123 1.1 skrll if (first_writes_to_seconds_operands (&first, &second, false)) 1124 1.1.1.8 christos /* xgettext:c-format */ 1125 1.1 skrll as_warn (_("%s: output of 1st instruction is the same as an input to 2nd instruction - is this intentional ?"), str2); 1126 1.1 skrll 1127 1.1 skrll if (first_writes_to_seconds_operands (&second, &first, false)) 1128 1.1 skrll /* xgettext:c-format */ 1129 1.1 skrll as_warn (_("%s: output of 2nd instruction is the same as an input to 1st instruction - is this intentional ?"), str2); 1130 1.1 skrll } 1131 1.1 skrll 1132 1.1 skrll if (!parallel_p 1133 1.1 skrll || (errmsg = (char *) can_make_parallel (&first, &second)) == NULL) 1134 1.1 skrll { 1135 1.1 skrll /* Get the fixups for the first instruction. */ 1136 1.1 skrll gas_cgen_swap_fixups (0); 1137 1.1 skrll 1138 1.1 skrll /* Write it out. */ 1139 1.1 skrll expand_debug_syms (first.debug_sym_link, 1); 1140 1.1 skrll gas_cgen_finish_insn (first.orig_insn, first.buffer, 1141 1.1 skrll CGEN_FIELDS_BITSIZE (&first.fields), 0, NULL); 1142 1.1 skrll 1143 1.1 skrll /* Force the top bit of the second insn to be set. */ 1144 1.1 skrll if (parallel_p) 1145 1.1 skrll make_parallel (second.buffer); 1146 1.1 skrll 1147 1.1 skrll /* Get its fixups. */ 1148 1.1 skrll gas_cgen_restore_fixups (0); 1149 1.1 skrll 1150 1.1 skrll /* Write it out. */ 1151 1.1 skrll expand_debug_syms (second.debug_sym_link, 1); 1152 1.1 skrll gas_cgen_finish_insn (second.orig_insn, second.buffer, 1153 1.1 skrll CGEN_FIELDS_BITSIZE (&second.fields), 0, NULL); 1154 1.1 skrll } 1155 1.1 skrll /* Try swapping the instructions to see if they work that way. */ 1156 1.1 skrll else if (can_make_parallel (&second, &first) == NULL) 1157 1.1 skrll { 1158 1.1 skrll /* Write out the second instruction first. */ 1159 1.1 skrll expand_debug_syms (second.debug_sym_link, 1); 1160 1.1 skrll gas_cgen_finish_insn (second.orig_insn, second.buffer, 1161 1.1 skrll CGEN_FIELDS_BITSIZE (&second.fields), 0, NULL); 1162 1.1 skrll 1163 1.1 skrll /* Force the top bit of the first instruction to be set. */ 1164 1.1 skrll make_parallel (first.buffer); 1165 1.1 skrll 1166 1.1 skrll /* Get the fixups for the first instruction. */ 1167 1.1 skrll gas_cgen_restore_fixups (0); 1168 1.1 skrll 1169 1.1 skrll /* Write out the first instruction. */ 1170 1.1 skrll expand_debug_syms (first.debug_sym_link, 1); 1171 1.1 skrll gas_cgen_finish_insn (first.orig_insn, first.buffer, 1172 1.1 skrll CGEN_FIELDS_BITSIZE (&first.fields), 0, NULL); 1173 1.1 skrll } 1174 1.1 skrll else 1175 1.1 skrll { 1176 1.1 skrll as_bad ("'%s': %s", str2, errmsg); 1177 1.1 skrll return; 1178 1.1 skrll } 1179 1.1 skrll 1180 1.1 skrll if (CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL) 1181 1.1 skrll || CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL)) 1182 1.1 skrll m32r_flags |= E_M32R_HAS_HIDDEN_INST; 1183 1.1 skrll if (CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL_M32R) 1184 1.1 skrll || CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL_M32R)) 1185 1.1 skrll m32r_flags |= E_M32R_HAS_BIT_INST; 1186 1.1 skrll if (CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL_FLOAT) 1187 1.1 skrll || CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL_FLOAT)) 1188 1.1 skrll m32r_flags |= E_M32R_HAS_FLOAT_INST; 1189 1.1 skrll 1190 1.1 skrll /* Set these so m32r_fill_insn can use them. */ 1191 1.1 skrll prev_seg = now_seg; 1192 1.1 skrll prev_subseg = now_subseg; 1193 1.1 skrll } 1194 1.1 skrll 1195 1.1 skrll void 1196 1.1 skrll md_assemble (char *str) 1197 1.1 skrll { 1198 1.1 skrll m32r_insn insn; 1199 1.1 skrll char *errmsg; 1200 1.1 skrll char *str2 = NULL; 1201 1.1 skrll 1202 1.1 skrll /* Initialize GAS's cgen interface for a new instruction. */ 1203 1.1 skrll gas_cgen_init_parse (); 1204 1.1 skrll 1205 1.1 skrll /* Look for a parallel instruction separator. */ 1206 1.1 skrll if ((str2 = strstr (str, "||")) != NULL) 1207 1.1 skrll { 1208 1.1 skrll assemble_two_insns (str, str2, 1); 1209 1.1 skrll m32r_flags |= E_M32R_HAS_PARALLEL; 1210 1.1 skrll return; 1211 1.1 skrll } 1212 1.1 skrll 1213 1.1 skrll /* Also look for a sequential instruction separator. */ 1214 1.1 skrll if ((str2 = strstr (str, "->")) != NULL) 1215 1.1 skrll { 1216 1.1 skrll assemble_two_insns (str, str2, 0); 1217 1.1 skrll return; 1218 1.1.1.10 christos } 1219 1.1 skrll 1220 1.1 skrll insn.debug_sym_link = debug_sym_link; 1221 1.1 skrll debug_sym_link = NULL; 1222 1.1 skrll 1223 1.1 skrll insn.insn = m32r_cgen_assemble_insn 1224 1.1 skrll (gas_cgen_cpu_desc, str, &insn.fields, insn.buffer, & errmsg); 1225 1.1.1.2 christos 1226 1.1 skrll if (!insn.insn) 1227 1.1 skrll { 1228 1.1 skrll as_bad ("%s", errmsg); 1229 1.1 skrll return; 1230 1.1 skrll } 1231 1.1 skrll 1232 1.1 skrll #ifdef E_M32R2_ARCH 1233 1.1 skrll if ((enable_m32rx == 1) 1234 1.1 skrll /* FIXME: Need standard macro to perform this test. */ 1235 1.1 skrll && ((CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_MACH) 1236 1.1 skrll & (1 << MACH_M32R2)) 1237 1.1 skrll && !((CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_MACH) 1238 1.1 skrll & (1 << MACH_M32RX))))) 1239 1.1 skrll { 1240 1.1 skrll /* xgettext:c-format */ 1241 1.1 skrll as_bad (_("instruction '%s' is for the M32R2 only"), str); 1242 1.1 skrll return; 1243 1.1 skrll } 1244 1.1 skrll else if ((! enable_special 1245 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL)) 1246 1.1 skrll || (! enable_special_m32r 1247 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL_M32R))) 1248 1.1 skrll #else 1249 1.1 skrll if (! enable_special 1250 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL)) 1251 1.1 skrll #endif 1252 1.1 skrll { 1253 1.1 skrll /* xgettext:c-format */ 1254 1.1 skrll as_bad (_("unknown instruction '%s'"), str); 1255 1.1 skrll return; 1256 1.1 skrll } 1257 1.1 skrll else if (! enable_m32rx 1258 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_MACH) == (1 << MACH_M32RX)) 1259 1.1 skrll { 1260 1.1 skrll /* xgettext:c-format */ 1261 1.1 skrll as_bad (_("instruction '%s' is for the M32RX only"), str); 1262 1.1 skrll return; 1263 1.1 skrll } 1264 1.1 skrll 1265 1.1 skrll if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL)) 1266 1.1 skrll m32r_flags |= E_M32R_HAS_HIDDEN_INST; 1267 1.1 skrll if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL_M32R)) 1268 1.1 skrll m32r_flags |= E_M32R_HAS_BIT_INST; 1269 1.1 skrll if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL_FLOAT)) 1270 1.1 skrll m32r_flags |= E_M32R_HAS_FLOAT_INST; 1271 1.1 skrll 1272 1.1 skrll if (CGEN_INSN_BITSIZE (insn.insn) == 32) 1273 1.1 skrll { 1274 1.1 skrll /* 32 bit insns must live on 32 bit boundaries. */ 1275 1.1 skrll if (prev_insn.insn || seen_relaxable_p) 1276 1.1 skrll { 1277 1.1 skrll /* ??? If calling fill_insn too many times turns us into a memory 1278 1.1 skrll pig, can we call a fn to assemble a nop instead of 1279 1.1 skrll !seen_relaxable_p? */ 1280 1.1 skrll fill_insn (0); 1281 1.1 skrll } 1282 1.1 skrll 1283 1.1 skrll expand_debug_syms (insn.debug_sym_link, 2); 1284 1.1 skrll 1285 1.1 skrll /* Doesn't really matter what we pass for RELAX_P here. */ 1286 1.1 skrll gas_cgen_finish_insn (insn.insn, insn.buffer, 1287 1.1 skrll CGEN_FIELDS_BITSIZE (&insn.fields), 1, NULL); 1288 1.1 skrll } 1289 1.1.1.8 christos else 1290 1.1 skrll { 1291 1.1 skrll int on_32bit_boundary_p; 1292 1.1 skrll int swap = false; 1293 1.1 skrll 1294 1.1 skrll if (CGEN_INSN_BITSIZE (insn.insn) != 16) 1295 1.1 skrll abort (); 1296 1.1 skrll 1297 1.1 skrll insn.orig_insn = insn.insn; 1298 1.1 skrll 1299 1.1 skrll /* If the previous insn was relaxable, then it may be expanded 1300 1.1 skrll to fill the current 16 bit slot. Emit a NOP here to occupy 1301 1.1 skrll this slot, so that we can start at optimizing at a 32 bit 1302 1.1 skrll boundary. */ 1303 1.1 skrll if (prev_insn.insn && seen_relaxable_p && optimize) 1304 1.1 skrll fill_insn (0); 1305 1.1 skrll 1306 1.1 skrll if (enable_m32rx) 1307 1.1 skrll { 1308 1.1 skrll /* Get the indices of the operands of the instruction. 1309 1.1 skrll FIXME: See assemble_parallel for notes on orig_insn. */ 1310 1.1 skrll { 1311 1.1 skrll CGEN_FIELDS tmp_fields; 1312 1.1 skrll insn.insn = cgen_lookup_get_insn_operands 1313 1.1 skrll (gas_cgen_cpu_desc, NULL, INSN_VALUE (insn.buffer), NULL, 1314 1.1 skrll 16, insn.indices, &tmp_fields); 1315 1.1 skrll } 1316 1.1 skrll 1317 1.1 skrll if (insn.insn == NULL) 1318 1.1 skrll as_fatal (_("internal error: lookup/get operands failed")); 1319 1.1 skrll } 1320 1.1 skrll 1321 1.1 skrll /* Compute whether we're on a 32 bit boundary or not. 1322 1.1 skrll prev_insn.insn is NULL when we're on a 32 bit boundary. */ 1323 1.1 skrll on_32bit_boundary_p = prev_insn.insn == NULL; 1324 1.1 skrll 1325 1.1 skrll /* Change a frag to, if each insn to swap is in a different frag. 1326 1.1 skrll It must keep only one instruction in a frag. */ 1327 1.1 skrll if (parallel() && on_32bit_boundary_p) 1328 1.1 skrll { 1329 1.1 skrll frag_wane (frag_now); 1330 1.1 skrll frag_new (0); 1331 1.1 skrll } 1332 1.1 skrll 1333 1.1 skrll /* Look to see if this instruction can be combined with the 1334 1.1 skrll previous instruction to make one, parallel, 32 bit instruction. 1335 1.1 skrll If the previous instruction (potentially) changed the flow of 1336 1.1 skrll program control, then it cannot be combined with the current 1337 1.1 skrll instruction. If the current instruction is relaxable, then it 1338 1.1 skrll might be replaced with a longer version, so we cannot combine it. 1339 1.1 skrll Also if the output of the previous instruction is used as an 1340 1.1 skrll input to the current instruction then it cannot be combined. 1341 1.1 skrll Otherwise call can_make_parallel() with both orderings of the 1342 1.1 skrll instructions to see if they can be combined. */ 1343 1.1 skrll if (! on_32bit_boundary_p 1344 1.1.1.8 christos && parallel () 1345 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn.orig_insn, CGEN_INSN_RELAXABLE) == 0 1346 1.1 skrll && ! writes_to_pc (&prev_insn) 1347 1.1 skrll && ! first_writes_to_seconds_operands (&prev_insn, &insn, false)) 1348 1.1 skrll { 1349 1.1.1.8 christos if (can_make_parallel (&prev_insn, &insn) == NULL) 1350 1.1 skrll make_parallel (insn.buffer); 1351 1.1 skrll else if (can_make_parallel (&insn, &prev_insn) == NULL) 1352 1.1 skrll swap = true; 1353 1.1 skrll } 1354 1.1 skrll 1355 1.1 skrll expand_debug_syms (insn.debug_sym_link, 1); 1356 1.1 skrll 1357 1.1 skrll { 1358 1.1 skrll int i; 1359 1.1 skrll finished_insnS fi; 1360 1.1 skrll 1361 1.1 skrll /* Ensure each pair of 16 bit insns is in the same frag. */ 1362 1.1 skrll frag_grow (4); 1363 1.1 skrll 1364 1.1 skrll gas_cgen_finish_insn (insn.orig_insn, insn.buffer, 1365 1.1 skrll CGEN_FIELDS_BITSIZE (&insn.fields), 1366 1.1 skrll 1 /* relax_p */, &fi); 1367 1.1 skrll insn.addr = fi.addr; 1368 1.1 skrll insn.frag = fi.frag; 1369 1.1 skrll insn.num_fixups = fi.num_fixups; 1370 1.1 skrll for (i = 0; i < fi.num_fixups; ++i) 1371 1.1 skrll insn.fixups[i] = fi.fixups[i]; 1372 1.1 skrll } 1373 1.1 skrll 1374 1.1 skrll if (swap) 1375 1.1 skrll { 1376 1.1 skrll int i, tmp; 1377 1.1 skrll 1378 1.1 skrll #define SWAP_BYTES(a,b) tmp = a; a = b; b = tmp 1379 1.1 skrll 1380 1.1 skrll /* Swap the two insns */ 1381 1.1 skrll SWAP_BYTES (prev_insn.addr[0], insn.addr[0]); 1382 1.1 skrll SWAP_BYTES (prev_insn.addr[1], insn.addr[1]); 1383 1.1 skrll 1384 1.1 skrll target_make_parallel (insn.addr); 1385 1.1 skrll 1386 1.1 skrll /* Swap any relaxable frags recorded for the two insns. */ 1387 1.1 skrll /* FIXME: Clarify. relaxation precludes parallel insns */ 1388 1.1 skrll if (prev_insn.frag->fr_opcode == prev_insn.addr) 1389 1.1 skrll prev_insn.frag->fr_opcode = insn.addr; 1390 1.1 skrll else if (insn.frag->fr_opcode == insn.addr) 1391 1.1 skrll insn.frag->fr_opcode = prev_insn.addr; 1392 1.1 skrll 1393 1.1 skrll /* Change a frag to, if each insn is in a different frag. 1394 1.1 skrll It must keep only one instruction in a frag. */ 1395 1.1 skrll if (prev_insn.frag != insn.frag) 1396 1.1 skrll { 1397 1.1 skrll for (i = 0; i < prev_insn.num_fixups; ++i) 1398 1.1 skrll prev_insn.fixups[i]->fx_frag = insn.frag; 1399 1.1 skrll for (i = 0; i < insn.num_fixups; ++i) 1400 1.1 skrll insn.fixups[i]->fx_frag = prev_insn.frag; 1401 1.1 skrll } 1402 1.1 skrll else 1403 1.1 skrll { 1404 1.1 skrll /* Update the addresses in any fixups. 1405 1.1 skrll Note that we don't have to handle the case where each insn is in 1406 1.1 skrll a different frag as we ensure they're in the same frag above. */ 1407 1.1 skrll for (i = 0; i < prev_insn.num_fixups; ++i) 1408 1.1 skrll prev_insn.fixups[i]->fx_where += 2; 1409 1.1 skrll for (i = 0; i < insn.num_fixups; ++i) 1410 1.1 skrll insn.fixups[i]->fx_where -= 2; 1411 1.1 skrll } 1412 1.1 skrll } 1413 1.1 skrll 1414 1.1 skrll /* Keep track of whether we've seen a pair of 16 bit insns. 1415 1.1 skrll prev_insn.insn is NULL when we're on a 32 bit boundary. */ 1416 1.1 skrll if (on_32bit_boundary_p) 1417 1.1 skrll prev_insn = insn; 1418 1.1 skrll else 1419 1.1 skrll prev_insn.insn = NULL; 1420 1.1 skrll 1421 1.1 skrll /* If the insn needs the following one to be on a 32 bit boundary 1422 1.1 skrll (e.g. subroutine calls), fill this insn's slot. */ 1423 1.1 skrll if (on_32bit_boundary_p 1424 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn.orig_insn, CGEN_INSN_FILL_SLOT) != 0) 1425 1.1 skrll fill_insn (0); 1426 1.1 skrll 1427 1.1 skrll /* If this is a relaxable insn (can be replaced with a larger version) 1428 1.1 skrll mark the fact so that we can emit an alignment directive for a 1429 1.1 skrll following 32 bit insn if we see one. */ 1430 1.1 skrll if (CGEN_INSN_ATTR_VALUE (insn.orig_insn, CGEN_INSN_RELAXABLE) != 0) 1431 1.1 skrll seen_relaxable_p = 1; 1432 1.1 skrll } 1433 1.1 skrll 1434 1.1 skrll /* Set these so m32r_fill_insn can use them. */ 1435 1.1 skrll prev_seg = now_seg; 1436 1.1 skrll prev_subseg = now_subseg; 1437 1.1 skrll } 1438 1.1 skrll 1439 1.1 skrll /* The syntax in the manual says constants begin with '#'. 1440 1.1 skrll We just ignore it. */ 1441 1.1 skrll 1442 1.1 skrll void 1443 1.1 skrll md_operand (expressionS *expressionP) 1444 1.1 skrll { 1445 1.1 skrll if (*input_line_pointer == '#') 1446 1.1 skrll { 1447 1.1 skrll input_line_pointer++; 1448 1.1 skrll expression (expressionP); 1449 1.1 skrll } 1450 1.1 skrll } 1451 1.1 skrll 1452 1.1.1.7 christos valueT 1453 1.1 skrll md_section_align (segT segment, valueT size) 1454 1.1.1.10 christos { 1455 1.1 skrll int align = bfd_section_alignment (segment); 1456 1.1 skrll 1457 1.1 skrll return (size + ((valueT) 1 << align) - 1) & -((valueT) 1 << align); 1458 1.1 skrll } 1459 1.1 skrll 1460 1.1 skrll symbolS * 1461 1.1 skrll md_undefined_symbol (char *name ATTRIBUTE_UNUSED) 1462 1.1 skrll { 1463 1.1 skrll return 0; 1464 1.1 skrll } 1465 1.1 skrll 1466 1.1 skrll /* .scomm pseudo-op handler. 1468 1.1 skrll 1469 1.1 skrll This is a new pseudo-op to handle putting objects in .scommon. 1470 1.1 skrll By doing this the linker won't need to do any work, 1471 1.1 skrll and more importantly it removes the implicit -G arg necessary to 1472 1.1 skrll correctly link the object file. */ 1473 1.1 skrll 1474 1.1 skrll static void 1475 1.1 skrll m32r_scomm (int ignore ATTRIBUTE_UNUSED) 1476 1.1 skrll { 1477 1.1 skrll char *name; 1478 1.1 skrll char c; 1479 1.1 skrll char *p; 1480 1.1 skrll offsetT size; 1481 1.1.1.4 christos symbolS *symbolP; 1482 1.1 skrll offsetT align; 1483 1.1 skrll int align2; 1484 1.1 skrll 1485 1.1.1.10 christos c = get_symbol_name (&name); 1486 1.1.1.10 christos 1487 1.1 skrll /* Just after name is now '\0'. */ 1488 1.1 skrll p = input_line_pointer; 1489 1.1 skrll restore_line_pointer (c); 1490 1.1 skrll SKIP_WHITESPACE (); 1491 1.1 skrll if (*input_line_pointer != ',') 1492 1.1 skrll { 1493 1.1 skrll as_bad (_("Expected comma after symbol-name: rest of line ignored.")); 1494 1.1 skrll ignore_rest_of_line (); 1495 1.1 skrll return; 1496 1.1 skrll } 1497 1.1 skrll 1498 1.1 skrll /* Skip ','. */ 1499 1.1 skrll input_line_pointer++; 1500 1.1 skrll if ((size = get_absolute_expression ()) < 0) 1501 1.1 skrll { 1502 1.1 skrll /* xgettext:c-format */ 1503 1.1 skrll as_warn (_(".SCOMMon length (%ld.) <0! Ignored."), (long) size); 1504 1.1 skrll ignore_rest_of_line (); 1505 1.1 skrll return; 1506 1.1 skrll } 1507 1.1 skrll 1508 1.1 skrll /* The third argument to .scomm is the alignment. */ 1509 1.1 skrll if (*input_line_pointer != ',') 1510 1.1 skrll align = 8; 1511 1.1 skrll else 1512 1.1 skrll { 1513 1.1 skrll ++input_line_pointer; 1514 1.1 skrll align = get_absolute_expression (); 1515 1.1 skrll if (align <= 0) 1516 1.1 skrll { 1517 1.1 skrll as_warn (_("ignoring bad alignment")); 1518 1.1 skrll align = 8; 1519 1.1 skrll } 1520 1.1 skrll } 1521 1.1 skrll 1522 1.1 skrll /* Convert to a power of 2 alignment. */ 1523 1.1 skrll if (align) 1524 1.1 skrll { 1525 1.1 skrll for (align2 = 0; (align & 1) == 0; align >>= 1, ++align2) 1526 1.1 skrll continue; 1527 1.1 skrll if (align != 1) 1528 1.1 skrll { 1529 1.1 skrll as_bad (_("Common alignment not a power of 2")); 1530 1.1 skrll ignore_rest_of_line (); 1531 1.1 skrll return; 1532 1.1 skrll } 1533 1.1 skrll } 1534 1.1 skrll else 1535 1.1 skrll align2 = 0; 1536 1.1 skrll 1537 1.1 skrll *p = 0; 1538 1.1 skrll symbolP = symbol_find_or_make (name); 1539 1.1 skrll *p = c; 1540 1.1 skrll 1541 1.1 skrll if (S_IS_DEFINED (symbolP)) 1542 1.1 skrll { 1543 1.1 skrll /* xgettext:c-format */ 1544 1.1 skrll as_bad (_("Ignoring attempt to re-define symbol `%s'."), 1545 1.1 skrll S_GET_NAME (symbolP)); 1546 1.1 skrll ignore_rest_of_line (); 1547 1.1 skrll return; 1548 1.1 skrll } 1549 1.1 skrll 1550 1.1 skrll if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size) 1551 1.1 skrll { 1552 1.1 skrll /* xgettext:c-format */ 1553 1.1 skrll as_bad (_("Length of .scomm \"%s\" is already %ld. Not changed to %ld."), 1554 1.1 skrll S_GET_NAME (symbolP), 1555 1.1 skrll (long) S_GET_VALUE (symbolP), 1556 1.1 skrll (long) size); 1557 1.1 skrll 1558 1.1 skrll ignore_rest_of_line (); 1559 1.1 skrll return; 1560 1.1 skrll } 1561 1.1 skrll 1562 1.1 skrll if (symbol_get_obj (symbolP)->local) 1563 1.1 skrll { 1564 1.1 skrll segT old_sec = now_seg; 1565 1.1 skrll int old_subsec = now_subseg; 1566 1.1 skrll char *pfrag; 1567 1.1 skrll 1568 1.1 skrll record_alignment (sbss_section, align2); 1569 1.1 skrll subseg_set (sbss_section, 0); 1570 1.1 skrll 1571 1.1 skrll if (align2) 1572 1.1 skrll frag_align (align2, 0, 0); 1573 1.1 skrll 1574 1.1 skrll if (S_GET_SEGMENT (symbolP) == sbss_section) 1575 1.1.1.10 christos symbol_get_frag (symbolP)->fr_symbol = 0; 1576 1.1 skrll 1577 1.1 skrll symbol_set_frag (symbolP, frag_now); 1578 1.1 skrll 1579 1.1 skrll pfrag = frag_var (rs_org, 1, 1, 0, symbolP, size, NULL); 1580 1.1 skrll *pfrag = 0; 1581 1.1 skrll S_SET_SIZE (symbolP, size); 1582 1.1 skrll S_SET_SEGMENT (symbolP, sbss_section); 1583 1.1 skrll S_CLEAR_EXTERNAL (symbolP); 1584 1.1.1.10 christos subseg_set (old_sec, old_subsec); 1585 1.1 skrll } 1586 1.1 skrll else 1587 1.1 skrll { 1588 1.1 skrll S_SET_VALUE (symbolP, size); 1589 1.1 skrll S_SET_ALIGN (symbolP, align2); 1590 1.1 skrll S_SET_EXTERNAL (symbolP); 1591 1.1 skrll S_SET_SEGMENT (symbolP, &scom_section); 1592 1.1 skrll } 1593 1.1 skrll 1594 1.1 skrll demand_empty_rest_of_line (); 1595 1.1 skrll } 1596 1.1 skrll 1597 1.1 skrll /* The target specific pseudo-ops which we support. */ 1598 1.1 skrll const pseudo_typeS md_pseudo_table[] = 1599 1.1 skrll { 1600 1.1 skrll { "word", cons, 4 }, 1601 1.1 skrll { "fillinsn", fill_insn, 0 }, 1602 1.1 skrll { "scomm", m32r_scomm, 0 }, 1603 1.1 skrll { "debugsym", debug_sym, 0 }, 1604 1.1 skrll { "m32r", allow_m32rx, 0 }, 1605 1.1 skrll { "m32rx", allow_m32rx, 1 }, 1606 1.1 skrll { "m32r2", allow_m32rx, 2 }, 1607 1.1 skrll { "little", little, 1 }, 1608 1.1 skrll { "big", little, 0 }, 1609 1.1 skrll { NULL, NULL, 0 } 1610 1.1 skrll }; 1611 1.1 skrll 1612 1.1 skrll /* Interface to relax_segment. */ 1614 1.1 skrll 1615 1.1 skrll /* FIXME: Build table by hand, get it working, then machine generate. */ 1616 1.1 skrll 1617 1.1 skrll const relax_typeS md_relax_table[] = 1618 1.1 skrll { 1619 1.1 skrll /* The fields are: 1620 1.1 skrll 1) most positive reach of this state, 1621 1.1 skrll 2) most negative reach of this state, 1622 1.1 skrll 3) how many bytes this mode will add to the size of the current frag 1623 1.1 skrll 4) which index into the table to try if we can't fit into this one. */ 1624 1.1 skrll 1625 1.1 skrll /* The first entry must be unused because an `rlx_more' value of zero ends 1626 1.1 skrll each list. */ 1627 1.1 skrll {1, 1, 0, 0}, 1628 1.1 skrll 1629 1.1 skrll /* The displacement used by GAS is from the end of the 2 byte insn, 1630 1.1 skrll so we subtract 2 from the following. */ 1631 1.1 skrll /* 16 bit insn, 8 bit disp -> 10 bit range. 1632 1.1 skrll This doesn't handle a branch in the right slot at the border: 1633 1.1 skrll the "& -4" isn't taken into account. It's not important enough to 1634 1.1 skrll complicate things over it, so we subtract an extra 2 (or + 2 in -ve 1635 1.1 skrll case). */ 1636 1.1 skrll {511 - 2 - 2, -512 - 2 + 2, 0, 2 }, 1637 1.1 skrll /* 32 bit insn, 24 bit disp -> 26 bit range. */ 1638 1.1 skrll {0x2000000 - 1 - 2, -0x2000000 - 2, 2, 0 }, 1639 1.1 skrll /* Same thing, but with leading nop for alignment. */ 1640 1.1 skrll {0x2000000 - 1 - 2, -0x2000000 - 2, 4, 0 } 1641 1.1 skrll }; 1642 1.1 skrll 1643 1.1 skrll long 1644 1.1 skrll m32r_relax_frag (segT segment, fragS *fragP, long stretch) 1645 1.1 skrll { 1646 1.1 skrll /* Address of branch insn. */ 1647 1.1 skrll long address = fragP->fr_address + fragP->fr_fix - 2; 1648 1.1 skrll long growth = 0; 1649 1.1 skrll 1650 1.1 skrll /* Keep 32 bit insns aligned on 32 bit boundaries. */ 1651 1.1 skrll if (fragP->fr_subtype == 2) 1652 1.1 skrll { 1653 1.1 skrll if ((address & 3) != 0) 1654 1.1 skrll { 1655 1.1 skrll fragP->fr_subtype = 3; 1656 1.1 skrll growth = 2; 1657 1.1 skrll } 1658 1.1 skrll } 1659 1.1 skrll else if (fragP->fr_subtype == 3) 1660 1.1 skrll { 1661 1.1 skrll if ((address & 3) == 0) 1662 1.1 skrll { 1663 1.1 skrll fragP->fr_subtype = 2; 1664 1.1 skrll growth = -2; 1665 1.1 skrll } 1666 1.1 skrll } 1667 1.1 skrll else 1668 1.1 skrll { 1669 1.1 skrll growth = relax_frag (segment, fragP, stretch); 1670 1.1 skrll 1671 1.1 skrll /* Long jump on odd halfword boundary? */ 1672 1.1 skrll if (fragP->fr_subtype == 2 && (address & 3) != 0) 1673 1.1 skrll { 1674 1.1 skrll fragP->fr_subtype = 3; 1675 1.1 skrll growth += 2; 1676 1.1 skrll } 1677 1.1 skrll } 1678 1.1 skrll 1679 1.1 skrll return growth; 1680 1.1 skrll } 1681 1.1 skrll 1682 1.1 skrll /* Return an initial guess of the length by which a fragment must grow to 1683 1.1 skrll hold a branch to reach its destination. 1684 1.1 skrll Also updates fr_type/fr_subtype as necessary. 1685 1.1 skrll 1686 1.1 skrll Called just before doing relaxation. 1687 1.1 skrll Any symbol that is now undefined will not become defined. 1688 1.1 skrll The guess for fr_var is ACTUALLY the growth beyond fr_fix. 1689 1.1 skrll Whatever we do to grow fr_fix or fr_var contributes to our returned value. 1690 1.1 skrll Although it may not be explicit in the frag, pretend fr_var starts 1691 1.1 skrll with a 0 value. */ 1692 1.1 skrll 1693 1.1 skrll int 1694 1.1 skrll md_estimate_size_before_relax (fragS *fragP, segT segment) 1695 1.1 skrll { 1696 1.1 skrll /* The only thing we have to handle here are symbols outside of the 1697 1.1 skrll current segment. They may be undefined or in a different segment in 1698 1.1 skrll which case linker scripts may place them anywhere. 1699 1.1 skrll However, we can't finish the fragment here and emit the reloc as insn 1700 1.1 skrll alignment requirements may move the insn about. */ 1701 1.1 skrll if (S_GET_SEGMENT (fragP->fr_symbol) != segment 1702 1.1 skrll || S_IS_EXTERNAL (fragP->fr_symbol) 1703 1.1 skrll || S_IS_WEAK (fragP->fr_symbol)) 1704 1.1 skrll { 1705 1.1 skrll /* The symbol is undefined in this segment. 1706 1.1 skrll Change the relaxation subtype to the max allowable and leave 1707 1.1 skrll all further handling to md_convert_frag. */ 1708 1.1 skrll fragP->fr_subtype = 2; 1709 1.1 skrll 1710 1.1 skrll { 1711 1.1 skrll const CGEN_INSN *insn; 1712 1.1 skrll int i; 1713 1.1 skrll 1714 1.1 skrll /* Update the recorded insn. 1715 1.1 skrll Fortunately we don't have to look very far. 1716 1.1 skrll FIXME: Change this to record in the instruction the next higher 1717 1.1 skrll relaxable insn to use. */ 1718 1.1 skrll for (i = 0, insn = fragP->fr_cgen.insn; i < 4; i++, insn++) 1719 1.1 skrll { 1720 1.1 skrll if ((strcmp (CGEN_INSN_MNEMONIC (insn), 1721 1.1 skrll CGEN_INSN_MNEMONIC (fragP->fr_cgen.insn)) 1722 1.1 skrll == 0) 1723 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_RELAXED)) 1724 1.1 skrll break; 1725 1.1 skrll } 1726 1.1 skrll if (i == 4) 1727 1.1 skrll abort (); 1728 1.1 skrll 1729 1.1 skrll fragP->fr_cgen.insn = insn; 1730 1.1 skrll return 2; 1731 1.1 skrll } 1732 1.1 skrll } 1733 1.1 skrll 1734 1.1 skrll return md_relax_table[fragP->fr_subtype].rlx_length; 1735 1.1 skrll } 1736 1.1 skrll 1737 1.1 skrll /* *FRAGP has been relaxed to its final size, and now needs to have 1738 1.1 skrll the bytes inside it modified to conform to the new size. 1739 1.1 skrll 1740 1.1 skrll Called after relaxation is finished. 1741 1.1 skrll fragP->fr_type == rs_machine_dependent. 1742 1.1 skrll fragP->fr_subtype is the subtype of what the address relaxed to. */ 1743 1.1 skrll 1744 1.1 skrll void 1745 1.1 skrll md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, 1746 1.1 skrll segT sec, 1747 1.1 skrll fragS *fragP) 1748 1.1 skrll { 1749 1.1 skrll char *opcode; 1750 1.1 skrll char *displacement; 1751 1.1 skrll int target_address; 1752 1.1 skrll int opcode_address; 1753 1.1 skrll int extension; 1754 1.1 skrll int addend; 1755 1.1 skrll 1756 1.1 skrll opcode = fragP->fr_opcode; 1757 1.1 skrll 1758 1.1 skrll /* Address opcode resides at in file space. */ 1759 1.1 skrll opcode_address = fragP->fr_address + fragP->fr_fix - 2; 1760 1.1 skrll 1761 1.1 skrll switch (fragP->fr_subtype) 1762 1.1 skrll { 1763 1.1 skrll case 1: 1764 1.1 skrll extension = 0; 1765 1.1 skrll displacement = &opcode[1]; 1766 1.1 skrll break; 1767 1.1 skrll case 2: 1768 1.1 skrll opcode[0] |= 0x80; 1769 1.1 skrll extension = 2; 1770 1.1 skrll displacement = &opcode[1]; 1771 1.1 skrll break; 1772 1.1 skrll case 3: 1773 1.1 skrll opcode[2] = opcode[0] | 0x80; 1774 1.1 skrll md_number_to_chars (opcode, PAR_NOP_INSN, 2); 1775 1.1 skrll opcode_address += 2; 1776 1.1 skrll extension = 4; 1777 1.1 skrll displacement = &opcode[3]; 1778 1.1 skrll break; 1779 1.1 skrll default: 1780 1.1 skrll abort (); 1781 1.1 skrll } 1782 1.1 skrll 1783 1.1 skrll if (S_GET_SEGMENT (fragP->fr_symbol) != sec 1784 1.1 skrll || S_IS_EXTERNAL (fragP->fr_symbol) 1785 1.1 skrll || S_IS_WEAK (fragP->fr_symbol)) 1786 1.1 skrll { 1787 1.1 skrll /* Symbol must be resolved by linker. */ 1788 1.1 skrll if (fragP->fr_offset & 3) 1789 1.1 skrll as_warn (_("Addend to unresolved symbol not on word boundary.")); 1790 1.1 skrll #ifdef USE_M32R_OLD_RELOC 1791 1.1 skrll addend = fragP->fr_offset >> 2; /* Old M32R used USE_REL. */ 1792 1.1 skrll #else 1793 1.1 skrll addend = 0; 1794 1.1 skrll #endif 1795 1.1 skrll } 1796 1.1 skrll else 1797 1.1 skrll { 1798 1.1 skrll /* Address we want to reach in file space. */ 1799 1.1 skrll target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset; 1800 1.1 skrll addend = (target_address - (opcode_address & -4)) >> 2; 1801 1.1 skrll } 1802 1.1 skrll 1803 1.1 skrll /* Create a relocation for symbols that must be resolved by the linker. 1804 1.1 skrll Otherwise output the completed insn. */ 1805 1.1 skrll 1806 1.1 skrll if (S_GET_SEGMENT (fragP->fr_symbol) != sec 1807 1.1.1.2 christos || S_IS_EXTERNAL (fragP->fr_symbol) 1808 1.1.1.2 christos || S_IS_WEAK (fragP->fr_symbol)) 1809 1.1 skrll { 1810 1.1 skrll fixS *fixP; 1811 1.1 skrll 1812 1.1 skrll gas_assert (fragP->fr_subtype != 1); 1813 1.1 skrll gas_assert (fragP->fr_cgen.insn != 0); 1814 1.1 skrll 1815 1.1 skrll fixP = gas_cgen_record_fixup (fragP, 1816 1.1 skrll /* Offset of branch insn in frag. */ 1817 1.1 skrll fragP->fr_fix + extension - 4, 1818 1.1 skrll fragP->fr_cgen.insn, 1819 1.1 skrll 4 /* Length. */, 1820 1.1 skrll /* FIXME: quick hack. */ 1821 1.1 skrll cgen_operand_lookup_by_num (gas_cgen_cpu_desc, 1822 1.1 skrll M32R_OPERAND_DISP24), 1823 1.1 skrll fragP->fr_cgen.opinfo, 1824 1.1 skrll fragP->fr_symbol, fragP->fr_offset); 1825 1.1 skrll if (fragP->fr_cgen.opinfo) 1826 1.1 skrll fixP->fx_r_type = fragP->fr_cgen.opinfo; 1827 1.1 skrll } 1828 1.1 skrll 1829 1.1 skrll #define SIZE_FROM_RELAX_STATE(n) ((n) == 1 ? 1 : 3) 1830 1.1 skrll 1831 1.1 skrll md_number_to_chars (displacement, (valueT) addend, 1832 1.1 skrll SIZE_FROM_RELAX_STATE (fragP->fr_subtype)); 1833 1.1 skrll 1834 1.1 skrll fragP->fr_fix += extension; 1835 1.1 skrll } 1836 1.1 skrll 1837 1.1 skrll /* Functions concerning relocs. */ 1839 1.1 skrll 1840 1.1.1.10 christos /* The location from which a PC relative jump should be calculated, 1841 1.1 skrll given a PC relative reloc. */ 1842 1.1 skrll 1843 1.1 skrll long 1844 1.1 skrll md_pcrel_from_section (fixS *fixP, segT sec) 1845 1.1 skrll { 1846 1.1 skrll if (fixP->fx_addsy != NULL 1847 1.1 skrll && (! S_IS_DEFINED (fixP->fx_addsy) 1848 1.1 skrll || S_GET_SEGMENT (fixP->fx_addsy) != sec 1849 1.1 skrll || S_IS_EXTERNAL (fixP->fx_addsy) 1850 1.1 skrll || S_IS_WEAK (fixP->fx_addsy))) 1851 1.1 skrll { 1852 1.1 skrll if (S_GET_SEGMENT (fixP->fx_addsy) != sec 1853 1.1 skrll && S_IS_DEFINED (fixP->fx_addsy) 1854 1.1 skrll && ! S_IS_EXTERNAL (fixP->fx_addsy) 1855 1.1 skrll && ! S_IS_WEAK (fixP->fx_addsy)) 1856 1.1 skrll return fixP->fx_offset; 1857 1.1 skrll 1858 1.1 skrll /* The symbol is undefined (or is defined but not in this section). 1859 1.1 skrll Let the linker figure it out. */ 1860 1.1 skrll return 0; 1861 1.1 skrll } 1862 1.1 skrll 1863 1.1 skrll return (fixP->fx_frag->fr_address + fixP->fx_where) & -4L; 1864 1.1 skrll } 1865 1.1 skrll 1866 1.1 skrll /* Return the bfd reloc type for OPERAND of INSN at fixup FIXP. 1867 1.1 skrll Returns BFD_RELOC_NONE if no reloc type can be found. 1868 1.1 skrll *FIXP may be modified if desired. */ 1869 1.1 skrll 1870 1.1 skrll bfd_reloc_code_real_type 1871 1.1 skrll md_cgen_lookup_reloc (const CGEN_INSN *insn ATTRIBUTE_UNUSED, 1872 1.1 skrll const CGEN_OPERAND *operand, 1873 1.1 skrll fixS *fixP) 1874 1.1 skrll { 1875 1.1 skrll switch (operand->type) 1876 1.1 skrll { 1877 1.1 skrll case M32R_OPERAND_DISP8: return BFD_RELOC_M32R_10_PCREL; 1878 1.1 skrll case M32R_OPERAND_DISP16: return BFD_RELOC_M32R_18_PCREL; 1879 1.1 skrll case M32R_OPERAND_DISP24: return BFD_RELOC_M32R_26_PCREL; 1880 1.1 skrll case M32R_OPERAND_UIMM24: return BFD_RELOC_M32R_24; 1881 1.1 skrll case M32R_OPERAND_HI16: 1882 1.1 skrll case M32R_OPERAND_SLO16: 1883 1.1 skrll case M32R_OPERAND_ULO16: 1884 1.1 skrll /* If low/high/shigh/sda was used, it is recorded in `opinfo'. */ 1885 1.1 skrll if (fixP->fx_cgen.opinfo != 0) 1886 1.1 skrll return fixP->fx_cgen.opinfo; 1887 1.1 skrll break; 1888 1.1 skrll default: 1889 1.1 skrll /* Avoid -Wall warning. */ 1890 1.1 skrll break; 1891 1.1 skrll } 1892 1.1 skrll return BFD_RELOC_NONE; 1893 1.1 skrll } 1894 1.1 skrll 1895 1.1 skrll /* Record a HI16 reloc for later matching with its LO16 cousin. */ 1896 1.1 skrll 1897 1.1 skrll static void 1898 1.1.1.2 christos m32r_record_hi16 (int reloc_type, 1899 1.1 skrll fixS *fixP, 1900 1.1 skrll segT seg ATTRIBUTE_UNUSED) 1901 1.1.1.5 christos { 1902 1.1 skrll struct m32r_hi_fixup *hi_fixup; 1903 1.1 skrll 1904 1.1 skrll gas_assert (reloc_type == BFD_RELOC_M32R_HI16_SLO 1905 1.1 skrll || reloc_type == BFD_RELOC_M32R_HI16_ULO); 1906 1.1 skrll 1907 1.1 skrll hi_fixup = XNEW (struct m32r_hi_fixup); 1908 1.1 skrll hi_fixup->fixp = fixP; 1909 1.1 skrll hi_fixup->seg = now_seg; 1910 1.1 skrll hi_fixup->next = m32r_hi_fixup_list; 1911 1.1 skrll 1912 1.1 skrll m32r_hi_fixup_list = hi_fixup; 1913 1.1 skrll } 1914 1.1 skrll 1915 1.1 skrll /* Called while parsing an instruction to create a fixup. 1916 1.1 skrll We need to check for HI16 relocs and queue them up for later sorting. */ 1917 1.1 skrll 1918 1.1 skrll fixS * 1919 1.1 skrll m32r_cgen_record_fixup_exp (fragS *frag, 1920 1.1 skrll int where, 1921 1.1 skrll const CGEN_INSN *insn, 1922 1.1 skrll int length, 1923 1.1 skrll const CGEN_OPERAND *operand, 1924 1.1 skrll int opinfo, 1925 1.1 skrll expressionS *exp) 1926 1.1 skrll { 1927 1.1 skrll fixS *fixP; 1928 1.1 skrll bfd_reloc_code_real_type r_type = BFD_RELOC_UNUSED; 1929 1.1 skrll 1930 1.1 skrll if (m32r_check_fixup (exp, &r_type)) 1931 1.1 skrll as_bad (_("Invalid PIC expression.")); 1932 1.1 skrll 1933 1.1 skrll fixP = gas_cgen_record_fixup_exp (frag, where, insn, length, 1934 1.1 skrll operand, opinfo, exp); 1935 1.1 skrll 1936 1.1 skrll switch (operand->type) 1937 1.1 skrll { 1938 1.1 skrll case M32R_OPERAND_HI16: 1939 1.1 skrll /* If low/high/shigh/sda was used, it is recorded in `opinfo'. */ 1940 1.1 skrll if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_SLO 1941 1.1 skrll || fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO) 1942 1.1 skrll m32r_record_hi16 (fixP->fx_cgen.opinfo, fixP, now_seg); 1943 1.1 skrll break; 1944 1.1 skrll 1945 1.1 skrll default: 1946 1.1 skrll /* Avoid -Wall warning. */ 1947 1.1 skrll break; 1948 1.1 skrll } 1949 1.1 skrll 1950 1.1 skrll switch (r_type) 1951 1.1 skrll { 1952 1.1 skrll case BFD_RELOC_UNUSED: 1953 1.1 skrll default: 1954 1.1 skrll return fixP; 1955 1.1 skrll 1956 1.1 skrll case BFD_RELOC_M32R_GOTPC24: 1957 1.1 skrll if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_SLO) 1958 1.1 skrll r_type = BFD_RELOC_M32R_GOTPC_HI_SLO; 1959 1.1 skrll else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO) 1960 1.1 skrll r_type = BFD_RELOC_M32R_GOTPC_HI_ULO; 1961 1.1 skrll else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_LO16) 1962 1.1 skrll r_type = BFD_RELOC_M32R_GOTPC_LO; 1963 1.1 skrll break; 1964 1.1 skrll 1965 1.1 skrll case BFD_RELOC_M32R_GOT24: 1966 1.1 skrll if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_SLO) 1967 1.1 skrll r_type = BFD_RELOC_M32R_GOT16_HI_SLO; 1968 1.1 skrll else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO) 1969 1.1 skrll r_type = BFD_RELOC_M32R_GOT16_HI_ULO; 1970 1.1 skrll else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_LO16) 1971 1.1 skrll r_type = BFD_RELOC_M32R_GOT16_LO; 1972 1.1 skrll break; 1973 1.1 skrll 1974 1.1 skrll case BFD_RELOC_M32R_GOTOFF: 1975 1.1 skrll if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_SLO) 1976 1.1 skrll r_type = BFD_RELOC_M32R_GOTOFF_HI_SLO; 1977 1.1 skrll else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO) 1978 1.1 skrll r_type = BFD_RELOC_M32R_GOTOFF_HI_ULO; 1979 1.1 skrll else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_LO16) 1980 1.1 skrll r_type = BFD_RELOC_M32R_GOTOFF_LO; 1981 1.1 skrll break; 1982 1.1 skrll 1983 1.1 skrll case BFD_RELOC_M32R_26_PLTREL: 1984 1.1 skrll as_bad (_("Invalid PIC expression.")); 1985 1.1 skrll break; 1986 1.1 skrll } 1987 1.1 skrll 1988 1.1 skrll fixP->fx_r_type = r_type; 1989 1.1 skrll 1990 1.1 skrll return fixP; 1991 1.1 skrll } 1992 1.1 skrll 1993 1.1 skrll /* Return BFD reloc type from opinfo field in a fixS. 1994 1.1 skrll It's tricky using fx_r_type in m32r_frob_file because the values 1995 1.1 skrll are BFD_RELOC_UNUSED + operand number. */ 1996 1.1 skrll #define FX_OPINFO_R_TYPE(f) ((f)->fx_cgen.opinfo) 1997 1.1 skrll 1998 1.1 skrll /* Sort any unmatched HI16 relocs so that they immediately precede 1999 1.1 skrll the corresponding LO16 reloc. This is called before md_apply_fix and 2000 1.1 skrll tc_gen_reloc. */ 2001 1.1 skrll 2002 1.1 skrll void 2003 1.1 skrll m32r_frob_file (void) 2004 1.1 skrll { 2005 1.1 skrll struct m32r_hi_fixup *l; 2006 1.1.1.2 christos 2007 1.1 skrll for (l = m32r_hi_fixup_list; l != NULL; l = l->next) 2008 1.1 skrll { 2009 1.1 skrll segment_info_type *seginfo; 2010 1.1 skrll int pass; 2011 1.1 skrll 2012 1.1 skrll gas_assert (FX_OPINFO_R_TYPE (l->fixp) == BFD_RELOC_M32R_HI16_SLO 2013 1.1 skrll || FX_OPINFO_R_TYPE (l->fixp) == BFD_RELOC_M32R_HI16_ULO); 2014 1.1 skrll 2015 1.1 skrll /* Check quickly whether the next fixup happens to be a matching low. */ 2016 1.1 skrll if (l->fixp->fx_next != NULL 2017 1.1 skrll && FX_OPINFO_R_TYPE (l->fixp->fx_next) == BFD_RELOC_M32R_LO16 2018 1.1 skrll && l->fixp->fx_addsy == l->fixp->fx_next->fx_addsy 2019 1.1 skrll && l->fixp->fx_offset == l->fixp->fx_next->fx_offset) 2020 1.1 skrll continue; 2021 1.1 skrll 2022 1.1 skrll /* Look through the fixups for this segment for a matching `low'. 2023 1.1 skrll When we find one, move the high/shigh just in front of it. We do 2024 1.1 skrll this in two passes. In the first pass, we try to find a 2025 1.1 skrll unique `low'. In the second pass, we permit multiple high's 2026 1.1 skrll relocs for a single `low'. */ 2027 1.1 skrll seginfo = seg_info (l->seg); 2028 1.1 skrll for (pass = 0; pass < 2; pass++) 2029 1.1 skrll { 2030 1.1 skrll fixS *f; 2031 1.1 skrll fixS *prev; 2032 1.1 skrll 2033 1.1 skrll prev = NULL; 2034 1.1 skrll for (f = seginfo->fix_root; f != NULL; f = f->fx_next) 2035 1.1 skrll { 2036 1.1 skrll /* Check whether this is a `low' fixup which matches l->fixp. */ 2037 1.1 skrll if (FX_OPINFO_R_TYPE (f) == BFD_RELOC_M32R_LO16 2038 1.1 skrll && f->fx_addsy == l->fixp->fx_addsy 2039 1.1 skrll && f->fx_offset == l->fixp->fx_offset 2040 1.1 skrll && (pass == 1 2041 1.1 skrll || prev == NULL 2042 1.1 skrll || (FX_OPINFO_R_TYPE (prev) != BFD_RELOC_M32R_HI16_SLO 2043 1.1 skrll && FX_OPINFO_R_TYPE (prev) != BFD_RELOC_M32R_HI16_ULO) 2044 1.1 skrll || prev->fx_addsy != f->fx_addsy 2045 1.1 skrll || prev->fx_offset != f->fx_offset)) 2046 1.1 skrll { 2047 1.1.1.2 christos fixS **pf; 2048 1.1 skrll 2049 1.1 skrll /* Move l->fixp before f. */ 2050 1.1 skrll for (pf = &seginfo->fix_root; 2051 1.1 skrll *pf != l->fixp; 2052 1.1 skrll pf = & (*pf)->fx_next) 2053 1.1 skrll gas_assert (*pf != NULL); 2054 1.1 skrll 2055 1.1 skrll *pf = l->fixp->fx_next; 2056 1.1 skrll 2057 1.1 skrll l->fixp->fx_next = f; 2058 1.1 skrll if (prev == NULL) 2059 1.1 skrll seginfo->fix_root = l->fixp; 2060 1.1 skrll else 2061 1.1 skrll prev->fx_next = l->fixp; 2062 1.1 skrll 2063 1.1 skrll break; 2064 1.1 skrll } 2065 1.1 skrll 2066 1.1 skrll prev = f; 2067 1.1 skrll } 2068 1.1 skrll 2069 1.1 skrll if (f != NULL) 2070 1.1 skrll break; 2071 1.1 skrll 2072 1.1 skrll if (pass == 1 2073 1.1 skrll && warn_unmatched_high) 2074 1.1 skrll as_warn_where (l->fixp->fx_file, l->fixp->fx_line, 2075 1.1 skrll _("Unmatched high/shigh reloc")); 2076 1.1 skrll } 2077 1.1 skrll } 2078 1.1 skrll } 2079 1.1 skrll 2080 1.1 skrll /* See whether we need to force a relocation into the output file. 2081 1.1 skrll This is used to force out switch and PC relative relocations when 2082 1.1 skrll relaxing. */ 2083 1.1 skrll 2084 1.1 skrll int 2085 1.1 skrll m32r_force_relocation (fixS *fix) 2086 1.1 skrll { 2087 1.1 skrll if (generic_force_reloc (fix)) 2088 1.1 skrll return 1; 2089 1.1 skrll 2090 1.1 skrll if (! m32r_relax) 2091 1.1 skrll return 0; 2092 1.1 skrll 2093 1.1 skrll return fix->fx_pcrel; 2094 1.1 skrll } 2095 1.1 skrll 2096 1.1 skrll /* Write a value out to the object file, using the appropriate endianness. */ 2098 1.1 skrll 2099 1.1 skrll void 2100 1.1 skrll md_number_to_chars (char *buf, valueT val, int n) 2101 1.1 skrll { 2102 1.1 skrll if (target_big_endian) 2103 1.1 skrll number_to_chars_bigendian (buf, val, n); 2104 1.1 skrll else 2105 1.1 skrll number_to_chars_littleendian (buf, val, n); 2106 1.1.1.5 christos } 2107 1.1 skrll 2108 1.1 skrll /* Turn a string in input_line_pointer into a floating point constant 2109 1.1 skrll of type TYPE, and store the appropriate bytes in *LITP. The number 2110 1.1 skrll of LITTLENUMS emitted is stored in *SIZEP. An error message is 2111 1.1 skrll returned, or NULL on OK. */ 2112 1.1 skrll 2113 1.1 skrll const char * 2114 1.1 skrll md_atof (int type, char *litP, int *sizeP) 2115 1.1 skrll { 2116 1.1 skrll return ieee_md_atof (type, litP, sizeP, target_big_endian); 2117 1.1 skrll } 2118 1.1 skrll 2119 1.1 skrll void 2120 1.1 skrll m32r_elf_section_change_hook (void) 2121 1.1 skrll { 2122 1.1 skrll /* If we have reached the end of a section and we have just emitted a 2123 1.1 skrll 16 bit insn, then emit a nop to make sure that the section ends on 2124 1.1 skrll a 32 bit boundary. */ 2125 1.1 skrll 2126 1.1.1.8 christos if (prev_insn.insn || seen_relaxable_p) 2127 1.1 skrll (void) m32r_fill_insn (0); 2128 1.1 skrll } 2129 1.1 skrll 2130 1.1 skrll /* Return true if can adjust the reloc to be relative to its section 2131 1.1.1.10 christos (such as .data) instead of relative to some symbol. */ 2132 1.1 skrll 2133 1.1 skrll bool 2134 1.1.1.10 christos m32r_fix_adjustable (fixS *fixP) 2135 1.1 skrll { 2136 1.1 skrll bfd_reloc_code_real_type reloc_type; 2137 1.1 skrll 2138 1.1 skrll if (fixP->fx_r_type >= BFD_RELOC_UNUSED) 2139 1.1 skrll { 2140 1.1 skrll const CGEN_INSN *insn = NULL; 2141 1.1 skrll int opindex = fixP->fx_r_type - BFD_RELOC_UNUSED; 2142 1.1 skrll const CGEN_OPERAND *operand = 2143 1.1 skrll cgen_operand_lookup_by_num(gas_cgen_cpu_desc, opindex); 2144 1.1 skrll 2145 1.1 skrll reloc_type = md_cgen_lookup_reloc (insn, operand, fixP); 2146 1.1 skrll } 2147 1.1 skrll else 2148 1.1 skrll reloc_type = fixP->fx_r_type; 2149 1.1 skrll 2150 1.1 skrll if (fixP->fx_addsy == NULL) 2151 1.1 skrll return 1; 2152 1.1 skrll 2153 1.1 skrll /* Prevent all adjustments to global symbols. */ 2154 1.1 skrll if (S_IS_EXTERNAL (fixP->fx_addsy)) 2155 1.1 skrll return 0; 2156 1.1 skrll if (S_IS_WEAK (fixP->fx_addsy)) 2157 1.1 skrll return 0; 2158 1.1 skrll 2159 1.1 skrll if (pic_code 2160 1.1 skrll && (reloc_type == BFD_RELOC_M32R_24 2161 1.1 skrll || reloc_type == BFD_RELOC_M32R_26_PCREL 2162 1.1 skrll || reloc_type == BFD_RELOC_M32R_HI16_SLO 2163 1.1 skrll || reloc_type == BFD_RELOC_M32R_HI16_ULO 2164 1.1 skrll || reloc_type == BFD_RELOC_M32R_LO16)) 2165 1.1 skrll return 0; 2166 1.1 skrll 2167 1.1 skrll if (reloc_type == BFD_RELOC_M32R_GOT24 2168 1.1 skrll || reloc_type == BFD_RELOC_M32R_26_PLTREL 2169 1.1 skrll || reloc_type == BFD_RELOC_M32R_GOTPC_HI_SLO 2170 1.1 skrll || reloc_type == BFD_RELOC_M32R_GOTPC_HI_ULO 2171 1.1 skrll || reloc_type == BFD_RELOC_M32R_GOTPC_LO 2172 1.1 skrll || reloc_type == BFD_RELOC_M32R_GOT16_HI_SLO 2173 1.1 skrll || reloc_type == BFD_RELOC_M32R_GOT16_HI_ULO 2174 1.1 skrll || reloc_type == BFD_RELOC_M32R_GOT16_LO) 2175 1.1 skrll return 0; 2176 1.1 skrll 2177 1.1 skrll /* We need the symbol name for the VTABLE entries. */ 2178 1.1 skrll if (reloc_type == BFD_RELOC_VTABLE_INHERIT 2179 1.1 skrll || reloc_type == BFD_RELOC_VTABLE_ENTRY) 2180 1.1 skrll return 0; 2181 1.1 skrll 2182 1.1 skrll return 1; 2183 1.1 skrll } 2184 1.1 skrll 2185 1.1 skrll void 2186 1.1 skrll m32r_elf_final_processing (void) 2187 1.1 skrll { 2188 1.1 skrll if (use_parallel) 2189 1.1 skrll m32r_flags |= E_M32R_HAS_PARALLEL; 2190 1.1 skrll elf_elfheader (stdoutput)->e_flags |= m32r_flags; 2191 1.1 skrll } 2192 1.1 skrll 2193 1.1 skrll /* Translate internal representation of relocation info to BFD target 2194 1.1.1.4 christos format. */ 2195 1.1.1.10 christos 2196 1.1.1.10 christos arelent * 2197 1.1 skrll tc_gen_reloc (asection * section, fixS * fixP) 2198 1.1 skrll { 2199 1.1 skrll arelent * reloc; 2200 1.1 skrll bfd_reloc_code_real_type code; 2201 1.1 skrll 2202 1.1 skrll reloc = notes_alloc (sizeof (arelent)); 2203 1.1 skrll reloc->sym_ptr_ptr = notes_alloc (sizeof (asymbol *)); 2204 1.1 skrll *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy); 2205 1.1 skrll reloc->address = fixP->fx_frag->fr_address + fixP->fx_where; 2206 1.1 skrll 2207 1.1 skrll if (fixP->fx_pcrel) 2208 1.1 skrll { 2209 1.1 skrll if (fixP->fx_r_type == BFD_RELOC_32) 2210 1.1.1.4 christos fixP->fx_r_type = BFD_RELOC_32_PCREL; 2211 1.1 skrll else if (fixP->fx_r_type == BFD_RELOC_16) 2212 1.1 skrll { 2213 1.1 skrll fixP->fx_r_type = BFD_RELOC_16_PCREL; 2214 1.1 skrll bfd_set_error (bfd_error_bad_value); 2215 1.1 skrll } 2216 1.1 skrll } 2217 1.1 skrll 2218 1.1 skrll code = fixP->fx_r_type; 2219 1.1 skrll if (pic_code) 2220 1.1 skrll { 2221 1.1 skrll #ifdef DEBUG_PIC 2222 1.1 skrll printf("%s",bfd_get_reloc_code_name(code)); 2223 1.1 skrll #endif 2224 1.1 skrll switch (code) 2225 1.1 skrll { 2226 1.1 skrll case BFD_RELOC_M32R_26_PCREL: 2227 1.1 skrll code = BFD_RELOC_M32R_26_PLTREL; 2228 1.1 skrll break; 2229 1.1 skrll 2230 1.1 skrll case BFD_RELOC_M32R_24: 2231 1.1 skrll if (fixP->fx_addsy != NULL 2232 1.1 skrll && strcmp (S_GET_NAME (fixP->fx_addsy), GOT_NAME) == 0) 2233 1.1 skrll code = BFD_RELOC_M32R_GOTPC24; 2234 1.1 skrll else 2235 1.1 skrll code = BFD_RELOC_M32R_GOT24; 2236 1.1 skrll break; 2237 1.1 skrll 2238 1.1 skrll case BFD_RELOC_M32R_HI16_ULO: 2239 1.1 skrll if (fixP->fx_addsy != NULL 2240 1.1 skrll && strcmp (S_GET_NAME (fixP->fx_addsy), GOT_NAME) == 0) 2241 1.1 skrll code = BFD_RELOC_M32R_GOTPC_HI_ULO; 2242 1.1 skrll else 2243 1.1 skrll code = BFD_RELOC_M32R_GOT16_HI_ULO; 2244 1.1 skrll break; 2245 1.1 skrll 2246 1.1 skrll case BFD_RELOC_M32R_HI16_SLO: 2247 1.1 skrll if (fixP->fx_addsy != NULL 2248 1.1 skrll && strcmp (S_GET_NAME (fixP->fx_addsy), GOT_NAME) == 0) 2249 1.1 skrll code = BFD_RELOC_M32R_GOTPC_HI_SLO; 2250 1.1 skrll else 2251 1.1 skrll code = BFD_RELOC_M32R_GOT16_HI_SLO; 2252 1.1 skrll break; 2253 1.1 skrll 2254 1.1 skrll case BFD_RELOC_M32R_LO16: 2255 1.1 skrll if (fixP->fx_addsy != NULL 2256 1.1 skrll && strcmp (S_GET_NAME (fixP->fx_addsy), GOT_NAME) == 0) 2257 1.1 skrll code = BFD_RELOC_M32R_GOTPC_LO; 2258 1.1 skrll else 2259 1.1 skrll code = BFD_RELOC_M32R_GOT16_LO; 2260 1.1 skrll break; 2261 1.1 skrll 2262 1.1.1.4 christos default: 2263 1.1 skrll break; 2264 1.1 skrll } 2265 1.1 skrll #ifdef DEBUG_PIC 2266 1.1 skrll printf(" => %s",bfd_get_reloc_code_name(code)); 2267 1.1 skrll #endif 2268 1.1 skrll } 2269 1.1.1.10 christos 2270 1.1 skrll reloc->howto = bfd_reloc_type_lookup (stdoutput, code); 2271 1.1 skrll 2272 1.1 skrll #ifdef DEBUG_PIC 2273 1.1 skrll printf(" => %s\n",reloc->howto->name); 2274 1.1 skrll #endif 2275 1.1 skrll 2276 1.1.1.4 christos if (reloc->howto == NULL) 2277 1.1 skrll { 2278 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line, 2279 1.1 skrll _("internal error: can't export reloc type %d (`%s')"), 2280 1.1 skrll fixP->fx_r_type, bfd_get_reloc_code_name (code)); 2281 1.1 skrll return NULL; 2282 1.1 skrll } 2283 1.1 skrll 2284 1.1 skrll /* Use fx_offset for these cases. */ 2285 1.1 skrll if ( fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY 2286 1.1 skrll || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT 2287 1.1 skrll || fixP->fx_r_type == BFD_RELOC_32_PCREL) 2288 1.1 skrll reloc->addend = fixP->fx_offset; 2289 1.1 skrll else if ((!pic_code 2290 1.1.1.6 christos && code != BFD_RELOC_M32R_26_PLTREL) 2291 1.1 skrll && fixP->fx_pcrel 2292 1.1 skrll && fixP->fx_addsy != NULL 2293 1.1 skrll && (S_GET_SEGMENT(fixP->fx_addsy) != section) 2294 1.1.1.4 christos && S_IS_DEFINED (fixP->fx_addsy) 2295 1.1 skrll && ! S_IS_EXTERNAL(fixP->fx_addsy) 2296 1.1 skrll && ! S_IS_WEAK(fixP->fx_addsy)) 2297 1.1 skrll /* Already used fx_offset in the opcode field itself. */ 2298 1.1 skrll reloc->addend = fixP->fx_offset; 2299 1.1.1.5 christos else 2300 1.1 skrll reloc->addend = fixP->fx_addnumber; 2301 1.1 skrll 2302 1.1 skrll return reloc; 2303 1.1 skrll } 2304 1.1 skrll 2305 1.1 skrll inline static char * 2306 1.1 skrll m32r_end_of_match (char *cont, const char *what) 2307 1.1 skrll { 2308 1.1 skrll int len = strlen (what); 2309 1.1 skrll 2310 1.1 skrll if (strncasecmp (cont, what, strlen (what)) == 0 2311 1.1 skrll && ! is_part_of_name (cont[len])) 2312 1.1 skrll return cont + len; 2313 1.1 skrll 2314 1.1 skrll return NULL; 2315 1.1 skrll } 2316 1.1 skrll 2317 1.1 skrll int 2318 1.1 skrll m32r_parse_name (char const *name, 2319 1.1 skrll expressionS *exprP, 2320 1.1 skrll enum expr_mode mode, 2321 1.1 skrll char *nextcharP) 2322 1.1 skrll { 2323 1.1 skrll char *next = input_line_pointer; 2324 1.1 skrll char *next_end; 2325 1.1 skrll int reloc_type; 2326 1.1 skrll operatorT op_type; 2327 1.1 skrll segT segment; 2328 1.1 skrll 2329 1.1 skrll exprP->X_op_symbol = NULL; 2330 1.1 skrll exprP->X_md = BFD_RELOC_UNUSED; 2331 1.1 skrll 2332 1.1 skrll if (strcmp (name, GOT_NAME) == 0) 2333 1.1 skrll { 2334 1.1 skrll if (! GOT_symbol) 2335 1.1.1.10 christos GOT_symbol = symbol_find_or_make (name); 2336 1.1 skrll 2337 1.1 skrll exprP->X_add_symbol = GOT_symbol; 2338 1.1 skrll no_suffix: 2339 1.1 skrll /* If we have an absolute symbol or a 2340 1.1 skrll reg, then we know its value now. */ 2341 1.1.1.10 christos segment = S_GET_SEGMENT (exprP->X_add_symbol); 2342 1.1 skrll if (!expr_defer_p (mode) && segment == absolute_section) 2343 1.1 skrll { 2344 1.1 skrll exprP->X_op = O_constant; 2345 1.1 skrll exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol); 2346 1.1 skrll exprP->X_add_symbol = NULL; 2347 1.1 skrll } 2348 1.1 skrll else if (!expr_defer_p (mode) && segment == reg_section) 2349 1.1 skrll { 2350 1.1 skrll exprP->X_op = O_register; 2351 1.1 skrll exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol); 2352 1.1 skrll exprP->X_add_symbol = NULL; 2353 1.1 skrll } 2354 1.1 skrll else 2355 1.1 skrll { 2356 1.1 skrll exprP->X_op = O_symbol; 2357 1.1 skrll exprP->X_add_number = 0; 2358 1.1 skrll } 2359 1.1 skrll 2360 1.1 skrll return 1; 2361 1.1 skrll } 2362 1.1 skrll 2363 1.1 skrll exprP->X_add_symbol = symbol_find_or_make (name); 2364 1.1 skrll 2365 1.1 skrll if (*nextcharP != '@') 2366 1.1 skrll goto no_suffix; 2367 1.1 skrll else if ((next_end = m32r_end_of_match (next + 1, "GOTOFF"))) 2368 1.1 skrll { 2369 1.1 skrll reloc_type = BFD_RELOC_M32R_GOTOFF; 2370 1.1 skrll op_type = O_PIC_reloc; 2371 1.1 skrll } 2372 1.1 skrll else if ((next_end = m32r_end_of_match (next + 1, "GOT"))) 2373 1.1 skrll { 2374 1.1 skrll reloc_type = BFD_RELOC_M32R_GOT24; 2375 1.1 skrll op_type = O_PIC_reloc; 2376 1.1 skrll } 2377 1.1 skrll else if ((next_end = m32r_end_of_match (next + 1, "PLT"))) 2378 1.1 skrll { 2379 1.1 skrll reloc_type = BFD_RELOC_M32R_26_PLTREL; 2380 1.1 skrll op_type = O_PIC_reloc; 2381 1.1 skrll } 2382 1.1 skrll else 2383 1.1 skrll goto no_suffix; 2384 1.1 skrll 2385 1.1 skrll *input_line_pointer = *nextcharP; 2386 1.1 skrll input_line_pointer = next_end; 2387 1.1 skrll *nextcharP = *input_line_pointer; 2388 1.1 skrll *input_line_pointer = '\0'; 2389 1.1 skrll 2390 1.1 skrll exprP->X_op = op_type; 2391 1.1 skrll exprP->X_add_number = 0; 2392 1.1 skrll exprP->X_md = reloc_type; 2393 1.1 skrll 2394 1.1 skrll return 1; 2395 1.1 skrll } 2396 1.1 skrll 2397 1.1 skrll int 2398 1.1 skrll m32r_cgen_parse_fix_exp(int opinfo, expressionS *exp) 2399 1.1 skrll { 2400 1.1 skrll if (exp->X_op == O_PIC_reloc 2401 1.1 skrll && exp->X_md == BFD_RELOC_M32R_26_PLTREL) 2402 { 2403 exp->X_op = O_symbol; 2404 opinfo = exp->X_md; 2405 } 2406 2407 return opinfo; 2408 } 2409