1 /* tc-ppc.c -- Assemble for the PowerPC or POWER (RS/6000)
2 Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
4 Written by Ian Lance Taylor, Cygnus Support.
6 This file is part of GAS, the GNU Assembler.
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
24 #include "safe-ctype.h"
26 #include "dw2gencfi.h"
27 #include "opcode/ppc.h"
31 #include "dwarf2dbg.h"
38 /* This is the assembler for the PowerPC or POWER (RS/6000) chips. */
40 /* Tell the main code what the endianness is. */
41 extern int target_big_endian
;
43 /* Whether or not, we've set target_big_endian. */
44 static int set_target_endian
= 0;
46 /* Whether to use user friendly register names. */
47 #ifndef TARGET_REG_NAMES_P
49 #define TARGET_REG_NAMES_P TRUE
51 #define TARGET_REG_NAMES_P FALSE
55 /* Macros for calculating LO, HI, HA, HIGHER, HIGHERA, HIGHEST,
58 /* #lo(value) denotes the least significant 16 bits of the indicated. */
59 #define PPC_LO(v) ((v) & 0xffff)
61 /* #hi(value) denotes bits 16 through 31 of the indicated value. */
62 #define PPC_HI(v) (((v) >> 16) & 0xffff)
64 /* #ha(value) denotes the high adjusted value: bits 16 through 31 of
65 the indicated value, compensating for #lo() being treated as a
67 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
69 /* #higher(value) denotes bits 32 through 47 of the indicated value. */
70 #define PPC_HIGHER(v) (((v) >> 16 >> 16) & 0xffff)
72 /* #highera(value) denotes bits 32 through 47 of the indicated value,
73 compensating for #lo() being treated as a signed number. */
74 #define PPC_HIGHERA(v) PPC_HIGHER ((v) + 0x8000)
76 /* #highest(value) denotes bits 48 through 63 of the indicated value. */
77 #define PPC_HIGHEST(v) (((v) >> 24 >> 24) & 0xffff)
79 /* #highesta(value) denotes bits 48 through 63 of the indicated value,
80 compensating for #lo being treated as a signed number. */
81 #define PPC_HIGHESTA(v) PPC_HIGHEST ((v) + 0x8000)
83 #define SEX16(val) ((((val) & 0xffff) ^ 0x8000) - 0x8000)
85 static bfd_boolean reg_names_p
= TARGET_REG_NAMES_P
;
87 static void ppc_macro (char *, const struct powerpc_macro
*);
88 static void ppc_byte (int);
90 #if defined (OBJ_XCOFF) || defined (OBJ_ELF)
91 static void ppc_tc (int);
92 static void ppc_machine (int);
96 static void ppc_comm (int);
97 static void ppc_bb (int);
98 static void ppc_bc (int);
99 static void ppc_bf (int);
100 static void ppc_biei (int);
101 static void ppc_bs (int);
102 static void ppc_eb (int);
103 static void ppc_ec (int);
104 static void ppc_ef (int);
105 static void ppc_es (int);
106 static void ppc_csect (int);
107 static void ppc_change_csect (symbolS
*, offsetT
);
108 static void ppc_function (int);
109 static void ppc_extern (int);
110 static void ppc_lglobl (int);
111 static void ppc_section (int);
112 static void ppc_named_section (int);
113 static void ppc_stabx (int);
114 static void ppc_rename (int);
115 static void ppc_toc (int);
116 static void ppc_xcoff_cons (int);
117 static void ppc_vbyte (int);
121 static void ppc_elf_cons (int);
122 static void ppc_elf_rdata (int);
123 static void ppc_elf_lcomm (int);
127 static void ppc_previous (int);
128 static void ppc_pdata (int);
129 static void ppc_ydata (int);
130 static void ppc_reldata (int);
131 static void ppc_rdata (int);
132 static void ppc_ualong (int);
133 static void ppc_znop (int);
134 static void ppc_pe_comm (int);
135 static void ppc_pe_section (int);
136 static void ppc_pe_function (int);
137 static void ppc_pe_tocd (int);
140 /* Generic assembler global variables which must be defined by all
144 /* This string holds the chars that always start a comment. If the
145 pre-processor is disabled, these aren't very useful. The macro
146 tc_comment_chars points to this. We use this, rather than the
147 usual comment_chars, so that we can switch for Solaris conventions. */
148 static const char ppc_solaris_comment_chars
[] = "#!";
149 static const char ppc_eabi_comment_chars
[] = "#";
151 #ifdef TARGET_SOLARIS_COMMENT
152 const char *ppc_comment_chars
= ppc_solaris_comment_chars
;
154 const char *ppc_comment_chars
= ppc_eabi_comment_chars
;
157 const char comment_chars
[] = "#";
160 /* Characters which start a comment at the beginning of a line. */
161 const char line_comment_chars
[] = "#";
163 /* Characters which may be used to separate multiple commands on a
165 const char line_separator_chars
[] = ";";
167 /* Characters which are used to indicate an exponent in a floating
169 const char EXP_CHARS
[] = "eE";
171 /* Characters which mean that a number is a floating point constant,
173 const char FLT_CHARS
[] = "dD";
175 /* Anything that can start an operand needs to be mentioned here,
176 to stop the input scrubber eating whitespace. */
177 const char ppc_symbol_chars
[] = "%[";
179 /* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
180 int ppc_cie_data_alignment
;
182 /* The type of processor we are assembling for. This is one or more
183 of the PPC_OPCODE flags defined in opcode/ppc.h. */
184 ppc_cpu_t ppc_cpu
= 0;
186 /* The target specific pseudo-ops which we support. */
188 const pseudo_typeS md_pseudo_table
[] =
190 /* Pseudo-ops which must be overridden. */
191 { "byte", ppc_byte
, 0 },
194 /* Pseudo-ops specific to the RS/6000 XCOFF format. Some of these
195 legitimately belong in the obj-*.c file. However, XCOFF is based
196 on COFF, and is only implemented for the RS/6000. We just use
197 obj-coff.c, and add what we need here. */
198 { "comm", ppc_comm
, 0 },
199 { "lcomm", ppc_comm
, 1 },
203 { "bi", ppc_biei
, 0 },
205 { "csect", ppc_csect
, 0 },
206 { "data", ppc_section
, 'd' },
210 { "ei", ppc_biei
, 1 },
212 { "extern", ppc_extern
, 0 },
213 { "function", ppc_function
, 0 },
214 { "lglobl", ppc_lglobl
, 0 },
215 { "rename", ppc_rename
, 0 },
216 { "section", ppc_named_section
, 0 },
217 { "stabx", ppc_stabx
, 0 },
218 { "text", ppc_section
, 't' },
219 { "toc", ppc_toc
, 0 },
220 { "long", ppc_xcoff_cons
, 2 },
221 { "llong", ppc_xcoff_cons
, 3 },
222 { "word", ppc_xcoff_cons
, 1 },
223 { "short", ppc_xcoff_cons
, 1 },
224 { "vbyte", ppc_vbyte
, 0 },
228 { "llong", ppc_elf_cons
, 8 },
229 { "quad", ppc_elf_cons
, 8 },
230 { "long", ppc_elf_cons
, 4 },
231 { "word", ppc_elf_cons
, 2 },
232 { "short", ppc_elf_cons
, 2 },
233 { "rdata", ppc_elf_rdata
, 0 },
234 { "rodata", ppc_elf_rdata
, 0 },
235 { "lcomm", ppc_elf_lcomm
, 0 },
239 /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format. */
240 { "previous", ppc_previous
, 0 },
241 { "pdata", ppc_pdata
, 0 },
242 { "ydata", ppc_ydata
, 0 },
243 { "reldata", ppc_reldata
, 0 },
244 { "rdata", ppc_rdata
, 0 },
245 { "ualong", ppc_ualong
, 0 },
246 { "znop", ppc_znop
, 0 },
247 { "comm", ppc_pe_comm
, 0 },
248 { "lcomm", ppc_pe_comm
, 1 },
249 { "section", ppc_pe_section
, 0 },
250 { "function", ppc_pe_function
,0 },
251 { "tocd", ppc_pe_tocd
, 0 },
254 #if defined (OBJ_XCOFF) || defined (OBJ_ELF)
256 { "machine", ppc_machine
, 0 },
263 /* Predefined register names if -mregnames (or default for Windows NT).
264 In general, there are lots of them, in an attempt to be compatible
265 with a number of other Windows NT assemblers. */
267 /* Structure to hold information about predefined registers. */
274 /* List of registers that are pre-defined:
276 Each general register has predefined names of the form:
277 1. r<reg_num> which has the value <reg_num>.
278 2. r.<reg_num> which has the value <reg_num>.
280 Each floating point register has predefined names of the form:
281 1. f<reg_num> which has the value <reg_num>.
282 2. f.<reg_num> which has the value <reg_num>.
284 Each vector unit register has predefined names of the form:
285 1. v<reg_num> which has the value <reg_num>.
286 2. v.<reg_num> which has the value <reg_num>.
288 Each condition register has predefined names of the form:
289 1. cr<reg_num> which has the value <reg_num>.
290 2. cr.<reg_num> which has the value <reg_num>.
292 There are individual registers as well:
293 sp or r.sp has the value 1
294 rtoc or r.toc has the value 2
295 fpscr has the value 0
301 dsisr has the value 18
303 sdr1 has the value 25
304 srr0 has the value 26
305 srr1 has the value 27
307 The table is sorted. Suitable for searching by a binary search. */
309 static const struct pd_reg pre_defined_registers
[] =
311 { "cr.0", 0 }, /* Condition Registers */
331 { "dar", 19 }, /* Data Access Register */
332 { "dec", 22 }, /* Decrementer */
333 { "dsisr", 18 }, /* Data Storage Interrupt Status Register */
335 { "f.0", 0 }, /* Floating point registers */
362 { "f.32", 32 }, /* Extended floating point scalar registers (ISA 2.06). */
428 { "f32", 32 }, /* Extended floating point scalar registers (ISA 2.06). */
469 /* Quantization registers used with pair single instructions. */
487 { "lr", 8 }, /* Link Register */
491 { "r.0", 0 }, /* General Purpose Registers */
524 { "r.sp", 1 }, /* Stack Pointer */
526 { "r.toc", 2 }, /* Pointer to the table of contents */
528 { "r0", 0 }, /* More general purpose registers */
561 { "rtoc", 2 }, /* Table of contents */
563 { "sdr1", 25 }, /* Storage Description Register 1 */
567 { "srr0", 26 }, /* Machine Status Save/Restore Register 0 */
568 { "srr1", 27 }, /* Machine Status Save/Restore Register 1 */
570 { "v.0", 0 }, /* Vector (Altivec/VMX) registers */
636 { "vs.0", 0 }, /* Vector Scalar (VSX) registers (ISA 2.06). */
770 #define REG_NAME_CNT (sizeof (pre_defined_registers) / sizeof (struct pd_reg))
772 /* Given NAME, find the register number associated with that name, return
773 the integer value associated with the given name or -1 on failure. */
776 reg_name_search (const struct pd_reg
*regs
, int regcount
, const char *name
)
778 int middle
, low
, high
;
786 middle
= (low
+ high
) / 2;
787 cmp
= strcasecmp (name
, regs
[middle
].name
);
793 return regs
[middle
].value
;
801 * Summary of register_name.
803 * in: Input_line_pointer points to 1st char of operand.
805 * out: A expressionS.
806 * The operand may have been a register: in this case, X_op == O_register,
807 * X_add_number is set to the register number, and truth is returned.
808 * Input_line_pointer->(next non-blank) char after operand, or is in its
813 register_name (expressionS
*expressionP
)
820 /* Find the spelling of the operand. */
821 start
= name
= input_line_pointer
;
822 if (name
[0] == '%' && ISALPHA (name
[1]))
823 name
= ++input_line_pointer
;
825 else if (!reg_names_p
|| !ISALPHA (name
[0]))
828 c
= get_symbol_end ();
829 reg_number
= reg_name_search (pre_defined_registers
, REG_NAME_CNT
, name
);
831 /* Put back the delimiting char. */
832 *input_line_pointer
= c
;
834 /* Look to see if it's in the register table. */
837 expressionP
->X_op
= O_register
;
838 expressionP
->X_add_number
= reg_number
;
840 /* Make the rest nice. */
841 expressionP
->X_add_symbol
= NULL
;
842 expressionP
->X_op_symbol
= NULL
;
846 /* Reset the line as if we had not done anything. */
847 input_line_pointer
= start
;
851 /* This function is called for each symbol seen in an expression. It
852 handles the special parsing which PowerPC assemblers are supposed
853 to use for condition codes. */
855 /* Whether to do the special parsing. */
856 static bfd_boolean cr_operand
;
858 /* Names to recognize in a condition code. This table is sorted. */
859 static const struct pd_reg cr_names
[] =
876 /* Parsing function. This returns non-zero if it recognized an
880 ppc_parse_name (const char *name
, expressionS
*expr
)
889 val
= reg_name_search (cr_names
, sizeof cr_names
/ sizeof cr_names
[0],
894 expr
->X_op
= O_constant
;
895 expr
->X_add_number
= val
;
900 /* Local variables. */
902 /* Whether to target xcoff64/elf64. */
903 static unsigned int ppc_obj64
= BFD_DEFAULT_TARGET_SIZE
== 64;
905 /* Opcode hash table. */
906 static struct hash_control
*ppc_hash
;
908 /* Macro hash table. */
909 static struct hash_control
*ppc_macro_hash
;
912 /* What type of shared library support to use. */
913 static enum { SHLIB_NONE
, SHLIB_PIC
, SHLIB_MRELOCATABLE
} shlib
= SHLIB_NONE
;
915 /* Flags to set in the elf header. */
916 static flagword ppc_flags
= 0;
918 /* Whether this is Solaris or not. */
919 #ifdef TARGET_SOLARIS_COMMENT
920 #define SOLARIS_P TRUE
922 #define SOLARIS_P FALSE
925 static bfd_boolean msolaris
= SOLARIS_P
;
930 /* The RS/6000 assembler uses the .csect pseudo-op to generate code
931 using a bunch of different sections. These assembler sections,
932 however, are all encompassed within the .text or .data sections of
933 the final output file. We handle this by using different
934 subsegments within these main segments. */
936 /* Next subsegment to allocate within the .text segment. */
937 static subsegT ppc_text_subsegment
= 2;
939 /* Linked list of csects in the text section. */
940 static symbolS
*ppc_text_csects
;
942 /* Next subsegment to allocate within the .data segment. */
943 static subsegT ppc_data_subsegment
= 2;
945 /* Linked list of csects in the data section. */
946 static symbolS
*ppc_data_csects
;
948 /* The current csect. */
949 static symbolS
*ppc_current_csect
;
951 /* The RS/6000 assembler uses a TOC which holds addresses of functions
952 and variables. Symbols are put in the TOC with the .tc pseudo-op.
953 A special relocation is used when accessing TOC entries. We handle
954 the TOC as a subsegment within the .data segment. We set it up if
955 we see a .toc pseudo-op, and save the csect symbol here. */
956 static symbolS
*ppc_toc_csect
;
958 /* The first frag in the TOC subsegment. */
959 static fragS
*ppc_toc_frag
;
961 /* The first frag in the first subsegment after the TOC in the .data
962 segment. NULL if there are no subsegments after the TOC. */
963 static fragS
*ppc_after_toc_frag
;
965 /* The current static block. */
966 static symbolS
*ppc_current_block
;
968 /* The COFF debugging section; set by md_begin. This is not the
969 .debug section, but is instead the secret BFD section which will
970 cause BFD to set the section number of a symbol to N_DEBUG. */
971 static asection
*ppc_coff_debug_section
;
973 #endif /* OBJ_XCOFF */
977 /* Various sections that we need for PE coff support. */
978 static segT ydata_section
;
979 static segT pdata_section
;
980 static segT reldata_section
;
981 static segT rdata_section
;
982 static segT tocdata_section
;
984 /* The current section and the previous section. See ppc_previous. */
985 static segT ppc_previous_section
;
986 static segT ppc_current_section
;
991 symbolS
*GOT_symbol
; /* Pre-defined "_GLOBAL_OFFSET_TABLE" */
992 #define PPC_APUINFO_ISEL 0x40
993 #define PPC_APUINFO_PMR 0x41
994 #define PPC_APUINFO_RFMCI 0x42
995 #define PPC_APUINFO_CACHELCK 0x43
996 #define PPC_APUINFO_SPE 0x100
997 #define PPC_APUINFO_EFS 0x101
998 #define PPC_APUINFO_BRLOCK 0x102
1001 * We keep a list of APUinfo
1003 unsigned long *ppc_apuinfo_list
;
1004 unsigned int ppc_apuinfo_num
;
1005 unsigned int ppc_apuinfo_num_alloc
;
1006 #endif /* OBJ_ELF */
1009 const char *const md_shortopts
= "b:l:usm:K:VQ:";
1011 const char *const md_shortopts
= "um:";
1013 const struct option md_longopts
[] = {
1014 {NULL
, no_argument
, NULL
, 0}
1016 const size_t md_longopts_size
= sizeof (md_longopts
);
1019 md_parse_option (int c
, char *arg
)
1026 /* -u means that any undefined symbols should be treated as
1027 external, which is the default for gas anyhow. */
1032 /* Solaris as takes -le (presumably for little endian). For completeness
1033 sake, recognize -be also. */
1034 if (strcmp (arg
, "e") == 0)
1036 target_big_endian
= 0;
1037 set_target_endian
= 1;
1045 if (strcmp (arg
, "e") == 0)
1047 target_big_endian
= 1;
1048 set_target_endian
= 1;
1056 /* Recognize -K PIC. */
1057 if (strcmp (arg
, "PIC") == 0 || strcmp (arg
, "pic") == 0)
1060 ppc_flags
|= EF_PPC_RELOCATABLE_LIB
;
1068 /* a64 and a32 determine whether to use XCOFF64 or XCOFF32. */
1070 if (strcmp (arg
, "64") == 0)
1075 as_fatal (_("%s unsupported"), "-a64");
1078 else if (strcmp (arg
, "32") == 0)
1085 if ((new_cpu
= ppc_parse_cpu (ppc_cpu
, arg
)) != 0)
1088 else if (strcmp (arg
, "regnames") == 0)
1091 else if (strcmp (arg
, "no-regnames") == 0)
1092 reg_names_p
= FALSE
;
1095 /* -mrelocatable/-mrelocatable-lib -- warn about initializations
1096 that require relocation. */
1097 else if (strcmp (arg
, "relocatable") == 0)
1099 shlib
= SHLIB_MRELOCATABLE
;
1100 ppc_flags
|= EF_PPC_RELOCATABLE
;
1103 else if (strcmp (arg
, "relocatable-lib") == 0)
1105 shlib
= SHLIB_MRELOCATABLE
;
1106 ppc_flags
|= EF_PPC_RELOCATABLE_LIB
;
1109 /* -memb, set embedded bit. */
1110 else if (strcmp (arg
, "emb") == 0)
1111 ppc_flags
|= EF_PPC_EMB
;
1113 /* -mlittle/-mbig set the endianess. */
1114 else if (strcmp (arg
, "little") == 0
1115 || strcmp (arg
, "little-endian") == 0)
1117 target_big_endian
= 0;
1118 set_target_endian
= 1;
1121 else if (strcmp (arg
, "big") == 0 || strcmp (arg
, "big-endian") == 0)
1123 target_big_endian
= 1;
1124 set_target_endian
= 1;
1127 else if (strcmp (arg
, "solaris") == 0)
1130 ppc_comment_chars
= ppc_solaris_comment_chars
;
1133 else if (strcmp (arg
, "no-solaris") == 0)
1136 ppc_comment_chars
= ppc_eabi_comment_chars
;
1141 as_bad (_("invalid switch -m%s"), arg
);
1147 /* -V: SVR4 argument to print version ID. */
1149 print_version_id ();
1152 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
1153 should be emitted or not. FIXME: Not implemented. */
1157 /* Solaris takes -s to specify that .stabs go in a .stabs section,
1158 rather than .stabs.excl, which is ignored by the linker.
1159 FIXME: Not implemented. */
1175 md_show_usage (FILE *stream
)
1177 fprintf (stream
, _("\
1179 -a32 generate ELF32/XCOFF32\n\
1180 -a64 generate ELF64/XCOFF64\n\
1182 -mpwrx, -mpwr2 generate code for POWER/2 (RIOS2)\n\
1183 -mpwr generate code for POWER (RIOS1)\n\
1184 -m601 generate code for PowerPC 601\n\
1185 -mppc, -mppc32, -m603, -m604\n\
1186 generate code for PowerPC 603/604\n\
1187 -m403 generate code for PowerPC 403\n\
1188 -m405 generate code for PowerPC 405\n\
1189 -m440 generate code for PowerPC 440\n\
1190 -m464 generate code for PowerPC 464\n\
1191 -m7400, -m7410, -m7450, -m7455\n\
1192 generate code for PowerPC 7400/7410/7450/7455\n\
1193 -m750cl generate code for PowerPC 750cl\n"));
1194 fprintf (stream
, _("\
1195 -mppc64, -m620 generate code for PowerPC 620/625/630\n\
1196 -mppc64bridge generate code for PowerPC 64, including bridge insns\n\
1197 -mbooke generate code for 32-bit PowerPC BookE\n\
1198 -mppca2 generate code for A2 architecture\n\
1199 -mpower4 generate code for Power4 architecture\n\
1200 -mpower5 generate code for Power5 architecture\n\
1201 -mpower6 generate code for Power6 architecture\n\
1202 -mpower7 generate code for Power7 architecture\n\
1203 -mcell generate code for Cell Broadband Engine architecture\n\
1204 -mcom generate code Power/PowerPC common instructions\n\
1205 -many generate code for any architecture (PWR/PWRX/PPC)\n"));
1206 fprintf (stream
, _("\
1207 -maltivec generate code for AltiVec\n\
1208 -mvsx generate code for Vector-Scalar (VSX) instructions\n\
1209 -me300 generate code for PowerPC e300 family\n\
1210 -me500, -me500x2 generate code for Motorola e500 core complex\n\
1211 -me500mc, generate code for Freescale e500mc core complex\n\
1212 -mspe generate code for Motorola SPE instructions\n\
1213 -mregnames Allow symbolic names for registers\n\
1214 -mno-regnames Do not allow symbolic names for registers\n"));
1216 fprintf (stream
, _("\
1217 -mrelocatable support for GCC's -mrelocatble option\n\
1218 -mrelocatable-lib support for GCC's -mrelocatble-lib option\n\
1219 -memb set PPC_EMB bit in ELF flags\n\
1220 -mlittle, -mlittle-endian, -l, -le\n\
1221 generate code for a little endian machine\n\
1222 -mbig, -mbig-endian, -b, -be\n\
1223 generate code for a big endian machine\n\
1224 -msolaris generate code for Solaris\n\
1225 -mno-solaris do not generate code for Solaris\n\
1226 -V print assembler version number\n\
1227 -Qy, -Qn ignored\n"));
1231 /* Set ppc_cpu if it is not already set. */
1236 const char *default_os
= TARGET_OS
;
1237 const char *default_cpu
= TARGET_CPU
;
1239 if ((ppc_cpu
& ~PPC_OPCODE_ANY
) == 0)
1242 ppc_cpu
|= PPC_OPCODE_PPC
| PPC_OPCODE_CLASSIC
| PPC_OPCODE_64
;
1243 else if (strncmp (default_os
, "aix", 3) == 0
1244 && default_os
[3] >= '4' && default_os
[3] <= '9')
1245 ppc_cpu
|= PPC_OPCODE_COMMON
| PPC_OPCODE_32
;
1246 else if (strncmp (default_os
, "aix3", 4) == 0)
1247 ppc_cpu
|= PPC_OPCODE_POWER
| PPC_OPCODE_32
;
1248 else if (strcmp (default_cpu
, "rs6000") == 0)
1249 ppc_cpu
|= PPC_OPCODE_POWER
| PPC_OPCODE_32
;
1250 else if (strncmp (default_cpu
, "powerpc", 7) == 0)
1251 ppc_cpu
|= PPC_OPCODE_PPC
| PPC_OPCODE_CLASSIC
| PPC_OPCODE_32
;
1253 as_fatal (_("Unknown default cpu = %s, os = %s"),
1254 default_cpu
, default_os
);
1258 /* Figure out the BFD architecture to use. This function and ppc_mach
1259 are called well before md_begin, when the output file is opened. */
1261 enum bfd_architecture
1264 const char *default_cpu
= TARGET_CPU
;
1267 if ((ppc_cpu
& PPC_OPCODE_PPC
) != 0)
1268 return bfd_arch_powerpc
;
1269 else if ((ppc_cpu
& PPC_OPCODE_POWER
) != 0)
1270 return bfd_arch_rs6000
;
1271 else if ((ppc_cpu
& (PPC_OPCODE_COMMON
| PPC_OPCODE_ANY
)) != 0)
1273 if (strcmp (default_cpu
, "rs6000") == 0)
1274 return bfd_arch_rs6000
;
1275 else if (strncmp (default_cpu
, "powerpc", 7) == 0)
1276 return bfd_arch_powerpc
;
1279 as_fatal (_("Neither Power nor PowerPC opcodes were selected."));
1280 return bfd_arch_unknown
;
1287 return bfd_mach_ppc64
;
1288 else if (ppc_arch () == bfd_arch_rs6000
)
1289 return bfd_mach_rs6k
;
1291 return bfd_mach_ppc
;
1295 ppc_target_format (void)
1299 return target_big_endian
? "pe-powerpc" : "pe-powerpcle";
1301 return "xcoff-powermac";
1304 return (ppc_obj64
? "aix5coff64-rs6000" : "aixcoff-rs6000");
1306 return (ppc_obj64
? "aixcoff64-rs6000" : "aixcoff-rs6000");
1312 return "elf32-powerpc-vxworks";
1314 return (target_big_endian
1315 ? (ppc_obj64
? "elf64-powerpc" : "elf32-powerpc")
1316 : (ppc_obj64
? "elf64-powerpcle" : "elf32-powerpcle"));
1321 /* Insert opcodes and macros into hash tables. Called at startup and
1325 ppc_setup_opcodes (void)
1327 const struct powerpc_opcode
*op
;
1328 const struct powerpc_opcode
*op_end
;
1329 const struct powerpc_macro
*macro
;
1330 const struct powerpc_macro
*macro_end
;
1331 bfd_boolean bad_insn
= FALSE
;
1333 if (ppc_hash
!= NULL
)
1334 hash_die (ppc_hash
);
1335 if (ppc_macro_hash
!= NULL
)
1336 hash_die (ppc_macro_hash
);
1338 /* Insert the opcodes into a hash table. */
1339 ppc_hash
= hash_new ();
1341 if (ENABLE_CHECKING
)
1345 /* Check operand masks. Code here and in the disassembler assumes
1346 all the 1's in the mask are contiguous. */
1347 for (i
= 0; i
< num_powerpc_operands
; ++i
)
1349 unsigned long mask
= powerpc_operands
[i
].bitm
;
1350 unsigned long right_bit
;
1353 right_bit
= mask
& -mask
;
1355 right_bit
= mask
& -mask
;
1356 if (mask
!= right_bit
)
1358 as_bad (_("powerpc_operands[%d].bitm invalid"), i
);
1361 for (j
= i
+ 1; j
< num_powerpc_operands
; ++j
)
1362 if (memcmp (&powerpc_operands
[i
], &powerpc_operands
[j
],
1363 sizeof (powerpc_operands
[0])) == 0)
1365 as_bad (_("powerpc_operands[%d] duplicates powerpc_operands[%d]"),
1372 op_end
= powerpc_opcodes
+ powerpc_num_opcodes
;
1373 for (op
= powerpc_opcodes
; op
< op_end
; op
++)
1375 if (ENABLE_CHECKING
)
1377 const unsigned char *o
;
1378 unsigned long omask
= op
->mask
;
1380 if (op
!= powerpc_opcodes
)
1382 /* The major opcodes had better be sorted. Code in the
1383 disassembler assumes the insns are sorted according to
1385 if (PPC_OP (op
[0].opcode
) < PPC_OP (op
[-1].opcode
))
1387 as_bad (_("major opcode is not sorted for %s"),
1392 /* Warn if the table isn't more strictly ordered.
1393 Unfortunately it doesn't seem possible to order the
1394 table on much more than the major opcode, which makes
1395 it difficult to implement a binary search in the
1396 disassembler. The problem is that we have multiple
1397 ways to disassemble instructions, and we usually want
1398 to choose a more specific form (with more bits set in
1399 the opcode) than a more general form. eg. all of the
1400 following are equivalent:
1401 bne label # opcode = 0x40820000, mask = 0xff830003
1402 bf 2,label # opcode = 0x40800000, mask = 0xff800003
1403 bc 4,2,label # opcode = 0x40000000, mask = 0xfc000003
1405 There are also cases where the table needs to be out
1406 of order to disassemble the correct instruction for
1407 processor variants. */
1410 unsigned long t1
= op
[0].opcode
;
1411 unsigned long t2
= op
[-1].opcode
;
1413 if (((t1
^ t2
) & 0xfc0007ff) == 0
1414 && (t1
& 0xfc0006df) == 0x7c000286)
1416 /* spr field is split. */
1417 t1
= ((t1
& ~0x1ff800)
1418 | ((t1
& 0xf800) << 5) | ((t1
& 0x1f0000) >> 5));
1419 t2
= ((t2
& ~0x1ff800)
1420 | ((t2
& 0xf800) << 5) | ((t2
& 0x1f0000) >> 5));
1423 as_warn (_("%s (%08lx %08lx) after %s (%08lx %08lx)"),
1424 op
[0].name
, op
[0].opcode
, op
[0].mask
,
1425 op
[-1].name
, op
[-1].opcode
, op
[-1].mask
);
1429 /* The mask had better not trim off opcode bits. */
1430 if ((op
->opcode
& omask
) != op
->opcode
)
1432 as_bad (_("mask trims opcode bits for %s"),
1437 /* The operands must not overlap the opcode or each other. */
1438 for (o
= op
->operands
; *o
; ++o
)
1439 if (*o
>= num_powerpc_operands
)
1441 as_bad (_("operand index error for %s"),
1447 const struct powerpc_operand
*operand
= &powerpc_operands
[*o
];
1448 if (operand
->shift
>= 0)
1450 unsigned long mask
= operand
->bitm
<< operand
->shift
;
1453 as_bad (_("operand %d overlap in %s"),
1454 (int) (o
- op
->operands
), op
->name
);
1462 if ((op
->flags
& ppc_cpu
& ~(PPC_OPCODE_32
| PPC_OPCODE_64
)) != 0
1463 && ((op
->flags
& (PPC_OPCODE_32
| PPC_OPCODE_64
)) == 0
1464 || ((op
->flags
& (PPC_OPCODE_32
| PPC_OPCODE_64
))
1465 == (ppc_cpu
& (PPC_OPCODE_32
| PPC_OPCODE_64
)))
1466 || (ppc_cpu
& PPC_OPCODE_64_BRIDGE
) != 0)
1467 && !(ppc_cpu
& op
->deprecated
))
1471 retval
= hash_insert (ppc_hash
, op
->name
, (void *) op
);
1474 /* Ignore Power duplicates for -m601. */
1475 if ((ppc_cpu
& PPC_OPCODE_601
) != 0
1476 && (op
->flags
& PPC_OPCODE_POWER
) != 0)
1479 as_bad (_("duplicate instruction %s"),
1486 if ((ppc_cpu
& PPC_OPCODE_ANY
) != 0)
1487 for (op
= powerpc_opcodes
; op
< op_end
; op
++)
1488 hash_insert (ppc_hash
, op
->name
, (void *) op
);
1490 /* Insert the macros into a hash table. */
1491 ppc_macro_hash
= hash_new ();
1493 macro_end
= powerpc_macros
+ powerpc_num_macros
;
1494 for (macro
= powerpc_macros
; macro
< macro_end
; macro
++)
1496 if ((macro
->flags
& ppc_cpu
) != 0)
1500 retval
= hash_insert (ppc_macro_hash
, macro
->name
, (void *) macro
);
1501 if (retval
!= (const char *) NULL
)
1503 as_bad (_("duplicate macro %s"), macro
->name
);
1513 /* This function is called when the assembler starts up. It is called
1514 after the options have been parsed and the output file has been
1522 ppc_cie_data_alignment
= ppc_obj64
? -8 : -4;
1525 /* Set the ELF flags if desired. */
1526 if (ppc_flags
&& !msolaris
)
1527 bfd_set_private_flags (stdoutput
, ppc_flags
);
1530 ppc_setup_opcodes ();
1532 /* Tell the main code what the endianness is if it is not overridden
1534 if (!set_target_endian
)
1536 set_target_endian
= 1;
1537 target_big_endian
= PPC_BIG_ENDIAN
;
1541 ppc_coff_debug_section
= coff_section_from_bfd_index (stdoutput
, N_DEBUG
);
1543 /* Create dummy symbols to serve as initial csects. This forces the
1544 text csects to precede the data csects. These symbols will not
1546 ppc_text_csects
= symbol_make ("dummy\001");
1547 symbol_get_tc (ppc_text_csects
)->within
= ppc_text_csects
;
1548 ppc_data_csects
= symbol_make ("dummy\001");
1549 symbol_get_tc (ppc_data_csects
)->within
= ppc_data_csects
;
1554 ppc_current_section
= text_section
;
1555 ppc_previous_section
= 0;
1564 if (ppc_apuinfo_list
== NULL
)
1567 /* Ok, so write the section info out. We have this layout:
1571 0 8 length of "APUinfo\0"
1572 4 (n*4) number of APU's (4 bytes each)
1575 20 APU#1 first APU's info
1576 24 APU#2 second APU's info
1581 asection
*seg
= now_seg
;
1582 subsegT subseg
= now_subseg
;
1583 asection
*apuinfo_secp
= (asection
*) NULL
;
1586 /* Create the .PPC.EMB.apuinfo section. */
1587 apuinfo_secp
= subseg_new (".PPC.EMB.apuinfo", 0);
1588 bfd_set_section_flags (stdoutput
,
1590 SEC_HAS_CONTENTS
| SEC_READONLY
);
1593 md_number_to_chars (p
, (valueT
) 8, 4);
1596 md_number_to_chars (p
, (valueT
) ppc_apuinfo_num
* 4, 4);
1599 md_number_to_chars (p
, (valueT
) 2, 4);
1602 strcpy (p
, "APUinfo");
1604 for (i
= 0; i
< ppc_apuinfo_num
; i
++)
1607 md_number_to_chars (p
, (valueT
) ppc_apuinfo_list
[i
], 4);
1610 frag_align (2, 0, 0);
1612 /* We probably can't restore the current segment, for there likely
1615 subseg_set (seg
, subseg
);
1620 /* Insert an operand value into an instruction. */
1622 static unsigned long
1623 ppc_insert_operand (unsigned long insn
,
1624 const struct powerpc_operand
*operand
,
1630 long min
, max
, right
;
1632 max
= operand
->bitm
;
1636 if ((operand
->flags
& PPC_OPERAND_SIGNED
) != 0)
1638 if ((operand
->flags
& PPC_OPERAND_SIGNOPT
) == 0)
1639 max
= (max
>> 1) & -right
;
1640 min
= ~max
& -right
;
1643 if ((operand
->flags
& PPC_OPERAND_PLUS1
) != 0)
1646 if ((operand
->flags
& PPC_OPERAND_NEGATIVE
) != 0)
1655 /* Some people write constants with the sign extension done by
1656 hand but only up to 32 bits. This shouldn't really be valid,
1657 but, to permit this code to assemble on a 64-bit host, we
1658 sign extend the 32-bit value to 64 bits if so doing makes the
1661 && (offsetT
) (val
- 0x80000000 - 0x80000000) >= min
1662 && (offsetT
) (val
- 0x80000000 - 0x80000000) <= max
1663 && ((val
- 0x80000000 - 0x80000000) & (right
- 1)) == 0)
1664 val
= val
- 0x80000000 - 0x80000000;
1666 /* Similarly, people write expressions like ~(1<<15), and expect
1667 this to be OK for a 32-bit unsigned value. */
1669 && (offsetT
) (val
+ 0x80000000 + 0x80000000) >= min
1670 && (offsetT
) (val
+ 0x80000000 + 0x80000000) <= max
1671 && ((val
+ 0x80000000 + 0x80000000) & (right
- 1)) == 0)
1672 val
= val
+ 0x80000000 + 0x80000000;
1676 || (val
& (right
- 1)) != 0)
1677 as_bad_value_out_of_range (_("operand"), val
, min
, max
, file
, line
);
1680 if (operand
->insert
)
1685 insn
= (*operand
->insert
) (insn
, (long) val
, ppc_cpu
, &errmsg
);
1686 if (errmsg
!= (const char *) NULL
)
1687 as_bad_where (file
, line
, "%s", errmsg
);
1690 insn
|= ((long) val
& operand
->bitm
) << operand
->shift
;
1697 /* Parse @got, etc. and return the desired relocation. */
1698 static bfd_reloc_code_real_type
1699 ppc_elf_suffix (char **str_p
, expressionS
*exp_p
)
1703 unsigned int length
: 8;
1704 unsigned int valid32
: 1;
1705 unsigned int valid64
: 1;
1714 const struct map_bfd
*ptr
;
1716 #define MAP(str, reloc) { str, sizeof (str) - 1, 1, 1, reloc }
1717 #define MAP32(str, reloc) { str, sizeof (str) - 1, 1, 0, reloc }
1718 #define MAP64(str, reloc) { str, sizeof (str) - 1, 0, 1, reloc }
1720 static const struct map_bfd mapping
[] = {
1721 MAP ("l", BFD_RELOC_LO16
),
1722 MAP ("h", BFD_RELOC_HI16
),
1723 MAP ("ha", BFD_RELOC_HI16_S
),
1724 MAP ("brtaken", BFD_RELOC_PPC_B16_BRTAKEN
),
1725 MAP ("brntaken", BFD_RELOC_PPC_B16_BRNTAKEN
),
1726 MAP ("got", BFD_RELOC_16_GOTOFF
),
1727 MAP ("got@l", BFD_RELOC_LO16_GOTOFF
),
1728 MAP ("got@h", BFD_RELOC_HI16_GOTOFF
),
1729 MAP ("got@ha", BFD_RELOC_HI16_S_GOTOFF
),
1730 MAP ("plt@l", BFD_RELOC_LO16_PLTOFF
),
1731 MAP ("plt@h", BFD_RELOC_HI16_PLTOFF
),
1732 MAP ("plt@ha", BFD_RELOC_HI16_S_PLTOFF
),
1733 MAP ("copy", BFD_RELOC_PPC_COPY
),
1734 MAP ("globdat", BFD_RELOC_PPC_GLOB_DAT
),
1735 MAP ("sectoff", BFD_RELOC_16_BASEREL
),
1736 MAP ("sectoff@l", BFD_RELOC_LO16_BASEREL
),
1737 MAP ("sectoff@h", BFD_RELOC_HI16_BASEREL
),
1738 MAP ("sectoff@ha", BFD_RELOC_HI16_S_BASEREL
),
1739 MAP ("tls", BFD_RELOC_PPC_TLS
),
1740 MAP ("dtpmod", BFD_RELOC_PPC_DTPMOD
),
1741 MAP ("dtprel", BFD_RELOC_PPC_DTPREL
),
1742 MAP ("dtprel@l", BFD_RELOC_PPC_DTPREL16_LO
),
1743 MAP ("dtprel@h", BFD_RELOC_PPC_DTPREL16_HI
),
1744 MAP ("dtprel@ha", BFD_RELOC_PPC_DTPREL16_HA
),
1745 MAP ("tprel", BFD_RELOC_PPC_TPREL
),
1746 MAP ("tprel@l", BFD_RELOC_PPC_TPREL16_LO
),
1747 MAP ("tprel@h", BFD_RELOC_PPC_TPREL16_HI
),
1748 MAP ("tprel@ha", BFD_RELOC_PPC_TPREL16_HA
),
1749 MAP ("got@tlsgd", BFD_RELOC_PPC_GOT_TLSGD16
),
1750 MAP ("got@tlsgd@l", BFD_RELOC_PPC_GOT_TLSGD16_LO
),
1751 MAP ("got@tlsgd@h", BFD_RELOC_PPC_GOT_TLSGD16_HI
),
1752 MAP ("got@tlsgd@ha", BFD_RELOC_PPC_GOT_TLSGD16_HA
),
1753 MAP ("got@tlsld", BFD_RELOC_PPC_GOT_TLSLD16
),
1754 MAP ("got@tlsld@l", BFD_RELOC_PPC_GOT_TLSLD16_LO
),
1755 MAP ("got@tlsld@h", BFD_RELOC_PPC_GOT_TLSLD16_HI
),
1756 MAP ("got@tlsld@ha", BFD_RELOC_PPC_GOT_TLSLD16_HA
),
1757 MAP ("got@dtprel", BFD_RELOC_PPC_GOT_DTPREL16
),
1758 MAP ("got@dtprel@l", BFD_RELOC_PPC_GOT_DTPREL16_LO
),
1759 MAP ("got@dtprel@h", BFD_RELOC_PPC_GOT_DTPREL16_HI
),
1760 MAP ("got@dtprel@ha", BFD_RELOC_PPC_GOT_DTPREL16_HA
),
1761 MAP ("got@tprel", BFD_RELOC_PPC_GOT_TPREL16
),
1762 MAP ("got@tprel@l", BFD_RELOC_PPC_GOT_TPREL16_LO
),
1763 MAP ("got@tprel@h", BFD_RELOC_PPC_GOT_TPREL16_HI
),
1764 MAP ("got@tprel@ha", BFD_RELOC_PPC_GOT_TPREL16_HA
),
1765 MAP32 ("fixup", BFD_RELOC_CTOR
),
1766 MAP32 ("plt", BFD_RELOC_24_PLT_PCREL
),
1767 MAP32 ("pltrel24", BFD_RELOC_24_PLT_PCREL
),
1768 MAP32 ("local24pc", BFD_RELOC_PPC_LOCAL24PC
),
1769 MAP32 ("local", BFD_RELOC_PPC_LOCAL24PC
),
1770 MAP32 ("pltrel", BFD_RELOC_32_PLT_PCREL
),
1771 MAP32 ("sdarel", BFD_RELOC_GPREL16
),
1772 MAP32 ("naddr", BFD_RELOC_PPC_EMB_NADDR32
),
1773 MAP32 ("naddr16", BFD_RELOC_PPC_EMB_NADDR16
),
1774 MAP32 ("naddr@l", BFD_RELOC_PPC_EMB_NADDR16_LO
),
1775 MAP32 ("naddr@h", BFD_RELOC_PPC_EMB_NADDR16_HI
),
1776 MAP32 ("naddr@ha", BFD_RELOC_PPC_EMB_NADDR16_HA
),
1777 MAP32 ("sdai16", BFD_RELOC_PPC_EMB_SDAI16
),
1778 MAP32 ("sda2rel", BFD_RELOC_PPC_EMB_SDA2REL
),
1779 MAP32 ("sda2i16", BFD_RELOC_PPC_EMB_SDA2I16
),
1780 MAP32 ("sda21", BFD_RELOC_PPC_EMB_SDA21
),
1781 MAP32 ("mrkref", BFD_RELOC_PPC_EMB_MRKREF
),
1782 MAP32 ("relsect", BFD_RELOC_PPC_EMB_RELSEC16
),
1783 MAP32 ("relsect@l", BFD_RELOC_PPC_EMB_RELST_LO
),
1784 MAP32 ("relsect@h", BFD_RELOC_PPC_EMB_RELST_HI
),
1785 MAP32 ("relsect@ha", BFD_RELOC_PPC_EMB_RELST_HA
),
1786 MAP32 ("bitfld", BFD_RELOC_PPC_EMB_BIT_FLD
),
1787 MAP32 ("relsda", BFD_RELOC_PPC_EMB_RELSDA
),
1788 MAP32 ("xgot", BFD_RELOC_PPC_TOC16
),
1789 MAP64 ("higher", BFD_RELOC_PPC64_HIGHER
),
1790 MAP64 ("highera", BFD_RELOC_PPC64_HIGHER_S
),
1791 MAP64 ("highest", BFD_RELOC_PPC64_HIGHEST
),
1792 MAP64 ("highesta", BFD_RELOC_PPC64_HIGHEST_S
),
1793 MAP64 ("tocbase", BFD_RELOC_PPC64_TOC
),
1794 MAP64 ("toc", BFD_RELOC_PPC_TOC16
),
1795 MAP64 ("toc@l", BFD_RELOC_PPC64_TOC16_LO
),
1796 MAP64 ("toc@h", BFD_RELOC_PPC64_TOC16_HI
),
1797 MAP64 ("toc@ha", BFD_RELOC_PPC64_TOC16_HA
),
1798 MAP64 ("dtprel@higher", BFD_RELOC_PPC64_DTPREL16_HIGHER
),
1799 MAP64 ("dtprel@highera", BFD_RELOC_PPC64_DTPREL16_HIGHERA
),
1800 MAP64 ("dtprel@highest", BFD_RELOC_PPC64_DTPREL16_HIGHEST
),
1801 MAP64 ("dtprel@highesta", BFD_RELOC_PPC64_DTPREL16_HIGHESTA
),
1802 MAP64 ("tprel@higher", BFD_RELOC_PPC64_TPREL16_HIGHER
),
1803 MAP64 ("tprel@highera", BFD_RELOC_PPC64_TPREL16_HIGHERA
),
1804 MAP64 ("tprel@highest", BFD_RELOC_PPC64_TPREL16_HIGHEST
),
1805 MAP64 ("tprel@highesta", BFD_RELOC_PPC64_TPREL16_HIGHESTA
),
1806 { (char *) 0, 0, 0, 0, BFD_RELOC_UNUSED
}
1810 return BFD_RELOC_UNUSED
;
1812 for (ch
= *str
, str2
= ident
;
1813 (str2
< ident
+ sizeof (ident
) - 1
1814 && (ISALNUM (ch
) || ch
== '@'));
1817 *str2
++ = TOLOWER (ch
);
1824 for (ptr
= &mapping
[0]; ptr
->length
> 0; ptr
++)
1825 if (ch
== ptr
->string
[0]
1826 && len
== ptr
->length
1827 && memcmp (ident
, ptr
->string
, ptr
->length
) == 0
1828 && (ppc_obj64
? ptr
->valid64
: ptr
->valid32
))
1830 int reloc
= ptr
->reloc
;
1832 if (!ppc_obj64
&& exp_p
->X_add_number
!= 0)
1836 case BFD_RELOC_16_GOTOFF
:
1837 case BFD_RELOC_LO16_GOTOFF
:
1838 case BFD_RELOC_HI16_GOTOFF
:
1839 case BFD_RELOC_HI16_S_GOTOFF
:
1840 as_warn (_("identifier+constant@got means "
1841 "identifier@got+constant"));
1844 case BFD_RELOC_PPC_GOT_TLSGD16
:
1845 case BFD_RELOC_PPC_GOT_TLSGD16_LO
:
1846 case BFD_RELOC_PPC_GOT_TLSGD16_HI
:
1847 case BFD_RELOC_PPC_GOT_TLSGD16_HA
:
1848 case BFD_RELOC_PPC_GOT_TLSLD16
:
1849 case BFD_RELOC_PPC_GOT_TLSLD16_LO
:
1850 case BFD_RELOC_PPC_GOT_TLSLD16_HI
:
1851 case BFD_RELOC_PPC_GOT_TLSLD16_HA
:
1852 case BFD_RELOC_PPC_GOT_DTPREL16
:
1853 case BFD_RELOC_PPC_GOT_DTPREL16_LO
:
1854 case BFD_RELOC_PPC_GOT_DTPREL16_HI
:
1855 case BFD_RELOC_PPC_GOT_DTPREL16_HA
:
1856 case BFD_RELOC_PPC_GOT_TPREL16
:
1857 case BFD_RELOC_PPC_GOT_TPREL16_LO
:
1858 case BFD_RELOC_PPC_GOT_TPREL16_HI
:
1859 case BFD_RELOC_PPC_GOT_TPREL16_HA
:
1860 as_bad (_("symbol+offset not supported for got tls"));
1865 /* Now check for identifier@suffix+constant. */
1866 if (*str
== '-' || *str
== '+')
1868 char *orig_line
= input_line_pointer
;
1869 expressionS new_exp
;
1871 input_line_pointer
= str
;
1872 expression (&new_exp
);
1873 if (new_exp
.X_op
== O_constant
)
1875 exp_p
->X_add_number
+= new_exp
.X_add_number
;
1876 str
= input_line_pointer
;
1879 if (&input_line_pointer
!= str_p
)
1880 input_line_pointer
= orig_line
;
1884 if (reloc
== (int) BFD_RELOC_PPC64_TOC
1885 && exp_p
->X_op
== O_symbol
1886 && strcmp (S_GET_NAME (exp_p
->X_add_symbol
), ".TOC.") == 0)
1888 /* Change the symbol so that the dummy .TOC. symbol can be
1889 omitted from the object file. */
1890 exp_p
->X_add_symbol
= &abs_symbol
;
1893 return (bfd_reloc_code_real_type
) reloc
;
1896 return BFD_RELOC_UNUSED
;
1899 /* Like normal .long/.short/.word, except support @got, etc.
1900 Clobbers input_line_pointer, checks end-of-line. */
1902 ppc_elf_cons (int nbytes
/* 1=.byte, 2=.word, 4=.long, 8=.llong */)
1905 bfd_reloc_code_real_type reloc
;
1907 if (is_it_end_of_statement ())
1909 demand_empty_rest_of_line ();
1916 if (exp
.X_op
== O_symbol
1917 && *input_line_pointer
== '@'
1918 && (reloc
= ppc_elf_suffix (&input_line_pointer
,
1919 &exp
)) != BFD_RELOC_UNUSED
)
1921 reloc_howto_type
*reloc_howto
;
1924 reloc_howto
= bfd_reloc_type_lookup (stdoutput
, reloc
);
1925 size
= bfd_get_reloc_size (reloc_howto
);
1929 as_bad (_("%s relocations do not fit in %d bytes\n"),
1930 reloc_howto
->name
, nbytes
);
1937 p
= frag_more (nbytes
);
1939 if (target_big_endian
)
1940 offset
= nbytes
- size
;
1941 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
+ offset
, size
,
1946 emit_expr (&exp
, (unsigned int) nbytes
);
1948 while (*input_line_pointer
++ == ',');
1950 /* Put terminator back into stream. */
1951 input_line_pointer
--;
1952 demand_empty_rest_of_line ();
1955 /* Solaris pseduo op to change to the .rodata section. */
1957 ppc_elf_rdata (int xxx
)
1959 char *save_line
= input_line_pointer
;
1960 static char section
[] = ".rodata\n";
1962 /* Just pretend this is .section .rodata */
1963 input_line_pointer
= section
;
1964 obj_elf_section (xxx
);
1966 input_line_pointer
= save_line
;
1969 /* Pseudo op to make file scope bss items. */
1971 ppc_elf_lcomm (int xxx ATTRIBUTE_UNUSED
)
1984 name
= input_line_pointer
;
1985 c
= get_symbol_end ();
1987 /* just after name is now '\0'. */
1988 p
= input_line_pointer
;
1991 if (*input_line_pointer
!= ',')
1993 as_bad (_("Expected comma after symbol-name: rest of line ignored."));
1994 ignore_rest_of_line ();
1998 input_line_pointer
++; /* skip ',' */
1999 if ((size
= get_absolute_expression ()) < 0)
2001 as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) size
);
2002 ignore_rest_of_line ();
2006 /* The third argument to .lcomm is the alignment. */
2007 if (*input_line_pointer
!= ',')
2011 ++input_line_pointer
;
2012 align
= get_absolute_expression ();
2015 as_warn (_("ignoring bad alignment"));
2021 symbolP
= symbol_find_or_make (name
);
2024 if (S_IS_DEFINED (symbolP
) && ! S_IS_COMMON (symbolP
))
2026 as_bad (_("Ignoring attempt to re-define symbol `%s'."),
2027 S_GET_NAME (symbolP
));
2028 ignore_rest_of_line ();
2032 if (S_GET_VALUE (symbolP
) && S_GET_VALUE (symbolP
) != (valueT
) size
)
2034 as_bad (_("Length of .lcomm \"%s\" is already %ld. Not changed to %ld."),
2035 S_GET_NAME (symbolP
),
2036 (long) S_GET_VALUE (symbolP
),
2039 ignore_rest_of_line ();
2045 old_subsec
= now_subseg
;
2048 /* Convert to a power of 2 alignment. */
2049 for (align2
= 0; (align
& 1) == 0; align
>>= 1, ++align2
);
2052 as_bad (_("Common alignment not a power of 2"));
2053 ignore_rest_of_line ();
2060 record_alignment (bss_section
, align2
);
2061 subseg_set (bss_section
, 0);
2063 frag_align (align2
, 0, 0);
2064 if (S_GET_SEGMENT (symbolP
) == bss_section
)
2065 symbol_get_frag (symbolP
)->fr_symbol
= 0;
2066 symbol_set_frag (symbolP
, frag_now
);
2067 pfrag
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, symbolP
, size
,
2070 S_SET_SIZE (symbolP
, size
);
2071 S_SET_SEGMENT (symbolP
, bss_section
);
2072 subseg_set (old_sec
, old_subsec
);
2073 demand_empty_rest_of_line ();
2076 /* Validate any relocations emitted for -mrelocatable, possibly adding
2077 fixups for word relocations in writable segments, so we can adjust
2080 ppc_elf_validate_fix (fixS
*fixp
, segT seg
)
2082 if (fixp
->fx_done
|| fixp
->fx_pcrel
)
2091 case SHLIB_MRELOCATABLE
:
2092 if (fixp
->fx_r_type
<= BFD_RELOC_UNUSED
2093 && fixp
->fx_r_type
!= BFD_RELOC_16_GOTOFF
2094 && fixp
->fx_r_type
!= BFD_RELOC_HI16_GOTOFF
2095 && fixp
->fx_r_type
!= BFD_RELOC_LO16_GOTOFF
2096 && fixp
->fx_r_type
!= BFD_RELOC_HI16_S_GOTOFF
2097 && fixp
->fx_r_type
!= BFD_RELOC_16_BASEREL
2098 && fixp
->fx_r_type
!= BFD_RELOC_LO16_BASEREL
2099 && fixp
->fx_r_type
!= BFD_RELOC_HI16_BASEREL
2100 && fixp
->fx_r_type
!= BFD_RELOC_HI16_S_BASEREL
2101 && (seg
->flags
& SEC_LOAD
) != 0
2102 && strcmp (segment_name (seg
), ".got2") != 0
2103 && strcmp (segment_name (seg
), ".dtors") != 0
2104 && strcmp (segment_name (seg
), ".ctors") != 0
2105 && strcmp (segment_name (seg
), ".fixup") != 0
2106 && strcmp (segment_name (seg
), ".gcc_except_table") != 0
2107 && strcmp (segment_name (seg
), ".eh_frame") != 0
2108 && strcmp (segment_name (seg
), ".ex_shared") != 0)
2110 if ((seg
->flags
& (SEC_READONLY
| SEC_CODE
)) != 0
2111 || fixp
->fx_r_type
!= BFD_RELOC_CTOR
)
2113 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
2114 _("Relocation cannot be done when using -mrelocatable"));
2121 /* Prevent elf_frob_file_before_adjust removing a weak undefined
2122 function descriptor sym if the corresponding code sym is used. */
2125 ppc_frob_file_before_adjust (void)
2133 for (symp
= symbol_rootP
; symp
; symp
= symbol_next (symp
))
2140 name
= S_GET_NAME (symp
);
2144 if (! S_IS_WEAK (symp
)
2145 || S_IS_DEFINED (symp
))
2148 len
= strlen (name
) + 1;
2149 dotname
= xmalloc (len
+ 1);
2151 memcpy (dotname
+ 1, name
, len
);
2152 dotsym
= symbol_find_noref (dotname
, 1);
2154 if (dotsym
!= NULL
&& (symbol_used_p (dotsym
)
2155 || symbol_used_in_reloc_p (dotsym
)))
2156 symbol_mark_used (symp
);
2160 toc
= bfd_get_section_by_name (stdoutput
, ".toc");
2162 && bfd_section_size (stdoutput
, toc
) > 0x10000)
2163 as_warn (_("TOC section size exceeds 64k"));
2165 /* Don't emit .TOC. symbol. */
2166 symp
= symbol_find (".TOC.");
2168 symbol_remove (symp
, &symbol_rootP
, &symbol_lastP
);
2170 #endif /* OBJ_ELF */
2175 * Summary of parse_toc_entry.
2177 * in: Input_line_pointer points to the '[' in one of:
2179 * [toc] [tocv] [toc32] [toc64]
2181 * Anything else is an error of one kind or another.
2184 * return value: success or failure
2185 * toc_kind: kind of toc reference
2186 * input_line_pointer:
2187 * success: first char after the ']'
2188 * failure: unchanged
2192 * [toc] - rv == success, toc_kind = default_toc
2193 * [tocv] - rv == success, toc_kind = data_in_toc
2194 * [toc32] - rv == success, toc_kind = must_be_32
2195 * [toc64] - rv == success, toc_kind = must_be_64
2199 enum toc_size_qualifier
2201 default_toc
, /* The toc cell constructed should be the system default size */
2202 data_in_toc
, /* This is a direct reference to a toc cell */
2203 must_be_32
, /* The toc cell constructed must be 32 bits wide */
2204 must_be_64
/* The toc cell constructed must be 64 bits wide */
2208 parse_toc_entry (enum toc_size_qualifier
*toc_kind
)
2213 enum toc_size_qualifier t
;
2215 /* Save the input_line_pointer. */
2216 start
= input_line_pointer
;
2218 /* Skip over the '[' , and whitespace. */
2219 ++input_line_pointer
;
2222 /* Find the spelling of the operand. */
2223 toc_spec
= input_line_pointer
;
2224 c
= get_symbol_end ();
2226 if (strcmp (toc_spec
, "toc") == 0)
2230 else if (strcmp (toc_spec
, "tocv") == 0)
2234 else if (strcmp (toc_spec
, "toc32") == 0)
2238 else if (strcmp (toc_spec
, "toc64") == 0)
2244 as_bad (_("syntax error: invalid toc specifier `%s'"), toc_spec
);
2245 *input_line_pointer
= c
;
2246 input_line_pointer
= start
;
2250 /* Now find the ']'. */
2251 *input_line_pointer
= c
;
2253 SKIP_WHITESPACE (); /* leading whitespace could be there. */
2254 c
= *input_line_pointer
++; /* input_line_pointer->past char in c. */
2258 as_bad (_("syntax error: expected `]', found `%c'"), c
);
2259 input_line_pointer
= start
;
2270 #define APUID(a,v) ((((a) & 0xffff) << 16) | ((v) & 0xffff))
2272 ppc_apuinfo_section_add (unsigned int apu
, unsigned int version
)
2276 /* Check we don't already exist. */
2277 for (i
= 0; i
< ppc_apuinfo_num
; i
++)
2278 if (ppc_apuinfo_list
[i
] == APUID (apu
, version
))
2281 if (ppc_apuinfo_num
== ppc_apuinfo_num_alloc
)
2283 if (ppc_apuinfo_num_alloc
== 0)
2285 ppc_apuinfo_num_alloc
= 4;
2286 ppc_apuinfo_list
= (unsigned long *)
2287 xmalloc (sizeof (unsigned long) * ppc_apuinfo_num_alloc
);
2291 ppc_apuinfo_num_alloc
+= 4;
2292 ppc_apuinfo_list
= (unsigned long *) xrealloc (ppc_apuinfo_list
,
2293 sizeof (unsigned long) * ppc_apuinfo_num_alloc
);
2296 ppc_apuinfo_list
[ppc_apuinfo_num
++] = APUID (apu
, version
);
2302 /* We need to keep a list of fixups. We can't simply generate them as
2303 we go, because that would require us to first create the frag, and
2304 that would screw up references to ``.''. */
2310 bfd_reloc_code_real_type reloc
;
2313 #define MAX_INSN_FIXUPS (5)
2315 /* This routine is called for each instruction to be assembled. */
2318 md_assemble (char *str
)
2321 const struct powerpc_opcode
*opcode
;
2323 const unsigned char *opindex_ptr
;
2327 struct ppc_fixup fixups
[MAX_INSN_FIXUPS
];
2333 bfd_reloc_code_real_type reloc
;
2336 /* Get the opcode. */
2337 for (s
= str
; *s
!= '\0' && ! ISSPACE (*s
); s
++)
2342 /* Look up the opcode in the hash table. */
2343 opcode
= (const struct powerpc_opcode
*) hash_find (ppc_hash
, str
);
2344 if (opcode
== (const struct powerpc_opcode
*) NULL
)
2346 const struct powerpc_macro
*macro
;
2348 macro
= (const struct powerpc_macro
*) hash_find (ppc_macro_hash
, str
);
2349 if (macro
== (const struct powerpc_macro
*) NULL
)
2350 as_bad (_("Unrecognized opcode: `%s'"), str
);
2352 ppc_macro (s
, macro
);
2357 insn
= opcode
->opcode
;
2360 while (ISSPACE (*str
))
2363 /* PowerPC operands are just expressions. The only real issue is
2364 that a few operand types are optional. All cases which might use
2365 an optional operand separate the operands only with commas (in some
2366 cases parentheses are used, as in ``lwz 1,0(1)'' but such cases never
2367 have optional operands). Most instructions with optional operands
2368 have only one. Those that have more than one optional operand can
2369 take either all their operands or none. So, before we start seriously
2370 parsing the operands, we check to see if we have optional operands,
2371 and if we do, we count the number of commas to see which operands
2372 have been omitted. */
2374 for (opindex_ptr
= opcode
->operands
; *opindex_ptr
!= 0; opindex_ptr
++)
2376 const struct powerpc_operand
*operand
;
2378 operand
= &powerpc_operands
[*opindex_ptr
];
2379 if ((operand
->flags
& PPC_OPERAND_OPTIONAL
) != 0)
2381 unsigned int opcount
;
2382 unsigned int num_operands_expected
;
2385 /* There is an optional operand. Count the number of
2386 commas in the input line. */
2393 while ((s
= strchr (s
, ',')) != (char *) NULL
)
2400 /* Compute the number of expected operands.
2401 Do not count fake operands. */
2402 for (num_operands_expected
= 0, i
= 0; opcode
->operands
[i
]; i
++)
2403 if ((powerpc_operands
[opcode
->operands
[i
]].flags
& PPC_OPERAND_FAKE
) == 0)
2404 ++ num_operands_expected
;
2406 /* If there are fewer operands in the line then are called
2407 for by the instruction, we want to skip the optional
2409 if (opcount
< num_operands_expected
)
2416 /* Gather the operands. */
2420 for (opindex_ptr
= opcode
->operands
; *opindex_ptr
!= 0; opindex_ptr
++)
2422 const struct powerpc_operand
*operand
;
2428 if (next_opindex
== 0)
2429 operand
= &powerpc_operands
[*opindex_ptr
];
2432 operand
= &powerpc_operands
[next_opindex
];
2437 /* If this is a fake operand, then we do not expect anything
2439 if ((operand
->flags
& PPC_OPERAND_FAKE
) != 0)
2441 insn
= (*operand
->insert
) (insn
, 0L, ppc_cpu
, &errmsg
);
2442 if (errmsg
!= (const char *) NULL
)
2443 as_bad ("%s", errmsg
);
2447 /* If this is an optional operand, and we are skipping it, just
2449 if ((operand
->flags
& PPC_OPERAND_OPTIONAL
) != 0
2452 if (operand
->insert
)
2454 insn
= (*operand
->insert
) (insn
, 0L, ppc_cpu
, &errmsg
);
2455 if (errmsg
!= (const char *) NULL
)
2456 as_bad ("%s", errmsg
);
2458 if ((operand
->flags
& PPC_OPERAND_NEXT
) != 0)
2459 next_opindex
= *opindex_ptr
+ 1;
2463 /* Gather the operand. */
2464 hold
= input_line_pointer
;
2465 input_line_pointer
= str
;
2468 if (*input_line_pointer
== '[')
2470 /* We are expecting something like the second argument here:
2472 * lwz r4,[toc].GS.0.static_int(rtoc)
2473 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^
2474 * The argument following the `]' must be a symbol name, and the
2475 * register must be the toc register: 'rtoc' or '2'
2477 * The effect is to 0 as the displacement field
2478 * in the instruction, and issue an IMAGE_REL_PPC_TOCREL16 (or
2479 * the appropriate variation) reloc against it based on the symbol.
2480 * The linker will build the toc, and insert the resolved toc offset.
2483 * o The size of the toc entry is currently assumed to be
2484 * 32 bits. This should not be assumed to be a hard coded
2486 * o In an effort to cope with a change from 32 to 64 bits,
2487 * there are also toc entries that are specified to be
2488 * either 32 or 64 bits:
2489 * lwz r4,[toc32].GS.0.static_int(rtoc)
2490 * lwz r4,[toc64].GS.0.static_int(rtoc)
2491 * These demand toc entries of the specified size, and the
2492 * instruction probably requires it.
2496 enum toc_size_qualifier toc_kind
;
2497 bfd_reloc_code_real_type toc_reloc
;
2499 /* Go parse off the [tocXX] part. */
2500 valid_toc
= parse_toc_entry (&toc_kind
);
2504 /* Note: message has already been issued.
2505 FIXME: what sort of recovery should we do?
2506 demand_rest_of_line (); return; ? */
2509 /* Now get the symbol following the ']'. */
2515 /* In this case, we may not have seen the symbol yet,
2516 since it is allowed to appear on a .extern or .globl
2517 or just be a label in the .data section. */
2518 toc_reloc
= BFD_RELOC_PPC_TOC16
;
2521 /* 1. The symbol must be defined and either in the toc
2522 section, or a global.
2523 2. The reloc generated must have the TOCDEFN flag set
2524 in upper bit mess of the reloc type.
2525 FIXME: It's a little confusing what the tocv
2526 qualifier can be used for. At the very least, I've
2527 seen three uses, only one of which I'm sure I can
2529 if (ex
.X_op
== O_symbol
)
2531 gas_assert (ex
.X_add_symbol
!= NULL
);
2532 if (symbol_get_bfdsym (ex
.X_add_symbol
)->section
2535 as_bad (_("[tocv] symbol is not a toc symbol"));
2539 toc_reloc
= BFD_RELOC_PPC_TOC16
;
2542 /* FIXME: these next two specifically specify 32/64 bit
2543 toc entries. We don't support them today. Is this
2544 the right way to say that? */
2545 toc_reloc
= BFD_RELOC_UNUSED
;
2546 as_bad (_("Unimplemented toc32 expression modifier"));
2549 /* FIXME: see above. */
2550 toc_reloc
= BFD_RELOC_UNUSED
;
2551 as_bad (_("Unimplemented toc64 expression modifier"));
2555 _("Unexpected return value [%d] from parse_toc_entry!\n"),
2561 /* We need to generate a fixup for this expression. */
2562 if (fc
>= MAX_INSN_FIXUPS
)
2563 as_fatal (_("too many fixups"));
2565 fixups
[fc
].reloc
= toc_reloc
;
2566 fixups
[fc
].exp
= ex
;
2567 fixups
[fc
].opindex
= *opindex_ptr
;
2570 /* Ok. We've set up the fixup for the instruction. Now make it
2571 look like the constant 0 was found here. */
2573 ex
.X_op
= O_constant
;
2574 ex
.X_add_number
= 0;
2575 ex
.X_add_symbol
= NULL
;
2576 ex
.X_op_symbol
= NULL
;
2582 if ((reg_names_p
&& (operand
->flags
& PPC_OPERAND_CR
) != 0)
2583 || !register_name (&ex
))
2585 char save_lex
= lex_type
['%'];
2587 if ((operand
->flags
& PPC_OPERAND_CR
) != 0)
2590 lex_type
['%'] |= LEX_BEGIN_NAME
;
2594 lex_type
['%'] = save_lex
;
2598 str
= input_line_pointer
;
2599 input_line_pointer
= hold
;
2601 if (ex
.X_op
== O_illegal
)
2602 as_bad (_("illegal operand"));
2603 else if (ex
.X_op
== O_absent
)
2604 as_bad (_("missing operand"));
2605 else if (ex
.X_op
== O_register
)
2607 insn
= ppc_insert_operand (insn
, operand
, ex
.X_add_number
,
2608 ppc_cpu
, (char *) NULL
, 0);
2610 else if (ex
.X_op
== O_constant
)
2613 /* Allow @HA, @L, @H on constants. */
2614 char *orig_str
= str
;
2616 if ((reloc
= ppc_elf_suffix (&str
, &ex
)) != BFD_RELOC_UNUSED
)
2623 case BFD_RELOC_LO16
:
2624 /* X_unsigned is the default, so if the user has done
2625 something which cleared it, we always produce a
2627 if (ex
.X_unsigned
&& ! (operand
->flags
& PPC_OPERAND_SIGNED
))
2628 ex
.X_add_number
&= 0xffff;
2630 ex
.X_add_number
= SEX16 (ex
.X_add_number
);
2633 case BFD_RELOC_HI16
:
2634 if (ex
.X_unsigned
&& ! (operand
->flags
& PPC_OPERAND_SIGNED
))
2635 ex
.X_add_number
= PPC_HI (ex
.X_add_number
);
2637 ex
.X_add_number
= SEX16 (PPC_HI (ex
.X_add_number
));
2640 case BFD_RELOC_HI16_S
:
2641 if (ex
.X_unsigned
&& ! (operand
->flags
& PPC_OPERAND_SIGNED
))
2642 ex
.X_add_number
= PPC_HA (ex
.X_add_number
);
2644 ex
.X_add_number
= SEX16 (PPC_HA (ex
.X_add_number
));
2647 case BFD_RELOC_PPC64_HIGHER
:
2648 if (ex
.X_unsigned
&& ! (operand
->flags
& PPC_OPERAND_SIGNED
))
2649 ex
.X_add_number
= PPC_HIGHER (ex
.X_add_number
);
2651 ex
.X_add_number
= SEX16 (PPC_HIGHER (ex
.X_add_number
));
2654 case BFD_RELOC_PPC64_HIGHER_S
:
2655 if (ex
.X_unsigned
&& ! (operand
->flags
& PPC_OPERAND_SIGNED
))
2656 ex
.X_add_number
= PPC_HIGHERA (ex
.X_add_number
);
2658 ex
.X_add_number
= SEX16 (PPC_HIGHERA (ex
.X_add_number
));
2661 case BFD_RELOC_PPC64_HIGHEST
:
2662 if (ex
.X_unsigned
&& ! (operand
->flags
& PPC_OPERAND_SIGNED
))
2663 ex
.X_add_number
= PPC_HIGHEST (ex
.X_add_number
);
2665 ex
.X_add_number
= SEX16 (PPC_HIGHEST (ex
.X_add_number
));
2668 case BFD_RELOC_PPC64_HIGHEST_S
:
2669 if (ex
.X_unsigned
&& ! (operand
->flags
& PPC_OPERAND_SIGNED
))
2670 ex
.X_add_number
= PPC_HIGHESTA (ex
.X_add_number
);
2672 ex
.X_add_number
= SEX16 (PPC_HIGHESTA (ex
.X_add_number
));
2675 #endif /* OBJ_ELF */
2676 insn
= ppc_insert_operand (insn
, operand
, ex
.X_add_number
,
2677 ppc_cpu
, (char *) NULL
, 0);
2682 if (ex
.X_op
== O_symbol
&& str
[0] == '(')
2684 const char *sym_name
= S_GET_NAME (ex
.X_add_symbol
);
2685 if (sym_name
[0] == '.')
2688 if (strcasecmp (sym_name
, "__tls_get_addr") == 0)
2690 expressionS tls_exp
;
2692 hold
= input_line_pointer
;
2693 input_line_pointer
= str
+ 1;
2694 expression (&tls_exp
);
2695 if (tls_exp
.X_op
== O_symbol
)
2697 reloc
= BFD_RELOC_UNUSED
;
2698 if (strncasecmp (input_line_pointer
, "@tlsgd)", 7) == 0)
2700 reloc
= BFD_RELOC_PPC_TLSGD
;
2701 input_line_pointer
+= 7;
2703 else if (strncasecmp (input_line_pointer
, "@tlsld)", 7) == 0)
2705 reloc
= BFD_RELOC_PPC_TLSLD
;
2706 input_line_pointer
+= 7;
2708 if (reloc
!= BFD_RELOC_UNUSED
)
2711 str
= input_line_pointer
;
2713 if (fc
>= MAX_INSN_FIXUPS
)
2714 as_fatal (_("too many fixups"));
2715 fixups
[fc
].exp
= tls_exp
;
2716 fixups
[fc
].opindex
= *opindex_ptr
;
2717 fixups
[fc
].reloc
= reloc
;
2721 input_line_pointer
= hold
;
2725 if ((reloc
= ppc_elf_suffix (&str
, &ex
)) != BFD_RELOC_UNUSED
)
2727 /* Some TLS tweaks. */
2733 case BFD_RELOC_PPC_TLS
:
2734 insn
= ppc_insert_operand (insn
, operand
, ppc_obj64
? 13 : 2,
2735 ppc_cpu
, (char *) NULL
, 0);
2738 /* We'll only use the 32 (or 64) bit form of these relocations
2739 in constants. Instructions get the 16 bit form. */
2740 case BFD_RELOC_PPC_DTPREL
:
2741 reloc
= BFD_RELOC_PPC_DTPREL16
;
2743 case BFD_RELOC_PPC_TPREL
:
2744 reloc
= BFD_RELOC_PPC_TPREL16
;
2748 /* For the absolute forms of branches, convert the PC
2749 relative form back into the absolute. */
2750 if ((operand
->flags
& PPC_OPERAND_ABSOLUTE
) != 0)
2754 case BFD_RELOC_PPC_B26
:
2755 reloc
= BFD_RELOC_PPC_BA26
;
2757 case BFD_RELOC_PPC_B16
:
2758 reloc
= BFD_RELOC_PPC_BA16
;
2760 case BFD_RELOC_PPC_B16_BRTAKEN
:
2761 reloc
= BFD_RELOC_PPC_BA16_BRTAKEN
;
2763 case BFD_RELOC_PPC_B16_BRNTAKEN
:
2764 reloc
= BFD_RELOC_PPC_BA16_BRNTAKEN
;
2772 && (operand
->flags
& (PPC_OPERAND_DS
| PPC_OPERAND_DQ
)) != 0)
2777 reloc
= BFD_RELOC_PPC64_ADDR16_DS
;
2779 case BFD_RELOC_LO16
:
2780 reloc
= BFD_RELOC_PPC64_ADDR16_LO_DS
;
2782 case BFD_RELOC_16_GOTOFF
:
2783 reloc
= BFD_RELOC_PPC64_GOT16_DS
;
2785 case BFD_RELOC_LO16_GOTOFF
:
2786 reloc
= BFD_RELOC_PPC64_GOT16_LO_DS
;
2788 case BFD_RELOC_LO16_PLTOFF
:
2789 reloc
= BFD_RELOC_PPC64_PLT16_LO_DS
;
2791 case BFD_RELOC_16_BASEREL
:
2792 reloc
= BFD_RELOC_PPC64_SECTOFF_DS
;
2794 case BFD_RELOC_LO16_BASEREL
:
2795 reloc
= BFD_RELOC_PPC64_SECTOFF_LO_DS
;
2797 case BFD_RELOC_PPC_TOC16
:
2798 reloc
= BFD_RELOC_PPC64_TOC16_DS
;
2800 case BFD_RELOC_PPC64_TOC16_LO
:
2801 reloc
= BFD_RELOC_PPC64_TOC16_LO_DS
;
2803 case BFD_RELOC_PPC64_PLTGOT16
:
2804 reloc
= BFD_RELOC_PPC64_PLTGOT16_DS
;
2806 case BFD_RELOC_PPC64_PLTGOT16_LO
:
2807 reloc
= BFD_RELOC_PPC64_PLTGOT16_LO_DS
;
2809 case BFD_RELOC_PPC_DTPREL16
:
2810 reloc
= BFD_RELOC_PPC64_DTPREL16_DS
;
2812 case BFD_RELOC_PPC_DTPREL16_LO
:
2813 reloc
= BFD_RELOC_PPC64_DTPREL16_LO_DS
;
2815 case BFD_RELOC_PPC_TPREL16
:
2816 reloc
= BFD_RELOC_PPC64_TPREL16_DS
;
2818 case BFD_RELOC_PPC_TPREL16_LO
:
2819 reloc
= BFD_RELOC_PPC64_TPREL16_LO_DS
;
2821 case BFD_RELOC_PPC_GOT_DTPREL16
:
2822 case BFD_RELOC_PPC_GOT_DTPREL16_LO
:
2823 case BFD_RELOC_PPC_GOT_TPREL16
:
2824 case BFD_RELOC_PPC_GOT_TPREL16_LO
:
2827 as_bad (_("unsupported relocation for DS offset field"));
2833 /* We need to generate a fixup for this expression. */
2834 if (fc
>= MAX_INSN_FIXUPS
)
2835 as_fatal (_("too many fixups"));
2836 fixups
[fc
].exp
= ex
;
2837 fixups
[fc
].opindex
= *opindex_ptr
;
2838 fixups
[fc
].reloc
= reloc
;
2844 /* We need to generate a fixup for this expression. */
2845 if (fc
>= MAX_INSN_FIXUPS
)
2846 as_fatal (_("too many fixups"));
2847 fixups
[fc
].exp
= ex
;
2848 fixups
[fc
].opindex
= *opindex_ptr
;
2849 fixups
[fc
].reloc
= BFD_RELOC_UNUSED
;
2852 #endif /* OBJ_ELF */
2858 /* If expecting more operands, then we want to see "),". */
2859 if (*str
== endc
&& opindex_ptr
[1] != 0)
2863 while (ISSPACE (*str
));
2867 else if ((operand
->flags
& PPC_OPERAND_PARENS
) != 0)
2875 /* The call to expression should have advanced str past any
2878 && (endc
!= ',' || *str
!= '\0'))
2880 as_bad (_("syntax error; found `%c' but expected `%c'"), *str
, endc
);
2888 while (ISSPACE (*str
))
2892 as_bad (_("junk at end of line: `%s'"), str
);
2895 /* Do we need/want a APUinfo section? */
2896 if ((ppc_cpu
& PPC_OPCODE_E500MC
) != 0)
2898 /* These are all version "1". */
2899 if (opcode
->flags
& PPC_OPCODE_SPE
)
2900 ppc_apuinfo_section_add (PPC_APUINFO_SPE
, 1);
2901 if (opcode
->flags
& PPC_OPCODE_ISEL
)
2902 ppc_apuinfo_section_add (PPC_APUINFO_ISEL
, 1);
2903 if (opcode
->flags
& PPC_OPCODE_EFS
)
2904 ppc_apuinfo_section_add (PPC_APUINFO_EFS
, 1);
2905 if (opcode
->flags
& PPC_OPCODE_BRLOCK
)
2906 ppc_apuinfo_section_add (PPC_APUINFO_BRLOCK
, 1);
2907 if (opcode
->flags
& PPC_OPCODE_PMR
)
2908 ppc_apuinfo_section_add (PPC_APUINFO_PMR
, 1);
2909 if (opcode
->flags
& PPC_OPCODE_CACHELCK
)
2910 ppc_apuinfo_section_add (PPC_APUINFO_CACHELCK
, 1);
2911 if (opcode
->flags
& PPC_OPCODE_RFMCI
)
2912 ppc_apuinfo_section_add (PPC_APUINFO_RFMCI
, 1);
2916 /* Write out the instruction. */
2918 addr_mod
= frag_now_fix () & 3;
2919 if (frag_now
->has_code
&& frag_now
->insn_addr
!= addr_mod
)
2920 as_bad (_("instruction address is not a multiple of 4"));
2921 frag_now
->insn_addr
= addr_mod
;
2922 frag_now
->has_code
= 1;
2923 md_number_to_chars (f
, insn
, 4);
2926 dwarf2_emit_insn (4);
2929 /* Create any fixups. At this point we do not use a
2930 bfd_reloc_code_real_type, but instead just use the
2931 BFD_RELOC_UNUSED plus the operand index. This lets us easily
2932 handle fixups for any operand type, although that is admittedly
2933 not a very exciting feature. We pick a BFD reloc type in
2935 for (i
= 0; i
< fc
; i
++)
2937 if (fixups
[i
].reloc
!= BFD_RELOC_UNUSED
)
2939 reloc_howto_type
*reloc_howto
;
2944 reloc_howto
= bfd_reloc_type_lookup (stdoutput
, fixups
[i
].reloc
);
2948 size
= bfd_get_reloc_size (reloc_howto
);
2949 offset
= target_big_endian
? (4 - size
) : 0;
2951 if (size
< 1 || size
> 4)
2954 fixP
= fix_new_exp (frag_now
,
2955 f
- frag_now
->fr_literal
+ offset
,
2958 reloc_howto
->pc_relative
,
2961 /* Turn off complaints that the addend is too large for things like
2963 switch (fixups
[i
].reloc
)
2965 case BFD_RELOC_16_GOTOFF
:
2966 case BFD_RELOC_PPC_TOC16
:
2967 case BFD_RELOC_LO16
:
2968 case BFD_RELOC_HI16
:
2969 case BFD_RELOC_HI16_S
:
2971 case BFD_RELOC_PPC64_HIGHER
:
2972 case BFD_RELOC_PPC64_HIGHER_S
:
2973 case BFD_RELOC_PPC64_HIGHEST
:
2974 case BFD_RELOC_PPC64_HIGHEST_S
:
2976 fixP
->fx_no_overflow
= 1;
2984 const struct powerpc_operand
*operand
;
2986 operand
= &powerpc_operands
[fixups
[i
].opindex
];
2987 fix_new_exp (frag_now
,
2988 f
- frag_now
->fr_literal
,
2991 (operand
->flags
& PPC_OPERAND_RELATIVE
) != 0,
2992 ((bfd_reloc_code_real_type
)
2993 (fixups
[i
].opindex
+ (int) BFD_RELOC_UNUSED
)));
2998 /* Handle a macro. Gather all the operands, transform them as
2999 described by the macro, and call md_assemble recursively. All the
3000 operands are separated by commas; we don't accept parentheses
3001 around operands here. */
3004 ppc_macro (char *str
, const struct powerpc_macro
*macro
)
3015 /* Gather the users operands into the operands array. */
3020 if (count
>= sizeof operands
/ sizeof operands
[0])
3022 operands
[count
++] = s
;
3023 s
= strchr (s
, ',');
3024 if (s
== (char *) NULL
)
3029 if (count
!= macro
->operands
)
3031 as_bad (_("wrong number of operands"));
3035 /* Work out how large the string must be (the size is unbounded
3036 because it includes user input). */
3038 format
= macro
->format
;
3039 while (*format
!= '\0')
3048 arg
= strtol (format
+ 1, &send
, 10);
3049 know (send
!= format
&& arg
< count
);
3050 len
+= strlen (operands
[arg
]);
3055 /* Put the string together. */
3056 complete
= s
= (char *) alloca (len
+ 1);
3057 format
= macro
->format
;
3058 while (*format
!= '\0')
3064 arg
= strtol (format
+ 1, &send
, 10);
3065 strcpy (s
, operands
[arg
]);
3072 /* Assemble the constructed instruction. */
3073 md_assemble (complete
);
3077 /* For ELF, add support for SHF_EXCLUDE and SHT_ORDERED. */
3080 ppc_section_letter (int letter
, char **ptr_msg
)
3085 *ptr_msg
= _("Bad .section directive: want a,e,w,x,M,S,G,T in string");
3090 ppc_section_word (char *str
, size_t len
)
3092 if (len
== 7 && strncmp (str
, "exclude", 7) == 0)
3099 ppc_section_type (char *str
, size_t len
)
3101 if (len
== 7 && strncmp (str
, "ordered", 7) == 0)
3108 ppc_section_flags (flagword flags
, bfd_vma attr
, int type
)
3110 if (type
== SHT_ORDERED
)
3111 flags
|= SEC_ALLOC
| SEC_LOAD
| SEC_SORT_ENTRIES
;
3113 if (attr
& SHF_EXCLUDE
)
3114 flags
|= SEC_EXCLUDE
;
3118 #endif /* OBJ_ELF */
3121 /* Pseudo-op handling. */
3123 /* The .byte pseudo-op. This is similar to the normal .byte
3124 pseudo-op, but it can also take a single ASCII string. */
3127 ppc_byte (int ignore ATTRIBUTE_UNUSED
)
3129 if (*input_line_pointer
!= '\"')
3135 /* Gather characters. A real double quote is doubled. Unusual
3136 characters are not permitted. */
3137 ++input_line_pointer
;
3142 c
= *input_line_pointer
++;
3146 if (*input_line_pointer
!= '\"')
3148 ++input_line_pointer
;
3151 FRAG_APPEND_1_CHAR (c
);
3154 demand_empty_rest_of_line ();
3159 /* XCOFF specific pseudo-op handling. */
3161 /* This is set if we are creating a .stabx symbol, since we don't want
3162 to handle symbol suffixes for such symbols. */
3163 static bfd_boolean ppc_stab_symbol
;
3165 /* The .comm and .lcomm pseudo-ops for XCOFF. XCOFF puts common
3166 symbols in the .bss segment as though they were local common
3167 symbols, and uses a different smclas. The native Aix 4.3.3 assembler
3168 aligns .comm and .lcomm to 4 bytes. */
3171 ppc_comm (int lcomm
)
3173 asection
*current_seg
= now_seg
;
3174 subsegT current_subseg
= now_subseg
;
3180 symbolS
*lcomm_sym
= NULL
;
3184 name
= input_line_pointer
;
3185 endc
= get_symbol_end ();
3186 end_name
= input_line_pointer
;
3189 if (*input_line_pointer
!= ',')
3191 as_bad (_("missing size"));
3192 ignore_rest_of_line ();
3195 ++input_line_pointer
;
3197 size
= get_absolute_expression ();
3200 as_bad (_("negative size"));
3201 ignore_rest_of_line ();
3207 /* The third argument to .comm is the alignment. */
3208 if (*input_line_pointer
!= ',')
3212 ++input_line_pointer
;
3213 align
= get_absolute_expression ();
3216 as_warn (_("ignoring bad alignment"));
3231 /* The third argument to .lcomm appears to be the real local
3232 common symbol to create. References to the symbol named in
3233 the first argument are turned into references to the third
3235 if (*input_line_pointer
!= ',')
3237 as_bad (_("missing real symbol name"));
3238 ignore_rest_of_line ();
3241 ++input_line_pointer
;
3243 lcomm_name
= input_line_pointer
;
3244 lcomm_endc
= get_symbol_end ();
3246 lcomm_sym
= symbol_find_or_make (lcomm_name
);
3248 *input_line_pointer
= lcomm_endc
;
3252 sym
= symbol_find_or_make (name
);
3255 if (S_IS_DEFINED (sym
)
3256 || S_GET_VALUE (sym
) != 0)
3258 as_bad (_("attempt to redefine symbol"));
3259 ignore_rest_of_line ();
3263 record_alignment (bss_section
, align
);
3266 || ! S_IS_DEFINED (lcomm_sym
))
3275 S_SET_EXTERNAL (sym
);
3279 symbol_get_tc (lcomm_sym
)->output
= 1;
3280 def_sym
= lcomm_sym
;
3284 subseg_set (bss_section
, 1);
3285 frag_align (align
, 0, 0);
3287 symbol_set_frag (def_sym
, frag_now
);
3288 pfrag
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, def_sym
,
3289 def_size
, (char *) NULL
);
3291 S_SET_SEGMENT (def_sym
, bss_section
);
3292 symbol_get_tc (def_sym
)->align
= align
;
3296 /* Align the size of lcomm_sym. */
3297 symbol_get_frag (lcomm_sym
)->fr_offset
=
3298 ((symbol_get_frag (lcomm_sym
)->fr_offset
+ (1 << align
) - 1)
3299 &~ ((1 << align
) - 1));
3300 if (align
> symbol_get_tc (lcomm_sym
)->align
)
3301 symbol_get_tc (lcomm_sym
)->align
= align
;
3306 /* Make sym an offset from lcomm_sym. */
3307 S_SET_SEGMENT (sym
, bss_section
);
3308 symbol_set_frag (sym
, symbol_get_frag (lcomm_sym
));
3309 S_SET_VALUE (sym
, symbol_get_frag (lcomm_sym
)->fr_offset
);
3310 symbol_get_frag (lcomm_sym
)->fr_offset
+= size
;
3313 subseg_set (current_seg
, current_subseg
);
3315 demand_empty_rest_of_line ();
3318 /* The .csect pseudo-op. This switches us into a different
3319 subsegment. The first argument is a symbol whose value is the
3320 start of the .csect. In COFF, csect symbols get special aux
3321 entries defined by the x_csect field of union internal_auxent. The
3322 optional second argument is the alignment (the default is 2). */
3325 ppc_csect (int ignore ATTRIBUTE_UNUSED
)
3332 name
= input_line_pointer
;
3333 endc
= get_symbol_end ();
3335 sym
= symbol_find_or_make (name
);
3337 *input_line_pointer
= endc
;
3339 if (S_GET_NAME (sym
)[0] == '\0')
3341 /* An unnamed csect is assumed to be [PR]. */
3342 symbol_get_tc (sym
)->symbol_class
= XMC_PR
;
3346 if (*input_line_pointer
== ',')
3348 ++input_line_pointer
;
3349 align
= get_absolute_expression ();
3352 ppc_change_csect (sym
, align
);
3354 demand_empty_rest_of_line ();
3357 /* Change to a different csect. */
3360 ppc_change_csect (symbolS
*sym
, offsetT align
)
3362 if (S_IS_DEFINED (sym
))
3363 subseg_set (S_GET_SEGMENT (sym
), symbol_get_tc (sym
)->subseg
);
3373 /* This is a new csect. We need to look at the symbol class to
3374 figure out whether it should go in the text section or the
3378 switch (symbol_get_tc (sym
)->symbol_class
)
3388 S_SET_SEGMENT (sym
, text_section
);
3389 symbol_get_tc (sym
)->subseg
= ppc_text_subsegment
;
3390 ++ppc_text_subsegment
;
3391 list_ptr
= &ppc_text_csects
;
3401 if (ppc_toc_csect
!= NULL
3402 && (symbol_get_tc (ppc_toc_csect
)->subseg
+ 1
3403 == ppc_data_subsegment
))
3405 S_SET_SEGMENT (sym
, data_section
);
3406 symbol_get_tc (sym
)->subseg
= ppc_data_subsegment
;
3407 ++ppc_data_subsegment
;
3408 list_ptr
= &ppc_data_csects
;
3414 /* We set the obstack chunk size to a small value before
3415 changing subsegments, so that we don't use a lot of memory
3416 space for what may be a small section. */
3417 hold_chunksize
= chunksize
;
3420 sec
= subseg_new (segment_name (S_GET_SEGMENT (sym
)),
3421 symbol_get_tc (sym
)->subseg
);
3423 chunksize
= hold_chunksize
;
3426 ppc_after_toc_frag
= frag_now
;
3428 record_alignment (sec
, align
);
3430 frag_align_code (align
, 0);
3432 frag_align (align
, 0, 0);
3434 symbol_set_frag (sym
, frag_now
);
3435 S_SET_VALUE (sym
, (valueT
) frag_now_fix ());
3437 symbol_get_tc (sym
)->align
= align
;
3438 symbol_get_tc (sym
)->output
= 1;
3439 symbol_get_tc (sym
)->within
= sym
;
3441 for (list
= *list_ptr
;
3442 symbol_get_tc (list
)->next
!= (symbolS
*) NULL
;
3443 list
= symbol_get_tc (list
)->next
)
3445 symbol_get_tc (list
)->next
= sym
;
3447 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
3448 symbol_append (sym
, symbol_get_tc (list
)->within
, &symbol_rootP
,
3452 ppc_current_csect
= sym
;
3455 /* This function handles the .text and .data pseudo-ops. These
3456 pseudo-ops aren't really used by XCOFF; we implement them for the
3457 convenience of people who aren't used to XCOFF. */
3460 ppc_section (int type
)
3467 else if (type
== 'd')
3472 sym
= symbol_find_or_make (name
);
3474 ppc_change_csect (sym
, 2);
3476 demand_empty_rest_of_line ();
3479 /* This function handles the .section pseudo-op. This is mostly to
3480 give an error, since XCOFF only supports .text, .data and .bss, but
3481 we do permit the user to name the text or data section. */
3484 ppc_named_section (int ignore ATTRIBUTE_UNUSED
)
3487 const char *real_name
;
3491 user_name
= input_line_pointer
;
3492 c
= get_symbol_end ();
3494 if (strcmp (user_name
, ".text") == 0)
3495 real_name
= ".text[PR]";
3496 else if (strcmp (user_name
, ".data") == 0)
3497 real_name
= ".data[RW]";
3500 as_bad (_("The XCOFF file format does not support arbitrary sections"));
3501 *input_line_pointer
= c
;
3502 ignore_rest_of_line ();
3506 *input_line_pointer
= c
;
3508 sym
= symbol_find_or_make (real_name
);
3510 ppc_change_csect (sym
, 2);
3512 demand_empty_rest_of_line ();
3515 /* The .extern pseudo-op. We create an undefined symbol. */
3518 ppc_extern (int ignore ATTRIBUTE_UNUSED
)
3523 name
= input_line_pointer
;
3524 endc
= get_symbol_end ();
3526 (void) symbol_find_or_make (name
);
3528 *input_line_pointer
= endc
;
3530 demand_empty_rest_of_line ();
3533 /* The .lglobl pseudo-op. Keep the symbol in the symbol table. */
3536 ppc_lglobl (int ignore ATTRIBUTE_UNUSED
)
3542 name
= input_line_pointer
;
3543 endc
= get_symbol_end ();
3545 sym
= symbol_find_or_make (name
);
3547 *input_line_pointer
= endc
;
3549 symbol_get_tc (sym
)->output
= 1;
3551 demand_empty_rest_of_line ();
3554 /* The .rename pseudo-op. The RS/6000 assembler can rename symbols,
3555 although I don't know why it bothers. */
3558 ppc_rename (int ignore ATTRIBUTE_UNUSED
)
3565 name
= input_line_pointer
;
3566 endc
= get_symbol_end ();
3568 sym
= symbol_find_or_make (name
);
3570 *input_line_pointer
= endc
;
3572 if (*input_line_pointer
!= ',')
3574 as_bad (_("missing rename string"));
3575 ignore_rest_of_line ();
3578 ++input_line_pointer
;
3580 symbol_get_tc (sym
)->real_name
= demand_copy_C_string (&len
);
3582 demand_empty_rest_of_line ();
3585 /* The .stabx pseudo-op. This is similar to a normal .stabs
3586 pseudo-op, but slightly different. A sample is
3587 .stabx "main:F-1",.main,142,0
3588 The first argument is the symbol name to create. The second is the
3589 value, and the third is the storage class. The fourth seems to be
3590 always zero, and I am assuming it is the type. */
3593 ppc_stabx (int ignore ATTRIBUTE_UNUSED
)
3600 name
= demand_copy_C_string (&len
);
3602 if (*input_line_pointer
!= ',')
3604 as_bad (_("missing value"));
3607 ++input_line_pointer
;
3609 ppc_stab_symbol
= TRUE
;
3610 sym
= symbol_make (name
);
3611 ppc_stab_symbol
= FALSE
;
3613 symbol_get_tc (sym
)->real_name
= name
;
3615 (void) expression (&exp
);
3622 as_bad (_("illegal .stabx expression; zero assumed"));
3623 exp
.X_add_number
= 0;
3626 S_SET_VALUE (sym
, (valueT
) exp
.X_add_number
);
3627 symbol_set_frag (sym
, &zero_address_frag
);
3631 if (S_GET_SEGMENT (exp
.X_add_symbol
) == undefined_section
)
3632 symbol_set_value_expression (sym
, &exp
);
3636 exp
.X_add_number
+ S_GET_VALUE (exp
.X_add_symbol
));
3637 symbol_set_frag (sym
, symbol_get_frag (exp
.X_add_symbol
));
3642 /* The value is some complex expression. This will probably
3643 fail at some later point, but this is probably the right
3644 thing to do here. */
3645 symbol_set_value_expression (sym
, &exp
);
3649 S_SET_SEGMENT (sym
, ppc_coff_debug_section
);
3650 symbol_get_bfdsym (sym
)->flags
|= BSF_DEBUGGING
;
3652 if (*input_line_pointer
!= ',')
3654 as_bad (_("missing class"));
3657 ++input_line_pointer
;
3659 S_SET_STORAGE_CLASS (sym
, get_absolute_expression ());
3661 if (*input_line_pointer
!= ',')
3663 as_bad (_("missing type"));
3666 ++input_line_pointer
;
3668 S_SET_DATA_TYPE (sym
, get_absolute_expression ());
3670 symbol_get_tc (sym
)->output
= 1;
3672 if (S_GET_STORAGE_CLASS (sym
) == C_STSYM
) {
3674 symbol_get_tc (sym
)->within
= ppc_current_block
;
3679 .stabx "z",arrays_,133,0
3682 .comm arrays_,13768,3
3684 resolve_symbol_value will copy the exp's "within" into sym's when the
3685 offset is 0. Since this seems to be corner case problem,
3686 only do the correction for storage class C_STSYM. A better solution
3687 would be to have the tc field updated in ppc_symbol_new_hook. */
3689 if (exp
.X_op
== O_symbol
)
3691 symbol_get_tc (exp
.X_add_symbol
)->within
= ppc_current_block
;
3695 if (exp
.X_op
!= O_symbol
3696 || ! S_IS_EXTERNAL (exp
.X_add_symbol
)
3697 || S_GET_SEGMENT (exp
.X_add_symbol
) != bss_section
)
3698 ppc_frob_label (sym
);
3701 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
3702 symbol_append (sym
, exp
.X_add_symbol
, &symbol_rootP
, &symbol_lastP
);
3703 if (symbol_get_tc (ppc_current_csect
)->within
== exp
.X_add_symbol
)
3704 symbol_get_tc (ppc_current_csect
)->within
= sym
;
3707 demand_empty_rest_of_line ();
3710 /* The .function pseudo-op. This takes several arguments. The first
3711 argument seems to be the external name of the symbol. The second
3712 argument seems to be the label for the start of the function. gcc
3713 uses the same name for both. I have no idea what the third and
3714 fourth arguments are meant to be. The optional fifth argument is
3715 an expression for the size of the function. In COFF this symbol
3716 gets an aux entry like that used for a csect. */
3719 ppc_function (int ignore ATTRIBUTE_UNUSED
)
3727 name
= input_line_pointer
;
3728 endc
= get_symbol_end ();
3730 /* Ignore any [PR] suffix. */
3731 name
= ppc_canonicalize_symbol_name (name
);
3732 s
= strchr (name
, '[');
3733 if (s
!= (char *) NULL
3734 && strcmp (s
+ 1, "PR]") == 0)
3737 ext_sym
= symbol_find_or_make (name
);
3739 *input_line_pointer
= endc
;
3741 if (*input_line_pointer
!= ',')
3743 as_bad (_("missing symbol name"));
3744 ignore_rest_of_line ();
3747 ++input_line_pointer
;
3749 name
= input_line_pointer
;
3750 endc
= get_symbol_end ();
3752 lab_sym
= symbol_find_or_make (name
);
3754 *input_line_pointer
= endc
;
3756 if (ext_sym
!= lab_sym
)
3760 exp
.X_op
= O_symbol
;
3761 exp
.X_add_symbol
= lab_sym
;
3762 exp
.X_op_symbol
= NULL
;
3763 exp
.X_add_number
= 0;
3765 symbol_set_value_expression (ext_sym
, &exp
);
3768 if (symbol_get_tc (ext_sym
)->symbol_class
== -1)
3769 symbol_get_tc (ext_sym
)->symbol_class
= XMC_PR
;
3770 symbol_get_tc (ext_sym
)->output
= 1;
3772 if (*input_line_pointer
== ',')
3776 /* Ignore the third argument. */
3777 ++input_line_pointer
;
3778 expression (&ignore
);
3779 if (*input_line_pointer
== ',')
3781 /* Ignore the fourth argument. */
3782 ++input_line_pointer
;
3783 expression (&ignore
);
3784 if (*input_line_pointer
== ',')
3786 /* The fifth argument is the function size. */
3787 ++input_line_pointer
;
3788 symbol_get_tc (ext_sym
)->size
= symbol_new ("L0\001",
3791 &zero_address_frag
);
3792 pseudo_set (symbol_get_tc (ext_sym
)->size
);
3797 S_SET_DATA_TYPE (ext_sym
, DT_FCN
<< N_BTSHFT
);
3798 SF_SET_FUNCTION (ext_sym
);
3799 SF_SET_PROCESS (ext_sym
);
3800 coff_add_linesym (ext_sym
);
3802 demand_empty_rest_of_line ();
3805 /* The .bf pseudo-op. This is just like a COFF C_FCN symbol named
3806 ".bf". If the pseudo op .bi was seen before .bf, patch the .bi sym
3807 with the correct line number */
3809 static symbolS
*saved_bi_sym
= 0;
3812 ppc_bf (int ignore ATTRIBUTE_UNUSED
)
3816 sym
= symbol_make (".bf");
3817 S_SET_SEGMENT (sym
, text_section
);
3818 symbol_set_frag (sym
, frag_now
);
3819 S_SET_VALUE (sym
, frag_now_fix ());
3820 S_SET_STORAGE_CLASS (sym
, C_FCN
);
3822 coff_line_base
= get_absolute_expression ();
3824 S_SET_NUMBER_AUXILIARY (sym
, 1);
3825 SA_SET_SYM_LNNO (sym
, coff_line_base
);
3827 /* Line number for bi. */
3830 S_SET_VALUE (saved_bi_sym
, coff_n_line_nos
);
3835 symbol_get_tc (sym
)->output
= 1;
3837 ppc_frob_label (sym
);
3839 demand_empty_rest_of_line ();
3842 /* The .ef pseudo-op. This is just like a COFF C_FCN symbol named
3843 ".ef", except that the line number is absolute, not relative to the
3844 most recent ".bf" symbol. */
3847 ppc_ef (int ignore ATTRIBUTE_UNUSED
)
3851 sym
= symbol_make (".ef");
3852 S_SET_SEGMENT (sym
, text_section
);
3853 symbol_set_frag (sym
, frag_now
);
3854 S_SET_VALUE (sym
, frag_now_fix ());
3855 S_SET_STORAGE_CLASS (sym
, C_FCN
);
3856 S_SET_NUMBER_AUXILIARY (sym
, 1);
3857 SA_SET_SYM_LNNO (sym
, get_absolute_expression ());
3858 symbol_get_tc (sym
)->output
= 1;
3860 ppc_frob_label (sym
);
3862 demand_empty_rest_of_line ();
3865 /* The .bi and .ei pseudo-ops. These take a string argument and
3866 generates a C_BINCL or C_EINCL symbol, which goes at the start of
3867 the symbol list. The value of .bi will be know when the next .bf
3873 static symbolS
*last_biei
;
3880 name
= demand_copy_C_string (&len
);
3882 /* The value of these symbols is actually file offset. Here we set
3883 the value to the index into the line number entries. In
3884 ppc_frob_symbols we set the fix_line field, which will cause BFD
3885 to do the right thing. */
3887 sym
= symbol_make (name
);
3888 /* obj-coff.c currently only handles line numbers correctly in the
3890 S_SET_SEGMENT (sym
, text_section
);
3891 S_SET_VALUE (sym
, coff_n_line_nos
);
3892 symbol_get_bfdsym (sym
)->flags
|= BSF_DEBUGGING
;
3894 S_SET_STORAGE_CLASS (sym
, ei
? C_EINCL
: C_BINCL
);
3895 symbol_get_tc (sym
)->output
= 1;
3903 for (look
= last_biei
? last_biei
: symbol_rootP
;
3904 (look
!= (symbolS
*) NULL
3905 && (S_GET_STORAGE_CLASS (look
) == C_FILE
3906 || S_GET_STORAGE_CLASS (look
) == C_BINCL
3907 || S_GET_STORAGE_CLASS (look
) == C_EINCL
));
3908 look
= symbol_next (look
))
3910 if (look
!= (symbolS
*) NULL
)
3912 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
3913 symbol_insert (sym
, look
, &symbol_rootP
, &symbol_lastP
);
3917 demand_empty_rest_of_line ();
3920 /* The .bs pseudo-op. This generates a C_BSTAT symbol named ".bs".
3921 There is one argument, which is a csect symbol. The value of the
3922 .bs symbol is the index of this csect symbol. */
3925 ppc_bs (int ignore ATTRIBUTE_UNUSED
)
3932 if (ppc_current_block
!= NULL
)
3933 as_bad (_("nested .bs blocks"));
3935 name
= input_line_pointer
;
3936 endc
= get_symbol_end ();
3938 csect
= symbol_find_or_make (name
);
3940 *input_line_pointer
= endc
;
3942 sym
= symbol_make (".bs");
3943 S_SET_SEGMENT (sym
, now_seg
);
3944 S_SET_STORAGE_CLASS (sym
, C_BSTAT
);
3945 symbol_get_bfdsym (sym
)->flags
|= BSF_DEBUGGING
;
3946 symbol_get_tc (sym
)->output
= 1;
3948 symbol_get_tc (sym
)->within
= csect
;
3950 ppc_frob_label (sym
);
3952 ppc_current_block
= sym
;
3954 demand_empty_rest_of_line ();
3957 /* The .es pseudo-op. Generate a C_ESTART symbol named .es. */
3960 ppc_es (int ignore ATTRIBUTE_UNUSED
)
3964 if (ppc_current_block
== NULL
)
3965 as_bad (_(".es without preceding .bs"));
3967 sym
= symbol_make (".es");
3968 S_SET_SEGMENT (sym
, now_seg
);
3969 S_SET_STORAGE_CLASS (sym
, C_ESTAT
);
3970 symbol_get_bfdsym (sym
)->flags
|= BSF_DEBUGGING
;
3971 symbol_get_tc (sym
)->output
= 1;
3973 ppc_frob_label (sym
);
3975 ppc_current_block
= NULL
;
3977 demand_empty_rest_of_line ();
3980 /* The .bb pseudo-op. Generate a C_BLOCK symbol named .bb, with a
3984 ppc_bb (int ignore ATTRIBUTE_UNUSED
)
3988 sym
= symbol_make (".bb");
3989 S_SET_SEGMENT (sym
, text_section
);
3990 symbol_set_frag (sym
, frag_now
);
3991 S_SET_VALUE (sym
, frag_now_fix ());
3992 S_SET_STORAGE_CLASS (sym
, C_BLOCK
);
3994 S_SET_NUMBER_AUXILIARY (sym
, 1);
3995 SA_SET_SYM_LNNO (sym
, get_absolute_expression ());
3997 symbol_get_tc (sym
)->output
= 1;
3999 SF_SET_PROCESS (sym
);
4001 ppc_frob_label (sym
);
4003 demand_empty_rest_of_line ();
4006 /* The .eb pseudo-op. Generate a C_BLOCK symbol named .eb, with a
4010 ppc_eb (int ignore ATTRIBUTE_UNUSED
)
4014 sym
= symbol_make (".eb");
4015 S_SET_SEGMENT (sym
, text_section
);
4016 symbol_set_frag (sym
, frag_now
);
4017 S_SET_VALUE (sym
, frag_now_fix ());
4018 S_SET_STORAGE_CLASS (sym
, C_BLOCK
);
4019 S_SET_NUMBER_AUXILIARY (sym
, 1);
4020 SA_SET_SYM_LNNO (sym
, get_absolute_expression ());
4021 symbol_get_tc (sym
)->output
= 1;
4023 SF_SET_PROCESS (sym
);
4025 ppc_frob_label (sym
);
4027 demand_empty_rest_of_line ();
4030 /* The .bc pseudo-op. This just creates a C_BCOMM symbol with a
4034 ppc_bc (int ignore ATTRIBUTE_UNUSED
)
4040 name
= demand_copy_C_string (&len
);
4041 sym
= symbol_make (name
);
4042 S_SET_SEGMENT (sym
, ppc_coff_debug_section
);
4043 symbol_get_bfdsym (sym
)->flags
|= BSF_DEBUGGING
;
4044 S_SET_STORAGE_CLASS (sym
, C_BCOMM
);
4045 S_SET_VALUE (sym
, 0);
4046 symbol_get_tc (sym
)->output
= 1;
4048 ppc_frob_label (sym
);
4050 demand_empty_rest_of_line ();
4053 /* The .ec pseudo-op. This just creates a C_ECOMM symbol. */
4056 ppc_ec (int ignore ATTRIBUTE_UNUSED
)
4060 sym
= symbol_make (".ec");
4061 S_SET_SEGMENT (sym
, ppc_coff_debug_section
);
4062 symbol_get_bfdsym (sym
)->flags
|= BSF_DEBUGGING
;
4063 S_SET_STORAGE_CLASS (sym
, C_ECOMM
);
4064 S_SET_VALUE (sym
, 0);
4065 symbol_get_tc (sym
)->output
= 1;
4067 ppc_frob_label (sym
);
4069 demand_empty_rest_of_line ();
4072 /* The .toc pseudo-op. Switch to the .toc subsegment. */
4075 ppc_toc (int ignore ATTRIBUTE_UNUSED
)
4077 if (ppc_toc_csect
!= (symbolS
*) NULL
)
4078 subseg_set (data_section
, symbol_get_tc (ppc_toc_csect
)->subseg
);
4085 subseg
= ppc_data_subsegment
;
4086 ++ppc_data_subsegment
;
4088 subseg_new (segment_name (data_section
), subseg
);
4089 ppc_toc_frag
= frag_now
;
4091 sym
= symbol_find_or_make ("TOC[TC0]");
4092 symbol_set_frag (sym
, frag_now
);
4093 S_SET_SEGMENT (sym
, data_section
);
4094 S_SET_VALUE (sym
, (valueT
) frag_now_fix ());
4095 symbol_get_tc (sym
)->subseg
= subseg
;
4096 symbol_get_tc (sym
)->output
= 1;
4097 symbol_get_tc (sym
)->within
= sym
;
4099 ppc_toc_csect
= sym
;
4101 for (list
= ppc_data_csects
;
4102 symbol_get_tc (list
)->next
!= (symbolS
*) NULL
;
4103 list
= symbol_get_tc (list
)->next
)
4105 symbol_get_tc (list
)->next
= sym
;
4107 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
4108 symbol_append (sym
, symbol_get_tc (list
)->within
, &symbol_rootP
,
4112 ppc_current_csect
= ppc_toc_csect
;
4114 demand_empty_rest_of_line ();
4117 /* The AIX assembler automatically aligns the operands of a .long or
4118 .short pseudo-op, and we want to be compatible. */
4121 ppc_xcoff_cons (int log_size
)
4123 frag_align (log_size
, 0, 0);
4124 record_alignment (now_seg
, log_size
);
4125 cons (1 << log_size
);
4129 ppc_vbyte (int dummy ATTRIBUTE_UNUSED
)
4134 (void) expression (&exp
);
4136 if (exp
.X_op
!= O_constant
)
4138 as_bad (_("non-constant byte count"));
4142 byte_count
= exp
.X_add_number
;
4144 if (*input_line_pointer
!= ',')
4146 as_bad (_("missing value"));
4150 ++input_line_pointer
;
4154 #endif /* OBJ_XCOFF */
4155 #if defined (OBJ_XCOFF) || defined (OBJ_ELF)
4157 /* The .tc pseudo-op. This is used when generating either XCOFF or
4158 ELF. This takes two or more arguments.
4160 When generating XCOFF output, the first argument is the name to
4161 give to this location in the toc; this will be a symbol with class
4162 TC. The rest of the arguments are N-byte values to actually put at
4163 this location in the TOC; often there is just one more argument, a
4164 relocatable symbol reference. The size of the value to store
4165 depends on target word size. A 32-bit target uses 4-byte values, a
4166 64-bit target uses 8-byte values.
4168 When not generating XCOFF output, the arguments are the same, but
4169 the first argument is simply ignored. */
4172 ppc_tc (int ignore ATTRIBUTE_UNUSED
)
4176 /* Define the TOC symbol name. */
4182 if (ppc_toc_csect
== (symbolS
*) NULL
4183 || ppc_toc_csect
!= ppc_current_csect
)
4185 as_bad (_(".tc not in .toc section"));
4186 ignore_rest_of_line ();
4190 name
= input_line_pointer
;
4191 endc
= get_symbol_end ();
4193 sym
= symbol_find_or_make (name
);
4195 *input_line_pointer
= endc
;
4197 if (S_IS_DEFINED (sym
))
4201 label
= symbol_get_tc (ppc_current_csect
)->within
;
4202 if (symbol_get_tc (label
)->symbol_class
!= XMC_TC0
)
4204 as_bad (_(".tc with no label"));
4205 ignore_rest_of_line ();
4209 S_SET_SEGMENT (label
, S_GET_SEGMENT (sym
));
4210 symbol_set_frag (label
, symbol_get_frag (sym
));
4211 S_SET_VALUE (label
, S_GET_VALUE (sym
));
4213 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
4214 ++input_line_pointer
;
4219 S_SET_SEGMENT (sym
, now_seg
);
4220 symbol_set_frag (sym
, frag_now
);
4221 S_SET_VALUE (sym
, (valueT
) frag_now_fix ());
4222 symbol_get_tc (sym
)->symbol_class
= XMC_TC
;
4223 symbol_get_tc (sym
)->output
= 1;
4225 ppc_frob_label (sym
);
4228 #endif /* OBJ_XCOFF */
4232 /* Skip the TOC symbol name. */
4233 while (is_part_of_name (*input_line_pointer
)
4234 || *input_line_pointer
== ' '
4235 || *input_line_pointer
== '['
4236 || *input_line_pointer
== ']'
4237 || *input_line_pointer
== '{'
4238 || *input_line_pointer
== '}')
4239 ++input_line_pointer
;
4241 /* Align to a four/eight byte boundary. */
4242 align
= ppc_obj64
? 3 : 2;
4243 frag_align (align
, 0, 0);
4244 record_alignment (now_seg
, align
);
4245 #endif /* OBJ_ELF */
4247 if (*input_line_pointer
!= ',')
4248 demand_empty_rest_of_line ();
4251 ++input_line_pointer
;
4252 cons (ppc_obj64
? 8 : 4);
4256 /* Pseudo-op .machine. */
4259 ppc_machine (int ignore ATTRIBUTE_UNUSED
)
4262 #define MAX_HISTORY 100
4263 static ppc_cpu_t
*cpu_history
;
4264 static int curr_hist
;
4268 if (*input_line_pointer
== '"')
4271 cpu_string
= demand_copy_C_string (&len
);
4276 cpu_string
= input_line_pointer
;
4277 c
= get_symbol_end ();
4278 cpu_string
= xstrdup (cpu_string
);
4279 *input_line_pointer
= c
;
4282 if (cpu_string
!= NULL
)
4284 ppc_cpu_t old_cpu
= ppc_cpu
;
4288 for (p
= cpu_string
; *p
!= 0; p
++)
4291 if (strcmp (cpu_string
, "push") == 0)
4293 if (cpu_history
== NULL
)
4294 cpu_history
= xmalloc (MAX_HISTORY
* sizeof (*cpu_history
));
4296 if (curr_hist
>= MAX_HISTORY
)
4297 as_bad (_(".machine stack overflow"));
4299 cpu_history
[curr_hist
++] = ppc_cpu
;
4301 else if (strcmp (cpu_string
, "pop") == 0)
4304 as_bad (_(".machine stack underflow"));
4306 ppc_cpu
= cpu_history
[--curr_hist
];
4308 else if ((new_cpu
= ppc_parse_cpu (ppc_cpu
, cpu_string
)) != 0)
4311 as_bad (_("invalid machine `%s'"), cpu_string
);
4313 if (ppc_cpu
!= old_cpu
)
4314 ppc_setup_opcodes ();
4317 demand_empty_rest_of_line ();
4320 /* See whether a symbol is in the TOC section. */
4323 ppc_is_toc_sym (symbolS
*sym
)
4326 return symbol_get_tc (sym
)->symbol_class
== XMC_TC
;
4329 const char *sname
= segment_name (S_GET_SEGMENT (sym
));
4331 return strcmp (sname
, ".toc") == 0;
4333 return strcmp (sname
, ".got") == 0;
4336 #endif /* defined (OBJ_XCOFF) || defined (OBJ_ELF) */
4340 /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format. */
4342 /* Set the current section. */
4344 ppc_set_current_section (segT
new)
4346 ppc_previous_section
= ppc_current_section
;
4347 ppc_current_section
= new;
4350 /* pseudo-op: .previous
4351 behaviour: toggles the current section with the previous section.
4353 warnings: "No previous section" */
4356 ppc_previous (int ignore ATTRIBUTE_UNUSED
)
4360 if (ppc_previous_section
== NULL
)
4362 as_warn (_("No previous section to return to. Directive ignored."));
4366 subseg_set (ppc_previous_section
, 0);
4368 ppc_set_current_section (ppc_previous_section
);
4371 /* pseudo-op: .pdata
4372 behaviour: predefined read only data section
4376 initial: .section .pdata "adr3"
4377 a - don't know -- maybe a misprint
4378 d - initialized data
4380 3 - double word aligned (that would be 4 byte boundary)
4383 Tag index tables (also known as the function table) for exception
4384 handling, debugging, etc. */
4387 ppc_pdata (int ignore ATTRIBUTE_UNUSED
)
4389 if (pdata_section
== 0)
4391 pdata_section
= subseg_new (".pdata", 0);
4393 bfd_set_section_flags (stdoutput
, pdata_section
,
4394 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
4395 | SEC_READONLY
| SEC_DATA
));
4397 bfd_set_section_alignment (stdoutput
, pdata_section
, 2);
4401 pdata_section
= subseg_new (".pdata", 0);
4403 ppc_set_current_section (pdata_section
);
4406 /* pseudo-op: .ydata
4407 behaviour: predefined read only data section
4411 initial: .section .ydata "drw3"
4412 a - don't know -- maybe a misprint
4413 d - initialized data
4415 3 - double word aligned (that would be 4 byte boundary)
4417 Tag tables (also known as the scope table) for exception handling,
4421 ppc_ydata (int ignore ATTRIBUTE_UNUSED
)
4423 if (ydata_section
== 0)
4425 ydata_section
= subseg_new (".ydata", 0);
4426 bfd_set_section_flags (stdoutput
, ydata_section
,
4427 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
4428 | SEC_READONLY
| SEC_DATA
));
4430 bfd_set_section_alignment (stdoutput
, ydata_section
, 3);
4434 ydata_section
= subseg_new (".ydata", 0);
4436 ppc_set_current_section (ydata_section
);
4439 /* pseudo-op: .reldata
4440 behaviour: predefined read write data section
4441 double word aligned (4-byte)
4442 FIXME: relocation is applied to it
4443 FIXME: what's the difference between this and .data?
4446 initial: .section .reldata "drw3"
4447 d - initialized data
4450 3 - double word aligned (that would be 8 byte boundary)
4453 Like .data, but intended to hold data subject to relocation, such as
4454 function descriptors, etc. */
4457 ppc_reldata (int ignore ATTRIBUTE_UNUSED
)
4459 if (reldata_section
== 0)
4461 reldata_section
= subseg_new (".reldata", 0);
4463 bfd_set_section_flags (stdoutput
, reldata_section
,
4464 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
4467 bfd_set_section_alignment (stdoutput
, reldata_section
, 2);
4471 reldata_section
= subseg_new (".reldata", 0);
4473 ppc_set_current_section (reldata_section
);
4476 /* pseudo-op: .rdata
4477 behaviour: predefined read only data section
4481 initial: .section .rdata "dr3"
4482 d - initialized data
4484 3 - double word aligned (that would be 4 byte boundary) */
4487 ppc_rdata (int ignore ATTRIBUTE_UNUSED
)
4489 if (rdata_section
== 0)
4491 rdata_section
= subseg_new (".rdata", 0);
4492 bfd_set_section_flags (stdoutput
, rdata_section
,
4493 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
4494 | SEC_READONLY
| SEC_DATA
));
4496 bfd_set_section_alignment (stdoutput
, rdata_section
, 2);
4500 rdata_section
= subseg_new (".rdata", 0);
4502 ppc_set_current_section (rdata_section
);
4505 /* pseudo-op: .ualong
4506 behaviour: much like .int, with the exception that no alignment is
4508 FIXME: test the alignment statement
4513 ppc_ualong (int ignore ATTRIBUTE_UNUSED
)
4519 /* pseudo-op: .znop <symbol name>
4520 behaviour: Issue a nop instruction
4521 Issue a IMAGE_REL_PPC_IFGLUE relocation against it, using
4522 the supplied symbol name.
4524 warnings: Missing symbol name */
4527 ppc_znop (int ignore ATTRIBUTE_UNUSED
)
4530 const struct powerpc_opcode
*opcode
;
4541 /* Strip out the symbol name. */
4542 symbol_name
= input_line_pointer
;
4543 c
= get_symbol_end ();
4545 name
= xmalloc (input_line_pointer
- symbol_name
+ 1);
4546 strcpy (name
, symbol_name
);
4548 sym
= symbol_find_or_make (name
);
4550 *input_line_pointer
= c
;
4554 /* Look up the opcode in the hash table. */
4555 opcode
= (const struct powerpc_opcode
*) hash_find (ppc_hash
, "nop");
4557 /* Stick in the nop. */
4558 insn
= opcode
->opcode
;
4560 /* Write out the instruction. */
4562 md_number_to_chars (f
, insn
, 4);
4564 f
- frag_now
->fr_literal
,
4569 BFD_RELOC_16_GOT_PCREL
);
4579 ppc_pe_comm (int lcomm
)
4588 name
= input_line_pointer
;
4589 c
= get_symbol_end ();
4591 /* just after name is now '\0'. */
4592 p
= input_line_pointer
;
4595 if (*input_line_pointer
!= ',')
4597 as_bad (_("Expected comma after symbol-name: rest of line ignored."));
4598 ignore_rest_of_line ();
4602 input_line_pointer
++; /* skip ',' */
4603 if ((temp
= get_absolute_expression ()) < 0)
4605 as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) temp
);
4606 ignore_rest_of_line ();
4612 /* The third argument to .comm is the alignment. */
4613 if (*input_line_pointer
!= ',')
4617 ++input_line_pointer
;
4618 align
= get_absolute_expression ();
4621 as_warn (_("ignoring bad alignment"));
4628 symbolP
= symbol_find_or_make (name
);
4631 if (S_IS_DEFINED (symbolP
) && ! S_IS_COMMON (symbolP
))
4633 as_bad (_("Ignoring attempt to re-define symbol `%s'."),
4634 S_GET_NAME (symbolP
));
4635 ignore_rest_of_line ();
4639 if (S_GET_VALUE (symbolP
))
4641 if (S_GET_VALUE (symbolP
) != (valueT
) temp
)
4642 as_bad (_("Length of .comm \"%s\" is already %ld. Not changed to %ld."),
4643 S_GET_NAME (symbolP
),
4644 (long) S_GET_VALUE (symbolP
),
4649 S_SET_VALUE (symbolP
, (valueT
) temp
);
4650 S_SET_EXTERNAL (symbolP
);
4651 S_SET_SEGMENT (symbolP
, bfd_com_section_ptr
);
4654 demand_empty_rest_of_line ();
4658 * implement the .section pseudo op:
4659 * .section name {, "flags"}
4661 * | +--- optional flags: 'b' for bss
4663 * +-- section name 'l' for lib
4667 * 'd' (apparently m88k for data)
4669 * But if the argument is not a quoted string, treat it as a
4670 * subsegment number.
4672 * FIXME: this is a copy of the section processing from obj-coff.c, with
4673 * additions/changes for the moto-pas assembler support. There are three
4676 * FIXME: I just noticed this. This doesn't work at all really. It it
4677 * setting bits that bfd probably neither understands or uses. The
4678 * correct approach (?) will have to incorporate extra fields attached
4679 * to the section to hold the system specific stuff. (krk)
4682 * 'a' - unknown - referred to in documentation, but no definition supplied
4683 * 'c' - section has code
4684 * 'd' - section has initialized data
4685 * 'u' - section has uninitialized data
4686 * 'i' - section contains directives (info)
4687 * 'n' - section can be discarded
4688 * 'R' - remove section at link time
4690 * Section Protection:
4691 * 'r' - section is readable
4692 * 'w' - section is writeable
4693 * 'x' - section is executable
4694 * 's' - section is sharable
4696 * Section Alignment:
4697 * '0' - align to byte boundary
4698 * '1' - align to halfword undary
4699 * '2' - align to word boundary
4700 * '3' - align to doubleword boundary
4701 * '4' - align to quadword boundary
4702 * '5' - align to 32 byte boundary
4703 * '6' - align to 64 byte boundary
4708 ppc_pe_section (int ignore ATTRIBUTE_UNUSED
)
4710 /* Strip out the section name. */
4719 section_name
= input_line_pointer
;
4720 c
= get_symbol_end ();
4722 name
= xmalloc (input_line_pointer
- section_name
+ 1);
4723 strcpy (name
, section_name
);
4725 *input_line_pointer
= c
;
4730 flags
= SEC_NO_FLAGS
;
4732 if (strcmp (name
, ".idata$2") == 0)
4736 else if (strcmp (name
, ".idata$3") == 0)
4740 else if (strcmp (name
, ".idata$4") == 0)
4744 else if (strcmp (name
, ".idata$5") == 0)
4748 else if (strcmp (name
, ".idata$6") == 0)
4753 /* Default alignment to 16 byte boundary. */
4756 if (*input_line_pointer
== ',')
4758 ++input_line_pointer
;
4760 if (*input_line_pointer
!= '"')
4761 exp
= get_absolute_expression ();
4764 ++input_line_pointer
;
4765 while (*input_line_pointer
!= '"'
4766 && ! is_end_of_line
[(unsigned char) *input_line_pointer
])
4768 switch (*input_line_pointer
)
4770 /* Section Contents */
4771 case 'a': /* unknown */
4772 as_bad (_("Unsupported section attribute -- 'a'"));
4774 case 'c': /* code section */
4777 case 'd': /* section has initialized data */
4780 case 'u': /* section has uninitialized data */
4781 /* FIXME: This is IMAGE_SCN_CNT_UNINITIALIZED_DATA
4785 case 'i': /* section contains directives (info) */
4786 /* FIXME: This is IMAGE_SCN_LNK_INFO
4788 flags
|= SEC_HAS_CONTENTS
;
4790 case 'n': /* section can be discarded */
4793 case 'R': /* Remove section at link time */
4794 flags
|= SEC_NEVER_LOAD
;
4796 #if IFLICT_BRAIN_DAMAGE
4797 /* Section Protection */
4798 case 'r': /* section is readable */
4799 flags
|= IMAGE_SCN_MEM_READ
;
4801 case 'w': /* section is writeable */
4802 flags
|= IMAGE_SCN_MEM_WRITE
;
4804 case 'x': /* section is executable */
4805 flags
|= IMAGE_SCN_MEM_EXECUTE
;
4807 case 's': /* section is sharable */
4808 flags
|= IMAGE_SCN_MEM_SHARED
;
4811 /* Section Alignment */
4812 case '0': /* align to byte boundary */
4813 flags
|= IMAGE_SCN_ALIGN_1BYTES
;
4816 case '1': /* align to halfword boundary */
4817 flags
|= IMAGE_SCN_ALIGN_2BYTES
;
4820 case '2': /* align to word boundary */
4821 flags
|= IMAGE_SCN_ALIGN_4BYTES
;
4824 case '3': /* align to doubleword boundary */
4825 flags
|= IMAGE_SCN_ALIGN_8BYTES
;
4828 case '4': /* align to quadword boundary */
4829 flags
|= IMAGE_SCN_ALIGN_16BYTES
;
4832 case '5': /* align to 32 byte boundary */
4833 flags
|= IMAGE_SCN_ALIGN_32BYTES
;
4836 case '6': /* align to 64 byte boundary */
4837 flags
|= IMAGE_SCN_ALIGN_64BYTES
;
4842 as_bad (_("unknown section attribute '%c'"),
4843 *input_line_pointer
);
4846 ++input_line_pointer
;
4848 if (*input_line_pointer
== '"')
4849 ++input_line_pointer
;
4853 sec
= subseg_new (name
, (subsegT
) exp
);
4855 ppc_set_current_section (sec
);
4857 if (flags
!= SEC_NO_FLAGS
)
4859 if (! bfd_set_section_flags (stdoutput
, sec
, flags
))
4860 as_bad (_("error setting flags for \"%s\": %s"),
4861 bfd_section_name (stdoutput
, sec
),
4862 bfd_errmsg (bfd_get_error ()));
4865 bfd_set_section_alignment (stdoutput
, sec
, align
);
4869 ppc_pe_function (int ignore ATTRIBUTE_UNUSED
)
4875 name
= input_line_pointer
;
4876 endc
= get_symbol_end ();
4878 ext_sym
= symbol_find_or_make (name
);
4880 *input_line_pointer
= endc
;
4882 S_SET_DATA_TYPE (ext_sym
, DT_FCN
<< N_BTSHFT
);
4883 SF_SET_FUNCTION (ext_sym
);
4884 SF_SET_PROCESS (ext_sym
);
4885 coff_add_linesym (ext_sym
);
4887 demand_empty_rest_of_line ();
4891 ppc_pe_tocd (int ignore ATTRIBUTE_UNUSED
)
4893 if (tocdata_section
== 0)
4895 tocdata_section
= subseg_new (".tocd", 0);
4896 /* FIXME: section flags won't work. */
4897 bfd_set_section_flags (stdoutput
, tocdata_section
,
4898 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
4899 | SEC_READONLY
| SEC_DATA
));
4901 bfd_set_section_alignment (stdoutput
, tocdata_section
, 2);
4905 rdata_section
= subseg_new (".tocd", 0);
4908 ppc_set_current_section (tocdata_section
);
4910 demand_empty_rest_of_line ();
4913 /* Don't adjust TOC relocs to use the section symbol. */
4916 ppc_pe_fix_adjustable (fixS
*fix
)
4918 return fix
->fx_r_type
!= BFD_RELOC_PPC_TOC16
;
4925 /* XCOFF specific symbol and file handling. */
4927 /* Canonicalize the symbol name. We use the to force the suffix, if
4928 any, to use square brackets, and to be in upper case. */
4931 ppc_canonicalize_symbol_name (char *name
)
4935 if (ppc_stab_symbol
)
4938 for (s
= name
; *s
!= '\0' && *s
!= '{' && *s
!= '['; s
++)
4952 for (s
++; *s
!= '\0' && *s
!= brac
; s
++)
4955 if (*s
== '\0' || s
[1] != '\0')
4956 as_bad (_("bad symbol suffix"));
4964 /* Set the class of a symbol based on the suffix, if any. This is
4965 called whenever a new symbol is created. */
4968 ppc_symbol_new_hook (symbolS
*sym
)
4970 struct ppc_tc_sy
*tc
;
4973 tc
= symbol_get_tc (sym
);
4976 tc
->symbol_class
= -1;
4977 tc
->real_name
= NULL
;
4983 if (ppc_stab_symbol
)
4986 s
= strchr (S_GET_NAME (sym
), '[');
4987 if (s
== (const char *) NULL
)
4989 /* There is no suffix. */
4998 if (strcmp (s
, "BS]") == 0)
4999 tc
->symbol_class
= XMC_BS
;
5002 if (strcmp (s
, "DB]") == 0)
5003 tc
->symbol_class
= XMC_DB
;
5004 else if (strcmp (s
, "DS]") == 0)
5005 tc
->symbol_class
= XMC_DS
;
5008 if (strcmp (s
, "GL]") == 0)
5009 tc
->symbol_class
= XMC_GL
;
5012 if (strcmp (s
, "PR]") == 0)
5013 tc
->symbol_class
= XMC_PR
;
5016 if (strcmp (s
, "RO]") == 0)
5017 tc
->symbol_class
= XMC_RO
;
5018 else if (strcmp (s
, "RW]") == 0)
5019 tc
->symbol_class
= XMC_RW
;
5022 if (strcmp (s
, "SV]") == 0)
5023 tc
->symbol_class
= XMC_SV
;
5026 if (strcmp (s
, "TC]") == 0)
5027 tc
->symbol_class
= XMC_TC
;
5028 else if (strcmp (s
, "TI]") == 0)
5029 tc
->symbol_class
= XMC_TI
;
5030 else if (strcmp (s
, "TB]") == 0)
5031 tc
->symbol_class
= XMC_TB
;
5032 else if (strcmp (s
, "TC0]") == 0 || strcmp (s
, "T0]") == 0)
5033 tc
->symbol_class
= XMC_TC0
;
5036 if (strcmp (s
, "UA]") == 0)
5037 tc
->symbol_class
= XMC_UA
;
5038 else if (strcmp (s
, "UC]") == 0)
5039 tc
->symbol_class
= XMC_UC
;
5042 if (strcmp (s
, "XO]") == 0)
5043 tc
->symbol_class
= XMC_XO
;
5047 if (tc
->symbol_class
== -1)
5048 as_bad (_("Unrecognized symbol suffix"));
5051 /* Set the class of a label based on where it is defined. This
5052 handles symbols without suffixes. Also, move the symbol so that it
5053 follows the csect symbol. */
5056 ppc_frob_label (symbolS
*sym
)
5058 if (ppc_current_csect
!= (symbolS
*) NULL
)
5060 if (symbol_get_tc (sym
)->symbol_class
== -1)
5061 symbol_get_tc (sym
)->symbol_class
= symbol_get_tc (ppc_current_csect
)->symbol_class
;
5063 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
5064 symbol_append (sym
, symbol_get_tc (ppc_current_csect
)->within
,
5065 &symbol_rootP
, &symbol_lastP
);
5066 symbol_get_tc (ppc_current_csect
)->within
= sym
;
5070 dwarf2_emit_label (sym
);
5074 /* This variable is set by ppc_frob_symbol if any absolute symbols are
5075 seen. It tells ppc_adjust_symtab whether it needs to look through
5078 static bfd_boolean ppc_saw_abs
;
5080 /* Change the name of a symbol just before writing it out. Set the
5081 real name if the .rename pseudo-op was used. Otherwise, remove any
5082 class suffix. Return 1 if the symbol should not be included in the
5086 ppc_frob_symbol (symbolS
*sym
)
5088 static symbolS
*ppc_last_function
;
5089 static symbolS
*set_end
;
5091 /* Discard symbols that should not be included in the output symbol
5093 if (! symbol_used_in_reloc_p (sym
)
5094 && ((symbol_get_bfdsym (sym
)->flags
& BSF_SECTION_SYM
) != 0
5095 || (! (S_IS_EXTERNAL (sym
) || S_IS_WEAK (sym
))
5096 && ! symbol_get_tc (sym
)->output
5097 && S_GET_STORAGE_CLASS (sym
) != C_FILE
)))
5100 /* This one will disappear anyway. Don't make a csect sym for it. */
5101 if (sym
== abs_section_sym
)
5104 if (symbol_get_tc (sym
)->real_name
!= (char *) NULL
)
5105 S_SET_NAME (sym
, symbol_get_tc (sym
)->real_name
);
5111 name
= S_GET_NAME (sym
);
5112 s
= strchr (name
, '[');
5113 if (s
!= (char *) NULL
)
5119 snew
= xmalloc (len
+ 1);
5120 memcpy (snew
, name
, len
);
5123 S_SET_NAME (sym
, snew
);
5127 if (set_end
!= (symbolS
*) NULL
)
5129 SA_SET_SYM_ENDNDX (set_end
, sym
);
5133 if (SF_GET_FUNCTION (sym
))
5135 if (ppc_last_function
!= (symbolS
*) NULL
)
5136 as_bad (_("two .function pseudo-ops with no intervening .ef"));
5137 ppc_last_function
= sym
;
5138 if (symbol_get_tc (sym
)->size
!= (symbolS
*) NULL
)
5140 resolve_symbol_value (symbol_get_tc (sym
)->size
);
5141 SA_SET_SYM_FSIZE (sym
,
5142 (long) S_GET_VALUE (symbol_get_tc (sym
)->size
));
5145 else if (S_GET_STORAGE_CLASS (sym
) == C_FCN
5146 && strcmp (S_GET_NAME (sym
), ".ef") == 0)
5148 if (ppc_last_function
== (symbolS
*) NULL
)
5149 as_bad (_(".ef with no preceding .function"));
5152 set_end
= ppc_last_function
;
5153 ppc_last_function
= NULL
;
5155 /* We don't have a C_EFCN symbol, but we need to force the
5156 COFF backend to believe that it has seen one. */
5157 coff_last_function
= NULL
;
5161 if (! (S_IS_EXTERNAL (sym
) || S_IS_WEAK (sym
))
5162 && (symbol_get_bfdsym (sym
)->flags
& BSF_SECTION_SYM
) == 0
5163 && S_GET_STORAGE_CLASS (sym
) != C_FILE
5164 && S_GET_STORAGE_CLASS (sym
) != C_FCN
5165 && S_GET_STORAGE_CLASS (sym
) != C_BLOCK
5166 && S_GET_STORAGE_CLASS (sym
) != C_BSTAT
5167 && S_GET_STORAGE_CLASS (sym
) != C_ESTAT
5168 && S_GET_STORAGE_CLASS (sym
) != C_BINCL
5169 && S_GET_STORAGE_CLASS (sym
) != C_EINCL
5170 && S_GET_SEGMENT (sym
) != ppc_coff_debug_section
)
5171 S_SET_STORAGE_CLASS (sym
, C_HIDEXT
);
5173 if (S_GET_STORAGE_CLASS (sym
) == C_EXT
5174 || S_GET_STORAGE_CLASS (sym
) == C_AIX_WEAKEXT
5175 || S_GET_STORAGE_CLASS (sym
) == C_HIDEXT
)
5178 union internal_auxent
*a
;
5180 /* Create a csect aux. */
5181 i
= S_GET_NUMBER_AUXILIARY (sym
);
5182 S_SET_NUMBER_AUXILIARY (sym
, i
+ 1);
5183 a
= &coffsymbol (symbol_get_bfdsym (sym
))->native
[i
+ 1].u
.auxent
;
5184 if (symbol_get_tc (sym
)->symbol_class
== XMC_TC0
)
5186 /* This is the TOC table. */
5187 know (strcmp (S_GET_NAME (sym
), "TOC") == 0);
5188 a
->x_csect
.x_scnlen
.l
= 0;
5189 a
->x_csect
.x_smtyp
= (2 << 3) | XTY_SD
;
5191 else if (symbol_get_tc (sym
)->subseg
!= 0)
5193 /* This is a csect symbol. x_scnlen is the size of the
5195 if (symbol_get_tc (sym
)->next
== (symbolS
*) NULL
)
5196 a
->x_csect
.x_scnlen
.l
= (bfd_section_size (stdoutput
,
5197 S_GET_SEGMENT (sym
))
5198 - S_GET_VALUE (sym
));
5201 resolve_symbol_value (symbol_get_tc (sym
)->next
);
5202 a
->x_csect
.x_scnlen
.l
= (S_GET_VALUE (symbol_get_tc (sym
)->next
)
5203 - S_GET_VALUE (sym
));
5205 a
->x_csect
.x_smtyp
= (symbol_get_tc (sym
)->align
<< 3) | XTY_SD
;
5207 else if (S_GET_SEGMENT (sym
) == bss_section
)
5209 /* This is a common symbol. */
5210 a
->x_csect
.x_scnlen
.l
= symbol_get_frag (sym
)->fr_offset
;
5211 a
->x_csect
.x_smtyp
= (symbol_get_tc (sym
)->align
<< 3) | XTY_CM
;
5212 if (S_IS_EXTERNAL (sym
))
5213 symbol_get_tc (sym
)->symbol_class
= XMC_RW
;
5215 symbol_get_tc (sym
)->symbol_class
= XMC_BS
;
5217 else if (S_GET_SEGMENT (sym
) == absolute_section
)
5219 /* This is an absolute symbol. The csect will be created by
5220 ppc_adjust_symtab. */
5222 a
->x_csect
.x_smtyp
= XTY_LD
;
5223 if (symbol_get_tc (sym
)->symbol_class
== -1)
5224 symbol_get_tc (sym
)->symbol_class
= XMC_XO
;
5226 else if (! S_IS_DEFINED (sym
))
5228 /* This is an external symbol. */
5229 a
->x_csect
.x_scnlen
.l
= 0;
5230 a
->x_csect
.x_smtyp
= XTY_ER
;
5232 else if (symbol_get_tc (sym
)->symbol_class
== XMC_TC
)
5236 /* This is a TOC definition. x_scnlen is the size of the
5238 next
= symbol_next (sym
);
5239 while (symbol_get_tc (next
)->symbol_class
== XMC_TC0
)
5240 next
= symbol_next (next
);
5241 if (next
== (symbolS
*) NULL
5242 || symbol_get_tc (next
)->symbol_class
!= XMC_TC
)
5244 if (ppc_after_toc_frag
== (fragS
*) NULL
)
5245 a
->x_csect
.x_scnlen
.l
= (bfd_section_size (stdoutput
,
5247 - S_GET_VALUE (sym
));
5249 a
->x_csect
.x_scnlen
.l
= (ppc_after_toc_frag
->fr_address
5250 - S_GET_VALUE (sym
));
5254 resolve_symbol_value (next
);
5255 a
->x_csect
.x_scnlen
.l
= (S_GET_VALUE (next
)
5256 - S_GET_VALUE (sym
));
5258 a
->x_csect
.x_smtyp
= (2 << 3) | XTY_SD
;
5264 /* This is a normal symbol definition. x_scnlen is the
5265 symbol index of the containing csect. */
5266 if (S_GET_SEGMENT (sym
) == text_section
)
5267 csect
= ppc_text_csects
;
5268 else if (S_GET_SEGMENT (sym
) == data_section
)
5269 csect
= ppc_data_csects
;
5273 /* Skip the initial dummy symbol. */
5274 csect
= symbol_get_tc (csect
)->next
;
5276 if (csect
== (symbolS
*) NULL
)
5278 as_warn (_("warning: symbol %s has no csect"), S_GET_NAME (sym
));
5279 a
->x_csect
.x_scnlen
.l
= 0;
5283 while (symbol_get_tc (csect
)->next
!= (symbolS
*) NULL
)
5285 resolve_symbol_value (symbol_get_tc (csect
)->next
);
5286 if (S_GET_VALUE (symbol_get_tc (csect
)->next
)
5287 > S_GET_VALUE (sym
))
5289 csect
= symbol_get_tc (csect
)->next
;
5292 a
->x_csect
.x_scnlen
.p
=
5293 coffsymbol (symbol_get_bfdsym (csect
))->native
;
5294 coffsymbol (symbol_get_bfdsym (sym
))->native
[i
+ 1].fix_scnlen
=
5297 a
->x_csect
.x_smtyp
= XTY_LD
;
5300 a
->x_csect
.x_parmhash
= 0;
5301 a
->x_csect
.x_snhash
= 0;
5302 if (symbol_get_tc (sym
)->symbol_class
== -1)
5303 a
->x_csect
.x_smclas
= XMC_PR
;
5305 a
->x_csect
.x_smclas
= symbol_get_tc (sym
)->symbol_class
;
5306 a
->x_csect
.x_stab
= 0;
5307 a
->x_csect
.x_snstab
= 0;
5309 /* Don't let the COFF backend resort these symbols. */
5310 symbol_get_bfdsym (sym
)->flags
|= BSF_NOT_AT_END
;
5312 else if (S_GET_STORAGE_CLASS (sym
) == C_BSTAT
)
5314 /* We want the value to be the symbol index of the referenced
5315 csect symbol. BFD will do that for us if we set the right
5317 asymbol
*bsym
= symbol_get_bfdsym (symbol_get_tc (sym
)->within
);
5318 combined_entry_type
*c
= coffsymbol (bsym
)->native
;
5320 S_SET_VALUE (sym
, (valueT
) (size_t) c
);
5321 coffsymbol (symbol_get_bfdsym (sym
))->native
->fix_value
= 1;
5323 else if (S_GET_STORAGE_CLASS (sym
) == C_STSYM
)
5328 /* The value is the offset from the enclosing csect. */
5329 block
= symbol_get_tc (sym
)->within
;
5330 csect
= symbol_get_tc (block
)->within
;
5331 resolve_symbol_value (csect
);
5332 S_SET_VALUE (sym
, S_GET_VALUE (sym
) - S_GET_VALUE (csect
));
5334 else if (S_GET_STORAGE_CLASS (sym
) == C_BINCL
5335 || S_GET_STORAGE_CLASS (sym
) == C_EINCL
)
5337 /* We want the value to be a file offset into the line numbers.
5338 BFD will do that for us if we set the right flags. We have
5339 already set the value correctly. */
5340 coffsymbol (symbol_get_bfdsym (sym
))->native
->fix_line
= 1;
5346 /* Adjust the symbol table. This creates csect symbols for all
5347 absolute symbols. */
5350 ppc_adjust_symtab (void)
5357 for (sym
= symbol_rootP
; sym
!= NULL
; sym
= symbol_next (sym
))
5361 union internal_auxent
*a
;
5363 if (S_GET_SEGMENT (sym
) != absolute_section
)
5366 csect
= symbol_create (".abs[XO]", absolute_section
,
5367 S_GET_VALUE (sym
), &zero_address_frag
);
5368 symbol_get_bfdsym (csect
)->value
= S_GET_VALUE (sym
);
5369 S_SET_STORAGE_CLASS (csect
, C_HIDEXT
);
5370 i
= S_GET_NUMBER_AUXILIARY (csect
);
5371 S_SET_NUMBER_AUXILIARY (csect
, i
+ 1);
5372 a
= &coffsymbol (symbol_get_bfdsym (csect
))->native
[i
+ 1].u
.auxent
;
5373 a
->x_csect
.x_scnlen
.l
= 0;
5374 a
->x_csect
.x_smtyp
= XTY_SD
;
5375 a
->x_csect
.x_parmhash
= 0;
5376 a
->x_csect
.x_snhash
= 0;
5377 a
->x_csect
.x_smclas
= XMC_XO
;
5378 a
->x_csect
.x_stab
= 0;
5379 a
->x_csect
.x_snstab
= 0;
5381 symbol_insert (csect
, sym
, &symbol_rootP
, &symbol_lastP
);
5383 i
= S_GET_NUMBER_AUXILIARY (sym
);
5384 a
= &coffsymbol (symbol_get_bfdsym (sym
))->native
[i
].u
.auxent
;
5385 a
->x_csect
.x_scnlen
.p
= coffsymbol (symbol_get_bfdsym (csect
))->native
;
5386 coffsymbol (symbol_get_bfdsym (sym
))->native
[i
].fix_scnlen
= 1;
5389 ppc_saw_abs
= FALSE
;
5392 /* Set the VMA for a section. This is called on all the sections in
5396 ppc_frob_section (asection
*sec
)
5398 static bfd_vma vma
= 0;
5400 vma
= md_section_align (sec
, vma
);
5401 bfd_set_section_vma (stdoutput
, sec
, vma
);
5402 vma
+= bfd_section_size (stdoutput
, sec
);
5405 #endif /* OBJ_XCOFF */
5408 md_atof (int type
, char *litp
, int *sizep
)
5410 return ieee_md_atof (type
, litp
, sizep
, target_big_endian
);
5413 /* Write a value out to the object file, using the appropriate
5417 md_number_to_chars (char *buf
, valueT val
, int n
)
5419 if (target_big_endian
)
5420 number_to_chars_bigendian (buf
, val
, n
);
5422 number_to_chars_littleendian (buf
, val
, n
);
5425 /* Align a section (I don't know why this is machine dependent). */
5428 md_section_align (asection
*seg ATTRIBUTE_UNUSED
, valueT addr
)
5433 int align
= bfd_get_section_alignment (stdoutput
, seg
);
5435 return ((addr
+ (1 << align
) - 1) & (-1 << align
));
5439 /* We don't have any form of relaxing. */
5442 md_estimate_size_before_relax (fragS
*fragp ATTRIBUTE_UNUSED
,
5443 asection
*seg ATTRIBUTE_UNUSED
)
5449 /* Convert a machine dependent frag. We never generate these. */
5452 md_convert_frag (bfd
*abfd ATTRIBUTE_UNUSED
,
5453 asection
*sec ATTRIBUTE_UNUSED
,
5454 fragS
*fragp ATTRIBUTE_UNUSED
)
5459 /* We have no need to default values of symbols. */
5462 md_undefined_symbol (char *name ATTRIBUTE_UNUSED
)
5467 /* Functions concerning relocs. */
5469 /* The location from which a PC relative jump should be calculated,
5470 given a PC relative reloc. */
5473 md_pcrel_from_section (fixS
*fixp
, segT sec ATTRIBUTE_UNUSED
)
5475 return fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
5480 /* This is called to see whether a fixup should be adjusted to use a
5481 section symbol. We take the opportunity to change a fixup against
5482 a symbol in the TOC subsegment into a reloc against the
5483 corresponding .tc symbol. */
5486 ppc_fix_adjustable (fixS
*fix
)
5488 valueT val
= resolve_symbol_value (fix
->fx_addsy
);
5489 segT symseg
= S_GET_SEGMENT (fix
->fx_addsy
);
5490 TC_SYMFIELD_TYPE
*tc
;
5492 if (symseg
== absolute_section
)
5495 if (ppc_toc_csect
!= (symbolS
*) NULL
5496 && fix
->fx_addsy
!= ppc_toc_csect
5497 && symseg
== data_section
5498 && val
>= ppc_toc_frag
->fr_address
5499 && (ppc_after_toc_frag
== (fragS
*) NULL
5500 || val
< ppc_after_toc_frag
->fr_address
))
5504 for (sy
= symbol_next (ppc_toc_csect
);
5505 sy
!= (symbolS
*) NULL
;
5506 sy
= symbol_next (sy
))
5508 TC_SYMFIELD_TYPE
*sy_tc
= symbol_get_tc (sy
);
5510 if (sy_tc
->symbol_class
== XMC_TC0
)
5512 if (sy_tc
->symbol_class
!= XMC_TC
)
5514 if (val
== resolve_symbol_value (sy
))
5517 fix
->fx_addnumber
= val
- ppc_toc_frag
->fr_address
;
5522 as_bad_where (fix
->fx_file
, fix
->fx_line
,
5523 _("symbol in .toc does not match any .tc"));
5526 /* Possibly adjust the reloc to be against the csect. */
5527 tc
= symbol_get_tc (fix
->fx_addsy
);
5529 && tc
->symbol_class
!= XMC_TC0
5530 && tc
->symbol_class
!= XMC_TC
5531 && symseg
!= bss_section
5532 /* Don't adjust if this is a reloc in the toc section. */
5533 && (symseg
!= data_section
5534 || ppc_toc_csect
== NULL
5535 || val
< ppc_toc_frag
->fr_address
5536 || (ppc_after_toc_frag
!= NULL
5537 && val
>= ppc_after_toc_frag
->fr_address
)))
5540 symbolS
*next_csect
;
5542 if (symseg
== text_section
)
5543 csect
= ppc_text_csects
;
5544 else if (symseg
== data_section
)
5545 csect
= ppc_data_csects
;
5549 /* Skip the initial dummy symbol. */
5550 csect
= symbol_get_tc (csect
)->next
;
5552 if (csect
!= (symbolS
*) NULL
)
5554 while ((next_csect
= symbol_get_tc (csect
)->next
) != (symbolS
*) NULL
5555 && (symbol_get_frag (next_csect
)->fr_address
<= val
))
5557 /* If the csect address equals the symbol value, then we
5558 have to look through the full symbol table to see
5559 whether this is the csect we want. Note that we will
5560 only get here if the csect has zero length. */
5561 if (symbol_get_frag (csect
)->fr_address
== val
5562 && S_GET_VALUE (csect
) == val
)
5566 for (scan
= symbol_next (csect
);
5568 scan
= symbol_next (scan
))
5570 if (symbol_get_tc (scan
)->subseg
!= 0)
5572 if (scan
== fix
->fx_addsy
)
5576 /* If we found the symbol before the next csect
5577 symbol, then this is the csect we want. */
5578 if (scan
== fix
->fx_addsy
)
5585 fix
->fx_offset
+= val
- symbol_get_frag (csect
)->fr_address
;
5586 fix
->fx_addsy
= csect
;
5591 /* Adjust a reloc against a .lcomm symbol to be against the base
5593 if (symseg
== bss_section
5594 && ! S_IS_EXTERNAL (fix
->fx_addsy
))
5596 symbolS
*sy
= symbol_get_frag (fix
->fx_addsy
)->fr_symbol
;
5598 fix
->fx_offset
+= val
- resolve_symbol_value (sy
);
5605 /* A reloc from one csect to another must be kept. The assembler
5606 will, of course, keep relocs between sections, and it will keep
5607 absolute relocs, but we need to force it to keep PC relative relocs
5608 between two csects in the same section. */
5611 ppc_force_relocation (fixS
*fix
)
5613 /* At this point fix->fx_addsy should already have been converted to
5614 a csect symbol. If the csect does not include the fragment, then
5615 we need to force the relocation. */
5617 && fix
->fx_addsy
!= NULL
5618 && symbol_get_tc (fix
->fx_addsy
)->subseg
!= 0
5619 && ((symbol_get_frag (fix
->fx_addsy
)->fr_address
5620 > fix
->fx_frag
->fr_address
)
5621 || (symbol_get_tc (fix
->fx_addsy
)->next
!= NULL
5622 && (symbol_get_frag (symbol_get_tc (fix
->fx_addsy
)->next
)->fr_address
5623 <= fix
->fx_frag
->fr_address
))))
5626 return generic_force_reloc (fix
);
5629 #endif /* OBJ_XCOFF */
5632 /* If this function returns non-zero, it guarantees that a relocation
5633 will be emitted for a fixup. */
5636 ppc_force_relocation (fixS
*fix
)
5638 /* Branch prediction relocations must force a relocation, as must
5639 the vtable description relocs. */
5640 switch (fix
->fx_r_type
)
5642 case BFD_RELOC_PPC_B16_BRTAKEN
:
5643 case BFD_RELOC_PPC_B16_BRNTAKEN
:
5644 case BFD_RELOC_PPC_BA16_BRTAKEN
:
5645 case BFD_RELOC_PPC_BA16_BRNTAKEN
:
5646 case BFD_RELOC_24_PLT_PCREL
:
5647 case BFD_RELOC_PPC64_TOC
:
5653 if (fix
->fx_r_type
>= BFD_RELOC_PPC_TLS
5654 && fix
->fx_r_type
<= BFD_RELOC_PPC64_DTPREL16_HIGHESTA
)
5657 return generic_force_reloc (fix
);
5661 ppc_fix_adjustable (fixS
*fix
)
5663 return (fix
->fx_r_type
!= BFD_RELOC_16_GOTOFF
5664 && fix
->fx_r_type
!= BFD_RELOC_LO16_GOTOFF
5665 && fix
->fx_r_type
!= BFD_RELOC_HI16_GOTOFF
5666 && fix
->fx_r_type
!= BFD_RELOC_HI16_S_GOTOFF
5667 && fix
->fx_r_type
!= BFD_RELOC_GPREL16
5668 && fix
->fx_r_type
!= BFD_RELOC_VTABLE_INHERIT
5669 && fix
->fx_r_type
!= BFD_RELOC_VTABLE_ENTRY
5670 && !(fix
->fx_r_type
>= BFD_RELOC_PPC_TLS
5671 && fix
->fx_r_type
<= BFD_RELOC_PPC64_DTPREL16_HIGHESTA
));
5675 /* Implement HANDLE_ALIGN. This writes the NOP pattern into an
5676 rs_align_code frag. */
5679 ppc_handle_align (struct frag
*fragP
)
5681 valueT count
= (fragP
->fr_next
->fr_address
5682 - (fragP
->fr_address
+ fragP
->fr_fix
));
5684 if (count
!= 0 && (count
& 3) == 0)
5686 char *dest
= fragP
->fr_literal
+ fragP
->fr_fix
;
5689 md_number_to_chars (dest
, 0x60000000, 4);
5691 if ((ppc_cpu
& PPC_OPCODE_POWER6
) != 0
5692 || (ppc_cpu
& PPC_OPCODE_POWER7
) != 0)
5694 /* For power6 and power7, we want the last nop to be a group
5695 terminating one. Do this by inserting an rs_fill frag immediately
5696 after this one, with its address set to the last nop location.
5697 This will automatically reduce the number of nops in the current
5701 struct frag
*group_nop
= xmalloc (SIZEOF_STRUCT_FRAG
+ 4);
5703 memcpy (group_nop
, fragP
, SIZEOF_STRUCT_FRAG
);
5704 group_nop
->fr_address
= group_nop
->fr_next
->fr_address
- 4;
5705 group_nop
->fr_fix
= 0;
5706 group_nop
->fr_offset
= 1;
5707 group_nop
->fr_type
= rs_fill
;
5708 fragP
->fr_next
= group_nop
;
5709 dest
= group_nop
->fr_literal
;
5712 if ((ppc_cpu
& PPC_OPCODE_POWER7
) != 0)
5713 /* power7 group terminating nop: "ori 2,2,0". */
5714 md_number_to_chars (dest
, 0x60420000, 4);
5716 /* power6 group terminating nop: "ori 1,1,0". */
5717 md_number_to_chars (dest
, 0x60210000, 4);
5722 /* Apply a fixup to the object code. This is called for all the
5723 fixups we generated by the call to fix_new_exp, above. In the call
5724 above we used a reloc code which was the largest legal reloc code
5725 plus the operand index. Here we undo that to recover the operand
5726 index. At this point all symbol values should be fully resolved,
5727 and we attempt to completely resolve the reloc. If we can not do
5728 that, we determine the correct reloc code and put it back in the
5732 md_apply_fix (fixS
*fixP
, valueT
*valP
, segT seg ATTRIBUTE_UNUSED
)
5734 valueT value
= * valP
;
5737 if (fixP
->fx_addsy
!= NULL
)
5739 /* Hack around bfd_install_relocation brain damage. */
5741 value
+= fixP
->fx_frag
->fr_address
+ fixP
->fx_where
;
5746 /* FIXME FIXME FIXME: The value we are passed in *valP includes
5747 the symbol values. If we are doing this relocation the code in
5748 write.c is going to call bfd_install_relocation, which is also
5749 going to use the symbol value. That means that if the reloc is
5750 fully resolved we want to use *valP since bfd_install_relocation is
5752 However, if the reloc is not fully resolved we do not want to
5753 use *valP, and must use fx_offset instead. If the relocation
5754 is PC-relative, we then need to re-apply md_pcrel_from_section
5755 to this new relocation value. */
5756 if (fixP
->fx_addsy
== (symbolS
*) NULL
)
5761 value
= fixP
->fx_offset
;
5763 value
-= md_pcrel_from_section (fixP
, seg
);
5767 if (fixP
->fx_subsy
!= (symbolS
*) NULL
)
5769 /* We can't actually support subtracting a symbol. */
5770 as_bad_where (fixP
->fx_file
, fixP
->fx_line
, _("expression too complex"));
5773 if ((int) fixP
->fx_r_type
>= (int) BFD_RELOC_UNUSED
)
5776 const struct powerpc_operand
*operand
;
5780 opindex
= (int) fixP
->fx_r_type
- (int) BFD_RELOC_UNUSED
;
5782 operand
= &powerpc_operands
[opindex
];
5785 /* An instruction like `lwz 9,sym(30)' when `sym' is not a TOC symbol
5786 does not generate a reloc. It uses the offset of `sym' within its
5787 csect. Other usages, such as `.long sym', generate relocs. This
5788 is the documented behaviour of non-TOC symbols. */
5789 if ((operand
->flags
& PPC_OPERAND_PARENS
) != 0
5790 && (operand
->bitm
& 0xfff0) == 0xfff0
5791 && operand
->shift
== 0
5792 && (operand
->insert
== NULL
|| ppc_obj64
)
5793 && fixP
->fx_addsy
!= NULL
5794 && symbol_get_tc (fixP
->fx_addsy
)->subseg
!= 0
5795 && symbol_get_tc (fixP
->fx_addsy
)->symbol_class
!= XMC_TC
5796 && symbol_get_tc (fixP
->fx_addsy
)->symbol_class
!= XMC_TC0
5797 && S_GET_SEGMENT (fixP
->fx_addsy
) != bss_section
)
5799 value
= fixP
->fx_offset
;
5804 /* Fetch the instruction, insert the fully resolved operand
5805 value, and stuff the instruction back again. */
5806 where
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
5807 if (target_big_endian
)
5808 insn
= bfd_getb32 ((unsigned char *) where
);
5810 insn
= bfd_getl32 ((unsigned char *) where
);
5811 insn
= ppc_insert_operand (insn
, operand
, (offsetT
) value
,
5812 fixP
->tc_fix_data
.ppc_cpu
,
5813 fixP
->fx_file
, fixP
->fx_line
);
5814 if (target_big_endian
)
5815 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
5817 bfd_putl32 ((bfd_vma
) insn
, (unsigned char *) where
);
5820 /* Nothing else to do here. */
5823 gas_assert (fixP
->fx_addsy
!= NULL
);
5825 /* Determine a BFD reloc value based on the operand information.
5826 We are only prepared to turn a few of the operands into
5828 if ((operand
->flags
& PPC_OPERAND_RELATIVE
) != 0
5829 && operand
->bitm
== 0x3fffffc
5830 && operand
->shift
== 0)
5831 fixP
->fx_r_type
= BFD_RELOC_PPC_B26
;
5832 else if ((operand
->flags
& PPC_OPERAND_RELATIVE
) != 0
5833 && operand
->bitm
== 0xfffc
5834 && operand
->shift
== 0)
5836 fixP
->fx_r_type
= BFD_RELOC_PPC_B16
;
5839 if (target_big_endian
)
5840 fixP
->fx_where
+= 2;
5843 else if ((operand
->flags
& PPC_OPERAND_ABSOLUTE
) != 0
5844 && operand
->bitm
== 0x3fffffc
5845 && operand
->shift
== 0)
5846 fixP
->fx_r_type
= BFD_RELOC_PPC_BA26
;
5847 else if ((operand
->flags
& PPC_OPERAND_ABSOLUTE
) != 0
5848 && operand
->bitm
== 0xfffc
5849 && operand
->shift
== 0)
5851 fixP
->fx_r_type
= BFD_RELOC_PPC_BA16
;
5854 if (target_big_endian
)
5855 fixP
->fx_where
+= 2;
5858 #if defined (OBJ_XCOFF) || defined (OBJ_ELF)
5859 else if ((operand
->flags
& PPC_OPERAND_PARENS
) != 0
5860 && (operand
->bitm
& 0xfff0) == 0xfff0
5861 && operand
->shift
== 0)
5863 if (ppc_is_toc_sym (fixP
->fx_addsy
))
5865 fixP
->fx_r_type
= BFD_RELOC_PPC_TOC16
;
5868 && (operand
->flags
& PPC_OPERAND_DS
) != 0)
5869 fixP
->fx_r_type
= BFD_RELOC_PPC64_TOC16_DS
;
5874 fixP
->fx_r_type
= BFD_RELOC_16
;
5877 && (operand
->flags
& PPC_OPERAND_DS
) != 0)
5878 fixP
->fx_r_type
= BFD_RELOC_PPC64_ADDR16_DS
;
5882 if (target_big_endian
)
5883 fixP
->fx_where
+= 2;
5885 #endif /* defined (OBJ_XCOFF) || defined (OBJ_ELF) */
5891 /* Use expr_symbol_where to see if this is an expression
5893 if (expr_symbol_where (fixP
->fx_addsy
, &sfile
, &sline
))
5894 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
5895 _("unresolved expression that must be resolved"));
5897 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
5898 _("unsupported relocation against %s"),
5899 S_GET_NAME (fixP
->fx_addsy
));
5907 ppc_elf_validate_fix (fixP
, seg
);
5909 switch (fixP
->fx_r_type
)
5911 case BFD_RELOC_CTOR
:
5918 fixP
->fx_r_type
= BFD_RELOC_32_PCREL
;
5922 case BFD_RELOC_32_PCREL
:
5923 case BFD_RELOC_PPC_EMB_NADDR32
:
5924 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
5931 fixP
->fx_r_type
= BFD_RELOC_64_PCREL
;
5934 case BFD_RELOC_64_PCREL
:
5935 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
5939 case BFD_RELOC_GPREL16
:
5940 case BFD_RELOC_16_GOT_PCREL
:
5941 case BFD_RELOC_16_GOTOFF
:
5942 case BFD_RELOC_LO16_GOTOFF
:
5943 case BFD_RELOC_HI16_GOTOFF
:
5944 case BFD_RELOC_HI16_S_GOTOFF
:
5945 case BFD_RELOC_16_BASEREL
:
5946 case BFD_RELOC_LO16_BASEREL
:
5947 case BFD_RELOC_HI16_BASEREL
:
5948 case BFD_RELOC_HI16_S_BASEREL
:
5949 case BFD_RELOC_PPC_EMB_NADDR16
:
5950 case BFD_RELOC_PPC_EMB_NADDR16_LO
:
5951 case BFD_RELOC_PPC_EMB_NADDR16_HI
:
5952 case BFD_RELOC_PPC_EMB_NADDR16_HA
:
5953 case BFD_RELOC_PPC_EMB_SDAI16
:
5954 case BFD_RELOC_PPC_EMB_SDA2REL
:
5955 case BFD_RELOC_PPC_EMB_SDA2I16
:
5956 case BFD_RELOC_PPC_EMB_RELSEC16
:
5957 case BFD_RELOC_PPC_EMB_RELST_LO
:
5958 case BFD_RELOC_PPC_EMB_RELST_HI
:
5959 case BFD_RELOC_PPC_EMB_RELST_HA
:
5960 case BFD_RELOC_PPC_EMB_RELSDA
:
5961 case BFD_RELOC_PPC_TOC16
:
5963 case BFD_RELOC_PPC64_TOC16_LO
:
5964 case BFD_RELOC_PPC64_TOC16_HI
:
5965 case BFD_RELOC_PPC64_TOC16_HA
:
5969 if (fixP
->fx_addsy
!= NULL
)
5970 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
5971 _("cannot emit PC relative %s relocation against %s"),
5972 bfd_get_reloc_code_name (fixP
->fx_r_type
),
5973 S_GET_NAME (fixP
->fx_addsy
));
5975 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
5976 _("cannot emit PC relative %s relocation"),
5977 bfd_get_reloc_code_name (fixP
->fx_r_type
));
5980 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
5986 fixP
->fx_r_type
= BFD_RELOC_16_PCREL
;
5989 case BFD_RELOC_16_PCREL
:
5990 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
5994 case BFD_RELOC_LO16
:
5996 fixP
->fx_r_type
= BFD_RELOC_LO16_PCREL
;
5999 case BFD_RELOC_LO16_PCREL
:
6000 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
6004 /* This case happens when you write, for example,
6006 where L1 and L2 are defined later. */
6007 case BFD_RELOC_HI16
:
6009 fixP
->fx_r_type
= BFD_RELOC_HI16_PCREL
;
6012 case BFD_RELOC_HI16_PCREL
:
6013 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
6017 case BFD_RELOC_HI16_S
:
6019 fixP
->fx_r_type
= BFD_RELOC_HI16_S_PCREL
;
6022 case BFD_RELOC_HI16_S_PCREL
:
6023 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
6028 case BFD_RELOC_PPC64_HIGHER
:
6031 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
6032 PPC_HIGHER (value
), 2);
6035 case BFD_RELOC_PPC64_HIGHER_S
:
6038 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
6039 PPC_HIGHERA (value
), 2);
6042 case BFD_RELOC_PPC64_HIGHEST
:
6045 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
6046 PPC_HIGHEST (value
), 2);
6049 case BFD_RELOC_PPC64_HIGHEST_S
:
6052 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
6053 PPC_HIGHESTA (value
), 2);
6056 case BFD_RELOC_PPC64_ADDR16_DS
:
6057 case BFD_RELOC_PPC64_ADDR16_LO_DS
:
6058 case BFD_RELOC_PPC64_GOT16_DS
:
6059 case BFD_RELOC_PPC64_GOT16_LO_DS
:
6060 case BFD_RELOC_PPC64_PLT16_LO_DS
:
6061 case BFD_RELOC_PPC64_SECTOFF_DS
:
6062 case BFD_RELOC_PPC64_SECTOFF_LO_DS
:
6063 case BFD_RELOC_PPC64_TOC16_DS
:
6064 case BFD_RELOC_PPC64_TOC16_LO_DS
:
6065 case BFD_RELOC_PPC64_PLTGOT16_DS
:
6066 case BFD_RELOC_PPC64_PLTGOT16_LO_DS
:
6070 char *where
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
6071 unsigned long val
, mask
;
6073 if (target_big_endian
)
6074 val
= bfd_getb32 (where
- 2);
6076 val
= bfd_getl32 (where
);
6078 /* lq insns reserve the four lsbs. */
6079 if ((ppc_cpu
& PPC_OPCODE_POWER4
) != 0
6080 && (val
& (0x3f << 26)) == (56u << 26))
6082 val
|= value
& mask
;
6083 if (target_big_endian
)
6084 bfd_putb16 ((bfd_vma
) val
, where
);
6086 bfd_putl16 ((bfd_vma
) val
, where
);
6090 case BFD_RELOC_PPC_B16_BRTAKEN
:
6091 case BFD_RELOC_PPC_B16_BRNTAKEN
:
6092 case BFD_RELOC_PPC_BA16_BRTAKEN
:
6093 case BFD_RELOC_PPC_BA16_BRNTAKEN
:
6096 case BFD_RELOC_PPC_TLS
:
6097 case BFD_RELOC_PPC_TLSGD
:
6098 case BFD_RELOC_PPC_TLSLD
:
6101 case BFD_RELOC_PPC_DTPMOD
:
6102 case BFD_RELOC_PPC_TPREL16
:
6103 case BFD_RELOC_PPC_TPREL16_LO
:
6104 case BFD_RELOC_PPC_TPREL16_HI
:
6105 case BFD_RELOC_PPC_TPREL16_HA
:
6106 case BFD_RELOC_PPC_TPREL
:
6107 case BFD_RELOC_PPC_DTPREL16
:
6108 case BFD_RELOC_PPC_DTPREL16_LO
:
6109 case BFD_RELOC_PPC_DTPREL16_HI
:
6110 case BFD_RELOC_PPC_DTPREL16_HA
:
6111 case BFD_RELOC_PPC_DTPREL
:
6112 case BFD_RELOC_PPC_GOT_TLSGD16
:
6113 case BFD_RELOC_PPC_GOT_TLSGD16_LO
:
6114 case BFD_RELOC_PPC_GOT_TLSGD16_HI
:
6115 case BFD_RELOC_PPC_GOT_TLSGD16_HA
:
6116 case BFD_RELOC_PPC_GOT_TLSLD16
:
6117 case BFD_RELOC_PPC_GOT_TLSLD16_LO
:
6118 case BFD_RELOC_PPC_GOT_TLSLD16_HI
:
6119 case BFD_RELOC_PPC_GOT_TLSLD16_HA
:
6120 case BFD_RELOC_PPC_GOT_TPREL16
:
6121 case BFD_RELOC_PPC_GOT_TPREL16_LO
:
6122 case BFD_RELOC_PPC_GOT_TPREL16_HI
:
6123 case BFD_RELOC_PPC_GOT_TPREL16_HA
:
6124 case BFD_RELOC_PPC_GOT_DTPREL16
:
6125 case BFD_RELOC_PPC_GOT_DTPREL16_LO
:
6126 case BFD_RELOC_PPC_GOT_DTPREL16_HI
:
6127 case BFD_RELOC_PPC_GOT_DTPREL16_HA
:
6128 case BFD_RELOC_PPC64_TPREL16_DS
:
6129 case BFD_RELOC_PPC64_TPREL16_LO_DS
:
6130 case BFD_RELOC_PPC64_TPREL16_HIGHER
:
6131 case BFD_RELOC_PPC64_TPREL16_HIGHERA
:
6132 case BFD_RELOC_PPC64_TPREL16_HIGHEST
:
6133 case BFD_RELOC_PPC64_TPREL16_HIGHESTA
:
6134 case BFD_RELOC_PPC64_DTPREL16_DS
:
6135 case BFD_RELOC_PPC64_DTPREL16_LO_DS
:
6136 case BFD_RELOC_PPC64_DTPREL16_HIGHER
:
6137 case BFD_RELOC_PPC64_DTPREL16_HIGHERA
:
6138 case BFD_RELOC_PPC64_DTPREL16_HIGHEST
:
6139 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA
:
6140 S_SET_THREAD_LOCAL (fixP
->fx_addsy
);
6143 /* Because SDA21 modifies the register field, the size is set to 4
6144 bytes, rather than 2, so offset it here appropriately. */
6145 case BFD_RELOC_PPC_EMB_SDA21
:
6149 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
6150 + ((target_big_endian
) ? 2 : 0),
6157 /* This can occur if there is a bug in the input assembler, eg:
6158 ".byte <undefined_symbol> - ." */
6160 as_bad (_("Unable to handle reference to symbol %s"),
6161 S_GET_NAME (fixP
->fx_addsy
));
6163 as_bad (_("Unable to resolve expression"));
6167 md_number_to_chars (fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
,
6171 case BFD_RELOC_24_PLT_PCREL
:
6172 case BFD_RELOC_PPC_LOCAL24PC
:
6173 if (!fixP
->fx_pcrel
&& !fixP
->fx_done
)
6181 /* Fetch the instruction, insert the fully resolved operand
6182 value, and stuff the instruction back again. */
6183 where
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
6184 if (target_big_endian
)
6185 insn
= bfd_getb32 ((unsigned char *) where
);
6187 insn
= bfd_getl32 ((unsigned char *) where
);
6188 if ((value
& 3) != 0)
6189 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
6190 _("must branch to an address a multiple of 4"));
6191 if ((offsetT
) value
< -0x40000000
6192 || (offsetT
) value
>= 0x40000000)
6193 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
6194 _("@local or @plt branch destination is too far away, %ld bytes"),
6196 insn
= insn
| (value
& 0x03fffffc);
6197 if (target_big_endian
)
6198 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
6200 bfd_putl32 ((bfd_vma
) insn
, (unsigned char *) where
);
6204 case BFD_RELOC_VTABLE_INHERIT
:
6207 && !S_IS_DEFINED (fixP
->fx_addsy
)
6208 && !S_IS_WEAK (fixP
->fx_addsy
))
6209 S_SET_WEAK (fixP
->fx_addsy
);
6212 case BFD_RELOC_VTABLE_ENTRY
:
6217 /* Generated by reference to `sym@tocbase'. The sym is
6218 ignored by the linker. */
6219 case BFD_RELOC_PPC64_TOC
:
6225 _("Gas failure, reloc value %d\n"), fixP
->fx_r_type
);
6232 fixP
->fx_addnumber
= value
;
6234 /* PowerPC uses RELA relocs, ie. the reloc addend is stored separately
6235 from the section contents. If we are going to be emitting a reloc
6236 then the section contents are immaterial, so don't warn if they
6237 happen to overflow. Leave such warnings to ld. */
6239 fixP
->fx_no_overflow
= 1;
6241 if (fixP
->fx_r_type
!= BFD_RELOC_PPC_TOC16
)
6242 fixP
->fx_addnumber
= 0;
6246 fixP
->fx_addnumber
= 0;
6248 /* We want to use the offset within the toc, not the actual VMA
6250 fixP
->fx_addnumber
=
6251 - bfd_get_section_vma (stdoutput
, S_GET_SEGMENT (fixP
->fx_addsy
))
6252 - S_GET_VALUE (ppc_toc_csect
);
6258 /* Generate a reloc for a fixup. */
6261 tc_gen_reloc (asection
*seg ATTRIBUTE_UNUSED
, fixS
*fixp
)
6265 reloc
= (arelent
*) xmalloc (sizeof (arelent
));
6267 reloc
->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
6268 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
6269 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
6270 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
6271 if (reloc
->howto
== (reloc_howto_type
*) NULL
)
6273 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
6274 _("reloc %d not supported by object file format"),
6275 (int) fixp
->fx_r_type
);
6278 reloc
->addend
= fixp
->fx_addnumber
;
6284 ppc_cfi_frame_initial_instructions (void)
6286 cfi_add_CFA_def_cfa (1, 0);
6290 tc_ppc_regname_to_dw2regnum (char *regname
)
6292 unsigned int regnum
= -1;
6296 static struct { char *name
; int dw2regnum
; } regnames
[] =
6298 { "sp", 1 }, { "r.sp", 1 }, { "rtoc", 2 }, { "r.toc", 2 },
6299 { "mq", 64 }, { "lr", 65 }, { "ctr", 66 }, { "ap", 67 },
6300 { "cr", 70 }, { "xer", 76 }, { "vrsave", 109 }, { "vscr", 110 },
6301 { "spe_acc", 111 }, { "spefscr", 112 }
6304 for (i
= 0; i
< ARRAY_SIZE (regnames
); ++i
)
6305 if (strcmp (regnames
[i
].name
, regname
) == 0)
6306 return regnames
[i
].dw2regnum
;
6308 if (regname
[0] == 'r' || regname
[0] == 'f' || regname
[0] == 'v')
6310 p
= regname
+ 1 + (regname
[1] == '.');
6311 regnum
= strtoul (p
, &q
, 10);
6312 if (p
== q
|| *q
|| regnum
>= 32)
6314 if (regname
[0] == 'f')
6316 else if (regname
[0] == 'v')
6319 else if (regname
[0] == 'c' && regname
[1] == 'r')
6321 p
= regname
+ 2 + (regname
[2] == '.');
6322 if (p
[0] < '0' || p
[0] > '7' || p
[1])
6324 regnum
= p
[0] - '0' + 68;