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