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