tc-s390.c revision 1.4.8.1 1 1.1 christos /* tc-s390.c -- Assemble for the S390
2 1.4.8.1 pgoyette Copyright (C) 2000-2016 Free Software Foundation, Inc.
3 1.1 christos Contributed by Martin Schwidefsky (schwidefsky (at) de.ibm.com).
4 1.1 christos
5 1.1 christos This file is part of GAS, the GNU Assembler.
6 1.1 christos
7 1.1 christos GAS is free software; you can redistribute it and/or modify
8 1.1 christos it under the terms of the GNU General Public License as published by
9 1.1 christos the Free Software Foundation; either version 3, or (at your option)
10 1.1 christos any later version.
11 1.1 christos
12 1.1 christos GAS is distributed in the hope that it will be useful,
13 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 christos GNU General Public License for more details.
16 1.1 christos
17 1.1 christos You should have received a copy of the GNU General Public License
18 1.1 christos along with GAS; see the file COPYING. If not, write to the Free
19 1.1 christos Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
20 1.1 christos 02110-1301, USA. */
21 1.1 christos
22 1.1 christos #include "as.h"
23 1.1 christos #include "safe-ctype.h"
24 1.1 christos #include "subsegs.h"
25 1.1 christos #include "struc-symbol.h"
26 1.1 christos #include "dwarf2dbg.h"
27 1.1 christos #include "dw2gencfi.h"
28 1.1 christos
29 1.1 christos #include "opcode/s390.h"
30 1.1 christos #include "elf/s390.h"
31 1.1 christos
32 1.1 christos /* The default architecture. */
33 1.1 christos #ifndef DEFAULT_ARCH
34 1.1 christos #define DEFAULT_ARCH "s390"
35 1.1 christos #endif
36 1.4.8.1 pgoyette static const char *default_arch = DEFAULT_ARCH;
37 1.1 christos /* Either 32 or 64, selects file format. */
38 1.1 christos static int s390_arch_size = 0;
39 1.1 christos
40 1.1 christos /* If no -march option was given default to the highest available CPU.
41 1.1 christos Since with S/390 a newer CPU always supports everything from its
42 1.1 christos predecessors this will accept every valid asm input. */
43 1.1 christos static unsigned int current_cpu = S390_OPCODE_MAXCPU - 1;
44 1.1 christos static unsigned int current_mode_mask = 0;
45 1.3 christos static unsigned int current_flags = 0;
46 1.3 christos
47 1.3 christos /* Set to TRUE if the highgprs flag in the ELF header needs to be set
48 1.3 christos for the output file. */
49 1.3 christos static bfd_boolean set_highgprs_p = FALSE;
50 1.1 christos
51 1.1 christos /* Whether to use user friendly register names. Default is TRUE. */
52 1.1 christos #ifndef TARGET_REG_NAMES_P
53 1.1 christos #define TARGET_REG_NAMES_P TRUE
54 1.1 christos #endif
55 1.1 christos
56 1.1 christos static bfd_boolean reg_names_p = TARGET_REG_NAMES_P;
57 1.1 christos
58 1.1 christos /* Set to TRUE if we want to warn about zero base/index registers. */
59 1.1 christos static bfd_boolean warn_areg_zero = FALSE;
60 1.1 christos
61 1.1 christos /* Generic assembler global variables which must be defined by all
62 1.1 christos targets. */
63 1.1 christos
64 1.1 christos const char comment_chars[] = "#";
65 1.1 christos
66 1.1 christos /* Characters which start a comment at the beginning of a line. */
67 1.1 christos const char line_comment_chars[] = "#";
68 1.1 christos
69 1.1 christos /* Characters which may be used to separate multiple commands on a
70 1.1 christos single line. */
71 1.1 christos const char line_separator_chars[] = ";";
72 1.1 christos
73 1.1 christos /* Characters which are used to indicate an exponent in a floating
74 1.1 christos point number. */
75 1.1 christos const char EXP_CHARS[] = "eE";
76 1.1 christos
77 1.1 christos /* Characters which mean that a number is a floating point constant,
78 1.1 christos as in 0d1.0. */
79 1.1 christos const char FLT_CHARS[] = "dD";
80 1.1 christos
81 1.1 christos /* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
82 1.1 christos int s390_cie_data_alignment;
83 1.1 christos
84 1.1 christos /* The target specific pseudo-ops which we support. */
85 1.1 christos
86 1.1 christos /* Define the prototypes for the pseudo-ops */
87 1.1 christos static void s390_byte (int);
88 1.1 christos static void s390_elf_cons (int);
89 1.1 christos static void s390_bss (int);
90 1.1 christos static void s390_insn (int);
91 1.1 christos static void s390_literals (int);
92 1.1 christos static void s390_machine (int);
93 1.3 christos static void s390_machinemode (int);
94 1.1 christos
95 1.1 christos const pseudo_typeS md_pseudo_table[] =
96 1.1 christos {
97 1.3 christos { "align", s_align_bytes, 0 },
98 1.1 christos /* Pseudo-ops which must be defined. */
99 1.3 christos { "bss", s390_bss, 0 },
100 1.3 christos { "insn", s390_insn, 0 },
101 1.1 christos /* Pseudo-ops which must be overridden. */
102 1.3 christos { "byte", s390_byte, 0 },
103 1.3 christos { "short", s390_elf_cons, 2 },
104 1.3 christos { "long", s390_elf_cons, 4 },
105 1.3 christos { "quad", s390_elf_cons, 8 },
106 1.3 christos { "ltorg", s390_literals, 0 },
107 1.3 christos { "string", stringer, 8 + 1 },
108 1.3 christos { "machine", s390_machine, 0 },
109 1.3 christos { "machinemode", s390_machinemode, 0 },
110 1.3 christos { NULL, NULL, 0 }
111 1.1 christos };
112 1.1 christos
113 1.1 christos /* Given NAME, find the register number associated with that name, return
114 1.1 christos the integer value associated with the given name or -1 on failure. */
115 1.1 christos
116 1.1 christos static int
117 1.3 christos reg_name_search (const char *name)
118 1.1 christos {
119 1.3 christos int val = -1;
120 1.3 christos
121 1.3 christos if (strcasecmp (name, "lit") == 0)
122 1.3 christos return 13;
123 1.1 christos
124 1.3 christos if (strcasecmp (name, "sp") == 0)
125 1.3 christos return 15;
126 1.3 christos
127 1.3 christos if (name[0] != 'a' && name[0] != 'c' && name[0] != 'f'
128 1.3 christos && name[0] != 'r' && name[0] != 'v')
129 1.3 christos return -1;
130 1.1 christos
131 1.3 christos if (ISDIGIT (name[1]))
132 1.1 christos {
133 1.3 christos val = name[1] - '0';
134 1.3 christos if (ISDIGIT (name[2]))
135 1.3 christos val = val * 10 + name[2] - '0';
136 1.1 christos }
137 1.1 christos
138 1.3 christos if ((name[0] != 'v' && val > 15) || val > 31)
139 1.3 christos val = -1;
140 1.3 christos
141 1.3 christos return val;
142 1.1 christos }
143 1.1 christos
144 1.1 christos
145 1.1 christos /*
146 1.1 christos * Summary of register_name().
147 1.1 christos *
148 1.1 christos * in: Input_line_pointer points to 1st char of operand.
149 1.1 christos *
150 1.1 christos * out: A expressionS.
151 1.1 christos * The operand may have been a register: in this case, X_op == O_register,
152 1.1 christos * X_add_number is set to the register number, and truth is returned.
153 1.1 christos * Input_line_pointer->(next non-blank) char after operand, or is in its
154 1.1 christos * original state.
155 1.1 christos */
156 1.1 christos
157 1.1 christos static bfd_boolean
158 1.1 christos register_name (expressionS *expressionP)
159 1.1 christos {
160 1.1 christos int reg_number;
161 1.1 christos char *name;
162 1.1 christos char *start;
163 1.1 christos char c;
164 1.1 christos
165 1.1 christos /* Find the spelling of the operand. */
166 1.1 christos start = name = input_line_pointer;
167 1.1 christos if (name[0] == '%' && ISALPHA (name[1]))
168 1.1 christos name = ++input_line_pointer;
169 1.1 christos else
170 1.1 christos return FALSE;
171 1.1 christos
172 1.3 christos c = get_symbol_name (&name);
173 1.3 christos reg_number = reg_name_search (name);
174 1.1 christos
175 1.1 christos /* Put back the delimiting char. */
176 1.3 christos (void) restore_line_pointer (c);
177 1.1 christos
178 1.1 christos /* Look to see if it's in the register table. */
179 1.1 christos if (reg_number >= 0)
180 1.1 christos {
181 1.1 christos expressionP->X_op = O_register;
182 1.1 christos expressionP->X_add_number = reg_number;
183 1.1 christos
184 1.1 christos /* Make the rest nice. */
185 1.1 christos expressionP->X_add_symbol = NULL;
186 1.1 christos expressionP->X_op_symbol = NULL;
187 1.1 christos return TRUE;
188 1.1 christos }
189 1.1 christos
190 1.1 christos /* Reset the line as if we had not done anything. */
191 1.1 christos input_line_pointer = start;
192 1.1 christos return FALSE;
193 1.1 christos }
194 1.1 christos
195 1.1 christos /* Local variables. */
196 1.1 christos
197 1.1 christos /* Opformat hash table. */
198 1.1 christos static struct hash_control *s390_opformat_hash;
199 1.1 christos
200 1.1 christos /* Opcode hash table. */
201 1.1 christos static struct hash_control *s390_opcode_hash = NULL;
202 1.1 christos
203 1.1 christos /* Flags to set in the elf header */
204 1.1 christos static flagword s390_flags = 0;
205 1.1 christos
206 1.1 christos symbolS *GOT_symbol; /* Pre-defined "_GLOBAL_OFFSET_TABLE_" */
207 1.1 christos
208 1.1 christos #ifndef WORKING_DOT_WORD
209 1.1 christos int md_short_jump_size = 4;
210 1.1 christos int md_long_jump_size = 4;
211 1.1 christos #endif
212 1.1 christos
213 1.1 christos const char *md_shortopts = "A:m:kVQ:";
214 1.1 christos struct option md_longopts[] = {
215 1.1 christos {NULL, no_argument, NULL, 0}
216 1.1 christos };
217 1.1 christos size_t md_longopts_size = sizeof (md_longopts);
218 1.1 christos
219 1.1 christos /* Initialize the default opcode arch and word size from the default
220 1.1 christos architecture name if not specified by an option. */
221 1.1 christos static void
222 1.1 christos init_default_arch (void)
223 1.1 christos {
224 1.1 christos if (strcmp (default_arch, "s390") == 0)
225 1.1 christos {
226 1.1 christos if (s390_arch_size == 0)
227 1.1 christos s390_arch_size = 32;
228 1.1 christos }
229 1.1 christos else if (strcmp (default_arch, "s390x") == 0)
230 1.1 christos {
231 1.1 christos if (s390_arch_size == 0)
232 1.1 christos s390_arch_size = 64;
233 1.1 christos }
234 1.1 christos else
235 1.1 christos as_fatal (_("Invalid default architecture, broken assembler."));
236 1.1 christos
237 1.1 christos if (current_mode_mask == 0)
238 1.1 christos {
239 1.1 christos /* Default to z/Architecture mode if the CPU supports it. */
240 1.1 christos if (current_cpu < S390_OPCODE_Z900)
241 1.1 christos current_mode_mask = 1 << S390_OPCODE_ESA;
242 1.1 christos else
243 1.1 christos current_mode_mask = 1 << S390_OPCODE_ZARCH;
244 1.1 christos }
245 1.1 christos }
246 1.1 christos
247 1.1 christos /* Called by TARGET_FORMAT. */
248 1.1 christos const char *
249 1.1 christos s390_target_format (void)
250 1.1 christos {
251 1.1 christos /* We don't get a chance to initialize anything before we're called,
252 1.1 christos so handle that now. */
253 1.1 christos init_default_arch ();
254 1.1 christos
255 1.1 christos return s390_arch_size == 64 ? "elf64-s390" : "elf32-s390";
256 1.1 christos }
257 1.1 christos
258 1.3 christos /* Map a cpu string ARG as given with -march= or .machine to the respective
259 1.3 christos enum s390_opcode_cpu_val value. If ALLOW_EXTENSIONS is TRUE, the cpu name
260 1.3 christos can be followed by a list of cpu facility flags each beginning with the
261 1.3 christos character '+'. The active cpu flags are returned through *RET_FLAGS.
262 1.3 christos In case of an error, S390_OPCODE_MAXCPU is returned. */
263 1.1 christos
264 1.1 christos static unsigned int
265 1.4.8.1 pgoyette s390_parse_cpu (const char * arg,
266 1.3 christos unsigned int * ret_flags,
267 1.3 christos bfd_boolean allow_extensions)
268 1.1 christos {
269 1.3 christos static struct
270 1.3 christos {
271 1.3 christos const char * name;
272 1.3 christos unsigned int len;
273 1.3 christos unsigned int flags;
274 1.3 christos } cpu_table[S390_OPCODE_MAXCPU] =
275 1.3 christos {
276 1.3 christos { STRING_COMMA_LEN ("g5"), 0 },
277 1.3 christos { STRING_COMMA_LEN ("g6"), 0 },
278 1.3 christos { STRING_COMMA_LEN ("z900"), 0 },
279 1.3 christos { STRING_COMMA_LEN ("z990"), 0 },
280 1.3 christos { STRING_COMMA_LEN ("z9-109"), 0 },
281 1.3 christos { STRING_COMMA_LEN ("z9-ec"), 0 },
282 1.3 christos { STRING_COMMA_LEN ("z10"), 0 },
283 1.3 christos { STRING_COMMA_LEN ("z196"), 0 },
284 1.3 christos { STRING_COMMA_LEN ("zEC12"), S390_INSTR_FLAG_HTM },
285 1.3 christos { STRING_COMMA_LEN ("z13"), S390_INSTR_FLAG_HTM | S390_INSTR_FLAG_VX }
286 1.3 christos };
287 1.3 christos static struct
288 1.3 christos {
289 1.3 christos const char * name;
290 1.3 christos unsigned int mask;
291 1.3 christos bfd_boolean on;
292 1.3 christos } cpu_flags[] =
293 1.3 christos {
294 1.3 christos { "htm", S390_INSTR_FLAG_HTM, TRUE },
295 1.3 christos { "nohtm", S390_INSTR_FLAG_HTM, FALSE },
296 1.3 christos { "vx", S390_INSTR_FLAG_VX, TRUE },
297 1.3 christos { "novx", S390_INSTR_FLAG_VX, FALSE }
298 1.3 christos };
299 1.3 christos unsigned int icpu;
300 1.3 christos char *ilp_bak;
301 1.3 christos
302 1.3 christos icpu = S390_OPCODE_MAXCPU;
303 1.3 christos if (strncmp (arg, "all", 3) == 0 && (arg[3] == 0 || arg[3] == '+'))
304 1.3 christos {
305 1.3 christos icpu = S390_OPCODE_MAXCPU - 1;
306 1.3 christos arg += 3;
307 1.3 christos }
308 1.1 christos else
309 1.3 christos {
310 1.3 christos for (icpu = 0; icpu < S390_OPCODE_MAXCPU; icpu++)
311 1.3 christos {
312 1.3 christos unsigned int l;
313 1.3 christos
314 1.3 christos l = cpu_table[icpu].len;
315 1.3 christos if (strncmp (arg, cpu_table[icpu].name, l) == 0
316 1.3 christos && (arg[l] == 0 || arg[l] == '+'))
317 1.3 christos {
318 1.3 christos arg += l;
319 1.3 christos break;
320 1.3 christos }
321 1.3 christos }
322 1.3 christos }
323 1.3 christos
324 1.3 christos ilp_bak = input_line_pointer;
325 1.3 christos if (icpu != S390_OPCODE_MAXCPU)
326 1.3 christos {
327 1.4.8.1 pgoyette input_line_pointer = (char *) arg;
328 1.3 christos *ret_flags = (cpu_table[icpu].flags & S390_INSTR_FLAG_FACILITY_MASK);
329 1.3 christos
330 1.3 christos while (*input_line_pointer == '+' && allow_extensions)
331 1.3 christos {
332 1.3 christos unsigned int iflag;
333 1.3 christos char *sym;
334 1.3 christos char c;
335 1.3 christos
336 1.3 christos input_line_pointer++;
337 1.3 christos c = get_symbol_name (&sym);
338 1.3 christos for (iflag = 0; iflag < ARRAY_SIZE (cpu_flags); iflag++)
339 1.3 christos {
340 1.3 christos if (strcmp (sym, cpu_flags[iflag].name) == 0)
341 1.3 christos {
342 1.3 christos if (cpu_flags[iflag].on)
343 1.3 christos *ret_flags |= cpu_flags[iflag].mask;
344 1.3 christos else
345 1.3 christos *ret_flags &= ~cpu_flags[iflag].mask;
346 1.3 christos break;
347 1.3 christos }
348 1.3 christos }
349 1.3 christos if (iflag == ARRAY_SIZE (cpu_flags))
350 1.3 christos as_bad (_("no such machine extension `%s'"), sym - 1);
351 1.3 christos *input_line_pointer = c;
352 1.3 christos if (iflag == ARRAY_SIZE (cpu_flags))
353 1.3 christos break;
354 1.3 christos }
355 1.3 christos }
356 1.3 christos
357 1.3 christos SKIP_WHITESPACE ();
358 1.3 christos
359 1.3 christos if (*input_line_pointer != 0 && *input_line_pointer != '\n')
360 1.3 christos {
361 1.3 christos as_bad (_("junk at end of machine string, first unrecognized character"
362 1.3 christos " is `%c'"), *input_line_pointer);
363 1.3 christos icpu = S390_OPCODE_MAXCPU;
364 1.3 christos }
365 1.3 christos input_line_pointer = ilp_bak;
366 1.3 christos
367 1.3 christos return icpu;
368 1.1 christos }
369 1.1 christos
370 1.1 christos int
371 1.4.8.1 pgoyette md_parse_option (int c, const char *arg)
372 1.1 christos {
373 1.1 christos switch (c)
374 1.1 christos {
375 1.1 christos /* -k: Ignore for FreeBSD compatibility. */
376 1.1 christos case 'k':
377 1.1 christos break;
378 1.1 christos case 'm':
379 1.1 christos if (arg != NULL && strcmp (arg, "regnames") == 0)
380 1.1 christos reg_names_p = TRUE;
381 1.1 christos
382 1.1 christos else if (arg != NULL && strcmp (arg, "no-regnames") == 0)
383 1.1 christos reg_names_p = FALSE;
384 1.1 christos
385 1.1 christos else if (arg != NULL && strcmp (arg, "warn-areg-zero") == 0)
386 1.1 christos warn_areg_zero = TRUE;
387 1.1 christos
388 1.1 christos else if (arg != NULL && strcmp (arg, "31") == 0)
389 1.1 christos s390_arch_size = 32;
390 1.1 christos
391 1.1 christos else if (arg != NULL && strcmp (arg, "64") == 0)
392 1.1 christos s390_arch_size = 64;
393 1.1 christos
394 1.1 christos else if (arg != NULL && strcmp (arg, "esa") == 0)
395 1.1 christos current_mode_mask = 1 << S390_OPCODE_ESA;
396 1.1 christos
397 1.1 christos else if (arg != NULL && strcmp (arg, "zarch") == 0)
398 1.3 christos {
399 1.3 christos if (s390_arch_size == 32)
400 1.3 christos set_highgprs_p = TRUE;
401 1.3 christos current_mode_mask = 1 << S390_OPCODE_ZARCH;
402 1.3 christos }
403 1.1 christos
404 1.1 christos else if (arg != NULL && strncmp (arg, "arch=", 5) == 0)
405 1.1 christos {
406 1.3 christos current_cpu = s390_parse_cpu (arg + 5, ¤t_flags, FALSE);
407 1.3 christos if (current_cpu == S390_OPCODE_MAXCPU)
408 1.1 christos {
409 1.1 christos as_bad (_("invalid switch -m%s"), arg);
410 1.1 christos return 0;
411 1.1 christos }
412 1.1 christos }
413 1.1 christos
414 1.1 christos else
415 1.1 christos {
416 1.1 christos as_bad (_("invalid switch -m%s"), arg);
417 1.1 christos return 0;
418 1.1 christos }
419 1.1 christos break;
420 1.1 christos
421 1.1 christos case 'A':
422 1.1 christos /* Option -A is deprecated. Still available for compatibility. */
423 1.1 christos if (arg != NULL && strcmp (arg, "esa") == 0)
424 1.1 christos current_cpu = S390_OPCODE_G5;
425 1.1 christos else if (arg != NULL && strcmp (arg, "esame") == 0)
426 1.1 christos current_cpu = S390_OPCODE_Z900;
427 1.1 christos else
428 1.1 christos as_bad (_("invalid architecture -A%s"), arg);
429 1.1 christos break;
430 1.1 christos
431 1.1 christos /* -V: SVR4 argument to print version ID. */
432 1.1 christos case 'V':
433 1.1 christos print_version_id ();
434 1.1 christos break;
435 1.1 christos
436 1.1 christos /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
437 1.1 christos should be emitted or not. FIXME: Not implemented. */
438 1.1 christos case 'Q':
439 1.1 christos break;
440 1.1 christos
441 1.1 christos default:
442 1.1 christos return 0;
443 1.1 christos }
444 1.1 christos
445 1.1 christos return 1;
446 1.1 christos }
447 1.1 christos
448 1.1 christos void
449 1.1 christos md_show_usage (FILE *stream)
450 1.1 christos {
451 1.1 christos fprintf (stream, _("\
452 1.1 christos S390 options:\n\
453 1.1 christos -mregnames Allow symbolic names for registers\n\
454 1.1 christos -mwarn-areg-zero Warn about zero base/index registers\n\
455 1.1 christos -mno-regnames Do not allow symbolic names for registers\n\
456 1.1 christos -m31 Set file format to 31 bit format\n\
457 1.1 christos -m64 Set file format to 64 bit format\n"));
458 1.1 christos fprintf (stream, _("\
459 1.1 christos -V print assembler version number\n\
460 1.1 christos -Qy, -Qn ignored\n"));
461 1.1 christos }
462 1.1 christos
463 1.1 christos /* Generate the hash table mapping mnemonics to struct s390_opcode.
464 1.1 christos This table is built at startup and whenever the CPU level is
465 1.1 christos changed using .machine. */
466 1.1 christos
467 1.1 christos static void
468 1.1 christos s390_setup_opcodes (void)
469 1.1 christos {
470 1.3 christos const struct s390_opcode *op;
471 1.1 christos const struct s390_opcode *op_end;
472 1.1 christos bfd_boolean dup_insn = FALSE;
473 1.1 christos const char *retval;
474 1.1 christos
475 1.1 christos if (s390_opcode_hash != NULL)
476 1.1 christos hash_die (s390_opcode_hash);
477 1.1 christos
478 1.1 christos /* Insert the opcodes into a hash table. */
479 1.1 christos s390_opcode_hash = hash_new ();
480 1.1 christos
481 1.1 christos op_end = s390_opcodes + s390_num_opcodes;
482 1.1 christos for (op = s390_opcodes; op < op_end; op++)
483 1.1 christos {
484 1.3 christos int use_opcode;
485 1.3 christos
486 1.1 christos while (op < op_end - 1 && strcmp(op->name, op[1].name) == 0)
487 1.1 christos {
488 1.1 christos if (op->min_cpu <= current_cpu && (op->modes & current_mode_mask))
489 1.1 christos break;
490 1.1 christos op++;
491 1.1 christos }
492 1.1 christos
493 1.3 christos if ((op->modes & current_mode_mask) == 0)
494 1.3 christos use_opcode = 0;
495 1.3 christos else if ((op->flags & S390_INSTR_FLAG_FACILITY_MASK) == 0)
496 1.3 christos {
497 1.3 christos /* Opcodes that do not belong to a specific facility are enabled if
498 1.3 christos present in the selected cpu. */
499 1.3 christos use_opcode = (op->min_cpu <= current_cpu);
500 1.3 christos }
501 1.3 christos else
502 1.3 christos {
503 1.3 christos unsigned int f;
504 1.3 christos
505 1.3 christos /* Opcodes of a specific facility are enabled if the facility is
506 1.3 christos enabled. Note: only some facilities are represented as flags. */
507 1.3 christos f = (op->flags & S390_INSTR_FLAG_FACILITY_MASK);
508 1.3 christos use_opcode = ((f & current_flags) == f);
509 1.3 christos }
510 1.3 christos if (use_opcode)
511 1.1 christos {
512 1.1 christos retval = hash_insert (s390_opcode_hash, op->name, (void *) op);
513 1.1 christos if (retval != (const char *) NULL)
514 1.1 christos {
515 1.1 christos as_bad (_("Internal assembler error for instruction %s"),
516 1.1 christos op->name);
517 1.1 christos dup_insn = TRUE;
518 1.1 christos }
519 1.1 christos }
520 1.1 christos
521 1.1 christos while (op < op_end - 1 && strcmp (op->name, op[1].name) == 0)
522 1.1 christos op++;
523 1.3 christos }
524 1.1 christos
525 1.1 christos if (dup_insn)
526 1.1 christos abort ();
527 1.1 christos }
528 1.1 christos
529 1.1 christos /* This function is called when the assembler starts up. It is called
530 1.1 christos after the options have been parsed and the output file has been
531 1.1 christos opened. */
532 1.1 christos
533 1.1 christos void
534 1.1 christos md_begin (void)
535 1.1 christos {
536 1.3 christos const struct s390_opcode *op;
537 1.1 christos const struct s390_opcode *op_end;
538 1.1 christos const char *retval;
539 1.1 christos
540 1.1 christos /* Give a warning if the combination -m64-bit and -Aesa is used. */
541 1.1 christos if (s390_arch_size == 64 && current_cpu < S390_OPCODE_Z900)
542 1.1 christos as_warn (_("The 64 bit file format is used without esame instructions."));
543 1.1 christos
544 1.1 christos s390_cie_data_alignment = -s390_arch_size / 8;
545 1.1 christos
546 1.1 christos /* Set the ELF flags if desired. */
547 1.1 christos if (s390_flags)
548 1.1 christos bfd_set_private_flags (stdoutput, s390_flags);
549 1.1 christos
550 1.1 christos /* Insert the opcode formats into a hash table. */
551 1.1 christos s390_opformat_hash = hash_new ();
552 1.1 christos
553 1.1 christos op_end = s390_opformats + s390_num_opformats;
554 1.1 christos for (op = s390_opformats; op < op_end; op++)
555 1.1 christos {
556 1.1 christos retval = hash_insert (s390_opformat_hash, op->name, (void *) op);
557 1.1 christos if (retval != (const char *) NULL)
558 1.1 christos as_bad (_("Internal assembler error for instruction format %s"),
559 1.1 christos op->name);
560 1.1 christos }
561 1.1 christos
562 1.1 christos s390_setup_opcodes ();
563 1.1 christos
564 1.1 christos record_alignment (text_section, 2);
565 1.1 christos record_alignment (data_section, 2);
566 1.1 christos record_alignment (bss_section, 2);
567 1.1 christos }
568 1.1 christos
569 1.1 christos /* Called after all assembly has been done. */
570 1.1 christos void
571 1.1 christos s390_md_end (void)
572 1.1 christos {
573 1.1 christos if (s390_arch_size == 64)
574 1.1 christos bfd_set_arch_mach (stdoutput, bfd_arch_s390, bfd_mach_s390_64);
575 1.1 christos else
576 1.1 christos bfd_set_arch_mach (stdoutput, bfd_arch_s390, bfd_mach_s390_31);
577 1.1 christos }
578 1.1 christos
579 1.1 christos /* Insert an operand value into an instruction. */
580 1.1 christos
581 1.1 christos static void
582 1.1 christos s390_insert_operand (unsigned char *insn,
583 1.1 christos const struct s390_operand *operand,
584 1.1 christos offsetT val,
585 1.4.8.1 pgoyette const char *file,
586 1.1 christos unsigned int line)
587 1.1 christos {
588 1.1 christos addressT uval;
589 1.1 christos int offset;
590 1.1 christos
591 1.1 christos if (operand->flags & (S390_OPERAND_SIGNED|S390_OPERAND_PCREL))
592 1.1 christos {
593 1.1 christos offsetT min, max;
594 1.1 christos
595 1.1 christos max = ((offsetT) 1 << (operand->bits - 1)) - 1;
596 1.1 christos min = - ((offsetT) 1 << (operand->bits - 1));
597 1.1 christos /* Halve PCREL operands. */
598 1.1 christos if (operand->flags & S390_OPERAND_PCREL)
599 1.1 christos val >>= 1;
600 1.1 christos /* Check for underflow / overflow. */
601 1.1 christos if (val < min || val > max)
602 1.1 christos {
603 1.1 christos const char *err =
604 1.1 christos _("operand out of range (%s not between %ld and %ld)");
605 1.1 christos char buf[100];
606 1.1 christos
607 1.1 christos if (operand->flags & S390_OPERAND_PCREL)
608 1.1 christos {
609 1.1 christos val <<= 1;
610 1.1 christos min <<= 1;
611 1.1 christos max <<= 1;
612 1.1 christos }
613 1.1 christos sprint_value (buf, val);
614 1.1 christos if (file == (char *) NULL)
615 1.1 christos as_bad (err, buf, (int) min, (int) max);
616 1.1 christos else
617 1.1 christos as_bad_where (file, line, err, buf, (int) min, (int) max);
618 1.1 christos return;
619 1.1 christos }
620 1.1 christos /* val is ok, now restrict it to operand->bits bits. */
621 1.1 christos uval = (addressT) val & ((((addressT) 1 << (operand->bits-1)) << 1) - 1);
622 1.1 christos /* val is restrict, now check for special case. */
623 1.1 christos if (operand->bits == 20 && operand->shift == 20)
624 1.1 christos uval = (uval >> 12) | ((uval & 0xfff) << 8);
625 1.1 christos }
626 1.1 christos else
627 1.1 christos {
628 1.1 christos addressT min, max;
629 1.1 christos
630 1.1 christos max = (((addressT) 1 << (operand->bits - 1)) << 1) - 1;
631 1.1 christos min = (offsetT) 0;
632 1.1 christos uval = (addressT) val;
633 1.3 christos
634 1.3 christos /* Vector register operands have an additional bit in the RXB
635 1.3 christos field. */
636 1.3 christos if (operand->flags & S390_OPERAND_VR)
637 1.3 christos max = (max << 1) | 1;
638 1.3 christos
639 1.1 christos /* Length x in an instructions has real length x+1. */
640 1.1 christos if (operand->flags & S390_OPERAND_LENGTH)
641 1.1 christos uval--;
642 1.1 christos /* Check for underflow / overflow. */
643 1.1 christos if (uval < min || uval > max)
644 1.1 christos {
645 1.1 christos if (operand->flags & S390_OPERAND_LENGTH)
646 1.1 christos {
647 1.1 christos uval++;
648 1.1 christos min++;
649 1.1 christos max++;
650 1.1 christos }
651 1.1 christos
652 1.1 christos as_bad_value_out_of_range (_("operand"), uval, (offsetT) min, (offsetT) max, file, line);
653 1.1 christos
654 1.1 christos return;
655 1.1 christos }
656 1.1 christos }
657 1.1 christos
658 1.3 christos if (operand->flags & S390_OPERAND_VR)
659 1.3 christos {
660 1.3 christos /* Insert the extra bit into the RXB field. */
661 1.3 christos switch (operand->shift)
662 1.3 christos {
663 1.3 christos case 8:
664 1.3 christos insn[4] |= (uval & 0x10) >> 1;
665 1.3 christos break;
666 1.3 christos case 12:
667 1.3 christos insn[4] |= (uval & 0x10) >> 2;
668 1.3 christos break;
669 1.3 christos case 16:
670 1.3 christos insn[4] |= (uval & 0x10) >> 3;
671 1.3 christos break;
672 1.3 christos case 32:
673 1.3 christos insn[4] |= (uval & 0x10) >> 4;
674 1.3 christos break;
675 1.3 christos }
676 1.3 christos uval &= 0xf;
677 1.3 christos }
678 1.3 christos
679 1.3 christos if (operand->flags & S390_OPERAND_OR1)
680 1.3 christos uval |= 1;
681 1.3 christos if (operand->flags & S390_OPERAND_OR2)
682 1.3 christos uval |= 2;
683 1.3 christos if (operand->flags & S390_OPERAND_OR8)
684 1.3 christos uval |= 8;
685 1.3 christos
686 1.3 christos /* Duplicate the operand at bit pos 12 to 16. */
687 1.3 christos if (operand->flags & S390_OPERAND_CP16)
688 1.3 christos {
689 1.3 christos /* Copy VR operand at bit pos 12 to bit pos 16. */
690 1.3 christos insn[2] |= uval << 4;
691 1.3 christos /* Copy the flag in the RXB field. */
692 1.3 christos insn[4] |= (insn[4] & 4) >> 1;
693 1.3 christos }
694 1.3 christos
695 1.1 christos /* Insert fragments of the operand byte for byte. */
696 1.1 christos offset = operand->shift + operand->bits;
697 1.1 christos uval <<= (-offset) & 7;
698 1.1 christos insn += (offset - 1) / 8;
699 1.1 christos while (uval != 0)
700 1.1 christos {
701 1.1 christos *insn-- |= uval;
702 1.1 christos uval >>= 8;
703 1.1 christos }
704 1.1 christos }
705 1.1 christos
706 1.1 christos struct map_tls
707 1.1 christos {
708 1.4.8.1 pgoyette const char *string;
709 1.1 christos int length;
710 1.1 christos bfd_reloc_code_real_type reloc;
711 1.1 christos };
712 1.1 christos
713 1.1 christos /* Parse tls marker and return the desired relocation. */
714 1.1 christos static bfd_reloc_code_real_type
715 1.1 christos s390_tls_suffix (char **str_p, expressionS *exp_p)
716 1.1 christos {
717 1.1 christos static struct map_tls mapping[] =
718 1.1 christos {
719 1.1 christos { "tls_load", 8, BFD_RELOC_390_TLS_LOAD },
720 1.1 christos { "tls_gdcall", 10, BFD_RELOC_390_TLS_GDCALL },
721 1.1 christos { "tls_ldcall", 10, BFD_RELOC_390_TLS_LDCALL },
722 1.1 christos { NULL, 0, BFD_RELOC_UNUSED }
723 1.1 christos };
724 1.1 christos struct map_tls *ptr;
725 1.1 christos char *orig_line;
726 1.1 christos char *str;
727 1.1 christos char *ident;
728 1.1 christos int len;
729 1.1 christos
730 1.1 christos str = *str_p;
731 1.1 christos if (*str++ != ':')
732 1.1 christos return BFD_RELOC_UNUSED;
733 1.1 christos
734 1.1 christos ident = str;
735 1.1 christos while (ISIDNUM (*str))
736 1.1 christos str++;
737 1.1 christos len = str - ident;
738 1.1 christos if (*str++ != ':')
739 1.1 christos return BFD_RELOC_UNUSED;
740 1.1 christos
741 1.1 christos orig_line = input_line_pointer;
742 1.1 christos input_line_pointer = str;
743 1.1 christos expression (exp_p);
744 1.1 christos str = input_line_pointer;
745 1.1 christos if (&input_line_pointer != str_p)
746 1.1 christos input_line_pointer = orig_line;
747 1.1 christos
748 1.1 christos if (exp_p->X_op != O_symbol)
749 1.1 christos return BFD_RELOC_UNUSED;
750 1.1 christos
751 1.1 christos for (ptr = &mapping[0]; ptr->length > 0; ptr++)
752 1.1 christos if (len == ptr->length
753 1.1 christos && strncasecmp (ident, ptr->string, ptr->length) == 0)
754 1.1 christos {
755 1.1 christos /* Found a matching tls suffix. */
756 1.1 christos *str_p = str;
757 1.1 christos return ptr->reloc;
758 1.1 christos }
759 1.1 christos return BFD_RELOC_UNUSED;
760 1.1 christos }
761 1.1 christos
762 1.1 christos /* Structure used to hold suffixes. */
763 1.1 christos typedef enum
764 1.1 christos {
765 1.1 christos ELF_SUFFIX_NONE = 0,
766 1.1 christos ELF_SUFFIX_GOT,
767 1.1 christos ELF_SUFFIX_PLT,
768 1.1 christos ELF_SUFFIX_GOTENT,
769 1.1 christos ELF_SUFFIX_GOTOFF,
770 1.1 christos ELF_SUFFIX_GOTPLT,
771 1.1 christos ELF_SUFFIX_PLTOFF,
772 1.1 christos ELF_SUFFIX_TLS_GD,
773 1.1 christos ELF_SUFFIX_TLS_GOTIE,
774 1.1 christos ELF_SUFFIX_TLS_IE,
775 1.1 christos ELF_SUFFIX_TLS_LDM,
776 1.1 christos ELF_SUFFIX_TLS_LDO,
777 1.1 christos ELF_SUFFIX_TLS_LE
778 1.1 christos }
779 1.1 christos elf_suffix_type;
780 1.1 christos
781 1.1 christos struct map_bfd
782 1.1 christos {
783 1.4.8.1 pgoyette const char *string;
784 1.1 christos int length;
785 1.1 christos elf_suffix_type suffix;
786 1.1 christos };
787 1.1 christos
788 1.1 christos
789 1.1 christos /* Parse @got/@plt/@gotoff. and return the desired relocation. */
790 1.1 christos static elf_suffix_type
791 1.1 christos s390_elf_suffix (char **str_p, expressionS *exp_p)
792 1.1 christos {
793 1.1 christos static struct map_bfd mapping[] =
794 1.1 christos {
795 1.1 christos { "got", 3, ELF_SUFFIX_GOT },
796 1.1 christos { "got12", 5, ELF_SUFFIX_GOT },
797 1.1 christos { "plt", 3, ELF_SUFFIX_PLT },
798 1.1 christos { "gotent", 6, ELF_SUFFIX_GOTENT },
799 1.1 christos { "gotoff", 6, ELF_SUFFIX_GOTOFF },
800 1.1 christos { "gotplt", 6, ELF_SUFFIX_GOTPLT },
801 1.1 christos { "pltoff", 6, ELF_SUFFIX_PLTOFF },
802 1.1 christos { "tlsgd", 5, ELF_SUFFIX_TLS_GD },
803 1.1 christos { "gotntpoff", 9, ELF_SUFFIX_TLS_GOTIE },
804 1.1 christos { "indntpoff", 9, ELF_SUFFIX_TLS_IE },
805 1.1 christos { "tlsldm", 6, ELF_SUFFIX_TLS_LDM },
806 1.1 christos { "dtpoff", 6, ELF_SUFFIX_TLS_LDO },
807 1.1 christos { "ntpoff", 6, ELF_SUFFIX_TLS_LE },
808 1.1 christos { NULL, 0, ELF_SUFFIX_NONE }
809 1.1 christos };
810 1.1 christos
811 1.1 christos struct map_bfd *ptr;
812 1.1 christos char *str = *str_p;
813 1.1 christos char *ident;
814 1.1 christos int len;
815 1.1 christos
816 1.1 christos if (*str++ != '@')
817 1.1 christos return ELF_SUFFIX_NONE;
818 1.1 christos
819 1.1 christos ident = str;
820 1.1 christos while (ISALNUM (*str))
821 1.1 christos str++;
822 1.1 christos len = str - ident;
823 1.1 christos
824 1.1 christos for (ptr = &mapping[0]; ptr->length > 0; ptr++)
825 1.1 christos if (len == ptr->length
826 1.1 christos && strncasecmp (ident, ptr->string, ptr->length) == 0)
827 1.1 christos {
828 1.1 christos if (exp_p->X_add_number != 0)
829 1.1 christos as_warn (_("identifier+constant@%s means identifier@%s+constant"),
830 1.1 christos ptr->string, ptr->string);
831 1.1 christos /* Now check for identifier@suffix+constant. */
832 1.1 christos if (*str == '-' || *str == '+')
833 1.1 christos {
834 1.1 christos char *orig_line = input_line_pointer;
835 1.1 christos expressionS new_exp;
836 1.1 christos
837 1.1 christos input_line_pointer = str;
838 1.1 christos expression (&new_exp);
839 1.1 christos
840 1.1 christos switch (new_exp.X_op)
841 1.1 christos {
842 1.1 christos case O_constant: /* X_add_number (a constant expression). */
843 1.1 christos exp_p->X_add_number += new_exp.X_add_number;
844 1.1 christos str = input_line_pointer;
845 1.1 christos break;
846 1.1 christos case O_symbol: /* X_add_symbol + X_add_number. */
847 1.1 christos /* this case is used for e.g. xyz@PLT+.Label. */
848 1.1 christos exp_p->X_add_number += new_exp.X_add_number;
849 1.1 christos exp_p->X_op_symbol = new_exp.X_add_symbol;
850 1.1 christos exp_p->X_op = O_add;
851 1.1 christos str = input_line_pointer;
852 1.1 christos break;
853 1.1 christos case O_uminus: /* (- X_add_symbol) + X_add_number. */
854 1.1 christos /* this case is used for e.g. xyz (at) PLT-.Label. */
855 1.1 christos exp_p->X_add_number += new_exp.X_add_number;
856 1.1 christos exp_p->X_op_symbol = new_exp.X_add_symbol;
857 1.1 christos exp_p->X_op = O_subtract;
858 1.1 christos str = input_line_pointer;
859 1.1 christos break;
860 1.1 christos default:
861 1.1 christos break;
862 1.1 christos }
863 1.1 christos
864 1.1 christos /* If s390_elf_suffix has not been called with
865 1.1 christos &input_line_pointer as first parameter, we have
866 1.1 christos clobbered the input_line_pointer. We have to
867 1.1 christos undo that. */
868 1.1 christos if (&input_line_pointer != str_p)
869 1.1 christos input_line_pointer = orig_line;
870 1.1 christos }
871 1.1 christos *str_p = str;
872 1.1 christos return ptr->suffix;
873 1.1 christos }
874 1.1 christos
875 1.1 christos return BFD_RELOC_UNUSED;
876 1.1 christos }
877 1.1 christos
878 1.1 christos /* Structure used to hold a literal pool entry. */
879 1.1 christos struct s390_lpe
880 1.1 christos {
881 1.1 christos struct s390_lpe *next;
882 1.1 christos expressionS ex;
883 1.1 christos FLONUM_TYPE floatnum; /* used if X_op == O_big && X_add_number <= 0 */
884 1.1 christos LITTLENUM_TYPE bignum[4]; /* used if X_op == O_big && X_add_number > 0 */
885 1.1 christos int nbytes;
886 1.1 christos bfd_reloc_code_real_type reloc;
887 1.1 christos symbolS *sym;
888 1.1 christos };
889 1.1 christos
890 1.1 christos static struct s390_lpe *lpe_free_list = NULL;
891 1.1 christos static struct s390_lpe *lpe_list = NULL;
892 1.1 christos static struct s390_lpe *lpe_list_tail = NULL;
893 1.1 christos static symbolS *lp_sym = NULL;
894 1.1 christos static int lp_count = 0;
895 1.1 christos static int lpe_count = 0;
896 1.1 christos
897 1.1 christos static int
898 1.1 christos s390_exp_compare (expressionS *exp1, expressionS *exp2)
899 1.1 christos {
900 1.1 christos if (exp1->X_op != exp2->X_op)
901 1.1 christos return 0;
902 1.1 christos
903 1.1 christos switch (exp1->X_op)
904 1.1 christos {
905 1.1 christos case O_constant: /* X_add_number must be equal. */
906 1.1 christos case O_register:
907 1.1 christos return exp1->X_add_number == exp2->X_add_number;
908 1.1 christos
909 1.1 christos case O_big:
910 1.1 christos as_bad (_("Can't handle O_big in s390_exp_compare"));
911 1.1 christos
912 1.1 christos case O_symbol: /* X_add_symbol & X_add_number must be equal. */
913 1.1 christos case O_symbol_rva:
914 1.1 christos case O_uminus:
915 1.1 christos case O_bit_not:
916 1.1 christos case O_logical_not:
917 1.1 christos return (exp1->X_add_symbol == exp2->X_add_symbol)
918 1.1 christos && (exp1->X_add_number == exp2->X_add_number);
919 1.1 christos
920 1.1 christos case O_multiply: /* X_add_symbol,X_op_symbol&X_add_number must be equal. */
921 1.1 christos case O_divide:
922 1.1 christos case O_modulus:
923 1.1 christos case O_left_shift:
924 1.1 christos case O_right_shift:
925 1.1 christos case O_bit_inclusive_or:
926 1.1 christos case O_bit_or_not:
927 1.1 christos case O_bit_exclusive_or:
928 1.1 christos case O_bit_and:
929 1.1 christos case O_add:
930 1.1 christos case O_subtract:
931 1.1 christos case O_eq:
932 1.1 christos case O_ne:
933 1.1 christos case O_lt:
934 1.1 christos case O_le:
935 1.1 christos case O_ge:
936 1.1 christos case O_gt:
937 1.1 christos case O_logical_and:
938 1.1 christos case O_logical_or:
939 1.1 christos return (exp1->X_add_symbol == exp2->X_add_symbol)
940 1.1 christos && (exp1->X_op_symbol == exp2->X_op_symbol)
941 1.1 christos && (exp1->X_add_number == exp2->X_add_number);
942 1.1 christos default:
943 1.1 christos return 0;
944 1.1 christos }
945 1.1 christos }
946 1.1 christos
947 1.1 christos /* Test for @lit and if its present make an entry in the literal pool and
948 1.1 christos modify the current expression to be an offset into the literal pool. */
949 1.1 christos static elf_suffix_type
950 1.1 christos s390_lit_suffix (char **str_p, expressionS *exp_p, elf_suffix_type suffix)
951 1.1 christos {
952 1.1 christos bfd_reloc_code_real_type reloc;
953 1.1 christos char tmp_name[64];
954 1.1 christos char *str = *str_p;
955 1.1 christos char *ident;
956 1.1 christos struct s390_lpe *lpe;
957 1.1 christos int nbytes, len;
958 1.1 christos
959 1.1 christos if (*str++ != ':')
960 1.1 christos return suffix; /* No modification. */
961 1.1 christos
962 1.1 christos /* We look for a suffix of the form "@lit1", "@lit2", "@lit4" or "@lit8". */
963 1.1 christos ident = str;
964 1.1 christos while (ISALNUM (*str))
965 1.1 christos str++;
966 1.1 christos len = str - ident;
967 1.1 christos if (len != 4 || strncasecmp (ident, "lit", 3) != 0
968 1.1 christos || (ident[3]!='1' && ident[3]!='2' && ident[3]!='4' && ident[3]!='8'))
969 1.1 christos return suffix; /* no modification */
970 1.1 christos nbytes = ident[3] - '0';
971 1.1 christos
972 1.1 christos reloc = BFD_RELOC_UNUSED;
973 1.1 christos if (suffix == ELF_SUFFIX_GOT)
974 1.1 christos {
975 1.1 christos if (nbytes == 2)
976 1.1 christos reloc = BFD_RELOC_390_GOT16;
977 1.1 christos else if (nbytes == 4)
978 1.1 christos reloc = BFD_RELOC_32_GOT_PCREL;
979 1.1 christos else if (nbytes == 8)
980 1.1 christos reloc = BFD_RELOC_390_GOT64;
981 1.1 christos }
982 1.1 christos else if (suffix == ELF_SUFFIX_PLT)
983 1.1 christos {
984 1.1 christos if (nbytes == 4)
985 1.1 christos reloc = BFD_RELOC_390_PLT32;
986 1.1 christos else if (nbytes == 8)
987 1.1 christos reloc = BFD_RELOC_390_PLT64;
988 1.1 christos }
989 1.1 christos
990 1.1 christos if (suffix != ELF_SUFFIX_NONE && reloc == BFD_RELOC_UNUSED)
991 1.1 christos as_bad (_("Invalid suffix for literal pool entry"));
992 1.1 christos
993 1.1 christos /* Search the pool if the new entry is a duplicate. */
994 1.1 christos if (exp_p->X_op == O_big)
995 1.1 christos {
996 1.1 christos /* Special processing for big numbers. */
997 1.1 christos for (lpe = lpe_list; lpe != NULL; lpe = lpe->next)
998 1.1 christos {
999 1.1 christos if (lpe->ex.X_op == O_big)
1000 1.1 christos {
1001 1.1 christos if (exp_p->X_add_number <= 0 && lpe->ex.X_add_number <= 0)
1002 1.1 christos {
1003 1.1 christos if (memcmp (&generic_floating_point_number, &lpe->floatnum,
1004 1.1 christos sizeof (FLONUM_TYPE)) == 0)
1005 1.1 christos break;
1006 1.1 christos }
1007 1.1 christos else if (exp_p->X_add_number == lpe->ex.X_add_number)
1008 1.1 christos {
1009 1.1 christos if (memcmp (generic_bignum, lpe->bignum,
1010 1.1 christos sizeof (LITTLENUM_TYPE)*exp_p->X_add_number) == 0)
1011 1.1 christos break;
1012 1.1 christos }
1013 1.1 christos }
1014 1.1 christos }
1015 1.1 christos }
1016 1.1 christos else
1017 1.1 christos {
1018 1.1 christos /* Processing for 'normal' data types. */
1019 1.1 christos for (lpe = lpe_list; lpe != NULL; lpe = lpe->next)
1020 1.1 christos if (lpe->nbytes == nbytes && lpe->reloc == reloc
1021 1.1 christos && s390_exp_compare (exp_p, &lpe->ex) != 0)
1022 1.1 christos break;
1023 1.1 christos }
1024 1.1 christos
1025 1.1 christos if (lpe == NULL)
1026 1.1 christos {
1027 1.1 christos /* A new literal. */
1028 1.1 christos if (lpe_free_list != NULL)
1029 1.1 christos {
1030 1.1 christos lpe = lpe_free_list;
1031 1.1 christos lpe_free_list = lpe_free_list->next;
1032 1.1 christos }
1033 1.1 christos else
1034 1.1 christos {
1035 1.4.8.1 pgoyette lpe = XNEW (struct s390_lpe);
1036 1.1 christos }
1037 1.1 christos
1038 1.1 christos lpe->ex = *exp_p;
1039 1.1 christos
1040 1.1 christos if (exp_p->X_op == O_big)
1041 1.1 christos {
1042 1.1 christos if (exp_p->X_add_number <= 0)
1043 1.1 christos lpe->floatnum = generic_floating_point_number;
1044 1.1 christos else if (exp_p->X_add_number <= 4)
1045 1.1 christos memcpy (lpe->bignum, generic_bignum,
1046 1.1 christos exp_p->X_add_number * sizeof (LITTLENUM_TYPE));
1047 1.1 christos else
1048 1.1 christos as_bad (_("Big number is too big"));
1049 1.1 christos }
1050 1.1 christos
1051 1.1 christos lpe->nbytes = nbytes;
1052 1.1 christos lpe->reloc = reloc;
1053 1.1 christos /* Literal pool name defined ? */
1054 1.1 christos if (lp_sym == NULL)
1055 1.1 christos {
1056 1.1 christos sprintf (tmp_name, ".L\001%i", lp_count);
1057 1.1 christos lp_sym = symbol_make (tmp_name);
1058 1.1 christos }
1059 1.1 christos
1060 1.1 christos /* Make name for literal pool entry. */
1061 1.1 christos sprintf (tmp_name, ".L\001%i\002%i", lp_count, lpe_count);
1062 1.1 christos lpe_count++;
1063 1.1 christos lpe->sym = symbol_make (tmp_name);
1064 1.1 christos
1065 1.1 christos /* Add to literal pool list. */
1066 1.1 christos lpe->next = NULL;
1067 1.1 christos if (lpe_list_tail != NULL)
1068 1.1 christos {
1069 1.1 christos lpe_list_tail->next = lpe;
1070 1.1 christos lpe_list_tail = lpe;
1071 1.1 christos }
1072 1.1 christos else
1073 1.1 christos lpe_list = lpe_list_tail = lpe;
1074 1.1 christos }
1075 1.1 christos
1076 1.1 christos /* Now change exp_p to the offset into the literal pool.
1077 1.1 christos Thats the expression: .L^Ax^By-.L^Ax */
1078 1.1 christos exp_p->X_add_symbol = lpe->sym;
1079 1.1 christos exp_p->X_op_symbol = lp_sym;
1080 1.1 christos exp_p->X_op = O_subtract;
1081 1.1 christos exp_p->X_add_number = 0;
1082 1.1 christos
1083 1.1 christos *str_p = str;
1084 1.1 christos
1085 1.1 christos /* We change the suffix type to ELF_SUFFIX_NONE, because
1086 1.1 christos the difference of two local labels is just a number. */
1087 1.1 christos return ELF_SUFFIX_NONE;
1088 1.1 christos }
1089 1.1 christos
1090 1.1 christos /* Like normal .long/.short/.word, except support @got, etc.
1091 1.1 christos clobbers input_line_pointer, checks end-of-line. */
1092 1.1 christos static void
1093 1.1 christos s390_elf_cons (int nbytes /* 1=.byte, 2=.word, 4=.long */)
1094 1.1 christos {
1095 1.1 christos expressionS exp;
1096 1.1 christos elf_suffix_type suffix;
1097 1.1 christos
1098 1.1 christos if (is_it_end_of_statement ())
1099 1.1 christos {
1100 1.1 christos demand_empty_rest_of_line ();
1101 1.1 christos return;
1102 1.1 christos }
1103 1.1 christos
1104 1.1 christos do
1105 1.1 christos {
1106 1.1 christos expression (&exp);
1107 1.1 christos
1108 1.1 christos if (exp.X_op == O_symbol
1109 1.1 christos && *input_line_pointer == '@'
1110 1.1 christos && (suffix = s390_elf_suffix (&input_line_pointer, &exp)) != ELF_SUFFIX_NONE)
1111 1.1 christos {
1112 1.1 christos bfd_reloc_code_real_type reloc;
1113 1.1 christos reloc_howto_type *reloc_howto;
1114 1.1 christos int size;
1115 1.1 christos char *where;
1116 1.1 christos
1117 1.1 christos if (nbytes == 2)
1118 1.1 christos {
1119 1.1 christos static bfd_reloc_code_real_type tab2[] =
1120 1.1 christos {
1121 1.1 christos BFD_RELOC_UNUSED, /* ELF_SUFFIX_NONE */
1122 1.1 christos BFD_RELOC_390_GOT16, /* ELF_SUFFIX_GOT */
1123 1.1 christos BFD_RELOC_UNUSED, /* ELF_SUFFIX_PLT */
1124 1.1 christos BFD_RELOC_UNUSED, /* ELF_SUFFIX_GOTENT */
1125 1.1 christos BFD_RELOC_16_GOTOFF, /* ELF_SUFFIX_GOTOFF */
1126 1.1 christos BFD_RELOC_UNUSED, /* ELF_SUFFIX_GOTPLT */
1127 1.1 christos BFD_RELOC_390_PLTOFF16, /* ELF_SUFFIX_PLTOFF */
1128 1.1 christos BFD_RELOC_UNUSED, /* ELF_SUFFIX_TLS_GD */
1129 1.1 christos BFD_RELOC_UNUSED, /* ELF_SUFFIX_TLS_GOTIE */
1130 1.1 christos BFD_RELOC_UNUSED, /* ELF_SUFFIX_TLS_IE */
1131 1.1 christos BFD_RELOC_UNUSED, /* ELF_SUFFIX_TLS_LDM */
1132 1.1 christos BFD_RELOC_UNUSED, /* ELF_SUFFIX_TLS_LDO */
1133 1.1 christos BFD_RELOC_UNUSED /* ELF_SUFFIX_TLS_LE */
1134 1.1 christos };
1135 1.1 christos reloc = tab2[suffix];
1136 1.1 christos }
1137 1.1 christos else if (nbytes == 4)
1138 1.1 christos {
1139 1.1 christos static bfd_reloc_code_real_type tab4[] =
1140 1.1 christos {
1141 1.1 christos BFD_RELOC_UNUSED, /* ELF_SUFFIX_NONE */
1142 1.1 christos BFD_RELOC_32_GOT_PCREL, /* ELF_SUFFIX_GOT */
1143 1.1 christos BFD_RELOC_390_PLT32, /* ELF_SUFFIX_PLT */
1144 1.1 christos BFD_RELOC_UNUSED, /* ELF_SUFFIX_GOTENT */
1145 1.1 christos BFD_RELOC_32_GOTOFF, /* ELF_SUFFIX_GOTOFF */
1146 1.1 christos BFD_RELOC_390_GOTPLT32, /* ELF_SUFFIX_GOTPLT */
1147 1.1 christos BFD_RELOC_390_PLTOFF32, /* ELF_SUFFIX_PLTOFF */
1148 1.1 christos BFD_RELOC_390_TLS_GD32, /* ELF_SUFFIX_TLS_GD */
1149 1.1 christos BFD_RELOC_390_TLS_GOTIE32, /* ELF_SUFFIX_TLS_GOTIE */
1150 1.1 christos BFD_RELOC_390_TLS_IE32, /* ELF_SUFFIX_TLS_IE */
1151 1.1 christos BFD_RELOC_390_TLS_LDM32, /* ELF_SUFFIX_TLS_LDM */
1152 1.1 christos BFD_RELOC_390_TLS_LDO32, /* ELF_SUFFIX_TLS_LDO */
1153 1.1 christos BFD_RELOC_390_TLS_LE32 /* ELF_SUFFIX_TLS_LE */
1154 1.1 christos };
1155 1.1 christos reloc = tab4[suffix];
1156 1.1 christos }
1157 1.1 christos else if (nbytes == 8)
1158 1.1 christos {
1159 1.1 christos static bfd_reloc_code_real_type tab8[] =
1160 1.1 christos {
1161 1.1 christos BFD_RELOC_UNUSED, /* ELF_SUFFIX_NONE */
1162 1.1 christos BFD_RELOC_390_GOT64, /* ELF_SUFFIX_GOT */
1163 1.1 christos BFD_RELOC_390_PLT64, /* ELF_SUFFIX_PLT */
1164 1.1 christos BFD_RELOC_UNUSED, /* ELF_SUFFIX_GOTENT */
1165 1.1 christos BFD_RELOC_390_GOTOFF64, /* ELF_SUFFIX_GOTOFF */
1166 1.1 christos BFD_RELOC_390_GOTPLT64, /* ELF_SUFFIX_GOTPLT */
1167 1.1 christos BFD_RELOC_390_PLTOFF64, /* ELF_SUFFIX_PLTOFF */
1168 1.1 christos BFD_RELOC_390_TLS_GD64, /* ELF_SUFFIX_TLS_GD */
1169 1.1 christos BFD_RELOC_390_TLS_GOTIE64, /* ELF_SUFFIX_TLS_GOTIE */
1170 1.1 christos BFD_RELOC_390_TLS_IE64, /* ELF_SUFFIX_TLS_IE */
1171 1.1 christos BFD_RELOC_390_TLS_LDM64, /* ELF_SUFFIX_TLS_LDM */
1172 1.1 christos BFD_RELOC_390_TLS_LDO64, /* ELF_SUFFIX_TLS_LDO */
1173 1.1 christos BFD_RELOC_390_TLS_LE64 /* ELF_SUFFIX_TLS_LE */
1174 1.1 christos };
1175 1.1 christos reloc = tab8[suffix];
1176 1.1 christos }
1177 1.1 christos else
1178 1.1 christos reloc = BFD_RELOC_UNUSED;
1179 1.1 christos
1180 1.1 christos if (reloc != BFD_RELOC_UNUSED
1181 1.1 christos && (reloc_howto = bfd_reloc_type_lookup (stdoutput, reloc)))
1182 1.1 christos {
1183 1.1 christos size = bfd_get_reloc_size (reloc_howto);
1184 1.1 christos if (size > nbytes)
1185 1.1 christos as_bad (_("%s relocations do not fit in %d bytes"),
1186 1.1 christos reloc_howto->name, nbytes);
1187 1.1 christos where = frag_more (nbytes);
1188 1.1 christos md_number_to_chars (where, 0, size);
1189 1.1 christos /* To make fixup_segment do the pc relative conversion the
1190 1.1 christos pcrel parameter on the fix_new_exp call needs to be FALSE. */
1191 1.1 christos fix_new_exp (frag_now, where - frag_now->fr_literal,
1192 1.1 christos size, &exp, FALSE, reloc);
1193 1.1 christos }
1194 1.1 christos else
1195 1.1 christos as_bad (_("relocation not applicable"));
1196 1.1 christos }
1197 1.1 christos else
1198 1.1 christos emit_expr (&exp, (unsigned int) nbytes);
1199 1.1 christos }
1200 1.1 christos while (*input_line_pointer++ == ',');
1201 1.1 christos
1202 1.1 christos input_line_pointer--; /* Put terminator back into stream. */
1203 1.1 christos demand_empty_rest_of_line ();
1204 1.1 christos }
1205 1.1 christos
1206 1.1 christos /* We need to keep a list of fixups. We can't simply generate them as
1207 1.1 christos we go, because that would require us to first create the frag, and
1208 1.1 christos that would screw up references to ``.''. */
1209 1.1 christos
1210 1.1 christos struct s390_fixup
1211 1.1 christos {
1212 1.1 christos expressionS exp;
1213 1.1 christos int opindex;
1214 1.1 christos bfd_reloc_code_real_type reloc;
1215 1.1 christos };
1216 1.1 christos
1217 1.1 christos #define MAX_INSN_FIXUPS (4)
1218 1.1 christos
1219 1.1 christos /* This routine is called for each instruction to be assembled. */
1220 1.1 christos
1221 1.1 christos static char *
1222 1.1 christos md_gather_operands (char *str,
1223 1.1 christos unsigned char *insn,
1224 1.1 christos const struct s390_opcode *opcode)
1225 1.1 christos {
1226 1.1 christos struct s390_fixup fixups[MAX_INSN_FIXUPS];
1227 1.1 christos const struct s390_operand *operand;
1228 1.1 christos const unsigned char *opindex_ptr;
1229 1.1 christos expressionS ex;
1230 1.1 christos elf_suffix_type suffix;
1231 1.1 christos bfd_reloc_code_real_type reloc;
1232 1.1 christos int skip_optional;
1233 1.1 christos char *f;
1234 1.1 christos int fc, i;
1235 1.1 christos
1236 1.1 christos while (ISSPACE (*str))
1237 1.1 christos str++;
1238 1.1 christos
1239 1.1 christos skip_optional = 0;
1240 1.1 christos
1241 1.1 christos /* Gather the operands. */
1242 1.1 christos fc = 0;
1243 1.1 christos for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
1244 1.1 christos {
1245 1.1 christos char *hold;
1246 1.1 christos
1247 1.1 christos operand = s390_operands + *opindex_ptr;
1248 1.1 christos
1249 1.3 christos if ((opcode->flags & S390_INSTR_FLAG_OPTPARM) && *str == '\0')
1250 1.3 christos {
1251 1.3 christos /* Optional parameters might need to be ORed with a
1252 1.3 christos value so calling s390_insert_operand is needed. */
1253 1.3 christos s390_insert_operand (insn, operand, 0, NULL, 0);
1254 1.3 christos break;
1255 1.3 christos }
1256 1.3 christos
1257 1.1 christos if (skip_optional && (operand->flags & S390_OPERAND_INDEX))
1258 1.1 christos {
1259 1.1 christos /* We do an early skip. For D(X,B) constructions the index
1260 1.1 christos register is skipped (X is optional). For D(L,B) the base
1261 1.1 christos register will be the skipped operand, because L is NOT
1262 1.1 christos optional. */
1263 1.1 christos skip_optional = 0;
1264 1.1 christos continue;
1265 1.1 christos }
1266 1.1 christos
1267 1.1 christos /* Gather the operand. */
1268 1.1 christos hold = input_line_pointer;
1269 1.1 christos input_line_pointer = str;
1270 1.1 christos
1271 1.1 christos /* Parse the operand. */
1272 1.1 christos if (! register_name (&ex))
1273 1.1 christos expression (&ex);
1274 1.1 christos
1275 1.1 christos str = input_line_pointer;
1276 1.1 christos input_line_pointer = hold;
1277 1.1 christos
1278 1.1 christos /* Write the operand to the insn. */
1279 1.1 christos if (ex.X_op == O_illegal)
1280 1.1 christos as_bad (_("illegal operand"));
1281 1.1 christos else if (ex.X_op == O_absent)
1282 1.1 christos {
1283 1.1 christos /* No operands, check if all operands can be skipped. */
1284 1.1 christos while (*opindex_ptr != 0 && operand->flags & S390_OPERAND_OPTIONAL)
1285 1.1 christos {
1286 1.1 christos if (operand->flags & S390_OPERAND_DISP)
1287 1.1 christos {
1288 1.1 christos /* An optional displacement makes the whole D(X,B)
1289 1.1 christos D(L,B) or D(B) block optional. */
1290 1.1 christos do {
1291 1.1 christos operand = s390_operands + *(++opindex_ptr);
1292 1.1 christos } while (!(operand->flags & S390_OPERAND_BASE));
1293 1.1 christos }
1294 1.1 christos operand = s390_operands + *(++opindex_ptr);
1295 1.1 christos }
1296 1.1 christos if (opindex_ptr[0] == '\0')
1297 1.1 christos break;
1298 1.1 christos as_bad (_("missing operand"));
1299 1.1 christos }
1300 1.1 christos else if (ex.X_op == O_register || ex.X_op == O_constant)
1301 1.1 christos {
1302 1.1 christos s390_lit_suffix (&str, &ex, ELF_SUFFIX_NONE);
1303 1.1 christos
1304 1.1 christos if (ex.X_op != O_register && ex.X_op != O_constant)
1305 1.1 christos {
1306 1.1 christos /* We need to generate a fixup for the
1307 1.1 christos expression returned by s390_lit_suffix. */
1308 1.1 christos if (fc >= MAX_INSN_FIXUPS)
1309 1.1 christos as_fatal (_("too many fixups"));
1310 1.1 christos fixups[fc].exp = ex;
1311 1.1 christos fixups[fc].opindex = *opindex_ptr;
1312 1.1 christos fixups[fc].reloc = BFD_RELOC_UNUSED;
1313 1.1 christos ++fc;
1314 1.1 christos }
1315 1.1 christos else
1316 1.1 christos {
1317 1.3 christos if ((operand->flags & S390_OPERAND_LENGTH)
1318 1.3 christos && ex.X_op != O_constant)
1319 1.3 christos as_fatal (_("invalid length field specified"));
1320 1.1 christos if ((operand->flags & S390_OPERAND_INDEX)
1321 1.1 christos && ex.X_add_number == 0
1322 1.1 christos && warn_areg_zero)
1323 1.1 christos as_warn (_("index register specified but zero"));
1324 1.1 christos if ((operand->flags & S390_OPERAND_BASE)
1325 1.1 christos && ex.X_add_number == 0
1326 1.1 christos && warn_areg_zero)
1327 1.1 christos as_warn (_("base register specified but zero"));
1328 1.1 christos if ((operand->flags & S390_OPERAND_GPR)
1329 1.1 christos && (operand->flags & S390_OPERAND_REG_PAIR)
1330 1.1 christos && (ex.X_add_number & 1))
1331 1.1 christos as_fatal (_("odd numbered general purpose register specified as "
1332 1.1 christos "register pair"));
1333 1.1 christos if ((operand->flags & S390_OPERAND_FPR)
1334 1.1 christos && (operand->flags & S390_OPERAND_REG_PAIR)
1335 1.1 christos && ex.X_add_number != 0 && ex.X_add_number != 1
1336 1.1 christos && ex.X_add_number != 4 && ex.X_add_number != 5
1337 1.1 christos && ex.X_add_number != 8 && ex.X_add_number != 9
1338 1.1 christos && ex.X_add_number != 12 && ex.X_add_number != 13)
1339 1.1 christos as_fatal (_("invalid floating point register pair. Valid fp "
1340 1.1 christos "register pair operands are 0, 1, 4, 5, 8, 9, "
1341 1.1 christos "12 or 13."));
1342 1.1 christos s390_insert_operand (insn, operand, ex.X_add_number, NULL, 0);
1343 1.1 christos }
1344 1.1 christos }
1345 1.1 christos else
1346 1.1 christos {
1347 1.1 christos suffix = s390_elf_suffix (&str, &ex);
1348 1.1 christos suffix = s390_lit_suffix (&str, &ex, suffix);
1349 1.1 christos reloc = BFD_RELOC_UNUSED;
1350 1.1 christos
1351 1.1 christos if (suffix == ELF_SUFFIX_GOT)
1352 1.1 christos {
1353 1.1 christos if ((operand->flags & S390_OPERAND_DISP) &&
1354 1.1 christos (operand->bits == 12))
1355 1.1 christos reloc = BFD_RELOC_390_GOT12;
1356 1.1 christos else if ((operand->flags & S390_OPERAND_DISP) &&
1357 1.1 christos (operand->bits == 20))
1358 1.1 christos reloc = BFD_RELOC_390_GOT20;
1359 1.1 christos else if ((operand->flags & S390_OPERAND_SIGNED)
1360 1.1 christos && (operand->bits == 16))
1361 1.1 christos reloc = BFD_RELOC_390_GOT16;
1362 1.1 christos else if ((operand->flags & S390_OPERAND_PCREL)
1363 1.1 christos && (operand->bits == 32))
1364 1.1 christos reloc = BFD_RELOC_390_GOTENT;
1365 1.1 christos }
1366 1.1 christos else if (suffix == ELF_SUFFIX_PLT)
1367 1.1 christos {
1368 1.1 christos if ((operand->flags & S390_OPERAND_PCREL)
1369 1.3 christos && (operand->bits == 12))
1370 1.3 christos reloc = BFD_RELOC_390_PLT12DBL;
1371 1.3 christos else if ((operand->flags & S390_OPERAND_PCREL)
1372 1.3 christos && (operand->bits == 16))
1373 1.1 christos reloc = BFD_RELOC_390_PLT16DBL;
1374 1.1 christos else if ((operand->flags & S390_OPERAND_PCREL)
1375 1.3 christos && (operand->bits == 24))
1376 1.3 christos reloc = BFD_RELOC_390_PLT24DBL;
1377 1.3 christos else if ((operand->flags & S390_OPERAND_PCREL)
1378 1.1 christos && (operand->bits == 32))
1379 1.1 christos reloc = BFD_RELOC_390_PLT32DBL;
1380 1.1 christos }
1381 1.1 christos else if (suffix == ELF_SUFFIX_GOTENT)
1382 1.1 christos {
1383 1.1 christos if ((operand->flags & S390_OPERAND_PCREL)
1384 1.1 christos && (operand->bits == 32))
1385 1.1 christos reloc = BFD_RELOC_390_GOTENT;
1386 1.1 christos }
1387 1.1 christos else if (suffix == ELF_SUFFIX_GOTOFF)
1388 1.1 christos {
1389 1.1 christos if ((operand->flags & S390_OPERAND_SIGNED)
1390 1.1 christos && (operand->bits == 16))
1391 1.1 christos reloc = BFD_RELOC_16_GOTOFF;
1392 1.1 christos }
1393 1.1 christos else if (suffix == ELF_SUFFIX_PLTOFF)
1394 1.1 christos {
1395 1.1 christos if ((operand->flags & S390_OPERAND_SIGNED)
1396 1.1 christos && (operand->bits == 16))
1397 1.1 christos reloc = BFD_RELOC_390_PLTOFF16;
1398 1.1 christos }
1399 1.1 christos else if (suffix == ELF_SUFFIX_GOTPLT)
1400 1.1 christos {
1401 1.1 christos if ((operand->flags & S390_OPERAND_DISP)
1402 1.1 christos && (operand->bits == 12))
1403 1.1 christos reloc = BFD_RELOC_390_GOTPLT12;
1404 1.1 christos else if ((operand->flags & S390_OPERAND_SIGNED)
1405 1.1 christos && (operand->bits == 16))
1406 1.1 christos reloc = BFD_RELOC_390_GOTPLT16;
1407 1.1 christos else if ((operand->flags & S390_OPERAND_PCREL)
1408 1.1 christos && (operand->bits == 32))
1409 1.1 christos reloc = BFD_RELOC_390_GOTPLTENT;
1410 1.1 christos }
1411 1.1 christos else if (suffix == ELF_SUFFIX_TLS_GOTIE)
1412 1.1 christos {
1413 1.1 christos if ((operand->flags & S390_OPERAND_DISP)
1414 1.1 christos && (operand->bits == 12))
1415 1.1 christos reloc = BFD_RELOC_390_TLS_GOTIE12;
1416 1.1 christos else if ((operand->flags & S390_OPERAND_DISP)
1417 1.1 christos && (operand->bits == 20))
1418 1.1 christos reloc = BFD_RELOC_390_TLS_GOTIE20;
1419 1.1 christos }
1420 1.1 christos else if (suffix == ELF_SUFFIX_TLS_IE)
1421 1.1 christos {
1422 1.1 christos if ((operand->flags & S390_OPERAND_PCREL)
1423 1.1 christos && (operand->bits == 32))
1424 1.1 christos reloc = BFD_RELOC_390_TLS_IEENT;
1425 1.1 christos }
1426 1.1 christos
1427 1.1 christos if (suffix != ELF_SUFFIX_NONE && reloc == BFD_RELOC_UNUSED)
1428 1.1 christos as_bad (_("invalid operand suffix"));
1429 1.1 christos /* We need to generate a fixup of type 'reloc' for this
1430 1.1 christos expression. */
1431 1.1 christos if (fc >= MAX_INSN_FIXUPS)
1432 1.1 christos as_fatal (_("too many fixups"));
1433 1.1 christos fixups[fc].exp = ex;
1434 1.1 christos fixups[fc].opindex = *opindex_ptr;
1435 1.1 christos fixups[fc].reloc = reloc;
1436 1.1 christos ++fc;
1437 1.1 christos }
1438 1.1 christos
1439 1.1 christos /* Check the next character. The call to expression has advanced
1440 1.1 christos str past any whitespace. */
1441 1.1 christos if (operand->flags & S390_OPERAND_DISP)
1442 1.1 christos {
1443 1.1 christos /* After a displacement a block in parentheses can start. */
1444 1.1 christos if (*str != '(')
1445 1.1 christos {
1446 1.1 christos /* Check if parenthesized block can be skipped. If the next
1447 1.1 christos operand is neiter an optional operand nor a base register
1448 1.1 christos then we have a syntax error. */
1449 1.1 christos operand = s390_operands + *(++opindex_ptr);
1450 1.1 christos if (!(operand->flags & (S390_OPERAND_INDEX|S390_OPERAND_BASE)))
1451 1.1 christos as_bad (_("syntax error; missing '(' after displacement"));
1452 1.1 christos
1453 1.1 christos /* Ok, skip all operands until S390_OPERAND_BASE. */
1454 1.1 christos while (!(operand->flags & S390_OPERAND_BASE))
1455 1.1 christos operand = s390_operands + *(++opindex_ptr);
1456 1.1 christos
1457 1.1 christos /* If there is a next operand it must be separated by a comma. */
1458 1.1 christos if (opindex_ptr[1] != '\0')
1459 1.1 christos {
1460 1.1 christos if (*str != ',')
1461 1.1 christos {
1462 1.1 christos while (opindex_ptr[1] != '\0')
1463 1.1 christos {
1464 1.1 christos operand = s390_operands + *(++opindex_ptr);
1465 1.1 christos if (operand->flags & S390_OPERAND_OPTIONAL)
1466 1.1 christos continue;
1467 1.1 christos as_bad (_("syntax error; expected ,"));
1468 1.1 christos break;
1469 1.1 christos }
1470 1.1 christos }
1471 1.1 christos else
1472 1.1 christos str++;
1473 1.1 christos }
1474 1.1 christos }
1475 1.1 christos else
1476 1.1 christos {
1477 1.1 christos /* We found an opening parentheses. */
1478 1.1 christos str++;
1479 1.1 christos for (f = str; *f != '\0'; f++)
1480 1.1 christos if (*f == ',' || *f == ')')
1481 1.1 christos break;
1482 1.1 christos /* If there is no comma until the closing parentheses OR
1483 1.1 christos there is a comma right after the opening parentheses,
1484 1.1 christos we have to skip optional operands. */
1485 1.1 christos if (*f == ',' && f == str)
1486 1.1 christos {
1487 1.1 christos /* comma directly after '(' ? */
1488 1.1 christos skip_optional = 1;
1489 1.1 christos str++;
1490 1.1 christos }
1491 1.1 christos else
1492 1.1 christos skip_optional = (*f != ',');
1493 1.1 christos }
1494 1.1 christos }
1495 1.1 christos else if (operand->flags & S390_OPERAND_BASE)
1496 1.1 christos {
1497 1.1 christos /* After the base register the parenthesed block ends. */
1498 1.1 christos if (*str++ != ')')
1499 1.1 christos as_bad (_("syntax error; missing ')' after base register"));
1500 1.1 christos skip_optional = 0;
1501 1.1 christos /* If there is a next operand it must be separated by a comma. */
1502 1.1 christos if (opindex_ptr[1] != '\0')
1503 1.1 christos {
1504 1.1 christos if (*str != ',')
1505 1.1 christos {
1506 1.1 christos while (opindex_ptr[1] != '\0')
1507 1.1 christos {
1508 1.1 christos operand = s390_operands + *(++opindex_ptr);
1509 1.1 christos if (operand->flags & S390_OPERAND_OPTIONAL)
1510 1.1 christos continue;
1511 1.1 christos as_bad (_("syntax error; expected ,"));
1512 1.1 christos break;
1513 1.1 christos }
1514 1.1 christos }
1515 1.1 christos else
1516 1.1 christos str++;
1517 1.1 christos }
1518 1.1 christos }
1519 1.1 christos else
1520 1.1 christos {
1521 1.1 christos /* We can find an 'early' closing parentheses in e.g. D(L) instead
1522 1.1 christos of D(L,B). In this case the base register has to be skipped. */
1523 1.1 christos if (*str == ')')
1524 1.1 christos {
1525 1.1 christos operand = s390_operands + *(++opindex_ptr);
1526 1.1 christos
1527 1.1 christos if (!(operand->flags & S390_OPERAND_BASE))
1528 1.1 christos as_bad (_("syntax error; ')' not allowed here"));
1529 1.1 christos str++;
1530 1.1 christos }
1531 1.3 christos
1532 1.3 christos if ((opcode->flags & S390_INSTR_FLAG_OPTPARM) && *str == '\0')
1533 1.3 christos continue;
1534 1.3 christos
1535 1.1 christos /* If there is a next operand it must be separated by a comma. */
1536 1.1 christos if (opindex_ptr[1] != '\0')
1537 1.1 christos {
1538 1.1 christos if (*str != ',')
1539 1.1 christos {
1540 1.1 christos while (opindex_ptr[1] != '\0')
1541 1.1 christos {
1542 1.1 christos operand = s390_operands + *(++opindex_ptr);
1543 1.1 christos if (operand->flags & S390_OPERAND_OPTIONAL)
1544 1.1 christos continue;
1545 1.1 christos as_bad (_("syntax error; expected ,"));
1546 1.1 christos break;
1547 1.1 christos }
1548 1.1 christos }
1549 1.1 christos else
1550 1.1 christos str++;
1551 1.1 christos }
1552 1.1 christos }
1553 1.1 christos }
1554 1.1 christos
1555 1.1 christos while (ISSPACE (*str))
1556 1.1 christos ++str;
1557 1.1 christos
1558 1.1 christos /* Check for tls instruction marker. */
1559 1.1 christos reloc = s390_tls_suffix (&str, &ex);
1560 1.1 christos if (reloc != BFD_RELOC_UNUSED)
1561 1.1 christos {
1562 1.1 christos /* We need to generate a fixup of type 'reloc' for this
1563 1.1 christos instruction. */
1564 1.1 christos if (fc >= MAX_INSN_FIXUPS)
1565 1.1 christos as_fatal (_("too many fixups"));
1566 1.1 christos fixups[fc].exp = ex;
1567 1.1 christos fixups[fc].opindex = -1;
1568 1.1 christos fixups[fc].reloc = reloc;
1569 1.1 christos ++fc;
1570 1.1 christos }
1571 1.1 christos
1572 1.1 christos if (*str != '\0')
1573 1.1 christos {
1574 1.1 christos char *linefeed;
1575 1.1 christos
1576 1.1 christos if ((linefeed = strchr (str, '\n')) != NULL)
1577 1.1 christos *linefeed = '\0';
1578 1.1 christos as_bad (_("junk at end of line: `%s'"), str);
1579 1.1 christos if (linefeed != NULL)
1580 1.1 christos *linefeed = '\n';
1581 1.1 christos }
1582 1.1 christos
1583 1.1 christos /* Write out the instruction. */
1584 1.1 christos f = frag_more (opcode->oplen);
1585 1.1 christos memcpy (f, insn, opcode->oplen);
1586 1.1 christos dwarf2_emit_insn (opcode->oplen);
1587 1.1 christos
1588 1.1 christos /* Create any fixups. At this point we do not use a
1589 1.1 christos bfd_reloc_code_real_type, but instead just use the
1590 1.1 christos BFD_RELOC_UNUSED plus the operand index. This lets us easily
1591 1.1 christos handle fixups for any operand type, although that is admittedly
1592 1.1 christos not a very exciting feature. We pick a BFD reloc type in
1593 1.1 christos md_apply_fix. */
1594 1.1 christos for (i = 0; i < fc; i++)
1595 1.1 christos {
1596 1.1 christos
1597 1.1 christos if (fixups[i].opindex < 0)
1598 1.1 christos {
1599 1.1 christos /* Create tls instruction marker relocation. */
1600 1.1 christos fix_new_exp (frag_now, f - frag_now->fr_literal, opcode->oplen,
1601 1.1 christos &fixups[i].exp, 0, fixups[i].reloc);
1602 1.1 christos continue;
1603 1.1 christos }
1604 1.1 christos
1605 1.1 christos operand = s390_operands + fixups[i].opindex;
1606 1.1 christos
1607 1.1 christos if (fixups[i].reloc != BFD_RELOC_UNUSED)
1608 1.1 christos {
1609 1.1 christos reloc_howto_type *reloc_howto;
1610 1.1 christos fixS *fixP;
1611 1.1 christos int size;
1612 1.1 christos
1613 1.1 christos reloc_howto = bfd_reloc_type_lookup (stdoutput, fixups[i].reloc);
1614 1.1 christos if (!reloc_howto)
1615 1.1 christos abort ();
1616 1.1 christos
1617 1.3 christos size = ((reloc_howto->bitsize - 1) / 8) + 1;
1618 1.1 christos
1619 1.1 christos if (size < 1 || size > 4)
1620 1.1 christos abort ();
1621 1.1 christos
1622 1.1 christos fixP = fix_new_exp (frag_now,
1623 1.1 christos f - frag_now->fr_literal + (operand->shift/8),
1624 1.1 christos size, &fixups[i].exp, reloc_howto->pc_relative,
1625 1.1 christos fixups[i].reloc);
1626 1.1 christos /* Turn off overflow checking in fixup_segment. This is necessary
1627 1.1 christos because fixup_segment will signal an overflow for large 4 byte
1628 1.1 christos quantities for GOT12 relocations. */
1629 1.1 christos if ( fixups[i].reloc == BFD_RELOC_390_GOT12
1630 1.1 christos || fixups[i].reloc == BFD_RELOC_390_GOT20
1631 1.1 christos || fixups[i].reloc == BFD_RELOC_390_GOT16)
1632 1.1 christos fixP->fx_no_overflow = 1;
1633 1.1 christos }
1634 1.1 christos else
1635 1.1 christos fix_new_exp (frag_now, f - frag_now->fr_literal, 4, &fixups[i].exp,
1636 1.1 christos (operand->flags & S390_OPERAND_PCREL) != 0,
1637 1.1 christos ((bfd_reloc_code_real_type)
1638 1.1 christos (fixups[i].opindex + (int) BFD_RELOC_UNUSED)));
1639 1.1 christos }
1640 1.1 christos return str;
1641 1.1 christos }
1642 1.1 christos
1643 1.1 christos /* This routine is called for each instruction to be assembled. */
1644 1.1 christos
1645 1.1 christos void
1646 1.1 christos md_assemble (char *str)
1647 1.1 christos {
1648 1.1 christos const struct s390_opcode *opcode;
1649 1.1 christos unsigned char insn[6];
1650 1.1 christos char *s;
1651 1.1 christos
1652 1.1 christos /* Get the opcode. */
1653 1.1 christos for (s = str; *s != '\0' && ! ISSPACE (*s); s++)
1654 1.1 christos ;
1655 1.1 christos if (*s != '\0')
1656 1.1 christos *s++ = '\0';
1657 1.1 christos
1658 1.1 christos /* Look up the opcode in the hash table. */
1659 1.1 christos opcode = (struct s390_opcode *) hash_find (s390_opcode_hash, str);
1660 1.1 christos if (opcode == (const struct s390_opcode *) NULL)
1661 1.1 christos {
1662 1.1 christos as_bad (_("Unrecognized opcode: `%s'"), str);
1663 1.1 christos return;
1664 1.1 christos }
1665 1.1 christos else if (!(opcode->modes & current_mode_mask))
1666 1.1 christos {
1667 1.1 christos as_bad (_("Opcode %s not available in this mode"), str);
1668 1.1 christos return;
1669 1.1 christos }
1670 1.1 christos memcpy (insn, opcode->opcode, sizeof (insn));
1671 1.1 christos md_gather_operands (s, insn, opcode);
1672 1.1 christos }
1673 1.1 christos
1674 1.1 christos #ifndef WORKING_DOT_WORD
1675 1.1 christos /* Handle long and short jumps. We don't support these */
1676 1.1 christos void
1677 1.1 christos md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
1678 1.1 christos char *ptr;
1679 1.1 christos addressT from_addr, to_addr;
1680 1.1 christos fragS *frag;
1681 1.1 christos symbolS *to_symbol;
1682 1.1 christos {
1683 1.1 christos abort ();
1684 1.1 christos }
1685 1.1 christos
1686 1.1 christos void
1687 1.1 christos md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
1688 1.1 christos char *ptr;
1689 1.1 christos addressT from_addr, to_addr;
1690 1.1 christos fragS *frag;
1691 1.1 christos symbolS *to_symbol;
1692 1.1 christos {
1693 1.1 christos abort ();
1694 1.1 christos }
1695 1.1 christos #endif
1696 1.1 christos
1697 1.1 christos void
1698 1.1 christos s390_bss (int ignore ATTRIBUTE_UNUSED)
1699 1.1 christos {
1700 1.1 christos /* We don't support putting frags in the BSS segment, we fake it
1701 1.1 christos by marking in_bss, then looking at s_skip for clues. */
1702 1.1 christos
1703 1.1 christos subseg_set (bss_section, 0);
1704 1.1 christos demand_empty_rest_of_line ();
1705 1.1 christos }
1706 1.1 christos
1707 1.1 christos /* Pseudo-op handling. */
1708 1.1 christos
1709 1.1 christos void
1710 1.1 christos s390_insn (int ignore ATTRIBUTE_UNUSED)
1711 1.1 christos {
1712 1.1 christos expressionS exp;
1713 1.1 christos const struct s390_opcode *opformat;
1714 1.1 christos unsigned char insn[6];
1715 1.1 christos char *s;
1716 1.1 christos
1717 1.1 christos /* Get the opcode format. */
1718 1.1 christos s = input_line_pointer;
1719 1.1 christos while (*s != '\0' && *s != ',' && ! ISSPACE (*s))
1720 1.1 christos s++;
1721 1.1 christos if (*s != ',')
1722 1.1 christos as_bad (_("Invalid .insn format\n"));
1723 1.1 christos *s++ = '\0';
1724 1.1 christos
1725 1.1 christos /* Look up the opcode in the hash table. */
1726 1.1 christos opformat = (struct s390_opcode *)
1727 1.1 christos hash_find (s390_opformat_hash, input_line_pointer);
1728 1.1 christos if (opformat == (const struct s390_opcode *) NULL)
1729 1.1 christos {
1730 1.1 christos as_bad (_("Unrecognized opcode format: `%s'"), input_line_pointer);
1731 1.1 christos return;
1732 1.1 christos }
1733 1.1 christos input_line_pointer = s;
1734 1.1 christos expression (&exp);
1735 1.1 christos if (exp.X_op == O_constant)
1736 1.1 christos {
1737 1.1 christos if ( ( opformat->oplen == 6
1738 1.1 christos && (addressT) exp.X_add_number < (1ULL << 48))
1739 1.1 christos || ( opformat->oplen == 4
1740 1.1 christos && (addressT) exp.X_add_number < (1ULL << 32))
1741 1.1 christos || ( opformat->oplen == 2
1742 1.1 christos && (addressT) exp.X_add_number < (1ULL << 16)))
1743 1.1 christos md_number_to_chars ((char *) insn, exp.X_add_number, opformat->oplen);
1744 1.1 christos else
1745 1.1 christos as_bad (_("Invalid .insn format\n"));
1746 1.1 christos }
1747 1.1 christos else if (exp.X_op == O_big)
1748 1.1 christos {
1749 1.1 christos if (exp.X_add_number > 0
1750 1.1 christos && opformat->oplen == 6
1751 1.1 christos && generic_bignum[3] == 0)
1752 1.1 christos {
1753 1.1 christos md_number_to_chars ((char *) insn, generic_bignum[2], 2);
1754 1.1 christos md_number_to_chars ((char *) &insn[2], generic_bignum[1], 2);
1755 1.1 christos md_number_to_chars ((char *) &insn[4], generic_bignum[0], 2);
1756 1.1 christos }
1757 1.1 christos else
1758 1.1 christos as_bad (_("Invalid .insn format\n"));
1759 1.1 christos }
1760 1.1 christos else
1761 1.1 christos as_bad (_("second operand of .insn not a constant\n"));
1762 1.1 christos
1763 1.1 christos if (strcmp (opformat->name, "e") != 0 && *input_line_pointer++ != ',')
1764 1.1 christos as_bad (_("missing comma after insn constant\n"));
1765 1.1 christos
1766 1.1 christos if ((s = strchr (input_line_pointer, '\n')) != NULL)
1767 1.1 christos *s = '\0';
1768 1.1 christos input_line_pointer = md_gather_operands (input_line_pointer, insn,
1769 1.1 christos opformat);
1770 1.1 christos if (s != NULL)
1771 1.1 christos *s = '\n';
1772 1.1 christos demand_empty_rest_of_line ();
1773 1.1 christos }
1774 1.1 christos
1775 1.1 christos /* The .byte pseudo-op. This is similar to the normal .byte
1776 1.1 christos pseudo-op, but it can also take a single ASCII string. */
1777 1.1 christos
1778 1.1 christos static void
1779 1.1 christos s390_byte (int ignore ATTRIBUTE_UNUSED)
1780 1.1 christos {
1781 1.1 christos if (*input_line_pointer != '\"')
1782 1.1 christos {
1783 1.1 christos cons (1);
1784 1.1 christos return;
1785 1.1 christos }
1786 1.1 christos
1787 1.1 christos /* Gather characters. A real double quote is doubled. Unusual
1788 1.1 christos characters are not permitted. */
1789 1.1 christos ++input_line_pointer;
1790 1.1 christos while (1)
1791 1.1 christos {
1792 1.1 christos char c;
1793 1.1 christos
1794 1.1 christos c = *input_line_pointer++;
1795 1.1 christos
1796 1.1 christos if (c == '\"')
1797 1.1 christos {
1798 1.1 christos if (*input_line_pointer != '\"')
1799 1.1 christos break;
1800 1.1 christos ++input_line_pointer;
1801 1.1 christos }
1802 1.1 christos
1803 1.1 christos FRAG_APPEND_1_CHAR (c);
1804 1.1 christos }
1805 1.1 christos
1806 1.1 christos demand_empty_rest_of_line ();
1807 1.1 christos }
1808 1.1 christos
1809 1.1 christos /* The .ltorg pseudo-op.This emits all literals defined since the last
1810 1.1 christos .ltorg or the invocation of gas. Literals are defined with the
1811 1.1 christos @lit suffix. */
1812 1.1 christos
1813 1.1 christos static void
1814 1.1 christos s390_literals (int ignore ATTRIBUTE_UNUSED)
1815 1.1 christos {
1816 1.1 christos struct s390_lpe *lpe;
1817 1.1 christos
1818 1.1 christos if (lp_sym == NULL || lpe_count == 0)
1819 1.1 christos return; /* Nothing to be done. */
1820 1.1 christos
1821 1.1 christos /* Emit symbol for start of literal pool. */
1822 1.1 christos S_SET_SEGMENT (lp_sym, now_seg);
1823 1.1 christos S_SET_VALUE (lp_sym, (valueT) frag_now_fix ());
1824 1.1 christos lp_sym->sy_frag = frag_now;
1825 1.1 christos
1826 1.1 christos while (lpe_list)
1827 1.1 christos {
1828 1.1 christos lpe = lpe_list;
1829 1.1 christos lpe_list = lpe_list->next;
1830 1.1 christos S_SET_SEGMENT (lpe->sym, now_seg);
1831 1.1 christos S_SET_VALUE (lpe->sym, (valueT) frag_now_fix ());
1832 1.1 christos lpe->sym->sy_frag = frag_now;
1833 1.1 christos
1834 1.1 christos /* Emit literal pool entry. */
1835 1.1 christos if (lpe->reloc != BFD_RELOC_UNUSED)
1836 1.1 christos {
1837 1.1 christos reloc_howto_type *reloc_howto =
1838 1.1 christos bfd_reloc_type_lookup (stdoutput, lpe->reloc);
1839 1.1 christos int size = bfd_get_reloc_size (reloc_howto);
1840 1.1 christos char *where;
1841 1.1 christos
1842 1.1 christos if (size > lpe->nbytes)
1843 1.1 christos as_bad (_("%s relocations do not fit in %d bytes"),
1844 1.1 christos reloc_howto->name, lpe->nbytes);
1845 1.1 christos where = frag_more (lpe->nbytes);
1846 1.1 christos md_number_to_chars (where, 0, size);
1847 1.1 christos fix_new_exp (frag_now, where - frag_now->fr_literal,
1848 1.1 christos size, &lpe->ex, reloc_howto->pc_relative, lpe->reloc);
1849 1.1 christos }
1850 1.1 christos else
1851 1.1 christos {
1852 1.1 christos if (lpe->ex.X_op == O_big)
1853 1.1 christos {
1854 1.1 christos if (lpe->ex.X_add_number <= 0)
1855 1.1 christos generic_floating_point_number = lpe->floatnum;
1856 1.1 christos else
1857 1.1 christos memcpy (generic_bignum, lpe->bignum,
1858 1.1 christos lpe->ex.X_add_number * sizeof (LITTLENUM_TYPE));
1859 1.1 christos }
1860 1.1 christos emit_expr (&lpe->ex, lpe->nbytes);
1861 1.1 christos }
1862 1.1 christos
1863 1.1 christos lpe->next = lpe_free_list;
1864 1.1 christos lpe_free_list = lpe;
1865 1.1 christos }
1866 1.1 christos lpe_list_tail = NULL;
1867 1.1 christos lp_sym = NULL;
1868 1.1 christos lp_count++;
1869 1.1 christos lpe_count = 0;
1870 1.1 christos }
1871 1.1 christos
1872 1.3 christos #define MAX_HISTORY 100
1873 1.3 christos
1874 1.1 christos /* The .machine pseudo op allows to switch to a different CPU level in
1875 1.1 christos the asm listing. The current CPU setting can be stored on a stack
1876 1.3 christos with .machine push and restored with .machine pop. */
1877 1.1 christos
1878 1.1 christos static void
1879 1.1 christos s390_machine (int ignore ATTRIBUTE_UNUSED)
1880 1.1 christos {
1881 1.1 christos char *cpu_string;
1882 1.4.8.1 pgoyette static struct cpu_history
1883 1.3 christos {
1884 1.3 christos unsigned int cpu;
1885 1.3 christos unsigned int flags;
1886 1.3 christos } *cpu_history;
1887 1.1 christos static int curr_hist;
1888 1.1 christos
1889 1.1 christos SKIP_WHITESPACE ();
1890 1.1 christos
1891 1.1 christos if (*input_line_pointer == '"')
1892 1.1 christos {
1893 1.1 christos int len;
1894 1.1 christos cpu_string = demand_copy_C_string (&len);
1895 1.1 christos }
1896 1.1 christos else
1897 1.1 christos {
1898 1.1 christos char c;
1899 1.3 christos
1900 1.1 christos cpu_string = input_line_pointer;
1901 1.3 christos do
1902 1.3 christos {
1903 1.3 christos char * str;
1904 1.3 christos
1905 1.3 christos c = get_symbol_name (&str);
1906 1.3 christos c = restore_line_pointer (c);
1907 1.3 christos if (c == '+')
1908 1.3 christos ++ input_line_pointer;
1909 1.3 christos }
1910 1.3 christos while (c == '+');
1911 1.3 christos
1912 1.3 christos c = *input_line_pointer;
1913 1.3 christos *input_line_pointer = 0;
1914 1.1 christos cpu_string = xstrdup (cpu_string);
1915 1.3 christos (void) restore_line_pointer (c);
1916 1.1 christos }
1917 1.1 christos
1918 1.1 christos if (cpu_string != NULL)
1919 1.1 christos {
1920 1.3 christos unsigned int new_cpu = current_cpu;
1921 1.3 christos unsigned int new_flags = current_flags;
1922 1.1 christos
1923 1.1 christos if (strcmp (cpu_string, "push") == 0)
1924 1.1 christos {
1925 1.1 christos if (cpu_history == NULL)
1926 1.4.8.1 pgoyette cpu_history = XNEWVEC (struct cpu_history, MAX_HISTORY);
1927 1.1 christos
1928 1.1 christos if (curr_hist >= MAX_HISTORY)
1929 1.1 christos as_bad (_(".machine stack overflow"));
1930 1.1 christos else
1931 1.3 christos {
1932 1.3 christos cpu_history[curr_hist].cpu = current_cpu;
1933 1.3 christos cpu_history[curr_hist].flags = current_flags;
1934 1.3 christos curr_hist++;
1935 1.3 christos }
1936 1.1 christos }
1937 1.1 christos else if (strcmp (cpu_string, "pop") == 0)
1938 1.1 christos {
1939 1.1 christos if (curr_hist <= 0)
1940 1.1 christos as_bad (_(".machine stack underflow"));
1941 1.1 christos else
1942 1.3 christos {
1943 1.3 christos curr_hist--;
1944 1.3 christos new_cpu = cpu_history[curr_hist].cpu;
1945 1.3 christos new_flags = cpu_history[curr_hist].flags;
1946 1.3 christos }
1947 1.1 christos }
1948 1.1 christos else
1949 1.3 christos new_cpu = s390_parse_cpu (cpu_string, &new_flags, TRUE);
1950 1.3 christos
1951 1.3 christos if (new_cpu == S390_OPCODE_MAXCPU)
1952 1.1 christos as_bad (_("invalid machine `%s'"), cpu_string);
1953 1.1 christos
1954 1.3 christos if (new_cpu != current_cpu || new_flags != current_flags)
1955 1.3 christos {
1956 1.3 christos current_cpu = new_cpu;
1957 1.3 christos current_flags = new_flags;
1958 1.3 christos s390_setup_opcodes ();
1959 1.3 christos }
1960 1.3 christos }
1961 1.3 christos
1962 1.3 christos demand_empty_rest_of_line ();
1963 1.3 christos }
1964 1.3 christos
1965 1.3 christos /* The .machinemode pseudo op allows to switch to a different
1966 1.3 christos architecture mode in the asm listing. The current architecture
1967 1.3 christos mode setting can be stored on a stack with .machinemode push and
1968 1.3 christos restored with .machinemode pop. */
1969 1.3 christos
1970 1.3 christos static void
1971 1.3 christos s390_machinemode (int ignore ATTRIBUTE_UNUSED)
1972 1.3 christos {
1973 1.3 christos char *mode_string;
1974 1.3 christos static unsigned int *mode_history;
1975 1.3 christos static int curr_hist;
1976 1.3 christos
1977 1.3 christos SKIP_WHITESPACE ();
1978 1.3 christos
1979 1.3 christos {
1980 1.3 christos char c;
1981 1.3 christos
1982 1.3 christos c = get_symbol_name (&mode_string);
1983 1.3 christos mode_string = xstrdup (mode_string);
1984 1.3 christos (void) restore_line_pointer (c);
1985 1.3 christos }
1986 1.3 christos
1987 1.3 christos if (mode_string != NULL)
1988 1.3 christos {
1989 1.3 christos unsigned int old_mode_mask = current_mode_mask;
1990 1.3 christos char *p;
1991 1.3 christos
1992 1.3 christos for (p = mode_string; *p != 0; p++)
1993 1.3 christos *p = TOLOWER (*p);
1994 1.3 christos
1995 1.3 christos if (strcmp (mode_string, "push") == 0)
1996 1.3 christos {
1997 1.3 christos if (mode_history == NULL)
1998 1.4.8.1 pgoyette mode_history = XNEWVEC (unsigned int, MAX_HISTORY);
1999 1.3 christos
2000 1.3 christos if (curr_hist >= MAX_HISTORY)
2001 1.3 christos as_bad (_(".machinemode stack overflow"));
2002 1.3 christos else
2003 1.3 christos mode_history[curr_hist++] = current_mode_mask;
2004 1.3 christos }
2005 1.3 christos else if (strcmp (mode_string, "pop") == 0)
2006 1.3 christos {
2007 1.3 christos if (curr_hist <= 0)
2008 1.3 christos as_bad (_(".machinemode stack underflow"));
2009 1.3 christos else
2010 1.3 christos current_mode_mask = mode_history[--curr_hist];
2011 1.3 christos }
2012 1.3 christos else
2013 1.3 christos {
2014 1.3 christos if (strcmp (mode_string, "esa") == 0)
2015 1.3 christos current_mode_mask = 1 << S390_OPCODE_ESA;
2016 1.3 christos else if (strcmp (mode_string, "zarch") == 0)
2017 1.3 christos {
2018 1.3 christos if (s390_arch_size == 32)
2019 1.3 christos set_highgprs_p = TRUE;
2020 1.3 christos current_mode_mask = 1 << S390_OPCODE_ZARCH;
2021 1.3 christos }
2022 1.3 christos else if (strcmp (mode_string, "zarch_nohighgprs") == 0)
2023 1.3 christos current_mode_mask = 1 << S390_OPCODE_ZARCH;
2024 1.3 christos else
2025 1.3 christos as_bad (_("invalid machine mode `%s'"), mode_string);
2026 1.3 christos }
2027 1.3 christos
2028 1.3 christos if (current_mode_mask != old_mode_mask)
2029 1.1 christos s390_setup_opcodes ();
2030 1.1 christos }
2031 1.1 christos
2032 1.1 christos demand_empty_rest_of_line ();
2033 1.1 christos }
2034 1.1 christos
2035 1.3 christos #undef MAX_HISTORY
2036 1.3 christos
2037 1.4.8.1 pgoyette const char *
2038 1.1 christos md_atof (int type, char *litp, int *sizep)
2039 1.1 christos {
2040 1.1 christos return ieee_md_atof (type, litp, sizep, TRUE);
2041 1.1 christos }
2042 1.1 christos
2043 1.1 christos /* Align a section (I don't know why this is machine dependent). */
2044 1.1 christos
2045 1.1 christos valueT
2046 1.1 christos md_section_align (asection *seg, valueT addr)
2047 1.1 christos {
2048 1.1 christos int align = bfd_get_section_alignment (stdoutput, seg);
2049 1.1 christos
2050 1.3 christos return ((addr + (1 << align) - 1) & -(1 << align));
2051 1.1 christos }
2052 1.1 christos
2053 1.1 christos /* We don't have any form of relaxing. */
2054 1.1 christos
2055 1.1 christos int
2056 1.1 christos md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
2057 1.1 christos asection *seg ATTRIBUTE_UNUSED)
2058 1.1 christos {
2059 1.1 christos abort ();
2060 1.1 christos return 0;
2061 1.1 christos }
2062 1.1 christos
2063 1.1 christos /* Convert a machine dependent frag. We never generate these. */
2064 1.1 christos
2065 1.1 christos void
2066 1.1 christos md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
2067 1.1 christos asection *sec ATTRIBUTE_UNUSED,
2068 1.1 christos fragS *fragp ATTRIBUTE_UNUSED)
2069 1.1 christos {
2070 1.1 christos abort ();
2071 1.1 christos }
2072 1.1 christos
2073 1.1 christos symbolS *
2074 1.1 christos md_undefined_symbol (char *name)
2075 1.1 christos {
2076 1.1 christos if (*name == '_' && *(name + 1) == 'G'
2077 1.1 christos && strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0)
2078 1.1 christos {
2079 1.1 christos if (!GOT_symbol)
2080 1.1 christos {
2081 1.1 christos if (symbol_find (name))
2082 1.1 christos as_bad (_("GOT already in symbol table"));
2083 1.1 christos GOT_symbol = symbol_new (name, undefined_section,
2084 1.1 christos (valueT) 0, &zero_address_frag);
2085 1.1 christos }
2086 1.1 christos return GOT_symbol;
2087 1.1 christos }
2088 1.1 christos return 0;
2089 1.1 christos }
2090 1.1 christos
2091 1.1 christos /* Functions concerning relocs. */
2092 1.1 christos
2093 1.1 christos /* The location from which a PC relative jump should be calculated,
2094 1.1 christos given a PC relative reloc. */
2095 1.1 christos
2096 1.1 christos long
2097 1.1 christos md_pcrel_from_section (fixS *fixp, segT sec ATTRIBUTE_UNUSED)
2098 1.1 christos {
2099 1.1 christos return fixp->fx_frag->fr_address + fixp->fx_where;
2100 1.1 christos }
2101 1.1 christos
2102 1.1 christos /* Here we decide which fixups can be adjusted to make them relative to
2103 1.1 christos the beginning of the section instead of the symbol. Basically we need
2104 1.1 christos to make sure that the dynamic relocations are done correctly, so in
2105 1.1 christos some cases we force the original symbol to be used. */
2106 1.1 christos int
2107 1.1 christos tc_s390_fix_adjustable (fixS *fixP)
2108 1.1 christos {
2109 1.1 christos /* Don't adjust references to merge sections. */
2110 1.1 christos if ((S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0)
2111 1.1 christos return 0;
2112 1.1 christos /* adjust_reloc_syms doesn't know about the GOT. */
2113 1.1 christos if ( fixP->fx_r_type == BFD_RELOC_16_GOTOFF
2114 1.1 christos || fixP->fx_r_type == BFD_RELOC_32_GOTOFF
2115 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_GOTOFF64
2116 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_PLTOFF16
2117 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_PLTOFF32
2118 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_PLTOFF64
2119 1.3 christos || fixP->fx_r_type == BFD_RELOC_390_PLT12DBL
2120 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_PLT16DBL
2121 1.3 christos || fixP->fx_r_type == BFD_RELOC_390_PLT24DBL
2122 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_PLT32
2123 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_PLT32DBL
2124 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_PLT64
2125 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_GOT12
2126 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_GOT20
2127 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_GOT16
2128 1.1 christos || fixP->fx_r_type == BFD_RELOC_32_GOT_PCREL
2129 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_GOT64
2130 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_GOTENT
2131 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_GOTPLT12
2132 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_GOTPLT16
2133 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_GOTPLT20
2134 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_GOTPLT32
2135 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_GOTPLT64
2136 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_GOTPLTENT
2137 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_LOAD
2138 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_GDCALL
2139 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_LDCALL
2140 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_GD32
2141 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_GD64
2142 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_GOTIE12
2143 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_GOTIE20
2144 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_GOTIE32
2145 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_GOTIE64
2146 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_LDM32
2147 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_LDM64
2148 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_IE32
2149 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_IE64
2150 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_IEENT
2151 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_LE32
2152 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_LE64
2153 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_LDO32
2154 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_LDO64
2155 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_DTPMOD
2156 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_DTPOFF
2157 1.1 christos || fixP->fx_r_type == BFD_RELOC_390_TLS_TPOFF
2158 1.1 christos || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2159 1.1 christos || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2160 1.1 christos return 0;
2161 1.1 christos return 1;
2162 1.1 christos }
2163 1.1 christos
2164 1.1 christos /* Return true if we must always emit a reloc for a type and false if
2165 1.1 christos there is some hope of resolving it at assembly time. */
2166 1.1 christos int
2167 1.1 christos tc_s390_force_relocation (struct fix *fixp)
2168 1.1 christos {
2169 1.1 christos /* Ensure we emit a relocation for every reference to the global
2170 1.1 christos offset table or to the procedure link table. */
2171 1.1 christos switch (fixp->fx_r_type)
2172 1.1 christos {
2173 1.1 christos case BFD_RELOC_390_GOT12:
2174 1.1 christos case BFD_RELOC_390_GOT20:
2175 1.1 christos case BFD_RELOC_32_GOT_PCREL:
2176 1.1 christos case BFD_RELOC_32_GOTOFF:
2177 1.1 christos case BFD_RELOC_390_GOTOFF64:
2178 1.1 christos case BFD_RELOC_390_PLTOFF16:
2179 1.1 christos case BFD_RELOC_390_PLTOFF32:
2180 1.1 christos case BFD_RELOC_390_PLTOFF64:
2181 1.1 christos case BFD_RELOC_390_GOTPC:
2182 1.1 christos case BFD_RELOC_390_GOT16:
2183 1.1 christos case BFD_RELOC_390_GOTPCDBL:
2184 1.1 christos case BFD_RELOC_390_GOT64:
2185 1.1 christos case BFD_RELOC_390_GOTENT:
2186 1.1 christos case BFD_RELOC_390_PLT32:
2187 1.3 christos case BFD_RELOC_390_PLT12DBL:
2188 1.1 christos case BFD_RELOC_390_PLT16DBL:
2189 1.3 christos case BFD_RELOC_390_PLT24DBL:
2190 1.1 christos case BFD_RELOC_390_PLT32DBL:
2191 1.1 christos case BFD_RELOC_390_PLT64:
2192 1.1 christos case BFD_RELOC_390_GOTPLT12:
2193 1.1 christos case BFD_RELOC_390_GOTPLT16:
2194 1.1 christos case BFD_RELOC_390_GOTPLT20:
2195 1.1 christos case BFD_RELOC_390_GOTPLT32:
2196 1.1 christos case BFD_RELOC_390_GOTPLT64:
2197 1.1 christos case BFD_RELOC_390_GOTPLTENT:
2198 1.1 christos return 1;
2199 1.1 christos default:
2200 1.3 christos break;
2201 1.1 christos }
2202 1.1 christos
2203 1.1 christos return generic_force_reloc (fixp);
2204 1.1 christos }
2205 1.1 christos
2206 1.1 christos /* Apply a fixup to the object code. This is called for all the
2207 1.1 christos fixups we generated by the call to fix_new_exp, above. In the call
2208 1.1 christos above we used a reloc code which was the largest legal reloc code
2209 1.1 christos plus the operand index. Here we undo that to recover the operand
2210 1.1 christos index. At this point all symbol values should be fully resolved,
2211 1.1 christos and we attempt to completely resolve the reloc. If we can not do
2212 1.1 christos that, we determine the correct reloc code and put it back in the
2213 1.1 christos fixup. */
2214 1.1 christos
2215 1.1 christos void
2216 1.1 christos md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
2217 1.1 christos {
2218 1.1 christos char *where;
2219 1.1 christos valueT value = *valP;
2220 1.1 christos
2221 1.1 christos where = fixP->fx_frag->fr_literal + fixP->fx_where;
2222 1.1 christos
2223 1.1 christos if (fixP->fx_subsy != NULL)
2224 1.1 christos as_bad_where (fixP->fx_file, fixP->fx_line,
2225 1.1 christos _("cannot emit relocation %s against subsy symbol %s"),
2226 1.1 christos bfd_get_reloc_code_name (fixP->fx_r_type),
2227 1.1 christos S_GET_NAME (fixP->fx_subsy));
2228 1.1 christos
2229 1.1 christos if (fixP->fx_addsy != NULL)
2230 1.1 christos {
2231 1.1 christos if (fixP->fx_pcrel)
2232 1.1 christos value += fixP->fx_frag->fr_address + fixP->fx_where;
2233 1.1 christos }
2234 1.1 christos else
2235 1.1 christos fixP->fx_done = 1;
2236 1.1 christos
2237 1.1 christos if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
2238 1.1 christos {
2239 1.1 christos const struct s390_operand *operand;
2240 1.1 christos int opindex;
2241 1.1 christos
2242 1.1 christos opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
2243 1.1 christos operand = &s390_operands[opindex];
2244 1.1 christos
2245 1.1 christos if (fixP->fx_done)
2246 1.1 christos {
2247 1.1 christos /* Insert the fully resolved operand value. */
2248 1.1 christos s390_insert_operand ((unsigned char *) where, operand,
2249 1.1 christos (offsetT) value, fixP->fx_file, fixP->fx_line);
2250 1.1 christos return;
2251 1.1 christos }
2252 1.1 christos
2253 1.1 christos /* Determine a BFD reloc value based on the operand information.
2254 1.1 christos We are only prepared to turn a few of the operands into
2255 1.1 christos relocs. */
2256 1.1 christos fixP->fx_offset = value;
2257 1.1 christos if (operand->bits == 12 && operand->shift == 20)
2258 1.1 christos {
2259 1.1 christos fixP->fx_size = 2;
2260 1.1 christos fixP->fx_where += 2;
2261 1.1 christos fixP->fx_r_type = BFD_RELOC_390_12;
2262 1.1 christos }
2263 1.1 christos else if (operand->bits == 12 && operand->shift == 36)
2264 1.1 christos {
2265 1.1 christos fixP->fx_size = 2;
2266 1.1 christos fixP->fx_where += 4;
2267 1.1 christos fixP->fx_r_type = BFD_RELOC_390_12;
2268 1.1 christos }
2269 1.1 christos else if (operand->bits == 20 && operand->shift == 20)
2270 1.1 christos {
2271 1.1 christos fixP->fx_size = 2;
2272 1.1 christos fixP->fx_where += 2;
2273 1.1 christos fixP->fx_r_type = BFD_RELOC_390_20;
2274 1.1 christos }
2275 1.1 christos else if (operand->bits == 8 && operand->shift == 8)
2276 1.1 christos {
2277 1.1 christos fixP->fx_size = 1;
2278 1.1 christos fixP->fx_where += 1;
2279 1.1 christos fixP->fx_r_type = BFD_RELOC_8;
2280 1.1 christos }
2281 1.3 christos else if (operand->bits == 12 && operand->shift == 12
2282 1.3 christos && (operand->flags & S390_OPERAND_PCREL))
2283 1.3 christos {
2284 1.3 christos fixP->fx_size = 2;
2285 1.3 christos fixP->fx_where += 1;
2286 1.3 christos fixP->fx_offset += 1;
2287 1.3 christos fixP->fx_r_type = BFD_RELOC_390_PC12DBL;
2288 1.3 christos }
2289 1.1 christos else if (operand->bits == 16 && operand->shift == 16)
2290 1.1 christos {
2291 1.1 christos fixP->fx_size = 2;
2292 1.1 christos fixP->fx_where += 2;
2293 1.1 christos if (operand->flags & S390_OPERAND_PCREL)
2294 1.1 christos {
2295 1.1 christos fixP->fx_r_type = BFD_RELOC_390_PC16DBL;
2296 1.1 christos fixP->fx_offset += 2;
2297 1.1 christos }
2298 1.1 christos else
2299 1.1 christos fixP->fx_r_type = BFD_RELOC_16;
2300 1.1 christos }
2301 1.3 christos else if (operand->bits == 24 && operand->shift == 24
2302 1.3 christos && (operand->flags & S390_OPERAND_PCREL))
2303 1.3 christos {
2304 1.3 christos fixP->fx_size = 3;
2305 1.3 christos fixP->fx_where += 3;
2306 1.3 christos fixP->fx_offset += 3;
2307 1.3 christos fixP->fx_r_type = BFD_RELOC_390_PC24DBL;
2308 1.3 christos }
2309 1.1 christos else if (operand->bits == 32 && operand->shift == 16
2310 1.1 christos && (operand->flags & S390_OPERAND_PCREL))
2311 1.1 christos {
2312 1.1 christos fixP->fx_size = 4;
2313 1.1 christos fixP->fx_where += 2;
2314 1.1 christos fixP->fx_offset += 2;
2315 1.1 christos fixP->fx_r_type = BFD_RELOC_390_PC32DBL;
2316 1.1 christos }
2317 1.1 christos else
2318 1.1 christos {
2319 1.4.8.1 pgoyette const char *sfile;
2320 1.1 christos unsigned int sline;
2321 1.1 christos
2322 1.1 christos /* Use expr_symbol_where to see if this is an expression
2323 1.1 christos symbol. */
2324 1.1 christos if (expr_symbol_where (fixP->fx_addsy, &sfile, &sline))
2325 1.1 christos as_bad_where (fixP->fx_file, fixP->fx_line,
2326 1.1 christos _("unresolved expression that must be resolved"));
2327 1.1 christos else
2328 1.1 christos as_bad_where (fixP->fx_file, fixP->fx_line,
2329 1.1 christos _("unsupported relocation type"));
2330 1.1 christos fixP->fx_done = 1;
2331 1.1 christos return;
2332 1.1 christos }
2333 1.1 christos }
2334 1.1 christos else
2335 1.1 christos {
2336 1.1 christos switch (fixP->fx_r_type)
2337 1.1 christos {
2338 1.1 christos case BFD_RELOC_8:
2339 1.1 christos if (fixP->fx_pcrel)
2340 1.1 christos abort ();
2341 1.1 christos if (fixP->fx_done)
2342 1.1 christos md_number_to_chars (where, value, 1);
2343 1.1 christos break;
2344 1.1 christos case BFD_RELOC_390_12:
2345 1.1 christos case BFD_RELOC_390_GOT12:
2346 1.1 christos case BFD_RELOC_390_GOTPLT12:
2347 1.3 christos case BFD_RELOC_390_PC12DBL:
2348 1.3 christos case BFD_RELOC_390_PLT12DBL:
2349 1.3 christos if (fixP->fx_pcrel)
2350 1.3 christos value++;
2351 1.3 christos
2352 1.1 christos if (fixP->fx_done)
2353 1.1 christos {
2354 1.1 christos unsigned short mop;
2355 1.1 christos
2356 1.3 christos if (fixP->fx_pcrel)
2357 1.3 christos value >>= 1;
2358 1.3 christos
2359 1.1 christos mop = bfd_getb16 ((unsigned char *) where);
2360 1.1 christos mop |= (unsigned short) (value & 0xfff);
2361 1.1 christos bfd_putb16 ((bfd_vma) mop, (unsigned char *) where);
2362 1.1 christos }
2363 1.1 christos break;
2364 1.1 christos
2365 1.1 christos case BFD_RELOC_390_20:
2366 1.1 christos case BFD_RELOC_390_GOT20:
2367 1.1 christos case BFD_RELOC_390_GOTPLT20:
2368 1.1 christos if (fixP->fx_done)
2369 1.1 christos {
2370 1.1 christos unsigned int mop;
2371 1.1 christos mop = bfd_getb32 ((unsigned char *) where);
2372 1.1 christos mop |= (unsigned int) ((value & 0xfff) << 8 |
2373 1.1 christos (value & 0xff000) >> 12);
2374 1.1 christos bfd_putb32 ((bfd_vma) mop, (unsigned char *) where);
2375 1.3 christos }
2376 1.1 christos break;
2377 1.1 christos
2378 1.1 christos case BFD_RELOC_16:
2379 1.1 christos case BFD_RELOC_GPREL16:
2380 1.1 christos case BFD_RELOC_16_GOT_PCREL:
2381 1.1 christos case BFD_RELOC_16_GOTOFF:
2382 1.1 christos if (fixP->fx_pcrel)
2383 1.1 christos as_bad_where (fixP->fx_file, fixP->fx_line,
2384 1.1 christos _("cannot emit PC relative %s relocation%s%s"),
2385 1.1 christos bfd_get_reloc_code_name (fixP->fx_r_type),
2386 1.1 christos fixP->fx_addsy != NULL ? " against " : "",
2387 1.1 christos (fixP->fx_addsy != NULL
2388 1.1 christos ? S_GET_NAME (fixP->fx_addsy)
2389 1.1 christos : ""));
2390 1.1 christos if (fixP->fx_done)
2391 1.1 christos md_number_to_chars (where, value, 2);
2392 1.1 christos break;
2393 1.1 christos case BFD_RELOC_390_GOT16:
2394 1.1 christos case BFD_RELOC_390_PLTOFF16:
2395 1.1 christos case BFD_RELOC_390_GOTPLT16:
2396 1.1 christos if (fixP->fx_done)
2397 1.1 christos md_number_to_chars (where, value, 2);
2398 1.1 christos break;
2399 1.1 christos case BFD_RELOC_390_PC16DBL:
2400 1.1 christos case BFD_RELOC_390_PLT16DBL:
2401 1.1 christos value += 2;
2402 1.1 christos if (fixP->fx_done)
2403 1.1 christos md_number_to_chars (where, (offsetT) value >> 1, 2);
2404 1.1 christos break;
2405 1.1 christos
2406 1.3 christos case BFD_RELOC_390_PC24DBL:
2407 1.3 christos case BFD_RELOC_390_PLT24DBL:
2408 1.3 christos value += 3;
2409 1.3 christos if (fixP->fx_done)
2410 1.3 christos {
2411 1.3 christos unsigned int mop;
2412 1.3 christos value >>= 1;
2413 1.3 christos
2414 1.3 christos mop = bfd_getb32 ((unsigned char *) where - 1);
2415 1.3 christos mop |= (unsigned int) (value & 0xffffff);
2416 1.3 christos bfd_putb32 ((bfd_vma) mop, (unsigned char *) where - 1);
2417 1.3 christos }
2418 1.3 christos break;
2419 1.3 christos
2420 1.1 christos case BFD_RELOC_32:
2421 1.1 christos if (fixP->fx_pcrel)
2422 1.1 christos fixP->fx_r_type = BFD_RELOC_32_PCREL;
2423 1.1 christos else
2424 1.1 christos fixP->fx_r_type = BFD_RELOC_32;
2425 1.1 christos if (fixP->fx_done)
2426 1.1 christos md_number_to_chars (where, value, 4);
2427 1.1 christos break;
2428 1.1 christos case BFD_RELOC_32_PCREL:
2429 1.1 christos case BFD_RELOC_32_BASEREL:
2430 1.1 christos fixP->fx_r_type = BFD_RELOC_32_PCREL;
2431 1.1 christos if (fixP->fx_done)
2432 1.1 christos md_number_to_chars (where, value, 4);
2433 1.1 christos break;
2434 1.1 christos case BFD_RELOC_32_GOT_PCREL:
2435 1.1 christos case BFD_RELOC_390_PLTOFF32:
2436 1.1 christos case BFD_RELOC_390_PLT32:
2437 1.1 christos case BFD_RELOC_390_GOTPLT32:
2438 1.1 christos if (fixP->fx_done)
2439 1.1 christos md_number_to_chars (where, value, 4);
2440 1.1 christos break;
2441 1.1 christos case BFD_RELOC_390_PC32DBL:
2442 1.1 christos case BFD_RELOC_390_PLT32DBL:
2443 1.1 christos case BFD_RELOC_390_GOTPCDBL:
2444 1.1 christos case BFD_RELOC_390_GOTENT:
2445 1.1 christos case BFD_RELOC_390_GOTPLTENT:
2446 1.1 christos value += 2;
2447 1.1 christos if (fixP->fx_done)
2448 1.1 christos md_number_to_chars (where, (offsetT) value >> 1, 4);
2449 1.1 christos break;
2450 1.1 christos
2451 1.1 christos case BFD_RELOC_32_GOTOFF:
2452 1.1 christos if (fixP->fx_done)
2453 1.1 christos md_number_to_chars (where, value, sizeof (int));
2454 1.1 christos break;
2455 1.1 christos
2456 1.1 christos case BFD_RELOC_390_GOTOFF64:
2457 1.1 christos if (fixP->fx_done)
2458 1.1 christos md_number_to_chars (where, value, 8);
2459 1.1 christos break;
2460 1.1 christos
2461 1.1 christos case BFD_RELOC_390_GOT64:
2462 1.1 christos case BFD_RELOC_390_PLTOFF64:
2463 1.1 christos case BFD_RELOC_390_PLT64:
2464 1.1 christos case BFD_RELOC_390_GOTPLT64:
2465 1.1 christos if (fixP->fx_done)
2466 1.1 christos md_number_to_chars (where, value, 8);
2467 1.1 christos break;
2468 1.1 christos
2469 1.1 christos case BFD_RELOC_64:
2470 1.1 christos if (fixP->fx_pcrel)
2471 1.1 christos fixP->fx_r_type = BFD_RELOC_64_PCREL;
2472 1.1 christos else
2473 1.1 christos fixP->fx_r_type = BFD_RELOC_64;
2474 1.1 christos if (fixP->fx_done)
2475 1.1 christos md_number_to_chars (where, value, 8);
2476 1.1 christos break;
2477 1.1 christos
2478 1.1 christos case BFD_RELOC_64_PCREL:
2479 1.1 christos fixP->fx_r_type = BFD_RELOC_64_PCREL;
2480 1.1 christos if (fixP->fx_done)
2481 1.1 christos md_number_to_chars (where, value, 8);
2482 1.1 christos break;
2483 1.1 christos
2484 1.1 christos case BFD_RELOC_VTABLE_INHERIT:
2485 1.1 christos case BFD_RELOC_VTABLE_ENTRY:
2486 1.1 christos fixP->fx_done = 0;
2487 1.1 christos return;
2488 1.1 christos
2489 1.1 christos case BFD_RELOC_390_TLS_LOAD:
2490 1.1 christos case BFD_RELOC_390_TLS_GDCALL:
2491 1.1 christos case BFD_RELOC_390_TLS_LDCALL:
2492 1.1 christos case BFD_RELOC_390_TLS_GD32:
2493 1.1 christos case BFD_RELOC_390_TLS_GD64:
2494 1.1 christos case BFD_RELOC_390_TLS_GOTIE12:
2495 1.1 christos case BFD_RELOC_390_TLS_GOTIE20:
2496 1.1 christos case BFD_RELOC_390_TLS_GOTIE32:
2497 1.1 christos case BFD_RELOC_390_TLS_GOTIE64:
2498 1.1 christos case BFD_RELOC_390_TLS_LDM32:
2499 1.1 christos case BFD_RELOC_390_TLS_LDM64:
2500 1.1 christos case BFD_RELOC_390_TLS_IE32:
2501 1.1 christos case BFD_RELOC_390_TLS_IE64:
2502 1.1 christos case BFD_RELOC_390_TLS_LE32:
2503 1.1 christos case BFD_RELOC_390_TLS_LE64:
2504 1.1 christos case BFD_RELOC_390_TLS_LDO32:
2505 1.1 christos case BFD_RELOC_390_TLS_LDO64:
2506 1.1 christos case BFD_RELOC_390_TLS_DTPMOD:
2507 1.1 christos case BFD_RELOC_390_TLS_DTPOFF:
2508 1.1 christos case BFD_RELOC_390_TLS_TPOFF:
2509 1.1 christos S_SET_THREAD_LOCAL (fixP->fx_addsy);
2510 1.1 christos /* Fully resolved at link time. */
2511 1.1 christos break;
2512 1.1 christos case BFD_RELOC_390_TLS_IEENT:
2513 1.1 christos /* Fully resolved at link time. */
2514 1.1 christos S_SET_THREAD_LOCAL (fixP->fx_addsy);
2515 1.1 christos value += 2;
2516 1.1 christos break;
2517 1.1 christos
2518 1.1 christos default:
2519 1.1 christos {
2520 1.1 christos const char *reloc_name = bfd_get_reloc_code_name (fixP->fx_r_type);
2521 1.1 christos
2522 1.1 christos if (reloc_name != NULL)
2523 1.1 christos as_fatal (_("Gas failure, reloc type %s\n"), reloc_name);
2524 1.1 christos else
2525 1.1 christos as_fatal (_("Gas failure, reloc type #%i\n"), fixP->fx_r_type);
2526 1.1 christos }
2527 1.1 christos }
2528 1.1 christos
2529 1.1 christos fixP->fx_offset = value;
2530 1.1 christos }
2531 1.1 christos }
2532 1.1 christos
2533 1.1 christos /* Generate a reloc for a fixup. */
2534 1.1 christos
2535 1.1 christos arelent *
2536 1.1 christos tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
2537 1.1 christos {
2538 1.1 christos bfd_reloc_code_real_type code;
2539 1.1 christos arelent *reloc;
2540 1.1 christos
2541 1.1 christos code = fixp->fx_r_type;
2542 1.1 christos if (GOT_symbol && fixp->fx_addsy == GOT_symbol)
2543 1.1 christos {
2544 1.1 christos if ( (s390_arch_size == 32 && code == BFD_RELOC_32_PCREL)
2545 1.1 christos || (s390_arch_size == 64 && code == BFD_RELOC_64_PCREL))
2546 1.1 christos code = BFD_RELOC_390_GOTPC;
2547 1.1 christos if (code == BFD_RELOC_390_PC32DBL)
2548 1.1 christos code = BFD_RELOC_390_GOTPCDBL;
2549 1.1 christos }
2550 1.1 christos
2551 1.4.8.1 pgoyette reloc = XNEW (arelent);
2552 1.4.8.1 pgoyette reloc->sym_ptr_ptr = XNEW (asymbol *);
2553 1.1 christos *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2554 1.1 christos reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2555 1.1 christos reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
2556 1.1 christos if (reloc->howto == NULL)
2557 1.1 christos {
2558 1.1 christos as_bad_where (fixp->fx_file, fixp->fx_line,
2559 1.1 christos _("cannot represent relocation type %s"),
2560 1.1 christos bfd_get_reloc_code_name (code));
2561 1.1 christos /* Set howto to a garbage value so that we can keep going. */
2562 1.1 christos reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
2563 1.1 christos gas_assert (reloc->howto != NULL);
2564 1.1 christos }
2565 1.1 christos reloc->addend = fixp->fx_offset;
2566 1.1 christos
2567 1.1 christos return reloc;
2568 1.1 christos }
2569 1.1 christos
2570 1.1 christos void
2571 1.1 christos s390_cfi_frame_initial_instructions (void)
2572 1.1 christos {
2573 1.1 christos cfi_add_CFA_def_cfa (15, s390_arch_size == 64 ? 160 : 96);
2574 1.1 christos }
2575 1.1 christos
2576 1.1 christos int
2577 1.1 christos tc_s390_regname_to_dw2regnum (char *regname)
2578 1.1 christos {
2579 1.1 christos int regnum = -1;
2580 1.1 christos
2581 1.1 christos if (regname[0] != 'c' && regname[0] != 'a')
2582 1.1 christos {
2583 1.3 christos regnum = reg_name_search (regname);
2584 1.1 christos if (regname[0] == 'f' && regnum != -1)
2585 1.1 christos regnum += 16;
2586 1.1 christos }
2587 1.1 christos else if (strcmp (regname, "ap") == 0)
2588 1.1 christos regnum = 32;
2589 1.1 christos else if (strcmp (regname, "cc") == 0)
2590 1.1 christos regnum = 33;
2591 1.1 christos return regnum;
2592 1.1 christos }
2593 1.1 christos
2594 1.1 christos void
2595 1.1 christos s390_elf_final_processing (void)
2596 1.1 christos {
2597 1.3 christos if (set_highgprs_p)
2598 1.1 christos elf_elfheader (stdoutput)->e_flags |= EF_S390_HIGH_GPRS;
2599 1.1 christos }
2600