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
3 Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
4 Free Software Foundation, Inc.
5 Written by Ian Lance Taylor, Cygnus Support.
7 This file is part of GAS, the GNU Assembler.
9 GAS is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
14 GAS is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GAS; see the file COPYING. If not, write to the Free
21 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
24 /* This assembler implements a very hacked version of an elf-like thing
25 * that gcc emits (when gcc is suitably hacked). To make it behave more
26 * HLASM-like, try turning on the -M or --mri flag (as there are various
27 * similarities between HLASM and the MRI assemblers, such as section
28 * names, lack of leading . in pseudo-ops, DC and DS, etc ...
35 #include "struc-symbol.h"
37 #include "opcode/i370.h"
43 /* This is the assembler for the System/390 Architecture */
45 /* Tell the main code what the endianness is. */
46 extern int target_big_endian
;
49 /* Generic assembler global variables which must be defined by all
53 /* This string holds the chars that always start a comment. If the
54 pre-processor is disabled, these aren't very useful. The macro
55 tc_comment_chars points to this. We use this, rather than the
56 usual comment_chars, so that we can switch for Solaris conventions. */
57 static const char i370_eabi_comment_chars
[] = "#";
59 const char *i370_comment_chars
= i370_eabi_comment_chars
;
61 const char comment_chars
[] = "#";
64 /* Characters which start a comment at the beginning of a line. */
65 const char line_comment_chars
[] = "#*";
67 /* Characters which may be used to separate multiple commands on a
69 const char line_separator_chars
[] = ";";
71 /* Characters which are used to indicate an exponent in a floating
73 const char EXP_CHARS
[] = "eE";
75 /* Characters which mean that a number is a floating point constant,
77 const char FLT_CHARS
[] = "dD";
80 md_show_usage (stream
)
84 S/370 options: (these have not yet been tested and may not work) \n\
86 -mregnames Allow symbolic names for registers\n\
87 -mno-regnames Do not allow symbolic names for registers\n");
90 -mrelocatable support for GCC's -mrelocatble option\n\
91 -mrelocatable-lib support for GCC's -mrelocatble-lib option\n\
92 -V print assembler version number\n");
97 static void i370_byte
PARAMS ((int));
98 static void i370_tc
PARAMS ((int));
99 static void i370_ebcdic
PARAMS ((int));
101 static void i370_dc
PARAMS ((int));
102 static void i370_ds
PARAMS ((int));
103 static void i370_rmode
PARAMS ((int));
104 static void i370_csect
PARAMS ((int));
105 static void i370_dsect
PARAMS ((int));
106 static void i370_ltorg
PARAMS ((int));
107 static void i370_using
PARAMS ((int));
108 static void i370_drop
PARAMS ((int));
109 static void i370_make_relative
PARAMS ((expressionS
*exp
, expressionS
*baseaddr
));
112 static bfd_reloc_code_real_type i370_elf_suffix
PARAMS ((char **, expressionS
*));
113 static void i370_elf_cons
PARAMS ((int));
114 static void i370_elf_rdata
PARAMS ((int));
115 static void i370_elf_lcomm
PARAMS ((int));
116 static void i370_elf_validate_fix
PARAMS ((fixS
*, segT
));
120 /* The target specific pseudo-ops which we support. */
122 const pseudo_typeS md_pseudo_table
[] =
124 /* Pseudo-ops which must be overridden. */
125 { "byte", i370_byte
, 0 },
127 { "dc", i370_dc
, 0 },
128 { "ds", i370_ds
, 0 },
129 { "rmode", i370_rmode
, 0 },
130 { "csect", i370_csect
, 0 },
131 { "dsect", i370_dsect
, 0 },
133 /* enable ebcdic strings e.g. for 3270 support */
134 { "ebcdic", i370_ebcdic
, 0 },
137 { "long", i370_elf_cons
, 4 },
138 { "word", i370_elf_cons
, 4 },
139 { "short", i370_elf_cons
, 2 },
140 { "rdata", i370_elf_rdata
, 0 },
141 { "rodata", i370_elf_rdata
, 0 },
142 { "lcomm", i370_elf_lcomm
, 0 },
145 /* This pseudo-op is used even when not generating XCOFF output. */
146 { "tc", i370_tc
, 0 },
148 /* dump the literal pool */
149 { "ltorg", i370_ltorg
, 0 },
151 /* support the hlasm-style USING directive */
152 { "using", i370_using
, 0 },
153 { "drop", i370_drop
, 0 },
158 /* ***************************************************************** */
160 /* Whether to use user friendly register names. */
161 #define TARGET_REG_NAMES_P true
163 static boolean reg_names_p
= TARGET_REG_NAMES_P
;
165 static boolean register_name
PARAMS ((expressionS
*));
166 static void i370_set_cpu
PARAMS ((void));
167 static i370_insn_t i370_insert_operand
168 PARAMS ((i370_insn_t insn
, const struct i370_operand
*operand
, offsetT val
));
169 static void i370_macro
PARAMS ((char *str
, const struct i370_macro
*macro
));
171 /* Predefined register names if -mregnames */
172 /* In general, there are lots of them, in an attempt to be compatible */
173 /* with a number of assemblers. */
175 /* Structure to hold information about predefined registers. */
182 /* List of registers that are pre-defined:
184 Each general register has predefined names of the form:
185 1. r<reg_num> which has the value <reg_num>.
186 2. r.<reg_num> which has the value <reg_num>.
188 Each floating point register has predefined names of the form:
189 1. f<reg_num> which has the value <reg_num>.
190 2. f.<reg_num> which has the value <reg_num>.
192 There are only four floating point registers, and these are
193 commonly labelled 0,2,4 and 6. Thus, there is no f1, f3, etc.
195 There are individual registers as well:
196 rbase or r.base has the value 3 (base register)
197 rpgt or r.pgt has the value 4 (page origin table pointer)
198 rarg or r.arg has the value 11 (argument pointer)
199 rtca or r.tca has the value 12 (table of contents pointer)
200 rtoc or r.toc has the value 12 (table of contents pointer)
201 sp or r.sp has the value 13 (stack pointer)
202 dsa or r.dsa has the value 13 (stack pointer)
203 lr has the value 14 (link reg)
205 The table is sorted. Suitable for searching by a binary search. */
207 static const struct pd_reg pre_defined_registers
[] =
209 { "arg", 11 }, /* Argument Pointer */
210 { "base", 3 }, /* Base Reg */
212 { "f.0", 0 }, /* Floating point registers */
222 { "dsa",13 }, /* stack pointer */
223 { "lr", 14 }, /* Link Register */
224 { "pgt", 4 }, /* Page Origin Table Pointer */
226 { "r.0", 0 }, /* General Purpose Registers */
243 { "r.arg", 11 }, /* Argument Pointer */
244 { "r.base", 3 }, /* Base Reg */
245 { "r.dsa", 13 }, /* Stack Pointer */
246 { "r.pgt", 4 }, /* Page Origin Table Pointer */
247 { "r.sp", 13 }, /* Stack Pointer */
249 { "r.tca", 12 }, /* Pointer to the table of contents */
250 { "r.toc", 12 }, /* Pointer to the table of contents */
252 { "r0", 0 }, /* More general purpose registers */
269 { "rbase", 3 }, /* Base Reg */
271 { "rtca", 12 }, /* Pointer to the table of contents */
272 { "rtoc", 12 }, /* Pointer to the table of contents */
274 { "sp", 13 }, /* Stack Pointer */
278 #define REG_NAME_CNT (sizeof (pre_defined_registers) / sizeof (struct pd_reg))
280 /* Given NAME, find the register number associated with that name, return
281 the integer value associated with the given name or -1 on failure. */
283 static int reg_name_search
284 PARAMS ((const struct pd_reg
*, int, const char * name
));
287 reg_name_search (regs
, regcount
, name
)
288 const struct pd_reg
*regs
;
292 int middle
, low
, high
;
300 middle
= (low
+ high
) / 2;
301 cmp
= strcasecmp (name
, regs
[middle
].name
);
307 return regs
[middle
].value
;
315 * Summary of register_name().
317 * in: Input_line_pointer points to 1st char of operand.
319 * out: A expressionS.
320 * The operand may have been a register: in this case, X_op == O_register,
321 * X_add_number is set to the register number, and truth is returned.
322 * Input_line_pointer->(next non-blank) char after operand, or is in its
327 register_name (expressionP
)
328 expressionS
*expressionP
;
335 /* Find the spelling of the operand. */
336 start
= name
= input_line_pointer
;
337 if (name
[0] == '%' && isalpha (name
[1]))
338 name
= ++input_line_pointer
;
340 else if (!reg_names_p
)
344 name
= ++input_line_pointer
;
346 /* If it's a number, treat it as a number. If it's alpha, look to
347 see if it's in the register table. */
348 if (!isalpha (name
[0]))
350 reg_number
= get_single_number ();
354 c
= get_symbol_end ();
355 reg_number
= reg_name_search (pre_defined_registers
, REG_NAME_CNT
, name
);
357 /* Put back the delimiting char. */
358 *input_line_pointer
= c
;
361 /* If numeric, make sure its not out of bounds. */
362 if ((0 <= reg_number
) && (16 >= reg_number
))
364 expressionP
->X_op
= O_register
;
365 expressionP
->X_add_number
= reg_number
;
367 /* Make the rest nice. */
368 expressionP
->X_add_symbol
= NULL
;
369 expressionP
->X_op_symbol
= NULL
;
373 /* Reset the line as if we had not done anything. */
374 input_line_pointer
= start
;
378 /* Local variables. */
380 /* The type of processor we are assembling for. This is one or more
381 of the I370_OPCODE flags defined in opcode/i370.h. */
382 static int i370_cpu
= 0;
384 /* The base register to use for opcode with optional operands.
385 * We define two of these: "text" and "other". Normally, "text"
386 * would get used in the .text section for branches, while "other"
387 * gets used in the .data section for address constants.
389 * The idea of a second base register in a different section
390 * is foreign to the usual HLASM-style semantics; however, it
391 * allows us to provide support for dynamically loaded libraries,
392 * by allowing us to place address constants in a section other
393 * than the text section. The "other" section need not be the
394 * .data section, it can be any section that isn't the .text section.
396 * Note that HLASM defines a multiple, concurrent .using semantic
397 * that we do not: in calculating offsets, it uses either the most
398 * recent .using directive, or the one with the smallest displacement.
399 * This allows HLASM to support a quasi-block-scope-like behaviour.
400 * Handy for people writing assembly by hand ... but not supported
403 static int i370_using_text_regno
= -1;
404 static int i370_using_other_regno
= -1;
406 /* The base address for address literals */
407 static expressionS i370_using_text_baseaddr
;
408 static expressionS i370_using_other_baseaddr
;
410 /* the "other" section, used only for syntax error detection */
411 static segT i370_other_section
= undefined_section
;
413 /* Opcode hash table. */
414 static struct hash_control
*i370_hash
;
416 /* Macro hash table. */
417 static struct hash_control
*i370_macro_hash
;
420 /* What type of shared library support to use */
421 static enum { SHLIB_NONE
, SHLIB_PIC
, SHILB_MRELOCATABLE
} shlib
= SHLIB_NONE
;
424 /* Flags to set in the elf header */
425 static flagword i370_flags
= 0;
427 #ifndef WORKING_DOT_WORD
428 const int md_short_jump_size
= 4;
429 const int md_long_jump_size
= 4;
433 CONST
char *md_shortopts
= "l:um:K:VQ:";
435 CONST
char *md_shortopts
= "um:";
437 struct option md_longopts
[] =
439 {NULL
, no_argument
, NULL
, 0}
441 size_t md_longopts_size
= sizeof (md_longopts
);
444 md_parse_option (c
, arg
)
451 /* -u means that any undefined symbols should be treated as
452 external, which is the default for gas anyhow. */
457 /* Recognize -K PIC */
458 if (strcmp (arg
, "PIC") == 0 || strcmp (arg
, "pic") == 0)
461 i370_flags
|= EF_I370_RELOCATABLE_LIB
;
471 /* -m360 mean to assemble for the ancient 360 architecture */
472 if (strcmp (arg
, "360") == 0 || strcmp (arg
, "i360") == 0)
473 i370_cpu
= I370_OPCODE_360
;
474 /* -mxa means to assemble for the IBM 370 XA */
475 else if (strcmp (arg
, "xa") == 0)
476 i370_cpu
= I370_OPCODE_370_XA
;
477 /* -many means to assemble for any architecture (370/XA). */
478 else if (strcmp (arg
, "any") == 0)
479 i370_cpu
= I370_OPCODE_370
;
481 else if (strcmp (arg
, "regnames") == 0)
484 else if (strcmp (arg
, "no-regnames") == 0)
488 /* -mrelocatable/-mrelocatable-lib -- warn about initializations that require relocation */
489 else if (strcmp (arg
, "relocatable") == 0)
491 shlib
= SHILB_MRELOCATABLE
;
492 i370_flags
|= EF_I370_RELOCATABLE
;
495 else if (strcmp (arg
, "relocatable-lib") == 0)
497 shlib
= SHILB_MRELOCATABLE
;
498 i370_flags
|= EF_I370_RELOCATABLE_LIB
;
504 as_bad ("invalid switch -m%s", arg
);
510 /* -V: SVR4 argument to print version ID. */
515 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
516 should be emitted or not. FIXME: Not implemented. */
530 /* Set i370_cpu if it is not already set.
531 Currently defaults to the reasonable superset;
532 but can be made more fine grained if desred. */
537 const char *default_os
= TARGET_OS
;
538 const char *default_cpu
= TARGET_CPU
;
540 /* override with the superset for the moment. */
541 i370_cpu
= I370_OPCODE_ESA390_SUPERSET
;
544 if (strcmp (default_cpu
, "i360") == 0)
545 i370_cpu
= I370_OPCODE_360
;
546 else if (strcmp (default_cpu
, "i370") == 0)
547 i370_cpu
= I370_OPCODE_370
;
548 else if (strcmp (default_cpu
, "XA") == 0)
549 i370_cpu
= I370_OPCODE_370_XA
;
551 as_fatal ("Unknown default cpu = %s, os = %s", default_cpu
, default_os
);
555 /* Figure out the BFD architecture to use. */
556 /* hack alert -- specify the different 370 architectures */
558 enum bfd_architecture
561 return bfd_arch_i370
;
564 /* This function is called when the assembler starts up. It is called
565 after the options have been parsed and the output file has been
571 register const struct i370_opcode
*op
;
572 const struct i370_opcode
*op_end
;
573 const struct i370_macro
*macro
;
574 const struct i370_macro
*macro_end
;
575 boolean dup_insn
= false;
580 /* Set the ELF flags if desired. */
582 bfd_set_private_flags (stdoutput
, i370_flags
);
585 /* Insert the opcodes into a hash table. */
586 i370_hash
= hash_new ();
588 op_end
= i370_opcodes
+ i370_num_opcodes
;
589 for (op
= i370_opcodes
; op
< op_end
; op
++)
591 know ((op
->opcode
& op
->mask
) == op
->opcode
);
593 if ((op
->flags
& i370_cpu
) != 0)
597 retval
= hash_insert (i370_hash
, op
->name
, (PTR
) op
);
598 if (retval
!= (const char *) NULL
)
600 as_bad ("Internal assembler error for instruction %s", op
->name
);
606 /* Insert the macros into a hash table. */
607 i370_macro_hash
= hash_new ();
609 macro_end
= i370_macros
+ i370_num_macros
;
610 for (macro
= i370_macros
; macro
< macro_end
; macro
++)
612 if ((macro
->flags
& i370_cpu
) != 0)
616 retval
= hash_insert (i370_macro_hash
, macro
->name
, (PTR
) macro
);
617 if (retval
!= (const char *) NULL
)
619 as_bad ("Internal assembler error for macro %s", macro
->name
);
629 /* Insert an operand value into an instruction. */
632 i370_insert_operand (insn
, operand
, val
)
634 const struct i370_operand
*operand
;
641 /* used for 48-bit insn's */
643 insn
= (*operand
->insert
) (insn
, (long) val
, &errmsg
);
645 as_bad ("%s", errmsg
);
649 /* this is used only for 16, 32 bit insn's */
650 insn
.i
[0] |= (((long) val
& ((1 << operand
->bits
) - 1))
659 /* Parse @got, etc. and return the desired relocation.
660 Currently, i370 does not support (don't really need to support) any
661 of these fancier markups ... for example, no one is going to
662 write 'L 6,=V(bogus)@got' it just doesn't make sense (at least to me).
663 So basically, we could get away with this routine returning
664 BFD_RELOC_UNUSED in all circumstances. However, I'll leave
665 in for now in case someone ambitious finds a good use for this stuff ...
666 this routine was pretty much just copied from the powerpc code ... */
667 static bfd_reloc_code_real_type
668 i370_elf_suffix (str_p
, exp_p
)
676 bfd_reloc_code_real_type reloc
;
686 #define MAP(str,reloc) { str, sizeof (str)-1, reloc }
688 static struct map_bfd mapping
[] =
691 MAP ("l", BFD_RELOC_LO16
),
692 MAP ("h", BFD_RELOC_HI16
),
693 MAP ("ha", BFD_RELOC_HI16_S
),
695 /* warnings with -mrelocatable. */
696 MAP ("fixup", BFD_RELOC_CTOR
),
697 { (char *)0, 0, BFD_RELOC_UNUSED
}
701 return BFD_RELOC_UNUSED
;
703 for (ch
= *str
, str2
= ident
;
704 (str2
< ident
+ sizeof (ident
) - 1
705 && (isalnum (ch
) || ch
== '@'));
708 *str2
++ = (islower (ch
)) ? ch
: tolower (ch
);
715 for (ptr
= &mapping
[0]; ptr
->length
> 0; ptr
++)
716 if (ch
== ptr
->string
[0]
717 && len
== ptr
->length
718 && memcmp (ident
, ptr
->string
, ptr
->length
) == 0)
720 if (exp_p
->X_add_number
!= 0
721 && (ptr
->reloc
== BFD_RELOC_16_GOTOFF
722 || ptr
->reloc
== BFD_RELOC_LO16_GOTOFF
723 || ptr
->reloc
== BFD_RELOC_HI16_GOTOFF
724 || ptr
->reloc
== BFD_RELOC_HI16_S_GOTOFF
))
725 as_warn ("identifier+constant@got means identifier@got+constant");
727 /* Now check for identifier@suffix+constant */
728 if (*str
== '-' || *str
== '+')
730 char *orig_line
= input_line_pointer
;
733 input_line_pointer
= str
;
734 expression (&new_exp
);
735 if (new_exp
.X_op
== O_constant
)
737 exp_p
->X_add_number
+= new_exp
.X_add_number
;
738 str
= input_line_pointer
;
741 if (&input_line_pointer
!= str_p
)
742 input_line_pointer
= orig_line
;
749 return BFD_RELOC_UNUSED
;
752 /* Like normal .long/.short/.word, except support @got, etc. */
753 /* clobbers input_line_pointer, checks end-of-line. */
755 i370_elf_cons (nbytes
)
756 register int nbytes
; /* 1=.byte, 2=.word, 4=.long */
759 bfd_reloc_code_real_type reloc
;
761 if (is_it_end_of_statement ())
763 demand_empty_rest_of_line ();
770 if (exp
.X_op
== O_symbol
771 && *input_line_pointer
== '@'
772 && (reloc
= i370_elf_suffix (&input_line_pointer
, &exp
)) != BFD_RELOC_UNUSED
)
774 reloc_howto_type
*reloc_howto
= bfd_reloc_type_lookup (stdoutput
, reloc
);
775 int size
= bfd_get_reloc_size (reloc_howto
);
778 as_bad ("%s relocations do not fit in %d bytes\n", reloc_howto
->name
, nbytes
);
782 register char *p
= frag_more ((int) nbytes
);
783 int offset
= nbytes
- size
;
785 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
+ offset
, size
, &exp
, 0, reloc
);
789 emit_expr (&exp
, (unsigned int) nbytes
);
791 while (*input_line_pointer
++ == ',');
793 input_line_pointer
--; /* Put terminator back into stream. */
794 demand_empty_rest_of_line ();
798 /* ASCII to EBCDIC conversion table. */
799 static unsigned char ascebc
[256] =
801 /*00 NL SH SX EX ET NQ AK BL */
802 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F,
803 /*08 BS HT LF VT FF CR SO SI */
804 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
805 /*10 DL D1 D2 D3 D4 NK SN EB */
806 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26,
807 /*18 CN EM SB EC FS GS RS US */
808 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
809 /*20 SP ! " # $ % & ' */
810 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D,
811 /*28 ( ) * + , - . / */
812 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
813 /*30 0 1 2 3 4 5 6 7 */
814 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
815 /*38 8 9 : ; < = > ? */
816 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
817 /*40 @ A B C D E F G */
818 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
819 /*48 H I J K L M N O */
820 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
821 /*50 P Q R S T U V W */
822 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6,
823 /*58 X Y Z [ \ ] ^ _ */
824 0xE7, 0xE8, 0xE9, 0xAD, 0xE0, 0xBD, 0x5F, 0x6D,
825 /*60 ` a b c d e f g */
826 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
827 /*68 h i j k l m n o */
828 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
829 /*70 p q r s t u v w */
830 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
831 /*78 x y z { | } ~ DL */
832 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07,
833 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
834 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
835 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
836 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
837 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
838 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
839 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
840 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
841 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
842 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
843 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
844 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
845 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
846 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
847 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
848 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFF
851 /* EBCDIC to ASCII conversion table. */
852 unsigned char ebcasc
[256] =
854 /*00 NU SH SX EX PF HT LC DL */
855 0x00, 0x01, 0x02, 0x03, 0x00, 0x09, 0x00, 0x7F,
856 /*08 SM VT FF CR SO SI */
857 0x00, 0x00, 0x00, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
858 /*10 DE D1 D2 TM RS NL BS IL */
859 0x10, 0x11, 0x12, 0x13, 0x14, 0x0A, 0x08, 0x00,
860 /*18 CN EM CC C1 FS GS RS US */
861 0x18, 0x19, 0x00, 0x00, 0x1C, 0x1D, 0x1E, 0x1F,
862 /*20 DS SS FS BP LF EB EC */
863 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x17, 0x1B,
864 /*28 SM C2 EQ AK BL */
865 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x07, 0x00,
866 /*30 SY PN RS UC ET */
867 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
869 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x00, 0x1A,
871 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
873 0x00, 0x00, 0x00, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
875 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
877 0x00, 0x00, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x5E,
879 0x2D, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
881 0x00, 0x00, 0x00, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
883 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
884 /*78 ` : # @ ' = " */
885 0x00, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
886 /*80 a b c d e f g */
887 0x00, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
889 0x68, 0x69, 0x00, 0x7B, 0x00, 0x00, 0x00, 0x00,
890 /*90 j k l m n o p */
891 0x00, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70,
893 0x71, 0x72, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x00,
894 /*A0 ~ s t u v w x */
895 0x00, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
897 0x79, 0x7A, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00,
899 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
901 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00,
902 /*C0 { A B C D E F G */
903 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
905 0x48, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
906 /*D0 } J K L M N O P */
907 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,
909 0x51, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
910 /*E0 \ S T U V W X */
911 0x5C, 0x00, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
913 0x59, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
914 /*F0 0 1 2 3 4 5 6 7 */
915 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
917 0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF
920 /* ebcdic translation tables needed for 3270 support */
929 nbytes
= strlen (input_line_pointer
);
930 end
= input_line_pointer
+ nbytes
;
931 while ('\r' == *end
) end
--;
932 while ('\n' == *end
) end
--;
934 delim
= *input_line_pointer
;
935 if (('\'' == delim
) || ('\"' == delim
)) {
936 input_line_pointer
++;
937 end
= rindex (input_line_pointer
, delim
);
940 if (end
> input_line_pointer
)
942 nbytes
= end
- input_line_pointer
+1;
943 p
= frag_more (nbytes
);
944 while (end
> input_line_pointer
)
946 *p
= ascebc
[(unsigned char) (*input_line_pointer
)];
947 ++p
; ++input_line_pointer
;
951 if (delim
== *input_line_pointer
) ++input_line_pointer
;
955 /* stub out a couple of routines */
960 as_tsktsk ("rmode ignored");
967 char *save_line
= input_line_pointer
;
968 static char section
[] = ".data\n";
970 /* Just pretend this is .section .data */
971 input_line_pointer
= section
;
972 obj_elf_section (sect
);
974 input_line_pointer
= save_line
;
981 as_tsktsk ("csect not supported");
985 /* DC Define Const is only partially supported.
986 * For samplecode on what to do, look at i370_elf_cons() above.
987 * This code handles pseudoops of the style
988 * DC D'3.141592653' # in sysv4, .double 3.14159265
989 * DC F'1' # in sysv4, .long 1
1000 if (is_it_end_of_statement ())
1002 demand_empty_rest_of_line ();
1006 /* figure out the size */
1007 type
= *input_line_pointer
++;
1010 case 'H': /* 16-bit */
1013 case 'E': /* 32-bit */
1014 case 'F': /* 32-bit */
1017 case 'D': /* 64-bit */
1021 as_bad ("unsupported DC type");
1025 /* get rid of pesky quotes */
1026 if ('\'' == *input_line_pointer
)
1029 ++input_line_pointer
;
1030 close
= strchr (input_line_pointer
, '\'');
1034 as_bad ("missing end-quote");
1036 if ('\"' == *input_line_pointer
)
1039 ++input_line_pointer
;
1040 close
= strchr (input_line_pointer
, '\"');
1044 as_bad ("missing end-quote");
1049 case 'H': /* 16-bit */
1050 case 'F': /* 32-bit */
1052 emit_expr (&exp
, nbytes
);
1054 case 'E': /* 32-bit */
1055 case 'D': /* 64-bit */
1056 md_atof (type
, tmp
, &nbytes
);
1057 p
= frag_more (nbytes
);
1058 memcpy (p
, tmp
, nbytes
);
1061 as_bad ("unsupported DC type");
1065 demand_empty_rest_of_line ();
1069 /* provide minimal support for DS Define Storage */
1074 /* DS 0H or DS 0F or DS 0D */
1075 if ('0' == *input_line_pointer
)
1077 int alignment
= 0; /* left shift 1<<align */
1078 input_line_pointer
++;
1079 switch (*input_line_pointer
++)
1081 case 'H': /* 16-bit */
1084 case 'F': /* 32-bit */
1087 case 'D': /* 64-bit */
1091 as_bad ("unsupported alignment");
1094 frag_align (alignment
, 0, 0);
1095 record_alignment (now_seg
, alignment
);
1099 as_bad ("this DS form not yet supported");
1103 /* Solaris pseudo op to change to the .rodata section. */
1105 i370_elf_rdata (sect
)
1108 char *save_line
= input_line_pointer
;
1109 static char section
[] = ".rodata\n";
1111 /* Just pretend this is .section .rodata */
1112 input_line_pointer
= section
;
1113 obj_elf_section (sect
);
1115 input_line_pointer
= save_line
;
1118 /* Pseudo op to make file scope bss items */
1120 i370_elf_lcomm (unused
)
1123 register char *name
;
1127 register symbolS
*symbolP
;
1134 name
= input_line_pointer
;
1135 c
= get_symbol_end ();
1137 /* just after name is now '\0' */
1138 p
= input_line_pointer
;
1141 if (*input_line_pointer
!= ',')
1143 as_bad ("Expected comma after symbol-name: rest of line ignored.");
1144 ignore_rest_of_line ();
1148 input_line_pointer
++; /* skip ',' */
1149 if ((size
= get_absolute_expression ()) < 0)
1151 as_warn (".COMMon length (%ld.) <0! Ignored.", (long) size
);
1152 ignore_rest_of_line ();
1156 /* The third argument to .lcomm is the alignment. */
1157 if (*input_line_pointer
!= ',')
1161 ++input_line_pointer
;
1162 align
= get_absolute_expression ();
1165 as_warn ("ignoring bad alignment");
1171 symbolP
= symbol_find_or_make (name
);
1174 if (S_IS_DEFINED (symbolP
) && ! S_IS_COMMON (symbolP
))
1176 as_bad ("Ignoring attempt to re-define symbol `%s'.",
1177 S_GET_NAME (symbolP
));
1178 ignore_rest_of_line ();
1182 if (S_GET_VALUE (symbolP
) && S_GET_VALUE (symbolP
) != (valueT
) size
)
1184 as_bad ("Length of .lcomm \"%s\" is already %ld. Not changed to %ld.",
1185 S_GET_NAME (symbolP
),
1186 (long) S_GET_VALUE (symbolP
),
1189 ignore_rest_of_line ();
1195 old_subsec
= now_subseg
;
1198 /* convert to a power of 2 alignment */
1199 for (align2
= 0; (align
& 1) == 0; align
>>= 1, ++align2
)
1203 as_bad ("Common alignment not a power of 2");
1204 ignore_rest_of_line ();
1211 record_alignment (bss_section
, align2
);
1212 subseg_set (bss_section
, 0);
1214 frag_align (align2
, 0, 0);
1215 if (S_GET_SEGMENT (symbolP
) == bss_section
)
1216 symbol_get_frag (symbolP
)->fr_symbol
= 0;
1217 symbol_set_frag (symbolP
, frag_now
);
1218 pfrag
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, symbolP
, size
,
1221 S_SET_SIZE (symbolP
, size
);
1222 S_SET_SEGMENT (symbolP
, bss_section
);
1223 subseg_set (old_sec
, old_subsec
);
1224 demand_empty_rest_of_line ();
1227 /* Validate any relocations emitted for -mrelocatable, possibly adding
1228 fixups for word relocations in writable segments, so we can adjust
1231 i370_elf_validate_fix (fixp
, seg
)
1235 if (fixp
->fx_done
|| fixp
->fx_pcrel
)
1244 case SHILB_MRELOCATABLE
:
1245 if (fixp
->fx_r_type
<= BFD_RELOC_UNUSED
1246 && fixp
->fx_r_type
!= BFD_RELOC_16_GOTOFF
1247 && fixp
->fx_r_type
!= BFD_RELOC_HI16_GOTOFF
1248 && fixp
->fx_r_type
!= BFD_RELOC_LO16_GOTOFF
1249 && fixp
->fx_r_type
!= BFD_RELOC_HI16_S_GOTOFF
1250 && fixp
->fx_r_type
!= BFD_RELOC_32_BASEREL
1251 && fixp
->fx_r_type
!= BFD_RELOC_LO16_BASEREL
1252 && fixp
->fx_r_type
!= BFD_RELOC_HI16_BASEREL
1253 && fixp
->fx_r_type
!= BFD_RELOC_HI16_S_BASEREL
1254 && strcmp (segment_name (seg
), ".got2") != 0
1255 && strcmp (segment_name (seg
), ".dtors") != 0
1256 && strcmp (segment_name (seg
), ".ctors") != 0
1257 && strcmp (segment_name (seg
), ".fixup") != 0
1258 && strcmp (segment_name (seg
), ".stab") != 0
1259 && strcmp (segment_name (seg
), ".gcc_except_table") != 0
1260 && strcmp (segment_name (seg
), ".ex_shared") != 0)
1262 if ((seg
->flags
& (SEC_READONLY
| SEC_CODE
)) != 0
1263 || fixp
->fx_r_type
!= BFD_RELOC_CTOR
)
1265 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
1266 "Relocation cannot be done when using -mrelocatable");
1272 #endif /* OBJ_ELF */
1275 #define LITERAL_POOL_SUPPORT
1276 #ifdef LITERAL_POOL_SUPPORT
1277 /* Provide support for literal pools within the text section. */
1278 /* Loosely based on similar code from tc-arm.c */
1280 * We will use four symbols to locate four parts of the literal pool.
1281 * These four sections contain 64,32,16 and 8-bit constants; we use
1282 * four sections so that all memory access can be appropriately aligned.
1283 * That is, we want to avoid mixing these together so that we don't
1284 * waste space padding out to alignments. The four pointers
1285 * longlong_poolP, word_poolP, etc. point to a symbol labeling the
1286 * start of each pool part.
1288 * lit_pool_num increments from zero to infinity and uniquely id's
1289 * -- its used to generate the *_poolP symbol name.
1292 #define MAX_LITERAL_POOL_SIZE 1024
1294 typedef struct literalS
1296 struct expressionS exp
;
1298 char size
; /* 1,2,4 or 8 */
1302 literalT literals
[MAX_LITERAL_POOL_SIZE
];
1303 int next_literal_pool_place
= 0; /* Next free entry in the pool */
1305 static symbolS
*longlong_poolP
= NULL
; /* 64-bit pool entries */
1306 static symbolS
*word_poolP
= NULL
; /* 32-bit pool entries */
1307 static symbolS
*short_poolP
= NULL
; /* 16-bit pool entries */
1308 static symbolS
*byte_poolP
= NULL
; /* 8-bit pool entries */
1310 static int lit_pool_num
= 1;
1312 /* create a new, empty symbol */
1314 symbol_make_empty (void)
1316 return symbol_create (FAKE_LABEL_NAME
, undefined_section
,
1317 (valueT
) 0, &zero_address_frag
);
1320 /* add an expression to the literal pool */
1322 add_to_lit_pool (expressionS
*exx
, char *name
, int sz
)
1325 int offset_in_pool
= 0;
1327 /* start a new pool, if necessary */
1328 if (8 == sz
&& NULL
== longlong_poolP
)
1329 longlong_poolP
= symbol_make_empty ();
1330 else if (4 == sz
&& NULL
== word_poolP
)
1331 word_poolP
= symbol_make_empty ();
1332 else if (2 == sz
&& NULL
== short_poolP
)
1333 short_poolP
= symbol_make_empty ();
1334 else if (1 == sz
&& NULL
== byte_poolP
)
1335 byte_poolP
= symbol_make_empty ();
1337 /* Check if this literal value is already in the pool: */
1338 /* hack alert -- we should probably be checking expressions
1339 * of type O_symbol as well ... */
1340 /* hack alert XXX this is probably(certainly?) broken for O_big,
1341 * which includes 64-bit long-longs ...
1343 while (lit_count
< next_literal_pool_place
)
1345 if (exx
->X_op
== O_constant
1346 && literals
[lit_count
].exp
.X_op
== exx
->X_op
1347 && literals
[lit_count
].exp
.X_add_number
== exx
->X_add_number
1348 && literals
[lit_count
].exp
.X_unsigned
== exx
->X_unsigned
1349 && literals
[lit_count
].size
== sz
)
1351 else if (literals
[lit_count
].sym_name
1353 && !strcmp (name
, literals
[lit_count
].sym_name
))
1355 if (sz
== literals
[lit_count
].size
)
1356 offset_in_pool
+= sz
;
1360 if (lit_count
== next_literal_pool_place
) /* new entry */
1362 if (next_literal_pool_place
> MAX_LITERAL_POOL_SIZE
)
1364 as_bad ("Literal Pool Overflow");
1367 literals
[next_literal_pool_place
].exp
= *exx
;
1368 literals
[next_literal_pool_place
].size
= sz
;
1369 literals
[next_literal_pool_place
].offset
= offset_in_pool
;
1372 literals
[next_literal_pool_place
].sym_name
= strdup (name
);
1376 literals
[next_literal_pool_place
].sym_name
= NULL
;
1378 next_literal_pool_place
++;
1381 /* ???_poolP points to the begining of the literal pool.
1382 * X_add_number is the offset from the begining of the
1383 * literal pool to this expr minus the location of the most
1384 * recent .using directive. Thus, the grand total value of the
1385 * expression is the distance from .using to the literal.
1388 exx
->X_add_symbol
= longlong_poolP
;
1390 exx
->X_add_symbol
= word_poolP
;
1392 exx
->X_add_symbol
= short_poolP
;
1394 exx
->X_add_symbol
= byte_poolP
;
1395 exx
->X_add_number
= offset_in_pool
;
1396 exx
->X_op_symbol
= NULL
;
1398 /* If the user has set up a base reg in another section,
1399 * use that; otherwise use the text section. */
1400 if (0 < i370_using_other_regno
)
1402 i370_make_relative (exx
, &i370_using_other_baseaddr
);
1406 i370_make_relative (exx
, &i370_using_text_baseaddr
);
1410 /* The symbol setup for the literal pool is done in two steps. First,
1411 * a symbol that represents the start of the literal pool is created,
1412 * above, in the add_to_pool() routine. This sym ???_poolP.
1413 * However, we don't know what fragment its in until a bit later.
1414 * So we defer the frag_now thing, and the symbol name, until .ltorg time
1417 /* Can't use symbol_new here, so have to create a symbol and then at
1418 a later date assign it a value. Thats what these functions do */
1420 symbol_locate (symbolP
, name
, segment
, valu
, frag
)
1422 CONST
char *name
; /* It is copied, the caller can modify */
1423 segT segment
; /* Segment identifier (SEG_<something>) */
1424 valueT valu
; /* Symbol value */
1425 fragS
*frag
; /* Associated fragment */
1428 char *preserved_copy_of_name
;
1430 name_length
= strlen (name
) + 1; /* +1 for \0 */
1431 obstack_grow (¬es
, name
, name_length
);
1432 preserved_copy_of_name
= obstack_finish (¬es
);
1434 S_SET_NAME (symbolP
, preserved_copy_of_name
);
1436 S_SET_SEGMENT (symbolP
, segment
);
1437 S_SET_VALUE (symbolP
, valu
);
1438 symbol_clear_list_pointers (symbolP
);
1440 symbol_set_frag (symbolP
, frag
);
1443 * Link to end of symbol chain.
1446 extern int symbol_table_frozen
;
1447 if (symbol_table_frozen
)
1451 symbol_append (symbolP
, symbol_lastP
, &symbol_rootP
, &symbol_lastP
);
1453 obj_symbol_new_hook (symbolP
);
1455 #ifdef tc_symbol_new_hook
1456 tc_symbol_new_hook (symbolP
);
1461 verify_symbol_chain(symbol_rootP
, symbol_lastP
);
1462 #endif /* DEBUG_SYMS */
1465 /* i370_addr_offset() will convert operand expressions
1466 * that appear to be absolute into thier base-register
1467 * relative form. These expressions come in two types:
1469 * (1) of the form "* + const" * where "*" means
1470 * relative offset since the last using
1471 * i.e. "*" means ".-using_baseaddr"
1473 * (2) labels, which are never absolute, but are always
1474 * relative to the last "using". Anything with an alpha
1475 * character is considered to be a label (since symbols
1476 * can never be operands), and since we've already handled
1477 * register operands. For example, "BL .L33" branch low
1478 * to .L33 RX form insn frequently terminates for-loops,
1481 i370_addr_offset (expressionS
*exx
)
1487 /* search for a label; anything with an alpha char will do */
1488 /* local labels consist of N digits followed by either b or f */
1489 lab
= input_line_pointer
;
1490 while (*lab
&& (',' != *lab
) && ('(' != *lab
))
1496 else if (isalpha (*lab
))
1503 else if (('f' == *lab
) || ('b' == *lab
))
1511 else if ('.' != *lab
)
1516 /* See if operand has a * in it */
1517 dot
= strchr (input_line_pointer
, '*');
1519 if (!dot
&& !islabel
)
1522 /* replace * with . and let expr munch on it. */
1527 /* OK, now we have to subtract the "using" location */
1528 /* normally branches appear in the text section only... */
1529 if (0 == strncmp (now_seg
->name
, ".text", 5) || 0 > i370_using_other_regno
)
1531 i370_make_relative (exx
, &i370_using_text_baseaddr
);
1535 i370_make_relative (exx
, &i370_using_other_baseaddr
);
1538 /* put the * back */
1545 /* handle address constants of various sorts */
1546 /* The currently supported types are
1549 * =X'deadbeef' hexadecimal
1550 * =F'1234' 32-bit const int
1551 * =H'1234' 16-bit const int
1554 i370_addr_cons (expressionS
*exp
)
1557 char *sym_name
, delim
;
1562 name
= input_line_pointer
;
1563 sym_name
= input_line_pointer
;
1564 /* Find the spelling of the operand */
1565 if (name
[0] == '=' && isalpha (name
[1]))
1567 name
= ++input_line_pointer
;
1577 /* A == address-of */
1579 ++input_line_pointer
;
1582 /* we use a simple string name to collapse together
1583 * multiple refrences to the same address literal
1585 name_len
= strcspn (sym_name
, ", ");
1586 delim
= *(sym_name
+ name_len
);
1587 *(sym_name
+ name_len
) = 0x0;
1588 add_to_lit_pool (exp
, sym_name
, 4);
1589 *(sym_name
+ name_len
) = delim
;
1595 case 'E': /* single-precision float point */
1596 case 'D': /* double-precision float point */
1598 /* H == 16-bit fixed-point const; expression must be const */
1599 /* F == fixed-point const; expression must be const */
1600 /* X == fixed-point const; expression must be const */
1601 if ('H' == name
[0]) cons_len
= 2;
1602 else if ('F' == name
[0]) cons_len
= 4;
1603 else if ('X' == name
[0]) cons_len
= -1;
1604 else if ('E' == name
[0]) cons_len
= 4;
1605 else if ('D' == name
[0]) cons_len
= 8;
1607 /* extract length, if it is present; hack alert -- assume single-digit
1611 cons_len
= name
[2] - '0'; /* should work for ascii and ebcdic */
1612 input_line_pointer
+= 2;
1615 ++input_line_pointer
;
1617 /* get rid of pesky quotes */
1618 if ('\'' == *input_line_pointer
)
1621 ++input_line_pointer
;
1622 close
= strchr (input_line_pointer
, '\'');
1626 as_bad ("missing end-quote");
1628 if ('\"' == *input_line_pointer
)
1631 ++input_line_pointer
;
1632 close
= strchr (input_line_pointer
, '\"');
1636 as_bad ("missing end-quote");
1638 if (('X' == name
[0]) || ('E' == name
[0]) || ('D' == name
[0]))
1643 /* The length of hex constants is specified directly with L,
1644 * or implied through the number of hex digits. For example:
1646 * =X'abcd' two bytes
1647 * =X'000000AB' four bytes
1648 * =XL4'AB' four bytes, left-padded withn zero
1650 if (('X' == name
[0]) && (0 > cons_len
))
1652 save
= input_line_pointer
;
1655 if (isxdigit (*save
))
1659 cons_len
= (hex_len
+1) /2;
1661 /* I beleive this works even for =XL8'dada0000beeebaaa'
1662 * which should parse out to X_op == O_big
1663 * Note that floats and doubles get represented as
1664 * 0d3.14159265358979 or 0f 2.7
1669 strcat (tmp
, input_line_pointer
);
1670 save
= input_line_pointer
;
1671 input_line_pointer
= tmp
;
1673 input_line_pointer
= save
+ (input_line_pointer
-tmp
-2);
1675 /* fix up lengths for floats and doubles */
1676 if (O_big
== exp
->X_op
)
1678 exp
->X_add_number
= cons_len
/ CHARS_PER_LITTLENUM
;
1685 /* O_big occurs when more than 4 bytes worth gets parsed */
1686 if ((exp
->X_op
!= O_constant
) && (exp
->X_op
!= O_big
))
1688 as_bad ("expression not a constant");
1691 add_to_lit_pool (exp
, 0x0, cons_len
);
1695 as_bad ("Unknown/unsupported address literal type");
1703 /* Dump the contents of the literal pool that we've accumulated so far.
1704 * This aligns the pool to the size of the largest literal in the pool.
1713 int biggest_literal_size
= 0;
1714 int biggest_align
= 0;
1717 if (strncmp (now_seg
->name
, ".text", 5))
1719 if (i370_other_section
== undefined_section
)
1721 as_bad (".ltorg without prior .using in section %s",
1724 if (i370_other_section
!= now_seg
)
1726 as_bad (".ltorg in section %s paired to .using in section %s",
1727 now_seg
->name
, i370_other_section
->name
);
1730 if (! longlong_poolP
1736 /* as_tsktsk ("Nothing to put in the pool\n"); */
1740 /* find largest literal .. 2 4 or 8 */
1742 while (lit_count
< next_literal_pool_place
)
1744 if (biggest_literal_size
< literals
[lit_count
].size
)
1745 biggest_literal_size
= literals
[lit_count
].size
;
1748 if (1 == biggest_literal_size
) biggest_align
= 0;
1749 else if (2 == biggest_literal_size
) biggest_align
= 1;
1750 else if (4 == biggest_literal_size
) biggest_align
= 2;
1751 else if (8 == biggest_literal_size
) biggest_align
= 3;
1752 else as_bad ("bad alignment of %d bytes in literal pool", biggest_literal_size
);
1753 if (0 == biggest_align
) biggest_align
= 1;
1755 /* Align pool for short, word, double word accesses */
1756 frag_align (biggest_align
, 0, 0);
1757 record_alignment (now_seg
, biggest_align
);
1759 /* Note that the gas listing will print only the first five
1760 * entries in the pool .... wonder how to make it print more ...
1762 /* output largest literals first, then the smaller ones. */
1763 for (litsize
=8; litsize
; litsize
/=2)
1765 symbolS
*current_poolP
= NULL
;
1769 current_poolP
= longlong_poolP
; break;
1771 current_poolP
= word_poolP
; break;
1773 current_poolP
= short_poolP
; break;
1775 current_poolP
= byte_poolP
; break;
1777 as_bad ("bad literal size\n");
1779 if (NULL
== current_poolP
)
1781 sprintf (pool_name
, ".LITP%01d%06d", litsize
, lit_pool_num
);
1782 symbol_locate (current_poolP
, pool_name
, now_seg
,
1783 (valueT
) frag_now_fix (), frag_now
);
1784 symbol_table_insert (current_poolP
);
1787 while (lit_count
< next_literal_pool_place
)
1789 if (litsize
== literals
[lit_count
].size
)
1791 #define EMIT_ADDR_CONS_SYMBOLS
1792 #ifdef EMIT_ADDR_CONS_SYMBOLS
1793 /* create a bogus symbol, add it to the pool ...
1794 * For the most part, I think this is a useless excercise,
1795 * except that having these symbol names in the objects
1796 * is vaguely useful for debugging ...
1798 if (literals
[lit_count
].sym_name
)
1800 symbolS
* symP
= symbol_make_empty ();
1801 symbol_locate (symP
, literals
[lit_count
].sym_name
, now_seg
,
1802 (valueT
) frag_now_fix (), frag_now
);
1803 symbol_table_insert (symP
);
1805 #endif /* EMIT_ADDR_CONS_SYMBOLS */
1807 emit_expr (&(literals
[lit_count
].exp
), literals
[lit_count
].size
);
1813 next_literal_pool_place
= 0;
1814 longlong_poolP
= NULL
;
1821 #endif /* LITERAL_POOL_SUPPORT */
1824 /* add support for the HLASM-like USING directive to indicate
1825 * the base register to use ... we don't support the full
1826 * hlasm semantics for this ... we merely pluck a base address
1827 * and a register number out. We print a warning if using is
1828 * called multiple times. I suppose we should check to see
1829 * if the regno is valid ...
1835 expressionS ex
, baseaddr
;
1839 /* if "*" appears in a using, it means "." */
1840 /* replace it with "." so that expr doesn't get confused. */
1841 star
= strchr (input_line_pointer
, '*');
1845 /* the first arg to using will usually be ".", but it can
1846 * be a more complex exprsssion too ... */
1847 expression (&baseaddr
);
1850 if (O_constant
!= baseaddr
.X_op
1851 && O_symbol
!= baseaddr
.X_op
1852 && O_uminus
!= baseaddr
.X_op
)
1854 as_bad (".using: base address expression illegal or too complex");
1857 if (*input_line_pointer
!= '\0') ++input_line_pointer
;
1859 /* the second arg to using had better be a register */
1860 register_name (&ex
);
1861 demand_empty_rest_of_line ();
1862 iregno
= ex
.X_add_number
;
1864 if (0 == strncmp (now_seg
->name
, ".text", 5))
1866 i370_using_text_baseaddr
= baseaddr
;
1867 i370_using_text_regno
= iregno
;
1871 i370_using_other_baseaddr
= baseaddr
;
1872 i370_using_other_regno
= iregno
;
1873 i370_other_section
= now_seg
;
1884 register_name (&ex
);
1885 demand_empty_rest_of_line ();
1886 iregno
= ex
.X_add_number
;
1888 if (0 == strncmp (now_seg
->name
, ".text", 5))
1890 if (iregno
!= i370_using_text_regno
)
1892 as_bad ("droping register %d in section %s does not match using register %d",
1893 iregno
, now_seg
->name
, i370_using_text_regno
);
1895 i370_using_text_regno
= -1;
1896 i370_using_text_baseaddr
.X_op
= O_absent
;
1900 if (iregno
!= i370_using_other_regno
)
1902 as_bad ("droping register %d in section %s does not match using register %d",
1903 iregno
, now_seg
->name
, i370_using_other_regno
);
1905 if (i370_other_section
!= now_seg
)
1907 as_bad ("droping register %d in section %s previously used in section %s",
1908 iregno
, now_seg
->name
, i370_other_section
->name
);
1910 i370_using_other_regno
= -1;
1911 i370_using_other_baseaddr
.X_op
= O_absent
;
1912 i370_other_section
= undefined_section
;
1916 /* Make the first argument an address-relative expression
1917 * by subtracting the second argument.
1920 i370_make_relative (expressionS
*exx
, expressionS
*baseaddr
)
1923 if (O_constant
== baseaddr
->X_op
)
1925 exx
->X_op
= O_symbol
;
1926 exx
->X_add_number
-= baseaddr
->X_add_number
;
1928 else if (O_symbol
== baseaddr
->X_op
)
1930 exx
->X_op
= O_subtract
;
1931 exx
->X_op_symbol
= baseaddr
->X_add_symbol
;
1932 exx
->X_add_number
-= baseaddr
->X_add_number
;
1934 else if (O_uminus
== baseaddr
->X_op
)
1937 exx
->X_op_symbol
= baseaddr
->X_add_symbol
;
1938 exx
->X_add_number
+= baseaddr
->X_add_number
;
1942 as_bad ("Missing or bad .using directive");
1946 /* We need to keep a list of fixups. We can't simply generate them as
1947 we go, because that would require us to first create the frag, and
1948 that would screw up references to ``.''. */
1954 bfd_reloc_code_real_type reloc
;
1957 #define MAX_INSN_FIXUPS (5)
1959 /* This routine is called for each instruction to be assembled. */
1965 char *s
, *opcode_str
;
1966 const struct i370_opcode
*opcode
;
1968 const unsigned char *opindex_ptr
;
1969 int have_optional_index
, have_optional_basereg
, have_optional_reg
;
1970 int skip_optional_index
, skip_optional_basereg
, skip_optional_reg
;
1971 int use_text
=0, use_other
=0;
1973 struct i370_fixup fixups
[MAX_INSN_FIXUPS
];
1978 bfd_reloc_code_real_type reloc
;
1981 /* Get the opcode. */
1982 for (s
= str
; *s
!= '\0' && ! isspace (*s
); s
++)
1988 /* Look up the opcode in the hash table. */
1989 opcode
= (const struct i370_opcode
*) hash_find (i370_hash
, str
);
1990 if (opcode
== (const struct i370_opcode
*) NULL
)
1992 const struct i370_macro
*macro
;
1994 assert (i370_macro_hash
);
1995 macro
= (const struct i370_macro
*) hash_find (i370_macro_hash
, str
);
1996 if (macro
== (const struct i370_macro
*) NULL
)
1997 as_bad ("Unrecognized opcode: `%s'", str
);
1999 i370_macro (s
, macro
);
2004 insn
= opcode
->opcode
;
2007 while (isspace (*str
))
2010 /* I370 operands are either expressions or address constants.
2011 Many operand types are optional. The optional operands
2012 are always surrounded by parens, and are used to denote the base
2013 register ... e.g. "A R1, D2" or "A R1, D2(,B2) as opposed to
2014 the fully-formed "A R1, D2(X2,B2)". Note also the = sign,
2015 such as A R1,=A(i) where the address-of operator =A implies
2016 use of both a base register, and a missing index register.
2018 So, before we start seriously parsing the operands, we check
2019 to see if we have an optional operand, and, if we do, we count
2020 the number of commas to see which operand should be omitted. */
2022 have_optional_index
= have_optional_basereg
= have_optional_reg
= 0;
2023 for (opindex_ptr
= opcode
->operands
; *opindex_ptr
!= 0; opindex_ptr
++)
2025 const struct i370_operand
*operand
;
2026 operand
= &i370_operands
[*opindex_ptr
];
2027 if ((operand
->flags
& I370_OPERAND_INDEX
) != 0)
2028 have_optional_index
= 1;
2029 if ((operand
->flags
& I370_OPERAND_BASE
) != 0)
2030 have_optional_basereg
= 1;
2031 if ((operand
->flags
& I370_OPERAND_OPTIONAL
) != 0)
2032 have_optional_reg
= 1;
2035 skip_optional_index
= skip_optional_basereg
= skip_optional_reg
= 0;
2036 if (have_optional_index
|| have_optional_basereg
)
2038 unsigned int opcount
, nwanted
;
2040 /* There is an optional operand. Count the number of
2041 commas and open-parens in the input line. */
2048 while ((s
= strpbrk (s
, ",(=")) != (char *) NULL
)
2052 if (',' == *s
) ++s
; /* avoid counting things like (, */
2053 if ('=' == *s
) { ++s
; --opcount
; }
2057 /* If there are fewer operands in the line then are called
2058 for by the instruction, we want to skip the optional
2060 nwanted
= strlen (opcode
->operands
);
2061 if (have_optional_index
)
2063 if (opcount
< nwanted
)
2064 skip_optional_index
= 1;
2065 if (have_optional_basereg
&& ((opcount
+1) < nwanted
))
2066 skip_optional_basereg
= 1;
2067 if (have_optional_reg
&& ((opcount
+1) < nwanted
))
2068 skip_optional_reg
= 1;
2072 if (have_optional_basereg
&& (opcount
< nwanted
))
2073 skip_optional_basereg
= 1;
2074 if (have_optional_reg
&& (opcount
< nwanted
))
2075 skip_optional_reg
= 1;
2079 /* Perform some off-by-one hacks on the length field of certain instructions.
2080 * Its such a shame to have to do this, but the problem is that HLASM got
2081 * defined so that the lengths differ by one from the actual machine instructions.
2082 * this code should probably be moved to a special inster-operand routine.
2083 * Sigh. Affected instructions are Compare Logical, Move and Exclusive OR
2084 * hack alert -- aren't *all* SS instructions affected ??
2087 if (0 == strcasecmp ("CLC", opcode
->name
)
2088 || 0 == strcasecmp ("ED", opcode
->name
)
2089 || 0 == strcasecmp ("EDMK", opcode
->name
)
2090 || 0 == strcasecmp ("MVC", opcode
->name
)
2091 || 0 == strcasecmp ("MVCIN", opcode
->name
)
2092 || 0 == strcasecmp ("MVN", opcode
->name
)
2093 || 0 == strcasecmp ("MVZ", opcode
->name
)
2094 || 0 == strcasecmp ("NC", opcode
->name
)
2095 || 0 == strcasecmp ("OC", opcode
->name
)
2096 || 0 == strcasecmp ("XC", opcode
->name
))
2099 /* Gather the operands. */
2101 for (opindex_ptr
= opcode
->operands
; *opindex_ptr
!= 0; opindex_ptr
++)
2103 const struct i370_operand
*operand
;
2108 operand
= &i370_operands
[*opindex_ptr
];
2111 /* If this is an index operand, and we are skipping it,
2112 just insert a zero. */
2113 if (skip_optional_index
&&
2114 ((operand
->flags
& I370_OPERAND_INDEX
) != 0))
2116 insn
= i370_insert_operand (insn
, operand
, 0);
2120 /* If this is the base operand, and we are skipping it,
2121 just insert the current using basreg. */
2122 if (skip_optional_basereg
&&
2123 ((operand
->flags
& I370_OPERAND_BASE
) != 0))
2128 if (0 == strncmp (now_seg
->name
, ".text", 5)
2129 || 0 > i370_using_other_regno
)
2131 basereg
= i370_using_text_regno
;
2135 basereg
= i370_using_other_regno
;
2140 if (0 > i370_using_other_regno
)
2142 basereg
= i370_using_text_regno
;
2146 basereg
= i370_using_other_regno
;
2151 as_bad ("not using any base register");
2153 insn
= i370_insert_operand (insn
, operand
, basereg
);
2157 /* If this is an optional operand, and we are skipping it,
2158 Use zero (since a non-zero value would denote a register) */
2159 if (skip_optional_reg
2160 && ((operand
->flags
& I370_OPERAND_OPTIONAL
) != 0))
2162 insn
= i370_insert_operand (insn
, operand
, 0);
2166 /* Gather the operand. */
2167 hold
= input_line_pointer
;
2168 input_line_pointer
= str
;
2170 /* register names are only allowed where there are registers ... */
2171 if ((operand
->flags
& I370_OPERAND_GPR
) != 0)
2173 /* quickie hack to get past things like (,r13) */
2174 if (skip_optional_index
&& (',' == *input_line_pointer
))
2176 *input_line_pointer
= ' ';
2177 input_line_pointer
++;
2179 if (! register_name (&ex
))
2181 as_bad ("expecting a register for operand %d",
2182 opindex_ptr
- opcode
->operands
+ 1);
2186 /* check for a address constant expression */
2187 /* We will put PSW-relative addresses in the text section,
2188 * and adress literals in the .data (or other) section. */
2189 else if (i370_addr_cons (&ex
))
2191 else if (i370_addr_offset (&ex
))
2193 else expression (&ex
);
2195 str
= input_line_pointer
;
2196 input_line_pointer
= hold
;
2198 /* perform some off-by-one hacks on the length field of certain instructions.
2199 * Its such a shame to have to do this, but the problem is that HLASM got
2200 * defined so that the programmer specifies a length that is one greater
2201 * than what the machine instruction wants.
2204 if (off_by_one
&& (0 == strcasecmp ("SS L", operand
->name
)))
2209 if (ex
.X_op
== O_illegal
)
2210 as_bad ("illegal operand");
2211 else if (ex
.X_op
== O_absent
)
2212 as_bad ("missing operand");
2213 else if (ex
.X_op
== O_register
)
2215 insn
= i370_insert_operand (insn
, operand
, ex
.X_add_number
);
2217 else if (ex
.X_op
== O_constant
)
2220 /* Allow @HA, @L, @H on constants.
2221 * Well actually, no we don't; there really don't make sense
2222 * (at least not to me) for the i370. However, this code is
2223 * left here for any dubious future expansion reasons ... */
2224 char *orig_str
= str
;
2226 if ((reloc
= i370_elf_suffix (&str
, &ex
)) != BFD_RELOC_UNUSED
)
2233 case BFD_RELOC_LO16
:
2234 /* X_unsigned is the default, so if the user has done
2235 something which cleared it, we always produce a
2237 ex
.X_add_number
= (((ex
.X_add_number
& 0xffff)
2242 case BFD_RELOC_HI16
:
2243 ex
.X_add_number
= (ex
.X_add_number
>> 16) & 0xffff;
2246 case BFD_RELOC_HI16_S
:
2247 ex
.X_add_number
= (((ex
.X_add_number
>> 16) & 0xffff)
2248 + ((ex
.X_add_number
>> 15) & 1));
2252 insn
= i370_insert_operand (insn
, operand
, ex
.X_add_number
);
2255 else if ((reloc
= i370_elf_suffix (&str
, &ex
)) != BFD_RELOC_UNUSED
)
2257 as_tsktsk ("md_assemble(): suffixed relocations not supported\n");
2259 /* We need to generate a fixup for this expression. */
2260 if (fc
>= MAX_INSN_FIXUPS
)
2261 as_fatal ("too many fixups");
2262 fixups
[fc
].exp
= ex
;
2263 fixups
[fc
].opindex
= 0;
2264 fixups
[fc
].reloc
= reloc
;
2267 #endif /* OBJ_ELF */
2271 /* We need to generate a fixup for this expression. */
2272 /* Typically, the expression will just be a symbol ...
2273 * printf ("insn %s needs fixup for %s \n",
2274 * opcode->name, ex.X_add_symbol->bsym->name);
2277 if (fc
>= MAX_INSN_FIXUPS
)
2278 as_fatal ("too many fixups");
2279 fixups
[fc
].exp
= ex
;
2280 fixups
[fc
].opindex
= *opindex_ptr
;
2281 fixups
[fc
].reloc
= BFD_RELOC_UNUSED
;
2285 /* skip over delimiter (close paren, or comma) */
2286 if ((')' == *str
) && (',' == *(str
+1)))
2292 while (isspace (*str
))
2296 as_bad ("junk at end of line: `%s'", str
);
2298 /* Write out the instruction. */
2299 f
= frag_more (opcode
->len
);
2300 if (4 >= opcode
->len
)
2302 md_number_to_chars (f
, insn
.i
[0], opcode
->len
);
2306 md_number_to_chars (f
, insn
.i
[0], 4);
2307 if (6 == opcode
->len
)
2309 md_number_to_chars ((f
+4), ((insn
.i
[1])>>16), 2);
2313 /* not used --- don't have any 8 byte instructions */
2314 as_bad ("Internal Error: bad instruction length");
2315 md_number_to_chars ((f
+4), insn
.i
[1], opcode
->len
-4);
2319 /* Create any fixups. At this point we do not use a
2320 bfd_reloc_code_real_type, but instead just use the
2321 BFD_RELOC_UNUSED plus the operand index. This lets us easily
2322 handle fixups for any operand type, although that is admittedly
2323 not a very exciting feature. We pick a BFD reloc type in
2325 for (i
= 0; i
< fc
; i
++)
2327 const struct i370_operand
*operand
;
2329 operand
= &i370_operands
[fixups
[i
].opindex
];
2330 if (fixups
[i
].reloc
!= BFD_RELOC_UNUSED
)
2332 reloc_howto_type
*reloc_howto
= bfd_reloc_type_lookup (stdoutput
, fixups
[i
].reloc
);
2339 size
= bfd_get_reloc_size (reloc_howto
);
2341 if (size
< 1 || size
> 4)
2344 printf (" gwana doo fixup %d \n", i
);
2345 fixP
= fix_new_exp (frag_now
, f
- frag_now
->fr_literal
, size
,
2346 &fixups
[i
].exp
, reloc_howto
->pc_relative
,
2349 /* Turn off complaints that the addend is too large for things like
2351 switch (fixups
[i
].reloc
)
2353 case BFD_RELOC_16_GOTOFF
:
2354 case BFD_RELOC_LO16
:
2355 case BFD_RELOC_HI16
:
2356 case BFD_RELOC_HI16_S
:
2357 fixP
->fx_no_overflow
= 1;
2365 fix_new_exp (frag_now
, f
- frag_now
->fr_literal
, opcode
->len
,
2367 (operand
->flags
& I370_OPERAND_RELATIVE
) != 0,
2368 ((bfd_reloc_code_real_type
)
2369 (fixups
[i
].opindex
+ (int) BFD_RELOC_UNUSED
)));
2374 /* Handle a macro. Gather all the operands, transform them as
2375 described by the macro, and call md_assemble recursively. All the
2376 operands are separated by commas; we don't accept parentheses
2377 around operands here. */
2380 i370_macro (str
, macro
)
2382 const struct i370_macro
*macro
;
2393 /* Gather the users operands into the operands array. */
2398 if (count
>= sizeof operands
/ sizeof operands
[0])
2400 operands
[count
++] = s
;
2401 s
= strchr (s
, ',');
2402 if (s
== (char *) NULL
)
2407 if (count
!= macro
->operands
)
2409 as_bad ("wrong number of operands");
2413 /* Work out how large the string must be (the size is unbounded
2414 because it includes user input). */
2416 format
= macro
->format
;
2417 while (*format
!= '\0')
2426 arg
= strtol (format
+ 1, &send
, 10);
2427 know (send
!= format
&& arg
>= 0 && arg
< count
);
2428 len
+= strlen (operands
[arg
]);
2433 /* Put the string together. */
2434 complete
= s
= (char *) alloca (len
+ 1);
2435 format
= macro
->format
;
2436 while (*format
!= '\0')
2442 arg
= strtol (format
+ 1, &send
, 10);
2443 strcpy (s
, operands
[arg
]);
2450 /* Assemble the constructed instruction. */
2451 md_assemble (complete
);
2455 /* For ELF, add support for SHF_EXCLUDE and SHT_ORDERED */
2458 i370_section_letter (letter
, ptr_msg
)
2465 *ptr_msg
= "Bad .section directive: want a,w,x,e in string";
2470 i370_section_word (str
, len
)
2474 if (len
== 7 && strncmp (str
, "exclude", 7) == 0)
2481 i370_section_type (str
, len
)
2485 if (len
== 7 && strncmp (str
, "ordered", 7) == 0)
2492 i370_section_flags (flags
, attr
, type
)
2497 if (type
== SHT_ORDERED
)
2498 flags
|= SEC_ALLOC
| SEC_LOAD
| SEC_SORT_ENTRIES
;
2500 if (attr
& SHF_EXCLUDE
)
2501 flags
|= SEC_EXCLUDE
;
2505 #endif /* OBJ_ELF */
2508 /* Pseudo-op handling. */
2510 /* The .byte pseudo-op. This is similar to the normal .byte
2511 pseudo-op, but it can also take a single ASCII string. */
2517 if (*input_line_pointer
!= '\"')
2523 /* Gather characters. A real double quote is doubled. Unusual
2524 characters are not permitted. */
2525 ++input_line_pointer
;
2530 c
= *input_line_pointer
++;
2534 if (*input_line_pointer
!= '\"')
2536 ++input_line_pointer
;
2539 FRAG_APPEND_1_CHAR (c
);
2542 demand_empty_rest_of_line ();
2545 /* The .tc pseudo-op. This is used when generating XCOFF and ELF.
2546 This takes two or more arguments.
2548 When generating XCOFF output, the first argument is the name to
2549 give to this location in the toc; this will be a symbol with class
2550 TC. The rest of the arguments are 4 byte values to actually put at
2551 this location in the TOC; often there is just one more argument, a
2552 relocateable symbol reference.
2554 When not generating XCOFF output, the arguments are the same, but
2555 the first argument is simply ignored. */
2562 /* Skip the TOC symbol name. */
2563 while (is_part_of_name (*input_line_pointer
)
2564 || *input_line_pointer
== '['
2565 || *input_line_pointer
== ']'
2566 || *input_line_pointer
== '{'
2567 || *input_line_pointer
== '}')
2568 ++input_line_pointer
;
2570 /* Align to a four byte boundary. */
2571 frag_align (2, 0, 0);
2572 record_alignment (now_seg
, 2);
2574 if (*input_line_pointer
!= ',')
2575 demand_empty_rest_of_line ();
2578 ++input_line_pointer
;
2583 /* Turn a string in input_line_pointer into a floating point constant
2584 of type TYPE, and store the appropriate bytes in *LITP. The number
2585 of LITTLENUMS emitted is stored in *SIZEP. An error message is
2586 returned, or NULL on OK. */
2589 md_atof (type
, litp
, sizep
)
2595 LITTLENUM_TYPE words
[4];
2615 return "bad call to md_atof";
2618 /* 360/370/390 have two float formats: an old, funky 360 single-precision
2619 * format, and the ieee format. Support only the ieee format. */
2620 t
= atof_ieee (input_line_pointer
, type
, words
);
2622 input_line_pointer
= t
;
2626 for (i
= 0; i
< prec
; i
++)
2628 md_number_to_chars (litp
, (valueT
) words
[i
], 2);
2635 /* Write a value out to the object file, using the appropriate
2639 md_number_to_chars (buf
, val
, n
)
2644 number_to_chars_bigendian (buf
, val
, n
);
2647 /* Align a section (I don't know why this is machine dependent). */
2650 md_section_align (seg
, addr
)
2654 int align
= bfd_get_section_alignment (stdoutput
, seg
);
2656 return (addr
+ (1 << align
) - 1) & (-1 << align
);
2659 /* We don't have any form of relaxing. */
2662 md_estimate_size_before_relax (fragp
, seg
)
2670 /* Convert a machine dependent frag. We never generate these. */
2673 md_convert_frag (abfd
, sec
, fragp
)
2681 /* We have no need to default values of symbols. */
2684 md_undefined_symbol (name
)
2690 /* Functions concerning relocs. */
2692 /* The location from which a PC relative jump should be calculated,
2693 given a PC relative reloc. */
2696 md_pcrel_from_section (fixp
, sec
)
2700 return fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
2703 /* Apply a fixup to the object code. This is called for all the
2704 fixups we generated by the call to fix_new_exp, above. In the call
2705 above we used a reloc code which was the largest legal reloc code
2706 plus the operand index. Here we undo that to recover the operand
2707 index. At this point all symbol values should be fully resolved,
2708 and we attempt to completely resolve the reloc. If we can not do
2709 that, we determine the correct reloc code and put it back in the
2712 See gas/cgen.c for more sample code and explanations of what's
2717 md_apply_fix3 (fixp
, valuep
, seg
)
2725 if (fixp
->fx_addsy
!= NULL
)
2728 Branches to labels will come in here with fixp->fx_pcrel set to 1
2729 and fixp->fx_subsy not null, and holding the value of the base
2730 (i.e. the value of the .using). These we want to ignore.
2732 'Strong' and 'weak' symbols will come in here with
2733 fixp->fx_pcrel==0, fixp->fx_addsy defined, and
2734 *valuep holding the value of the symbol.
2736 'Strong' symbols will have S_GET_VALUE(fx_addsy) equal to zero,
2737 whereas 'weak' symbols will have S_GET_VALUE(fx_addsy) set to the
2738 symbol value (usually).
2740 We want to subtract S_GET_VALUE(fx_addsy) if it set, and
2741 for all practical purposes, do a fixup with value zero. This
2742 is because the linker/loader, at a later time, will do this
2743 fixup with the correct value. If we fixup now with a value,
2744 it will get double-fixed, leading to garbage.
2746 Note that subsy will also be set for strong/weak symbols
2747 when the user program was compiled with -g. In that case,
2748 subsy will hold the base address (i.e. the .using address).
2751 if (fixp
->fx_addsy
->sy_used_in_reloc
2752 && S_GET_SEGMENT (fixp
->fx_addsy
) != absolute_section
2753 && S_GET_SEGMENT (fixp
->fx_addsy
) != undefined_section
2754 && ! bfd_is_com_section (S_GET_SEGMENT (fixp
->fx_addsy
)))
2755 value
-= S_GET_VALUE (fixp
->fx_addsy
);
2758 printf ("\nmd_apply_fix3: symbol %s at 0x%x (%s:%d) val=0x%x addend=0x%x\n",
2759 S_GET_NAME (fixp
->fx_addsy
),
2760 fixp
->fx_frag
->fr_address
+ fixp
->fx_where
,
2761 fixp
->fx_file
, fixp
->fx_line
,
2762 S_GET_VALUE (fixp
->fx_addsy
), value
);
2771 /* Apply fixups to operands. Note that there should be no relocations
2772 for any operands, since no instruction ever takes an operand
2773 that requires reloc. */
2774 if ((int) fixp
->fx_r_type
>= (int) BFD_RELOC_UNUSED
)
2777 const struct i370_operand
*operand
;
2781 opindex
= (int) fixp
->fx_r_type
- (int) BFD_RELOC_UNUSED
;
2783 operand
= &i370_operands
[opindex
];
2786 printf ("\nmd_apply_fix3: fixup operand %s at 0x%x in %s:%d addend=0x%x\n",
2788 fixp
->fx_frag
->fr_address
+ fixp
->fx_where
,
2789 fixp
->fx_file
, fixp
->fx_line
,
2792 /* Fetch the instruction, insert the fully resolved operand
2793 value, and stuff the instruction back again.
2794 fisxp->fx_size is the length of the instruction. */
2795 where
= fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
;
2796 insn
.i
[0] = bfd_getb32 ((unsigned char *) where
);
2797 if (6 <= fixp
->fx_size
)
2798 { /* deal with 48-bit insn's */
2799 insn
.i
[1] = bfd_getb32 (((unsigned char *) where
)+4);
2801 insn
= i370_insert_operand (insn
, operand
, (offsetT
) value
);
2802 bfd_putb32 ((bfd_vma
) insn
.i
[0], (unsigned char *) where
);
2803 if (6 <= fixp
->fx_size
)
2804 { /* deal with 48-bit insn's */
2805 bfd_putb32 ((bfd_vma
) insn
.i
[1], (((unsigned char *) where
)+4));
2808 /* we are done, right? right !! */
2812 /* Nothing else to do here. */
2816 /* Determine a BFD reloc value based on the operand information.
2817 We are only prepared to turn a few of the operands into
2818 relocs. In fact, we support *zero* operand relocations ...
2819 Why? Because we are not expecting the compiler to generate
2820 any operands that need relocation. Due to the 12-bit naturew of
2821 i370 addressing, this would be unusual. */
2823 if ((operand
->flags
& I370_OPERAND_RELATIVE
) != 0
2824 && operand
->bits
== 12
2825 && operand
->shift
== 0)
2826 fixp
->fx_r_type
= BFD_RELOC_I370_D12
;
2833 /* Use expr_symbol_where to see if this is an expression
2835 if (expr_symbol_where (fixp
->fx_addsy
, &sfile
, &sline
))
2836 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
2837 "unresolved expression that must be resolved");
2839 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
2840 "unsupported relocation type");
2847 /* We branch to here if the fixup is not to a symbol that
2848 * appears in an instruction operand, but is rather some
2852 i370_elf_validate_fix (fixp
, seg
);
2855 printf ("md_apply_fix3: reloc case %d in segment %s %s:%d\n",
2856 fixp
->fx_r_type
, segment_name (seg
), fixp
->fx_file
, fixp
->fx_line
);
2857 printf ("\tcurrent fixup value is 0x%x \n", value
);
2859 switch (fixp
->fx_r_type
)
2862 case BFD_RELOC_CTOR
:
2864 fixp
->fx_r_type
= BFD_RELOC_32_PCREL
;
2868 case BFD_RELOC_32_PCREL
:
2869 case BFD_RELOC_32_BASEREL
:
2871 printf ("\t32 bit relocation at 0x%x\n",
2872 fixp
->fx_frag
->fr_address
+ fixp
->fx_where
);
2874 md_number_to_chars (fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
,
2878 case BFD_RELOC_LO16
:
2881 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
2882 "cannot emit PC relative %s relocation%s%s",
2883 bfd_get_reloc_code_name (fixp
->fx_r_type
),
2884 fixp
->fx_addsy
!= NULL
? " against " : "",
2885 (fixp
->fx_addsy
!= NULL
2886 ? S_GET_NAME (fixp
->fx_addsy
)
2889 md_number_to_chars (fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
,
2893 /* This case happens when you write, for example,
2895 where L1 and L2 are defined later. */
2896 case BFD_RELOC_HI16
:
2899 md_number_to_chars (fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
,
2902 case BFD_RELOC_HI16_S
:
2905 md_number_to_chars (fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
,
2906 (value
+ 0x8000) >> 16, 2);
2913 md_number_to_chars (fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
,
2919 "Gas failure, reloc value %d\n", fixp
->fx_r_type
);
2925 fixp
->fx_addnumber
= value
;
2930 /* Generate a reloc for a fixup. */
2933 tc_gen_reloc (seg
, fixp
)
2939 reloc
= (arelent
*) xmalloc (sizeof (arelent
));
2941 reloc
->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
2942 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
2943 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
2944 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
2945 if (reloc
->howto
== (reloc_howto_type
*) NULL
)
2947 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
2948 "reloc %d not supported by object file format", (int)fixp
->fx_r_type
);
2951 reloc
->addend
= fixp
->fx_addnumber
;
2954 printf ("\ngen_reloc(): sym %s (%s:%d) at addr 0x%x addend=0x%x\n",
2955 fixp
->fx_addsy
->bsym
->name
,
2956 fixp
->fx_file
, fixp
->fx_line
,
2957 reloc
->address
, reloc
->addend
);