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