[AArch64][PATCH 11/14] Add support for the 2H vector type.
[deliverable/binutils-gdb.git] / gas / config / tc-i370.c
CommitLineData
5b93d8bb
AM
1/* tc-i370.c -- Assembler for the IBM 360/370/390 instruction set.
2 Loosely based on the ppc files by Linas Vepstas <linas@linas.org> 1998, 99
b90efa5b 3 Copyright (C) 1994-2015 Free Software Foundation, Inc.
5b93d8bb
AM
4 Written by Ian Lance Taylor, Cygnus Support.
5
6 This file is part of GAS, the GNU Assembler.
7
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
ec2655a6 10 the Free Software Foundation; either version 3, or (at your option)
5b93d8bb
AM
11 any later version.
12
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
4b4da160
NC
20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 02110-1301, USA. */
5b93d8bb
AM
22
23/* This assembler implements a very hacked version of an elf-like thing
ea1562b3
NC
24 that gcc emits (when gcc is suitably hacked). To make it behave more
25 HLASM-like, try turning on the -M or --mri flag (as there are various
26 similarities between HLASM and the MRI assemblers, such as section
27 names, lack of leading . in pseudo-ops, DC and DS, etc. */
5b93d8bb 28
5b93d8bb 29#include "as.h"
44addf7f 30#include "safe-ctype.h"
5b93d8bb
AM
31#include "subsegs.h"
32#include "struc-symbol.h"
33
34#include "opcode/i370.h"
35
36#ifdef OBJ_ELF
37#include "elf/i370.h"
38#endif
39
ea1562b3 40/* This is the assembler for the System/390 Architecture. */
5b93d8bb
AM
41
42/* Tell the main code what the endianness is. */
43extern int target_big_endian;
44
45\f
46/* Generic assembler global variables which must be defined by all
47 targets. */
48
49#ifdef OBJ_ELF
50/* This string holds the chars that always start a comment. If the
51 pre-processor is disabled, these aren't very useful. The macro
52 tc_comment_chars points to this. We use this, rather than the
53 usual comment_chars, so that we can switch for Solaris conventions. */
54static const char i370_eabi_comment_chars[] = "#";
55
56const char *i370_comment_chars = i370_eabi_comment_chars;
57#else
58const char comment_chars[] = "#";
59#endif
60
61/* Characters which start a comment at the beginning of a line. */
62const char line_comment_chars[] = "#*";
63
64/* Characters which may be used to separate multiple commands on a
65 single line. */
66const char line_separator_chars[] = ";";
67
68/* Characters which are used to indicate an exponent in a floating
69 point number. */
70const char EXP_CHARS[] = "eE";
71
72/* Characters which mean that a number is a floating point constant,
73 as in 0d1.0. */
74const char FLT_CHARS[] = "dD";
75
5b93d8bb 76void
ea1562b3 77md_show_usage (FILE *stream)
5b93d8bb 78{
bc805888 79 fprintf (stream, "\
5b93d8bb
AM
80S/370 options: (these have not yet been tested and may not work) \n\
81-u ignored\n\
82-mregnames Allow symbolic names for registers\n\
83-mno-regnames Do not allow symbolic names for registers\n");
84#ifdef OBJ_ELF
bc805888 85 fprintf (stream, "\
5b93d8bb
AM
86-mrelocatable support for GCC's -mrelocatble option\n\
87-mrelocatable-lib support for GCC's -mrelocatble-lib option\n\
88-V print assembler version number\n");
89#endif
90}
91
5b93d8bb 92/* Whether to use user friendly register names. */
b34976b6 93#define TARGET_REG_NAMES_P TRUE
5b93d8bb 94
b34976b6 95static bfd_boolean reg_names_p = TARGET_REG_NAMES_P;
5b93d8bb 96
5b93d8bb 97\f
ea1562b3
NC
98/* Predefined register names if -mregnames
99 In general, there are lots of them, in an attempt to be compatible
100 with a number of assemblers. */
5b93d8bb
AM
101
102/* Structure to hold information about predefined registers. */
103struct pd_reg
104 {
105 char *name;
106 int value;
107 };
108
109/* List of registers that are pre-defined:
110
111 Each general register has predefined names of the form:
112 1. r<reg_num> which has the value <reg_num>.
113 2. r.<reg_num> which has the value <reg_num>.
114
5b93d8bb
AM
115 Each floating point register has predefined names of the form:
116 1. f<reg_num> which has the value <reg_num>.
117 2. f.<reg_num> which has the value <reg_num>.
118
119 There are only four floating point registers, and these are
120 commonly labelled 0,2,4 and 6. Thus, there is no f1, f3, etc.
121
5b93d8bb
AM
122 There are individual registers as well:
123 rbase or r.base has the value 3 (base register)
124 rpgt or r.pgt has the value 4 (page origin table pointer)
125 rarg or r.arg has the value 11 (argument pointer)
126 rtca or r.tca has the value 12 (table of contents pointer)
127 rtoc or r.toc has the value 12 (table of contents pointer)
128 sp or r.sp has the value 13 (stack pointer)
129 dsa or r.dsa has the value 13 (stack pointer)
130 lr has the value 14 (link reg)
131
92774660 132 The table is sorted. Suitable for searching by a binary search. */
5b93d8bb
AM
133
134static const struct pd_reg pre_defined_registers[] =
135{
ea1562b3
NC
136 { "arg", 11 }, /* Argument Pointer. */
137 { "base", 3 }, /* Base Reg. */
5b93d8bb 138
ea1562b3 139 { "f.0", 0 }, /* Floating point registers. */
5b93d8bb
AM
140 { "f.2", 2 },
141 { "f.4", 4 },
142 { "f.6", 6 },
143
144 { "f0", 0 },
145 { "f2", 2 },
146 { "f4", 4 },
147 { "f6", 6 },
148
ea1562b3
NC
149 { "dsa",13 }, /* Stack pointer. */
150 { "lr", 14 }, /* Link Register. */
151 { "pgt", 4 }, /* Page Origin Table Pointer. */
5b93d8bb 152
ea1562b3 153 { "r.0", 0 }, /* General Purpose Registers. */
5b93d8bb
AM
154 { "r.1", 1 },
155 { "r.10", 10 },
156 { "r.11", 11 },
157 { "r.12", 12 },
158 { "r.13", 13 },
159 { "r.14", 14 },
160 { "r.15", 15 },
161 { "r.2", 2 },
162 { "r.3", 3 },
163 { "r.4", 4 },
164 { "r.5", 5 },
165 { "r.6", 6 },
166 { "r.7", 7 },
167 { "r.8", 8 },
168 { "r.9", 9 },
169
ea1562b3
NC
170 { "r.arg", 11 }, /* Argument Pointer. */
171 { "r.base", 3 }, /* Base Reg. */
172 { "r.dsa", 13 }, /* Stack Pointer. */
173 { "r.pgt", 4 }, /* Page Origin Table Pointer. */
174 { "r.sp", 13 }, /* Stack Pointer. */
5b93d8bb 175
ea1562b3
NC
176 { "r.tca", 12 }, /* Pointer to the table of contents. */
177 { "r.toc", 12 }, /* Pointer to the table of contents. */
5b93d8bb 178
ea1562b3 179 { "r0", 0 }, /* More general purpose registers. */
5b93d8bb
AM
180 { "r1", 1 },
181 { "r10", 10 },
182 { "r11", 11 },
183 { "r12", 12 },
184 { "r13", 13 },
185 { "r14", 14 },
186 { "r15", 15 },
187 { "r2", 2 },
188 { "r3", 3 },
189 { "r4", 4 },
190 { "r5", 5 },
191 { "r6", 6 },
192 { "r7", 7 },
193 { "r8", 8 },
194 { "r9", 9 },
195
ea1562b3 196 { "rbase", 3 }, /* Base Reg. */
5b93d8bb 197
ea1562b3
NC
198 { "rtca", 12 }, /* Pointer to the table of contents. */
199 { "rtoc", 12 }, /* Pointer to the table of contents. */
5b93d8bb 200
ea1562b3 201 { "sp", 13 }, /* Stack Pointer. */
5b93d8bb
AM
202
203};
204
bc805888 205#define REG_NAME_CNT (sizeof (pre_defined_registers) / sizeof (struct pd_reg))
5b93d8bb
AM
206
207/* Given NAME, find the register number associated with that name, return
208 the integer value associated with the given name or -1 on failure. */
209
5b93d8bb 210static int
ea1562b3
NC
211reg_name_search (const struct pd_reg *regs,
212 int regcount,
213 const char *name)
5b93d8bb
AM
214{
215 int middle, low, high;
216 int cmp;
217
218 low = 0;
219 high = regcount - 1;
220
221 do
222 {
223 middle = (low + high) / 2;
224 cmp = strcasecmp (name, regs[middle].name);
225 if (cmp < 0)
226 high = middle - 1;
227 else if (cmp > 0)
228 low = middle + 1;
229 else
230 return regs[middle].value;
231 }
232 while (low <= high);
233
234 return -1;
235}
236
ea1562b3
NC
237/* Summary of register_name().
238
239 in: Input_line_pointer points to 1st char of operand.
240
241 out: An expressionS.
242 The operand may have been a register: in this case, X_op == O_register,
243 X_add_number is set to the register number, and truth is returned.
244 Input_line_pointer->(next non-blank) char after operand, or is in its
245 original state. */
5b93d8bb 246
b34976b6 247static bfd_boolean
ea1562b3 248register_name (expressionS *expressionP)
5b93d8bb
AM
249{
250 int reg_number;
251 char *name;
252 char *start;
253 char c;
254
468cced8 255 /* Find the spelling of the operand. */
5b93d8bb 256 start = name = input_line_pointer;
3882b010 257 if (name[0] == '%' && ISALPHA (name[1]))
5b93d8bb
AM
258 name = ++input_line_pointer;
259
260 else if (!reg_names_p)
b34976b6 261 return FALSE;
5b93d8bb
AM
262
263 while (' ' == *name)
264 name = ++input_line_pointer;
265
468cced8
AM
266 /* If it's a number, treat it as a number. If it's alpha, look to
267 see if it's in the register table. */
3882b010 268 if (!ISALPHA (name[0]))
ea1562b3 269 reg_number = get_single_number ();
5b93d8bb
AM
270 else
271 {
d02603dc 272 c = get_symbol_name (&name);
5b93d8bb 273 reg_number = reg_name_search (pre_defined_registers, REG_NAME_CNT, name);
468cced8
AM
274
275 /* Put back the delimiting char. */
d02603dc 276 (void) restore_line_pointer (c);
5b93d8bb
AM
277 }
278
468cced8 279 /* If numeric, make sure its not out of bounds. */
5b93d8bb
AM
280 if ((0 <= reg_number) && (16 >= reg_number))
281 {
282 expressionP->X_op = O_register;
283 expressionP->X_add_number = reg_number;
284
468cced8 285 /* Make the rest nice. */
5b93d8bb
AM
286 expressionP->X_add_symbol = NULL;
287 expressionP->X_op_symbol = NULL;
b34976b6 288 return TRUE;
5b93d8bb
AM
289 }
290
468cced8
AM
291 /* Reset the line as if we had not done anything. */
292 input_line_pointer = start;
b34976b6 293 return FALSE;
5b93d8bb
AM
294}
295\f
296/* Local variables. */
297
298/* The type of processor we are assembling for. This is one or more
299 of the I370_OPCODE flags defined in opcode/i370.h. */
300static int i370_cpu = 0;
301
302/* The base register to use for opcode with optional operands.
ea1562b3
NC
303 We define two of these: "text" and "other". Normally, "text"
304 would get used in the .text section for branches, while "other"
305 gets used in the .data section for address constants.
306
307 The idea of a second base register in a different section
308 is foreign to the usual HLASM-style semantics; however, it
309 allows us to provide support for dynamically loaded libraries,
310 by allowing us to place address constants in a section other
311 than the text section. The "other" section need not be the
312 .data section, it can be any section that isn't the .text section.
313
314 Note that HLASM defines a multiple, concurrent .using semantic
315 that we do not: in calculating offsets, it uses either the most
316 recent .using directive, or the one with the smallest displacement.
317 This allows HLASM to support a quasi-block-scope-like behaviour.
318 Handy for people writing assembly by hand ... but not supported
319 by us. */
5b93d8bb
AM
320static int i370_using_text_regno = -1;
321static int i370_using_other_regno = -1;
322
ea1562b3 323/* The base address for address literals. */
5b93d8bb
AM
324static expressionS i370_using_text_baseaddr;
325static expressionS i370_using_other_baseaddr;
326
ea1562b3 327/* the "other" section, used only for syntax error detection. */
5b93d8bb
AM
328static segT i370_other_section = undefined_section;
329
330/* Opcode hash table. */
331static struct hash_control *i370_hash;
332
333/* Macro hash table. */
334static struct hash_control *i370_macro_hash;
335
336#ifdef OBJ_ELF
ea1562b3 337/* What type of shared library support to use. */
5b93d8bb
AM
338static enum { SHLIB_NONE, SHLIB_PIC, SHILB_MRELOCATABLE } shlib = SHLIB_NONE;
339#endif
340
ea1562b3 341/* Flags to set in the elf header. */
5b93d8bb
AM
342static flagword i370_flags = 0;
343
344#ifndef WORKING_DOT_WORD
2b4f075a
HPN
345int md_short_jump_size = 4;
346int md_long_jump_size = 4;
5b93d8bb
AM
347#endif
348\f
349#ifdef OBJ_ELF
5a38dc70 350const char *md_shortopts = "l:um:K:VQ:";
5b93d8bb 351#else
5a38dc70 352const char *md_shortopts = "um:";
5b93d8bb
AM
353#endif
354struct option md_longopts[] =
355{
356 {NULL, no_argument, NULL, 0}
357};
bc805888 358size_t md_longopts_size = sizeof (md_longopts);
5b93d8bb
AM
359
360int
ea1562b3 361md_parse_option (int c, char *arg)
5b93d8bb
AM
362{
363 switch (c)
364 {
365 case 'u':
366 /* -u means that any undefined symbols should be treated as
367 external, which is the default for gas anyhow. */
368 break;
369
370#ifdef OBJ_ELF
371 case 'K':
372 /* Recognize -K PIC */
373 if (strcmp (arg, "PIC") == 0 || strcmp (arg, "pic") == 0)
374 {
375 shlib = SHLIB_PIC;
376 i370_flags |= EF_I370_RELOCATABLE_LIB;
377 }
378 else
379 return 0;
380
381 break;
382#endif
383
384 case 'm':
385
ea1562b3 386 /* -m360 mean to assemble for the ancient 360 architecture. */
5b93d8bb
AM
387 if (strcmp (arg, "360") == 0 || strcmp (arg, "i360") == 0)
388 i370_cpu = I370_OPCODE_360;
ea1562b3 389 /* -mxa means to assemble for the IBM 370 XA. */
5b93d8bb
AM
390 else if (strcmp (arg, "xa") == 0)
391 i370_cpu = I370_OPCODE_370_XA;
392 /* -many means to assemble for any architecture (370/XA). */
393 else if (strcmp (arg, "any") == 0)
394 i370_cpu = I370_OPCODE_370;
395
396 else if (strcmp (arg, "regnames") == 0)
b34976b6 397 reg_names_p = TRUE;
5b93d8bb
AM
398
399 else if (strcmp (arg, "no-regnames") == 0)
b34976b6 400 reg_names_p = FALSE;
5b93d8bb
AM
401
402#ifdef OBJ_ELF
ea1562b3
NC
403 /* -mrelocatable/-mrelocatable-lib -- warn about
404 initializations that require relocation. */
5b93d8bb
AM
405 else if (strcmp (arg, "relocatable") == 0)
406 {
407 shlib = SHILB_MRELOCATABLE;
408 i370_flags |= EF_I370_RELOCATABLE;
409 }
5b93d8bb
AM
410 else if (strcmp (arg, "relocatable-lib") == 0)
411 {
412 shlib = SHILB_MRELOCATABLE;
413 i370_flags |= EF_I370_RELOCATABLE_LIB;
414 }
5b93d8bb
AM
415#endif
416 else
417 {
20203fb9 418 as_bad (_("invalid switch -m%s"), arg);
5b93d8bb
AM
419 return 0;
420 }
421 break;
422
423#ifdef OBJ_ELF
424 /* -V: SVR4 argument to print version ID. */
425 case 'V':
426 print_version_id ();
427 break;
428
429 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
430 should be emitted or not. FIXME: Not implemented. */
431 case 'Q':
432 break;
433
434#endif
435
436 default:
437 return 0;
438 }
439
440 return 1;
441}
442
443\f
444/* Set i370_cpu if it is not already set.
445 Currently defaults to the reasonable superset;
92774660 446 but can be made more fine grained if desred. */
5b93d8bb
AM
447
448static void
ea1562b3 449i370_set_cpu (void)
5b93d8bb
AM
450{
451 const char *default_os = TARGET_OS;
452 const char *default_cpu = TARGET_CPU;
453
ea1562b3 454 /* Override with the superset for the moment. */
5b93d8bb
AM
455 i370_cpu = I370_OPCODE_ESA390_SUPERSET;
456 if (i370_cpu == 0)
457 {
458 if (strcmp (default_cpu, "i360") == 0)
459 i370_cpu = I370_OPCODE_360;
460 else if (strcmp (default_cpu, "i370") == 0)
461 i370_cpu = I370_OPCODE_370;
462 else if (strcmp (default_cpu, "XA") == 0)
463 i370_cpu = I370_OPCODE_370_XA;
464 else
465 as_fatal ("Unknown default cpu = %s, os = %s", default_cpu, default_os);
466 }
467}
468
ea1562b3
NC
469/* Figure out the BFD architecture to use.
470 FIXME: specify the different 370 architectures. */
5b93d8bb
AM
471
472enum bfd_architecture
ea1562b3 473i370_arch (void)
5b93d8bb
AM
474{
475 return bfd_arch_i370;
476}
477
478/* This function is called when the assembler starts up. It is called
479 after the options have been parsed and the output file has been
480 opened. */
481
482void
ea1562b3 483md_begin (void)
5b93d8bb 484{
ea1562b3 485 const struct i370_opcode *op;
5b93d8bb
AM
486 const struct i370_opcode *op_end;
487 const struct i370_macro *macro;
488 const struct i370_macro *macro_end;
b34976b6 489 bfd_boolean dup_insn = FALSE;
5b93d8bb
AM
490
491 i370_set_cpu ();
492
493#ifdef OBJ_ELF
92774660 494 /* Set the ELF flags if desired. */
5b93d8bb
AM
495 if (i370_flags)
496 bfd_set_private_flags (stdoutput, i370_flags);
497#endif
498
499 /* Insert the opcodes into a hash table. */
500 i370_hash = hash_new ();
501
502 op_end = i370_opcodes + i370_num_opcodes;
503 for (op = i370_opcodes; op < op_end; op++)
504 {
c9dea48b
AM
505 know ((op->opcode.i[0] & op->mask.i[0]) == op->opcode.i[0]
506 && (op->opcode.i[1] & op->mask.i[1]) == op->opcode.i[1]);
5b93d8bb
AM
507
508 if ((op->flags & i370_cpu) != 0)
509 {
510 const char *retval;
511
ea1562b3 512 retval = hash_insert (i370_hash, op->name, (void *) op);
5b93d8bb
AM
513 if (retval != (const char *) NULL)
514 {
20203fb9 515 as_bad (_("Internal assembler error for instruction %s"), op->name);
b34976b6 516 dup_insn = TRUE;
5b93d8bb
AM
517 }
518 }
519 }
520
521 /* Insert the macros into a hash table. */
522 i370_macro_hash = hash_new ();
523
524 macro_end = i370_macros + i370_num_macros;
525 for (macro = i370_macros; macro < macro_end; macro++)
526 {
527 if ((macro->flags & i370_cpu) != 0)
528 {
529 const char *retval;
530
ea1562b3 531 retval = hash_insert (i370_macro_hash, macro->name, (void *) macro);
5b93d8bb
AM
532 if (retval != (const char *) NULL)
533 {
20203fb9 534 as_bad (_("Internal assembler error for macro %s"), macro->name);
b34976b6 535 dup_insn = TRUE;
5b93d8bb
AM
536 }
537 }
538 }
539
540 if (dup_insn)
541 abort ();
542}
543
544/* Insert an operand value into an instruction. */
545
546static i370_insn_t
ea1562b3
NC
547i370_insert_operand (i370_insn_t insn,
548 const struct i370_operand *operand,
549 offsetT val)
5b93d8bb
AM
550{
551 if (operand->insert)
552 {
553 const char *errmsg;
554
ea1562b3 555 /* Used for 48-bit insn's. */
5b93d8bb
AM
556 errmsg = NULL;
557 insn = (*operand->insert) (insn, (long) val, &errmsg);
558 if (errmsg)
559 as_bad ("%s", errmsg);
560 }
561 else
ea1562b3
NC
562 /* This is used only for 16, 32 bit insn's. */
563 insn.i[0] |= (((long) val & ((1 << operand->bits) - 1))
564 << operand->shift);
5b93d8bb
AM
565
566 return insn;
567}
568
569\f
570#ifdef OBJ_ELF
571/* Parse @got, etc. and return the desired relocation.
56d27c17
AM
572 Currently, i370 does not support (don't really need to support) any
573 of these fancier markups ... for example, no one is going to
574 write 'L 6,=V(bogus)@got' it just doesn't make sense (at least to me).
575 So basically, we could get away with this routine returning
576 BFD_RELOC_UNUSED in all circumstances. However, I'll leave
577 in for now in case someone ambitious finds a good use for this stuff ...
578 this routine was pretty much just copied from the powerpc code ... */
ea1562b3 579
5b93d8bb 580static bfd_reloc_code_real_type
ea1562b3 581i370_elf_suffix (char **str_p, expressionS *exp_p)
5b93d8bb
AM
582{
583 struct map_bfd
584 {
585 char *string;
586 int length;
587 bfd_reloc_code_real_type reloc;
588 };
589
590 char ident[20];
591 char *str = *str_p;
592 char *str2;
593 int ch;
594 int len;
595 struct map_bfd *ptr;
596
ea1562b3 597#define MAP(str,reloc) { str, sizeof (str) - 1, reloc }
5b93d8bb
AM
598
599 static struct map_bfd mapping[] =
600 {
56d27c17
AM
601 /* warnings with -mrelocatable. */
602 MAP ("fixup", BFD_RELOC_CTOR),
603 { (char *)0, 0, BFD_RELOC_UNUSED }
5b93d8bb
AM
604 };
605
606 if (*str++ != '@')
607 return BFD_RELOC_UNUSED;
608
609 for (ch = *str, str2 = ident;
610 (str2 < ident + sizeof (ident) - 1
3882b010 611 && (ISALNUM (ch) || ch == '@'));
5b93d8bb 612 ch = *++str)
ea1562b3 613 *str2++ = TOLOWER (ch);
5b93d8bb
AM
614
615 *str2 = '\0';
616 len = str2 - ident;
617
618 ch = ident[0];
619 for (ptr = &mapping[0]; ptr->length > 0; ptr++)
620 if (ch == ptr->string[0]
621 && len == ptr->length
622 && memcmp (ident, ptr->string, ptr->length) == 0)
623 {
624 if (exp_p->X_add_number != 0
625 && (ptr->reloc == BFD_RELOC_16_GOTOFF
626 || ptr->reloc == BFD_RELOC_LO16_GOTOFF
627 || ptr->reloc == BFD_RELOC_HI16_GOTOFF
628 || ptr->reloc == BFD_RELOC_HI16_S_GOTOFF))
20203fb9 629 as_warn (_("identifier+constant@got means identifier@got+constant"));
5b93d8bb
AM
630
631 /* Now check for identifier@suffix+constant */
632 if (*str == '-' || *str == '+')
633 {
634 char *orig_line = input_line_pointer;
635 expressionS new_exp;
636
637 input_line_pointer = str;
638 expression (&new_exp);
639 if (new_exp.X_op == O_constant)
640 {
641 exp_p->X_add_number += new_exp.X_add_number;
642 str = input_line_pointer;
643 }
644
645 if (&input_line_pointer != str_p)
646 input_line_pointer = orig_line;
647 }
648
649 *str_p = str;
650 return ptr->reloc;
651 }
652
653 return BFD_RELOC_UNUSED;
654}
655
ea1562b3
NC
656/* Like normal .long/.short/.word, except support @got, etc.
657 Clobbers input_line_pointer, checks end-of-line. */
658
5b93d8bb 659static void
ea1562b3 660i370_elf_cons (int nbytes) /* 1=.byte, 2=.word, 4=.long. */
5b93d8bb
AM
661{
662 expressionS exp;
663 bfd_reloc_code_real_type reloc;
664
665 if (is_it_end_of_statement ())
666 {
667 demand_empty_rest_of_line ();
668 return;
669 }
670
671 do
672 {
673 expression (&exp);
ea1562b3 674
5b93d8bb
AM
675 if (exp.X_op == O_symbol
676 && *input_line_pointer == '@'
677 && (reloc = i370_elf_suffix (&input_line_pointer, &exp)) != BFD_RELOC_UNUSED)
678 {
679 reloc_howto_type *reloc_howto = bfd_reloc_type_lookup (stdoutput, reloc);
680 int size = bfd_get_reloc_size (reloc_howto);
681
682 if (size > nbytes)
20203fb9
NC
683 as_bad (_("%s relocations do not fit in %d bytes\n"),
684 reloc_howto->name, nbytes);
5b93d8bb
AM
685 else
686 {
ea1562b3 687 char *p = frag_more ((int) nbytes);
5b93d8bb
AM
688 int offset = nbytes - size;
689
690 fix_new_exp (frag_now, p - frag_now->fr_literal + offset, size, &exp, 0, reloc);
691 }
692 }
693 else
694 emit_expr (&exp, (unsigned int) nbytes);
695 }
696 while (*input_line_pointer++ == ',');
697
92774660 698 input_line_pointer--; /* Put terminator back into stream. */
5b93d8bb
AM
699 demand_empty_rest_of_line ();
700}
701
702\f
703/* ASCII to EBCDIC conversion table. */
704static unsigned char ascebc[256] =
705{
706 /*00 NL SH SX EX ET NQ AK BL */
707 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F,
708 /*08 BS HT LF VT FF CR SO SI */
709 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
710 /*10 DL D1 D2 D3 D4 NK SN EB */
711 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26,
712 /*18 CN EM SB EC FS GS RS US */
713 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
714 /*20 SP ! " # $ % & ' */
715 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D,
716 /*28 ( ) * + , - . / */
717 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
718 /*30 0 1 2 3 4 5 6 7 */
719 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
720 /*38 8 9 : ; < = > ? */
721 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
722 /*40 @ A B C D E F G */
723 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
724 /*48 H I J K L M N O */
725 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
726 /*50 P Q R S T U V W */
727 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6,
728 /*58 X Y Z [ \ ] ^ _ */
729 0xE7, 0xE8, 0xE9, 0xAD, 0xE0, 0xBD, 0x5F, 0x6D,
730 /*60 ` a b c d e f g */
731 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
732 /*68 h i j k l m n o */
733 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
734 /*70 p q r s t u v w */
735 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
736 /*78 x y z { | } ~ DL */
737 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07,
738 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
739 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
740 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
741 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
742 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
743 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
744 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
745 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
746 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
747 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
748 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
749 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
750 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
751 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
752 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
753 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFF
754};
755
756/* EBCDIC to ASCII conversion table. */
757unsigned char ebcasc[256] =
758{
759 /*00 NU SH SX EX PF HT LC DL */
760 0x00, 0x01, 0x02, 0x03, 0x00, 0x09, 0x00, 0x7F,
761 /*08 SM VT FF CR SO SI */
762 0x00, 0x00, 0x00, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
763 /*10 DE D1 D2 TM RS NL BS IL */
764 0x10, 0x11, 0x12, 0x13, 0x14, 0x0A, 0x08, 0x00,
765 /*18 CN EM CC C1 FS GS RS US */
766 0x18, 0x19, 0x00, 0x00, 0x1C, 0x1D, 0x1E, 0x1F,
767 /*20 DS SS FS BP LF EB EC */
768 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x17, 0x1B,
769 /*28 SM C2 EQ AK BL */
770 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x07, 0x00,
771 /*30 SY PN RS UC ET */
772 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
773 /*38 C3 D4 NK SU */
774 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x00, 0x1A,
775 /*40 SP */
776 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
777 /*48 . < ( + | */
778 0x00, 0x00, 0x00, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
779 /*50 & */
780 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
781 /*58 ! $ * ) ; ^ */
782 0x00, 0x00, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x5E,
783 /*60 - / */
784 0x2D, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
785 /*68 , % _ > ? */
786 0x00, 0x00, 0x00, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
787 /*70 */
788 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
789 /*78 ` : # @ ' = " */
790 0x00, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
791 /*80 a b c d e f g */
792 0x00, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
793 /*88 h i { */
794 0x68, 0x69, 0x00, 0x7B, 0x00, 0x00, 0x00, 0x00,
795 /*90 j k l m n o p */
796 0x00, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70,
797 /*98 q r } */
798 0x71, 0x72, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x00,
799 /*A0 ~ s t u v w x */
800 0x00, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
801 /*A8 y z [ */
802 0x79, 0x7A, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00,
803 /*B0 */
804 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
805 /*B8 ] */
806 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00,
807 /*C0 { A B C D E F G */
808 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
809 /*C8 H I */
810 0x48, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
811 /*D0 } J K L M N O P */
812 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,
813 /*D8 Q R */
814 0x51, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
815 /*E0 \ S T U V W X */
816 0x5C, 0x00, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
817 /*E8 Y Z */
818 0x59, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
819 /*F0 0 1 2 3 4 5 6 7 */
820 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
821 /*F8 8 9 */
822 0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF
823};
824
ea1562b3
NC
825/* EBCDIC translation tables needed for 3270 support. */
826
5b93d8bb 827static void
ea1562b3 828i370_ebcdic (int unused ATTRIBUTE_UNUSED)
5b93d8bb
AM
829{
830 char *p, *end;
831 char delim = 0;
832 size_t nbytes;
833
834 nbytes = strlen (input_line_pointer);
835 end = input_line_pointer + nbytes;
836 while ('\r' == *end) end --;
837 while ('\n' == *end) end --;
838
839 delim = *input_line_pointer;
ea1562b3
NC
840 if (('\'' == delim) || ('\"' == delim))
841 {
842 input_line_pointer ++;
843 end = rindex (input_line_pointer, delim);
844 }
5b93d8bb
AM
845
846 if (end > input_line_pointer)
847 {
848 nbytes = end - input_line_pointer +1;
849 p = frag_more (nbytes);
850 while (end > input_line_pointer)
851 {
bc805888 852 *p = ascebc [(unsigned char) (*input_line_pointer)];
5b93d8bb
AM
853 ++p; ++input_line_pointer;
854 }
855 *p = '\0';
856 }
857 if (delim == *input_line_pointer) ++input_line_pointer;
858}
859
860\f
ea1562b3
NC
861/* Stub out a couple of routines. */
862
5b93d8bb 863static void
ea1562b3 864i370_rmode (int unused ATTRIBUTE_UNUSED)
5b93d8bb
AM
865{
866 as_tsktsk ("rmode ignored");
867}
868
869static void
ea1562b3 870i370_dsect (int sect)
5b93d8bb
AM
871{
872 char *save_line = input_line_pointer;
873 static char section[] = ".data\n";
874
ea1562b3 875 /* Just pretend this is .section .data. */
5b93d8bb
AM
876 input_line_pointer = section;
877 obj_elf_section (sect);
878
879 input_line_pointer = save_line;
880}
881
882static void
ea1562b3 883i370_csect (int unused ATTRIBUTE_UNUSED)
5b93d8bb
AM
884{
885 as_tsktsk ("csect not supported");
886}
887
888\f
889/* DC Define Const is only partially supported.
ea1562b3
NC
890 For samplecode on what to do, look at i370_elf_cons() above.
891 This code handles pseudoops of the style
892 DC D'3.141592653' # in sysv4, .double 3.14159265
893 DC F'1' # in sysv4, .long 1. */
894
5b93d8bb 895static void
ea1562b3 896i370_dc (int unused ATTRIBUTE_UNUSED)
5b93d8bb
AM
897{
898 char * p, tmp[50];
899 int nbytes=0;
900 expressionS exp;
901 char type=0;
91d6fa6a 902 char * clse;
5b93d8bb
AM
903
904 if (is_it_end_of_statement ())
905 {
906 demand_empty_rest_of_line ();
907 return;
908 }
909
ea1562b3 910 /* Figure out the size. */
5b93d8bb
AM
911 type = *input_line_pointer++;
912 switch (type)
913 {
914 case 'H': /* 16-bit */
915 nbytes = 2;
916 break;
917 case 'E': /* 32-bit */
918 case 'F': /* 32-bit */
919 nbytes = 4;
920 break;
921 case 'D': /* 64-bit */
922 nbytes = 8;
923 break;
924 default:
20203fb9 925 as_bad (_("unsupported DC type"));
5b93d8bb
AM
926 return;
927 }
928
ea1562b3 929 /* Get rid of pesky quotes. */
5b93d8bb
AM
930 if ('\'' == *input_line_pointer)
931 {
5b93d8bb 932 ++input_line_pointer;
91d6fa6a
NC
933 clse = strchr (input_line_pointer, '\'');
934 if (clse)
935 *clse= ' ';
5b93d8bb 936 else
20203fb9 937 as_bad (_("missing end-quote"));
5b93d8bb 938 }
ea1562b3 939
5b93d8bb
AM
940 if ('\"' == *input_line_pointer)
941 {
5b93d8bb 942 ++input_line_pointer;
91d6fa6a
NC
943 clse = strchr (input_line_pointer, '\"');
944 if (clse)
945 *clse= ' ';
5b93d8bb 946 else
20203fb9 947 as_bad (_("missing end-quote"));
5b93d8bb
AM
948 }
949
950 switch (type)
951 {
952 case 'H': /* 16-bit */
953 case 'F': /* 32-bit */
954 expression (&exp);
955 emit_expr (&exp, nbytes);
956 break;
957 case 'E': /* 32-bit */
499ac353 958 type = 'f';
5b93d8bb
AM
959 case 'D': /* 64-bit */
960 md_atof (type, tmp, &nbytes);
961 p = frag_more (nbytes);
962 memcpy (p, tmp, nbytes);
963 break;
964 default:
20203fb9 965 as_bad (_("unsupported DC type"));
5b93d8bb
AM
966 return;
967 }
968
969 demand_empty_rest_of_line ();
970}
971
972\f
ea1562b3
NC
973/* Provide minimal support for DS Define Storage. */
974
5b93d8bb 975static void
ea1562b3 976i370_ds (int unused ATTRIBUTE_UNUSED)
5b93d8bb 977{
ea1562b3 978 /* DS 0H or DS 0F or DS 0D. */
5b93d8bb
AM
979 if ('0' == *input_line_pointer)
980 {
ea1562b3 981 int alignment = 0; /* Left shift 1 << align. */
5b93d8bb
AM
982 input_line_pointer ++;
983 switch (*input_line_pointer++)
984 {
985 case 'H': /* 16-bit */
986 alignment = 1;
987 break;
988 case 'F': /* 32-bit */
989 alignment = 2;
990 break;
991 case 'D': /* 64-bit */
992 alignment = 3;
993 break;
994 default:
20203fb9 995 as_bad (_("unsupported alignment"));
5b93d8bb
AM
996 return;
997 }
998 frag_align (alignment, 0, 0);
999 record_alignment (now_seg, alignment);
1000 }
1001 else
20203fb9 1002 as_bad (_("this DS form not yet supported"));
5b93d8bb
AM
1003}
1004
1005/* Solaris pseudo op to change to the .rodata section. */
ea1562b3 1006
5b93d8bb 1007static void
ea1562b3 1008i370_elf_rdata (int sect)
5b93d8bb
AM
1009{
1010 char *save_line = input_line_pointer;
1011 static char section[] = ".rodata\n";
1012
ea1562b3 1013 /* Just pretend this is .section .rodata. */
5b93d8bb
AM
1014 input_line_pointer = section;
1015 obj_elf_section (sect);
1016
1017 input_line_pointer = save_line;
1018}
1019
ea1562b3
NC
1020/* Pseudo op to make file scope bss items. */
1021
5b93d8bb 1022static void
ea1562b3 1023i370_elf_lcomm (int unused ATTRIBUTE_UNUSED)
5b93d8bb 1024{
ea1562b3
NC
1025 char *name;
1026 char c;
1027 char *p;
5b93d8bb 1028 offsetT size;
ea1562b3 1029 symbolS *symbolP;
5b93d8bb
AM
1030 offsetT align;
1031 segT old_sec;
1032 int old_subsec;
1033 char *pfrag;
1034 int align2;
1035
d02603dc 1036 c = get_symbol_name (&name);
5b93d8bb 1037
ea1562b3 1038 /* Just after name is now '\0'. */
5b93d8bb 1039 p = input_line_pointer;
d02603dc 1040 (void) restore_line_pointer (c);
5b93d8bb
AM
1041 SKIP_WHITESPACE ();
1042 if (*input_line_pointer != ',')
1043 {
20203fb9 1044 as_bad (_("Expected comma after symbol-name: rest of line ignored."));
5b93d8bb
AM
1045 ignore_rest_of_line ();
1046 return;
1047 }
1048
ea1562b3
NC
1049 /* Skip ','. */
1050 input_line_pointer++;
5b93d8bb
AM
1051 if ((size = get_absolute_expression ()) < 0)
1052 {
20203fb9 1053 as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) size);
5b93d8bb
AM
1054 ignore_rest_of_line ();
1055 return;
1056 }
1057
1058 /* The third argument to .lcomm is the alignment. */
1059 if (*input_line_pointer != ',')
1060 align = 8;
1061 else
1062 {
1063 ++input_line_pointer;
1064 align = get_absolute_expression ();
1065 if (align <= 0)
1066 {
20203fb9 1067 as_warn (_("ignoring bad alignment"));
5b93d8bb
AM
1068 align = 8;
1069 }
1070 }
1071
1072 *p = 0;
1073 symbolP = symbol_find_or_make (name);
1074 *p = c;
1075
1076 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
1077 {
20203fb9 1078 as_bad (_("Ignoring attempt to re-define symbol `%s'."),
5b93d8bb
AM
1079 S_GET_NAME (symbolP));
1080 ignore_rest_of_line ();
1081 return;
1082 }
1083
1084 if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size)
1085 {
20203fb9 1086 as_bad (_("Length of .lcomm \"%s\" is already %ld. Not changed to %ld."),
5b93d8bb
AM
1087 S_GET_NAME (symbolP),
1088 (long) S_GET_VALUE (symbolP),
1089 (long) size);
1090
1091 ignore_rest_of_line ();
1092 return;
1093 }
1094
ea1562b3 1095 /* Allocate_bss: */
5b93d8bb
AM
1096 old_sec = now_seg;
1097 old_subsec = now_subseg;
1098 if (align)
1099 {
ea1562b3 1100 /* Convert to a power of 2 alignment. */
5b93d8bb
AM
1101 for (align2 = 0; (align & 1) == 0; align >>= 1, ++align2)
1102 ;
1103 if (align != 1)
1104 {
20203fb9 1105 as_bad (_("Common alignment not a power of 2"));
5b93d8bb
AM
1106 ignore_rest_of_line ();
1107 return;
1108 }
1109 }
1110 else
1111 align2 = 0;
1112
1113 record_alignment (bss_section, align2);
1114 subseg_set (bss_section, 0);
1115 if (align2)
1116 frag_align (align2, 0, 0);
1117 if (S_GET_SEGMENT (symbolP) == bss_section)
1118 symbol_get_frag (symbolP)->fr_symbol = 0;
1119 symbol_set_frag (symbolP, frag_now);
1120 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, size,
1121 (char *) 0);
1122 *pfrag = 0;
1123 S_SET_SIZE (symbolP, size);
1124 S_SET_SEGMENT (symbolP, bss_section);
1125 subseg_set (old_sec, old_subsec);
1126 demand_empty_rest_of_line ();
1127}
1128
1129/* Validate any relocations emitted for -mrelocatable, possibly adding
1130 fixups for word relocations in writable segments, so we can adjust
1131 them at runtime. */
ea1562b3 1132
5b93d8bb 1133static void
ea1562b3 1134i370_elf_validate_fix (fixS *fixp, segT seg)
5b93d8bb
AM
1135{
1136 if (fixp->fx_done || fixp->fx_pcrel)
1137 return;
1138
1139 switch (shlib)
1140 {
1141 case SHLIB_NONE:
1142 case SHLIB_PIC:
1143 return;
1144
1145 case SHILB_MRELOCATABLE:
1146 if (fixp->fx_r_type <= BFD_RELOC_UNUSED
1147 && fixp->fx_r_type != BFD_RELOC_16_GOTOFF
1148 && fixp->fx_r_type != BFD_RELOC_HI16_GOTOFF
1149 && fixp->fx_r_type != BFD_RELOC_LO16_GOTOFF
1150 && fixp->fx_r_type != BFD_RELOC_HI16_S_GOTOFF
1151 && fixp->fx_r_type != BFD_RELOC_32_BASEREL
1152 && fixp->fx_r_type != BFD_RELOC_LO16_BASEREL
1153 && fixp->fx_r_type != BFD_RELOC_HI16_BASEREL
1154 && fixp->fx_r_type != BFD_RELOC_HI16_S_BASEREL
1155 && strcmp (segment_name (seg), ".got2") != 0
1156 && strcmp (segment_name (seg), ".dtors") != 0
1157 && strcmp (segment_name (seg), ".ctors") != 0
1158 && strcmp (segment_name (seg), ".fixup") != 0
1159 && strcmp (segment_name (seg), ".stab") != 0
1160 && strcmp (segment_name (seg), ".gcc_except_table") != 0
1161 && strcmp (segment_name (seg), ".ex_shared") != 0)
1162 {
1163 if ((seg->flags & (SEC_READONLY | SEC_CODE)) != 0
1164 || fixp->fx_r_type != BFD_RELOC_CTOR)
ea1562b3
NC
1165 as_bad_where (fixp->fx_file, fixp->fx_line,
1166 "Relocation cannot be done when using -mrelocatable");
5b93d8bb
AM
1167 }
1168 return;
ea1562b3
NC
1169 default:
1170 break;
5b93d8bb
AM
1171 }
1172}
1173#endif /* OBJ_ELF */
1174
5b93d8bb
AM
1175\f
1176#define LITERAL_POOL_SUPPORT
1177#ifdef LITERAL_POOL_SUPPORT
ea1562b3
NC
1178/* Provide support for literal pools within the text section.
1179 Loosely based on similar code from tc-arm.c.
1180 We will use four symbols to locate four parts of the literal pool.
1181 These four sections contain 64,32,16 and 8-bit constants; we use
1182 four sections so that all memory access can be appropriately aligned.
1183 That is, we want to avoid mixing these together so that we don't
1184 waste space padding out to alignments. The four pointers
1185 longlong_poolP, word_poolP, etc. point to a symbol labeling the
1186 start of each pool part.
3739860c 1187
ea1562b3
NC
1188 lit_pool_num increments from zero to infinity and uniquely id's
1189 -- its used to generate the *_poolP symbol name. */
5b93d8bb
AM
1190
1191#define MAX_LITERAL_POOL_SIZE 1024
1192
1193typedef struct literalS
1194{
1195 struct expressionS exp;
1196 char * sym_name;
1197 char size; /* 1,2,4 or 8 */
1198 short offset;
1199} literalT;
1200
1201literalT literals[MAX_LITERAL_POOL_SIZE];
ea1562b3 1202int next_literal_pool_place = 0; /* Next free entry in the pool. */
5b93d8bb 1203
ea1562b3
NC
1204static symbolS *longlong_poolP = NULL; /* 64-bit pool entries. */
1205static symbolS *word_poolP = NULL; /* 32-bit pool entries. */
1206static symbolS *short_poolP = NULL; /* 16-bit pool entries. */
1207static symbolS *byte_poolP = NULL; /* 8-bit pool entries. */
5b93d8bb
AM
1208
1209static int lit_pool_num = 1;
1210
ea1562b3 1211/* Create a new, empty symbol. */
5b93d8bb
AM
1212static symbolS *
1213symbol_make_empty (void)
1214{
1215 return symbol_create (FAKE_LABEL_NAME, undefined_section,
1216 (valueT) 0, &zero_address_frag);
1217}
1218
ea1562b3
NC
1219/* Make the first argument an address-relative expression
1220 by subtracting the second argument. */
1221
1222static void
1223i370_make_relative (expressionS *exx, expressionS *baseaddr)
1224{
1225 if (O_constant == baseaddr->X_op)
1226 {
1227 exx->X_op = O_symbol;
1228 exx->X_add_number -= baseaddr->X_add_number;
1229 }
1230 else if (O_symbol == baseaddr->X_op)
1231 {
1232 exx->X_op = O_subtract;
1233 exx->X_op_symbol = baseaddr->X_add_symbol;
1234 exx->X_add_number -= baseaddr->X_add_number;
1235 }
1236 else if (O_uminus == baseaddr->X_op)
1237 {
1238 exx->X_op = O_add;
1239 exx->X_op_symbol = baseaddr->X_add_symbol;
1240 exx->X_add_number += baseaddr->X_add_number;
1241 }
1242 else
20203fb9 1243 as_bad (_("Missing or bad .using directive"));
ea1562b3
NC
1244}
1245/* Add an expression to the literal pool. */
1246
5b93d8bb
AM
1247static void
1248add_to_lit_pool (expressionS *exx, char *name, int sz)
1249{
1250 int lit_count = 0;
1251 int offset_in_pool = 0;
1252
ea1562b3 1253 /* Start a new pool, if necessary. */
5b93d8bb 1254 if (8 == sz && NULL == longlong_poolP)
07726851 1255 longlong_poolP = symbol_make_empty ();
5b93d8bb 1256 else if (4 == sz && NULL == word_poolP)
07726851 1257 word_poolP = symbol_make_empty ();
5b93d8bb 1258 else if (2 == sz && NULL == short_poolP)
07726851 1259 short_poolP = symbol_make_empty ();
5b93d8bb 1260 else if (1 == sz && NULL == byte_poolP)
07726851 1261 byte_poolP = symbol_make_empty ();
5b93d8bb 1262
ea1562b3
NC
1263 /* Check if this literal value is already in the pool.
1264 FIXME: We should probably be checking expressions
1265 of type O_symbol as well.
1266 FIXME: This is probably(certainly?) broken for O_big,
1267 which includes 64-bit long-longs. */
5b93d8bb
AM
1268 while (lit_count < next_literal_pool_place)
1269 {
1270 if (exx->X_op == O_constant
1271 && literals[lit_count].exp.X_op == exx->X_op
1272 && literals[lit_count].exp.X_add_number == exx->X_add_number
1273 && literals[lit_count].exp.X_unsigned == exx->X_unsigned
1274 && literals[lit_count].size == sz)
1275 break;
1276 else if (literals[lit_count].sym_name
1277 && name
1278 && !strcmp (name, literals[lit_count].sym_name))
1279 break;
1280 if (sz == literals[lit_count].size)
1281 offset_in_pool += sz;
1282 lit_count ++;
1283 }
1284
1285 if (lit_count == next_literal_pool_place) /* new entry */
1286 {
1287 if (next_literal_pool_place > MAX_LITERAL_POOL_SIZE)
20203fb9 1288 as_bad (_("Literal Pool Overflow"));
5b93d8bb
AM
1289
1290 literals[next_literal_pool_place].exp = *exx;
1291 literals[next_literal_pool_place].size = sz;
1292 literals[next_literal_pool_place].offset = offset_in_pool;
1293 if (name)
ea1562b3 1294 literals[next_literal_pool_place].sym_name = strdup (name);
5b93d8bb 1295 else
ea1562b3 1296 literals[next_literal_pool_place].sym_name = NULL;
5b93d8bb
AM
1297 next_literal_pool_place++;
1298 }
1299
0234cb7c 1300 /* ???_poolP points to the beginning of the literal pool.
ea1562b3
NC
1301 X_add_number is the offset from the beginning of the
1302 literal pool to this expr minus the location of the most
1303 recent .using directive. Thus, the grand total value of the
1304 expression is the distance from .using to the literal. */
5b93d8bb
AM
1305 if (8 == sz)
1306 exx->X_add_symbol = longlong_poolP;
1307 else if (4 == sz)
1308 exx->X_add_symbol = word_poolP;
1309 else if (2 == sz)
1310 exx->X_add_symbol = short_poolP;
1311 else if (1 == sz)
1312 exx->X_add_symbol = byte_poolP;
1313 exx->X_add_number = offset_in_pool;
1314 exx->X_op_symbol = NULL;
1315
1316 /* If the user has set up a base reg in another section,
ea1562b3 1317 use that; otherwise use the text section. */
5b93d8bb 1318 if (0 < i370_using_other_regno)
ea1562b3 1319 i370_make_relative (exx, &i370_using_other_baseaddr);
5b93d8bb 1320 else
ea1562b3 1321 i370_make_relative (exx, &i370_using_text_baseaddr);
5b93d8bb
AM
1322}
1323
1324/* The symbol setup for the literal pool is done in two steps. First,
ea1562b3
NC
1325 a symbol that represents the start of the literal pool is created,
1326 above, in the add_to_pool() routine. This sym ???_poolP.
1327 However, we don't know what fragment its in until a bit later.
1328 So we defer the frag_now thing, and the symbol name, until .ltorg time. */
5b93d8bb
AM
1329
1330/* Can't use symbol_new here, so have to create a symbol and then at
ea1562b3 1331 a later date assign it a value. Thats what these functions do. */
650f02e9 1332
5b93d8bb 1333static void
ea1562b3
NC
1334symbol_locate (symbolS *symbolP,
1335 const char *name, /* It is copied, the caller can modify. */
1336 segT segment, /* Segment identifier (SEG_<something>). */
1337 valueT valu, /* Symbol value. */
1338 fragS *frag) /* Associated fragment. */
5b93d8bb
AM
1339{
1340 size_t name_length;
1341 char *preserved_copy_of_name;
1342
1343 name_length = strlen (name) + 1; /* +1 for \0 */
1344 obstack_grow (&notes, name, name_length);
1345 preserved_copy_of_name = obstack_finish (&notes);
1346
1347 S_SET_NAME (symbolP, preserved_copy_of_name);
1348
1349 S_SET_SEGMENT (symbolP, segment);
1350 S_SET_VALUE (symbolP, valu);
07726851 1351 symbol_clear_list_pointers (symbolP);
5b93d8bb
AM
1352
1353 symbol_set_frag (symbolP, frag);
1354
ea1562b3 1355 /* Link to end of symbol chain. */
5b93d8bb
AM
1356 {
1357 extern int symbol_table_frozen;
ea1562b3 1358
5b93d8bb
AM
1359 if (symbol_table_frozen)
1360 abort ();
1361 }
1362
1363 symbol_append (symbolP, symbol_lastP, &symbol_rootP, &symbol_lastP);
1364
1365 obj_symbol_new_hook (symbolP);
1366
1367#ifdef tc_symbol_new_hook
1368 tc_symbol_new_hook (symbolP);
1369#endif
1370
1371#define DEBUG_SYMS
1372#ifdef DEBUG_SYMS
1373 verify_symbol_chain(symbol_rootP, symbol_lastP);
1374#endif /* DEBUG_SYMS */
1375}
1376
1377/* i370_addr_offset() will convert operand expressions
ea1562b3
NC
1378 that appear to be absolute into thier base-register
1379 relative form. These expressions come in two types:
1380
1381 (1) of the form "* + const" * where "*" means
1382 relative offset since the last using
1383 i.e. "*" means ".-using_baseaddr"
1384
1385 (2) labels, which are never absolute, but are always
1386 relative to the last "using". Anything with an alpha
1387 character is considered to be a label (since symbols
1388 can never be operands), and since we've already handled
1389 register operands. For example, "BL .L33" branch low
1390 to .L33 RX form insn frequently terminates for-loops. */
1391
b34976b6 1392static bfd_boolean
5b93d8bb
AM
1393i370_addr_offset (expressionS *exx)
1394{
1395 char *dot, *lab;
1396 int islabel = 0;
1397 int all_digits = 0;
1398
ea1562b3
NC
1399 /* Search for a label; anything with an alpha char will do.
1400 Local labels consist of N digits followed by either b or f. */
5b93d8bb
AM
1401 lab = input_line_pointer;
1402 while (*lab && (',' != *lab) && ('(' != *lab))
1403 {
3882b010 1404 if (ISDIGIT (*lab))
ea1562b3 1405 all_digits = 1;
3882b010 1406 else if (ISALPHA (*lab))
5b93d8bb
AM
1407 {
1408 if (!all_digits)
1409 {
1410 islabel = 1;
1411 break;
1412 }
1413 else if (('f' == *lab) || ('b' == *lab))
1414 {
1415 islabel = 1;
1416 break;
1417 }
1418 if (all_digits)
1419 break;
1420 }
1421 else if ('.' != *lab)
1422 break;
1423 ++lab;
1424 }
1425
ea1562b3 1426 /* See if operand has a * in it. */
5b93d8bb
AM
1427 dot = strchr (input_line_pointer, '*');
1428
1429 if (!dot && !islabel)
b34976b6 1430 return FALSE;
5b93d8bb 1431
ea1562b3 1432 /* Replace * with . and let expr munch on it. */
5b93d8bb
AM
1433 if (dot)
1434 *dot = '.';
1435 expression (exx);
1436
ea1562b3
NC
1437 /* OK, now we have to subtract the "using" location.
1438 Normally branches appear in the text section only. */
5b93d8bb 1439 if (0 == strncmp (now_seg->name, ".text", 5) || 0 > i370_using_other_regno)
ea1562b3 1440 i370_make_relative (exx, &i370_using_text_baseaddr);
5b93d8bb 1441 else
ea1562b3 1442 i370_make_relative (exx, &i370_using_other_baseaddr);
5b93d8bb 1443
ea1562b3 1444 /* Put the * back. */
5b93d8bb
AM
1445 if (dot)
1446 *dot = '*';
1447
b34976b6 1448 return TRUE;
5b93d8bb
AM
1449}
1450
ea1562b3 1451/* Handle address constants of various sorts. */
5b93d8bb 1452/* The currently supported types are
ea1562b3
NC
1453 =A(some_symb)
1454 =V(some_extern)
1455 =X'deadbeef' hexadecimal
1456 =F'1234' 32-bit const int
1457 =H'1234' 16-bit const int. */
1458
b34976b6 1459static bfd_boolean
5b93d8bb
AM
1460i370_addr_cons (expressionS *exp)
1461{
1462 char *name;
1463 char *sym_name, delim;
1464 int name_len;
ea1562b3
NC
1465 int hex_len = 0;
1466 int cons_len = 0;
5b93d8bb
AM
1467
1468 name = input_line_pointer;
1469 sym_name = input_line_pointer;
ea1562b3 1470 /* Find the spelling of the operand. */
3882b010 1471 if (name[0] == '=' && ISALPHA (name[1]))
ea1562b3 1472 name = ++input_line_pointer;
5b93d8bb 1473 else
ea1562b3
NC
1474 return FALSE;
1475
5b93d8bb
AM
1476 switch (name[0])
1477 {
ea1562b3
NC
1478 case 'A': /* A == address-of. */
1479 case 'V': /* V == extern. */
5b93d8bb
AM
1480 ++input_line_pointer;
1481 expression (exp);
1482
ea1562b3
NC
1483 /* We use a simple string name to collapse together
1484 multiple refrences to the same address literal. */
5b93d8bb
AM
1485 name_len = strcspn (sym_name, ", ");
1486 delim = *(sym_name + name_len);
1487 *(sym_name + name_len) = 0x0;
1488 add_to_lit_pool (exp, sym_name, 4);
1489 *(sym_name + name_len) = delim;
1490
1491 break;
1492 case 'H':
1493 case 'F':
1494 case 'X':
ea1562b3
NC
1495 case 'E': /* Single-precision float point. */
1496 case 'D': /* Double-precision float point. */
5b93d8bb 1497
ea1562b3
NC
1498 /* H == 16-bit fixed-point const; expression must be const. */
1499 /* F == fixed-point const; expression must be const. */
1500 /* X == fixed-point const; expression must be const. */
5b93d8bb
AM
1501 if ('H' == name[0]) cons_len = 2;
1502 else if ('F' == name[0]) cons_len = 4;
1503 else if ('X' == name[0]) cons_len = -1;
1504 else if ('E' == name[0]) cons_len = 4;
1505 else if ('D' == name[0]) cons_len = 8;
1506
ea1562b3
NC
1507 /* Extract length, if it is present;
1508 FIXME: assume single-digit length. */
5b93d8bb
AM
1509 if ('L' == name[1])
1510 {
ea1562b3
NC
1511 /* Should work for ASCII and EBCDIC. */
1512 cons_len = name[2] - '0';
5b93d8bb
AM
1513 input_line_pointer += 2;
1514 }
1515
1516 ++input_line_pointer;
1517
ea1562b3 1518 /* Get rid of pesky quotes. */
5b93d8bb
AM
1519 if ('\'' == *input_line_pointer)
1520 {
91d6fa6a
NC
1521 char * clse;
1522
5b93d8bb 1523 ++input_line_pointer;
91d6fa6a
NC
1524 clse = strchr (input_line_pointer, '\'');
1525 if (clse)
1526 *clse= ' ';
5b93d8bb 1527 else
20203fb9 1528 as_bad (_("missing end-quote"));
5b93d8bb
AM
1529 }
1530 if ('\"' == *input_line_pointer)
1531 {
91d6fa6a
NC
1532 char * clse;
1533
5b93d8bb 1534 ++input_line_pointer;
91d6fa6a
NC
1535 clse = strchr (input_line_pointer, '\"');
1536 if (clse)
1537 *clse= ' ';
5b93d8bb 1538 else
20203fb9 1539 as_bad (_("missing end-quote"));
5b93d8bb
AM
1540 }
1541 if (('X' == name[0]) || ('E' == name[0]) || ('D' == name[0]))
1542 {
1543 char tmp[50];
1544 char *save;
1545
1546 /* The length of hex constants is specified directly with L,
ea1562b3
NC
1547 or implied through the number of hex digits. For example:
1548 =X'AB' one byte
1549 =X'abcd' two bytes
1550 =X'000000AB' four bytes
1551 =XL4'AB' four bytes, left-padded withn zero. */
5b93d8bb
AM
1552 if (('X' == name[0]) && (0 > cons_len))
1553 {
1554 save = input_line_pointer;
1555 while (*save)
1556 {
3882b010 1557 if (ISXDIGIT (*save))
5b93d8bb
AM
1558 hex_len++;
1559 save++;
1560 }
1561 cons_len = (hex_len+1) /2;
1562 }
0234cb7c 1563 /* I believe this works even for =XL8'dada0000beeebaaa'
ea1562b3
NC
1564 which should parse out to X_op == O_big
1565 Note that floats and doubles get represented as
1566 0d3.14159265358979 or 0f 2.7. */
5b93d8bb
AM
1567 tmp[0] = '0';
1568 tmp[1] = name[0];
1569 tmp[2] = 0;
1570 strcat (tmp, input_line_pointer);
1571 save = input_line_pointer;
1572 input_line_pointer = tmp;
1573 expression (exp);
1574 input_line_pointer = save + (input_line_pointer-tmp-2);
1575
ea1562b3 1576 /* Fix up lengths for floats and doubles. */
5b93d8bb 1577 if (O_big == exp->X_op)
ea1562b3 1578 exp->X_add_number = cons_len / CHARS_PER_LITTLENUM;
5b93d8bb
AM
1579 }
1580 else
ea1562b3
NC
1581 expression (exp);
1582
1583 /* O_big occurs when more than 4 bytes worth gets parsed. */
5b93d8bb
AM
1584 if ((exp->X_op != O_constant) && (exp->X_op != O_big))
1585 {
20203fb9 1586 as_bad (_("expression not a constant"));
b34976b6 1587 return FALSE;
5b93d8bb
AM
1588 }
1589 add_to_lit_pool (exp, 0x0, cons_len);
1590 break;
1591
1592 default:
20203fb9 1593 as_bad (_("Unknown/unsupported address literal type"));
b34976b6 1594 return FALSE;
5b93d8bb
AM
1595 }
1596
b34976b6 1597 return TRUE;
5b93d8bb
AM
1598}
1599
1600\f
1601/* Dump the contents of the literal pool that we've accumulated so far.
ea1562b3 1602 This aligns the pool to the size of the largest literal in the pool. */
5b93d8bb
AM
1603
1604static void
ea1562b3 1605i370_ltorg (int ignore ATTRIBUTE_UNUSED)
5b93d8bb
AM
1606{
1607 int litsize;
1608 int lit_count = 0;
1609 int biggest_literal_size = 0;
1610 int biggest_align = 0;
1611 char pool_name[20];
1612
1613 if (strncmp (now_seg->name, ".text", 5))
1614 {
1615 if (i370_other_section == undefined_section)
20203fb9 1616 as_bad (_(".ltorg without prior .using in section %s"),
ea1562b3
NC
1617 now_seg->name);
1618
5b93d8bb 1619 if (i370_other_section != now_seg)
20203fb9 1620 as_bad (_(".ltorg in section %s paired to .using in section %s"),
ea1562b3 1621 now_seg->name, i370_other_section->name);
5b93d8bb 1622 }
ea1562b3 1623
5b93d8bb
AM
1624 if (! longlong_poolP
1625 && ! word_poolP
1626 && ! short_poolP
1627 && ! byte_poolP)
ea1562b3
NC
1628 /* Nothing to do. */
1629 return;
5b93d8bb 1630
ea1562b3 1631 /* Find largest literal .. 2 4 or 8. */
5b93d8bb
AM
1632 lit_count = 0;
1633 while (lit_count < next_literal_pool_place)
1634 {
1635 if (biggest_literal_size < literals[lit_count].size)
1636 biggest_literal_size = literals[lit_count].size;
1637 lit_count ++;
1638 }
1639 if (1 == biggest_literal_size) biggest_align = 0;
1640 else if (2 == biggest_literal_size) biggest_align = 1;
1641 else if (4 == biggest_literal_size) biggest_align = 2;
1642 else if (8 == biggest_literal_size) biggest_align = 3;
20203fb9 1643 else as_bad (_("bad alignment of %d bytes in literal pool"), biggest_literal_size);
5b93d8bb
AM
1644 if (0 == biggest_align) biggest_align = 1;
1645
ea1562b3 1646 /* Align pool for short, word, double word accesses. */
5b93d8bb
AM
1647 frag_align (biggest_align, 0, 0);
1648 record_alignment (now_seg, biggest_align);
1649
1650 /* Note that the gas listing will print only the first five
ea1562b3
NC
1651 entries in the pool .... wonder how to make it print more. */
1652 /* Output largest literals first, then the smaller ones. */
5b93d8bb
AM
1653 for (litsize=8; litsize; litsize /=2)
1654 {
1655 symbolS *current_poolP = NULL;
1656 switch (litsize)
1657 {
1658 case 8:
1659 current_poolP = longlong_poolP; break;
1660 case 4:
1661 current_poolP = word_poolP; break;
1662 case 2:
1663 current_poolP = short_poolP; break;
1664 case 1:
1665 current_poolP = byte_poolP; break;
1666 default:
20203fb9 1667 as_bad (_("bad literal size\n"));
5b93d8bb
AM
1668 }
1669 if (NULL == current_poolP)
1670 continue;
1671 sprintf (pool_name, ".LITP%01d%06d", litsize, lit_pool_num);
1672 symbol_locate (current_poolP, pool_name, now_seg,
1673 (valueT) frag_now_fix (), frag_now);
1674 symbol_table_insert (current_poolP);
1675
1676 lit_count = 0;
1677 while (lit_count < next_literal_pool_place)
1678 {
1679 if (litsize == literals[lit_count].size)
1680 {
1681#define EMIT_ADDR_CONS_SYMBOLS
1682#ifdef EMIT_ADDR_CONS_SYMBOLS
ea1562b3
NC
1683 /* Create a bogus symbol, add it to the pool ...
1684 For the most part, I think this is a useless exercise,
1685 except that having these symbol names in the objects
1686 is vaguely useful for debugging. */
5b93d8bb
AM
1687 if (literals[lit_count].sym_name)
1688 {
07726851 1689 symbolS * symP = symbol_make_empty ();
5b93d8bb
AM
1690 symbol_locate (symP, literals[lit_count].sym_name, now_seg,
1691 (valueT) frag_now_fix (), frag_now);
1692 symbol_table_insert (symP);
1693 }
1694#endif /* EMIT_ADDR_CONS_SYMBOLS */
1695
1696 emit_expr (&(literals[lit_count].exp), literals[lit_count].size);
1697 }
1698 lit_count ++;
1699 }
1700 }
1701
1702 next_literal_pool_place = 0;
1703 longlong_poolP = NULL;
1704 word_poolP = NULL;
1705 short_poolP = NULL;
1706 byte_poolP = NULL;
1707 lit_pool_num++;
1708}
1709
1710#endif /* LITERAL_POOL_SUPPORT */
1711
1712\f
ea1562b3
NC
1713/* Add support for the HLASM-like USING directive to indicate
1714 the base register to use ... we don't support the full
1715 hlasm semantics for this ... we merely pluck a base address
1716 and a register number out. We print a warning if using is
1717 called multiple times. I suppose we should check to see
1718 if the regno is valid. */
1719
5b93d8bb 1720static void
ea1562b3 1721i370_using (int ignore ATTRIBUTE_UNUSED)
5b93d8bb
AM
1722{
1723 expressionS ex, baseaddr;
1724 int iregno;
1725 char *star;
1726
ea1562b3
NC
1727 /* If "*" appears in a using, it means "."
1728 replace it with "." so that expr doesn't get confused. */
5b93d8bb
AM
1729 star = strchr (input_line_pointer, '*');
1730 if (star)
1731 *star = '.';
1732
ea1562b3
NC
1733 /* The first arg to using will usually be ".", but it can
1734 be a more complex expression too. */
5b93d8bb
AM
1735 expression (&baseaddr);
1736 if (star)
1737 *star = '*';
1738 if (O_constant != baseaddr.X_op
1739 && O_symbol != baseaddr.X_op
1740 && O_uminus != baseaddr.X_op)
20203fb9 1741 as_bad (_(".using: base address expression illegal or too complex"));
5b93d8bb
AM
1742
1743 if (*input_line_pointer != '\0') ++input_line_pointer;
1744
ea1562b3 1745 /* The second arg to using had better be a register. */
5b93d8bb
AM
1746 register_name (&ex);
1747 demand_empty_rest_of_line ();
1748 iregno = ex.X_add_number;
1749
1750 if (0 == strncmp (now_seg->name, ".text", 5))
1751 {
1752 i370_using_text_baseaddr = baseaddr;
1753 i370_using_text_regno = iregno;
1754 }
1755 else
1756 {
1757 i370_using_other_baseaddr = baseaddr;
1758 i370_using_other_regno = iregno;
1759 i370_other_section = now_seg;
1760 }
1761}
1762
1763static void
ea1562b3 1764i370_drop (int ignore ATTRIBUTE_UNUSED)
5b93d8bb
AM
1765{
1766 expressionS ex;
1767 int iregno;
1768
1769 register_name (&ex);
1770 demand_empty_rest_of_line ();
1771 iregno = ex.X_add_number;
1772
1773 if (0 == strncmp (now_seg->name, ".text", 5))
1774 {
1775 if (iregno != i370_using_text_regno)
20203fb9 1776 as_bad (_("droping register %d in section %s does not match using register %d"),
ea1562b3
NC
1777 iregno, now_seg->name, i370_using_text_regno);
1778
5b93d8bb
AM
1779 i370_using_text_regno = -1;
1780 i370_using_text_baseaddr.X_op = O_absent;
1781 }
1782 else
1783 {
1784 if (iregno != i370_using_other_regno)
20203fb9 1785 as_bad (_("droping register %d in section %s does not match using register %d"),
ea1562b3
NC
1786 iregno, now_seg->name, i370_using_other_regno);
1787
5b93d8bb 1788 if (i370_other_section != now_seg)
20203fb9 1789 as_bad (_("droping register %d in section %s previously used in section %s"),
ea1562b3
NC
1790 iregno, now_seg->name, i370_other_section->name);
1791
5b93d8bb
AM
1792 i370_using_other_regno = -1;
1793 i370_using_other_baseaddr.X_op = O_absent;
1794 i370_other_section = undefined_section;
1795 }
1796}
1797
5b93d8bb
AM
1798\f
1799/* We need to keep a list of fixups. We can't simply generate them as
1800 we go, because that would require us to first create the frag, and
1801 that would screw up references to ``.''. */
1802
1803struct i370_fixup
1804{
1805 expressionS exp;
1806 int opindex;
1807 bfd_reloc_code_real_type reloc;
1808};
1809
ea1562b3
NC
1810#define MAX_INSN_FIXUPS 5
1811
1812/* Handle a macro. Gather all the operands, transform them as
1813 described by the macro, and call md_assemble recursively. All the
1814 operands are separated by commas; we don't accept parentheses
1815 around operands here. */
1816
1817static void
1818i370_macro (char *str, const struct i370_macro *macro)
1819{
1820 char *operands[10];
1821 unsigned int count;
1822 char *s;
1823 unsigned int len;
1824 const char *format;
1825 int arg;
1826 char *send;
1827 char *complete;
1828
1829 /* Gather the users operands into the operands array. */
1830 count = 0;
1831 s = str;
1832 while (1)
1833 {
1834 if (count >= sizeof operands / sizeof operands[0])
1835 break;
1836 operands[count++] = s;
1837 s = strchr (s, ',');
1838 if (s == (char *) NULL)
1839 break;
1840 *s++ = '\0';
1841 }
1842
1843 if (count != macro->operands)
1844 {
20203fb9 1845 as_bad (_("wrong number of operands"));
ea1562b3
NC
1846 return;
1847 }
1848
1849 /* Work out how large the string must be (the size is unbounded
1850 because it includes user input). */
1851 len = 0;
1852 format = macro->format;
1853 while (*format != '\0')
1854 {
1855 if (*format != '%')
1856 {
1857 ++len;
1858 ++format;
1859 }
1860 else
1861 {
1862 arg = strtol (format + 1, &send, 10);
1863 know (send != format && arg >= 0 && (unsigned) arg < count);
1864 len += strlen (operands[arg]);
1865 format = send;
1866 }
1867 }
1868
1869 /* Put the string together. */
1870 complete = s = alloca (len + 1);
1871 format = macro->format;
1872 while (*format != '\0')
1873 {
1874 if (*format != '%')
1875 *s++ = *format++;
1876 else
1877 {
1878 arg = strtol (format + 1, &send, 10);
1879 strcpy (s, operands[arg]);
1880 s += strlen (s);
1881 format = send;
1882 }
1883 }
1884 *s = '\0';
1885
1886 /* Assemble the constructed instruction. */
1887 md_assemble (complete);
1888}
5b93d8bb
AM
1889
1890/* This routine is called for each instruction to be assembled. */
1891
1892void
ea1562b3 1893md_assemble (char *str)
5b93d8bb 1894{
87975d2a 1895 char *s;
5b93d8bb
AM
1896 const struct i370_opcode *opcode;
1897 i370_insn_t insn;
1898 const unsigned char *opindex_ptr;
1899 int have_optional_index, have_optional_basereg, have_optional_reg;
1900 int skip_optional_index, skip_optional_basereg, skip_optional_reg;
1901 int use_text=0, use_other=0;
1902 int off_by_one;
1903 struct i370_fixup fixups[MAX_INSN_FIXUPS];
1904 int fc;
1905 char *f;
1906 int i;
1907#ifdef OBJ_ELF
1908 bfd_reloc_code_real_type reloc;
1909#endif
1910
1911 /* Get the opcode. */
3882b010 1912 for (s = str; *s != '\0' && ! ISSPACE (*s); s++)
5b93d8bb
AM
1913 ;
1914 if (*s != '\0')
1915 *s++ = '\0';
5b93d8bb
AM
1916
1917 /* Look up the opcode in the hash table. */
1918 opcode = (const struct i370_opcode *) hash_find (i370_hash, str);
1919 if (opcode == (const struct i370_opcode *) NULL)
1920 {
1921 const struct i370_macro *macro;
1922
9c2799c2 1923 gas_assert (i370_macro_hash);
5b93d8bb
AM
1924 macro = (const struct i370_macro *) hash_find (i370_macro_hash, str);
1925 if (macro == (const struct i370_macro *) NULL)
20203fb9 1926 as_bad (_("Unrecognized opcode: `%s'"), str);
5b93d8bb
AM
1927 else
1928 i370_macro (s, macro);
1929
1930 return;
1931 }
1932
1933 insn = opcode->opcode;
1934
1935 str = s;
3882b010 1936 while (ISSPACE (*str))
5b93d8bb
AM
1937 ++str;
1938
1939 /* I370 operands are either expressions or address constants.
1940 Many operand types are optional. The optional operands
1941 are always surrounded by parens, and are used to denote the base
1942 register ... e.g. "A R1, D2" or "A R1, D2(,B2) as opposed to
1943 the fully-formed "A R1, D2(X2,B2)". Note also the = sign,
1944 such as A R1,=A(i) where the address-of operator =A implies
1945 use of both a base register, and a missing index register.
1946
1947 So, before we start seriously parsing the operands, we check
1948 to see if we have an optional operand, and, if we do, we count
1949 the number of commas to see which operand should be omitted. */
1950
1951 have_optional_index = have_optional_basereg = have_optional_reg = 0;
1952 for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
1953 {
1954 const struct i370_operand *operand;
ea1562b3 1955
5b93d8bb
AM
1956 operand = &i370_operands[*opindex_ptr];
1957 if ((operand->flags & I370_OPERAND_INDEX) != 0)
1958 have_optional_index = 1;
1959 if ((operand->flags & I370_OPERAND_BASE) != 0)
1960 have_optional_basereg = 1;
1961 if ((operand->flags & I370_OPERAND_OPTIONAL) != 0)
1962 have_optional_reg = 1;
1963 }
1964
1965 skip_optional_index = skip_optional_basereg = skip_optional_reg = 0;
1966 if (have_optional_index || have_optional_basereg)
1967 {
1968 unsigned int opcount, nwanted;
1969
1970 /* There is an optional operand. Count the number of
1971 commas and open-parens in the input line. */
1972 if (*str == '\0')
1973 opcount = 0;
1974 else
1975 {
1976 opcount = 1;
1977 s = str;
1978 while ((s = strpbrk (s, ",(=")) != (char *) NULL)
1979 {
1980 ++opcount;
1981 ++s;
1982 if (',' == *s) ++s; /* avoid counting things like (, */
1983 if ('=' == *s) { ++s; --opcount; }
1984 }
1985 }
1986
1987 /* If there are fewer operands in the line then are called
1988 for by the instruction, we want to skip the optional
1989 operand. */
2132e3a3 1990 nwanted = strlen ((char *) opcode->operands);
5b93d8bb
AM
1991 if (have_optional_index)
1992 {
1993 if (opcount < nwanted)
1994 skip_optional_index = 1;
1995 if (have_optional_basereg && ((opcount+1) < nwanted))
1996 skip_optional_basereg = 1;
1997 if (have_optional_reg && ((opcount+1) < nwanted))
1998 skip_optional_reg = 1;
1999 }
2000 else
2001 {
2002 if (have_optional_basereg && (opcount < nwanted))
2003 skip_optional_basereg = 1;
2004 if (have_optional_reg && (opcount < nwanted))
2005 skip_optional_reg = 1;
2006 }
2007 }
2008
2009 /* Perform some off-by-one hacks on the length field of certain instructions.
ea1562b3
NC
2010 Its such a shame to have to do this, but the problem is that HLASM got
2011 defined so that the lengths differ by one from the actual machine instructions.
2012 this code should probably be moved to a special inster-operand routine.
2013 Sigh. Affected instructions are Compare Logical, Move and Exclusive OR
2014 hack alert -- aren't *all* SS instructions affected ?? */
5b93d8bb
AM
2015 off_by_one = 0;
2016 if (0 == strcasecmp ("CLC", opcode->name)
2017 || 0 == strcasecmp ("ED", opcode->name)
2018 || 0 == strcasecmp ("EDMK", opcode->name)
2019 || 0 == strcasecmp ("MVC", opcode->name)
2020 || 0 == strcasecmp ("MVCIN", opcode->name)
2021 || 0 == strcasecmp ("MVN", opcode->name)
2022 || 0 == strcasecmp ("MVZ", opcode->name)
2023 || 0 == strcasecmp ("NC", opcode->name)
2024 || 0 == strcasecmp ("OC", opcode->name)
2025 || 0 == strcasecmp ("XC", opcode->name))
2026 off_by_one = 1;
2027
2028 /* Gather the operands. */
2029 fc = 0;
2030 for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
2031 {
2032 const struct i370_operand *operand;
5b93d8bb
AM
2033 char *hold;
2034 expressionS ex;
2035
2036 operand = &i370_operands[*opindex_ptr];
5b93d8bb
AM
2037
2038 /* If this is an index operand, and we are skipping it,
2039 just insert a zero. */
2040 if (skip_optional_index &&
2041 ((operand->flags & I370_OPERAND_INDEX) != 0))
2042 {
2043 insn = i370_insert_operand (insn, operand, 0);
2044 continue;
2045 }
2046
2047 /* If this is the base operand, and we are skipping it,
2048 just insert the current using basreg. */
2049 if (skip_optional_basereg &&
2050 ((operand->flags & I370_OPERAND_BASE) != 0))
2051 {
2052 int basereg = -1;
2053 if (use_text)
2054 {
2055 if (0 == strncmp (now_seg->name, ".text", 5)
2056 || 0 > i370_using_other_regno)
ea1562b3 2057 basereg = i370_using_text_regno;
5b93d8bb 2058 else
ea1562b3 2059 basereg = i370_using_other_regno;
5b93d8bb
AM
2060 }
2061 else if (use_other)
2062 {
2063 if (0 > i370_using_other_regno)
ea1562b3 2064 basereg = i370_using_text_regno;
5b93d8bb 2065 else
ea1562b3 2066 basereg = i370_using_other_regno;
5b93d8bb
AM
2067 }
2068 if (0 > basereg)
20203fb9 2069 as_bad (_("not using any base register"));
ea1562b3 2070
5b93d8bb
AM
2071 insn = i370_insert_operand (insn, operand, basereg);
2072 continue;
2073 }
2074
2075 /* If this is an optional operand, and we are skipping it,
2076 Use zero (since a non-zero value would denote a register) */
2077 if (skip_optional_reg
2078 && ((operand->flags & I370_OPERAND_OPTIONAL) != 0))
2079 {
2080 insn = i370_insert_operand (insn, operand, 0);
2081 continue;
2082 }
2083
2084 /* Gather the operand. */
2085 hold = input_line_pointer;
2086 input_line_pointer = str;
2087
ea1562b3 2088 /* Register names are only allowed where there are registers. */
5b93d8bb
AM
2089 if ((operand->flags & I370_OPERAND_GPR) != 0)
2090 {
ea1562b3 2091 /* Quickie hack to get past things like (,r13). */
5b93d8bb
AM
2092 if (skip_optional_index && (',' == *input_line_pointer))
2093 {
2094 *input_line_pointer = ' ';
2095 input_line_pointer ++;
2096 }
ea1562b3 2097
5b93d8bb 2098 if (! register_name (&ex))
20203fb9 2099 as_bad (_("expecting a register for operand %d"),
8ad7c533 2100 (int) (opindex_ptr - opcode->operands + 1));
5b93d8bb
AM
2101 }
2102
b6ff326e 2103 /* Check for an address constant expression. */
5b93d8bb 2104 /* We will put PSW-relative addresses in the text section,
ea1562b3 2105 and address literals in the .data (or other) section. */
5b93d8bb 2106 else if (i370_addr_cons (&ex))
ea1562b3 2107 use_other = 1;
5b93d8bb 2108 else if (i370_addr_offset (&ex))
ea1562b3 2109 use_text = 1;
5b93d8bb
AM
2110 else expression (&ex);
2111
2112 str = input_line_pointer;
2113 input_line_pointer = hold;
2114
ea1562b3
NC
2115 /* Perform some off-by-one hacks on the length field of certain instructions.
2116 Its such a shame to have to do this, but the problem is that HLASM got
2117 defined so that the programmer specifies a length that is one greater
2118 than what the machine instruction wants. Sigh. */
5b93d8bb 2119 if (off_by_one && (0 == strcasecmp ("SS L", operand->name)))
ea1562b3 2120 ex.X_add_number --;
5b93d8bb
AM
2121
2122 if (ex.X_op == O_illegal)
20203fb9 2123 as_bad (_("illegal operand"));
5b93d8bb 2124 else if (ex.X_op == O_absent)
20203fb9 2125 as_bad (_("missing operand"));
5b93d8bb 2126 else if (ex.X_op == O_register)
ea1562b3 2127 insn = i370_insert_operand (insn, operand, ex.X_add_number);
5b93d8bb
AM
2128 else if (ex.X_op == O_constant)
2129 {
2130#ifdef OBJ_ELF
2131 /* Allow @HA, @L, @H on constants.
ea1562b3
NC
2132 Well actually, no we don't; there really don't make sense
2133 (at least not to me) for the i370. However, this code is
2134 left here for any dubious future expansion reasons. */
5b93d8bb
AM
2135 char *orig_str = str;
2136
2137 if ((reloc = i370_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED)
2138 switch (reloc)
2139 {
2140 default:
2141 str = orig_str;
2142 break;
2143
2144 case BFD_RELOC_LO16:
2145 /* X_unsigned is the default, so if the user has done
2146 something which cleared it, we always produce a
2147 signed value. */
2148 ex.X_add_number = (((ex.X_add_number & 0xffff)
2149 ^ 0x8000)
2150 - 0x8000);
2151 break;
2152
2153 case BFD_RELOC_HI16:
2154 ex.X_add_number = (ex.X_add_number >> 16) & 0xffff;
2155 break;
2156
2157 case BFD_RELOC_HI16_S:
2158 ex.X_add_number = (((ex.X_add_number >> 16) & 0xffff)
2159 + ((ex.X_add_number >> 15) & 1));
2160 break;
2161 }
2162#endif
2163 insn = i370_insert_operand (insn, operand, ex.X_add_number);
2164 }
2165#ifdef OBJ_ELF
2166 else if ((reloc = i370_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED)
2167 {
2168 as_tsktsk ("md_assemble(): suffixed relocations not supported\n");
2169
2170 /* We need to generate a fixup for this expression. */
2171 if (fc >= MAX_INSN_FIXUPS)
2172 as_fatal ("too many fixups");
2173 fixups[fc].exp = ex;
2174 fixups[fc].opindex = 0;
2175 fixups[fc].reloc = reloc;
2176 ++fc;
2177 }
2178#endif /* OBJ_ELF */
5b93d8bb
AM
2179 else
2180 {
2181 /* We need to generate a fixup for this expression. */
2182 /* Typically, the expression will just be a symbol ...
ea1562b3
NC
2183 printf ("insn %s needs fixup for %s \n",
2184 opcode->name, ex.X_add_symbol->bsym->name); */
5b93d8bb
AM
2185
2186 if (fc >= MAX_INSN_FIXUPS)
2187 as_fatal ("too many fixups");
2188 fixups[fc].exp = ex;
2189 fixups[fc].opindex = *opindex_ptr;
2190 fixups[fc].reloc = BFD_RELOC_UNUSED;
2191 ++fc;
2192 }
2193
ea1562b3 2194 /* Skip over delimiter (close paren, or comma). */
5b93d8bb
AM
2195 if ((')' == *str) && (',' == *(str+1)))
2196 ++str;
2197 if (*str != '\0')
2198 ++str;
2199 }
2200
3882b010 2201 while (ISSPACE (*str))
5b93d8bb
AM
2202 ++str;
2203
2204 if (*str != '\0')
20203fb9 2205 as_bad (_("junk at end of line: `%s'"), str);
5b93d8bb
AM
2206
2207 /* Write out the instruction. */
2208 f = frag_more (opcode->len);
2209 if (4 >= opcode->len)
ea1562b3 2210 md_number_to_chars (f, insn.i[0], opcode->len);
5b93d8bb
AM
2211 else
2212 {
2213 md_number_to_chars (f, insn.i[0], 4);
ea1562b3 2214
5b93d8bb 2215 if (6 == opcode->len)
ea1562b3 2216 md_number_to_chars ((f + 4), ((insn.i[1])>>16), 2);
5b93d8bb
AM
2217 else
2218 {
ea1562b3 2219 /* Not used --- don't have any 8 byte instructions. */
20203fb9 2220 as_bad (_("Internal Error: bad instruction length"));
ea1562b3 2221 md_number_to_chars ((f + 4), insn.i[1], opcode->len -4);
5b93d8bb
AM
2222 }
2223 }
2224
2225 /* Create any fixups. At this point we do not use a
2226 bfd_reloc_code_real_type, but instead just use the
2227 BFD_RELOC_UNUSED plus the operand index. This lets us easily
2228 handle fixups for any operand type, although that is admittedly
2229 not a very exciting feature. We pick a BFD reloc type in
55cf6793 2230 md_apply_fix. */
5b93d8bb
AM
2231 for (i = 0; i < fc; i++)
2232 {
2233 const struct i370_operand *operand;
2234
2235 operand = &i370_operands[fixups[i].opindex];
2236 if (fixups[i].reloc != BFD_RELOC_UNUSED)
2237 {
2238 reloc_howto_type *reloc_howto = bfd_reloc_type_lookup (stdoutput, fixups[i].reloc);
2239 int size;
2240 fixS *fixP;
2241
2242 if (!reloc_howto)
2243 abort ();
2244
2245 size = bfd_get_reloc_size (reloc_howto);
2246
2247 if (size < 1 || size > 4)
bc805888 2248 abort ();
5b93d8bb
AM
2249
2250 printf (" gwana doo fixup %d \n", i);
2251 fixP = fix_new_exp (frag_now, f - frag_now->fr_literal, size,
2252 &fixups[i].exp, reloc_howto->pc_relative,
2253 fixups[i].reloc);
2254
2255 /* Turn off complaints that the addend is too large for things like
2256 foo+100000@ha. */
2257 switch (fixups[i].reloc)
2258 {
2259 case BFD_RELOC_16_GOTOFF:
2260 case BFD_RELOC_LO16:
2261 case BFD_RELOC_HI16:
2262 case BFD_RELOC_HI16_S:
2263 fixP->fx_no_overflow = 1;
2264 break;
2265 default:
2266 break;
2267 }
2268 }
2269 else
2270 {
2271 fix_new_exp (frag_now, f - frag_now->fr_literal, opcode->len,
2272 &fixups[i].exp,
2273 (operand->flags & I370_OPERAND_RELATIVE) != 0,
2274 ((bfd_reloc_code_real_type)
2275 (fixups[i].opindex + (int) BFD_RELOC_UNUSED)));
2276 }
2277 }
2278}
2279
5b93d8bb
AM
2280\f
2281/* Pseudo-op handling. */
2282
2283/* The .byte pseudo-op. This is similar to the normal .byte
2284 pseudo-op, but it can also take a single ASCII string. */
2285
2286static void
ea1562b3 2287i370_byte (int ignore ATTRIBUTE_UNUSED)
5b93d8bb
AM
2288{
2289 if (*input_line_pointer != '\"')
2290 {
2291 cons (1);
2292 return;
2293 }
2294
2295 /* Gather characters. A real double quote is doubled. Unusual
2296 characters are not permitted. */
2297 ++input_line_pointer;
2298 while (1)
2299 {
2300 char c;
2301
2302 c = *input_line_pointer++;
2303
2304 if (c == '\"')
2305 {
2306 if (*input_line_pointer != '\"')
2307 break;
2308 ++input_line_pointer;
2309 }
2310
2311 FRAG_APPEND_1_CHAR (c);
2312 }
2313
2314 demand_empty_rest_of_line ();
2315}
2316\f
2317/* The .tc pseudo-op. This is used when generating XCOFF and ELF.
2318 This takes two or more arguments.
2319
2320 When generating XCOFF output, the first argument is the name to
2321 give to this location in the toc; this will be a symbol with class
2322 TC. The rest of the arguments are 4 byte values to actually put at
2323 this location in the TOC; often there is just one more argument, a
1049f94e 2324 relocatable symbol reference.
5b93d8bb
AM
2325
2326 When not generating XCOFF output, the arguments are the same, but
2327 the first argument is simply ignored. */
2328
2329static void
ea1562b3 2330i370_tc (int ignore ATTRIBUTE_UNUSED)
5b93d8bb
AM
2331{
2332
2333 /* Skip the TOC symbol name. */
2334 while (is_part_of_name (*input_line_pointer)
2335 || *input_line_pointer == '['
2336 || *input_line_pointer == ']'
2337 || *input_line_pointer == '{'
2338 || *input_line_pointer == '}')
2339 ++input_line_pointer;
2340
2341 /* Align to a four byte boundary. */
2342 frag_align (2, 0, 0);
2343 record_alignment (now_seg, 2);
2344
2345 if (*input_line_pointer != ',')
2346 demand_empty_rest_of_line ();
2347 else
2348 {
2349 ++input_line_pointer;
2350 cons (4);
2351 }
2352}
2353\f
5b93d8bb 2354char *
ea1562b3 2355md_atof (int type, char *litp, int *sizep)
5b93d8bb 2356{
5b93d8bb 2357 /* 360/370/390 have two float formats: an old, funky 360 single-precision
499ac353
NC
2358 format, and the ieee format. Support only the ieee format. */
2359 return ieee_md_atof (type, litp, sizep, TRUE);
5b93d8bb
AM
2360}
2361
2362/* Write a value out to the object file, using the appropriate
2363 endianness. */
2364
2365void
ea1562b3 2366md_number_to_chars (char *buf, valueT val, int n)
5b93d8bb 2367{
ea1562b3 2368 number_to_chars_bigendian (buf, val, n);
5b93d8bb
AM
2369}
2370
2371/* Align a section (I don't know why this is machine dependent). */
2372
2373valueT
ea1562b3 2374md_section_align (asection *seg, valueT addr)
5b93d8bb
AM
2375{
2376 int align = bfd_get_section_alignment (stdoutput, seg);
2377
8d3842cd 2378 return (addr + (1 << align) - 1) & -(1 << align);
5b93d8bb
AM
2379}
2380
2381/* We don't have any form of relaxing. */
2382
2383int
ea1562b3
NC
2384md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
2385 asection *seg ATTRIBUTE_UNUSED)
5b93d8bb
AM
2386{
2387 abort ();
2388 return 0;
2389}
2390
2391/* Convert a machine dependent frag. We never generate these. */
2392
2393void
ea1562b3
NC
2394md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
2395 asection *sec ATTRIBUTE_UNUSED,
2396 fragS *fragp ATTRIBUTE_UNUSED)
5b93d8bb
AM
2397{
2398 abort ();
2399}
2400
2401/* We have no need to default values of symbols. */
2402
5b93d8bb 2403symbolS *
ea1562b3 2404md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
5b93d8bb
AM
2405{
2406 return 0;
2407}
2408\f
2409/* Functions concerning relocs. */
2410
2411/* The location from which a PC relative jump should be calculated,
2412 given a PC relative reloc. */
2413
2414long
ea1562b3 2415md_pcrel_from_section (fixS *fixp, segT sec ATTRIBUTE_UNUSED)
5b93d8bb
AM
2416{
2417 return fixp->fx_frag->fr_address + fixp->fx_where;
2418}
2419
5b93d8bb
AM
2420/* Apply a fixup to the object code. This is called for all the
2421 fixups we generated by the call to fix_new_exp, above. In the call
2422 above we used a reloc code which was the largest legal reloc code
2423 plus the operand index. Here we undo that to recover the operand
2424 index. At this point all symbol values should be fully resolved,
2425 and we attempt to completely resolve the reloc. If we can not do
2426 that, we determine the correct reloc code and put it back in the
2427 fixup.
2428
2429 See gas/cgen.c for more sample code and explanations of what's
ea1562b3 2430 going on here. */
5b93d8bb 2431
94f592af 2432void
55cf6793 2433md_apply_fix (fixS *fixP, valueT * valP, segT seg)
5b93d8bb 2434{
94f592af 2435 valueT value = * valP;
5b93d8bb 2436
94f592af 2437 if (fixP->fx_addsy != NULL)
5b93d8bb 2438 {
5b93d8bb 2439#ifdef DEBUG
55cf6793 2440 printf ("\nmd_apply_fix: symbol %s at 0x%x (%s:%d) val=0x%x addend=0x%x\n",
94f592af
NC
2441 S_GET_NAME (fixP->fx_addsy),
2442 fixP->fx_frag->fr_address + fixP->fx_where,
2443 fixP->fx_file, fixP->fx_line,
2444 S_GET_VALUE (fixP->fx_addsy), value);
5b93d8bb
AM
2445#endif
2446 }
2447 else
a161fe53 2448 fixP->fx_done = 1;
5b93d8bb
AM
2449
2450 /* Apply fixups to operands. Note that there should be no relocations
2451 for any operands, since no instruction ever takes an operand
2452 that requires reloc. */
94f592af 2453 if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
5b93d8bb
AM
2454 {
2455 int opindex;
2456 const struct i370_operand *operand;
2457 char *where;
2458 i370_insn_t insn;
2459
94f592af 2460 opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
5b93d8bb
AM
2461
2462 operand = &i370_operands[opindex];
2463
2464#ifdef DEBUG
55cf6793 2465 printf ("\nmd_apply_fix: fixup operand %s at 0x%x in %s:%d addend=0x%x\n",
5b93d8bb 2466 operand->name,
94f592af
NC
2467 fixP->fx_frag->fr_address + fixP->fx_where,
2468 fixP->fx_file, fixP->fx_line,
5b93d8bb
AM
2469 value);
2470#endif
2471 /* Fetch the instruction, insert the fully resolved operand
2472 value, and stuff the instruction back again.
92774660 2473 fisxp->fx_size is the length of the instruction. */
94f592af 2474 where = fixP->fx_frag->fr_literal + fixP->fx_where;
5b93d8bb 2475 insn.i[0] = bfd_getb32 ((unsigned char *) where);
94f592af
NC
2476
2477 if (6 <= fixP->fx_size)
2478 /* Deal with 48-bit insn's. */
2479 insn.i[1] = bfd_getb32 (((unsigned char *) where)+4);
2480
5b93d8bb
AM
2481 insn = i370_insert_operand (insn, operand, (offsetT) value);
2482 bfd_putb32 ((bfd_vma) insn.i[0], (unsigned char *) where);
5b93d8bb 2483
94f592af
NC
2484 if (6 <= fixP->fx_size)
2485 /* Deal with 48-bit insn's. */
2486 bfd_putb32 ((bfd_vma) insn.i[1], (((unsigned char *) where)+4));
2487
2488 /* We are done, right? right !! */
2489 fixP->fx_done = 1;
2490 if (fixP->fx_done)
2491 /* Nothing else to do here. */
2492 return;
5b93d8bb
AM
2493
2494 /* Determine a BFD reloc value based on the operand information.
2495 We are only prepared to turn a few of the operands into
2496 relocs. In fact, we support *zero* operand relocations ...
2497 Why? Because we are not expecting the compiler to generate
2498 any operands that need relocation. Due to the 12-bit naturew of
92774660 2499 i370 addressing, this would be unusual. */
5b93d8bb
AM
2500 {
2501 char *sfile;
2502 unsigned int sline;
2503
2504 /* Use expr_symbol_where to see if this is an expression
2505 symbol. */
94f592af
NC
2506 if (expr_symbol_where (fixP->fx_addsy, &sfile, &sline))
2507 as_bad_where (fixP->fx_file, fixP->fx_line,
5b93d8bb
AM
2508 "unresolved expression that must be resolved");
2509 else
94f592af 2510 as_bad_where (fixP->fx_file, fixP->fx_line,
5b93d8bb 2511 "unsupported relocation type");
94f592af
NC
2512 fixP->fx_done = 1;
2513 return;
5b93d8bb
AM
2514 }
2515 }
2516 else
2517 {
2518 /* We branch to here if the fixup is not to a symbol that
94f592af
NC
2519 appears in an instruction operand, but is rather some
2520 declared storage. */
5b93d8bb 2521#ifdef OBJ_ELF
94f592af 2522 i370_elf_validate_fix (fixP, seg);
5b93d8bb
AM
2523#endif
2524#ifdef DEBUG
55cf6793 2525 printf ("md_apply_fix: reloc case %d in segment %s %s:%d\n",
94f592af 2526 fixP->fx_r_type, segment_name (seg), fixP->fx_file, fixP->fx_line);
5b93d8bb
AM
2527 printf ("\tcurrent fixup value is 0x%x \n", value);
2528#endif
94f592af 2529 switch (fixP->fx_r_type)
5b93d8bb
AM
2530 {
2531 case BFD_RELOC_32:
2532 case BFD_RELOC_CTOR:
94f592af
NC
2533 if (fixP->fx_pcrel)
2534 fixP->fx_r_type = BFD_RELOC_32_PCREL;
2535 /* Fall through. */
5b93d8bb
AM
2536
2537 case BFD_RELOC_RVA:
2538 case BFD_RELOC_32_PCREL:
2539 case BFD_RELOC_32_BASEREL:
2540#ifdef DEBUG
2541 printf ("\t32 bit relocation at 0x%x\n",
94f592af 2542 fixP->fx_frag->fr_address + fixP->fx_where);
5b93d8bb 2543#endif
94f592af 2544 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5b93d8bb
AM
2545 value, 4);
2546 break;
2547
2548 case BFD_RELOC_LO16:
2549 case BFD_RELOC_16:
94f592af
NC
2550 if (fixP->fx_pcrel)
2551 as_bad_where (fixP->fx_file, fixP->fx_line,
5b93d8bb 2552 "cannot emit PC relative %s relocation%s%s",
94f592af
NC
2553 bfd_get_reloc_code_name (fixP->fx_r_type),
2554 fixP->fx_addsy != NULL ? " against " : "",
2555 (fixP->fx_addsy != NULL
2556 ? S_GET_NAME (fixP->fx_addsy)
5b93d8bb
AM
2557 : ""));
2558
94f592af 2559 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5b93d8bb
AM
2560 value, 2);
2561 break;
2562
2563 /* This case happens when you write, for example,
2564 lis %r3,(L1-L2)@ha
2565 where L1 and L2 are defined later. */
2566 case BFD_RELOC_HI16:
94f592af 2567 if (fixP->fx_pcrel)
5b93d8bb 2568 abort ();
94f592af 2569 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5b93d8bb
AM
2570 value >> 16, 2);
2571 break;
2572 case BFD_RELOC_HI16_S:
94f592af 2573 if (fixP->fx_pcrel)
5b93d8bb 2574 abort ();
94f592af 2575 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5b93d8bb
AM
2576 (value + 0x8000) >> 16, 2);
2577 break;
2578
2579 case BFD_RELOC_8:
94f592af 2580 if (fixP->fx_pcrel)
5b93d8bb
AM
2581 abort ();
2582
94f592af 2583 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5b93d8bb
AM
2584 value, 1);
2585 break;
2586
2587 default:
bc805888 2588 fprintf (stderr,
94f592af 2589 "Gas failure, reloc value %d\n", fixP->fx_r_type);
07726851 2590 fflush (stderr);
5b93d8bb
AM
2591 abort ();
2592 }
2593 }
2594
94f592af 2595 fixP->fx_addnumber = value;
5b93d8bb
AM
2596}
2597
2598/* Generate a reloc for a fixup. */
2599
2600arelent *
ea1562b3 2601tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
5b93d8bb
AM
2602{
2603 arelent *reloc;
2604
ea1562b3 2605 reloc = xmalloc (sizeof (arelent));
5b93d8bb 2606
ea1562b3 2607 reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
5b93d8bb
AM
2608 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2609 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2610 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
2611 if (reloc->howto == (reloc_howto_type *) NULL)
2612 {
2613 as_bad_where (fixp->fx_file, fixp->fx_line,
2614 "reloc %d not supported by object file format", (int)fixp->fx_r_type);
2615 return NULL;
2616 }
2617 reloc->addend = fixp->fx_addnumber;
2618
2619#ifdef DEBUG
2620 printf ("\ngen_reloc(): sym %s (%s:%d) at addr 0x%x addend=0x%x\n",
2621 fixp->fx_addsy->bsym->name,
2622 fixp->fx_file, fixp->fx_line,
2623 reloc->address, reloc->addend);
2624#endif
2625
2626 return reloc;
2627}
ea1562b3
NC
2628
2629/* The target specific pseudo-ops which we support. */
2630
2631const pseudo_typeS md_pseudo_table[] =
2632{
2633 /* Pseudo-ops which must be overridden. */
2634 { "byte", i370_byte, 0 },
2635
2636 { "dc", i370_dc, 0 },
2637 { "ds", i370_ds, 0 },
2638 { "rmode", i370_rmode, 0 },
2639 { "csect", i370_csect, 0 },
2640 { "dsect", i370_dsect, 0 },
2641
2642 /* enable ebcdic strings e.g. for 3270 support */
2643 { "ebcdic", i370_ebcdic, 0 },
2644
2645#ifdef OBJ_ELF
2646 { "long", i370_elf_cons, 4 },
2647 { "word", i370_elf_cons, 4 },
2648 { "short", i370_elf_cons, 2 },
2649 { "rdata", i370_elf_rdata, 0 },
2650 { "rodata", i370_elf_rdata, 0 },
2651 { "lcomm", i370_elf_lcomm, 0 },
2652#endif
2653
2654 /* This pseudo-op is used even when not generating XCOFF output. */
2655 { "tc", i370_tc, 0 },
2656
2657 /* dump the literal pool */
2658 { "ltorg", i370_ltorg, 0 },
2659
2660 /* support the hlasm-style USING directive */
2661 { "using", i370_using, 0 },
2662 { "drop", i370_drop, 0 },
2663
2664 { NULL, NULL, 0 }
2665};
This page took 0.810567 seconds and 4 git commands to generate.