1 /* tc-ppc.c -- Assemble for the PowerPC or POWER (RS/6000)
2 Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor, Cygnus Support.
5 This file is part of GAS, the GNU Assembler.
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
27 #include "opcode/ppc.h"
37 /* This is the assembler for the PowerPC or POWER (RS/6000) chips. */
39 /* Tell the main code what the endianness is. */
40 extern int target_big_endian
;
42 /* Whether or not, we've set target_big_endian. */
43 static int set_target_endian
= 0;
45 /* Whether to use user friendly register names. */
46 #ifndef TARGET_REG_NAMES_P
48 #define TARGET_REG_NAMES_P true
50 #define TARGET_REG_NAMES_P false
54 static boolean reg_names_p
= TARGET_REG_NAMES_P
;
56 static boolean register_name
PARAMS ((expressionS
*));
57 static void ppc_set_cpu
PARAMS ((void));
58 static unsigned long ppc_insert_operand
59 PARAMS ((unsigned long insn
, const struct powerpc_operand
*operand
,
60 offsetT val
, char *file
, unsigned int line
));
61 static void ppc_macro
PARAMS ((char *str
, const struct powerpc_macro
*macro
));
62 static void ppc_byte
PARAMS ((int));
63 static int ppc_is_toc_sym
PARAMS ((symbolS
*sym
));
64 static void ppc_tc
PARAMS ((int));
67 static void ppc_comm
PARAMS ((int));
68 static void ppc_bb
PARAMS ((int));
69 static void ppc_bc
PARAMS ((int));
70 static void ppc_bf
PARAMS ((int));
71 static void ppc_biei
PARAMS ((int));
72 static void ppc_bs
PARAMS ((int));
73 static void ppc_eb
PARAMS ((int));
74 static void ppc_ec
PARAMS ((int));
75 static void ppc_ef
PARAMS ((int));
76 static void ppc_es
PARAMS ((int));
77 static void ppc_csect
PARAMS ((int));
78 static void ppc_change_csect
PARAMS ((symbolS
*));
79 static void ppc_function
PARAMS ((int));
80 static void ppc_extern
PARAMS ((int));
81 static void ppc_lglobl
PARAMS ((int));
82 static void ppc_section
PARAMS ((int));
83 static void ppc_stabx
PARAMS ((int));
84 static void ppc_rename
PARAMS ((int));
85 static void ppc_toc
PARAMS ((int));
86 static void ppc_xcoff_cons
PARAMS ((int));
90 static bfd_reloc_code_real_type ppc_elf_suffix
PARAMS ((char **, expressionS
*));
91 static void ppc_elf_cons
PARAMS ((int));
92 static void ppc_elf_rdata
PARAMS ((int));
93 static void ppc_elf_lcomm
PARAMS ((int));
94 static void ppc_elf_validate_fix
PARAMS ((fixS
*, segT
));
98 static void ppc_set_current_section
PARAMS ((segT
));
99 static void ppc_previous
PARAMS ((int));
100 static void ppc_pdata
PARAMS ((int));
101 static void ppc_ydata
PARAMS ((int));
102 static void ppc_reldata
PARAMS ((int));
103 static void ppc_rdata
PARAMS ((int));
104 static void ppc_ualong
PARAMS ((int));
105 static void ppc_znop
PARAMS ((int));
106 static void ppc_pe_comm
PARAMS ((int));
107 static void ppc_pe_section
PARAMS ((int));
108 static void ppc_pe_function
PARAMS ((int));
109 static void ppc_pe_tocd
PARAMS ((int));
112 /* Generic assembler global variables which must be defined by all
116 /* This string holds the chars that always start a comment. If the
117 pre-processor is disabled, these aren't very useful. The macro
118 tc_comment_chars points to this. We use this, rather than the
119 usual comment_chars, so that we can switch for Solaris conventions. */
120 static const char ppc_solaris_comment_chars
[] = "#!";
121 static const char ppc_eabi_comment_chars
[] = "#";
123 #ifdef TARGET_SOLARIS_COMMENT
124 const char *ppc_comment_chars
= ppc_solaris_comment_chars
;
126 const char *ppc_comment_chars
= ppc_eabi_comment_chars
;
129 const char comment_chars
[] = "#";
132 /* Characters which start a comment at the beginning of a line. */
133 const char line_comment_chars
[] = "#";
135 /* Characters which may be used to separate multiple commands on a
137 const char line_separator_chars
[] = ";";
139 /* Characters which are used to indicate an exponent in a floating
141 const char EXP_CHARS
[] = "eE";
143 /* Characters which mean that a number is a floating point constant,
145 const char FLT_CHARS
[] = "dD";
147 /* The target specific pseudo-ops which we support. */
149 const pseudo_typeS md_pseudo_table
[] =
151 /* Pseudo-ops which must be overridden. */
152 { "byte", ppc_byte
, 0 },
155 /* Pseudo-ops specific to the RS/6000 XCOFF format. Some of these
156 legitimately belong in the obj-*.c file. However, XCOFF is based
157 on COFF, and is only implemented for the RS/6000. We just use
158 obj-coff.c, and add what we need here. */
159 { "comm", ppc_comm
, 0 },
160 { "lcomm", ppc_comm
, 1 },
164 { "bi", ppc_biei
, 0 },
166 { "csect", ppc_csect
, 0 },
167 { "data", ppc_section
, 'd' },
171 { "ei", ppc_biei
, 1 },
173 { "extern", ppc_extern
, 0 },
174 { "function", ppc_function
, 0 },
175 { "lglobl", ppc_lglobl
, 0 },
176 { "rename", ppc_rename
, 0 },
177 { "stabx", ppc_stabx
, 0 },
178 { "text", ppc_section
, 't' },
179 { "toc", ppc_toc
, 0 },
180 { "long", ppc_xcoff_cons
, 2 },
181 { "word", ppc_xcoff_cons
, 1 },
182 { "short", ppc_xcoff_cons
, 1 },
186 { "long", ppc_elf_cons
, 4 },
187 { "word", ppc_elf_cons
, 2 },
188 { "short", ppc_elf_cons
, 2 },
189 { "rdata", ppc_elf_rdata
, 0 },
190 { "rodata", ppc_elf_rdata
, 0 },
191 { "lcomm", ppc_elf_lcomm
, 0 },
195 /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format */
196 { "previous", ppc_previous
, 0 },
197 { "pdata", ppc_pdata
, 0 },
198 { "ydata", ppc_ydata
, 0 },
199 { "reldata", ppc_reldata
, 0 },
200 { "rdata", ppc_rdata
, 0 },
201 { "ualong", ppc_ualong
, 0 },
202 { "znop", ppc_znop
, 0 },
203 { "comm", ppc_pe_comm
, 0 },
204 { "lcomm", ppc_pe_comm
, 1 },
205 { "section", ppc_pe_section
, 0 },
206 { "function", ppc_pe_function
,0 },
207 { "tocd", ppc_pe_tocd
, 0 },
210 /* This pseudo-op is used even when not generating XCOFF output. */
217 /* Predefined register names if -mregnames (or default for Windows NT). */
218 /* In general, there are lots of them, in an attempt to be compatible */
219 /* with a number of other Windows NT assemblers. */
221 /* Structure to hold information about predefined registers. */
228 /* List of registers that are pre-defined:
230 Each general register has predefined names of the form:
231 1. r<reg_num> which has the value <reg_num>.
232 2. r.<reg_num> which has the value <reg_num>.
235 Each floating point register has predefined names of the form:
236 1. f<reg_num> which has the value <reg_num>.
237 2. f.<reg_num> which has the value <reg_num>.
239 Each condition register has predefined names of the form:
240 1. cr<reg_num> which has the value <reg_num>.
241 2. cr.<reg_num> which has the value <reg_num>.
243 There are individual registers as well:
244 sp or r.sp has the value 1
245 rtoc or r.toc has the value 2
246 fpscr has the value 0
252 dsisr has the value 18
254 sdr1 has the value 25
255 srr0 has the value 26
256 srr1 has the value 27
258 The table is sorted. Suitable for searching by a binary search. */
260 static const struct pd_reg pre_defined_registers
[] =
262 { "cr.0", 0 }, /* Condition Registers */
282 { "dar", 19 }, /* Data Access Register */
283 { "dec", 22 }, /* Decrementer */
284 { "dsisr", 18 }, /* Data Storage Interrupt Status Register */
286 { "f.0", 0 }, /* Floating point registers */
354 { "lr", 8 }, /* Link Register */
358 { "r.0", 0 }, /* General Purpose Registers */
391 { "r.sp", 1 }, /* Stack Pointer */
393 { "r.toc", 2 }, /* Pointer to the table of contents */
395 { "r0", 0 }, /* More general purpose registers */
428 { "rtoc", 2 }, /* Table of contents */
430 { "sdr1", 25 }, /* Storage Description Register 1 */
434 { "srr0", 26 }, /* Machine Status Save/Restore Register 0 */
435 { "srr1", 27 }, /* Machine Status Save/Restore Register 1 */
441 #define REG_NAME_CNT (sizeof(pre_defined_registers) / sizeof(struct pd_reg))
443 /* Given NAME, find the register number associated with that name, return
444 the integer value associated with the given name or -1 on failure. */
446 static int reg_name_search
447 PARAMS ((const struct pd_reg
*, int, const char * name
));
450 reg_name_search (regs
, regcount
, name
)
451 const struct pd_reg
*regs
;
455 int middle
, low
, high
;
463 middle
= (low
+ high
) / 2;
464 cmp
= strcasecmp (name
, regs
[middle
].name
);
470 return regs
[middle
].value
;
478 * Summary of register_name().
480 * in: Input_line_pointer points to 1st char of operand.
482 * out: A expressionS.
483 * The operand may have been a register: in this case, X_op == O_register,
484 * X_add_number is set to the register number, and truth is returned.
485 * Input_line_pointer->(next non-blank) char after operand, or is in its
490 register_name (expressionP
)
491 expressionS
*expressionP
;
498 /* Find the spelling of the operand */
499 start
= name
= input_line_pointer
;
500 if (name
[0] == '%' && isalpha (name
[1]))
501 name
= ++input_line_pointer
;
503 else if (!reg_names_p
|| !isalpha (name
[0]))
506 c
= get_symbol_end ();
507 reg_number
= reg_name_search (pre_defined_registers
, REG_NAME_CNT
, name
);
509 /* look to see if it's in the register table */
512 expressionP
->X_op
= O_register
;
513 expressionP
->X_add_number
= reg_number
;
515 /* make the rest nice */
516 expressionP
->X_add_symbol
= NULL
;
517 expressionP
->X_op_symbol
= NULL
;
518 *input_line_pointer
= c
; /* put back the delimiting char */
523 /* reset the line as if we had not done anything */
524 *input_line_pointer
= c
; /* put back the delimiting char */
525 input_line_pointer
= start
; /* reset input_line pointer */
530 /* This function is called for each symbol seen in an expression. It
531 handles the special parsing which PowerPC assemblers are supposed
532 to use for condition codes. */
534 /* Whether to do the special parsing. */
535 static boolean cr_operand
;
537 /* Names to recognize in a condition code. This table is sorted. */
538 static const struct pd_reg cr_names
[] =
555 /* Parsing function. This returns non-zero if it recognized an
559 ppc_parse_name (name
, expr
)
568 val
= reg_name_search (cr_names
, sizeof cr_names
/ sizeof cr_names
[0],
573 expr
->X_op
= O_constant
;
574 expr
->X_add_number
= val
;
579 /* Local variables. */
581 /* The type of processor we are assembling for. This is one or more
582 of the PPC_OPCODE flags defined in opcode/ppc.h. */
583 static int ppc_cpu
= 0;
585 /* The size of the processor we are assembling for. This is either
586 PPC_OPCODE_32 or PPC_OPCODE_64. */
587 static int ppc_size
= PPC_OPCODE_32
;
589 /* Opcode hash table. */
590 static struct hash_control
*ppc_hash
;
592 /* Macro hash table. */
593 static struct hash_control
*ppc_macro_hash
;
596 /* What type of shared library support to use */
597 static enum { SHLIB_NONE
, SHLIB_PIC
, SHILB_MRELOCATABLE
} shlib
= SHLIB_NONE
;
599 /* Flags to set in the elf header */
600 static flagword ppc_flags
= 0;
602 /* Whether this is Solaris or not. */
603 #ifdef TARGET_SOLARIS_COMMENT
604 #define SOLARIS_P true
606 #define SOLARIS_P false
609 static boolean msolaris
= SOLARIS_P
;
614 /* The RS/6000 assembler uses the .csect pseudo-op to generate code
615 using a bunch of different sections. These assembler sections,
616 however, are all encompassed within the .text or .data sections of
617 the final output file. We handle this by using different
618 subsegments within these main segments. */
620 /* Next subsegment to allocate within the .text segment. */
621 static subsegT ppc_text_subsegment
= 2;
623 /* Linked list of csects in the text section. */
624 static symbolS
*ppc_text_csects
;
626 /* Next subsegment to allocate within the .data segment. */
627 static subsegT ppc_data_subsegment
= 2;
629 /* Linked list of csects in the data section. */
630 static symbolS
*ppc_data_csects
;
632 /* The current csect. */
633 static symbolS
*ppc_current_csect
;
635 /* The RS/6000 assembler uses a TOC which holds addresses of functions
636 and variables. Symbols are put in the TOC with the .tc pseudo-op.
637 A special relocation is used when accessing TOC entries. We handle
638 the TOC as a subsegment within the .data segment. We set it up if
639 we see a .toc pseudo-op, and save the csect symbol here. */
640 static symbolS
*ppc_toc_csect
;
642 /* The first frag in the TOC subsegment. */
643 static fragS
*ppc_toc_frag
;
645 /* The first frag in the first subsegment after the TOC in the .data
646 segment. NULL if there are no subsegments after the TOC. */
647 static fragS
*ppc_after_toc_frag
;
649 /* The current static block. */
650 static symbolS
*ppc_current_block
;
652 /* The COFF debugging section; set by md_begin. This is not the
653 .debug section, but is instead the secret BFD section which will
654 cause BFD to set the section number of a symbol to N_DEBUG. */
655 static asection
*ppc_coff_debug_section
;
657 #endif /* OBJ_XCOFF */
661 /* Various sections that we need for PE coff support. */
662 static segT ydata_section
;
663 static segT pdata_section
;
664 static segT reldata_section
;
665 static segT rdata_section
;
666 static segT tocdata_section
;
668 /* The current section and the previous section. See ppc_previous. */
669 static segT ppc_previous_section
;
670 static segT ppc_current_section
;
675 symbolS
*GOT_symbol
; /* Pre-defined "_GLOBAL_OFFSET_TABLE" */
678 #ifndef WORKING_DOT_WORD
679 const int md_short_jump_size
= 4;
680 const int md_long_jump_size
= 4;
684 CONST
char *md_shortopts
= "b:l:usm:K:VQ:";
686 CONST
char *md_shortopts
= "um:";
688 struct option md_longopts
[] = {
689 {NULL
, no_argument
, NULL
, 0}
691 size_t md_longopts_size
= sizeof(md_longopts
);
694 md_parse_option (c
, arg
)
701 /* -u means that any undefined symbols should be treated as
702 external, which is the default for gas anyhow. */
707 /* Solaris as takes -le (presumably for little endian). For completeness
708 sake, recognize -be also. */
709 if (strcmp (arg
, "e") == 0)
711 target_big_endian
= 0;
712 set_target_endian
= 1;
720 if (strcmp (arg
, "e") == 0)
722 target_big_endian
= 1;
723 set_target_endian
= 1;
731 /* Recognize -K PIC */
732 if (strcmp (arg
, "PIC") == 0 || strcmp (arg
, "pic") == 0)
735 ppc_flags
|= EF_PPC_RELOCATABLE_LIB
;
744 /* -mpwrx and -mpwr2 mean to assemble for the IBM POWER/2
746 if (strcmp (arg
, "pwrx") == 0 || strcmp (arg
, "pwr2") == 0)
747 ppc_cpu
= PPC_OPCODE_POWER
| PPC_OPCODE_POWER2
;
748 /* -mpwr means to assemble for the IBM POWER (RIOS1). */
749 else if (strcmp (arg
, "pwr") == 0)
750 ppc_cpu
= PPC_OPCODE_POWER
;
751 /* -m601 means to assemble for the Motorola PowerPC 601, which includes
752 instructions that are holdovers from the Power. */
753 else if (strcmp (arg
, "601") == 0)
754 ppc_cpu
= PPC_OPCODE_PPC
| PPC_OPCODE_601
;
755 /* -mppc, -mppc32, -m603, and -m604 mean to assemble for the
756 Motorola PowerPC 603/604. */
757 else if (strcmp (arg
, "ppc") == 0
758 || strcmp (arg
, "ppc32") == 0
759 || strcmp (arg
, "403") == 0
760 || strcmp (arg
, "603") == 0
761 || strcmp (arg
, "604") == 0)
762 ppc_cpu
= PPC_OPCODE_PPC
;
763 /* -mppc64 and -m620 mean to assemble for the 64-bit PowerPC
765 else if (strcmp (arg
, "ppc64") == 0 || strcmp (arg
, "620") == 0)
767 ppc_cpu
= PPC_OPCODE_PPC
;
768 ppc_size
= PPC_OPCODE_64
;
770 /* -mcom means assemble for the common intersection between Power
771 and PowerPC. At present, we just allow the union, rather
772 than the intersection. */
773 else if (strcmp (arg
, "com") == 0)
774 ppc_cpu
= PPC_OPCODE_COMMON
;
775 /* -many means to assemble for any architecture (PWR/PWRX/PPC). */
776 else if (strcmp (arg
, "any") == 0)
777 ppc_cpu
= PPC_OPCODE_ANY
;
779 else if (strcmp (arg
, "regnames") == 0)
782 else if (strcmp (arg
, "no-regnames") == 0)
786 /* -mrelocatable/-mrelocatable-lib -- warn about initializations that require relocation */
787 else if (strcmp (arg
, "relocatable") == 0)
789 shlib
= SHILB_MRELOCATABLE
;
790 ppc_flags
|= EF_PPC_RELOCATABLE
;
793 else if (strcmp (arg
, "relocatable-lib") == 0)
795 shlib
= SHILB_MRELOCATABLE
;
796 ppc_flags
|= EF_PPC_RELOCATABLE_LIB
;
799 /* -memb, set embedded bit */
800 else if (strcmp (arg
, "emb") == 0)
801 ppc_flags
|= EF_PPC_EMB
;
803 /* -mlittle/-mbig set the endianess */
804 else if (strcmp (arg
, "little") == 0 || strcmp (arg
, "little-endian") == 0)
806 target_big_endian
= 0;
807 set_target_endian
= 1;
810 else if (strcmp (arg
, "big") == 0 || strcmp (arg
, "big-endian") == 0)
812 target_big_endian
= 1;
813 set_target_endian
= 1;
816 else if (strcmp (arg
, "solaris") == 0)
819 ppc_comment_chars
= ppc_solaris_comment_chars
;
822 else if (strcmp (arg
, "no-solaris") == 0)
825 ppc_comment_chars
= ppc_eabi_comment_chars
;
830 as_bad ("invalid switch -m%s", arg
);
836 /* -V: SVR4 argument to print version ID. */
841 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
842 should be emitted or not. FIXME: Not implemented. */
846 /* Solaris takes -s to specify that .stabs go in a .stabs section,
847 rather than .stabs.excl, which is ignored by the linker.
848 FIXME: Not implemented. */
864 md_show_usage (stream
)
870 -mpwrx, -mpwr2 generate code for IBM POWER/2 (RIOS2)\n\
871 -mpwr generate code for IBM POWER (RIOS1)\n\
872 -m601 generate code for Motorola PowerPC 601\n\
873 -mppc, -mppc32, -m403, -m603, -m604\n\
874 generate code for Motorola PowerPC 603/604\n\
875 -mppc64, -m620 generate code for Motorola PowerPC 620\n\
876 -mcom generate code Power/PowerPC common instructions\n\
877 -many generate code for any architecture (PWR/PWRX/PPC)\n\
878 -mregnames Allow symbolic names for registers\n\
879 -mno-regnames Do not allow symbolic names for registers\n");
882 -mrelocatable support for GCC's -mrelocatble option\n\
883 -mrelocatable-lib support for GCC's -mrelocatble-lib option\n\
884 -memb set PPC_EMB bit in ELF flags\n\
885 -mlittle, -mlittle-endian\n\
886 generate code for a little endian machine\n\
887 -mbig, -mbig-endian generate code for a big endian machine\n\
888 -msolaris generate code for Solaris\n\
889 -mno-solaris do not generate code for Solaris\n\
890 -V print assembler version number\n\
891 -Qy, -Qn ignored\n");
895 /* Set ppc_cpu if it is not already set. */
900 const char *default_os
= TARGET_OS
;
901 const char *default_cpu
= TARGET_CPU
;
905 if (strncmp (default_os
, "aix", 3) == 0
906 && default_os
[3] >= '4' && default_os
[3] <= '9')
907 ppc_cpu
= PPC_OPCODE_COMMON
;
908 else if (strncmp (default_os
, "aix3", 4) == 0)
909 ppc_cpu
= PPC_OPCODE_POWER
;
910 else if (strcmp (default_cpu
, "rs6000") == 0)
911 ppc_cpu
= PPC_OPCODE_POWER
;
912 else if (strcmp (default_cpu
, "powerpc") == 0
913 || strcmp (default_cpu
, "powerpcle") == 0)
914 ppc_cpu
= PPC_OPCODE_PPC
;
916 as_fatal ("Unknown default cpu = %s, os = %s", default_cpu
, default_os
);
920 /* Figure out the BFD architecture to use. */
922 enum bfd_architecture
925 const char *default_cpu
= TARGET_CPU
;
928 if ((ppc_cpu
& PPC_OPCODE_PPC
) != 0)
929 return bfd_arch_powerpc
;
930 else if ((ppc_cpu
& PPC_OPCODE_POWER
) != 0)
931 return bfd_arch_rs6000
;
932 else if ((ppc_cpu
& (PPC_OPCODE_COMMON
| PPC_OPCODE_ANY
)) != 0)
934 if (strcmp (default_cpu
, "rs6000") == 0)
935 return bfd_arch_rs6000
;
936 else if (strcmp (default_cpu
, "powerpc") == 0
937 || strcmp (default_cpu
, "powerpcle") == 0)
938 return bfd_arch_powerpc
;
941 as_fatal ("Neither Power nor PowerPC opcodes were selected.");
942 return bfd_arch_unknown
;
945 /* This function is called when the assembler starts up. It is called
946 after the options have been parsed and the output file has been
952 register const struct powerpc_opcode
*op
;
953 const struct powerpc_opcode
*op_end
;
954 const struct powerpc_macro
*macro
;
955 const struct powerpc_macro
*macro_end
;
956 boolean dup_insn
= false;
961 /* Set the ELF flags if desired. */
962 if (ppc_flags
&& !msolaris
)
963 bfd_set_private_flags (stdoutput
, ppc_flags
);
966 /* Insert the opcodes into a hash table. */
967 ppc_hash
= hash_new ();
969 op_end
= powerpc_opcodes
+ powerpc_num_opcodes
;
970 for (op
= powerpc_opcodes
; op
< op_end
; op
++)
972 know ((op
->opcode
& op
->mask
) == op
->opcode
);
974 if ((op
->flags
& ppc_cpu
) != 0
975 && ((op
->flags
& (PPC_OPCODE_32
| PPC_OPCODE_64
)) == 0
976 || (op
->flags
& (PPC_OPCODE_32
| PPC_OPCODE_64
)) == ppc_size
))
980 retval
= hash_insert (ppc_hash
, op
->name
, (PTR
) op
);
981 if (retval
!= (const char *) NULL
)
983 /* Ignore Power duplicates for -m601 */
984 if ((ppc_cpu
& PPC_OPCODE_601
) != 0
985 && (op
->flags
& PPC_OPCODE_POWER
) != 0)
988 as_bad ("Internal assembler error for instruction %s", op
->name
);
994 /* Insert the macros into a hash table. */
995 ppc_macro_hash
= hash_new ();
997 macro_end
= powerpc_macros
+ powerpc_num_macros
;
998 for (macro
= powerpc_macros
; macro
< macro_end
; macro
++)
1000 if ((macro
->flags
& ppc_cpu
) != 0)
1004 retval
= hash_insert (ppc_macro_hash
, macro
->name
, (PTR
) macro
);
1005 if (retval
!= (const char *) NULL
)
1007 as_bad ("Internal assembler error for macro %s", macro
->name
);
1016 /* Tell the main code what the endianness is if it is not overidden by the user. */
1017 if (!set_target_endian
)
1019 set_target_endian
= 1;
1020 target_big_endian
= PPC_BIG_ENDIAN
;
1024 ppc_coff_debug_section
= coff_section_from_bfd_index (stdoutput
, N_DEBUG
);
1026 /* Create dummy symbols to serve as initial csects. This forces the
1027 text csects to precede the data csects. These symbols will not
1029 ppc_text_csects
= symbol_make ("dummy\001");
1030 ppc_text_csects
->sy_tc
.within
= ppc_text_csects
;
1031 ppc_data_csects
= symbol_make ("dummy\001");
1032 ppc_data_csects
->sy_tc
.within
= ppc_data_csects
;
1037 ppc_current_section
= text_section
;
1038 ppc_previous_section
= 0;
1043 /* Insert an operand value into an instruction. */
1045 static unsigned long
1046 ppc_insert_operand (insn
, operand
, val
, file
, line
)
1048 const struct powerpc_operand
*operand
;
1053 if (operand
->bits
!= 32)
1058 if ((operand
->flags
& PPC_OPERAND_SIGNED
) != 0)
1060 if ((operand
->flags
& PPC_OPERAND_SIGNOPT
) != 0
1061 && ppc_size
== PPC_OPCODE_32
)
1062 max
= (1 << operand
->bits
) - 1;
1064 max
= (1 << (operand
->bits
- 1)) - 1;
1065 min
= - (1 << (operand
->bits
- 1));
1067 if (ppc_size
== PPC_OPCODE_32
)
1069 /* Some people write 32 bit hex constants with the sign
1070 extension done by hand. This shouldn't really be
1071 valid, but, to permit this code to assemble on a 64
1072 bit host, we sign extend the 32 bit value. */
1074 && (val
& 0x80000000) != 0
1075 && (val
& 0xffffffff) == val
)
1084 max
= (1 << operand
->bits
) - 1;
1088 if ((operand
->flags
& PPC_OPERAND_NEGATIVE
) != 0)
1093 if (test
< (offsetT
) min
|| test
> (offsetT
) max
)
1096 "operand out of range (%s not between %ld and %ld)";
1099 sprint_value (buf
, test
);
1100 if (file
== (char *) NULL
)
1101 as_bad (err
, buf
, min
, max
);
1103 as_bad_where (file
, line
, err
, buf
, min
, max
);
1107 if (operand
->insert
)
1112 insn
= (*operand
->insert
) (insn
, (long) val
, &errmsg
);
1113 if (errmsg
!= (const char *) NULL
)
1117 insn
|= (((long) val
& ((1 << operand
->bits
) - 1))
1125 /* Parse @got, etc. and return the desired relocation. */
1126 static bfd_reloc_code_real_type
1127 ppc_elf_suffix (str_p
, exp_p
)
1134 bfd_reloc_code_real_type reloc
;
1142 struct map_bfd
*ptr
;
1144 #define MAP(str,reloc) { str, sizeof(str)-1, reloc }
1146 static struct map_bfd mapping
[] = {
1147 MAP ("l", BFD_RELOC_LO16
),
1148 MAP ("h", BFD_RELOC_HI16
),
1149 MAP ("ha", BFD_RELOC_HI16_S
),
1150 MAP ("brtaken", BFD_RELOC_PPC_B16_BRTAKEN
),
1151 MAP ("brntaken", BFD_RELOC_PPC_B16_BRNTAKEN
),
1152 MAP ("got", BFD_RELOC_16_GOTOFF
),
1153 MAP ("got@l", BFD_RELOC_LO16_GOTOFF
),
1154 MAP ("got@h", BFD_RELOC_HI16_GOTOFF
),
1155 MAP ("got@ha", BFD_RELOC_HI16_S_GOTOFF
),
1156 MAP ("fixup", BFD_RELOC_CTOR
), /* warnings with -mrelocatable */
1157 MAP ("plt", BFD_RELOC_24_PLT_PCREL
),
1158 MAP ("pltrel24", BFD_RELOC_24_PLT_PCREL
),
1159 MAP ("copy", BFD_RELOC_PPC_COPY
),
1160 MAP ("globdat", BFD_RELOC_PPC_GLOB_DAT
),
1161 MAP ("local24pc", BFD_RELOC_PPC_LOCAL24PC
),
1162 MAP ("local", BFD_RELOC_PPC_LOCAL24PC
),
1163 MAP ("pltrel", BFD_RELOC_32_PLT_PCREL
),
1164 MAP ("plt@l", BFD_RELOC_LO16_PLTOFF
),
1165 MAP ("plt@h", BFD_RELOC_HI16_PLTOFF
),
1166 MAP ("plt@ha", BFD_RELOC_HI16_S_PLTOFF
),
1167 MAP ("sdarel", BFD_RELOC_GPREL16
),
1168 MAP ("sectoff", BFD_RELOC_32_BASEREL
),
1169 MAP ("sectoff@l", BFD_RELOC_LO16_BASEREL
),
1170 MAP ("sectoff@h", BFD_RELOC_HI16_BASEREL
),
1171 MAP ("sectoff@ha", BFD_RELOC_HI16_S_BASEREL
),
1172 MAP ("naddr", BFD_RELOC_PPC_EMB_NADDR32
),
1173 MAP ("naddr16", BFD_RELOC_PPC_EMB_NADDR16
),
1174 MAP ("naddr@l", BFD_RELOC_PPC_EMB_NADDR16_LO
),
1175 MAP ("naddr@h", BFD_RELOC_PPC_EMB_NADDR16_HI
),
1176 MAP ("naddr@ha", BFD_RELOC_PPC_EMB_NADDR16_HA
),
1177 MAP ("sdai16", BFD_RELOC_PPC_EMB_SDAI16
),
1178 MAP ("sda2rel", BFD_RELOC_PPC_EMB_SDA2REL
),
1179 MAP ("sda2i16", BFD_RELOC_PPC_EMB_SDA2I16
),
1180 MAP ("sda21", BFD_RELOC_PPC_EMB_SDA21
),
1181 MAP ("mrkref", BFD_RELOC_PPC_EMB_MRKREF
),
1182 MAP ("relsect", BFD_RELOC_PPC_EMB_RELSEC16
),
1183 MAP ("relsect@l", BFD_RELOC_PPC_EMB_RELST_LO
),
1184 MAP ("relsect@h", BFD_RELOC_PPC_EMB_RELST_HI
),
1185 MAP ("relsect@ha", BFD_RELOC_PPC_EMB_RELST_HA
),
1186 MAP ("bitfld", BFD_RELOC_PPC_EMB_BIT_FLD
),
1187 MAP ("relsda", BFD_RELOC_PPC_EMB_RELSDA
),
1188 MAP ("xgot", BFD_RELOC_PPC_TOC16
),
1190 { (char *)0, 0, BFD_RELOC_UNUSED
}
1194 return BFD_RELOC_UNUSED
;
1196 for (ch
= *str
, str2
= ident
;
1197 (str2
< ident
+ sizeof (ident
) - 1
1198 && (isalnum (ch
) || ch
== '@'));
1201 *str2
++ = (islower (ch
)) ? ch
: tolower (ch
);
1208 for (ptr
= &mapping
[0]; ptr
->length
> 0; ptr
++)
1209 if (ch
== ptr
->string
[0] && len
== ptr
->length
&& memcmp (ident
, ptr
->string
, ptr
->length
) == 0)
1211 /* Now check for identifier@suffix+constant */
1212 if (*str
== '-' || *str
== '+')
1214 char *orig_line
= input_line_pointer
;
1215 expressionS new_exp
;
1217 input_line_pointer
= str
;
1218 expression (&new_exp
);
1219 if (new_exp
.X_op
== O_constant
)
1221 exp_p
->X_add_number
+= new_exp
.X_add_number
;
1222 str
= input_line_pointer
;
1225 if (&input_line_pointer
!= str_p
)
1226 input_line_pointer
= orig_line
;
1233 return BFD_RELOC_UNUSED
;
1236 /* Like normal .long/.short/.word, except support @got, etc. */
1237 /* clobbers input_line_pointer, checks */
1240 ppc_elf_cons (nbytes
)
1241 register int nbytes
; /* 1=.byte, 2=.word, 4=.long */
1244 bfd_reloc_code_real_type reloc
;
1246 if (is_it_end_of_statement ())
1248 demand_empty_rest_of_line ();
1255 if (exp
.X_op
== O_symbol
1256 && *input_line_pointer
== '@'
1257 && (reloc
= ppc_elf_suffix (&input_line_pointer
, &exp
)) != BFD_RELOC_UNUSED
)
1259 reloc_howto_type
*reloc_howto
= bfd_reloc_type_lookup (stdoutput
, reloc
);
1260 int size
= bfd_get_reloc_size (reloc_howto
);
1263 as_bad ("%s relocations do not fit in %d bytes\n", reloc_howto
->name
, nbytes
);
1267 register char *p
= frag_more ((int) nbytes
);
1268 int offset
= nbytes
- size
;
1270 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
+ offset
, size
, &exp
, 0, reloc
);
1274 emit_expr (&exp
, (unsigned int) nbytes
);
1276 while (*input_line_pointer
++ == ',');
1278 input_line_pointer
--; /* Put terminator back into stream. */
1279 demand_empty_rest_of_line ();
1282 /* Solaris pseduo op to change to the .rodata section. */
1287 char *save_line
= input_line_pointer
;
1288 static char section
[] = ".rodata\n";
1290 /* Just pretend this is .section .rodata */
1291 input_line_pointer
= section
;
1292 obj_elf_section (xxx
);
1294 input_line_pointer
= save_line
;
1297 /* Pseudo op to make file scope bss items */
1302 register char *name
;
1306 register symbolS
*symbolP
;
1313 name
= input_line_pointer
;
1314 c
= get_symbol_end ();
1316 /* just after name is now '\0' */
1317 p
= input_line_pointer
;
1320 if (*input_line_pointer
!= ',')
1322 as_bad ("Expected comma after symbol-name: rest of line ignored.");
1323 ignore_rest_of_line ();
1327 input_line_pointer
++; /* skip ',' */
1328 if ((size
= get_absolute_expression ()) < 0)
1330 as_warn (".COMMon length (%ld.) <0! Ignored.", (long) size
);
1331 ignore_rest_of_line ();
1335 /* The third argument to .lcomm is the alignment. */
1336 if (*input_line_pointer
!= ',')
1340 ++input_line_pointer
;
1341 align
= get_absolute_expression ();
1344 as_warn ("ignoring bad alignment");
1350 symbolP
= symbol_find_or_make (name
);
1353 if (S_IS_DEFINED (symbolP
) && ! S_IS_COMMON (symbolP
))
1355 as_bad ("Ignoring attempt to re-define symbol `%s'.",
1356 S_GET_NAME (symbolP
));
1357 ignore_rest_of_line ();
1361 if (S_GET_VALUE (symbolP
) && S_GET_VALUE (symbolP
) != (valueT
) size
)
1363 as_bad ("Length of .lcomm \"%s\" is already %ld. Not changed to %ld.",
1364 S_GET_NAME (symbolP
),
1365 (long) S_GET_VALUE (symbolP
),
1368 ignore_rest_of_line ();
1374 old_subsec
= now_subseg
;
1377 /* convert to a power of 2 alignment */
1378 for (align2
= 0; (align
& 1) == 0; align
>>= 1, ++align2
);
1381 as_bad ("Common alignment not a power of 2");
1382 ignore_rest_of_line ();
1389 record_alignment (bss_section
, align2
);
1390 subseg_set (bss_section
, 0);
1392 frag_align (align2
, 0, 0);
1393 if (S_GET_SEGMENT (symbolP
) == bss_section
)
1394 symbolP
->sy_frag
->fr_symbol
= 0;
1395 symbolP
->sy_frag
= frag_now
;
1396 pfrag
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, symbolP
, size
,
1399 S_SET_SIZE (symbolP
, size
);
1400 S_SET_SEGMENT (symbolP
, bss_section
);
1401 subseg_set (old_sec
, old_subsec
);
1402 demand_empty_rest_of_line ();
1405 /* Validate any relocations emitted for -mrelocatable, possibly adding
1406 fixups for word relocations in writable segments, so we can adjust
1409 ppc_elf_validate_fix (fixp
, seg
)
1413 if (fixp
->fx_done
|| fixp
->fx_pcrel
)
1422 case SHILB_MRELOCATABLE
:
1423 if (fixp
->fx_r_type
<= BFD_RELOC_UNUSED
1424 && fixp
->fx_r_type
!= BFD_RELOC_16_GOTOFF
1425 && fixp
->fx_r_type
!= BFD_RELOC_HI16_GOTOFF
1426 && fixp
->fx_r_type
!= BFD_RELOC_LO16_GOTOFF
1427 && fixp
->fx_r_type
!= BFD_RELOC_HI16_S_GOTOFF
1428 && fixp
->fx_r_type
!= BFD_RELOC_32_BASEREL
1429 && fixp
->fx_r_type
!= BFD_RELOC_LO16_BASEREL
1430 && fixp
->fx_r_type
!= BFD_RELOC_HI16_BASEREL
1431 && fixp
->fx_r_type
!= BFD_RELOC_HI16_S_BASEREL
1432 && strcmp (segment_name (seg
), ".got2") != 0
1433 && strcmp (segment_name (seg
), ".dtors") != 0
1434 && strcmp (segment_name (seg
), ".ctors") != 0
1435 && strcmp (segment_name (seg
), ".fixup") != 0
1436 && strcmp (segment_name (seg
), ".stab") != 0
1437 && strcmp (segment_name (seg
), ".gcc_except_table") != 0
1438 && strcmp (segment_name (seg
), ".ex_shared") != 0)
1440 if ((seg
->flags
& (SEC_READONLY
| SEC_CODE
)) != 0
1441 || fixp
->fx_r_type
!= BFD_RELOC_CTOR
)
1443 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
1444 "Relocation cannot be done when using -mrelocatable");
1450 #endif /* OBJ_ELF */
1455 * Summary of parse_toc_entry().
1457 * in: Input_line_pointer points to the '[' in one of:
1459 * [toc] [tocv] [toc32] [toc64]
1461 * Anything else is an error of one kind or another.
1464 * return value: success or failure
1465 * toc_kind: kind of toc reference
1466 * input_line_pointer:
1467 * success: first char after the ']'
1468 * failure: unchanged
1472 * [toc] - rv == success, toc_kind = default_toc
1473 * [tocv] - rv == success, toc_kind = data_in_toc
1474 * [toc32] - rv == success, toc_kind = must_be_32
1475 * [toc64] - rv == success, toc_kind = must_be_64
1479 enum toc_size_qualifier
1481 default_toc
, /* The toc cell constructed should be the system default size */
1482 data_in_toc
, /* This is a direct reference to a toc cell */
1483 must_be_32
, /* The toc cell constructed must be 32 bits wide */
1484 must_be_64
/* The toc cell constructed must be 64 bits wide */
1488 parse_toc_entry(toc_kind
)
1489 enum toc_size_qualifier
*toc_kind
;
1494 enum toc_size_qualifier t
;
1496 /* save the input_line_pointer */
1497 start
= input_line_pointer
;
1499 /* skip over the '[' , and whitespace */
1500 ++input_line_pointer
;
1503 /* find the spelling of the operand */
1504 toc_spec
= input_line_pointer
;
1505 c
= get_symbol_end ();
1507 if (strcmp(toc_spec
, "toc") == 0)
1511 else if (strcmp(toc_spec
, "tocv") == 0)
1515 else if (strcmp(toc_spec
, "toc32") == 0)
1519 else if (strcmp(toc_spec
, "toc64") == 0)
1525 as_bad ("syntax error: invalid toc specifier `%s'", toc_spec
);
1526 *input_line_pointer
= c
; /* put back the delimiting char */
1527 input_line_pointer
= start
; /* reset input_line pointer */
1531 /* now find the ']' */
1532 *input_line_pointer
= c
; /* put back the delimiting char */
1534 SKIP_WHITESPACE (); /* leading whitespace could be there. */
1535 c
= *input_line_pointer
++; /* input_line_pointer->past char in c. */
1539 as_bad ("syntax error: expected `]', found `%c'", c
);
1540 input_line_pointer
= start
; /* reset input_line pointer */
1544 *toc_kind
= t
; /* set return value */
1550 /* We need to keep a list of fixups. We can't simply generate them as
1551 we go, because that would require us to first create the frag, and
1552 that would screw up references to ``.''. */
1558 bfd_reloc_code_real_type reloc
;
1561 #define MAX_INSN_FIXUPS (5)
1563 /* This routine is called for each instruction to be assembled. */
1570 const struct powerpc_opcode
*opcode
;
1572 const unsigned char *opindex_ptr
;
1576 struct ppc_fixup fixups
[MAX_INSN_FIXUPS
];
1581 bfd_reloc_code_real_type reloc
;
1584 /* Get the opcode. */
1585 for (s
= str
; *s
!= '\0' && ! isspace (*s
); s
++)
1590 /* Look up the opcode in the hash table. */
1591 opcode
= (const struct powerpc_opcode
*) hash_find (ppc_hash
, str
);
1592 if (opcode
== (const struct powerpc_opcode
*) NULL
)
1594 const struct powerpc_macro
*macro
;
1596 macro
= (const struct powerpc_macro
*) hash_find (ppc_macro_hash
, str
);
1597 if (macro
== (const struct powerpc_macro
*) NULL
)
1598 as_bad ("Unrecognized opcode: `%s'", str
);
1600 ppc_macro (s
, macro
);
1605 insn
= opcode
->opcode
;
1608 while (isspace (*str
))
1611 /* PowerPC operands are just expressions. The only real issue is
1612 that a few operand types are optional. All cases which might use
1613 an optional operand separate the operands only with commas (in
1614 some cases parentheses are used, as in ``lwz 1,0(1)'' but such
1615 cases never have optional operands). There is never more than
1616 one optional operand for an instruction. So, before we start
1617 seriously parsing the operands, we check to see if we have an
1618 optional operand, and, if we do, we count the number of commas to
1619 see whether the operand should be omitted. */
1621 for (opindex_ptr
= opcode
->operands
; *opindex_ptr
!= 0; opindex_ptr
++)
1623 const struct powerpc_operand
*operand
;
1625 operand
= &powerpc_operands
[*opindex_ptr
];
1626 if ((operand
->flags
& PPC_OPERAND_OPTIONAL
) != 0)
1628 unsigned int opcount
;
1630 /* There is an optional operand. Count the number of
1631 commas in the input line. */
1638 while ((s
= strchr (s
, ',')) != (char *) NULL
)
1645 /* If there are fewer operands in the line then are called
1646 for by the instruction, we want to skip the optional
1648 if (opcount
< strlen (opcode
->operands
))
1655 /* Gather the operands. */
1659 for (opindex_ptr
= opcode
->operands
; *opindex_ptr
!= 0; opindex_ptr
++)
1661 const struct powerpc_operand
*operand
;
1667 if (next_opindex
== 0)
1668 operand
= &powerpc_operands
[*opindex_ptr
];
1671 operand
= &powerpc_operands
[next_opindex
];
1677 /* If this is a fake operand, then we do not expect anything
1679 if ((operand
->flags
& PPC_OPERAND_FAKE
) != 0)
1681 insn
= (*operand
->insert
) (insn
, 0L, &errmsg
);
1682 if (errmsg
!= (const char *) NULL
)
1687 /* If this is an optional operand, and we are skipping it, just
1689 if ((operand
->flags
& PPC_OPERAND_OPTIONAL
) != 0
1692 if (operand
->insert
)
1694 insn
= (*operand
->insert
) (insn
, 0L, &errmsg
);
1695 if (errmsg
!= (const char *) NULL
)
1698 if ((operand
->flags
& PPC_OPERAND_NEXT
) != 0)
1699 next_opindex
= *opindex_ptr
+ 1;
1703 /* Gather the operand. */
1704 hold
= input_line_pointer
;
1705 input_line_pointer
= str
;
1708 if (*input_line_pointer
== '[')
1710 /* We are expecting something like the second argument here:
1712 lwz r4,[toc].GS.0.static_int(rtoc)
1713 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
1714 The argument following the `]' must be a symbol name, and the
1715 register must be the toc register: 'rtoc' or '2'
1717 The effect is to 0 as the displacement field
1718 in the instruction, and issue an IMAGE_REL_PPC_TOCREL16 (or
1719 the appropriate variation) reloc against it based on the symbol.
1720 The linker will build the toc, and insert the resolved toc offset.
1723 o The size of the toc entry is currently assumed to be
1724 32 bits. This should not be assumed to be a hard coded
1726 o In an effort to cope with a change from 32 to 64 bits,
1727 there are also toc entries that are specified to be
1728 either 32 or 64 bits:
1729 lwz r4,[toc32].GS.0.static_int(rtoc)
1730 lwz r4,[toc64].GS.0.static_int(rtoc)
1731 These demand toc entries of the specified size, and the
1732 instruction probably requires it.
1736 enum toc_size_qualifier toc_kind
;
1737 bfd_reloc_code_real_type toc_reloc
;
1739 /* go parse off the [tocXX] part */
1740 valid_toc
= parse_toc_entry(&toc_kind
);
1744 /* Note: message has already been issued. */
1745 /* FIXME: what sort of recovery should we do? */
1746 /* demand_rest_of_line(); return; ? */
1749 /* Now get the symbol following the ']' */
1755 /* In this case, we may not have seen the symbol yet, since */
1756 /* it is allowed to appear on a .extern or .globl or just be */
1757 /* a label in the .data section. */
1758 toc_reloc
= BFD_RELOC_PPC_TOC16
;
1761 /* 1. The symbol must be defined and either in the toc */
1762 /* section, or a global. */
1763 /* 2. The reloc generated must have the TOCDEFN flag set in */
1764 /* upper bit mess of the reloc type. */
1765 /* FIXME: It's a little confusing what the tocv qualifier can */
1766 /* be used for. At the very least, I've seen three */
1767 /* uses, only one of which I'm sure I can explain. */
1768 if (ex
.X_op
== O_symbol
)
1770 assert (ex
.X_add_symbol
!= NULL
);
1771 if (ex
.X_add_symbol
->bsym
->section
!= tocdata_section
)
1773 as_bad("[tocv] symbol is not a toc symbol");
1777 toc_reloc
= BFD_RELOC_PPC_TOC16
;
1780 /* FIXME: these next two specifically specify 32/64 bit toc */
1781 /* entries. We don't support them today. Is this the */
1782 /* right way to say that? */
1783 toc_reloc
= BFD_RELOC_UNUSED
;
1784 as_bad ("Unimplemented toc32 expression modifier");
1787 /* FIXME: see above */
1788 toc_reloc
= BFD_RELOC_UNUSED
;
1789 as_bad ("Unimplemented toc64 expression modifier");
1793 "Unexpected return value [%d] from parse_toc_entry!\n",
1799 /* We need to generate a fixup for this expression. */
1800 if (fc
>= MAX_INSN_FIXUPS
)
1801 as_fatal ("too many fixups");
1803 fixups
[fc
].reloc
= toc_reloc
;
1804 fixups
[fc
].exp
= ex
;
1805 fixups
[fc
].opindex
= *opindex_ptr
;
1808 /* Ok. We've set up the fixup for the instruction. Now make it
1809 look like the constant 0 was found here */
1811 ex
.X_op
= O_constant
;
1812 ex
.X_add_number
= 0;
1813 ex
.X_add_symbol
= NULL
;
1814 ex
.X_op_symbol
= NULL
;
1820 if (! register_name (&ex
))
1822 if ((operand
->flags
& PPC_OPERAND_CR
) != 0)
1829 str
= input_line_pointer
;
1830 input_line_pointer
= hold
;
1832 if (ex
.X_op
== O_illegal
)
1833 as_bad ("illegal operand");
1834 else if (ex
.X_op
== O_absent
)
1835 as_bad ("missing operand");
1836 else if (ex
.X_op
== O_register
)
1838 insn
= ppc_insert_operand (insn
, operand
, ex
.X_add_number
,
1841 else if (ex
.X_op
== O_constant
)
1844 /* Allow @HA, @L, @H on constants. */
1845 char *orig_str
= str
;
1847 if ((reloc
= ppc_elf_suffix (&str
, &ex
)) != BFD_RELOC_UNUSED
)
1854 case BFD_RELOC_LO16
:
1855 /* X_unsigned is the default, so if the user has done
1856 something which cleared it, we always produce a
1859 && (operand
->flags
& PPC_OPERAND_SIGNED
) == 0)
1860 ex
.X_add_number
&= 0xffff;
1862 ex
.X_add_number
= (((ex
.X_add_number
& 0xffff)
1867 case BFD_RELOC_HI16
:
1868 ex
.X_add_number
= (ex
.X_add_number
>> 16) & 0xffff;
1871 case BFD_RELOC_HI16_S
:
1872 ex
.X_add_number
= (((ex
.X_add_number
>> 16) & 0xffff)
1873 + ((ex
.X_add_number
>> 15) & 1));
1877 insn
= ppc_insert_operand (insn
, operand
, ex
.X_add_number
,
1881 else if ((reloc
= ppc_elf_suffix (&str
, &ex
)) != BFD_RELOC_UNUSED
)
1883 /* For the absoulte forms of branchs, convert the PC relative form back into
1885 if ((operand
->flags
& PPC_OPERAND_ABSOLUTE
) != 0)
1889 case BFD_RELOC_PPC_B26
:
1890 reloc
= BFD_RELOC_PPC_BA26
;
1892 case BFD_RELOC_PPC_B16
:
1893 reloc
= BFD_RELOC_PPC_BA16
;
1895 case BFD_RELOC_PPC_B16_BRTAKEN
:
1896 reloc
= BFD_RELOC_PPC_BA16_BRTAKEN
;
1898 case BFD_RELOC_PPC_B16_BRNTAKEN
:
1899 reloc
= BFD_RELOC_PPC_BA16_BRNTAKEN
;
1906 /* We need to generate a fixup for this expression. */
1907 if (fc
>= MAX_INSN_FIXUPS
)
1908 as_fatal ("too many fixups");
1909 fixups
[fc
].exp
= ex
;
1910 fixups
[fc
].opindex
= 0;
1911 fixups
[fc
].reloc
= reloc
;
1914 #endif /* OBJ_ELF */
1918 /* We need to generate a fixup for this expression. */
1919 if (fc
>= MAX_INSN_FIXUPS
)
1920 as_fatal ("too many fixups");
1921 fixups
[fc
].exp
= ex
;
1922 fixups
[fc
].opindex
= *opindex_ptr
;
1923 fixups
[fc
].reloc
= BFD_RELOC_UNUSED
;
1932 else if ((operand
->flags
& PPC_OPERAND_PARENS
) != 0)
1940 /* The call to expression should have advanced str past any
1943 && (endc
!= ',' || *str
!= '\0'))
1945 as_bad ("syntax error; found `%c' but expected `%c'", *str
, endc
);
1953 while (isspace (*str
))
1957 as_bad ("junk at end of line: `%s'", str
);
1959 /* Write out the instruction. */
1961 md_number_to_chars (f
, insn
, 4);
1963 /* Create any fixups. At this point we do not use a
1964 bfd_reloc_code_real_type, but instead just use the
1965 BFD_RELOC_UNUSED plus the operand index. This lets us easily
1966 handle fixups for any operand type, although that is admittedly
1967 not a very exciting feature. We pick a BFD reloc type in
1969 for (i
= 0; i
< fc
; i
++)
1971 const struct powerpc_operand
*operand
;
1973 operand
= &powerpc_operands
[fixups
[i
].opindex
];
1974 if (fixups
[i
].reloc
!= BFD_RELOC_UNUSED
)
1976 reloc_howto_type
*reloc_howto
= bfd_reloc_type_lookup (stdoutput
, fixups
[i
].reloc
);
1984 size
= bfd_get_reloc_size (reloc_howto
);
1985 offset
= target_big_endian
? (4 - size
) : 0;
1987 if (size
< 1 || size
> 4)
1990 fixP
= fix_new_exp (frag_now
, f
- frag_now
->fr_literal
+ offset
, size
,
1991 &fixups
[i
].exp
, reloc_howto
->pc_relative
,
1994 /* Turn off complaints that the addend is too large for things like
1996 switch (fixups
[i
].reloc
)
1998 case BFD_RELOC_16_GOTOFF
:
1999 case BFD_RELOC_PPC_TOC16
:
2000 case BFD_RELOC_LO16
:
2001 case BFD_RELOC_HI16
:
2002 case BFD_RELOC_HI16_S
:
2003 fixP
->fx_no_overflow
= 1;
2010 fix_new_exp (frag_now
, f
- frag_now
->fr_literal
, 4,
2012 (operand
->flags
& PPC_OPERAND_RELATIVE
) != 0,
2013 ((bfd_reloc_code_real_type
)
2014 (fixups
[i
].opindex
+ (int) BFD_RELOC_UNUSED
)));
2018 #ifndef WORKING_DOT_WORD
2019 /* Handle long and short jumps */
2021 md_create_short_jump (ptr
, from_addr
, to_addr
, frag
, to_symbol
)
2023 addressT from_addr
, to_addr
;
2031 md_create_long_jump (ptr
, from_addr
, to_addr
, frag
, to_symbol
)
2033 addressT from_addr
, to_addr
;
2041 /* Handle a macro. Gather all the operands, transform them as
2042 described by the macro, and call md_assemble recursively. All the
2043 operands are separated by commas; we don't accept parentheses
2044 around operands here. */
2047 ppc_macro (str
, macro
)
2049 const struct powerpc_macro
*macro
;
2060 /* Gather the users operands into the operands array. */
2065 if (count
>= sizeof operands
/ sizeof operands
[0])
2067 operands
[count
++] = s
;
2068 s
= strchr (s
, ',');
2069 if (s
== (char *) NULL
)
2074 if (count
!= macro
->operands
)
2076 as_bad ("wrong number of operands");
2080 /* Work out how large the string must be (the size is unbounded
2081 because it includes user input). */
2083 format
= macro
->format
;
2084 while (*format
!= '\0')
2093 arg
= strtol (format
+ 1, &send
, 10);
2094 know (send
!= format
&& arg
>= 0 && arg
< count
);
2095 len
+= strlen (operands
[arg
]);
2100 /* Put the string together. */
2101 complete
= s
= (char *) alloca (len
+ 1);
2102 format
= macro
->format
;
2103 while (*format
!= '\0')
2109 arg
= strtol (format
+ 1, &send
, 10);
2110 strcpy (s
, operands
[arg
]);
2117 /* Assemble the constructed instruction. */
2118 md_assemble (complete
);
2122 /* For ELF, add support for SHF_EXCLUDE and SHT_ORDERED */
2125 ppc_section_letter (letter
, ptr_msg
)
2132 *ptr_msg
= "Bad .section directive: want a,w,x,e in string";
2137 ppc_section_word (ptr_str
)
2140 if (strncmp (*ptr_str
, "exclude", sizeof ("exclude")-1) == 0)
2142 *ptr_str
+= sizeof ("exclude")-1;
2150 ppc_section_type (ptr_str
)
2153 if (strncmp (*ptr_str
, "ordered", sizeof ("ordered")-1) == 0)
2155 *ptr_str
+= sizeof ("ordered")-1;
2163 ppc_section_flags (flags
, attr
, type
)
2168 if (type
== SHT_ORDERED
)
2169 flags
|= SEC_ALLOC
| SEC_LOAD
| SEC_SORT_ENTRIES
;
2171 if (attr
& SHF_EXCLUDE
)
2172 flags
|= SEC_EXCLUDE
;
2176 #endif /* OBJ_ELF */
2179 /* Pseudo-op handling. */
2181 /* The .byte pseudo-op. This is similar to the normal .byte
2182 pseudo-op, but it can also take a single ASCII string. */
2188 if (*input_line_pointer
!= '\"')
2194 /* Gather characters. A real double quote is doubled. Unusual
2195 characters are not permitted. */
2196 ++input_line_pointer
;
2201 c
= *input_line_pointer
++;
2205 if (*input_line_pointer
!= '\"')
2207 ++input_line_pointer
;
2210 FRAG_APPEND_1_CHAR (c
);
2213 demand_empty_rest_of_line ();
2218 /* XCOFF specific pseudo-op handling. */
2220 /* This is set if we are creating a .stabx symbol, since we don't want
2221 to handle symbol suffixes for such symbols. */
2222 static boolean ppc_stab_symbol
;
2224 /* The .comm and .lcomm pseudo-ops for XCOFF. XCOFF puts common
2225 symbols in the .bss segment as though they were local common
2226 symbols, and uses a different smclas. */
2232 asection
*current_seg
= now_seg
;
2233 subsegT current_subseg
= now_subseg
;
2239 symbolS
*lcomm_sym
= NULL
;
2243 name
= input_line_pointer
;
2244 endc
= get_symbol_end ();
2245 end_name
= input_line_pointer
;
2248 if (*input_line_pointer
!= ',')
2250 as_bad ("missing size");
2251 ignore_rest_of_line ();
2254 ++input_line_pointer
;
2256 size
= get_absolute_expression ();
2259 as_bad ("negative size");
2260 ignore_rest_of_line ();
2266 /* The third argument to .comm is the alignment. */
2267 if (*input_line_pointer
!= ',')
2271 ++input_line_pointer
;
2272 align
= get_absolute_expression ();
2275 as_warn ("ignoring bad alignment");
2294 /* The third argument to .lcomm appears to be the real local
2295 common symbol to create. References to the symbol named in
2296 the first argument are turned into references to the third
2298 if (*input_line_pointer
!= ',')
2300 as_bad ("missing real symbol name");
2301 ignore_rest_of_line ();
2304 ++input_line_pointer
;
2306 lcomm_name
= input_line_pointer
;
2307 lcomm_endc
= get_symbol_end ();
2309 lcomm_sym
= symbol_find_or_make (lcomm_name
);
2311 *input_line_pointer
= lcomm_endc
;
2315 sym
= symbol_find_or_make (name
);
2318 if (S_IS_DEFINED (sym
)
2319 || S_GET_VALUE (sym
) != 0)
2321 as_bad ("attempt to redefine symbol");
2322 ignore_rest_of_line ();
2326 record_alignment (bss_section
, align
);
2329 || ! S_IS_DEFINED (lcomm_sym
))
2338 S_SET_EXTERNAL (sym
);
2342 lcomm_sym
->sy_tc
.output
= 1;
2343 def_sym
= lcomm_sym
;
2347 subseg_set (bss_section
, 1);
2348 frag_align (align
, 0, 0);
2350 def_sym
->sy_frag
= frag_now
;
2351 pfrag
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, def_sym
,
2352 def_size
, (char *) NULL
);
2354 S_SET_SEGMENT (def_sym
, bss_section
);
2355 def_sym
->sy_tc
.align
= align
;
2359 /* Align the size of lcomm_sym. */
2360 lcomm_sym
->sy_frag
->fr_offset
=
2361 ((lcomm_sym
->sy_frag
->fr_offset
+ (1 << align
) - 1)
2362 &~ ((1 << align
) - 1));
2363 if (align
> lcomm_sym
->sy_tc
.align
)
2364 lcomm_sym
->sy_tc
.align
= align
;
2369 /* Make sym an offset from lcomm_sym. */
2370 S_SET_SEGMENT (sym
, bss_section
);
2371 sym
->sy_frag
= lcomm_sym
->sy_frag
;
2372 S_SET_VALUE (sym
, lcomm_sym
->sy_frag
->fr_offset
);
2373 lcomm_sym
->sy_frag
->fr_offset
+= size
;
2376 subseg_set (current_seg
, current_subseg
);
2378 demand_empty_rest_of_line ();
2381 /* The .csect pseudo-op. This switches us into a different
2382 subsegment. The first argument is a symbol whose value is the
2383 start of the .csect. In COFF, csect symbols get special aux
2384 entries defined by the x_csect field of union internal_auxent. The
2385 optional second argument is the alignment (the default is 2). */
2395 name
= input_line_pointer
;
2396 endc
= get_symbol_end ();
2398 sym
= symbol_find_or_make (name
);
2400 *input_line_pointer
= endc
;
2402 if (S_GET_NAME (sym
)[0] == '\0')
2404 /* An unnamed csect is assumed to be [PR]. */
2405 sym
->sy_tc
.class = XMC_PR
;
2408 ppc_change_csect (sym
);
2410 if (*input_line_pointer
== ',')
2412 ++input_line_pointer
;
2413 sym
->sy_tc
.align
= get_absolute_expression ();
2416 demand_empty_rest_of_line ();
2419 /* Change to a different csect. */
2422 ppc_change_csect (sym
)
2425 if (S_IS_DEFINED (sym
))
2426 subseg_set (S_GET_SEGMENT (sym
), sym
->sy_tc
.subseg
);
2434 /* This is a new csect. We need to look at the symbol class to
2435 figure out whether it should go in the text section or the
2438 switch (sym
->sy_tc
.class)
2448 S_SET_SEGMENT (sym
, text_section
);
2449 sym
->sy_tc
.subseg
= ppc_text_subsegment
;
2450 ++ppc_text_subsegment
;
2451 list_ptr
= &ppc_text_csects
;
2460 if (ppc_toc_csect
!= NULL
2461 && ppc_toc_csect
->sy_tc
.subseg
+ 1 == ppc_data_subsegment
)
2463 S_SET_SEGMENT (sym
, data_section
);
2464 sym
->sy_tc
.subseg
= ppc_data_subsegment
;
2465 ++ppc_data_subsegment
;
2466 list_ptr
= &ppc_data_csects
;
2472 /* We set the obstack chunk size to a small value before
2473 changing subsegments, so that we don't use a lot of memory
2474 space for what may be a small section. */
2475 hold_chunksize
= chunksize
;
2478 subseg_new (segment_name (S_GET_SEGMENT (sym
)), sym
->sy_tc
.subseg
);
2480 chunksize
= hold_chunksize
;
2483 ppc_after_toc_frag
= frag_now
;
2485 sym
->sy_frag
= frag_now
;
2486 S_SET_VALUE (sym
, (valueT
) frag_now_fix ());
2488 sym
->sy_tc
.align
= 2;
2489 sym
->sy_tc
.output
= 1;
2490 sym
->sy_tc
.within
= sym
;
2492 for (list
= *list_ptr
;
2493 list
->sy_tc
.next
!= (symbolS
*) NULL
;
2494 list
= list
->sy_tc
.next
)
2496 list
->sy_tc
.next
= sym
;
2498 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
2499 symbol_append (sym
, list
->sy_tc
.within
, &symbol_rootP
, &symbol_lastP
);
2502 ppc_current_csect
= sym
;
2505 /* This function handles the .text and .data pseudo-ops. These
2506 pseudo-ops aren't really used by XCOFF; we implement them for the
2507 convenience of people who aren't used to XCOFF. */
2518 else if (type
== 'd')
2523 sym
= symbol_find_or_make (name
);
2525 ppc_change_csect (sym
);
2527 demand_empty_rest_of_line ();
2530 /* The .extern pseudo-op. We create an undefined symbol. */
2539 name
= input_line_pointer
;
2540 endc
= get_symbol_end ();
2542 (void) symbol_find_or_make (name
);
2544 *input_line_pointer
= endc
;
2546 demand_empty_rest_of_line ();
2549 /* The .lglobl pseudo-op. Keep the symbol in the symbol table. */
2559 name
= input_line_pointer
;
2560 endc
= get_symbol_end ();
2562 sym
= symbol_find_or_make (name
);
2564 *input_line_pointer
= endc
;
2566 sym
->sy_tc
.output
= 1;
2568 demand_empty_rest_of_line ();
2571 /* The .rename pseudo-op. The RS/6000 assembler can rename symbols,
2572 although I don't know why it bothers. */
2583 name
= input_line_pointer
;
2584 endc
= get_symbol_end ();
2586 sym
= symbol_find_or_make (name
);
2588 *input_line_pointer
= endc
;
2590 if (*input_line_pointer
!= ',')
2592 as_bad ("missing rename string");
2593 ignore_rest_of_line ();
2596 ++input_line_pointer
;
2598 sym
->sy_tc
.real_name
= demand_copy_C_string (&len
);
2600 demand_empty_rest_of_line ();
2603 /* The .stabx pseudo-op. This is similar to a normal .stabs
2604 pseudo-op, but slightly different. A sample is
2605 .stabx "main:F-1",.main,142,0
2606 The first argument is the symbol name to create. The second is the
2607 value, and the third is the storage class. The fourth seems to be
2608 always zero, and I am assuming it is the type. */
2619 name
= demand_copy_C_string (&len
);
2621 if (*input_line_pointer
!= ',')
2623 as_bad ("missing value");
2626 ++input_line_pointer
;
2628 ppc_stab_symbol
= true;
2629 sym
= symbol_make (name
);
2630 ppc_stab_symbol
= false;
2632 sym
->sy_tc
.real_name
= name
;
2634 (void) expression (&exp
);
2641 as_bad ("illegal .stabx expression; zero assumed");
2642 exp
.X_add_number
= 0;
2645 S_SET_VALUE (sym
, (valueT
) exp
.X_add_number
);
2646 sym
->sy_frag
= &zero_address_frag
;
2650 if (S_GET_SEGMENT (exp
.X_add_symbol
) == undefined_section
)
2651 sym
->sy_value
= exp
;
2655 exp
.X_add_number
+ S_GET_VALUE (exp
.X_add_symbol
));
2656 sym
->sy_frag
= exp
.X_add_symbol
->sy_frag
;
2661 /* The value is some complex expression. This will probably
2662 fail at some later point, but this is probably the right
2663 thing to do here. */
2664 sym
->sy_value
= exp
;
2668 S_SET_SEGMENT (sym
, ppc_coff_debug_section
);
2669 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2671 if (*input_line_pointer
!= ',')
2673 as_bad ("missing class");
2676 ++input_line_pointer
;
2678 S_SET_STORAGE_CLASS (sym
, get_absolute_expression ());
2680 if (*input_line_pointer
!= ',')
2682 as_bad ("missing type");
2685 ++input_line_pointer
;
2687 S_SET_DATA_TYPE (sym
, get_absolute_expression ());
2689 sym
->sy_tc
.output
= 1;
2691 if (S_GET_STORAGE_CLASS (sym
) == C_STSYM
)
2692 sym
->sy_tc
.within
= ppc_current_block
;
2694 if (exp
.X_op
!= O_symbol
2695 || ! S_IS_EXTERNAL (exp
.X_add_symbol
)
2696 || S_GET_SEGMENT (exp
.X_add_symbol
) != bss_section
)
2697 ppc_frob_label (sym
);
2700 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
2701 symbol_append (sym
, exp
.X_add_symbol
, &symbol_rootP
, &symbol_lastP
);
2702 if (ppc_current_csect
->sy_tc
.within
== exp
.X_add_symbol
)
2703 ppc_current_csect
->sy_tc
.within
= sym
;
2706 demand_empty_rest_of_line ();
2709 /* The .function pseudo-op. This takes several arguments. The first
2710 argument seems to be the external name of the symbol. The second
2711 argment seems to be the label for the start of the function. gcc
2712 uses the same name for both. I have no idea what the third and
2713 fourth arguments are meant to be. The optional fifth argument is
2714 an expression for the size of the function. In COFF this symbol
2715 gets an aux entry like that used for a csect. */
2718 ppc_function (ignore
)
2727 name
= input_line_pointer
;
2728 endc
= get_symbol_end ();
2730 /* Ignore any [PR] suffix. */
2731 name
= ppc_canonicalize_symbol_name (name
);
2732 s
= strchr (name
, '[');
2733 if (s
!= (char *) NULL
2734 && strcmp (s
+ 1, "PR]") == 0)
2737 ext_sym
= symbol_find_or_make (name
);
2739 *input_line_pointer
= endc
;
2741 if (*input_line_pointer
!= ',')
2743 as_bad ("missing symbol name");
2744 ignore_rest_of_line ();
2747 ++input_line_pointer
;
2749 name
= input_line_pointer
;
2750 endc
= get_symbol_end ();
2752 lab_sym
= symbol_find_or_make (name
);
2754 *input_line_pointer
= endc
;
2756 if (ext_sym
!= lab_sym
)
2758 ext_sym
->sy_value
.X_op
= O_symbol
;
2759 ext_sym
->sy_value
.X_add_symbol
= lab_sym
;
2760 ext_sym
->sy_value
.X_op_symbol
= NULL
;
2761 ext_sym
->sy_value
.X_add_number
= 0;
2764 if (ext_sym
->sy_tc
.class == -1)
2765 ext_sym
->sy_tc
.class = XMC_PR
;
2766 ext_sym
->sy_tc
.output
= 1;
2768 if (*input_line_pointer
== ',')
2772 /* Ignore the third argument. */
2773 ++input_line_pointer
;
2774 expression (&ignore
);
2775 if (*input_line_pointer
== ',')
2777 /* Ignore the fourth argument. */
2778 ++input_line_pointer
;
2779 expression (&ignore
);
2780 if (*input_line_pointer
== ',')
2782 /* The fifth argument is the function size. */
2783 ++input_line_pointer
;
2784 ext_sym
->sy_tc
.size
= symbol_new ("L0\001",
2787 &zero_address_frag
);
2788 pseudo_set (ext_sym
->sy_tc
.size
);
2793 S_SET_DATA_TYPE (ext_sym
, DT_FCN
<< N_BTSHFT
);
2794 SF_SET_FUNCTION (ext_sym
);
2795 SF_SET_PROCESS (ext_sym
);
2796 coff_add_linesym (ext_sym
);
2798 demand_empty_rest_of_line ();
2801 /* The .bf pseudo-op. This is just like a COFF C_FCN symbol named
2810 sym
= symbol_make (".bf");
2811 S_SET_SEGMENT (sym
, text_section
);
2812 sym
->sy_frag
= frag_now
;
2813 S_SET_VALUE (sym
, frag_now_fix ());
2814 S_SET_STORAGE_CLASS (sym
, C_FCN
);
2816 coff_line_base
= get_absolute_expression ();
2818 S_SET_NUMBER_AUXILIARY (sym
, 1);
2819 SA_SET_SYM_LNNO (sym
, coff_line_base
);
2821 sym
->sy_tc
.output
= 1;
2823 ppc_frob_label (sym
);
2825 demand_empty_rest_of_line ();
2828 /* The .ef pseudo-op. This is just like a COFF C_FCN symbol named
2829 ".ef", except that the line number is absolute, not relative to the
2830 most recent ".bf" symbol. */
2838 sym
= symbol_make (".ef");
2839 S_SET_SEGMENT (sym
, text_section
);
2840 sym
->sy_frag
= frag_now
;
2841 S_SET_VALUE (sym
, frag_now_fix ());
2842 S_SET_STORAGE_CLASS (sym
, C_FCN
);
2843 S_SET_NUMBER_AUXILIARY (sym
, 1);
2844 SA_SET_SYM_LNNO (sym
, get_absolute_expression ());
2845 sym
->sy_tc
.output
= 1;
2847 ppc_frob_label (sym
);
2849 demand_empty_rest_of_line ();
2852 /* The .bi and .ei pseudo-ops. These take a string argument and
2853 generates a C_BINCL or C_EINCL symbol, which goes at the start of
2865 name
= demand_copy_C_string (&len
);
2867 /* The value of these symbols is actually file offset. Here we set
2868 the value to the index into the line number entries. In
2869 ppc_frob_symbols we set the fix_line field, which will cause BFD
2870 to do the right thing. */
2872 sym
= symbol_make (name
);
2873 /* obj-coff.c currently only handles line numbers correctly in the
2875 S_SET_SEGMENT (sym
, text_section
);
2876 S_SET_VALUE (sym
, coff_n_line_nos
);
2877 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2879 S_SET_STORAGE_CLASS (sym
, ei
? C_EINCL
: C_BINCL
);
2880 sym
->sy_tc
.output
= 1;
2882 for (look
= symbol_rootP
;
2883 (look
!= (symbolS
*) NULL
2884 && (S_GET_STORAGE_CLASS (look
) == C_FILE
2885 || S_GET_STORAGE_CLASS (look
) == C_BINCL
2886 || S_GET_STORAGE_CLASS (look
) == C_EINCL
));
2887 look
= symbol_next (look
))
2889 if (look
!= (symbolS
*) NULL
)
2891 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
2892 symbol_insert (sym
, look
, &symbol_rootP
, &symbol_lastP
);
2895 demand_empty_rest_of_line ();
2898 /* The .bs pseudo-op. This generates a C_BSTAT symbol named ".bs".
2899 There is one argument, which is a csect symbol. The value of the
2900 .bs symbol is the index of this csect symbol. */
2911 if (ppc_current_block
!= NULL
)
2912 as_bad ("nested .bs blocks");
2914 name
= input_line_pointer
;
2915 endc
= get_symbol_end ();
2917 csect
= symbol_find_or_make (name
);
2919 *input_line_pointer
= endc
;
2921 sym
= symbol_make (".bs");
2922 S_SET_SEGMENT (sym
, now_seg
);
2923 S_SET_STORAGE_CLASS (sym
, C_BSTAT
);
2924 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2925 sym
->sy_tc
.output
= 1;
2927 sym
->sy_tc
.within
= csect
;
2929 ppc_frob_label (sym
);
2931 ppc_current_block
= sym
;
2933 demand_empty_rest_of_line ();
2936 /* The .es pseudo-op. Generate a C_ESTART symbol named .es. */
2944 if (ppc_current_block
== NULL
)
2945 as_bad (".es without preceding .bs");
2947 sym
= symbol_make (".es");
2948 S_SET_SEGMENT (sym
, now_seg
);
2949 S_SET_STORAGE_CLASS (sym
, C_ESTAT
);
2950 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2951 sym
->sy_tc
.output
= 1;
2953 ppc_frob_label (sym
);
2955 ppc_current_block
= NULL
;
2957 demand_empty_rest_of_line ();
2960 /* The .bb pseudo-op. Generate a C_BLOCK symbol named .bb, with a
2969 sym
= symbol_make (".bb");
2970 S_SET_SEGMENT (sym
, text_section
);
2971 sym
->sy_frag
= frag_now
;
2972 S_SET_VALUE (sym
, frag_now_fix ());
2973 S_SET_STORAGE_CLASS (sym
, C_BLOCK
);
2975 S_SET_NUMBER_AUXILIARY (sym
, 1);
2976 SA_SET_SYM_LNNO (sym
, get_absolute_expression ());
2978 sym
->sy_tc
.output
= 1;
2980 SF_SET_PROCESS (sym
);
2982 ppc_frob_label (sym
);
2984 demand_empty_rest_of_line ();
2987 /* The .eb pseudo-op. Generate a C_BLOCK symbol named .eb, with a
2996 sym
= symbol_make (".eb");
2997 S_SET_SEGMENT (sym
, text_section
);
2998 sym
->sy_frag
= frag_now
;
2999 S_SET_VALUE (sym
, frag_now_fix ());
3000 S_SET_STORAGE_CLASS (sym
, C_BLOCK
);
3001 S_SET_NUMBER_AUXILIARY (sym
, 1);
3002 SA_SET_SYM_LNNO (sym
, get_absolute_expression ());
3003 sym
->sy_tc
.output
= 1;
3005 SF_SET_PROCESS (sym
);
3007 ppc_frob_label (sym
);
3009 demand_empty_rest_of_line ();
3012 /* The .bc pseudo-op. This just creates a C_BCOMM symbol with a
3023 name
= demand_copy_C_string (&len
);
3024 sym
= symbol_make (name
);
3025 S_SET_SEGMENT (sym
, ppc_coff_debug_section
);
3026 sym
->bsym
->flags
|= BSF_DEBUGGING
;
3027 S_SET_STORAGE_CLASS (sym
, C_BCOMM
);
3028 S_SET_VALUE (sym
, 0);
3029 sym
->sy_tc
.output
= 1;
3031 ppc_frob_label (sym
);
3033 demand_empty_rest_of_line ();
3036 /* The .ec pseudo-op. This just creates a C_ECOMM symbol. */
3044 sym
= symbol_make (".ec");
3045 S_SET_SEGMENT (sym
, ppc_coff_debug_section
);
3046 sym
->bsym
->flags
|= BSF_DEBUGGING
;
3047 S_SET_STORAGE_CLASS (sym
, C_ECOMM
);
3048 S_SET_VALUE (sym
, 0);
3049 sym
->sy_tc
.output
= 1;
3051 ppc_frob_label (sym
);
3053 demand_empty_rest_of_line ();
3056 /* The .toc pseudo-op. Switch to the .toc subsegment. */
3062 if (ppc_toc_csect
!= (symbolS
*) NULL
)
3063 subseg_set (data_section
, ppc_toc_csect
->sy_tc
.subseg
);
3070 subseg
= ppc_data_subsegment
;
3071 ++ppc_data_subsegment
;
3073 subseg_new (segment_name (data_section
), subseg
);
3074 ppc_toc_frag
= frag_now
;
3076 sym
= symbol_find_or_make ("TOC[TC0]");
3077 sym
->sy_frag
= frag_now
;
3078 S_SET_SEGMENT (sym
, data_section
);
3079 S_SET_VALUE (sym
, (valueT
) frag_now_fix ());
3080 sym
->sy_tc
.subseg
= subseg
;
3081 sym
->sy_tc
.output
= 1;
3082 sym
->sy_tc
.within
= sym
;
3084 ppc_toc_csect
= sym
;
3086 for (list
= ppc_data_csects
;
3087 list
->sy_tc
.next
!= (symbolS
*) NULL
;
3088 list
= list
->sy_tc
.next
)
3090 list
->sy_tc
.next
= sym
;
3092 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
3093 symbol_append (sym
, list
->sy_tc
.within
, &symbol_rootP
, &symbol_lastP
);
3096 ppc_current_csect
= ppc_toc_csect
;
3098 demand_empty_rest_of_line ();
3101 /* The AIX assembler automatically aligns the operands of a .long or
3102 .short pseudo-op, and we want to be compatible. */
3105 ppc_xcoff_cons (log_size
)
3108 frag_align (log_size
, 0, 0);
3109 record_alignment (now_seg
, log_size
);
3110 cons (1 << log_size
);
3113 #endif /* OBJ_XCOFF */
3115 /* The .tc pseudo-op. This is used when generating either XCOFF or
3116 ELF. This takes two or more arguments.
3118 When generating XCOFF output, the first argument is the name to
3119 give to this location in the toc; this will be a symbol with class
3120 TC. The rest of the arguments are 4 byte values to actually put at
3121 this location in the TOC; often there is just one more argument, a
3122 relocateable symbol reference.
3124 When not generating XCOFF output, the arguments are the same, but
3125 the first argument is simply ignored. */
3133 /* Define the TOC symbol name. */
3139 if (ppc_toc_csect
== (symbolS
*) NULL
3140 || ppc_toc_csect
!= ppc_current_csect
)
3142 as_bad (".tc not in .toc section");
3143 ignore_rest_of_line ();
3147 name
= input_line_pointer
;
3148 endc
= get_symbol_end ();
3150 sym
= symbol_find_or_make (name
);
3152 *input_line_pointer
= endc
;
3154 if (S_IS_DEFINED (sym
))
3158 label
= ppc_current_csect
->sy_tc
.within
;
3159 if (label
->sy_tc
.class != XMC_TC0
)
3161 as_bad (".tc with no label");
3162 ignore_rest_of_line ();
3166 S_SET_SEGMENT (label
, S_GET_SEGMENT (sym
));
3167 label
->sy_frag
= sym
->sy_frag
;
3168 S_SET_VALUE (label
, S_GET_VALUE (sym
));
3170 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
3171 ++input_line_pointer
;
3176 S_SET_SEGMENT (sym
, now_seg
);
3177 sym
->sy_frag
= frag_now
;
3178 S_SET_VALUE (sym
, (valueT
) frag_now_fix ());
3179 sym
->sy_tc
.class = XMC_TC
;
3180 sym
->sy_tc
.output
= 1;
3182 ppc_frob_label (sym
);
3185 #else /* ! defined (OBJ_XCOFF) */
3187 /* Skip the TOC symbol name. */
3188 while (is_part_of_name (*input_line_pointer
)
3189 || *input_line_pointer
== '['
3190 || *input_line_pointer
== ']'
3191 || *input_line_pointer
== '{'
3192 || *input_line_pointer
== '}')
3193 ++input_line_pointer
;
3195 /* Align to a four byte boundary. */
3196 frag_align (2, 0, 0);
3197 record_alignment (now_seg
, 2);
3199 #endif /* ! defined (OBJ_XCOFF) */
3201 if (*input_line_pointer
!= ',')
3202 demand_empty_rest_of_line ();
3205 ++input_line_pointer
;
3212 /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format */
3214 /* Set the current section. */
3216 ppc_set_current_section (new)
3219 ppc_previous_section
= ppc_current_section
;
3220 ppc_current_section
= new;
3223 /* pseudo-op: .previous
3224 behaviour: toggles the current section with the previous section.
3226 warnings: "No previous section"
3229 ppc_previous(ignore
)
3234 if (ppc_previous_section
== NULL
)
3236 as_warn("No previous section to return to. Directive ignored.");
3240 subseg_set(ppc_previous_section
, 0);
3242 ppc_set_current_section(ppc_previous_section
);
3245 /* pseudo-op: .pdata
3246 behaviour: predefined read only data section
3250 initial: .section .pdata "adr3"
3251 a - don't know -- maybe a misprint
3252 d - initialized data
3254 3 - double word aligned (that would be 4 byte boundary)
3257 Tag index tables (also known as the function table) for exception
3258 handling, debugging, etc.
3265 if (pdata_section
== 0)
3267 pdata_section
= subseg_new (".pdata", 0);
3269 bfd_set_section_flags (stdoutput
, pdata_section
,
3270 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
3271 | SEC_READONLY
| SEC_DATA
));
3273 bfd_set_section_alignment (stdoutput
, pdata_section
, 2);
3277 pdata_section
= subseg_new(".pdata", 0);
3279 ppc_set_current_section(pdata_section
);
3282 /* pseudo-op: .ydata
3283 behaviour: predefined read only data section
3287 initial: .section .ydata "drw3"
3288 a - don't know -- maybe a misprint
3289 d - initialized data
3291 3 - double word aligned (that would be 4 byte boundary)
3293 Tag tables (also known as the scope table) for exception handling,
3300 if (ydata_section
== 0)
3302 ydata_section
= subseg_new (".ydata", 0);
3303 bfd_set_section_flags (stdoutput
, ydata_section
,
3304 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
3305 | SEC_READONLY
| SEC_DATA
));
3307 bfd_set_section_alignment (stdoutput
, ydata_section
, 3);
3311 ydata_section
= subseg_new (".ydata", 0);
3313 ppc_set_current_section(ydata_section
);
3316 /* pseudo-op: .reldata
3317 behaviour: predefined read write data section
3318 double word aligned (4-byte)
3319 FIXME: relocation is applied to it
3320 FIXME: what's the difference between this and .data?
3323 initial: .section .reldata "drw3"
3324 d - initialized data
3327 3 - double word aligned (that would be 8 byte boundary)
3330 Like .data, but intended to hold data subject to relocation, such as
3331 function descriptors, etc.
3337 if (reldata_section
== 0)
3339 reldata_section
= subseg_new (".reldata", 0);
3341 bfd_set_section_flags (stdoutput
, reldata_section
,
3342 ( SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
3345 bfd_set_section_alignment (stdoutput
, reldata_section
, 2);
3349 reldata_section
= subseg_new (".reldata", 0);
3351 ppc_set_current_section(reldata_section
);
3354 /* pseudo-op: .rdata
3355 behaviour: predefined read only data section
3359 initial: .section .rdata "dr3"
3360 d - initialized data
3362 3 - double word aligned (that would be 4 byte boundary)
3368 if (rdata_section
== 0)
3370 rdata_section
= subseg_new (".rdata", 0);
3371 bfd_set_section_flags (stdoutput
, rdata_section
,
3372 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
3373 | SEC_READONLY
| SEC_DATA
));
3375 bfd_set_section_alignment (stdoutput
, rdata_section
, 2);
3379 rdata_section
= subseg_new (".rdata", 0);
3381 ppc_set_current_section(rdata_section
);
3384 /* pseudo-op: .ualong
3385 behaviour: much like .int, with the exception that no alignment is
3387 FIXME: test the alignment statement
3399 /* pseudo-op: .znop <symbol name>
3400 behaviour: Issue a nop instruction
3401 Issue a IMAGE_REL_PPC_IFGLUE relocation against it, using
3402 the supplied symbol name.
3404 warnings: Missing symbol name
3411 const struct powerpc_opcode
*opcode
;
3417 /* Strip out the symbol name */
3425 symbol_name
= input_line_pointer
;
3426 c
= get_symbol_end ();
3428 name
= xmalloc (input_line_pointer
- symbol_name
+ 1);
3429 strcpy (name
, symbol_name
);
3431 sym
= symbol_find_or_make (name
);
3433 *input_line_pointer
= c
;
3437 /* Look up the opcode in the hash table. */
3438 opcode
= (const struct powerpc_opcode
*) hash_find (ppc_hash
, "nop");
3440 /* stick in the nop */
3441 insn
= opcode
->opcode
;
3443 /* Write out the instruction. */
3445 md_number_to_chars (f
, insn
, 4);
3447 f
- frag_now
->fr_literal
,
3452 BFD_RELOC_16_GOT_PCREL
);
3465 register char *name
;
3469 register symbolS
*symbolP
;
3472 name
= input_line_pointer
;
3473 c
= get_symbol_end ();
3475 /* just after name is now '\0' */
3476 p
= input_line_pointer
;
3479 if (*input_line_pointer
!= ',')
3481 as_bad ("Expected comma after symbol-name: rest of line ignored.");
3482 ignore_rest_of_line ();
3486 input_line_pointer
++; /* skip ',' */
3487 if ((temp
= get_absolute_expression ()) < 0)
3489 as_warn (".COMMon length (%ld.) <0! Ignored.", (long) temp
);
3490 ignore_rest_of_line ();
3496 /* The third argument to .comm is the alignment. */
3497 if (*input_line_pointer
!= ',')
3501 ++input_line_pointer
;
3502 align
= get_absolute_expression ();
3505 as_warn ("ignoring bad alignment");
3512 symbolP
= symbol_find_or_make (name
);
3515 if (S_IS_DEFINED (symbolP
) && ! S_IS_COMMON (symbolP
))
3517 as_bad ("Ignoring attempt to re-define symbol `%s'.",
3518 S_GET_NAME (symbolP
));
3519 ignore_rest_of_line ();
3523 if (S_GET_VALUE (symbolP
))
3525 if (S_GET_VALUE (symbolP
) != (valueT
) temp
)
3526 as_bad ("Length of .comm \"%s\" is already %ld. Not changed to %ld.",
3527 S_GET_NAME (symbolP
),
3528 (long) S_GET_VALUE (symbolP
),
3533 S_SET_VALUE (symbolP
, (valueT
) temp
);
3534 S_SET_EXTERNAL (symbolP
);
3537 demand_empty_rest_of_line ();
3541 * implement the .section pseudo op:
3542 * .section name {, "flags"}
3544 * | +--- optional flags: 'b' for bss
3546 * +-- section name 'l' for lib
3550 * 'd' (apparently m88k for data)
3552 * But if the argument is not a quoted string, treat it as a
3553 * subsegment number.
3555 * FIXME: this is a copy of the section processing from obj-coff.c, with
3556 * additions/changes for the moto-pas assembler support. There are three
3559 * FIXME: I just noticed this. This doesn't work at all really. It it
3560 * setting bits that bfd probably neither understands or uses. The
3561 * correct approach (?) will have to incorporate extra fields attached
3562 * to the section to hold the system specific stuff. (krk)
3565 * 'a' - unknown - referred to in documentation, but no definition supplied
3566 * 'c' - section has code
3567 * 'd' - section has initialized data
3568 * 'u' - section has uninitialized data
3569 * 'i' - section contains directives (info)
3570 * 'n' - section can be discarded
3571 * 'R' - remove section at link time
3573 * Section Protection:
3574 * 'r' - section is readable
3575 * 'w' - section is writeable
3576 * 'x' - section is executable
3577 * 's' - section is sharable
3579 * Section Alignment:
3580 * '0' - align to byte boundary
3581 * '1' - align to halfword undary
3582 * '2' - align to word boundary
3583 * '3' - align to doubleword boundary
3584 * '4' - align to quadword boundary
3585 * '5' - align to 32 byte boundary
3586 * '6' - align to 64 byte boundary
3591 ppc_pe_section (ignore
)
3594 /* Strip out the section name */
3603 section_name
= input_line_pointer
;
3604 c
= get_symbol_end ();
3606 name
= xmalloc (input_line_pointer
- section_name
+ 1);
3607 strcpy (name
, section_name
);
3609 *input_line_pointer
= c
;
3614 flags
= SEC_NO_FLAGS
;
3616 if (strcmp (name
, ".idata$2") == 0)
3620 else if (strcmp (name
, ".idata$3") == 0)
3624 else if (strcmp (name
, ".idata$4") == 0)
3628 else if (strcmp (name
, ".idata$5") == 0)
3632 else if (strcmp (name
, ".idata$6") == 0)
3637 align
= 4; /* default alignment to 16 byte boundary */
3639 if (*input_line_pointer
== ',')
3641 ++input_line_pointer
;
3643 if (*input_line_pointer
!= '"')
3644 exp
= get_absolute_expression ();
3647 ++input_line_pointer
;
3648 while (*input_line_pointer
!= '"'
3649 && ! is_end_of_line
[(unsigned char) *input_line_pointer
])
3651 switch (*input_line_pointer
)
3653 /* Section Contents */
3654 case 'a': /* unknown */
3655 as_bad ("Unsupported section attribute -- 'a'");
3657 case 'c': /* code section */
3660 case 'd': /* section has initialized data */
3663 case 'u': /* section has uninitialized data */
3664 /* FIXME: This is IMAGE_SCN_CNT_UNINITIALIZED_DATA
3668 case 'i': /* section contains directives (info) */
3669 /* FIXME: This is IMAGE_SCN_LNK_INFO
3671 flags
|= SEC_HAS_CONTENTS
;
3673 case 'n': /* section can be discarded */
3676 case 'R': /* Remove section at link time */
3677 flags
|= SEC_NEVER_LOAD
;
3680 /* Section Protection */
3681 case 'r': /* section is readable */
3682 flags
|= IMAGE_SCN_MEM_READ
;
3684 case 'w': /* section is writeable */
3685 flags
|= IMAGE_SCN_MEM_WRITE
;
3687 case 'x': /* section is executable */
3688 flags
|= IMAGE_SCN_MEM_EXECUTE
;
3690 case 's': /* section is sharable */
3691 flags
|= IMAGE_SCN_MEM_SHARED
;
3694 /* Section Alignment */
3695 case '0': /* align to byte boundary */
3696 flags
|= IMAGE_SCN_ALIGN_1BYTES
;
3699 case '1': /* align to halfword boundary */
3700 flags
|= IMAGE_SCN_ALIGN_2BYTES
;
3703 case '2': /* align to word boundary */
3704 flags
|= IMAGE_SCN_ALIGN_4BYTES
;
3707 case '3': /* align to doubleword boundary */
3708 flags
|= IMAGE_SCN_ALIGN_8BYTES
;
3711 case '4': /* align to quadword boundary */
3712 flags
|= IMAGE_SCN_ALIGN_16BYTES
;
3715 case '5': /* align to 32 byte boundary */
3716 flags
|= IMAGE_SCN_ALIGN_32BYTES
;
3719 case '6': /* align to 64 byte boundary */
3720 flags
|= IMAGE_SCN_ALIGN_64BYTES
;
3725 as_bad("unknown section attribute '%c'",
3726 *input_line_pointer
);
3729 ++input_line_pointer
;
3731 if (*input_line_pointer
== '"')
3732 ++input_line_pointer
;
3736 sec
= subseg_new (name
, (subsegT
) exp
);
3738 ppc_set_current_section(sec
);
3740 if (flags
!= SEC_NO_FLAGS
)
3742 if (! bfd_set_section_flags (stdoutput
, sec
, flags
))
3743 as_bad ("error setting flags for \"%s\": %s",
3744 bfd_section_name (stdoutput
, sec
),
3745 bfd_errmsg (bfd_get_error ()));
3748 bfd_set_section_alignment(stdoutput
, sec
, align
);
3753 ppc_pe_function (ignore
)
3760 name
= input_line_pointer
;
3761 endc
= get_symbol_end ();
3763 ext_sym
= symbol_find_or_make (name
);
3765 *input_line_pointer
= endc
;
3767 S_SET_DATA_TYPE (ext_sym
, DT_FCN
<< N_BTSHFT
);
3768 SF_SET_FUNCTION (ext_sym
);
3769 SF_SET_PROCESS (ext_sym
);
3770 coff_add_linesym (ext_sym
);
3772 demand_empty_rest_of_line ();
3776 ppc_pe_tocd (ignore
)
3779 if (tocdata_section
== 0)
3781 tocdata_section
= subseg_new (".tocd", 0);
3782 /* FIXME: section flags won't work */
3783 bfd_set_section_flags (stdoutput
, tocdata_section
,
3784 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
3785 | SEC_READONLY
| SEC_DATA
));
3787 bfd_set_section_alignment (stdoutput
, tocdata_section
, 2);
3791 rdata_section
= subseg_new (".tocd", 0);
3794 ppc_set_current_section(tocdata_section
);
3796 demand_empty_rest_of_line ();
3799 /* Don't adjust TOC relocs to use the section symbol. */
3802 ppc_pe_fix_adjustable (fix
)
3805 return fix
->fx_r_type
!= BFD_RELOC_PPC_TOC16
;
3812 /* XCOFF specific symbol and file handling. */
3814 /* Canonicalize the symbol name. We use the to force the suffix, if
3815 any, to use square brackets, and to be in upper case. */
3818 ppc_canonicalize_symbol_name (name
)
3823 if (ppc_stab_symbol
)
3826 for (s
= name
; *s
!= '\0' && *s
!= '{' && *s
!= '['; s
++)
3840 for (s
++; *s
!= '\0' && *s
!= brac
; s
++)
3844 if (*s
== '\0' || s
[1] != '\0')
3845 as_bad ("bad symbol suffix");
3853 /* Set the class of a symbol based on the suffix, if any. This is
3854 called whenever a new symbol is created. */
3857 ppc_symbol_new_hook (sym
)
3862 sym
->sy_tc
.next
= NULL
;
3863 sym
->sy_tc
.output
= 0;
3864 sym
->sy_tc
.class = -1;
3865 sym
->sy_tc
.real_name
= NULL
;
3866 sym
->sy_tc
.subseg
= 0;
3867 sym
->sy_tc
.align
= 0;
3868 sym
->sy_tc
.size
= NULL
;
3869 sym
->sy_tc
.within
= NULL
;
3871 if (ppc_stab_symbol
)
3874 s
= strchr (S_GET_NAME (sym
), '[');
3875 if (s
== (const char *) NULL
)
3877 /* There is no suffix. */
3886 if (strcmp (s
, "BS]") == 0)
3887 sym
->sy_tc
.class = XMC_BS
;
3890 if (strcmp (s
, "DB]") == 0)
3891 sym
->sy_tc
.class = XMC_DB
;
3892 else if (strcmp (s
, "DS]") == 0)
3893 sym
->sy_tc
.class = XMC_DS
;
3896 if (strcmp (s
, "GL]") == 0)
3897 sym
->sy_tc
.class = XMC_GL
;
3900 if (strcmp (s
, "PR]") == 0)
3901 sym
->sy_tc
.class = XMC_PR
;
3904 if (strcmp (s
, "RO]") == 0)
3905 sym
->sy_tc
.class = XMC_RO
;
3906 else if (strcmp (s
, "RW]") == 0)
3907 sym
->sy_tc
.class = XMC_RW
;
3910 if (strcmp (s
, "SV]") == 0)
3911 sym
->sy_tc
.class = XMC_SV
;
3914 if (strcmp (s
, "TC]") == 0)
3915 sym
->sy_tc
.class = XMC_TC
;
3916 else if (strcmp (s
, "TI]") == 0)
3917 sym
->sy_tc
.class = XMC_TI
;
3918 else if (strcmp (s
, "TB]") == 0)
3919 sym
->sy_tc
.class = XMC_TB
;
3920 else if (strcmp (s
, "TC0]") == 0 || strcmp (s
, "T0]") == 0)
3921 sym
->sy_tc
.class = XMC_TC0
;
3924 if (strcmp (s
, "UA]") == 0)
3925 sym
->sy_tc
.class = XMC_UA
;
3926 else if (strcmp (s
, "UC]") == 0)
3927 sym
->sy_tc
.class = XMC_UC
;
3930 if (strcmp (s
, "XO]") == 0)
3931 sym
->sy_tc
.class = XMC_XO
;
3935 if (sym
->sy_tc
.class == -1)
3936 as_bad ("Unrecognized symbol suffix");
3939 /* Set the class of a label based on where it is defined. This
3940 handles symbols without suffixes. Also, move the symbol so that it
3941 follows the csect symbol. */
3944 ppc_frob_label (sym
)
3947 if (ppc_current_csect
!= (symbolS
*) NULL
)
3949 if (sym
->sy_tc
.class == -1)
3950 sym
->sy_tc
.class = ppc_current_csect
->sy_tc
.class;
3952 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
3953 symbol_append (sym
, ppc_current_csect
->sy_tc
.within
, &symbol_rootP
,
3955 ppc_current_csect
->sy_tc
.within
= sym
;
3959 /* This variable is set by ppc_frob_symbol if any absolute symbols are
3960 seen. It tells ppc_adjust_symtab whether it needs to look through
3963 static boolean ppc_saw_abs
;
3965 /* Change the name of a symbol just before writing it out. Set the
3966 real name if the .rename pseudo-op was used. Otherwise, remove any
3967 class suffix. Return 1 if the symbol should not be included in the
3971 ppc_frob_symbol (sym
)
3974 static symbolS
*ppc_last_function
;
3975 static symbolS
*set_end
;
3977 /* Discard symbols that should not be included in the output symbol
3979 if (! sym
->sy_used_in_reloc
3980 && ((sym
->bsym
->flags
& BSF_SECTION_SYM
) != 0
3981 || (! S_IS_EXTERNAL (sym
)
3982 && ! sym
->sy_tc
.output
3983 && S_GET_STORAGE_CLASS (sym
) != C_FILE
)))
3986 if (sym
->sy_tc
.real_name
!= (char *) NULL
)
3987 S_SET_NAME (sym
, sym
->sy_tc
.real_name
);
3993 name
= S_GET_NAME (sym
);
3994 s
= strchr (name
, '[');
3995 if (s
!= (char *) NULL
)
4001 snew
= xmalloc (len
+ 1);
4002 memcpy (snew
, name
, len
);
4005 S_SET_NAME (sym
, snew
);
4009 if (set_end
!= (symbolS
*) NULL
)
4011 SA_SET_SYM_ENDNDX (set_end
, sym
);
4015 if (SF_GET_FUNCTION (sym
))
4017 if (ppc_last_function
!= (symbolS
*) NULL
)
4018 as_bad ("two .function pseudo-ops with no intervening .ef");
4019 ppc_last_function
= sym
;
4020 if (sym
->sy_tc
.size
!= (symbolS
*) NULL
)
4022 resolve_symbol_value (sym
->sy_tc
.size
, 1);
4023 SA_SET_SYM_FSIZE (sym
, (long) S_GET_VALUE (sym
->sy_tc
.size
));
4026 else if (S_GET_STORAGE_CLASS (sym
) == C_FCN
4027 && strcmp (S_GET_NAME (sym
), ".ef") == 0)
4029 if (ppc_last_function
== (symbolS
*) NULL
)
4030 as_bad (".ef with no preceding .function");
4033 set_end
= ppc_last_function
;
4034 ppc_last_function
= NULL
;
4036 /* We don't have a C_EFCN symbol, but we need to force the
4037 COFF backend to believe that it has seen one. */
4038 coff_last_function
= NULL
;
4042 if (! S_IS_EXTERNAL (sym
)
4043 && (sym
->bsym
->flags
& BSF_SECTION_SYM
) == 0
4044 && S_GET_STORAGE_CLASS (sym
) != C_FILE
4045 && S_GET_STORAGE_CLASS (sym
) != C_FCN
4046 && S_GET_STORAGE_CLASS (sym
) != C_BLOCK
4047 && S_GET_STORAGE_CLASS (sym
) != C_BSTAT
4048 && S_GET_STORAGE_CLASS (sym
) != C_ESTAT
4049 && S_GET_STORAGE_CLASS (sym
) != C_BINCL
4050 && S_GET_STORAGE_CLASS (sym
) != C_EINCL
4051 && S_GET_SEGMENT (sym
) != ppc_coff_debug_section
)
4052 S_SET_STORAGE_CLASS (sym
, C_HIDEXT
);
4054 if (S_GET_STORAGE_CLASS (sym
) == C_EXT
4055 || S_GET_STORAGE_CLASS (sym
) == C_HIDEXT
)
4058 union internal_auxent
*a
;
4060 /* Create a csect aux. */
4061 i
= S_GET_NUMBER_AUXILIARY (sym
);
4062 S_SET_NUMBER_AUXILIARY (sym
, i
+ 1);
4063 a
= &coffsymbol (sym
->bsym
)->native
[i
+ 1].u
.auxent
;
4064 if (sym
->sy_tc
.class == XMC_TC0
)
4066 /* This is the TOC table. */
4067 know (strcmp (S_GET_NAME (sym
), "TOC") == 0);
4068 a
->x_csect
.x_scnlen
.l
= 0;
4069 a
->x_csect
.x_smtyp
= (2 << 3) | XTY_SD
;
4071 else if (sym
->sy_tc
.subseg
!= 0)
4073 /* This is a csect symbol. x_scnlen is the size of the
4075 if (sym
->sy_tc
.next
== (symbolS
*) NULL
)
4076 a
->x_csect
.x_scnlen
.l
= (bfd_section_size (stdoutput
,
4077 S_GET_SEGMENT (sym
))
4078 - S_GET_VALUE (sym
));
4081 resolve_symbol_value (sym
->sy_tc
.next
, 1);
4082 a
->x_csect
.x_scnlen
.l
= (S_GET_VALUE (sym
->sy_tc
.next
)
4083 - S_GET_VALUE (sym
));
4085 a
->x_csect
.x_smtyp
= (sym
->sy_tc
.align
<< 3) | XTY_SD
;
4087 else if (S_GET_SEGMENT (sym
) == bss_section
)
4089 /* This is a common symbol. */
4090 a
->x_csect
.x_scnlen
.l
= sym
->sy_frag
->fr_offset
;
4091 a
->x_csect
.x_smtyp
= (sym
->sy_tc
.align
<< 3) | XTY_CM
;
4092 if (S_IS_EXTERNAL (sym
))
4093 sym
->sy_tc
.class = XMC_RW
;
4095 sym
->sy_tc
.class = XMC_BS
;
4097 else if (S_GET_SEGMENT (sym
) == absolute_section
)
4099 /* This is an absolute symbol. The csect will be created by
4100 ppc_adjust_symtab. */
4102 a
->x_csect
.x_smtyp
= XTY_LD
;
4103 if (sym
->sy_tc
.class == -1)
4104 sym
->sy_tc
.class = XMC_XO
;
4106 else if (! S_IS_DEFINED (sym
))
4108 /* This is an external symbol. */
4109 a
->x_csect
.x_scnlen
.l
= 0;
4110 a
->x_csect
.x_smtyp
= XTY_ER
;
4112 else if (sym
->sy_tc
.class == XMC_TC
)
4116 /* This is a TOC definition. x_scnlen is the size of the
4118 next
= symbol_next (sym
);
4119 while (next
->sy_tc
.class == XMC_TC0
)
4120 next
= symbol_next (next
);
4121 if (next
== (symbolS
*) NULL
4122 || next
->sy_tc
.class != XMC_TC
)
4124 if (ppc_after_toc_frag
== (fragS
*) NULL
)
4125 a
->x_csect
.x_scnlen
.l
= (bfd_section_size (stdoutput
,
4127 - S_GET_VALUE (sym
));
4129 a
->x_csect
.x_scnlen
.l
= (ppc_after_toc_frag
->fr_address
4130 - S_GET_VALUE (sym
));
4134 resolve_symbol_value (next
, 1);
4135 a
->x_csect
.x_scnlen
.l
= (S_GET_VALUE (next
)
4136 - S_GET_VALUE (sym
));
4138 a
->x_csect
.x_smtyp
= (2 << 3) | XTY_SD
;
4144 /* This is a normal symbol definition. x_scnlen is the
4145 symbol index of the containing csect. */
4146 if (S_GET_SEGMENT (sym
) == text_section
)
4147 csect
= ppc_text_csects
;
4148 else if (S_GET_SEGMENT (sym
) == data_section
)
4149 csect
= ppc_data_csects
;
4153 /* Skip the initial dummy symbol. */
4154 csect
= csect
->sy_tc
.next
;
4156 if (csect
== (symbolS
*) NULL
)
4158 as_warn ("warning: symbol %s has no csect", S_GET_NAME (sym
));
4159 a
->x_csect
.x_scnlen
.l
= 0;
4163 while (csect
->sy_tc
.next
!= (symbolS
*) NULL
)
4165 resolve_symbol_value (csect
->sy_tc
.next
, 1);
4166 if (S_GET_VALUE (csect
->sy_tc
.next
) > S_GET_VALUE (sym
))
4168 csect
= csect
->sy_tc
.next
;
4171 a
->x_csect
.x_scnlen
.p
= coffsymbol (csect
->bsym
)->native
;
4172 coffsymbol (sym
->bsym
)->native
[i
+ 1].fix_scnlen
= 1;
4174 a
->x_csect
.x_smtyp
= XTY_LD
;
4177 a
->x_csect
.x_parmhash
= 0;
4178 a
->x_csect
.x_snhash
= 0;
4179 if (sym
->sy_tc
.class == -1)
4180 a
->x_csect
.x_smclas
= XMC_PR
;
4182 a
->x_csect
.x_smclas
= sym
->sy_tc
.class;
4183 a
->x_csect
.x_stab
= 0;
4184 a
->x_csect
.x_snstab
= 0;
4186 /* Don't let the COFF backend resort these symbols. */
4187 sym
->bsym
->flags
|= BSF_NOT_AT_END
;
4189 else if (S_GET_STORAGE_CLASS (sym
) == C_BSTAT
)
4191 /* We want the value to be the symbol index of the referenced
4192 csect symbol. BFD will do that for us if we set the right
4195 (valueT
) coffsymbol (sym
->sy_tc
.within
->bsym
)->native
);
4196 coffsymbol (sym
->bsym
)->native
->fix_value
= 1;
4198 else if (S_GET_STORAGE_CLASS (sym
) == C_STSYM
)
4203 /* The value is the offset from the enclosing csect. */
4204 block
= sym
->sy_tc
.within
;
4205 csect
= block
->sy_tc
.within
;
4206 resolve_symbol_value (csect
, 1);
4207 S_SET_VALUE (sym
, S_GET_VALUE (sym
) - S_GET_VALUE (csect
));
4209 else if (S_GET_STORAGE_CLASS (sym
) == C_BINCL
4210 || S_GET_STORAGE_CLASS (sym
) == C_EINCL
)
4212 /* We want the value to be a file offset into the line numbers.
4213 BFD will do that for us if we set the right flags. We have
4214 already set the value correctly. */
4215 coffsymbol (sym
->bsym
)->native
->fix_line
= 1;
4221 /* Adjust the symbol table. This creates csect symbols for all
4222 absolute symbols. */
4225 ppc_adjust_symtab ()
4232 for (sym
= symbol_rootP
; sym
!= NULL
; sym
= symbol_next (sym
))
4236 union internal_auxent
*a
;
4238 if (S_GET_SEGMENT (sym
) != absolute_section
)
4241 csect
= symbol_create (".abs[XO]", absolute_section
,
4242 S_GET_VALUE (sym
), &zero_address_frag
);
4243 csect
->bsym
->value
= S_GET_VALUE (sym
);
4244 S_SET_STORAGE_CLASS (csect
, C_HIDEXT
);
4245 i
= S_GET_NUMBER_AUXILIARY (csect
);
4246 S_SET_NUMBER_AUXILIARY (csect
, i
+ 1);
4247 a
= &coffsymbol (csect
->bsym
)->native
[i
+ 1].u
.auxent
;
4248 a
->x_csect
.x_scnlen
.l
= 0;
4249 a
->x_csect
.x_smtyp
= XTY_SD
;
4250 a
->x_csect
.x_parmhash
= 0;
4251 a
->x_csect
.x_snhash
= 0;
4252 a
->x_csect
.x_smclas
= XMC_XO
;
4253 a
->x_csect
.x_stab
= 0;
4254 a
->x_csect
.x_snstab
= 0;
4256 symbol_insert (csect
, sym
, &symbol_rootP
, &symbol_lastP
);
4258 i
= S_GET_NUMBER_AUXILIARY (sym
);
4259 a
= &coffsymbol (sym
->bsym
)->native
[i
].u
.auxent
;
4260 a
->x_csect
.x_scnlen
.p
= coffsymbol (csect
->bsym
)->native
;
4261 coffsymbol (sym
->bsym
)->native
[i
].fix_scnlen
= 1;
4264 ppc_saw_abs
= false;
4267 /* Set the VMA for a section. This is called on all the sections in
4271 ppc_frob_section (sec
)
4274 static bfd_size_type vma
= 0;
4276 bfd_set_section_vma (stdoutput
, sec
, vma
);
4277 vma
+= bfd_section_size (stdoutput
, sec
);
4280 #endif /* OBJ_XCOFF */
4282 /* Turn a string in input_line_pointer into a floating point constant
4283 of type type, and store the appropriate bytes in *litp. The number
4284 of LITTLENUMS emitted is stored in *sizep . An error message is
4285 returned, or NULL on OK. */
4288 md_atof (type
, litp
, sizep
)
4294 LITTLENUM_TYPE words
[4];
4310 return "bad call to md_atof";
4313 t
= atof_ieee (input_line_pointer
, type
, words
);
4315 input_line_pointer
= t
;
4319 if (target_big_endian
)
4321 for (i
= 0; i
< prec
; i
++)
4323 md_number_to_chars (litp
, (valueT
) words
[i
], 2);
4329 for (i
= prec
- 1; i
>= 0; i
--)
4331 md_number_to_chars (litp
, (valueT
) words
[i
], 2);
4339 /* Write a value out to the object file, using the appropriate
4343 md_number_to_chars (buf
, val
, n
)
4348 if (target_big_endian
)
4349 number_to_chars_bigendian (buf
, val
, n
);
4351 number_to_chars_littleendian (buf
, val
, n
);
4354 /* Align a section (I don't know why this is machine dependent). */
4357 md_section_align (seg
, addr
)
4361 int align
= bfd_get_section_alignment (stdoutput
, seg
);
4363 return ((addr
+ (1 << align
) - 1) & (-1 << align
));
4366 /* We don't have any form of relaxing. */
4369 md_estimate_size_before_relax (fragp
, seg
)
4377 /* Convert a machine dependent frag. We never generate these. */
4380 md_convert_frag (abfd
, sec
, fragp
)
4388 /* We have no need to default values of symbols. */
4392 md_undefined_symbol (name
)
4398 /* Functions concerning relocs. */
4400 /* The location from which a PC relative jump should be calculated,
4401 given a PC relative reloc. */
4404 md_pcrel_from_section (fixp
, sec
)
4409 if (fixp
->fx_addsy
!= (symbolS
*) NULL
4410 && (! S_IS_DEFINED (fixp
->fx_addsy
)
4411 || TC_FORCE_RELOCATION_SECTION (fixp
, sec
)))
4415 return fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
4420 /* This is called to see whether a fixup should be adjusted to use a
4421 section symbol. We take the opportunity to change a fixup against
4422 a symbol in the TOC subsegment into a reloc against the
4423 corresponding .tc symbol. */
4426 ppc_fix_adjustable (fix
)
4431 resolve_symbol_value (fix
->fx_addsy
, 1);
4432 val
= S_GET_VALUE (fix
->fx_addsy
);
4433 if (ppc_toc_csect
!= (symbolS
*) NULL
4434 && fix
->fx_addsy
!= (symbolS
*) NULL
4435 && fix
->fx_addsy
!= ppc_toc_csect
4436 && S_GET_SEGMENT (fix
->fx_addsy
) == data_section
4437 && val
>= ppc_toc_frag
->fr_address
4438 && (ppc_after_toc_frag
== (fragS
*) NULL
4439 || val
< ppc_after_toc_frag
->fr_address
))
4443 for (sy
= symbol_next (ppc_toc_csect
);
4444 sy
!= (symbolS
*) NULL
;
4445 sy
= symbol_next (sy
))
4447 if (sy
->sy_tc
.class == XMC_TC0
)
4449 if (sy
->sy_tc
.class != XMC_TC
)
4451 resolve_symbol_value (sy
, 1);
4452 if (val
== S_GET_VALUE (sy
))
4455 fix
->fx_addnumber
= val
- ppc_toc_frag
->fr_address
;
4460 as_bad_where (fix
->fx_file
, fix
->fx_line
,
4461 "symbol in .toc does not match any .tc");
4464 /* Possibly adjust the reloc to be against the csect. */
4465 if (fix
->fx_addsy
!= (symbolS
*) NULL
4466 && fix
->fx_addsy
->sy_tc
.subseg
== 0
4467 && fix
->fx_addsy
->sy_tc
.class != XMC_TC0
4468 && fix
->fx_addsy
->sy_tc
.class != XMC_TC
4469 && S_GET_SEGMENT (fix
->fx_addsy
) != bss_section
)
4473 if (S_GET_SEGMENT (fix
->fx_addsy
) == text_section
)
4474 csect
= ppc_text_csects
;
4475 else if (S_GET_SEGMENT (fix
->fx_addsy
) == data_section
)
4476 csect
= ppc_data_csects
;
4480 /* Skip the initial dummy symbol. */
4481 csect
= csect
->sy_tc
.next
;
4483 if (csect
!= (symbolS
*) NULL
)
4485 while (csect
->sy_tc
.next
!= (symbolS
*) NULL
4486 && (csect
->sy_tc
.next
->sy_frag
->fr_address
4487 <= fix
->fx_addsy
->sy_frag
->fr_address
))
4489 /* If the csect address equals the symbol value, then we
4490 have to look through the full symbol table to see
4491 whether this is the csect we want. Note that we will
4492 only get here if the csect has zero length. */
4493 if ((csect
->sy_frag
->fr_address
4494 == fix
->fx_addsy
->sy_frag
->fr_address
)
4495 && S_GET_VALUE (csect
) == S_GET_VALUE (fix
->fx_addsy
))
4499 for (scan
= csect
->sy_next
;
4501 scan
= scan
->sy_next
)
4503 if (scan
->sy_tc
.subseg
!= 0)
4505 if (scan
== fix
->fx_addsy
)
4509 /* If we found the symbol before the next csect
4510 symbol, then this is the csect we want. */
4511 if (scan
== fix
->fx_addsy
)
4515 csect
= csect
->sy_tc
.next
;
4518 fix
->fx_offset
+= (S_GET_VALUE (fix
->fx_addsy
)
4519 - csect
->sy_frag
->fr_address
);
4520 fix
->fx_addsy
= csect
;
4524 /* Adjust a reloc against a .lcomm symbol to be against the base
4526 if (fix
->fx_addsy
!= (symbolS
*) NULL
4527 && S_GET_SEGMENT (fix
->fx_addsy
) == bss_section
4528 && ! S_IS_EXTERNAL (fix
->fx_addsy
))
4530 resolve_symbol_value (fix
->fx_addsy
->sy_frag
->fr_symbol
, 1);
4531 fix
->fx_offset
+= (S_GET_VALUE (fix
->fx_addsy
)
4532 - S_GET_VALUE (fix
->fx_addsy
->sy_frag
->fr_symbol
));
4533 fix
->fx_addsy
= fix
->fx_addsy
->sy_frag
->fr_symbol
;
4539 /* A reloc from one csect to another must be kept. The assembler
4540 will, of course, keep relocs between sections, and it will keep
4541 absolute relocs, but we need to force it to keep PC relative relocs
4542 between two csects in the same section. */
4545 ppc_force_relocation (fix
)
4548 /* At this point fix->fx_addsy should already have been converted to
4549 a csect symbol. If the csect does not include the fragment, then
4550 we need to force the relocation. */
4552 && fix
->fx_addsy
!= NULL
4553 && fix
->fx_addsy
->sy_tc
.subseg
!= 0
4554 && (fix
->fx_addsy
->sy_frag
->fr_address
> fix
->fx_frag
->fr_address
4555 || (fix
->fx_addsy
->sy_tc
.next
!= NULL
4556 && (fix
->fx_addsy
->sy_tc
.next
->sy_frag
->fr_address
4557 <= fix
->fx_frag
->fr_address
))))
4563 #endif /* OBJ_XCOFF */
4565 /* See whether a symbol is in the TOC section. */
4568 ppc_is_toc_sym (sym
)
4572 return sym
->sy_tc
.class == XMC_TC
;
4574 return strcmp (segment_name (S_GET_SEGMENT (sym
)), ".got") == 0;
4578 /* Apply a fixup to the object code. This is called for all the
4579 fixups we generated by the call to fix_new_exp, above. In the call
4580 above we used a reloc code which was the largest legal reloc code
4581 plus the operand index. Here we undo that to recover the operand
4582 index. At this point all symbol values should be fully resolved,
4583 and we attempt to completely resolve the reloc. If we can not do
4584 that, we determine the correct reloc code and put it back in the
4588 md_apply_fix3 (fixp
, valuep
, seg
)
4595 /* FIXME FIXME FIXME: The value we are passed in *valuep includes
4596 the symbol values. Since we are using BFD_ASSEMBLER, if we are
4597 doing this relocation the code in write.c is going to call
4598 bfd_install_relocation, which is also going to use the symbol
4599 value. That means that if the reloc is fully resolved we want to
4600 use *valuep since bfd_install_relocation is not being used.
4601 However, if the reloc is not fully resolved we do not want to use
4602 *valuep, and must use fx_offset instead. However, if the reloc
4603 is PC relative, we do want to use *valuep since it includes the
4604 result of md_pcrel_from. This is confusing. */
4606 if (fixp
->fx_addsy
== (symbolS
*) NULL
)
4611 else if (fixp
->fx_pcrel
)
4615 value
= fixp
->fx_offset
;
4616 if (fixp
->fx_subsy
!= (symbolS
*) NULL
)
4618 if (S_GET_SEGMENT (fixp
->fx_subsy
) == absolute_section
)
4619 value
-= S_GET_VALUE (fixp
->fx_subsy
);
4622 /* We can't actually support subtracting a symbol. */
4623 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
4624 "expression too complex");
4629 if ((int) fixp
->fx_r_type
>= (int) BFD_RELOC_UNUSED
)
4632 const struct powerpc_operand
*operand
;
4636 opindex
= (int) fixp
->fx_r_type
- (int) BFD_RELOC_UNUSED
;
4638 operand
= &powerpc_operands
[opindex
];
4641 /* It appears that an instruction like
4643 when LC..1 is not a TOC symbol does not generate a reloc. It
4644 uses the offset of LC..1 within its csect. However, .long
4645 LC..1 will generate a reloc. I can't find any documentation
4646 on how these cases are to be distinguished, so this is a wild
4647 guess. These cases are generated by gcc -mminimal-toc. */
4648 if ((operand
->flags
& PPC_OPERAND_PARENS
) != 0
4649 && operand
->bits
== 16
4650 && operand
->shift
== 0
4651 && operand
->insert
== NULL
4652 && fixp
->fx_addsy
!= NULL
4653 && fixp
->fx_addsy
->sy_tc
.subseg
!= 0
4654 && fixp
->fx_addsy
->sy_tc
.class != XMC_TC
4655 && fixp
->fx_addsy
->sy_tc
.class != XMC_TC0
4656 && S_GET_SEGMENT (fixp
->fx_addsy
) != bss_section
)
4658 value
= fixp
->fx_offset
;
4663 /* Fetch the instruction, insert the fully resolved operand
4664 value, and stuff the instruction back again. */
4665 where
= fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
;
4666 if (target_big_endian
)
4667 insn
= bfd_getb32 ((unsigned char *) where
);
4669 insn
= bfd_getl32 ((unsigned char *) where
);
4670 insn
= ppc_insert_operand (insn
, operand
, (offsetT
) value
,
4671 fixp
->fx_file
, fixp
->fx_line
);
4672 if (target_big_endian
)
4673 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
4675 bfd_putl32 ((bfd_vma
) insn
, (unsigned char *) where
);
4679 /* Nothing else to do here. */
4683 /* Determine a BFD reloc value based on the operand information.
4684 We are only prepared to turn a few of the operands into
4686 FIXME: We need to handle the DS field at the very least.
4687 FIXME: Selecting the reloc type is a bit haphazard; perhaps
4688 there should be a new field in the operand table. */
4689 if ((operand
->flags
& PPC_OPERAND_RELATIVE
) != 0
4690 && operand
->bits
== 26
4691 && operand
->shift
== 0)
4692 fixp
->fx_r_type
= BFD_RELOC_PPC_B26
;
4693 else if ((operand
->flags
& PPC_OPERAND_RELATIVE
) != 0
4694 && operand
->bits
== 16
4695 && operand
->shift
== 0)
4696 fixp
->fx_r_type
= BFD_RELOC_PPC_B16
;
4697 else if ((operand
->flags
& PPC_OPERAND_ABSOLUTE
) != 0
4698 && operand
->bits
== 26
4699 && operand
->shift
== 0)
4700 fixp
->fx_r_type
= BFD_RELOC_PPC_BA26
;
4701 else if ((operand
->flags
& PPC_OPERAND_ABSOLUTE
) != 0
4702 && operand
->bits
== 16
4703 && operand
->shift
== 0)
4704 fixp
->fx_r_type
= BFD_RELOC_PPC_BA16
;
4705 else if ((operand
->flags
& PPC_OPERAND_PARENS
) != 0
4706 && operand
->bits
== 16
4707 && operand
->shift
== 0
4708 && operand
->insert
== NULL
4709 && fixp
->fx_addsy
!= NULL
4710 && ppc_is_toc_sym (fixp
->fx_addsy
))
4713 if (target_big_endian
)
4714 fixp
->fx_where
+= 2;
4715 fixp
->fx_r_type
= BFD_RELOC_PPC_TOC16
;
4722 /* Use expr_symbol_where to see if this is an expression
4724 if (expr_symbol_where (fixp
->fx_addsy
, &sfile
, &sline
))
4725 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
4726 "unresolved expression that must be resolved");
4728 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
4729 "unsupported relocation type");
4737 ppc_elf_validate_fix (fixp
, seg
);
4739 switch (fixp
->fx_r_type
)
4742 case BFD_RELOC_CTOR
:
4744 fixp
->fx_r_type
= BFD_RELOC_32_PCREL
;
4748 case BFD_RELOC_32_PCREL
:
4749 case BFD_RELOC_32_BASEREL
:
4750 case BFD_RELOC_PPC_EMB_NADDR32
:
4751 md_number_to_chars (fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
,
4755 case BFD_RELOC_LO16
:
4756 case BFD_RELOC_HI16
:
4757 case BFD_RELOC_HI16_S
:
4759 case BFD_RELOC_GPREL16
:
4760 case BFD_RELOC_16_GOT_PCREL
:
4761 case BFD_RELOC_16_GOTOFF
:
4762 case BFD_RELOC_LO16_GOTOFF
:
4763 case BFD_RELOC_HI16_GOTOFF
:
4764 case BFD_RELOC_HI16_S_GOTOFF
:
4765 case BFD_RELOC_LO16_BASEREL
:
4766 case BFD_RELOC_HI16_BASEREL
:
4767 case BFD_RELOC_HI16_S_BASEREL
:
4768 case BFD_RELOC_PPC_EMB_NADDR16
:
4769 case BFD_RELOC_PPC_EMB_NADDR16_LO
:
4770 case BFD_RELOC_PPC_EMB_NADDR16_HI
:
4771 case BFD_RELOC_PPC_EMB_NADDR16_HA
:
4772 case BFD_RELOC_PPC_EMB_SDAI16
:
4773 case BFD_RELOC_PPC_EMB_SDA2REL
:
4774 case BFD_RELOC_PPC_EMB_SDA2I16
:
4775 case BFD_RELOC_PPC_EMB_RELSEC16
:
4776 case BFD_RELOC_PPC_EMB_RELST_LO
:
4777 case BFD_RELOC_PPC_EMB_RELST_HI
:
4778 case BFD_RELOC_PPC_EMB_RELST_HA
:
4779 case BFD_RELOC_PPC_EMB_RELSDA
:
4780 case BFD_RELOC_PPC_TOC16
:
4782 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
4783 "cannot emit PC relative %s relocation%s%s",
4784 bfd_get_reloc_code_name (fixp
->fx_r_type
),
4785 fixp
->fx_addsy
!= NULL
? " against " : "",
4786 (fixp
->fx_addsy
!= NULL
4787 ? S_GET_NAME (fixp
->fx_addsy
)
4790 md_number_to_chars (fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
,
4794 /* Because SDA21 modifies the register field, the size is set to 4
4795 bytes, rather than 2, so offset it here appropriately */
4796 case BFD_RELOC_PPC_EMB_SDA21
:
4800 md_number_to_chars (fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
4801 + ((target_big_endian
) ? 2 : 0),
4809 md_number_to_chars (fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
,
4813 case BFD_RELOC_24_PLT_PCREL
:
4814 case BFD_RELOC_PPC_LOCAL24PC
:
4815 if (!fixp
->fx_pcrel
&& !fixp
->fx_done
)
4823 /* Fetch the instruction, insert the fully resolved operand
4824 value, and stuff the instruction back again. */
4825 where
= fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
;
4826 if (target_big_endian
)
4827 insn
= bfd_getb32 ((unsigned char *) where
);
4829 insn
= bfd_getl32 ((unsigned char *) where
);
4830 if ((value
& 3) != 0)
4831 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
4832 "must branch to an address a multiple of 4");
4833 if ((long)value
<< 6 >> 6 != value
)
4834 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
4835 "@local or @plt branch destination is too far "
4838 insn
= insn
| (value
& 0x03fffffc);
4839 if (target_big_endian
)
4840 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
4842 bfd_putl32 ((bfd_vma
) insn
, (unsigned char *) where
);
4848 "Gas failure, reloc value %d\n", fixp
->fx_r_type
);
4855 fixp
->fx_addnumber
= value
;
4857 if (fixp
->fx_r_type
!= BFD_RELOC_PPC_TOC16
)
4858 fixp
->fx_addnumber
= 0;
4862 fixp
->fx_addnumber
= 0;
4864 /* We want to use the offset within the data segment of the
4865 symbol, not the actual VMA of the symbol. */
4866 fixp
->fx_addnumber
=
4867 - bfd_get_section_vma (stdoutput
, S_GET_SEGMENT (fixp
->fx_addsy
));
4875 /* Generate a reloc for a fixup. */
4878 tc_gen_reloc (seg
, fixp
)
4884 reloc
= (arelent
*) xmalloc (sizeof (arelent
));
4886 reloc
->sym_ptr_ptr
= &fixp
->fx_addsy
->bsym
;
4887 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
4888 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
4889 if (reloc
->howto
== (reloc_howto_type
*) NULL
)
4891 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
4892 "reloc %d not supported by object file format", (int)fixp
->fx_r_type
);
4895 reloc
->addend
= fixp
->fx_addnumber
;