Update year range in copyright notice of binutils files
[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
219d1afa 3 Copyright (C) 1994-2018 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 {
e0471c16 105 const char *name;
5b93d8bb
AM
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
33eaf5de 279 /* If numeric, make sure it's 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
17b9d67d 361md_parse_option (int c, const 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;
33eaf5de 446 but can be made more fine grained if desired. */
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 {
e0471c16 585 const char *string;
5b93d8bb
AM
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)
992a06ee
AM
683 as_bad (ngettext ("%s relocations do not fit in %u byte",
684 "%s relocations do not fit in %u bytes",
685 nbytes),
20203fb9 686 reloc_howto->name, nbytes);
5b93d8bb
AM
687 else
688 {
ea1562b3 689 char *p = frag_more ((int) nbytes);
5b93d8bb
AM
690 int offset = nbytes - size;
691
692 fix_new_exp (frag_now, p - frag_now->fr_literal + offset, size, &exp, 0, reloc);
693 }
694 }
695 else
696 emit_expr (&exp, (unsigned int) nbytes);
697 }
698 while (*input_line_pointer++ == ',');
699
92774660 700 input_line_pointer--; /* Put terminator back into stream. */
5b93d8bb
AM
701 demand_empty_rest_of_line ();
702}
703
704\f
705/* ASCII to EBCDIC conversion table. */
706static unsigned char ascebc[256] =
707{
708 /*00 NL SH SX EX ET NQ AK BL */
709 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F,
710 /*08 BS HT LF VT FF CR SO SI */
711 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
712 /*10 DL D1 D2 D3 D4 NK SN EB */
713 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26,
714 /*18 CN EM SB EC FS GS RS US */
715 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
716 /*20 SP ! " # $ % & ' */
717 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D,
718 /*28 ( ) * + , - . / */
719 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
720 /*30 0 1 2 3 4 5 6 7 */
721 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
722 /*38 8 9 : ; < = > ? */
723 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
724 /*40 @ A B C D E F G */
725 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
726 /*48 H I J K L M N O */
727 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
728 /*50 P Q R S T U V W */
729 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6,
730 /*58 X Y Z [ \ ] ^ _ */
731 0xE7, 0xE8, 0xE9, 0xAD, 0xE0, 0xBD, 0x5F, 0x6D,
732 /*60 ` a b c d e f g */
733 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
734 /*68 h i j k l m n o */
735 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
736 /*70 p q r s t u v w */
737 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
738 /*78 x y z { | } ~ DL */
739 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07,
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, 0x3F,
754 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
755 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFF
756};
757
758/* EBCDIC to ASCII conversion table. */
759unsigned char ebcasc[256] =
760{
761 /*00 NU SH SX EX PF HT LC DL */
762 0x00, 0x01, 0x02, 0x03, 0x00, 0x09, 0x00, 0x7F,
763 /*08 SM VT FF CR SO SI */
764 0x00, 0x00, 0x00, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
765 /*10 DE D1 D2 TM RS NL BS IL */
766 0x10, 0x11, 0x12, 0x13, 0x14, 0x0A, 0x08, 0x00,
767 /*18 CN EM CC C1 FS GS RS US */
768 0x18, 0x19, 0x00, 0x00, 0x1C, 0x1D, 0x1E, 0x1F,
769 /*20 DS SS FS BP LF EB EC */
770 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x17, 0x1B,
771 /*28 SM C2 EQ AK BL */
772 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x07, 0x00,
773 /*30 SY PN RS UC ET */
774 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
775 /*38 C3 D4 NK SU */
776 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x00, 0x1A,
777 /*40 SP */
778 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
779 /*48 . < ( + | */
780 0x00, 0x00, 0x00, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
781 /*50 & */
782 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
783 /*58 ! $ * ) ; ^ */
784 0x00, 0x00, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x5E,
785 /*60 - / */
786 0x2D, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
787 /*68 , % _ > ? */
788 0x00, 0x00, 0x00, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
789 /*70 */
790 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
791 /*78 ` : # @ ' = " */
792 0x00, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
793 /*80 a b c d e f g */
794 0x00, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
795 /*88 h i { */
796 0x68, 0x69, 0x00, 0x7B, 0x00, 0x00, 0x00, 0x00,
797 /*90 j k l m n o p */
798 0x00, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70,
799 /*98 q r } */
800 0x71, 0x72, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x00,
801 /*A0 ~ s t u v w x */
802 0x00, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
803 /*A8 y z [ */
804 0x79, 0x7A, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00,
805 /*B0 */
806 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
807 /*B8 ] */
808 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00,
809 /*C0 { A B C D E F G */
810 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
811 /*C8 H I */
812 0x48, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
813 /*D0 } J K L M N O P */
814 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,
815 /*D8 Q R */
816 0x51, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
817 /*E0 \ S T U V W X */
818 0x5C, 0x00, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
819 /*E8 Y Z */
820 0x59, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
821 /*F0 0 1 2 3 4 5 6 7 */
822 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
823 /*F8 8 9 */
824 0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF
825};
826
ea1562b3
NC
827/* EBCDIC translation tables needed for 3270 support. */
828
5b93d8bb 829static void
ea1562b3 830i370_ebcdic (int unused ATTRIBUTE_UNUSED)
5b93d8bb
AM
831{
832 char *p, *end;
833 char delim = 0;
834 size_t nbytes;
835
836 nbytes = strlen (input_line_pointer);
837 end = input_line_pointer + nbytes;
838 while ('\r' == *end) end --;
839 while ('\n' == *end) end --;
840
841 delim = *input_line_pointer;
ea1562b3
NC
842 if (('\'' == delim) || ('\"' == delim))
843 {
844 input_line_pointer ++;
845 end = rindex (input_line_pointer, delim);
846 }
5b93d8bb
AM
847
848 if (end > input_line_pointer)
849 {
850 nbytes = end - input_line_pointer +1;
851 p = frag_more (nbytes);
852 while (end > input_line_pointer)
853 {
bc805888 854 *p = ascebc [(unsigned char) (*input_line_pointer)];
5b93d8bb
AM
855 ++p; ++input_line_pointer;
856 }
857 *p = '\0';
858 }
859 if (delim == *input_line_pointer) ++input_line_pointer;
860}
861
862\f
ea1562b3
NC
863/* Stub out a couple of routines. */
864
5b93d8bb 865static void
ea1562b3 866i370_rmode (int unused ATTRIBUTE_UNUSED)
5b93d8bb
AM
867{
868 as_tsktsk ("rmode ignored");
869}
870
871static void
ea1562b3 872i370_dsect (int sect)
5b93d8bb
AM
873{
874 char *save_line = input_line_pointer;
875 static char section[] = ".data\n";
876
ea1562b3 877 /* Just pretend this is .section .data. */
5b93d8bb
AM
878 input_line_pointer = section;
879 obj_elf_section (sect);
880
881 input_line_pointer = save_line;
882}
883
884static void
ea1562b3 885i370_csect (int unused ATTRIBUTE_UNUSED)
5b93d8bb
AM
886{
887 as_tsktsk ("csect not supported");
888}
889
890\f
891/* DC Define Const is only partially supported.
33eaf5de 892 For sample code on what to do, look at i370_elf_cons() above.
ea1562b3
NC
893 This code handles pseudoops of the style
894 DC D'3.141592653' # in sysv4, .double 3.14159265
895 DC F'1' # in sysv4, .long 1. */
896
5b93d8bb 897static void
ea1562b3 898i370_dc (int unused ATTRIBUTE_UNUSED)
5b93d8bb
AM
899{
900 char * p, tmp[50];
901 int nbytes=0;
902 expressionS exp;
903 char type=0;
91d6fa6a 904 char * clse;
5b93d8bb
AM
905
906 if (is_it_end_of_statement ())
907 {
908 demand_empty_rest_of_line ();
909 return;
910 }
911
ea1562b3 912 /* Figure out the size. */
5b93d8bb
AM
913 type = *input_line_pointer++;
914 switch (type)
915 {
916 case 'H': /* 16-bit */
917 nbytes = 2;
918 break;
919 case 'E': /* 32-bit */
920 case 'F': /* 32-bit */
921 nbytes = 4;
922 break;
923 case 'D': /* 64-bit */
924 nbytes = 8;
925 break;
926 default:
20203fb9 927 as_bad (_("unsupported DC type"));
5b93d8bb
AM
928 return;
929 }
930
ea1562b3 931 /* Get rid of pesky quotes. */
5b93d8bb
AM
932 if ('\'' == *input_line_pointer)
933 {
5b93d8bb 934 ++input_line_pointer;
91d6fa6a
NC
935 clse = strchr (input_line_pointer, '\'');
936 if (clse)
937 *clse= ' ';
5b93d8bb 938 else
20203fb9 939 as_bad (_("missing end-quote"));
5b93d8bb 940 }
ea1562b3 941
5b93d8bb
AM
942 if ('\"' == *input_line_pointer)
943 {
5b93d8bb 944 ++input_line_pointer;
91d6fa6a
NC
945 clse = strchr (input_line_pointer, '\"');
946 if (clse)
947 *clse= ' ';
5b93d8bb 948 else
20203fb9 949 as_bad (_("missing end-quote"));
5b93d8bb
AM
950 }
951
952 switch (type)
953 {
954 case 'H': /* 16-bit */
955 case 'F': /* 32-bit */
956 expression (&exp);
957 emit_expr (&exp, nbytes);
958 break;
959 case 'E': /* 32-bit */
499ac353 960 type = 'f';
1a0670f3 961 /* Fall through. */
5b93d8bb
AM
962 case 'D': /* 64-bit */
963 md_atof (type, tmp, &nbytes);
964 p = frag_more (nbytes);
965 memcpy (p, tmp, nbytes);
966 break;
967 default:
20203fb9 968 as_bad (_("unsupported DC type"));
5b93d8bb
AM
969 return;
970 }
971
972 demand_empty_rest_of_line ();
973}
974
975\f
ea1562b3
NC
976/* Provide minimal support for DS Define Storage. */
977
5b93d8bb 978static void
ea1562b3 979i370_ds (int unused ATTRIBUTE_UNUSED)
5b93d8bb 980{
ea1562b3 981 /* DS 0H or DS 0F or DS 0D. */
5b93d8bb
AM
982 if ('0' == *input_line_pointer)
983 {
ea1562b3 984 int alignment = 0; /* Left shift 1 << align. */
5b93d8bb
AM
985 input_line_pointer ++;
986 switch (*input_line_pointer++)
987 {
988 case 'H': /* 16-bit */
989 alignment = 1;
990 break;
991 case 'F': /* 32-bit */
992 alignment = 2;
993 break;
994 case 'D': /* 64-bit */
995 alignment = 3;
996 break;
997 default:
20203fb9 998 as_bad (_("unsupported alignment"));
5b93d8bb
AM
999 return;
1000 }
1001 frag_align (alignment, 0, 0);
1002 record_alignment (now_seg, alignment);
1003 }
1004 else
20203fb9 1005 as_bad (_("this DS form not yet supported"));
5b93d8bb
AM
1006}
1007
1008/* Solaris pseudo op to change to the .rodata section. */
ea1562b3 1009
5b93d8bb 1010static void
ea1562b3 1011i370_elf_rdata (int sect)
5b93d8bb
AM
1012{
1013 char *save_line = input_line_pointer;
1014 static char section[] = ".rodata\n";
1015
ea1562b3 1016 /* Just pretend this is .section .rodata. */
5b93d8bb
AM
1017 input_line_pointer = section;
1018 obj_elf_section (sect);
1019
1020 input_line_pointer = save_line;
1021}
1022
ea1562b3
NC
1023/* Pseudo op to make file scope bss items. */
1024
5b93d8bb 1025static void
ea1562b3 1026i370_elf_lcomm (int unused ATTRIBUTE_UNUSED)
5b93d8bb 1027{
ea1562b3
NC
1028 char *name;
1029 char c;
1030 char *p;
5b93d8bb 1031 offsetT size;
ea1562b3 1032 symbolS *symbolP;
5b93d8bb
AM
1033 offsetT align;
1034 segT old_sec;
1035 int old_subsec;
1036 char *pfrag;
1037 int align2;
1038
d02603dc 1039 c = get_symbol_name (&name);
5b93d8bb 1040
ea1562b3 1041 /* Just after name is now '\0'. */
5b93d8bb 1042 p = input_line_pointer;
d02603dc 1043 (void) restore_line_pointer (c);
5b93d8bb
AM
1044 SKIP_WHITESPACE ();
1045 if (*input_line_pointer != ',')
1046 {
20203fb9 1047 as_bad (_("Expected comma after symbol-name: rest of line ignored."));
5b93d8bb
AM
1048 ignore_rest_of_line ();
1049 return;
1050 }
1051
ea1562b3
NC
1052 /* Skip ','. */
1053 input_line_pointer++;
5b93d8bb
AM
1054 if ((size = get_absolute_expression ()) < 0)
1055 {
20203fb9 1056 as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) size);
5b93d8bb
AM
1057 ignore_rest_of_line ();
1058 return;
1059 }
1060
1061 /* The third argument to .lcomm is the alignment. */
1062 if (*input_line_pointer != ',')
1063 align = 8;
1064 else
1065 {
1066 ++input_line_pointer;
1067 align = get_absolute_expression ();
1068 if (align <= 0)
1069 {
20203fb9 1070 as_warn (_("ignoring bad alignment"));
5b93d8bb
AM
1071 align = 8;
1072 }
1073 }
1074
1075 *p = 0;
1076 symbolP = symbol_find_or_make (name);
1077 *p = c;
1078
1079 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
1080 {
20203fb9 1081 as_bad (_("Ignoring attempt to re-define symbol `%s'."),
5b93d8bb
AM
1082 S_GET_NAME (symbolP));
1083 ignore_rest_of_line ();
1084 return;
1085 }
1086
1087 if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size)
1088 {
20203fb9 1089 as_bad (_("Length of .lcomm \"%s\" is already %ld. Not changed to %ld."),
5b93d8bb
AM
1090 S_GET_NAME (symbolP),
1091 (long) S_GET_VALUE (symbolP),
1092 (long) size);
1093
1094 ignore_rest_of_line ();
1095 return;
1096 }
1097
ea1562b3 1098 /* Allocate_bss: */
5b93d8bb
AM
1099 old_sec = now_seg;
1100 old_subsec = now_subseg;
1101 if (align)
1102 {
ea1562b3 1103 /* Convert to a power of 2 alignment. */
5b93d8bb
AM
1104 for (align2 = 0; (align & 1) == 0; align >>= 1, ++align2)
1105 ;
1106 if (align != 1)
1107 {
20203fb9 1108 as_bad (_("Common alignment not a power of 2"));
5b93d8bb
AM
1109 ignore_rest_of_line ();
1110 return;
1111 }
1112 }
1113 else
1114 align2 = 0;
1115
1116 record_alignment (bss_section, align2);
1117 subseg_set (bss_section, 0);
1118 if (align2)
1119 frag_align (align2, 0, 0);
1120 if (S_GET_SEGMENT (symbolP) == bss_section)
1121 symbol_get_frag (symbolP)->fr_symbol = 0;
1122 symbol_set_frag (symbolP, frag_now);
1123 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, size,
1124 (char *) 0);
1125 *pfrag = 0;
1126 S_SET_SIZE (symbolP, size);
1127 S_SET_SEGMENT (symbolP, bss_section);
1128 subseg_set (old_sec, old_subsec);
1129 demand_empty_rest_of_line ();
1130}
1131
1132/* Validate any relocations emitted for -mrelocatable, possibly adding
1133 fixups for word relocations in writable segments, so we can adjust
1134 them at runtime. */
ea1562b3 1135
5b93d8bb 1136static void
ea1562b3 1137i370_elf_validate_fix (fixS *fixp, segT seg)
5b93d8bb
AM
1138{
1139 if (fixp->fx_done || fixp->fx_pcrel)
1140 return;
1141
1142 switch (shlib)
1143 {
1144 case SHLIB_NONE:
1145 case SHLIB_PIC:
1146 return;
1147
1148 case SHILB_MRELOCATABLE:
1149 if (fixp->fx_r_type <= BFD_RELOC_UNUSED
1150 && fixp->fx_r_type != BFD_RELOC_16_GOTOFF
1151 && fixp->fx_r_type != BFD_RELOC_HI16_GOTOFF
1152 && fixp->fx_r_type != BFD_RELOC_LO16_GOTOFF
1153 && fixp->fx_r_type != BFD_RELOC_HI16_S_GOTOFF
1154 && fixp->fx_r_type != BFD_RELOC_32_BASEREL
1155 && fixp->fx_r_type != BFD_RELOC_LO16_BASEREL
1156 && fixp->fx_r_type != BFD_RELOC_HI16_BASEREL
1157 && fixp->fx_r_type != BFD_RELOC_HI16_S_BASEREL
1158 && strcmp (segment_name (seg), ".got2") != 0
1159 && strcmp (segment_name (seg), ".dtors") != 0
1160 && strcmp (segment_name (seg), ".ctors") != 0
1161 && strcmp (segment_name (seg), ".fixup") != 0
1162 && strcmp (segment_name (seg), ".stab") != 0
1163 && strcmp (segment_name (seg), ".gcc_except_table") != 0
1164 && strcmp (segment_name (seg), ".ex_shared") != 0)
1165 {
1166 if ((seg->flags & (SEC_READONLY | SEC_CODE)) != 0
1167 || fixp->fx_r_type != BFD_RELOC_CTOR)
ea1562b3
NC
1168 as_bad_where (fixp->fx_file, fixp->fx_line,
1169 "Relocation cannot be done when using -mrelocatable");
5b93d8bb
AM
1170 }
1171 return;
ea1562b3
NC
1172 default:
1173 break;
5b93d8bb
AM
1174 }
1175}
1176#endif /* OBJ_ELF */
1177
5b93d8bb
AM
1178\f
1179#define LITERAL_POOL_SUPPORT
1180#ifdef LITERAL_POOL_SUPPORT
ea1562b3
NC
1181/* Provide support for literal pools within the text section.
1182 Loosely based on similar code from tc-arm.c.
1183 We will use four symbols to locate four parts of the literal pool.
1184 These four sections contain 64,32,16 and 8-bit constants; we use
1185 four sections so that all memory access can be appropriately aligned.
1186 That is, we want to avoid mixing these together so that we don't
1187 waste space padding out to alignments. The four pointers
1188 longlong_poolP, word_poolP, etc. point to a symbol labeling the
1189 start of each pool part.
3739860c 1190
ea1562b3 1191 lit_pool_num increments from zero to infinity and uniquely id's
33eaf5de 1192 -- it's used to generate the *_poolP symbol name. */
5b93d8bb
AM
1193
1194#define MAX_LITERAL_POOL_SIZE 1024
1195
1196typedef struct literalS
1197{
1198 struct expressionS exp;
1199 char * sym_name;
1200 char size; /* 1,2,4 or 8 */
1201 short offset;
1202} literalT;
1203
1204literalT literals[MAX_LITERAL_POOL_SIZE];
ea1562b3 1205int next_literal_pool_place = 0; /* Next free entry in the pool. */
5b93d8bb 1206
ea1562b3
NC
1207static symbolS *longlong_poolP = NULL; /* 64-bit pool entries. */
1208static symbolS *word_poolP = NULL; /* 32-bit pool entries. */
1209static symbolS *short_poolP = NULL; /* 16-bit pool entries. */
1210static symbolS *byte_poolP = NULL; /* 8-bit pool entries. */
5b93d8bb
AM
1211
1212static int lit_pool_num = 1;
1213
ea1562b3 1214/* Create a new, empty symbol. */
5b93d8bb
AM
1215static symbolS *
1216symbol_make_empty (void)
1217{
1218 return symbol_create (FAKE_LABEL_NAME, undefined_section,
1219 (valueT) 0, &zero_address_frag);
1220}
1221
ea1562b3
NC
1222/* Make the first argument an address-relative expression
1223 by subtracting the second argument. */
1224
1225static void
1226i370_make_relative (expressionS *exx, expressionS *baseaddr)
1227{
1228 if (O_constant == baseaddr->X_op)
1229 {
1230 exx->X_op = O_symbol;
1231 exx->X_add_number -= baseaddr->X_add_number;
1232 }
1233 else if (O_symbol == baseaddr->X_op)
1234 {
1235 exx->X_op = O_subtract;
1236 exx->X_op_symbol = baseaddr->X_add_symbol;
1237 exx->X_add_number -= baseaddr->X_add_number;
1238 }
1239 else if (O_uminus == baseaddr->X_op)
1240 {
1241 exx->X_op = O_add;
1242 exx->X_op_symbol = baseaddr->X_add_symbol;
1243 exx->X_add_number += baseaddr->X_add_number;
1244 }
1245 else
20203fb9 1246 as_bad (_("Missing or bad .using directive"));
ea1562b3
NC
1247}
1248/* Add an expression to the literal pool. */
1249
5b93d8bb
AM
1250static void
1251add_to_lit_pool (expressionS *exx, char *name, int sz)
1252{
1253 int lit_count = 0;
1254 int offset_in_pool = 0;
1255
ea1562b3 1256 /* Start a new pool, if necessary. */
5b93d8bb 1257 if (8 == sz && NULL == longlong_poolP)
07726851 1258 longlong_poolP = symbol_make_empty ();
5b93d8bb 1259 else if (4 == sz && NULL == word_poolP)
07726851 1260 word_poolP = symbol_make_empty ();
5b93d8bb 1261 else if (2 == sz && NULL == short_poolP)
07726851 1262 short_poolP = symbol_make_empty ();
5b93d8bb 1263 else if (1 == sz && NULL == byte_poolP)
07726851 1264 byte_poolP = symbol_make_empty ();
5b93d8bb 1265
ea1562b3
NC
1266 /* Check if this literal value is already in the pool.
1267 FIXME: We should probably be checking expressions
1268 of type O_symbol as well.
1269 FIXME: This is probably(certainly?) broken for O_big,
1270 which includes 64-bit long-longs. */
5b93d8bb
AM
1271 while (lit_count < next_literal_pool_place)
1272 {
1273 if (exx->X_op == O_constant
1274 && literals[lit_count].exp.X_op == exx->X_op
1275 && literals[lit_count].exp.X_add_number == exx->X_add_number
1276 && literals[lit_count].exp.X_unsigned == exx->X_unsigned
1277 && literals[lit_count].size == sz)
1278 break;
1279 else if (literals[lit_count].sym_name
1280 && name
1281 && !strcmp (name, literals[lit_count].sym_name))
1282 break;
1283 if (sz == literals[lit_count].size)
1284 offset_in_pool += sz;
1285 lit_count ++;
1286 }
1287
1288 if (lit_count == next_literal_pool_place) /* new entry */
1289 {
1290 if (next_literal_pool_place > MAX_LITERAL_POOL_SIZE)
20203fb9 1291 as_bad (_("Literal Pool Overflow"));
5b93d8bb
AM
1292
1293 literals[next_literal_pool_place].exp = *exx;
1294 literals[next_literal_pool_place].size = sz;
1295 literals[next_literal_pool_place].offset = offset_in_pool;
1296 if (name)
ea1562b3 1297 literals[next_literal_pool_place].sym_name = strdup (name);
5b93d8bb 1298 else
ea1562b3 1299 literals[next_literal_pool_place].sym_name = NULL;
5b93d8bb
AM
1300 next_literal_pool_place++;
1301 }
1302
0234cb7c 1303 /* ???_poolP points to the beginning of the literal pool.
ea1562b3
NC
1304 X_add_number is the offset from the beginning of the
1305 literal pool to this expr minus the location of the most
1306 recent .using directive. Thus, the grand total value of the
1307 expression is the distance from .using to the literal. */
5b93d8bb
AM
1308 if (8 == sz)
1309 exx->X_add_symbol = longlong_poolP;
1310 else if (4 == sz)
1311 exx->X_add_symbol = word_poolP;
1312 else if (2 == sz)
1313 exx->X_add_symbol = short_poolP;
1314 else if (1 == sz)
1315 exx->X_add_symbol = byte_poolP;
1316 exx->X_add_number = offset_in_pool;
1317 exx->X_op_symbol = NULL;
1318
1319 /* If the user has set up a base reg in another section,
ea1562b3 1320 use that; otherwise use the text section. */
5b93d8bb 1321 if (0 < i370_using_other_regno)
ea1562b3 1322 i370_make_relative (exx, &i370_using_other_baseaddr);
5b93d8bb 1323 else
ea1562b3 1324 i370_make_relative (exx, &i370_using_text_baseaddr);
5b93d8bb
AM
1325}
1326
1327/* The symbol setup for the literal pool is done in two steps. First,
ea1562b3
NC
1328 a symbol that represents the start of the literal pool is created,
1329 above, in the add_to_pool() routine. This sym ???_poolP.
33eaf5de 1330 However, we don't know what fragment it's in until a bit later.
ea1562b3 1331 So we defer the frag_now thing, and the symbol name, until .ltorg time. */
5b93d8bb
AM
1332
1333/* Can't use symbol_new here, so have to create a symbol and then at
33eaf5de 1334 a later date assign it a value. That's what these functions do. */
650f02e9 1335
5b93d8bb 1336static void
ea1562b3
NC
1337symbol_locate (symbolS *symbolP,
1338 const char *name, /* It is copied, the caller can modify. */
1339 segT segment, /* Segment identifier (SEG_<something>). */
1340 valueT valu, /* Symbol value. */
1341 fragS *frag) /* Associated fragment. */
5b93d8bb
AM
1342{
1343 size_t name_length;
1344 char *preserved_copy_of_name;
1345
1346 name_length = strlen (name) + 1; /* +1 for \0 */
1347 obstack_grow (&notes, name, name_length);
1348 preserved_copy_of_name = obstack_finish (&notes);
1349
1350 S_SET_NAME (symbolP, preserved_copy_of_name);
1351
1352 S_SET_SEGMENT (symbolP, segment);
1353 S_SET_VALUE (symbolP, valu);
07726851 1354 symbol_clear_list_pointers (symbolP);
5b93d8bb
AM
1355
1356 symbol_set_frag (symbolP, frag);
1357
ea1562b3 1358 /* Link to end of symbol chain. */
5b93d8bb
AM
1359 {
1360 extern int symbol_table_frozen;
ea1562b3 1361
5b93d8bb
AM
1362 if (symbol_table_frozen)
1363 abort ();
1364 }
1365
1366 symbol_append (symbolP, symbol_lastP, &symbol_rootP, &symbol_lastP);
1367
1368 obj_symbol_new_hook (symbolP);
1369
1370#ifdef tc_symbol_new_hook
1371 tc_symbol_new_hook (symbolP);
1372#endif
1373
1374#define DEBUG_SYMS
1375#ifdef DEBUG_SYMS
1376 verify_symbol_chain(symbol_rootP, symbol_lastP);
1377#endif /* DEBUG_SYMS */
1378}
1379
1380/* i370_addr_offset() will convert operand expressions
2b0f3761 1381 that appear to be absolute into their base-register
ea1562b3
NC
1382 relative form. These expressions come in two types:
1383
1384 (1) of the form "* + const" * where "*" means
1385 relative offset since the last using
1386 i.e. "*" means ".-using_baseaddr"
1387
1388 (2) labels, which are never absolute, but are always
1389 relative to the last "using". Anything with an alpha
1390 character is considered to be a label (since symbols
1391 can never be operands), and since we've already handled
1392 register operands. For example, "BL .L33" branch low
1393 to .L33 RX form insn frequently terminates for-loops. */
1394
b34976b6 1395static bfd_boolean
5b93d8bb
AM
1396i370_addr_offset (expressionS *exx)
1397{
1398 char *dot, *lab;
1399 int islabel = 0;
1400 int all_digits = 0;
1401
ea1562b3
NC
1402 /* Search for a label; anything with an alpha char will do.
1403 Local labels consist of N digits followed by either b or f. */
5b93d8bb
AM
1404 lab = input_line_pointer;
1405 while (*lab && (',' != *lab) && ('(' != *lab))
1406 {
3882b010 1407 if (ISDIGIT (*lab))
ea1562b3 1408 all_digits = 1;
3882b010 1409 else if (ISALPHA (*lab))
5b93d8bb
AM
1410 {
1411 if (!all_digits)
1412 {
1413 islabel = 1;
1414 break;
1415 }
1416 else if (('f' == *lab) || ('b' == *lab))
1417 {
1418 islabel = 1;
1419 break;
1420 }
1421 if (all_digits)
1422 break;
1423 }
1424 else if ('.' != *lab)
1425 break;
1426 ++lab;
1427 }
1428
ea1562b3 1429 /* See if operand has a * in it. */
5b93d8bb
AM
1430 dot = strchr (input_line_pointer, '*');
1431
1432 if (!dot && !islabel)
b34976b6 1433 return FALSE;
5b93d8bb 1434
ea1562b3 1435 /* Replace * with . and let expr munch on it. */
5b93d8bb
AM
1436 if (dot)
1437 *dot = '.';
1438 expression (exx);
1439
ea1562b3
NC
1440 /* OK, now we have to subtract the "using" location.
1441 Normally branches appear in the text section only. */
5b93d8bb 1442 if (0 == strncmp (now_seg->name, ".text", 5) || 0 > i370_using_other_regno)
ea1562b3 1443 i370_make_relative (exx, &i370_using_text_baseaddr);
5b93d8bb 1444 else
ea1562b3 1445 i370_make_relative (exx, &i370_using_other_baseaddr);
5b93d8bb 1446
ea1562b3 1447 /* Put the * back. */
5b93d8bb
AM
1448 if (dot)
1449 *dot = '*';
1450
b34976b6 1451 return TRUE;
5b93d8bb
AM
1452}
1453
ea1562b3 1454/* Handle address constants of various sorts. */
5b93d8bb 1455/* The currently supported types are
ea1562b3
NC
1456 =A(some_symb)
1457 =V(some_extern)
1458 =X'deadbeef' hexadecimal
1459 =F'1234' 32-bit const int
1460 =H'1234' 16-bit const int. */
1461
b34976b6 1462static bfd_boolean
5b93d8bb
AM
1463i370_addr_cons (expressionS *exp)
1464{
1465 char *name;
1466 char *sym_name, delim;
1467 int name_len;
ea1562b3
NC
1468 int hex_len = 0;
1469 int cons_len = 0;
5b93d8bb
AM
1470
1471 name = input_line_pointer;
1472 sym_name = input_line_pointer;
ea1562b3 1473 /* Find the spelling of the operand. */
3882b010 1474 if (name[0] == '=' && ISALPHA (name[1]))
ea1562b3 1475 name = ++input_line_pointer;
5b93d8bb 1476 else
ea1562b3
NC
1477 return FALSE;
1478
5b93d8bb
AM
1479 switch (name[0])
1480 {
ea1562b3
NC
1481 case 'A': /* A == address-of. */
1482 case 'V': /* V == extern. */
5b93d8bb
AM
1483 ++input_line_pointer;
1484 expression (exp);
1485
ea1562b3 1486 /* We use a simple string name to collapse together
2b0f3761 1487 multiple references to the same address literal. */
5b93d8bb
AM
1488 name_len = strcspn (sym_name, ", ");
1489 delim = *(sym_name + name_len);
1490 *(sym_name + name_len) = 0x0;
1491 add_to_lit_pool (exp, sym_name, 4);
1492 *(sym_name + name_len) = delim;
1493
1494 break;
1495 case 'H':
1496 case 'F':
1497 case 'X':
ea1562b3
NC
1498 case 'E': /* Single-precision float point. */
1499 case 'D': /* Double-precision float point. */
5b93d8bb 1500
ea1562b3
NC
1501 /* H == 16-bit fixed-point const; expression must be const. */
1502 /* F == fixed-point const; expression must be const. */
1503 /* X == fixed-point const; expression must be const. */
5b93d8bb
AM
1504 if ('H' == name[0]) cons_len = 2;
1505 else if ('F' == name[0]) cons_len = 4;
1506 else if ('X' == name[0]) cons_len = -1;
1507 else if ('E' == name[0]) cons_len = 4;
1508 else if ('D' == name[0]) cons_len = 8;
1509
ea1562b3
NC
1510 /* Extract length, if it is present;
1511 FIXME: assume single-digit length. */
5b93d8bb
AM
1512 if ('L' == name[1])
1513 {
ea1562b3
NC
1514 /* Should work for ASCII and EBCDIC. */
1515 cons_len = name[2] - '0';
5b93d8bb
AM
1516 input_line_pointer += 2;
1517 }
1518
1519 ++input_line_pointer;
1520
ea1562b3 1521 /* Get rid of pesky quotes. */
5b93d8bb
AM
1522 if ('\'' == *input_line_pointer)
1523 {
91d6fa6a
NC
1524 char * clse;
1525
5b93d8bb 1526 ++input_line_pointer;
91d6fa6a
NC
1527 clse = strchr (input_line_pointer, '\'');
1528 if (clse)
1529 *clse= ' ';
5b93d8bb 1530 else
20203fb9 1531 as_bad (_("missing end-quote"));
5b93d8bb
AM
1532 }
1533 if ('\"' == *input_line_pointer)
1534 {
91d6fa6a
NC
1535 char * clse;
1536
5b93d8bb 1537 ++input_line_pointer;
91d6fa6a
NC
1538 clse = strchr (input_line_pointer, '\"');
1539 if (clse)
1540 *clse= ' ';
5b93d8bb 1541 else
20203fb9 1542 as_bad (_("missing end-quote"));
5b93d8bb
AM
1543 }
1544 if (('X' == name[0]) || ('E' == name[0]) || ('D' == name[0]))
1545 {
1546 char tmp[50];
1547 char *save;
1548
1549 /* The length of hex constants is specified directly with L,
ea1562b3
NC
1550 or implied through the number of hex digits. For example:
1551 =X'AB' one byte
1552 =X'abcd' two bytes
1553 =X'000000AB' four bytes
33eaf5de 1554 =XL4'AB' four bytes, left-padded with zero. */
5b93d8bb
AM
1555 if (('X' == name[0]) && (0 > cons_len))
1556 {
1557 save = input_line_pointer;
1558 while (*save)
1559 {
3882b010 1560 if (ISXDIGIT (*save))
5b93d8bb
AM
1561 hex_len++;
1562 save++;
1563 }
1564 cons_len = (hex_len+1) /2;
1565 }
0234cb7c 1566 /* I believe this works even for =XL8'dada0000beeebaaa'
ea1562b3
NC
1567 which should parse out to X_op == O_big
1568 Note that floats and doubles get represented as
1569 0d3.14159265358979 or 0f 2.7. */
5b93d8bb
AM
1570 tmp[0] = '0';
1571 tmp[1] = name[0];
1572 tmp[2] = 0;
1573 strcat (tmp, input_line_pointer);
1574 save = input_line_pointer;
1575 input_line_pointer = tmp;
1576 expression (exp);
1577 input_line_pointer = save + (input_line_pointer-tmp-2);
1578
ea1562b3 1579 /* Fix up lengths for floats and doubles. */
5b93d8bb 1580 if (O_big == exp->X_op)
ea1562b3 1581 exp->X_add_number = cons_len / CHARS_PER_LITTLENUM;
5b93d8bb
AM
1582 }
1583 else
ea1562b3
NC
1584 expression (exp);
1585
1586 /* O_big occurs when more than 4 bytes worth gets parsed. */
5b93d8bb
AM
1587 if ((exp->X_op != O_constant) && (exp->X_op != O_big))
1588 {
20203fb9 1589 as_bad (_("expression not a constant"));
b34976b6 1590 return FALSE;
5b93d8bb
AM
1591 }
1592 add_to_lit_pool (exp, 0x0, cons_len);
1593 break;
1594
1595 default:
20203fb9 1596 as_bad (_("Unknown/unsupported address literal type"));
b34976b6 1597 return FALSE;
5b93d8bb
AM
1598 }
1599
b34976b6 1600 return TRUE;
5b93d8bb
AM
1601}
1602
1603\f
1604/* Dump the contents of the literal pool that we've accumulated so far.
ea1562b3 1605 This aligns the pool to the size of the largest literal in the pool. */
5b93d8bb
AM
1606
1607static void
ea1562b3 1608i370_ltorg (int ignore ATTRIBUTE_UNUSED)
5b93d8bb
AM
1609{
1610 int litsize;
1611 int lit_count = 0;
1612 int biggest_literal_size = 0;
1613 int biggest_align = 0;
1614 char pool_name[20];
1615
1616 if (strncmp (now_seg->name, ".text", 5))
1617 {
1618 if (i370_other_section == undefined_section)
20203fb9 1619 as_bad (_(".ltorg without prior .using in section %s"),
ea1562b3
NC
1620 now_seg->name);
1621
5b93d8bb 1622 if (i370_other_section != now_seg)
20203fb9 1623 as_bad (_(".ltorg in section %s paired to .using in section %s"),
ea1562b3 1624 now_seg->name, i370_other_section->name);
5b93d8bb 1625 }
ea1562b3 1626
5b93d8bb
AM
1627 if (! longlong_poolP
1628 && ! word_poolP
1629 && ! short_poolP
1630 && ! byte_poolP)
ea1562b3
NC
1631 /* Nothing to do. */
1632 return;
5b93d8bb 1633
ea1562b3 1634 /* Find largest literal .. 2 4 or 8. */
5b93d8bb
AM
1635 lit_count = 0;
1636 while (lit_count < next_literal_pool_place)
1637 {
1638 if (biggest_literal_size < literals[lit_count].size)
1639 biggest_literal_size = literals[lit_count].size;
1640 lit_count ++;
1641 }
1642 if (1 == biggest_literal_size) biggest_align = 0;
1643 else if (2 == biggest_literal_size) biggest_align = 1;
1644 else if (4 == biggest_literal_size) biggest_align = 2;
1645 else if (8 == biggest_literal_size) biggest_align = 3;
20203fb9 1646 else as_bad (_("bad alignment of %d bytes in literal pool"), biggest_literal_size);
5b93d8bb
AM
1647 if (0 == biggest_align) biggest_align = 1;
1648
ea1562b3 1649 /* Align pool for short, word, double word accesses. */
5b93d8bb
AM
1650 frag_align (biggest_align, 0, 0);
1651 record_alignment (now_seg, biggest_align);
1652
1653 /* Note that the gas listing will print only the first five
ea1562b3
NC
1654 entries in the pool .... wonder how to make it print more. */
1655 /* Output largest literals first, then the smaller ones. */
5b93d8bb
AM
1656 for (litsize=8; litsize; litsize /=2)
1657 {
1658 symbolS *current_poolP = NULL;
1659 switch (litsize)
1660 {
1661 case 8:
1662 current_poolP = longlong_poolP; break;
1663 case 4:
1664 current_poolP = word_poolP; break;
1665 case 2:
1666 current_poolP = short_poolP; break;
1667 case 1:
1668 current_poolP = byte_poolP; break;
1669 default:
20203fb9 1670 as_bad (_("bad literal size\n"));
5b93d8bb
AM
1671 }
1672 if (NULL == current_poolP)
1673 continue;
1674 sprintf (pool_name, ".LITP%01d%06d", litsize, lit_pool_num);
1675 symbol_locate (current_poolP, pool_name, now_seg,
1676 (valueT) frag_now_fix (), frag_now);
1677 symbol_table_insert (current_poolP);
1678
1679 lit_count = 0;
1680 while (lit_count < next_literal_pool_place)
1681 {
1682 if (litsize == literals[lit_count].size)
1683 {
1684#define EMIT_ADDR_CONS_SYMBOLS
1685#ifdef EMIT_ADDR_CONS_SYMBOLS
ea1562b3
NC
1686 /* Create a bogus symbol, add it to the pool ...
1687 For the most part, I think this is a useless exercise,
1688 except that having these symbol names in the objects
1689 is vaguely useful for debugging. */
5b93d8bb
AM
1690 if (literals[lit_count].sym_name)
1691 {
07726851 1692 symbolS * symP = symbol_make_empty ();
5b93d8bb
AM
1693 symbol_locate (symP, literals[lit_count].sym_name, now_seg,
1694 (valueT) frag_now_fix (), frag_now);
1695 symbol_table_insert (symP);
1696 }
1697#endif /* EMIT_ADDR_CONS_SYMBOLS */
1698
1699 emit_expr (&(literals[lit_count].exp), literals[lit_count].size);
1700 }
1701 lit_count ++;
1702 }
1703 }
1704
1705 next_literal_pool_place = 0;
1706 longlong_poolP = NULL;
1707 word_poolP = NULL;
1708 short_poolP = NULL;
1709 byte_poolP = NULL;
1710 lit_pool_num++;
1711}
1712
1713#endif /* LITERAL_POOL_SUPPORT */
1714
1715\f
ea1562b3
NC
1716/* Add support for the HLASM-like USING directive to indicate
1717 the base register to use ... we don't support the full
1718 hlasm semantics for this ... we merely pluck a base address
1719 and a register number out. We print a warning if using is
1720 called multiple times. I suppose we should check to see
1721 if the regno is valid. */
1722
5b93d8bb 1723static void
ea1562b3 1724i370_using (int ignore ATTRIBUTE_UNUSED)
5b93d8bb
AM
1725{
1726 expressionS ex, baseaddr;
1727 int iregno;
1728 char *star;
1729
ea1562b3
NC
1730 /* If "*" appears in a using, it means "."
1731 replace it with "." so that expr doesn't get confused. */
5b93d8bb
AM
1732 star = strchr (input_line_pointer, '*');
1733 if (star)
1734 *star = '.';
1735
ea1562b3
NC
1736 /* The first arg to using will usually be ".", but it can
1737 be a more complex expression too. */
5b93d8bb
AM
1738 expression (&baseaddr);
1739 if (star)
1740 *star = '*';
1741 if (O_constant != baseaddr.X_op
1742 && O_symbol != baseaddr.X_op
1743 && O_uminus != baseaddr.X_op)
20203fb9 1744 as_bad (_(".using: base address expression illegal or too complex"));
5b93d8bb
AM
1745
1746 if (*input_line_pointer != '\0') ++input_line_pointer;
1747
ea1562b3 1748 /* The second arg to using had better be a register. */
5b93d8bb
AM
1749 register_name (&ex);
1750 demand_empty_rest_of_line ();
1751 iregno = ex.X_add_number;
1752
1753 if (0 == strncmp (now_seg->name, ".text", 5))
1754 {
1755 i370_using_text_baseaddr = baseaddr;
1756 i370_using_text_regno = iregno;
1757 }
1758 else
1759 {
1760 i370_using_other_baseaddr = baseaddr;
1761 i370_using_other_regno = iregno;
1762 i370_other_section = now_seg;
1763 }
1764}
1765
1766static void
ea1562b3 1767i370_drop (int ignore ATTRIBUTE_UNUSED)
5b93d8bb
AM
1768{
1769 expressionS ex;
1770 int iregno;
1771
1772 register_name (&ex);
1773 demand_empty_rest_of_line ();
1774 iregno = ex.X_add_number;
1775
1776 if (0 == strncmp (now_seg->name, ".text", 5))
1777 {
1778 if (iregno != i370_using_text_regno)
33eaf5de 1779 as_bad (_("dropping register %d in section %s does not match using register %d"),
ea1562b3
NC
1780 iregno, now_seg->name, i370_using_text_regno);
1781
5b93d8bb
AM
1782 i370_using_text_regno = -1;
1783 i370_using_text_baseaddr.X_op = O_absent;
1784 }
1785 else
1786 {
1787 if (iregno != i370_using_other_regno)
33eaf5de 1788 as_bad (_("dropping register %d in section %s does not match using register %d"),
ea1562b3
NC
1789 iregno, now_seg->name, i370_using_other_regno);
1790
5b93d8bb 1791 if (i370_other_section != now_seg)
33eaf5de 1792 as_bad (_("dropping register %d in section %s previously used in section %s"),
ea1562b3
NC
1793 iregno, now_seg->name, i370_other_section->name);
1794
5b93d8bb
AM
1795 i370_using_other_regno = -1;
1796 i370_using_other_baseaddr.X_op = O_absent;
1797 i370_other_section = undefined_section;
1798 }
1799}
1800
5b93d8bb
AM
1801\f
1802/* We need to keep a list of fixups. We can't simply generate them as
1803 we go, because that would require us to first create the frag, and
1804 that would screw up references to ``.''. */
1805
1806struct i370_fixup
1807{
1808 expressionS exp;
1809 int opindex;
1810 bfd_reloc_code_real_type reloc;
1811};
1812
ea1562b3
NC
1813#define MAX_INSN_FIXUPS 5
1814
1815/* Handle a macro. Gather all the operands, transform them as
1816 described by the macro, and call md_assemble recursively. All the
1817 operands are separated by commas; we don't accept parentheses
1818 around operands here. */
1819
1820static void
1821i370_macro (char *str, const struct i370_macro *macro)
1822{
1823 char *operands[10];
1824 unsigned int count;
1825 char *s;
1826 unsigned int len;
1827 const char *format;
1828 int arg;
1829 char *send;
1830 char *complete;
1831
1832 /* Gather the users operands into the operands array. */
1833 count = 0;
1834 s = str;
1835 while (1)
1836 {
1837 if (count >= sizeof operands / sizeof operands[0])
1838 break;
1839 operands[count++] = s;
1840 s = strchr (s, ',');
1841 if (s == (char *) NULL)
1842 break;
1843 *s++ = '\0';
1844 }
1845
1846 if (count != macro->operands)
1847 {
20203fb9 1848 as_bad (_("wrong number of operands"));
ea1562b3
NC
1849 return;
1850 }
1851
1852 /* Work out how large the string must be (the size is unbounded
1853 because it includes user input). */
1854 len = 0;
1855 format = macro->format;
1856 while (*format != '\0')
1857 {
1858 if (*format != '%')
1859 {
1860 ++len;
1861 ++format;
1862 }
1863 else
1864 {
1865 arg = strtol (format + 1, &send, 10);
1866 know (send != format && arg >= 0 && (unsigned) arg < count);
1867 len += strlen (operands[arg]);
1868 format = send;
1869 }
1870 }
1871
1872 /* Put the string together. */
add39d23 1873 complete = s = XNEWVEC (char, len + 1);
ea1562b3
NC
1874 format = macro->format;
1875 while (*format != '\0')
1876 {
1877 if (*format != '%')
1878 *s++ = *format++;
1879 else
1880 {
1881 arg = strtol (format + 1, &send, 10);
1882 strcpy (s, operands[arg]);
1883 s += strlen (s);
1884 format = send;
1885 }
1886 }
1887 *s = '\0';
1888
1889 /* Assemble the constructed instruction. */
1890 md_assemble (complete);
39a0d071 1891 free (complete);
ea1562b3 1892}
5b93d8bb
AM
1893
1894/* This routine is called for each instruction to be assembled. */
1895
1896void
ea1562b3 1897md_assemble (char *str)
5b93d8bb 1898{
87975d2a 1899 char *s;
5b93d8bb
AM
1900 const struct i370_opcode *opcode;
1901 i370_insn_t insn;
1902 const unsigned char *opindex_ptr;
1903 int have_optional_index, have_optional_basereg, have_optional_reg;
1904 int skip_optional_index, skip_optional_basereg, skip_optional_reg;
1905 int use_text=0, use_other=0;
1906 int off_by_one;
1907 struct i370_fixup fixups[MAX_INSN_FIXUPS];
1908 int fc;
1909 char *f;
1910 int i;
1911#ifdef OBJ_ELF
1912 bfd_reloc_code_real_type reloc;
1913#endif
1914
1915 /* Get the opcode. */
3882b010 1916 for (s = str; *s != '\0' && ! ISSPACE (*s); s++)
5b93d8bb
AM
1917 ;
1918 if (*s != '\0')
1919 *s++ = '\0';
5b93d8bb
AM
1920
1921 /* Look up the opcode in the hash table. */
1922 opcode = (const struct i370_opcode *) hash_find (i370_hash, str);
1923 if (opcode == (const struct i370_opcode *) NULL)
1924 {
1925 const struct i370_macro *macro;
1926
9c2799c2 1927 gas_assert (i370_macro_hash);
5b93d8bb
AM
1928 macro = (const struct i370_macro *) hash_find (i370_macro_hash, str);
1929 if (macro == (const struct i370_macro *) NULL)
20203fb9 1930 as_bad (_("Unrecognized opcode: `%s'"), str);
5b93d8bb
AM
1931 else
1932 i370_macro (s, macro);
1933
1934 return;
1935 }
1936
1937 insn = opcode->opcode;
1938
1939 str = s;
3882b010 1940 while (ISSPACE (*str))
5b93d8bb
AM
1941 ++str;
1942
1943 /* I370 operands are either expressions or address constants.
1944 Many operand types are optional. The optional operands
1945 are always surrounded by parens, and are used to denote the base
1946 register ... e.g. "A R1, D2" or "A R1, D2(,B2) as opposed to
1947 the fully-formed "A R1, D2(X2,B2)". Note also the = sign,
1948 such as A R1,=A(i) where the address-of operator =A implies
1949 use of both a base register, and a missing index register.
1950
1951 So, before we start seriously parsing the operands, we check
1952 to see if we have an optional operand, and, if we do, we count
1953 the number of commas to see which operand should be omitted. */
1954
1955 have_optional_index = have_optional_basereg = have_optional_reg = 0;
1956 for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
1957 {
1958 const struct i370_operand *operand;
ea1562b3 1959
5b93d8bb
AM
1960 operand = &i370_operands[*opindex_ptr];
1961 if ((operand->flags & I370_OPERAND_INDEX) != 0)
1962 have_optional_index = 1;
1963 if ((operand->flags & I370_OPERAND_BASE) != 0)
1964 have_optional_basereg = 1;
1965 if ((operand->flags & I370_OPERAND_OPTIONAL) != 0)
1966 have_optional_reg = 1;
1967 }
1968
1969 skip_optional_index = skip_optional_basereg = skip_optional_reg = 0;
1970 if (have_optional_index || have_optional_basereg)
1971 {
1972 unsigned int opcount, nwanted;
1973
1974 /* There is an optional operand. Count the number of
1975 commas and open-parens in the input line. */
1976 if (*str == '\0')
1977 opcount = 0;
1978 else
1979 {
1980 opcount = 1;
1981 s = str;
1982 while ((s = strpbrk (s, ",(=")) != (char *) NULL)
1983 {
1984 ++opcount;
1985 ++s;
1986 if (',' == *s) ++s; /* avoid counting things like (, */
1987 if ('=' == *s) { ++s; --opcount; }
1988 }
1989 }
1990
1991 /* If there are fewer operands in the line then are called
1992 for by the instruction, we want to skip the optional
1993 operand. */
2132e3a3 1994 nwanted = strlen ((char *) opcode->operands);
5b93d8bb
AM
1995 if (have_optional_index)
1996 {
1997 if (opcount < nwanted)
1998 skip_optional_index = 1;
1999 if (have_optional_basereg && ((opcount+1) < nwanted))
2000 skip_optional_basereg = 1;
2001 if (have_optional_reg && ((opcount+1) < nwanted))
2002 skip_optional_reg = 1;
2003 }
2004 else
2005 {
2006 if (have_optional_basereg && (opcount < nwanted))
2007 skip_optional_basereg = 1;
2008 if (have_optional_reg && (opcount < nwanted))
2009 skip_optional_reg = 1;
2010 }
2011 }
2012
2013 /* Perform some off-by-one hacks on the length field of certain instructions.
33eaf5de 2014 It's such a shame to have to do this, but the problem is that HLASM got
ea1562b3 2015 defined so that the lengths differ by one from the actual machine instructions.
33eaf5de 2016 this code should probably be moved to a special inter-operand routine.
ea1562b3
NC
2017 Sigh. Affected instructions are Compare Logical, Move and Exclusive OR
2018 hack alert -- aren't *all* SS instructions affected ?? */
5b93d8bb
AM
2019 off_by_one = 0;
2020 if (0 == strcasecmp ("CLC", opcode->name)
2021 || 0 == strcasecmp ("ED", opcode->name)
2022 || 0 == strcasecmp ("EDMK", opcode->name)
2023 || 0 == strcasecmp ("MVC", opcode->name)
2024 || 0 == strcasecmp ("MVCIN", opcode->name)
2025 || 0 == strcasecmp ("MVN", opcode->name)
2026 || 0 == strcasecmp ("MVZ", opcode->name)
2027 || 0 == strcasecmp ("NC", opcode->name)
2028 || 0 == strcasecmp ("OC", opcode->name)
2029 || 0 == strcasecmp ("XC", opcode->name))
2030 off_by_one = 1;
2031
2032 /* Gather the operands. */
2033 fc = 0;
2034 for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
2035 {
2036 const struct i370_operand *operand;
5b93d8bb
AM
2037 char *hold;
2038 expressionS ex;
2039
2040 operand = &i370_operands[*opindex_ptr];
5b93d8bb
AM
2041
2042 /* If this is an index operand, and we are skipping it,
2043 just insert a zero. */
2044 if (skip_optional_index &&
2045 ((operand->flags & I370_OPERAND_INDEX) != 0))
2046 {
2047 insn = i370_insert_operand (insn, operand, 0);
2048 continue;
2049 }
2050
2051 /* If this is the base operand, and we are skipping it,
2052 just insert the current using basreg. */
2053 if (skip_optional_basereg &&
2054 ((operand->flags & I370_OPERAND_BASE) != 0))
2055 {
2056 int basereg = -1;
2057 if (use_text)
2058 {
2059 if (0 == strncmp (now_seg->name, ".text", 5)
2060 || 0 > i370_using_other_regno)
ea1562b3 2061 basereg = i370_using_text_regno;
5b93d8bb 2062 else
ea1562b3 2063 basereg = i370_using_other_regno;
5b93d8bb
AM
2064 }
2065 else if (use_other)
2066 {
2067 if (0 > i370_using_other_regno)
ea1562b3 2068 basereg = i370_using_text_regno;
5b93d8bb 2069 else
ea1562b3 2070 basereg = i370_using_other_regno;
5b93d8bb
AM
2071 }
2072 if (0 > basereg)
20203fb9 2073 as_bad (_("not using any base register"));
ea1562b3 2074
5b93d8bb
AM
2075 insn = i370_insert_operand (insn, operand, basereg);
2076 continue;
2077 }
2078
2079 /* If this is an optional operand, and we are skipping it,
2080 Use zero (since a non-zero value would denote a register) */
2081 if (skip_optional_reg
2082 && ((operand->flags & I370_OPERAND_OPTIONAL) != 0))
2083 {
2084 insn = i370_insert_operand (insn, operand, 0);
2085 continue;
2086 }
2087
2088 /* Gather the operand. */
2089 hold = input_line_pointer;
2090 input_line_pointer = str;
2091
ea1562b3 2092 /* Register names are only allowed where there are registers. */
5b93d8bb
AM
2093 if ((operand->flags & I370_OPERAND_GPR) != 0)
2094 {
ea1562b3 2095 /* Quickie hack to get past things like (,r13). */
5b93d8bb
AM
2096 if (skip_optional_index && (',' == *input_line_pointer))
2097 {
2098 *input_line_pointer = ' ';
2099 input_line_pointer ++;
2100 }
ea1562b3 2101
5b93d8bb 2102 if (! register_name (&ex))
20203fb9 2103 as_bad (_("expecting a register for operand %d"),
8ad7c533 2104 (int) (opindex_ptr - opcode->operands + 1));
5b93d8bb
AM
2105 }
2106
b6ff326e 2107 /* Check for an address constant expression. */
5b93d8bb 2108 /* We will put PSW-relative addresses in the text section,
ea1562b3 2109 and address literals in the .data (or other) section. */
5b93d8bb 2110 else if (i370_addr_cons (&ex))
ea1562b3 2111 use_other = 1;
5b93d8bb 2112 else if (i370_addr_offset (&ex))
ea1562b3 2113 use_text = 1;
5b93d8bb
AM
2114 else expression (&ex);
2115
2116 str = input_line_pointer;
2117 input_line_pointer = hold;
2118
ea1562b3 2119 /* Perform some off-by-one hacks on the length field of certain instructions.
33eaf5de 2120 It's such a shame to have to do this, but the problem is that HLASM got
ea1562b3
NC
2121 defined so that the programmer specifies a length that is one greater
2122 than what the machine instruction wants. Sigh. */
5b93d8bb 2123 if (off_by_one && (0 == strcasecmp ("SS L", operand->name)))
ea1562b3 2124 ex.X_add_number --;
5b93d8bb
AM
2125
2126 if (ex.X_op == O_illegal)
20203fb9 2127 as_bad (_("illegal operand"));
5b93d8bb 2128 else if (ex.X_op == O_absent)
20203fb9 2129 as_bad (_("missing operand"));
5b93d8bb 2130 else if (ex.X_op == O_register)
ea1562b3 2131 insn = i370_insert_operand (insn, operand, ex.X_add_number);
5b93d8bb
AM
2132 else if (ex.X_op == O_constant)
2133 {
2134#ifdef OBJ_ELF
2135 /* Allow @HA, @L, @H on constants.
ea1562b3
NC
2136 Well actually, no we don't; there really don't make sense
2137 (at least not to me) for the i370. However, this code is
2138 left here for any dubious future expansion reasons. */
5b93d8bb
AM
2139 char *orig_str = str;
2140
2141 if ((reloc = i370_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED)
2142 switch (reloc)
2143 {
2144 default:
2145 str = orig_str;
2146 break;
2147
2148 case BFD_RELOC_LO16:
2149 /* X_unsigned is the default, so if the user has done
2150 something which cleared it, we always produce a
2151 signed value. */
2152 ex.X_add_number = (((ex.X_add_number & 0xffff)
2153 ^ 0x8000)
2154 - 0x8000);
2155 break;
2156
2157 case BFD_RELOC_HI16:
2158 ex.X_add_number = (ex.X_add_number >> 16) & 0xffff;
2159 break;
2160
2161 case BFD_RELOC_HI16_S:
2162 ex.X_add_number = (((ex.X_add_number >> 16) & 0xffff)
2163 + ((ex.X_add_number >> 15) & 1));
2164 break;
2165 }
2166#endif
2167 insn = i370_insert_operand (insn, operand, ex.X_add_number);
2168 }
2169#ifdef OBJ_ELF
2170 else if ((reloc = i370_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED)
2171 {
2172 as_tsktsk ("md_assemble(): suffixed relocations not supported\n");
2173
2174 /* We need to generate a fixup for this expression. */
2175 if (fc >= MAX_INSN_FIXUPS)
2176 as_fatal ("too many fixups");
2177 fixups[fc].exp = ex;
2178 fixups[fc].opindex = 0;
2179 fixups[fc].reloc = reloc;
2180 ++fc;
2181 }
2182#endif /* OBJ_ELF */
5b93d8bb
AM
2183 else
2184 {
2185 /* We need to generate a fixup for this expression. */
2186 /* Typically, the expression will just be a symbol ...
ea1562b3
NC
2187 printf ("insn %s needs fixup for %s \n",
2188 opcode->name, ex.X_add_symbol->bsym->name); */
5b93d8bb
AM
2189
2190 if (fc >= MAX_INSN_FIXUPS)
2191 as_fatal ("too many fixups");
2192 fixups[fc].exp = ex;
2193 fixups[fc].opindex = *opindex_ptr;
2194 fixups[fc].reloc = BFD_RELOC_UNUSED;
2195 ++fc;
2196 }
2197
ea1562b3 2198 /* Skip over delimiter (close paren, or comma). */
5b93d8bb
AM
2199 if ((')' == *str) && (',' == *(str+1)))
2200 ++str;
2201 if (*str != '\0')
2202 ++str;
2203 }
2204
3882b010 2205 while (ISSPACE (*str))
5b93d8bb
AM
2206 ++str;
2207
2208 if (*str != '\0')
20203fb9 2209 as_bad (_("junk at end of line: `%s'"), str);
5b93d8bb
AM
2210
2211 /* Write out the instruction. */
2212 f = frag_more (opcode->len);
2213 if (4 >= opcode->len)
ea1562b3 2214 md_number_to_chars (f, insn.i[0], opcode->len);
5b93d8bb
AM
2215 else
2216 {
2217 md_number_to_chars (f, insn.i[0], 4);
ea1562b3 2218
5b93d8bb 2219 if (6 == opcode->len)
ea1562b3 2220 md_number_to_chars ((f + 4), ((insn.i[1])>>16), 2);
5b93d8bb
AM
2221 else
2222 {
ea1562b3 2223 /* Not used --- don't have any 8 byte instructions. */
20203fb9 2224 as_bad (_("Internal Error: bad instruction length"));
ea1562b3 2225 md_number_to_chars ((f + 4), insn.i[1], opcode->len -4);
5b93d8bb
AM
2226 }
2227 }
2228
2229 /* Create any fixups. At this point we do not use a
2230 bfd_reloc_code_real_type, but instead just use the
2231 BFD_RELOC_UNUSED plus the operand index. This lets us easily
2232 handle fixups for any operand type, although that is admittedly
2233 not a very exciting feature. We pick a BFD reloc type in
55cf6793 2234 md_apply_fix. */
5b93d8bb
AM
2235 for (i = 0; i < fc; i++)
2236 {
2237 const struct i370_operand *operand;
2238
2239 operand = &i370_operands[fixups[i].opindex];
2240 if (fixups[i].reloc != BFD_RELOC_UNUSED)
2241 {
2242 reloc_howto_type *reloc_howto = bfd_reloc_type_lookup (stdoutput, fixups[i].reloc);
2243 int size;
2244 fixS *fixP;
2245
2246 if (!reloc_howto)
2247 abort ();
2248
2249 size = bfd_get_reloc_size (reloc_howto);
2250
2251 if (size < 1 || size > 4)
bc805888 2252 abort ();
5b93d8bb 2253
33eaf5de 2254 printf (" gwana do fixup %d \n", i);
5b93d8bb
AM
2255 fixP = fix_new_exp (frag_now, f - frag_now->fr_literal, size,
2256 &fixups[i].exp, reloc_howto->pc_relative,
2257 fixups[i].reloc);
2258
2259 /* Turn off complaints that the addend is too large for things like
2260 foo+100000@ha. */
2261 switch (fixups[i].reloc)
2262 {
2263 case BFD_RELOC_16_GOTOFF:
2264 case BFD_RELOC_LO16:
2265 case BFD_RELOC_HI16:
2266 case BFD_RELOC_HI16_S:
2267 fixP->fx_no_overflow = 1;
2268 break;
2269 default:
2270 break;
2271 }
2272 }
2273 else
2274 {
2275 fix_new_exp (frag_now, f - frag_now->fr_literal, opcode->len,
2276 &fixups[i].exp,
2277 (operand->flags & I370_OPERAND_RELATIVE) != 0,
2278 ((bfd_reloc_code_real_type)
2279 (fixups[i].opindex + (int) BFD_RELOC_UNUSED)));
2280 }
2281 }
2282}
2283
5b93d8bb
AM
2284\f
2285/* Pseudo-op handling. */
2286
2287/* The .byte pseudo-op. This is similar to the normal .byte
2288 pseudo-op, but it can also take a single ASCII string. */
2289
2290static void
ea1562b3 2291i370_byte (int ignore ATTRIBUTE_UNUSED)
5b93d8bb
AM
2292{
2293 if (*input_line_pointer != '\"')
2294 {
2295 cons (1);
2296 return;
2297 }
2298
2299 /* Gather characters. A real double quote is doubled. Unusual
2300 characters are not permitted. */
2301 ++input_line_pointer;
2302 while (1)
2303 {
2304 char c;
2305
2306 c = *input_line_pointer++;
2307
2308 if (c == '\"')
2309 {
2310 if (*input_line_pointer != '\"')
2311 break;
2312 ++input_line_pointer;
2313 }
2314
2315 FRAG_APPEND_1_CHAR (c);
2316 }
2317
2318 demand_empty_rest_of_line ();
2319}
2320\f
2321/* The .tc pseudo-op. This is used when generating XCOFF and ELF.
2322 This takes two or more arguments.
2323
2324 When generating XCOFF output, the first argument is the name to
2325 give to this location in the toc; this will be a symbol with class
2326 TC. The rest of the arguments are 4 byte values to actually put at
2327 this location in the TOC; often there is just one more argument, a
1049f94e 2328 relocatable symbol reference.
5b93d8bb
AM
2329
2330 When not generating XCOFF output, the arguments are the same, but
2331 the first argument is simply ignored. */
2332
2333static void
ea1562b3 2334i370_tc (int ignore ATTRIBUTE_UNUSED)
5b93d8bb
AM
2335{
2336
2337 /* Skip the TOC symbol name. */
2338 while (is_part_of_name (*input_line_pointer)
2339 || *input_line_pointer == '['
2340 || *input_line_pointer == ']'
2341 || *input_line_pointer == '{'
2342 || *input_line_pointer == '}')
2343 ++input_line_pointer;
2344
2345 /* Align to a four byte boundary. */
2346 frag_align (2, 0, 0);
2347 record_alignment (now_seg, 2);
2348
2349 if (*input_line_pointer != ',')
2350 demand_empty_rest_of_line ();
2351 else
2352 {
2353 ++input_line_pointer;
2354 cons (4);
2355 }
2356}
2357\f
6d4af3c2 2358const char *
ea1562b3 2359md_atof (int type, char *litp, int *sizep)
5b93d8bb 2360{
5b93d8bb 2361 /* 360/370/390 have two float formats: an old, funky 360 single-precision
499ac353
NC
2362 format, and the ieee format. Support only the ieee format. */
2363 return ieee_md_atof (type, litp, sizep, TRUE);
5b93d8bb
AM
2364}
2365
2366/* Write a value out to the object file, using the appropriate
2367 endianness. */
2368
2369void
ea1562b3 2370md_number_to_chars (char *buf, valueT val, int n)
5b93d8bb 2371{
ea1562b3 2372 number_to_chars_bigendian (buf, val, n);
5b93d8bb
AM
2373}
2374
2375/* Align a section (I don't know why this is machine dependent). */
2376
2377valueT
ea1562b3 2378md_section_align (asection *seg, valueT addr)
5b93d8bb
AM
2379{
2380 int align = bfd_get_section_alignment (stdoutput, seg);
2381
8d3842cd 2382 return (addr + (1 << align) - 1) & -(1 << align);
5b93d8bb
AM
2383}
2384
2385/* We don't have any form of relaxing. */
2386
2387int
ea1562b3
NC
2388md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
2389 asection *seg ATTRIBUTE_UNUSED)
5b93d8bb
AM
2390{
2391 abort ();
2392 return 0;
2393}
2394
2395/* Convert a machine dependent frag. We never generate these. */
2396
2397void
ea1562b3
NC
2398md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
2399 asection *sec ATTRIBUTE_UNUSED,
2400 fragS *fragp ATTRIBUTE_UNUSED)
5b93d8bb
AM
2401{
2402 abort ();
2403}
2404
2405/* We have no need to default values of symbols. */
2406
5b93d8bb 2407symbolS *
ea1562b3 2408md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
5b93d8bb
AM
2409{
2410 return 0;
2411}
2412\f
2413/* Functions concerning relocs. */
2414
2415/* The location from which a PC relative jump should be calculated,
2416 given a PC relative reloc. */
2417
2418long
ea1562b3 2419md_pcrel_from_section (fixS *fixp, segT sec ATTRIBUTE_UNUSED)
5b93d8bb
AM
2420{
2421 return fixp->fx_frag->fr_address + fixp->fx_where;
2422}
2423
5b93d8bb
AM
2424/* Apply a fixup to the object code. This is called for all the
2425 fixups we generated by the call to fix_new_exp, above. In the call
2426 above we used a reloc code which was the largest legal reloc code
2427 plus the operand index. Here we undo that to recover the operand
2428 index. At this point all symbol values should be fully resolved,
2429 and we attempt to completely resolve the reloc. If we can not do
2430 that, we determine the correct reloc code and put it back in the
2431 fixup.
2432
2433 See gas/cgen.c for more sample code and explanations of what's
ea1562b3 2434 going on here. */
5b93d8bb 2435
94f592af 2436void
55cf6793 2437md_apply_fix (fixS *fixP, valueT * valP, segT seg)
5b93d8bb 2438{
94f592af 2439 valueT value = * valP;
5b93d8bb 2440
94f592af 2441 if (fixP->fx_addsy != NULL)
5b93d8bb 2442 {
5b93d8bb 2443#ifdef DEBUG
55cf6793 2444 printf ("\nmd_apply_fix: symbol %s at 0x%x (%s:%d) val=0x%x addend=0x%x\n",
94f592af
NC
2445 S_GET_NAME (fixP->fx_addsy),
2446 fixP->fx_frag->fr_address + fixP->fx_where,
2447 fixP->fx_file, fixP->fx_line,
2448 S_GET_VALUE (fixP->fx_addsy), value);
5b93d8bb
AM
2449#endif
2450 }
2451 else
a161fe53 2452 fixP->fx_done = 1;
5b93d8bb
AM
2453
2454 /* Apply fixups to operands. Note that there should be no relocations
2455 for any operands, since no instruction ever takes an operand
2456 that requires reloc. */
94f592af 2457 if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
5b93d8bb
AM
2458 {
2459 int opindex;
2460 const struct i370_operand *operand;
2461 char *where;
2462 i370_insn_t insn;
2463
94f592af 2464 opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
5b93d8bb
AM
2465
2466 operand = &i370_operands[opindex];
2467
2468#ifdef DEBUG
55cf6793 2469 printf ("\nmd_apply_fix: fixup operand %s at 0x%x in %s:%d addend=0x%x\n",
5b93d8bb 2470 operand->name,
94f592af
NC
2471 fixP->fx_frag->fr_address + fixP->fx_where,
2472 fixP->fx_file, fixP->fx_line,
5b93d8bb
AM
2473 value);
2474#endif
2475 /* Fetch the instruction, insert the fully resolved operand
2476 value, and stuff the instruction back again.
92774660 2477 fisxp->fx_size is the length of the instruction. */
94f592af 2478 where = fixP->fx_frag->fr_literal + fixP->fx_where;
5b93d8bb 2479 insn.i[0] = bfd_getb32 ((unsigned char *) where);
94f592af
NC
2480
2481 if (6 <= fixP->fx_size)
2482 /* Deal with 48-bit insn's. */
2483 insn.i[1] = bfd_getb32 (((unsigned char *) where)+4);
2484
5b93d8bb
AM
2485 insn = i370_insert_operand (insn, operand, (offsetT) value);
2486 bfd_putb32 ((bfd_vma) insn.i[0], (unsigned char *) where);
5b93d8bb 2487
94f592af
NC
2488 if (6 <= fixP->fx_size)
2489 /* Deal with 48-bit insn's. */
2490 bfd_putb32 ((bfd_vma) insn.i[1], (((unsigned char *) where)+4));
2491
2492 /* We are done, right? right !! */
2493 fixP->fx_done = 1;
2494 if (fixP->fx_done)
2495 /* Nothing else to do here. */
2496 return;
5b93d8bb
AM
2497
2498 /* Determine a BFD reloc value based on the operand information.
2499 We are only prepared to turn a few of the operands into
2500 relocs. In fact, we support *zero* operand relocations ...
2501 Why? Because we are not expecting the compiler to generate
33eaf5de 2502 any operands that need relocation. Due to the 12-bit nature of
92774660 2503 i370 addressing, this would be unusual. */
5b93d8bb 2504 {
3b4dbbbf 2505 const char *sfile;
5b93d8bb
AM
2506 unsigned int sline;
2507
2508 /* Use expr_symbol_where to see if this is an expression
2509 symbol. */
94f592af
NC
2510 if (expr_symbol_where (fixP->fx_addsy, &sfile, &sline))
2511 as_bad_where (fixP->fx_file, fixP->fx_line,
5b93d8bb
AM
2512 "unresolved expression that must be resolved");
2513 else
94f592af 2514 as_bad_where (fixP->fx_file, fixP->fx_line,
5b93d8bb 2515 "unsupported relocation type");
94f592af
NC
2516 fixP->fx_done = 1;
2517 return;
5b93d8bb
AM
2518 }
2519 }
2520 else
2521 {
2522 /* We branch to here if the fixup is not to a symbol that
94f592af
NC
2523 appears in an instruction operand, but is rather some
2524 declared storage. */
5b93d8bb 2525#ifdef OBJ_ELF
94f592af 2526 i370_elf_validate_fix (fixP, seg);
5b93d8bb
AM
2527#endif
2528#ifdef DEBUG
55cf6793 2529 printf ("md_apply_fix: reloc case %d in segment %s %s:%d\n",
94f592af 2530 fixP->fx_r_type, segment_name (seg), fixP->fx_file, fixP->fx_line);
5b93d8bb
AM
2531 printf ("\tcurrent fixup value is 0x%x \n", value);
2532#endif
94f592af 2533 switch (fixP->fx_r_type)
5b93d8bb
AM
2534 {
2535 case BFD_RELOC_32:
2536 case BFD_RELOC_CTOR:
94f592af
NC
2537 if (fixP->fx_pcrel)
2538 fixP->fx_r_type = BFD_RELOC_32_PCREL;
2539 /* Fall through. */
5b93d8bb
AM
2540
2541 case BFD_RELOC_RVA:
2542 case BFD_RELOC_32_PCREL:
2543 case BFD_RELOC_32_BASEREL:
2544#ifdef DEBUG
2545 printf ("\t32 bit relocation at 0x%x\n",
94f592af 2546 fixP->fx_frag->fr_address + fixP->fx_where);
5b93d8bb 2547#endif
94f592af 2548 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5b93d8bb
AM
2549 value, 4);
2550 break;
2551
2552 case BFD_RELOC_LO16:
2553 case BFD_RELOC_16:
94f592af
NC
2554 if (fixP->fx_pcrel)
2555 as_bad_where (fixP->fx_file, fixP->fx_line,
5b93d8bb 2556 "cannot emit PC relative %s relocation%s%s",
94f592af
NC
2557 bfd_get_reloc_code_name (fixP->fx_r_type),
2558 fixP->fx_addsy != NULL ? " against " : "",
2559 (fixP->fx_addsy != NULL
2560 ? S_GET_NAME (fixP->fx_addsy)
5b93d8bb
AM
2561 : ""));
2562
94f592af 2563 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5b93d8bb
AM
2564 value, 2);
2565 break;
2566
2567 /* This case happens when you write, for example,
2568 lis %r3,(L1-L2)@ha
2569 where L1 and L2 are defined later. */
2570 case BFD_RELOC_HI16:
94f592af 2571 if (fixP->fx_pcrel)
5b93d8bb 2572 abort ();
94f592af 2573 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5b93d8bb
AM
2574 value >> 16, 2);
2575 break;
2576 case BFD_RELOC_HI16_S:
94f592af 2577 if (fixP->fx_pcrel)
5b93d8bb 2578 abort ();
94f592af 2579 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5b93d8bb
AM
2580 (value + 0x8000) >> 16, 2);
2581 break;
2582
2583 case BFD_RELOC_8:
94f592af 2584 if (fixP->fx_pcrel)
5b93d8bb
AM
2585 abort ();
2586
94f592af 2587 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5b93d8bb
AM
2588 value, 1);
2589 break;
2590
2591 default:
bc805888 2592 fprintf (stderr,
94f592af 2593 "Gas failure, reloc value %d\n", fixP->fx_r_type);
07726851 2594 fflush (stderr);
5b93d8bb
AM
2595 abort ();
2596 }
2597 }
2598
94f592af 2599 fixP->fx_addnumber = value;
5b93d8bb
AM
2600}
2601
2602/* Generate a reloc for a fixup. */
2603
2604arelent *
ea1562b3 2605tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
5b93d8bb
AM
2606{
2607 arelent *reloc;
2608
add39d23 2609 reloc = XNEW (arelent);
5b93d8bb 2610
add39d23 2611 reloc->sym_ptr_ptr = XNEW (asymbol *);
5b93d8bb
AM
2612 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2613 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2614 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
2615 if (reloc->howto == (reloc_howto_type *) NULL)
2616 {
2617 as_bad_where (fixp->fx_file, fixp->fx_line,
2618 "reloc %d not supported by object file format", (int)fixp->fx_r_type);
2619 return NULL;
2620 }
2621 reloc->addend = fixp->fx_addnumber;
2622
2623#ifdef DEBUG
2624 printf ("\ngen_reloc(): sym %s (%s:%d) at addr 0x%x addend=0x%x\n",
2625 fixp->fx_addsy->bsym->name,
2626 fixp->fx_file, fixp->fx_line,
2627 reloc->address, reloc->addend);
2628#endif
2629
2630 return reloc;
2631}
ea1562b3
NC
2632
2633/* The target specific pseudo-ops which we support. */
2634
2635const pseudo_typeS md_pseudo_table[] =
2636{
2637 /* Pseudo-ops which must be overridden. */
2638 { "byte", i370_byte, 0 },
2639
2640 { "dc", i370_dc, 0 },
2641 { "ds", i370_ds, 0 },
2642 { "rmode", i370_rmode, 0 },
2643 { "csect", i370_csect, 0 },
2644 { "dsect", i370_dsect, 0 },
2645
2646 /* enable ebcdic strings e.g. for 3270 support */
2647 { "ebcdic", i370_ebcdic, 0 },
2648
2649#ifdef OBJ_ELF
2650 { "long", i370_elf_cons, 4 },
2651 { "word", i370_elf_cons, 4 },
2652 { "short", i370_elf_cons, 2 },
2653 { "rdata", i370_elf_rdata, 0 },
2654 { "rodata", i370_elf_rdata, 0 },
2655 { "lcomm", i370_elf_lcomm, 0 },
2656#endif
2657
2658 /* This pseudo-op is used even when not generating XCOFF output. */
2659 { "tc", i370_tc, 0 },
2660
2661 /* dump the literal pool */
2662 { "ltorg", i370_ltorg, 0 },
2663
2664 /* support the hlasm-style USING directive */
2665 { "using", i370_using, 0 },
2666 { "drop", i370_drop, 0 },
2667
2668 { NULL, NULL, 0 }
2669};
This page took 1.299436 seconds and 4 git commands to generate.