Minor reorganization of fetch_registers/store_registers in windows-nat.c
[external/binutils.git] / gas / config / tc-ppc.c
1 /* tc-ppc.c -- Assemble for the PowerPC or POWER (RS/6000)
2    Copyright (C) 1994-2018 Free Software Foundation, Inc.
3    Written by Ian Lance Taylor, Cygnus Support.
4
5    This file is part of GAS, the GNU Assembler.
6
7    GAS is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3, or (at your option)
10    any later version.
11
12    GAS is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GAS; see the file COPYING.  If not, write to the Free
19    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
20    02110-1301, USA.  */
21
22 #include "as.h"
23 #include "safe-ctype.h"
24 #include "subsegs.h"
25 #include "dw2gencfi.h"
26 #include "opcode/ppc.h"
27
28 #ifdef OBJ_ELF
29 #include "elf/ppc.h"
30 #include "elf/ppc64.h"
31 #include "dwarf2dbg.h"
32 #endif
33
34 #ifdef TE_PE
35 #include "coff/pe.h"
36 #endif
37
38 #ifdef OBJ_XCOFF
39 #include "coff/xcoff.h"
40 #include "libxcoff.h"
41 #endif
42
43 /* This is the assembler for the PowerPC or POWER (RS/6000) chips.  */
44
45 /* Tell the main code what the endianness is.  */
46 extern int target_big_endian;
47
48 /* Whether or not, we've set target_big_endian.  */
49 static int set_target_endian = 0;
50
51 /* Whether to use user friendly register names.  */
52 #ifndef TARGET_REG_NAMES_P
53 #ifdef TE_PE
54 #define TARGET_REG_NAMES_P TRUE
55 #else
56 #define TARGET_REG_NAMES_P FALSE
57 #endif
58 #endif
59
60 /* Macros for calculating LO, HI, HA, HIGHER, HIGHERA, HIGHEST,
61    HIGHESTA.  */
62
63 /* #lo(value) denotes the least significant 16 bits of the indicated.  */
64 #define PPC_LO(v) ((v) & 0xffff)
65
66 /* #hi(value) denotes bits 16 through 31 of the indicated value.  */
67 #define PPC_HI(v) (((v) >> 16) & 0xffff)
68
69 /* #ha(value) denotes the high adjusted value: bits 16 through 31 of
70   the indicated value, compensating for #lo() being treated as a
71   signed number.  */
72 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
73
74 /* #higher(value) denotes bits 32 through 47 of the indicated value.  */
75 #define PPC_HIGHER(v) (((v) >> 16 >> 16) & 0xffff)
76
77 /* #highera(value) denotes bits 32 through 47 of the indicated value,
78    compensating for #lo() being treated as a signed number.  */
79 #define PPC_HIGHERA(v) PPC_HIGHER ((v) + 0x8000)
80
81 /* #highest(value) denotes bits 48 through 63 of the indicated value.  */
82 #define PPC_HIGHEST(v) (((v) >> 24 >> 24) & 0xffff)
83
84 /* #highesta(value) denotes bits 48 through 63 of the indicated value,
85    compensating for #lo being treated as a signed number.  */
86 #define PPC_HIGHESTA(v) PPC_HIGHEST ((v) + 0x8000)
87
88 #define SEX16(val) (((val) ^ 0x8000) - 0x8000)
89
90 /* For the time being on ppc64, don't report overflow on @h and @ha
91    applied to constants.  */
92 #define REPORT_OVERFLOW_HI 0
93
94 static bfd_boolean reg_names_p = TARGET_REG_NAMES_P;
95
96 static void ppc_macro (char *, const struct powerpc_macro *);
97 static void ppc_byte (int);
98
99 #if defined (OBJ_XCOFF) || defined (OBJ_ELF)
100 static void ppc_tc (int);
101 static void ppc_machine (int);
102 #endif
103
104 #ifdef OBJ_XCOFF
105 static void ppc_comm (int);
106 static void ppc_bb (int);
107 static void ppc_bc (int);
108 static void ppc_bf (int);
109 static void ppc_biei (int);
110 static void ppc_bs (int);
111 static void ppc_eb (int);
112 static void ppc_ec (int);
113 static void ppc_ef (int);
114 static void ppc_es (int);
115 static void ppc_csect (int);
116 static void ppc_dwsect (int);
117 static void ppc_change_csect (symbolS *, offsetT);
118 static void ppc_function (int);
119 static void ppc_extern (int);
120 static void ppc_lglobl (int);
121 static void ppc_ref (int);
122 static void ppc_section (int);
123 static void ppc_named_section (int);
124 static void ppc_stabx (int);
125 static void ppc_rename (int);
126 static void ppc_toc (int);
127 static void ppc_xcoff_cons (int);
128 static void ppc_vbyte (int);
129 #endif
130
131 #ifdef OBJ_ELF
132 static void ppc_elf_rdata (int);
133 static void ppc_elf_lcomm (int);
134 static void ppc_elf_localentry (int);
135 static void ppc_elf_abiversion (int);
136 static void ppc_elf_gnu_attribute (int);
137 #endif
138
139 #ifdef TE_PE
140 static void ppc_previous (int);
141 static void ppc_pdata (int);
142 static void ppc_ydata (int);
143 static void ppc_reldata (int);
144 static void ppc_rdata (int);
145 static void ppc_ualong (int);
146 static void ppc_znop (int);
147 static void ppc_pe_comm (int);
148 static void ppc_pe_section (int);
149 static void ppc_pe_function (int);
150 static void ppc_pe_tocd (int);
151 #endif
152 \f
153 /* Generic assembler global variables which must be defined by all
154    targets.  */
155
156 #ifdef OBJ_ELF
157 /* This string holds the chars that always start a comment.  If the
158    pre-processor is disabled, these aren't very useful.  The macro
159    tc_comment_chars points to this.  We use this, rather than the
160    usual comment_chars, so that we can switch for Solaris conventions.  */
161 static const char ppc_solaris_comment_chars[] = "#!";
162 static const char ppc_eabi_comment_chars[] = "#";
163
164 #ifdef TARGET_SOLARIS_COMMENT
165 const char *ppc_comment_chars = ppc_solaris_comment_chars;
166 #else
167 const char *ppc_comment_chars = ppc_eabi_comment_chars;
168 #endif
169 #else
170 const char comment_chars[] = "#";
171 #endif
172
173 /* Characters which start a comment at the beginning of a line.  */
174 const char line_comment_chars[] = "#";
175
176 /* Characters which may be used to separate multiple commands on a
177    single line.  */
178 const char line_separator_chars[] = ";";
179
180 /* Characters which are used to indicate an exponent in a floating
181    point number.  */
182 const char EXP_CHARS[] = "eE";
183
184 /* Characters which mean that a number is a floating point constant,
185    as in 0d1.0.  */
186 const char FLT_CHARS[] = "dD";
187
188 /* Anything that can start an operand needs to be mentioned here,
189    to stop the input scrubber eating whitespace.  */
190 const char ppc_symbol_chars[] = "%[";
191
192 /* The dwarf2 data alignment, adjusted for 32 or 64 bit.  */
193 int ppc_cie_data_alignment;
194
195 /* The dwarf2 minimum instruction length.  */
196 int ppc_dwarf2_line_min_insn_length;
197
198 /* More than this number of nops in an alignment op gets a branch
199    instead.  */
200 unsigned long nop_limit = 4;
201
202 /* The type of processor we are assembling for.  This is one or more
203    of the PPC_OPCODE flags defined in opcode/ppc.h.  */
204 ppc_cpu_t ppc_cpu = 0;
205 ppc_cpu_t sticky = 0;
206
207 /* Value for ELF e_flags EF_PPC64_ABI.  */
208 unsigned int ppc_abiversion = 0;
209
210 #ifdef OBJ_ELF
211 /* Flags set on encountering toc relocs.  */
212 static enum {
213   has_large_toc_reloc = 1,
214   has_small_toc_reloc = 2
215 } toc_reloc_types;
216 #endif
217
218 /* Warn on emitting data to code sections.  */
219 int warn_476;
220 uint64_t last_insn;
221 segT last_seg;
222 subsegT last_subseg;
223 \f
224 /* The target specific pseudo-ops which we support.  */
225
226 const pseudo_typeS md_pseudo_table[] =
227 {
228   /* Pseudo-ops which must be overridden.  */
229   { "byte",     ppc_byte,       0 },
230
231 #ifdef OBJ_XCOFF
232   /* Pseudo-ops specific to the RS/6000 XCOFF format.  Some of these
233      legitimately belong in the obj-*.c file.  However, XCOFF is based
234      on COFF, and is only implemented for the RS/6000.  We just use
235      obj-coff.c, and add what we need here.  */
236   { "comm",     ppc_comm,       0 },
237   { "lcomm",    ppc_comm,       1 },
238   { "bb",       ppc_bb,         0 },
239   { "bc",       ppc_bc,         0 },
240   { "bf",       ppc_bf,         0 },
241   { "bi",       ppc_biei,       0 },
242   { "bs",       ppc_bs,         0 },
243   { "csect",    ppc_csect,      0 },
244   { "dwsect",   ppc_dwsect,     0 },
245   { "data",     ppc_section,    'd' },
246   { "eb",       ppc_eb,         0 },
247   { "ec",       ppc_ec,         0 },
248   { "ef",       ppc_ef,         0 },
249   { "ei",       ppc_biei,       1 },
250   { "es",       ppc_es,         0 },
251   { "extern",   ppc_extern,     0 },
252   { "function", ppc_function,   0 },
253   { "lglobl",   ppc_lglobl,     0 },
254   { "ref",      ppc_ref,        0 },
255   { "rename",   ppc_rename,     0 },
256   { "section",  ppc_named_section, 0 },
257   { "stabx",    ppc_stabx,      0 },
258   { "text",     ppc_section,    't' },
259   { "toc",      ppc_toc,        0 },
260   { "long",     ppc_xcoff_cons, 2 },
261   { "llong",    ppc_xcoff_cons, 3 },
262   { "word",     ppc_xcoff_cons, 1 },
263   { "short",    ppc_xcoff_cons, 1 },
264   { "vbyte",    ppc_vbyte,      0 },
265 #endif
266
267 #ifdef OBJ_ELF
268   { "llong",    cons,           8 },
269   { "rdata",    ppc_elf_rdata,  0 },
270   { "rodata",   ppc_elf_rdata,  0 },
271   { "lcomm",    ppc_elf_lcomm,  0 },
272   { "localentry", ppc_elf_localentry,   0 },
273   { "abiversion", ppc_elf_abiversion,   0 },
274   { "gnu_attribute", ppc_elf_gnu_attribute, 0},
275 #endif
276
277 #ifdef TE_PE
278   /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format.  */
279   { "previous", ppc_previous,   0 },
280   { "pdata",    ppc_pdata,      0 },
281   { "ydata",    ppc_ydata,      0 },
282   { "reldata",  ppc_reldata,    0 },
283   { "rdata",    ppc_rdata,      0 },
284   { "ualong",   ppc_ualong,     0 },
285   { "znop",     ppc_znop,       0 },
286   { "comm",     ppc_pe_comm,    0 },
287   { "lcomm",    ppc_pe_comm,    1 },
288   { "section",  ppc_pe_section, 0 },
289   { "function", ppc_pe_function,0 },
290   { "tocd",     ppc_pe_tocd,    0 },
291 #endif
292
293 #if defined (OBJ_XCOFF) || defined (OBJ_ELF)
294   { "tc",       ppc_tc,         0 },
295   { "machine",  ppc_machine,    0 },
296 #endif
297
298   { NULL,       NULL,           0 }
299 };
300
301 \f
302 /* Predefined register names if -mregnames (or default for Windows NT).
303    In general, there are lots of them, in an attempt to be compatible
304    with a number of other Windows NT assemblers.  */
305
306 /* Structure to hold information about predefined registers.  */
307 struct pd_reg
308   {
309     const char *name;
310     unsigned short value;
311     unsigned short flags;
312   };
313
314 /* List of registers that are pre-defined:
315
316    Each general register has predefined names of the form:
317    1. r<reg_num> which has the value <reg_num>.
318    2. r.<reg_num> which has the value <reg_num>.
319
320    Each floating point register has predefined names of the form:
321    1. f<reg_num> which has the value <reg_num>.
322    2. f.<reg_num> which has the value <reg_num>.
323
324    Each vector unit register has predefined names of the form:
325    1. v<reg_num> which has the value <reg_num>.
326    2. v.<reg_num> which has the value <reg_num>.
327
328    Each condition register has predefined names of the form:
329    1. cr<reg_num> which has the value <reg_num>.
330    2. cr.<reg_num> which has the value <reg_num>.
331
332    There are individual registers as well:
333    sp or r.sp     has the value 1
334    rtoc or r.toc  has the value 2
335    xer            has the value 1
336    lr             has the value 8
337    ctr            has the value 9
338    dar            has the value 19
339    dsisr          has the value 18
340    dec            has the value 22
341    sdr1           has the value 25
342    srr0           has the value 26
343    srr1           has the value 27
344
345    The table is sorted. Suitable for searching by a binary search.  */
346
347 static const struct pd_reg pre_defined_registers[] =
348 {
349   /* Condition Registers */
350   { "cr.0", 0, PPC_OPERAND_CR_REG },
351   { "cr.1", 1, PPC_OPERAND_CR_REG },
352   { "cr.2", 2, PPC_OPERAND_CR_REG },
353   { "cr.3", 3, PPC_OPERAND_CR_REG },
354   { "cr.4", 4, PPC_OPERAND_CR_REG },
355   { "cr.5", 5, PPC_OPERAND_CR_REG },
356   { "cr.6", 6, PPC_OPERAND_CR_REG },
357   { "cr.7", 7, PPC_OPERAND_CR_REG },
358
359   { "cr0", 0, PPC_OPERAND_CR_REG },
360   { "cr1", 1, PPC_OPERAND_CR_REG },
361   { "cr2", 2, PPC_OPERAND_CR_REG },
362   { "cr3", 3, PPC_OPERAND_CR_REG },
363   { "cr4", 4, PPC_OPERAND_CR_REG },
364   { "cr5", 5, PPC_OPERAND_CR_REG },
365   { "cr6", 6, PPC_OPERAND_CR_REG },
366   { "cr7", 7, PPC_OPERAND_CR_REG },
367
368   { "ctr", 9, PPC_OPERAND_SPR },
369   { "dar", 19, PPC_OPERAND_SPR },
370   { "dec", 22, PPC_OPERAND_SPR },
371   { "dsisr", 18, PPC_OPERAND_SPR },
372
373   /* Floating point registers */
374   { "f.0", 0, PPC_OPERAND_FPR },
375   { "f.1", 1, PPC_OPERAND_FPR },
376   { "f.10", 10, PPC_OPERAND_FPR },
377   { "f.11", 11, PPC_OPERAND_FPR },
378   { "f.12", 12, PPC_OPERAND_FPR },
379   { "f.13", 13, PPC_OPERAND_FPR },
380   { "f.14", 14, PPC_OPERAND_FPR },
381   { "f.15", 15, PPC_OPERAND_FPR },
382   { "f.16", 16, PPC_OPERAND_FPR },
383   { "f.17", 17, PPC_OPERAND_FPR },
384   { "f.18", 18, PPC_OPERAND_FPR },
385   { "f.19", 19, PPC_OPERAND_FPR },
386   { "f.2", 2, PPC_OPERAND_FPR },
387   { "f.20", 20, PPC_OPERAND_FPR },
388   { "f.21", 21, PPC_OPERAND_FPR },
389   { "f.22", 22, PPC_OPERAND_FPR },
390   { "f.23", 23, PPC_OPERAND_FPR },
391   { "f.24", 24, PPC_OPERAND_FPR },
392   { "f.25", 25, PPC_OPERAND_FPR },
393   { "f.26", 26, PPC_OPERAND_FPR },
394   { "f.27", 27, PPC_OPERAND_FPR },
395   { "f.28", 28, PPC_OPERAND_FPR },
396   { "f.29", 29, PPC_OPERAND_FPR },
397   { "f.3", 3, PPC_OPERAND_FPR },
398   { "f.30", 30, PPC_OPERAND_FPR },
399   { "f.31", 31, PPC_OPERAND_FPR },
400   { "f.32", 32, PPC_OPERAND_VSR },
401   { "f.33", 33, PPC_OPERAND_VSR },
402   { "f.34", 34, PPC_OPERAND_VSR },
403   { "f.35", 35, PPC_OPERAND_VSR },
404   { "f.36", 36, PPC_OPERAND_VSR },
405   { "f.37", 37, PPC_OPERAND_VSR },
406   { "f.38", 38, PPC_OPERAND_VSR },
407   { "f.39", 39, PPC_OPERAND_VSR },
408   { "f.4", 4, PPC_OPERAND_FPR },
409   { "f.40", 40, PPC_OPERAND_VSR },
410   { "f.41", 41, PPC_OPERAND_VSR },
411   { "f.42", 42, PPC_OPERAND_VSR },
412   { "f.43", 43, PPC_OPERAND_VSR },
413   { "f.44", 44, PPC_OPERAND_VSR },
414   { "f.45", 45, PPC_OPERAND_VSR },
415   { "f.46", 46, PPC_OPERAND_VSR },
416   { "f.47", 47, PPC_OPERAND_VSR },
417   { "f.48", 48, PPC_OPERAND_VSR },
418   { "f.49", 49, PPC_OPERAND_VSR },
419   { "f.5", 5, PPC_OPERAND_FPR },
420   { "f.50", 50, PPC_OPERAND_VSR },
421   { "f.51", 51, PPC_OPERAND_VSR },
422   { "f.52", 52, PPC_OPERAND_VSR },
423   { "f.53", 53, PPC_OPERAND_VSR },
424   { "f.54", 54, PPC_OPERAND_VSR },
425   { "f.55", 55, PPC_OPERAND_VSR },
426   { "f.56", 56, PPC_OPERAND_VSR },
427   { "f.57", 57, PPC_OPERAND_VSR },
428   { "f.58", 58, PPC_OPERAND_VSR },
429   { "f.59", 59, PPC_OPERAND_VSR },
430   { "f.6", 6, PPC_OPERAND_FPR },
431   { "f.60", 60, PPC_OPERAND_VSR },
432   { "f.61", 61, PPC_OPERAND_VSR },
433   { "f.62", 62, PPC_OPERAND_VSR },
434   { "f.63", 63, PPC_OPERAND_VSR },
435   { "f.7", 7, PPC_OPERAND_FPR },
436   { "f.8", 8, PPC_OPERAND_FPR },
437   { "f.9", 9, PPC_OPERAND_FPR },
438
439   { "f0", 0, PPC_OPERAND_FPR },
440   { "f1", 1, PPC_OPERAND_FPR },
441   { "f10", 10, PPC_OPERAND_FPR },
442   { "f11", 11, PPC_OPERAND_FPR },
443   { "f12", 12, PPC_OPERAND_FPR },
444   { "f13", 13, PPC_OPERAND_FPR },
445   { "f14", 14, PPC_OPERAND_FPR },
446   { "f15", 15, PPC_OPERAND_FPR },
447   { "f16", 16, PPC_OPERAND_FPR },
448   { "f17", 17, PPC_OPERAND_FPR },
449   { "f18", 18, PPC_OPERAND_FPR },
450   { "f19", 19, PPC_OPERAND_FPR },
451   { "f2", 2, PPC_OPERAND_FPR },
452   { "f20", 20, PPC_OPERAND_FPR },
453   { "f21", 21, PPC_OPERAND_FPR },
454   { "f22", 22, PPC_OPERAND_FPR },
455   { "f23", 23, PPC_OPERAND_FPR },
456   { "f24", 24, PPC_OPERAND_FPR },
457   { "f25", 25, PPC_OPERAND_FPR },
458   { "f26", 26, PPC_OPERAND_FPR },
459   { "f27", 27, PPC_OPERAND_FPR },
460   { "f28", 28, PPC_OPERAND_FPR },
461   { "f29", 29, PPC_OPERAND_FPR },
462   { "f3", 3, PPC_OPERAND_FPR },
463   { "f30", 30, PPC_OPERAND_FPR },
464   { "f31", 31, PPC_OPERAND_FPR },
465   { "f32", 32, PPC_OPERAND_VSR },
466   { "f33", 33, PPC_OPERAND_VSR },
467   { "f34", 34, PPC_OPERAND_VSR },
468   { "f35", 35, PPC_OPERAND_VSR },
469   { "f36", 36, PPC_OPERAND_VSR },
470   { "f37", 37, PPC_OPERAND_VSR },
471   { "f38", 38, PPC_OPERAND_VSR },
472   { "f39", 39, PPC_OPERAND_VSR },
473   { "f4", 4, PPC_OPERAND_FPR },
474   { "f40", 40, PPC_OPERAND_VSR },
475   { "f41", 41, PPC_OPERAND_VSR },
476   { "f42", 42, PPC_OPERAND_VSR },
477   { "f43", 43, PPC_OPERAND_VSR },
478   { "f44", 44, PPC_OPERAND_VSR },
479   { "f45", 45, PPC_OPERAND_VSR },
480   { "f46", 46, PPC_OPERAND_VSR },
481   { "f47", 47, PPC_OPERAND_VSR },
482   { "f48", 48, PPC_OPERAND_VSR },
483   { "f49", 49, PPC_OPERAND_VSR },
484   { "f5", 5, PPC_OPERAND_FPR },
485   { "f50", 50, PPC_OPERAND_VSR },
486   { "f51", 51, PPC_OPERAND_VSR },
487   { "f52", 52, PPC_OPERAND_VSR },
488   { "f53", 53, PPC_OPERAND_VSR },
489   { "f54", 54, PPC_OPERAND_VSR },
490   { "f55", 55, PPC_OPERAND_VSR },
491   { "f56", 56, PPC_OPERAND_VSR },
492   { "f57", 57, PPC_OPERAND_VSR },
493   { "f58", 58, PPC_OPERAND_VSR },
494   { "f59", 59, PPC_OPERAND_VSR },
495   { "f6", 6, PPC_OPERAND_FPR },
496   { "f60", 60, PPC_OPERAND_VSR },
497   { "f61", 61, PPC_OPERAND_VSR },
498   { "f62", 62, PPC_OPERAND_VSR },
499   { "f63", 63, PPC_OPERAND_VSR },
500   { "f7", 7, PPC_OPERAND_FPR },
501   { "f8", 8, PPC_OPERAND_FPR },
502   { "f9", 9, PPC_OPERAND_FPR },
503
504   /* Quantization registers used with pair single instructions.  */
505   { "gqr.0", 0, PPC_OPERAND_GQR },
506   { "gqr.1", 1, PPC_OPERAND_GQR },
507   { "gqr.2", 2, PPC_OPERAND_GQR },
508   { "gqr.3", 3, PPC_OPERAND_GQR },
509   { "gqr.4", 4, PPC_OPERAND_GQR },
510   { "gqr.5", 5, PPC_OPERAND_GQR },
511   { "gqr.6", 6, PPC_OPERAND_GQR },
512   { "gqr.7", 7, PPC_OPERAND_GQR },
513   { "gqr0", 0, PPC_OPERAND_GQR },
514   { "gqr1", 1, PPC_OPERAND_GQR },
515   { "gqr2", 2, PPC_OPERAND_GQR },
516   { "gqr3", 3, PPC_OPERAND_GQR },
517   { "gqr4", 4, PPC_OPERAND_GQR },
518   { "gqr5", 5, PPC_OPERAND_GQR },
519   { "gqr6", 6, PPC_OPERAND_GQR },
520   { "gqr7", 7, PPC_OPERAND_GQR },
521
522   { "lr", 8, PPC_OPERAND_SPR },
523
524   /* General Purpose Registers */
525   { "r.0", 0, PPC_OPERAND_GPR },
526   { "r.1", 1, PPC_OPERAND_GPR },
527   { "r.10", 10, PPC_OPERAND_GPR },
528   { "r.11", 11, PPC_OPERAND_GPR },
529   { "r.12", 12, PPC_OPERAND_GPR },
530   { "r.13", 13, PPC_OPERAND_GPR },
531   { "r.14", 14, PPC_OPERAND_GPR },
532   { "r.15", 15, PPC_OPERAND_GPR },
533   { "r.16", 16, PPC_OPERAND_GPR },
534   { "r.17", 17, PPC_OPERAND_GPR },
535   { "r.18", 18, PPC_OPERAND_GPR },
536   { "r.19", 19, PPC_OPERAND_GPR },
537   { "r.2", 2, PPC_OPERAND_GPR },
538   { "r.20", 20, PPC_OPERAND_GPR },
539   { "r.21", 21, PPC_OPERAND_GPR },
540   { "r.22", 22, PPC_OPERAND_GPR },
541   { "r.23", 23, PPC_OPERAND_GPR },
542   { "r.24", 24, PPC_OPERAND_GPR },
543   { "r.25", 25, PPC_OPERAND_GPR },
544   { "r.26", 26, PPC_OPERAND_GPR },
545   { "r.27", 27, PPC_OPERAND_GPR },
546   { "r.28", 28, PPC_OPERAND_GPR },
547   { "r.29", 29, PPC_OPERAND_GPR },
548   { "r.3", 3, PPC_OPERAND_GPR },
549   { "r.30", 30, PPC_OPERAND_GPR },
550   { "r.31", 31, PPC_OPERAND_GPR },
551   { "r.4", 4, PPC_OPERAND_GPR },
552   { "r.5", 5, PPC_OPERAND_GPR },
553   { "r.6", 6, PPC_OPERAND_GPR },
554   { "r.7", 7, PPC_OPERAND_GPR },
555   { "r.8", 8, PPC_OPERAND_GPR },
556   { "r.9", 9, PPC_OPERAND_GPR },
557
558   { "r.sp", 1, PPC_OPERAND_GPR },
559
560   { "r.toc", 2, PPC_OPERAND_GPR },
561
562   { "r0", 0, PPC_OPERAND_GPR },
563   { "r1", 1, PPC_OPERAND_GPR },
564   { "r10", 10, PPC_OPERAND_GPR },
565   { "r11", 11, PPC_OPERAND_GPR },
566   { "r12", 12, PPC_OPERAND_GPR },
567   { "r13", 13, PPC_OPERAND_GPR },
568   { "r14", 14, PPC_OPERAND_GPR },
569   { "r15", 15, PPC_OPERAND_GPR },
570   { "r16", 16, PPC_OPERAND_GPR },
571   { "r17", 17, PPC_OPERAND_GPR },
572   { "r18", 18, PPC_OPERAND_GPR },
573   { "r19", 19, PPC_OPERAND_GPR },
574   { "r2", 2, PPC_OPERAND_GPR },
575   { "r20", 20, PPC_OPERAND_GPR },
576   { "r21", 21, PPC_OPERAND_GPR },
577   { "r22", 22, PPC_OPERAND_GPR },
578   { "r23", 23, PPC_OPERAND_GPR },
579   { "r24", 24, PPC_OPERAND_GPR },
580   { "r25", 25, PPC_OPERAND_GPR },
581   { "r26", 26, PPC_OPERAND_GPR },
582   { "r27", 27, PPC_OPERAND_GPR },
583   { "r28", 28, PPC_OPERAND_GPR },
584   { "r29", 29, PPC_OPERAND_GPR },
585   { "r3", 3, PPC_OPERAND_GPR },
586   { "r30", 30, PPC_OPERAND_GPR },
587   { "r31", 31, PPC_OPERAND_GPR },
588   { "r4", 4, PPC_OPERAND_GPR },
589   { "r5", 5, PPC_OPERAND_GPR },
590   { "r6", 6, PPC_OPERAND_GPR },
591   { "r7", 7, PPC_OPERAND_GPR },
592   { "r8", 8, PPC_OPERAND_GPR },
593   { "r9", 9, PPC_OPERAND_GPR },
594
595   { "rtoc", 2, PPC_OPERAND_GPR },
596
597   { "sdr1", 25, PPC_OPERAND_SPR },
598
599   { "sp", 1, PPC_OPERAND_GPR },
600
601   { "srr0", 26, PPC_OPERAND_SPR },
602   { "srr1", 27, PPC_OPERAND_SPR },
603
604   /* Vector (Altivec/VMX) registers */
605   { "v.0", 0, PPC_OPERAND_VR },
606   { "v.1", 1, PPC_OPERAND_VR },
607   { "v.10", 10, PPC_OPERAND_VR },
608   { "v.11", 11, PPC_OPERAND_VR },
609   { "v.12", 12, PPC_OPERAND_VR },
610   { "v.13", 13, PPC_OPERAND_VR },
611   { "v.14", 14, PPC_OPERAND_VR },
612   { "v.15", 15, PPC_OPERAND_VR },
613   { "v.16", 16, PPC_OPERAND_VR },
614   { "v.17", 17, PPC_OPERAND_VR },
615   { "v.18", 18, PPC_OPERAND_VR },
616   { "v.19", 19, PPC_OPERAND_VR },
617   { "v.2", 2, PPC_OPERAND_VR },
618   { "v.20", 20, PPC_OPERAND_VR },
619   { "v.21", 21, PPC_OPERAND_VR },
620   { "v.22", 22, PPC_OPERAND_VR },
621   { "v.23", 23, PPC_OPERAND_VR },
622   { "v.24", 24, PPC_OPERAND_VR },
623   { "v.25", 25, PPC_OPERAND_VR },
624   { "v.26", 26, PPC_OPERAND_VR },
625   { "v.27", 27, PPC_OPERAND_VR },
626   { "v.28", 28, PPC_OPERAND_VR },
627   { "v.29", 29, PPC_OPERAND_VR },
628   { "v.3", 3, PPC_OPERAND_VR },
629   { "v.30", 30, PPC_OPERAND_VR },
630   { "v.31", 31, PPC_OPERAND_VR },
631   { "v.4", 4, PPC_OPERAND_VR },
632   { "v.5", 5, PPC_OPERAND_VR },
633   { "v.6", 6, PPC_OPERAND_VR },
634   { "v.7", 7, PPC_OPERAND_VR },
635   { "v.8", 8, PPC_OPERAND_VR },
636   { "v.9", 9, PPC_OPERAND_VR },
637
638   { "v0", 0, PPC_OPERAND_VR },
639   { "v1", 1, PPC_OPERAND_VR },
640   { "v10", 10, PPC_OPERAND_VR },
641   { "v11", 11, PPC_OPERAND_VR },
642   { "v12", 12, PPC_OPERAND_VR },
643   { "v13", 13, PPC_OPERAND_VR },
644   { "v14", 14, PPC_OPERAND_VR },
645   { "v15", 15, PPC_OPERAND_VR },
646   { "v16", 16, PPC_OPERAND_VR },
647   { "v17", 17, PPC_OPERAND_VR },
648   { "v18", 18, PPC_OPERAND_VR },
649   { "v19", 19, PPC_OPERAND_VR },
650   { "v2", 2, PPC_OPERAND_VR },
651   { "v20", 20, PPC_OPERAND_VR },
652   { "v21", 21, PPC_OPERAND_VR },
653   { "v22", 22, PPC_OPERAND_VR },
654   { "v23", 23, PPC_OPERAND_VR },
655   { "v24", 24, PPC_OPERAND_VR },
656   { "v25", 25, PPC_OPERAND_VR },
657   { "v26", 26, PPC_OPERAND_VR },
658   { "v27", 27, PPC_OPERAND_VR },
659   { "v28", 28, PPC_OPERAND_VR },
660   { "v29", 29, PPC_OPERAND_VR },
661   { "v3", 3, PPC_OPERAND_VR },
662   { "v30", 30, PPC_OPERAND_VR },
663   { "v31", 31, PPC_OPERAND_VR },
664   { "v4", 4, PPC_OPERAND_VR },
665   { "v5", 5, PPC_OPERAND_VR },
666   { "v6", 6, PPC_OPERAND_VR },
667   { "v7", 7, PPC_OPERAND_VR },
668   { "v8", 8, PPC_OPERAND_VR },
669   { "v9", 9, PPC_OPERAND_VR },
670
671   /* Vector Scalar (VSX) registers (ISA 2.06).  */
672   { "vs.0", 0, PPC_OPERAND_VSR },
673   { "vs.1", 1, PPC_OPERAND_VSR },
674   { "vs.10", 10, PPC_OPERAND_VSR },
675   { "vs.11", 11, PPC_OPERAND_VSR },
676   { "vs.12", 12, PPC_OPERAND_VSR },
677   { "vs.13", 13, PPC_OPERAND_VSR },
678   { "vs.14", 14, PPC_OPERAND_VSR },
679   { "vs.15", 15, PPC_OPERAND_VSR },
680   { "vs.16", 16, PPC_OPERAND_VSR },
681   { "vs.17", 17, PPC_OPERAND_VSR },
682   { "vs.18", 18, PPC_OPERAND_VSR },
683   { "vs.19", 19, PPC_OPERAND_VSR },
684   { "vs.2", 2, PPC_OPERAND_VSR },
685   { "vs.20", 20, PPC_OPERAND_VSR },
686   { "vs.21", 21, PPC_OPERAND_VSR },
687   { "vs.22", 22, PPC_OPERAND_VSR },
688   { "vs.23", 23, PPC_OPERAND_VSR },
689   { "vs.24", 24, PPC_OPERAND_VSR },
690   { "vs.25", 25, PPC_OPERAND_VSR },
691   { "vs.26", 26, PPC_OPERAND_VSR },
692   { "vs.27", 27, PPC_OPERAND_VSR },
693   { "vs.28", 28, PPC_OPERAND_VSR },
694   { "vs.29", 29, PPC_OPERAND_VSR },
695   { "vs.3", 3, PPC_OPERAND_VSR },
696   { "vs.30", 30, PPC_OPERAND_VSR },
697   { "vs.31", 31, PPC_OPERAND_VSR },
698   { "vs.32", 32, PPC_OPERAND_VSR },
699   { "vs.33", 33, PPC_OPERAND_VSR },
700   { "vs.34", 34, PPC_OPERAND_VSR },
701   { "vs.35", 35, PPC_OPERAND_VSR },
702   { "vs.36", 36, PPC_OPERAND_VSR },
703   { "vs.37", 37, PPC_OPERAND_VSR },
704   { "vs.38", 38, PPC_OPERAND_VSR },
705   { "vs.39", 39, PPC_OPERAND_VSR },
706   { "vs.4", 4, PPC_OPERAND_VSR },
707   { "vs.40", 40, PPC_OPERAND_VSR },
708   { "vs.41", 41, PPC_OPERAND_VSR },
709   { "vs.42", 42, PPC_OPERAND_VSR },
710   { "vs.43", 43, PPC_OPERAND_VSR },
711   { "vs.44", 44, PPC_OPERAND_VSR },
712   { "vs.45", 45, PPC_OPERAND_VSR },
713   { "vs.46", 46, PPC_OPERAND_VSR },
714   { "vs.47", 47, PPC_OPERAND_VSR },
715   { "vs.48", 48, PPC_OPERAND_VSR },
716   { "vs.49", 49, PPC_OPERAND_VSR },
717   { "vs.5", 5, PPC_OPERAND_VSR },
718   { "vs.50", 50, PPC_OPERAND_VSR },
719   { "vs.51", 51, PPC_OPERAND_VSR },
720   { "vs.52", 52, PPC_OPERAND_VSR },
721   { "vs.53", 53, PPC_OPERAND_VSR },
722   { "vs.54", 54, PPC_OPERAND_VSR },
723   { "vs.55", 55, PPC_OPERAND_VSR },
724   { "vs.56", 56, PPC_OPERAND_VSR },
725   { "vs.57", 57, PPC_OPERAND_VSR },
726   { "vs.58", 58, PPC_OPERAND_VSR },
727   { "vs.59", 59, PPC_OPERAND_VSR },
728   { "vs.6", 6, PPC_OPERAND_VSR },
729   { "vs.60", 60, PPC_OPERAND_VSR },
730   { "vs.61", 61, PPC_OPERAND_VSR },
731   { "vs.62", 62, PPC_OPERAND_VSR },
732   { "vs.63", 63, PPC_OPERAND_VSR },
733   { "vs.7", 7, PPC_OPERAND_VSR },
734   { "vs.8", 8, PPC_OPERAND_VSR },
735   { "vs.9", 9, PPC_OPERAND_VSR },
736
737   { "vs0", 0, PPC_OPERAND_VSR },
738   { "vs1", 1, PPC_OPERAND_VSR },
739   { "vs10", 10, PPC_OPERAND_VSR },
740   { "vs11", 11, PPC_OPERAND_VSR },
741   { "vs12", 12, PPC_OPERAND_VSR },
742   { "vs13", 13, PPC_OPERAND_VSR },
743   { "vs14", 14, PPC_OPERAND_VSR },
744   { "vs15", 15, PPC_OPERAND_VSR },
745   { "vs16", 16, PPC_OPERAND_VSR },
746   { "vs17", 17, PPC_OPERAND_VSR },
747   { "vs18", 18, PPC_OPERAND_VSR },
748   { "vs19", 19, PPC_OPERAND_VSR },
749   { "vs2", 2, PPC_OPERAND_VSR },
750   { "vs20", 20, PPC_OPERAND_VSR },
751   { "vs21", 21, PPC_OPERAND_VSR },
752   { "vs22", 22, PPC_OPERAND_VSR },
753   { "vs23", 23, PPC_OPERAND_VSR },
754   { "vs24", 24, PPC_OPERAND_VSR },
755   { "vs25", 25, PPC_OPERAND_VSR },
756   { "vs26", 26, PPC_OPERAND_VSR },
757   { "vs27", 27, PPC_OPERAND_VSR },
758   { "vs28", 28, PPC_OPERAND_VSR },
759   { "vs29", 29, PPC_OPERAND_VSR },
760   { "vs3", 3, PPC_OPERAND_VSR },
761   { "vs30", 30, PPC_OPERAND_VSR },
762   { "vs31", 31, PPC_OPERAND_VSR },
763   { "vs32", 32, PPC_OPERAND_VSR },
764   { "vs33", 33, PPC_OPERAND_VSR },
765   { "vs34", 34, PPC_OPERAND_VSR },
766   { "vs35", 35, PPC_OPERAND_VSR },
767   { "vs36", 36, PPC_OPERAND_VSR },
768   { "vs37", 37, PPC_OPERAND_VSR },
769   { "vs38", 38, PPC_OPERAND_VSR },
770   { "vs39", 39, PPC_OPERAND_VSR },
771   { "vs4", 4, PPC_OPERAND_VSR },
772   { "vs40", 40, PPC_OPERAND_VSR },
773   { "vs41", 41, PPC_OPERAND_VSR },
774   { "vs42", 42, PPC_OPERAND_VSR },
775   { "vs43", 43, PPC_OPERAND_VSR },
776   { "vs44", 44, PPC_OPERAND_VSR },
777   { "vs45", 45, PPC_OPERAND_VSR },
778   { "vs46", 46, PPC_OPERAND_VSR },
779   { "vs47", 47, PPC_OPERAND_VSR },
780   { "vs48", 48, PPC_OPERAND_VSR },
781   { "vs49", 49, PPC_OPERAND_VSR },
782   { "vs5", 5, PPC_OPERAND_VSR },
783   { "vs50", 50, PPC_OPERAND_VSR },
784   { "vs51", 51, PPC_OPERAND_VSR },
785   { "vs52", 52, PPC_OPERAND_VSR },
786   { "vs53", 53, PPC_OPERAND_VSR },
787   { "vs54", 54, PPC_OPERAND_VSR },
788   { "vs55", 55, PPC_OPERAND_VSR },
789   { "vs56", 56, PPC_OPERAND_VSR },
790   { "vs57", 57, PPC_OPERAND_VSR },
791   { "vs58", 58, PPC_OPERAND_VSR },
792   { "vs59", 59, PPC_OPERAND_VSR },
793   { "vs6", 6, PPC_OPERAND_VSR },
794   { "vs60", 60, PPC_OPERAND_VSR },
795   { "vs61", 61, PPC_OPERAND_VSR },
796   { "vs62", 62, PPC_OPERAND_VSR },
797   { "vs63", 63, PPC_OPERAND_VSR },
798   { "vs7", 7, PPC_OPERAND_VSR },
799   { "vs8", 8, PPC_OPERAND_VSR },
800   { "vs9", 9, PPC_OPERAND_VSR },
801
802   { "xer", 1, PPC_OPERAND_SPR }
803 };
804
805 #define REG_NAME_CNT    (sizeof (pre_defined_registers) / sizeof (struct pd_reg))
806
807 /* Given NAME, find the register number associated with that name, return
808    the integer value associated with the given name or -1 on failure.  */
809
810 static const struct pd_reg *
811 reg_name_search (const struct pd_reg *regs, int regcount, const char *name)
812 {
813   int middle, low, high;
814   int cmp;
815
816   low = 0;
817   high = regcount - 1;
818
819   do
820     {
821       middle = (low + high) / 2;
822       cmp = strcasecmp (name, regs[middle].name);
823       if (cmp < 0)
824         high = middle - 1;
825       else if (cmp > 0)
826         low = middle + 1;
827       else
828         return &regs[middle];
829     }
830   while (low <= high);
831
832   return NULL;
833 }
834
835 /*
836  * Summary of register_name.
837  *
838  * in:  Input_line_pointer points to 1st char of operand.
839  *
840  * out: A expressionS.
841  *      The operand may have been a register: in this case, X_op == O_register,
842  *      X_add_number is set to the register number, and truth is returned.
843  *      Input_line_pointer->(next non-blank) char after operand, or is in its
844  *      original state.
845  */
846
847 static bfd_boolean
848 register_name (expressionS *expressionP)
849 {
850   const struct pd_reg *reg;
851   char *name;
852   char *start;
853   char c;
854
855   /* Find the spelling of the operand.  */
856   start = name = input_line_pointer;
857   if (name[0] == '%' && ISALPHA (name[1]))
858     name = ++input_line_pointer;
859
860   else if (!reg_names_p || !ISALPHA (name[0]))
861     return FALSE;
862
863   c = get_symbol_name (&name);
864   reg = reg_name_search (pre_defined_registers, REG_NAME_CNT, name);
865
866   /* Put back the delimiting char.  */
867   *input_line_pointer = c;
868
869   /* Look to see if it's in the register table.  */
870   if (reg != NULL)
871     {
872       expressionP->X_op = O_register;
873       expressionP->X_add_number = reg->value;
874       expressionP->X_md = reg->flags;
875
876       /* Make the rest nice.  */
877       expressionP->X_add_symbol = NULL;
878       expressionP->X_op_symbol = NULL;
879       return TRUE;
880     }
881
882   /* Reset the line as if we had not done anything.  */
883   input_line_pointer = start;
884   return FALSE;
885 }
886 \f
887 /* This function is called for each symbol seen in an expression.  It
888    handles the special parsing which PowerPC assemblers are supposed
889    to use for condition codes.  */
890
891 /* Whether to do the special parsing.  */
892 static bfd_boolean cr_operand;
893
894 /* Names to recognize in a condition code.  This table is sorted.  */
895 static const struct pd_reg cr_names[] =
896 {
897   { "cr0", 0, PPC_OPERAND_CR_REG },
898   { "cr1", 1, PPC_OPERAND_CR_REG },
899   { "cr2", 2, PPC_OPERAND_CR_REG },
900   { "cr3", 3, PPC_OPERAND_CR_REG },
901   { "cr4", 4, PPC_OPERAND_CR_REG },
902   { "cr5", 5, PPC_OPERAND_CR_REG },
903   { "cr6", 6, PPC_OPERAND_CR_REG },
904   { "cr7", 7, PPC_OPERAND_CR_REG },
905   { "eq", 2, PPC_OPERAND_CR_BIT },
906   { "gt", 1, PPC_OPERAND_CR_BIT },
907   { "lt", 0, PPC_OPERAND_CR_BIT },
908   { "so", 3, PPC_OPERAND_CR_BIT },
909   { "un", 3, PPC_OPERAND_CR_BIT }
910 };
911
912 /* Parsing function.  This returns non-zero if it recognized an
913    expression.  */
914
915 int
916 ppc_parse_name (const char *name, expressionS *exp)
917 {
918   const struct pd_reg *reg;
919
920   if (! cr_operand)
921     return 0;
922
923   if (*name == '%')
924     ++name;
925   reg = reg_name_search (cr_names, sizeof cr_names / sizeof cr_names[0],
926                          name);
927   if (reg == NULL)
928     return 0;
929
930   exp->X_op = O_register;
931   exp->X_add_number = reg->value;
932   exp->X_md = reg->flags;
933
934   return 1;
935 }
936
937 /* Propagate X_md and check register expressions.  This is to support
938    condition codes like 4*cr5+eq.  */
939
940 int
941 ppc_optimize_expr (expressionS *left, operatorT op, expressionS *right)
942 {
943   /* Accept 4*cr<n> and cr<n>*4.  */
944   if (op == O_multiply
945       && ((right->X_op == O_register
946            && right->X_md == PPC_OPERAND_CR_REG
947            && left->X_op == O_constant
948            && left->X_add_number == 4)
949           || (left->X_op == O_register
950               && left->X_md == PPC_OPERAND_CR_REG
951               && right->X_op == O_constant
952               && right->X_add_number == 4)))
953     {
954       left->X_op = O_register;
955       left->X_md = PPC_OPERAND_CR_REG | PPC_OPERAND_CR_BIT;
956       left->X_add_number *= right->X_add_number;
957       return 1;
958     }
959
960   /* Accept the above plus <cr bit>, and <cr bit> plus the above.  */
961   if (right->X_op == O_register
962       && left->X_op == O_register
963       && op == O_add
964       && ((right->X_md == PPC_OPERAND_CR_BIT
965            && left->X_md == (PPC_OPERAND_CR_REG | PPC_OPERAND_CR_BIT))
966           || (right->X_md == (PPC_OPERAND_CR_REG | PPC_OPERAND_CR_BIT)
967               && left->X_md == PPC_OPERAND_CR_BIT)))
968     {
969       left->X_md = PPC_OPERAND_CR_BIT;
970       right->X_op = O_constant;
971       return 0;
972     }
973
974   /* Accept reg +/- constant.  */
975   if (left->X_op == O_register
976       && !((op == O_add || op == O_subtract) && right->X_op == O_constant))
977     as_warn (_("invalid register expression"));
978
979   /* Accept constant + reg.  */
980   if (right->X_op == O_register)
981     {
982       if (op == O_add && left->X_op == O_constant)
983         left->X_md = right->X_md;
984       else
985         as_warn (_("invalid register expression"));
986     }
987
988   return 0;
989 }
990 \f
991 /* Local variables.  */
992
993 /* Whether to target xcoff64/elf64.  */
994 static unsigned int ppc_obj64 = BFD_DEFAULT_TARGET_SIZE == 64;
995
996 /* Opcode hash table.  */
997 static struct hash_control *ppc_hash;
998
999 /* Macro hash table.  */
1000 static struct hash_control *ppc_macro_hash;
1001
1002 #ifdef OBJ_ELF
1003 /* What type of shared library support to use.  */
1004 static enum { SHLIB_NONE, SHLIB_PIC, SHLIB_MRELOCATABLE } shlib = SHLIB_NONE;
1005
1006 /* Flags to set in the elf header.  */
1007 static flagword ppc_flags = 0;
1008
1009 /* Whether this is Solaris or not.  */
1010 #ifdef TARGET_SOLARIS_COMMENT
1011 #define SOLARIS_P TRUE
1012 #else
1013 #define SOLARIS_P FALSE
1014 #endif
1015
1016 static bfd_boolean msolaris = SOLARIS_P;
1017 #endif
1018
1019 #ifdef OBJ_XCOFF
1020
1021 /* The RS/6000 assembler uses the .csect pseudo-op to generate code
1022    using a bunch of different sections.  These assembler sections,
1023    however, are all encompassed within the .text or .data sections of
1024    the final output file.  We handle this by using different
1025    subsegments within these main segments.  */
1026
1027 /* Next subsegment to allocate within the .text segment.  */
1028 static subsegT ppc_text_subsegment = 2;
1029
1030 /* Linked list of csects in the text section.  */
1031 static symbolS *ppc_text_csects;
1032
1033 /* Next subsegment to allocate within the .data segment.  */
1034 static subsegT ppc_data_subsegment = 2;
1035
1036 /* Linked list of csects in the data section.  */
1037 static symbolS *ppc_data_csects;
1038
1039 /* The current csect.  */
1040 static symbolS *ppc_current_csect;
1041
1042 /* The RS/6000 assembler uses a TOC which holds addresses of functions
1043    and variables.  Symbols are put in the TOC with the .tc pseudo-op.
1044    A special relocation is used when accessing TOC entries.  We handle
1045    the TOC as a subsegment within the .data segment.  We set it up if
1046    we see a .toc pseudo-op, and save the csect symbol here.  */
1047 static symbolS *ppc_toc_csect;
1048
1049 /* The first frag in the TOC subsegment.  */
1050 static fragS *ppc_toc_frag;
1051
1052 /* The first frag in the first subsegment after the TOC in the .data
1053    segment.  NULL if there are no subsegments after the TOC.  */
1054 static fragS *ppc_after_toc_frag;
1055
1056 /* The current static block.  */
1057 static symbolS *ppc_current_block;
1058
1059 /* The COFF debugging section; set by md_begin.  This is not the
1060    .debug section, but is instead the secret BFD section which will
1061    cause BFD to set the section number of a symbol to N_DEBUG.  */
1062 static asection *ppc_coff_debug_section;
1063
1064 /* Structure to set the length field of the dwarf sections.  */
1065 struct dw_subsection {
1066   /* Subsections are simply linked.  */
1067   struct dw_subsection *link;
1068
1069   /* The subsection number.  */
1070   subsegT subseg;
1071
1072   /* Expression to compute the length of the section.  */
1073   expressionS end_exp;
1074 };
1075
1076 static struct dw_section {
1077   /* Corresponding section.  */
1078   segT sect;
1079
1080   /* Simply linked list of subsections with a label.  */
1081   struct dw_subsection *list_subseg;
1082
1083   /* The anonymous subsection.  */
1084   struct dw_subsection *anon_subseg;
1085 } dw_sections[XCOFF_DWSECT_NBR_NAMES];
1086 #endif /* OBJ_XCOFF */
1087
1088 #ifdef TE_PE
1089
1090 /* Various sections that we need for PE coff support.  */
1091 static segT ydata_section;
1092 static segT pdata_section;
1093 static segT reldata_section;
1094 static segT rdata_section;
1095 static segT tocdata_section;
1096
1097 /* The current section and the previous section. See ppc_previous.  */
1098 static segT ppc_previous_section;
1099 static segT ppc_current_section;
1100
1101 #endif /* TE_PE */
1102
1103 #ifdef OBJ_ELF
1104 symbolS *GOT_symbol;            /* Pre-defined "_GLOBAL_OFFSET_TABLE" */
1105 unsigned long *ppc_apuinfo_list;
1106 unsigned int ppc_apuinfo_num;
1107 unsigned int ppc_apuinfo_num_alloc;
1108 #endif /* OBJ_ELF */
1109 \f
1110 #ifdef OBJ_ELF
1111 const char *const md_shortopts = "b:l:usm:K:VQ:";
1112 #else
1113 const char *const md_shortopts = "um:";
1114 #endif
1115 #define OPTION_NOPS (OPTION_MD_BASE + 0)
1116 const struct option md_longopts[] = {
1117   {"nops", required_argument, NULL, OPTION_NOPS},
1118   {"ppc476-workaround", no_argument, &warn_476, 1},
1119   {"no-ppc476-workaround", no_argument, &warn_476, 0},
1120   {NULL, no_argument, NULL, 0}
1121 };
1122 const size_t md_longopts_size = sizeof (md_longopts);
1123
1124 int
1125 md_parse_option (int c, const char *arg)
1126 {
1127   ppc_cpu_t new_cpu;
1128
1129   switch (c)
1130     {
1131     case 'u':
1132       /* -u means that any undefined symbols should be treated as
1133          external, which is the default for gas anyhow.  */
1134       break;
1135
1136 #ifdef OBJ_ELF
1137     case 'l':
1138       /* Solaris as takes -le (presumably for little endian).  For completeness
1139          sake, recognize -be also.  */
1140       if (strcmp (arg, "e") == 0)
1141         {
1142           target_big_endian = 0;
1143           set_target_endian = 1;
1144           if (ppc_cpu & PPC_OPCODE_VLE)
1145             as_bad (_("the use of -mvle requires big endian."));
1146         }
1147       else
1148         return 0;
1149
1150       break;
1151
1152     case 'b':
1153       if (strcmp (arg, "e") == 0)
1154         {
1155           target_big_endian = 1;
1156           set_target_endian = 1;
1157         }
1158       else
1159         return 0;
1160
1161       break;
1162
1163     case 'K':
1164       /* Recognize -K PIC.  */
1165       if (strcmp (arg, "PIC") == 0 || strcmp (arg, "pic") == 0)
1166         {
1167           shlib = SHLIB_PIC;
1168           ppc_flags |= EF_PPC_RELOCATABLE_LIB;
1169         }
1170       else
1171         return 0;
1172
1173       break;
1174 #endif
1175
1176       /* a64 and a32 determine whether to use XCOFF64 or XCOFF32.  */
1177     case 'a':
1178       if (strcmp (arg, "64") == 0)
1179         {
1180 #ifdef BFD64
1181           ppc_obj64 = 1;
1182           if (ppc_cpu & PPC_OPCODE_VLE)
1183             as_bad (_("the use of -mvle requires -a32."));
1184 #else
1185           as_fatal (_("%s unsupported"), "-a64");
1186 #endif
1187         }
1188       else if (strcmp (arg, "32") == 0)
1189         ppc_obj64 = 0;
1190       else
1191         return 0;
1192       break;
1193
1194     case 'm':
1195       new_cpu = ppc_parse_cpu (ppc_cpu, &sticky, arg);
1196       /* "raw" is only valid for the disassembler.  */
1197       if (new_cpu != 0 && (new_cpu & PPC_OPCODE_RAW) == 0)
1198         {
1199           ppc_cpu = new_cpu;
1200           if (strcmp (arg, "vle") == 0)
1201             {
1202               if (set_target_endian && target_big_endian == 0)
1203                 as_bad (_("the use of -mvle requires big endian."));
1204               if (ppc_obj64)
1205                 as_bad (_("the use of -mvle requires -a32."));
1206             }
1207         }
1208
1209       else if (strcmp (arg, "no-vle") == 0)
1210         {
1211           sticky &= ~PPC_OPCODE_VLE;
1212
1213           new_cpu = ppc_parse_cpu (ppc_cpu, &sticky, "booke");
1214           new_cpu &= ~PPC_OPCODE_VLE;
1215
1216           ppc_cpu = new_cpu;
1217         }
1218
1219       else if (strcmp (arg, "regnames") == 0)
1220         reg_names_p = TRUE;
1221
1222       else if (strcmp (arg, "no-regnames") == 0)
1223         reg_names_p = FALSE;
1224
1225 #ifdef OBJ_ELF
1226       /* -mrelocatable/-mrelocatable-lib -- warn about initializations
1227          that require relocation.  */
1228       else if (strcmp (arg, "relocatable") == 0)
1229         {
1230           shlib = SHLIB_MRELOCATABLE;
1231           ppc_flags |= EF_PPC_RELOCATABLE;
1232         }
1233
1234       else if (strcmp (arg, "relocatable-lib") == 0)
1235         {
1236           shlib = SHLIB_MRELOCATABLE;
1237           ppc_flags |= EF_PPC_RELOCATABLE_LIB;
1238         }
1239
1240       /* -memb, set embedded bit.  */
1241       else if (strcmp (arg, "emb") == 0)
1242         ppc_flags |= EF_PPC_EMB;
1243
1244       /* -mlittle/-mbig set the endianness.  */
1245       else if (strcmp (arg, "little") == 0
1246                || strcmp (arg, "little-endian") == 0)
1247         {
1248           target_big_endian = 0;
1249           set_target_endian = 1;
1250           if (ppc_cpu & PPC_OPCODE_VLE)
1251             as_bad (_("the use of -mvle requires big endian."));
1252         }
1253
1254       else if (strcmp (arg, "big") == 0 || strcmp (arg, "big-endian") == 0)
1255         {
1256           target_big_endian = 1;
1257           set_target_endian = 1;
1258         }
1259
1260       else if (strcmp (arg, "solaris") == 0)
1261         {
1262           msolaris = TRUE;
1263           ppc_comment_chars = ppc_solaris_comment_chars;
1264         }
1265
1266       else if (strcmp (arg, "no-solaris") == 0)
1267         {
1268           msolaris = FALSE;
1269           ppc_comment_chars = ppc_eabi_comment_chars;
1270         }
1271       else if (strcmp (arg, "spe2") == 0)
1272         {
1273           ppc_cpu |= PPC_OPCODE_SPE2;
1274         }
1275 #endif
1276       else
1277         {
1278           as_bad (_("invalid switch -m%s"), arg);
1279           return 0;
1280         }
1281       break;
1282
1283 #ifdef OBJ_ELF
1284       /* -V: SVR4 argument to print version ID.  */
1285     case 'V':
1286       print_version_id ();
1287       break;
1288
1289       /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
1290          should be emitted or not.  FIXME: Not implemented.  */
1291     case 'Q':
1292       break;
1293
1294       /* Solaris takes -s to specify that .stabs go in a .stabs section,
1295          rather than .stabs.excl, which is ignored by the linker.
1296          FIXME: Not implemented.  */
1297     case 's':
1298       if (arg)
1299         return 0;
1300
1301       break;
1302 #endif
1303
1304     case OPTION_NOPS:
1305       {
1306         char *end;
1307         nop_limit = strtoul (optarg, &end, 0);
1308         if (*end)
1309           as_bad (_("--nops needs a numeric argument"));
1310       }
1311       break;
1312
1313     case 0:
1314       break;
1315
1316     default:
1317       return 0;
1318     }
1319
1320   return 1;
1321 }
1322
1323 void
1324 md_show_usage (FILE *stream)
1325 {
1326   fprintf (stream, _("\
1327 PowerPC options:\n\
1328 -a32                    generate ELF32/XCOFF32\n\
1329 -a64                    generate ELF64/XCOFF64\n\
1330 -u                      ignored\n\
1331 -mpwrx, -mpwr2          generate code for POWER/2 (RIOS2)\n\
1332 -mpwr                   generate code for POWER (RIOS1)\n\
1333 -m601                   generate code for PowerPC 601\n\
1334 -mppc, -mppc32, -m603, -m604\n\
1335                         generate code for PowerPC 603/604\n\
1336 -m403                   generate code for PowerPC 403\n\
1337 -m405                   generate code for PowerPC 405\n\
1338 -m440                   generate code for PowerPC 440\n\
1339 -m464                   generate code for PowerPC 464\n\
1340 -m476                   generate code for PowerPC 476\n\
1341 -m7400, -m7410, -m7450, -m7455\n\
1342                         generate code for PowerPC 7400/7410/7450/7455\n\
1343 -m750cl                 generate code for PowerPC 750cl\n\
1344 -m821, -m850, -m860     generate code for PowerPC 821/850/860\n"));
1345   fprintf (stream, _("\
1346 -mppc64, -m620          generate code for PowerPC 620/625/630\n\
1347 -mppc64bridge           generate code for PowerPC 64, including bridge insns\n\
1348 -mbooke                 generate code for 32-bit PowerPC BookE\n\
1349 -ma2                    generate code for A2 architecture\n\
1350 -mpower4, -mpwr4        generate code for Power4 architecture\n\
1351 -mpower5, -mpwr5, -mpwr5x\n\
1352                         generate code for Power5 architecture\n\
1353 -mpower6, -mpwr6        generate code for Power6 architecture\n\
1354 -mpower7, -mpwr7        generate code for Power7 architecture\n\
1355 -mpower8, -mpwr8        generate code for Power8 architecture\n\
1356 -mpower9, -mpwr9        generate code for Power9 architecture\n\
1357 -mcell                  generate code for Cell Broadband Engine architecture\n\
1358 -mcom                   generate code for Power/PowerPC common instructions\n\
1359 -many                   generate code for any architecture (PWR/PWRX/PPC)\n"));
1360   fprintf (stream, _("\
1361 -maltivec               generate code for AltiVec\n\
1362 -mvsx                   generate code for Vector-Scalar (VSX) instructions\n\
1363 -me300                  generate code for PowerPC e300 family\n\
1364 -me500, -me500x2        generate code for Motorola e500 core complex\n\
1365 -me500mc,               generate code for Freescale e500mc core complex\n\
1366 -me500mc64,             generate code for Freescale e500mc64 core complex\n\
1367 -me5500,                generate code for Freescale e5500 core complex\n\
1368 -me6500,                generate code for Freescale e6500 core complex\n\
1369 -mspe                   generate code for Motorola SPE instructions\n\
1370 -mspe2                  generate code for Freescale SPE2 instructions\n\
1371 -mvle                   generate code for Freescale VLE instructions\n\
1372 -mtitan                 generate code for AppliedMicro Titan core complex\n\
1373 -mregnames              Allow symbolic names for registers\n\
1374 -mno-regnames           Do not allow symbolic names for registers\n"));
1375 #ifdef OBJ_ELF
1376   fprintf (stream, _("\
1377 -mrelocatable           support for GCC's -mrelocatble option\n\
1378 -mrelocatable-lib       support for GCC's -mrelocatble-lib option\n\
1379 -memb                   set PPC_EMB bit in ELF flags\n\
1380 -mlittle, -mlittle-endian, -le\n\
1381                         generate code for a little endian machine\n\
1382 -mbig, -mbig-endian, -be\n\
1383                         generate code for a big endian machine\n\
1384 -msolaris               generate code for Solaris\n\
1385 -mno-solaris            do not generate code for Solaris\n\
1386 -K PIC                  set EF_PPC_RELOCATABLE_LIB in ELF flags\n\
1387 -V                      print assembler version number\n\
1388 -Qy, -Qn                ignored\n"));
1389 #endif
1390   fprintf (stream, _("\
1391 -nops=count             when aligning, more than COUNT nops uses a branch\n\
1392 -ppc476-workaround      warn if emitting data to code sections\n"));
1393 }
1394 \f
1395 /* Set ppc_cpu if it is not already set.  */
1396
1397 static void
1398 ppc_set_cpu (void)
1399 {
1400   const char *default_os  = TARGET_OS;
1401   const char *default_cpu = TARGET_CPU;
1402
1403   if ((ppc_cpu & ~(ppc_cpu_t) PPC_OPCODE_ANY) == 0)
1404     {
1405       if (ppc_obj64)
1406         if (target_big_endian)
1407           ppc_cpu |= PPC_OPCODE_PPC | PPC_OPCODE_64;
1408         else
1409           /* The minimum supported cpu for 64-bit little-endian is power8.  */
1410           ppc_cpu |= ppc_parse_cpu (ppc_cpu, &sticky, "power8");
1411       else if (strncmp (default_os, "aix", 3) == 0
1412                && default_os[3] >= '4' && default_os[3] <= '9')
1413         ppc_cpu |= PPC_OPCODE_COMMON;
1414       else if (strncmp (default_os, "aix3", 4) == 0)
1415         ppc_cpu |= PPC_OPCODE_POWER;
1416       else if (strcmp (default_cpu, "rs6000") == 0)
1417         ppc_cpu |= PPC_OPCODE_POWER;
1418       else if (strncmp (default_cpu, "powerpc", 7) == 0)
1419         ppc_cpu |= PPC_OPCODE_PPC;
1420       else
1421         as_fatal (_("unknown default cpu = %s, os = %s"),
1422                   default_cpu, default_os);
1423     }
1424 }
1425
1426 /* Figure out the BFD architecture to use.  This function and ppc_mach
1427    are called well before md_begin, when the output file is opened.  */
1428
1429 enum bfd_architecture
1430 ppc_arch (void)
1431 {
1432   const char *default_cpu = TARGET_CPU;
1433   ppc_set_cpu ();
1434
1435   if ((ppc_cpu & PPC_OPCODE_PPC) != 0)
1436     return bfd_arch_powerpc;
1437   if ((ppc_cpu & PPC_OPCODE_VLE) != 0)
1438     return bfd_arch_powerpc;
1439   if ((ppc_cpu & PPC_OPCODE_POWER) != 0)
1440     return bfd_arch_rs6000;
1441   if ((ppc_cpu & (PPC_OPCODE_COMMON | PPC_OPCODE_ANY)) != 0)
1442     {
1443       if (strcmp (default_cpu, "rs6000") == 0)
1444         return bfd_arch_rs6000;
1445       else if (strncmp (default_cpu, "powerpc", 7) == 0)
1446         return bfd_arch_powerpc;
1447     }
1448
1449   as_fatal (_("neither Power nor PowerPC opcodes were selected."));
1450   return bfd_arch_unknown;
1451 }
1452
1453 unsigned long
1454 ppc_mach (void)
1455 {
1456   if (ppc_obj64)
1457     return bfd_mach_ppc64;
1458   else if (ppc_arch () == bfd_arch_rs6000)
1459     return bfd_mach_rs6k;
1460   else if (ppc_cpu & PPC_OPCODE_TITAN)
1461     return bfd_mach_ppc_titan;
1462   else if (ppc_cpu & PPC_OPCODE_VLE)
1463     return bfd_mach_ppc_vle;
1464   else
1465     return bfd_mach_ppc;
1466 }
1467
1468 extern const char*
1469 ppc_target_format (void)
1470 {
1471 #ifdef OBJ_COFF
1472 #ifdef TE_PE
1473   return target_big_endian ? "pe-powerpc" : "pe-powerpcle";
1474 #elif TE_POWERMAC
1475   return "xcoff-powermac";
1476 #else
1477 #  ifdef TE_AIX5
1478   return (ppc_obj64 ? "aix5coff64-rs6000" : "aixcoff-rs6000");
1479 #  else
1480   return (ppc_obj64 ? "aixcoff64-rs6000" : "aixcoff-rs6000");
1481 #  endif
1482 #endif
1483 #endif
1484 #ifdef OBJ_ELF
1485 # ifdef TE_FreeBSD
1486   return (ppc_obj64 ? "elf64-powerpc-freebsd" : "elf32-powerpc-freebsd");
1487 # elif defined (TE_VXWORKS)
1488   return "elf32-powerpc-vxworks";
1489 # else
1490   return (target_big_endian
1491           ? (ppc_obj64 ? "elf64-powerpc" : "elf32-powerpc")
1492           : (ppc_obj64 ? "elf64-powerpcle" : "elf32-powerpcle"));
1493 # endif
1494 #endif
1495 }
1496
1497 /* Validate one entry in powerpc_opcodes[] or vle_opcodes[].
1498    Return TRUE if there's a problem, otherwise FALSE.  */
1499
1500 static bfd_boolean
1501 insn_validate (const struct powerpc_opcode *op)
1502 {
1503   const unsigned char *o;
1504   uint64_t omask = op->mask;
1505
1506   /* The mask had better not trim off opcode bits.  */
1507   if ((op->opcode & omask) != op->opcode)
1508     {
1509       as_bad (_("mask trims opcode bits for %s"), op->name);
1510       return TRUE;
1511     }
1512
1513   /* The operands must not overlap the opcode or each other.  */
1514   for (o = op->operands; *o; ++o)
1515     {
1516       if (*o >= num_powerpc_operands)
1517         {
1518           as_bad (_("operand index error for %s"), op->name);
1519           return TRUE;
1520         }
1521       else
1522         {
1523           const struct powerpc_operand *operand = &powerpc_operands[*o];
1524           if (operand->shift != (int) PPC_OPSHIFT_INV)
1525             {
1526               uint64_t mask;
1527
1528               if (operand->shift >= 0)
1529                 mask = operand->bitm << operand->shift;
1530               else
1531                 mask = operand->bitm >> -operand->shift;
1532               if (omask & mask)
1533                 {
1534                   as_bad (_("operand %d overlap in %s"),
1535                           (int) (o - op->operands), op->name);
1536                   return TRUE;
1537                 }
1538               omask |= mask;
1539             }
1540         }
1541     }
1542   return FALSE;
1543 }
1544
1545 /* Insert opcodes and macros into hash tables.  Called at startup and
1546    for .machine pseudo.  */
1547
1548 static void
1549 ppc_setup_opcodes (void)
1550 {
1551   const struct powerpc_opcode *op;
1552   const struct powerpc_opcode *op_end;
1553   const struct powerpc_macro *macro;
1554   const struct powerpc_macro *macro_end;
1555   bfd_boolean bad_insn = FALSE;
1556
1557   if (ppc_hash != NULL)
1558     hash_die (ppc_hash);
1559   if (ppc_macro_hash != NULL)
1560     hash_die (ppc_macro_hash);
1561
1562   /* Insert the opcodes into a hash table.  */
1563   ppc_hash = hash_new ();
1564
1565   if (ENABLE_CHECKING)
1566     {
1567       unsigned int i;
1568
1569       /* An index into powerpc_operands is stored in struct fix
1570          fx_pcrel_adjust which is 8 bits wide.  */
1571       gas_assert (num_powerpc_operands < 256);
1572
1573       /* Check operand masks.  Code here and in the disassembler assumes
1574          all the 1's in the mask are contiguous.  */
1575       for (i = 0; i < num_powerpc_operands; ++i)
1576         {
1577           uint64_t mask = powerpc_operands[i].bitm;
1578           uint64_t right_bit;
1579           unsigned int j;
1580
1581           right_bit = mask & -mask;
1582           mask += right_bit;
1583           right_bit = mask & -mask;
1584           if (mask != right_bit)
1585             {
1586               as_bad (_("powerpc_operands[%d].bitm invalid"), i);
1587               bad_insn = TRUE;
1588             }
1589           for (j = i + 1; j < num_powerpc_operands; ++j)
1590             if (memcmp (&powerpc_operands[i], &powerpc_operands[j],
1591                         sizeof (powerpc_operands[0])) == 0)
1592               {
1593                 as_bad (_("powerpc_operands[%d] duplicates powerpc_operands[%d]"),
1594                         j, i);
1595                 bad_insn = TRUE;
1596               }
1597         }
1598     }
1599
1600   op_end = powerpc_opcodes + powerpc_num_opcodes;
1601   for (op = powerpc_opcodes; op < op_end; op++)
1602     {
1603       if (ENABLE_CHECKING)
1604         {
1605           unsigned int new_opcode = PPC_OP (op[0].opcode);
1606
1607 #ifdef PRINT_OPCODE_TABLE
1608           printf ("%-14s\t#%04u\tmajor op: 0x%x\top: 0x%llx\tmask: 0x%llx\tflags: 0x%llx\n",
1609                   op->name, (unsigned int) (op - powerpc_opcodes),
1610                   new_opcode, (unsigned long long) op->opcode,
1611                   (unsigned long long) op->mask, (unsigned long long) op->flags);
1612 #endif
1613
1614           /* The major opcodes had better be sorted.  Code in the disassembler
1615              assumes the insns are sorted according to major opcode.  */
1616           if (op != powerpc_opcodes
1617               && new_opcode < PPC_OP (op[-1].opcode))
1618             {
1619               as_bad (_("major opcode is not sorted for %s"), op->name);
1620               bad_insn = TRUE;
1621             }
1622
1623           if ((op->flags & PPC_OPCODE_VLE) != 0)
1624             {
1625               as_bad (_("%s is enabled by vle flag"), op->name);
1626               bad_insn = TRUE;
1627             }
1628           if (PPC_OP (op->opcode) != 4
1629               && PPC_OP (op->opcode) != 31
1630               && (op->deprecated & PPC_OPCODE_VLE) == 0)
1631             {
1632               as_bad (_("%s not disabled by vle flag"), op->name);
1633               bad_insn = TRUE;
1634             }
1635           bad_insn |= insn_validate (op);
1636         }
1637
1638       if ((ppc_cpu & op->flags) != 0
1639           && !(ppc_cpu & op->deprecated))
1640         {
1641           const char *retval;
1642
1643           retval = hash_insert (ppc_hash, op->name, (void *) op);
1644           if (retval != NULL)
1645             {
1646               as_bad (_("duplicate instruction %s"),
1647                       op->name);
1648               bad_insn = TRUE;
1649             }
1650         }
1651     }
1652
1653   if ((ppc_cpu & PPC_OPCODE_ANY) != 0)
1654     for (op = powerpc_opcodes; op < op_end; op++)
1655       hash_insert (ppc_hash, op->name, (void *) op);
1656
1657   op_end = vle_opcodes + vle_num_opcodes;
1658   for (op = vle_opcodes; op < op_end; op++)
1659     {
1660       if (ENABLE_CHECKING)
1661         {
1662           unsigned new_seg = VLE_OP_TO_SEG (VLE_OP (op[0].opcode, op[0].mask));
1663
1664 #ifdef PRINT_OPCODE_TABLE
1665           printf ("%-14s\t#%04u\tmajor op: 0x%x\top: 0x%llx\tmask: 0x%llx\tflags: 0x%llx\n",
1666                   op->name, (unsigned int) (op - vle_opcodes),
1667                   (unsigned int) new_seg, (unsigned long long) op->opcode,
1668                   (unsigned long long) op->mask, (unsigned long long) op->flags);
1669 #endif
1670
1671           /* The major opcodes had better be sorted.  Code in the disassembler
1672              assumes the insns are sorted according to major opcode.  */
1673           if (op != vle_opcodes
1674               && new_seg < VLE_OP_TO_SEG (VLE_OP (op[-1].opcode, op[-1].mask)))
1675             {
1676               as_bad (_("major opcode is not sorted for %s"), op->name);
1677               bad_insn = TRUE;
1678             }
1679
1680           bad_insn |= insn_validate (op);
1681         }
1682
1683       if ((ppc_cpu & op->flags) != 0
1684           && !(ppc_cpu & op->deprecated))
1685         {
1686           const char *retval;
1687
1688           retval = hash_insert (ppc_hash, op->name, (void *) op);
1689           if (retval != NULL)
1690             {
1691               as_bad (_("duplicate instruction %s"),
1692                       op->name);
1693               bad_insn = TRUE;
1694             }
1695         }
1696     }
1697
1698   /* SPE2 instructions */
1699   if ((ppc_cpu & PPC_OPCODE_SPE2) == PPC_OPCODE_SPE2)
1700     {
1701       op_end = spe2_opcodes + spe2_num_opcodes;
1702       for (op = spe2_opcodes; op < op_end; op++)
1703         {
1704           if (ENABLE_CHECKING)
1705             {
1706               if (op != spe2_opcodes)
1707                 {
1708                 unsigned old_seg, new_seg;
1709
1710                 old_seg = VLE_OP (op[-1].opcode, op[-1].mask);
1711                 old_seg = VLE_OP_TO_SEG (old_seg);
1712                 new_seg = VLE_OP (op[0].opcode, op[0].mask);
1713                 new_seg = VLE_OP_TO_SEG (new_seg);
1714
1715                 /* The major opcodes had better be sorted.  Code in the
1716                     disassembler assumes the insns are sorted according to
1717                     major opcode.  */
1718                 if (new_seg < old_seg)
1719                   {
1720                   as_bad (_("major opcode is not sorted for %s"), op->name);
1721                   bad_insn = TRUE;
1722                   }
1723                 }
1724
1725               bad_insn |= insn_validate (op);
1726             }
1727
1728           if ((ppc_cpu & op->flags) != 0 && !(ppc_cpu & op->deprecated))
1729             {
1730               const char *retval;
1731
1732               retval = hash_insert (ppc_hash, op->name, (void *) op);
1733               if (retval != NULL)
1734                 {
1735                   as_bad (_("duplicate instruction %s"),
1736                           op->name);
1737                   bad_insn = TRUE;
1738                 }
1739             }
1740         }
1741
1742       for (op = spe2_opcodes; op < op_end; op++)
1743         hash_insert (ppc_hash, op->name, (void *) op);
1744     }
1745
1746   /* Insert the macros into a hash table.  */
1747   ppc_macro_hash = hash_new ();
1748
1749   macro_end = powerpc_macros + powerpc_num_macros;
1750   for (macro = powerpc_macros; macro < macro_end; macro++)
1751     {
1752       if ((macro->flags & ppc_cpu) != 0 || (ppc_cpu & PPC_OPCODE_ANY) != 0)
1753         {
1754           const char *retval;
1755
1756           retval = hash_insert (ppc_macro_hash, macro->name, (void *) macro);
1757           if (retval != (const char *) NULL)
1758             {
1759               as_bad (_("duplicate macro %s"), macro->name);
1760               bad_insn = TRUE;
1761             }
1762         }
1763     }
1764
1765   if (bad_insn)
1766     abort ();
1767 }
1768
1769 /* This function is called when the assembler starts up.  It is called
1770    after the options have been parsed and the output file has been
1771    opened.  */
1772
1773 void
1774 md_begin (void)
1775 {
1776   ppc_set_cpu ();
1777
1778   ppc_cie_data_alignment = ppc_obj64 ? -8 : -4;
1779   ppc_dwarf2_line_min_insn_length = (ppc_cpu & PPC_OPCODE_VLE) ? 2 : 4;
1780
1781 #ifdef OBJ_ELF
1782   /* Set the ELF flags if desired.  */
1783   if (ppc_flags && !msolaris)
1784     bfd_set_private_flags (stdoutput, ppc_flags);
1785 #endif
1786
1787   ppc_setup_opcodes ();
1788
1789   /* Tell the main code what the endianness is if it is not overridden
1790      by the user.  */
1791   if (!set_target_endian)
1792     {
1793       set_target_endian = 1;
1794       target_big_endian = PPC_BIG_ENDIAN;
1795     }
1796
1797 #ifdef OBJ_XCOFF
1798   ppc_coff_debug_section = coff_section_from_bfd_index (stdoutput, N_DEBUG);
1799
1800   /* Create dummy symbols to serve as initial csects.  This forces the
1801      text csects to precede the data csects.  These symbols will not
1802      be output.  */
1803   ppc_text_csects = symbol_make ("dummy\001");
1804   symbol_get_tc (ppc_text_csects)->within = ppc_text_csects;
1805   ppc_data_csects = symbol_make ("dummy\001");
1806   symbol_get_tc (ppc_data_csects)->within = ppc_data_csects;
1807 #endif
1808
1809 #ifdef TE_PE
1810
1811   ppc_current_section = text_section;
1812   ppc_previous_section = 0;
1813
1814 #endif
1815 }
1816
1817 void
1818 ppc_cleanup (void)
1819 {
1820 #ifdef OBJ_ELF
1821   if (ppc_apuinfo_list == NULL)
1822     return;
1823
1824   /* Ok, so write the section info out.  We have this layout:
1825
1826   byte  data            what
1827   ----  ----            ----
1828   0     8               length of "APUinfo\0"
1829   4     (n*4)           number of APU's (4 bytes each)
1830   8     2               note type 2
1831   12    "APUinfo\0"     name
1832   20    APU#1           first APU's info
1833   24    APU#2           second APU's info
1834   ...   ...
1835   */
1836   {
1837     char *p;
1838     asection *seg = now_seg;
1839     subsegT subseg = now_subseg;
1840     asection *apuinfo_secp = (asection *) NULL;
1841     unsigned int i;
1842
1843     /* Create the .PPC.EMB.apuinfo section.  */
1844     apuinfo_secp = subseg_new (APUINFO_SECTION_NAME, 0);
1845     bfd_set_section_flags (stdoutput,
1846                            apuinfo_secp,
1847                            SEC_HAS_CONTENTS | SEC_READONLY);
1848
1849     p = frag_more (4);
1850     md_number_to_chars (p, (valueT) 8, 4);
1851
1852     p = frag_more (4);
1853     md_number_to_chars (p, (valueT) ppc_apuinfo_num * 4, 4);
1854
1855     p = frag_more (4);
1856     md_number_to_chars (p, (valueT) 2, 4);
1857
1858     p = frag_more (8);
1859     strcpy (p, APUINFO_LABEL);
1860
1861     for (i = 0; i < ppc_apuinfo_num; i++)
1862       {
1863         p = frag_more (4);
1864         md_number_to_chars (p, (valueT) ppc_apuinfo_list[i], 4);
1865       }
1866
1867     frag_align (2, 0, 0);
1868
1869     /* We probably can't restore the current segment, for there likely
1870        isn't one yet...  */
1871     if (seg && subseg)
1872       subseg_set (seg, subseg);
1873   }
1874 #endif
1875 }
1876
1877 /* Insert an operand value into an instruction.  */
1878
1879 static uint64_t
1880 ppc_insert_operand (uint64_t insn,
1881                     const struct powerpc_operand *operand,
1882                     int64_t val,
1883                     ppc_cpu_t cpu,
1884                     const char *file,
1885                     unsigned int line)
1886 {
1887   int64_t min, max, right;
1888
1889   max = operand->bitm;
1890   right = max & -max;
1891   min = 0;
1892
1893   if ((operand->flags & PPC_OPERAND_SIGNOPT) != 0)
1894     {
1895       /* Extend the allowed range for addis to [-32768, 65535].
1896          Similarly for cmpli and some VLE high part insns.  For 64-bit
1897          it would be good to disable this for signed fields since the
1898          value is sign extended into the high 32 bits of the register.
1899          If the value is, say, an address, then we might care about
1900          the high bits.  However, gcc as of 2014-06 uses unsigned
1901          values when loading the high part of 64-bit constants using
1902          lis.  */
1903       min = ~(max >> 1) & -right;
1904     }
1905   else if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
1906     {
1907       max = (max >> 1) & -right;
1908       min = ~max & -right;
1909     }
1910
1911   if ((operand->flags & PPC_OPERAND_PLUS1) != 0)
1912     max++;
1913
1914   if ((operand->flags & PPC_OPERAND_NEGATIVE) != 0)
1915     {
1916       int64_t tmp = min;
1917       min = -max;
1918       max = -tmp;
1919     }
1920
1921   if (min <= max)
1922     {
1923       /* Some people write constants with the sign extension done by
1924          hand but only up to 32 bits.  This shouldn't really be valid,
1925          but, to permit this code to assemble on a 64-bit host, we
1926          sign extend the 32-bit value to 64 bits if so doing makes the
1927          value valid.  */
1928       if (val > max
1929           && (val - (1LL << 32)) >= min
1930           && (val - (1LL << 32)) <= max
1931           && ((val - (1LL << 32)) & (right - 1)) == 0)
1932         val = val - (1LL << 32);
1933
1934       /* Similarly, people write expressions like ~(1<<15), and expect
1935          this to be OK for a 32-bit unsigned value.  */
1936       else if (val < min
1937                && (val + (1LL << 32)) >= min
1938                && (val + (1LL << 32)) <= max
1939                && ((val + (1LL << 32)) & (right - 1)) == 0)
1940         val = val + (1LL << 32);
1941
1942       else if (val < min
1943                || val > max
1944                || (val & (right - 1)) != 0)
1945         as_bad_value_out_of_range (_("operand"), val, min, max, file, line);
1946     }
1947
1948   if (operand->insert)
1949     {
1950       const char *errmsg;
1951
1952       errmsg = NULL;
1953       insn = (*operand->insert) (insn, val, cpu, &errmsg);
1954       if (errmsg != (const char *) NULL)
1955         as_bad_where (file, line, "%s", errmsg);
1956     }
1957   else if (operand->shift >= 0)
1958     insn |= (val & operand->bitm) << operand->shift;
1959   else
1960     insn |= (val & operand->bitm) >> -operand->shift;
1961
1962   return insn;
1963 }
1964
1965 \f
1966 #ifdef OBJ_ELF
1967 /* Parse @got, etc. and return the desired relocation.  */
1968 static bfd_reloc_code_real_type
1969 ppc_elf_suffix (char **str_p, expressionS *exp_p)
1970 {
1971   struct map_bfd {
1972     const char *string;
1973     unsigned int length : 8;
1974     unsigned int valid32 : 1;
1975     unsigned int valid64 : 1;
1976     unsigned int reloc;
1977   };
1978
1979   char ident[20];
1980   char *str = *str_p;
1981   char *str2;
1982   int ch;
1983   int len;
1984   const struct map_bfd *ptr;
1985
1986 #define MAP(str, reloc)   { str, sizeof (str) - 1, 1, 1, reloc }
1987 #define MAP32(str, reloc) { str, sizeof (str) - 1, 1, 0, reloc }
1988 #define MAP64(str, reloc) { str, sizeof (str) - 1, 0, 1, reloc }
1989
1990   static const struct map_bfd mapping[] = {
1991     MAP ("l",                   BFD_RELOC_LO16),
1992     MAP ("h",                   BFD_RELOC_HI16),
1993     MAP ("ha",                  BFD_RELOC_HI16_S),
1994     MAP ("brtaken",             BFD_RELOC_PPC_B16_BRTAKEN),
1995     MAP ("brntaken",            BFD_RELOC_PPC_B16_BRNTAKEN),
1996     MAP ("got",                 BFD_RELOC_16_GOTOFF),
1997     MAP ("got@l",               BFD_RELOC_LO16_GOTOFF),
1998     MAP ("got@h",               BFD_RELOC_HI16_GOTOFF),
1999     MAP ("got@ha",              BFD_RELOC_HI16_S_GOTOFF),
2000     MAP ("plt@l",               BFD_RELOC_LO16_PLTOFF),
2001     MAP ("plt@h",               BFD_RELOC_HI16_PLTOFF),
2002     MAP ("plt@ha",              BFD_RELOC_HI16_S_PLTOFF),
2003     MAP ("copy",                BFD_RELOC_PPC_COPY),
2004     MAP ("globdat",             BFD_RELOC_PPC_GLOB_DAT),
2005     MAP ("sectoff",             BFD_RELOC_16_BASEREL),
2006     MAP ("sectoff@l",           BFD_RELOC_LO16_BASEREL),
2007     MAP ("sectoff@h",           BFD_RELOC_HI16_BASEREL),
2008     MAP ("sectoff@ha",          BFD_RELOC_HI16_S_BASEREL),
2009     MAP ("tls",                 BFD_RELOC_PPC_TLS),
2010     MAP ("dtpmod",              BFD_RELOC_PPC_DTPMOD),
2011     MAP ("dtprel",              BFD_RELOC_PPC_DTPREL),
2012     MAP ("dtprel@l",            BFD_RELOC_PPC_DTPREL16_LO),
2013     MAP ("dtprel@h",            BFD_RELOC_PPC_DTPREL16_HI),
2014     MAP ("dtprel@ha",           BFD_RELOC_PPC_DTPREL16_HA),
2015     MAP ("tprel",               BFD_RELOC_PPC_TPREL),
2016     MAP ("tprel@l",             BFD_RELOC_PPC_TPREL16_LO),
2017     MAP ("tprel@h",             BFD_RELOC_PPC_TPREL16_HI),
2018     MAP ("tprel@ha",            BFD_RELOC_PPC_TPREL16_HA),
2019     MAP ("got@tlsgd",           BFD_RELOC_PPC_GOT_TLSGD16),
2020     MAP ("got@tlsgd@l",         BFD_RELOC_PPC_GOT_TLSGD16_LO),
2021     MAP ("got@tlsgd@h",         BFD_RELOC_PPC_GOT_TLSGD16_HI),
2022     MAP ("got@tlsgd@ha",        BFD_RELOC_PPC_GOT_TLSGD16_HA),
2023     MAP ("got@tlsld",           BFD_RELOC_PPC_GOT_TLSLD16),
2024     MAP ("got@tlsld@l",         BFD_RELOC_PPC_GOT_TLSLD16_LO),
2025     MAP ("got@tlsld@h",         BFD_RELOC_PPC_GOT_TLSLD16_HI),
2026     MAP ("got@tlsld@ha",        BFD_RELOC_PPC_GOT_TLSLD16_HA),
2027     MAP ("got@dtprel",          BFD_RELOC_PPC_GOT_DTPREL16),
2028     MAP ("got@dtprel@l",        BFD_RELOC_PPC_GOT_DTPREL16_LO),
2029     MAP ("got@dtprel@h",        BFD_RELOC_PPC_GOT_DTPREL16_HI),
2030     MAP ("got@dtprel@ha",       BFD_RELOC_PPC_GOT_DTPREL16_HA),
2031     MAP ("got@tprel",           BFD_RELOC_PPC_GOT_TPREL16),
2032     MAP ("got@tprel@l",         BFD_RELOC_PPC_GOT_TPREL16_LO),
2033     MAP ("got@tprel@h",         BFD_RELOC_PPC_GOT_TPREL16_HI),
2034     MAP ("got@tprel@ha",        BFD_RELOC_PPC_GOT_TPREL16_HA),
2035     MAP32 ("fixup",             BFD_RELOC_CTOR),
2036     MAP32 ("plt",               BFD_RELOC_24_PLT_PCREL),
2037     MAP32 ("pltrel24",          BFD_RELOC_24_PLT_PCREL),
2038     MAP32 ("local24pc",         BFD_RELOC_PPC_LOCAL24PC),
2039     MAP32 ("local",             BFD_RELOC_PPC_LOCAL24PC),
2040     MAP32 ("pltrel",            BFD_RELOC_32_PLT_PCREL),
2041     MAP32 ("sdarel",            BFD_RELOC_GPREL16),
2042     MAP32 ("sdarel@l",          BFD_RELOC_PPC_VLE_SDAREL_LO16A),
2043     MAP32 ("sdarel@h",          BFD_RELOC_PPC_VLE_SDAREL_HI16A),
2044     MAP32 ("sdarel@ha",         BFD_RELOC_PPC_VLE_SDAREL_HA16A),
2045     MAP32 ("naddr",             BFD_RELOC_PPC_EMB_NADDR32),
2046     MAP32 ("naddr16",           BFD_RELOC_PPC_EMB_NADDR16),
2047     MAP32 ("naddr@l",           BFD_RELOC_PPC_EMB_NADDR16_LO),
2048     MAP32 ("naddr@h",           BFD_RELOC_PPC_EMB_NADDR16_HI),
2049     MAP32 ("naddr@ha",          BFD_RELOC_PPC_EMB_NADDR16_HA),
2050     MAP32 ("sdai16",            BFD_RELOC_PPC_EMB_SDAI16),
2051     MAP32 ("sda2rel",           BFD_RELOC_PPC_EMB_SDA2REL),
2052     MAP32 ("sda2i16",           BFD_RELOC_PPC_EMB_SDA2I16),
2053     MAP32 ("sda21",             BFD_RELOC_PPC_EMB_SDA21),
2054     MAP32 ("sda21@l",           BFD_RELOC_PPC_VLE_SDA21_LO),
2055     MAP32 ("mrkref",            BFD_RELOC_PPC_EMB_MRKREF),
2056     MAP32 ("relsect",           BFD_RELOC_PPC_EMB_RELSEC16),
2057     MAP32 ("relsect@l",         BFD_RELOC_PPC_EMB_RELST_LO),
2058     MAP32 ("relsect@h",         BFD_RELOC_PPC_EMB_RELST_HI),
2059     MAP32 ("relsect@ha",        BFD_RELOC_PPC_EMB_RELST_HA),
2060     MAP32 ("bitfld",            BFD_RELOC_PPC_EMB_BIT_FLD),
2061     MAP32 ("relsda",            BFD_RELOC_PPC_EMB_RELSDA),
2062     MAP32 ("xgot",              BFD_RELOC_PPC_TOC16),
2063     MAP64 ("high",              BFD_RELOC_PPC64_ADDR16_HIGH),
2064     MAP64 ("higha",             BFD_RELOC_PPC64_ADDR16_HIGHA),
2065     MAP64 ("higher",            BFD_RELOC_PPC64_HIGHER),
2066     MAP64 ("highera",           BFD_RELOC_PPC64_HIGHER_S),
2067     MAP64 ("highest",           BFD_RELOC_PPC64_HIGHEST),
2068     MAP64 ("highesta",          BFD_RELOC_PPC64_HIGHEST_S),
2069     MAP64 ("tocbase",           BFD_RELOC_PPC64_TOC),
2070     MAP64 ("toc",               BFD_RELOC_PPC_TOC16),
2071     MAP64 ("toc@l",             BFD_RELOC_PPC64_TOC16_LO),
2072     MAP64 ("toc@h",             BFD_RELOC_PPC64_TOC16_HI),
2073     MAP64 ("toc@ha",            BFD_RELOC_PPC64_TOC16_HA),
2074     MAP64 ("dtprel@high",       BFD_RELOC_PPC64_DTPREL16_HIGH),
2075     MAP64 ("dtprel@higha",      BFD_RELOC_PPC64_DTPREL16_HIGHA),
2076     MAP64 ("dtprel@higher",     BFD_RELOC_PPC64_DTPREL16_HIGHER),
2077     MAP64 ("dtprel@highera",    BFD_RELOC_PPC64_DTPREL16_HIGHERA),
2078     MAP64 ("dtprel@highest",    BFD_RELOC_PPC64_DTPREL16_HIGHEST),
2079     MAP64 ("dtprel@highesta",   BFD_RELOC_PPC64_DTPREL16_HIGHESTA),
2080     MAP64 ("localentry",        BFD_RELOC_PPC64_ADDR64_LOCAL),
2081     MAP64 ("tprel@high",        BFD_RELOC_PPC64_TPREL16_HIGH),
2082     MAP64 ("tprel@higha",       BFD_RELOC_PPC64_TPREL16_HIGHA),
2083     MAP64 ("tprel@higher",      BFD_RELOC_PPC64_TPREL16_HIGHER),
2084     MAP64 ("tprel@highera",     BFD_RELOC_PPC64_TPREL16_HIGHERA),
2085     MAP64 ("tprel@highest",     BFD_RELOC_PPC64_TPREL16_HIGHEST),
2086     MAP64 ("tprel@highesta",    BFD_RELOC_PPC64_TPREL16_HIGHESTA),
2087     { (char *) 0, 0, 0, 0,      BFD_RELOC_NONE }
2088   };
2089
2090   if (*str++ != '@')
2091     return BFD_RELOC_NONE;
2092
2093   for (ch = *str, str2 = ident;
2094        (str2 < ident + sizeof (ident) - 1
2095         && (ISALNUM (ch) || ch == '@'));
2096        ch = *++str)
2097     {
2098       *str2++ = TOLOWER (ch);
2099     }
2100
2101   *str2 = '\0';
2102   len = str2 - ident;
2103
2104   ch = ident[0];
2105   for (ptr = &mapping[0]; ptr->length > 0; ptr++)
2106     if (ch == ptr->string[0]
2107         && len == ptr->length
2108         && memcmp (ident, ptr->string, ptr->length) == 0
2109         && (ppc_obj64 ? ptr->valid64 : ptr->valid32))
2110       {
2111         int reloc = ptr->reloc;
2112
2113         if (!ppc_obj64 && exp_p->X_add_number != 0)
2114           {
2115             switch (reloc)
2116               {
2117               case BFD_RELOC_16_GOTOFF:
2118               case BFD_RELOC_LO16_GOTOFF:
2119               case BFD_RELOC_HI16_GOTOFF:
2120               case BFD_RELOC_HI16_S_GOTOFF:
2121                 as_warn (_("identifier+constant@got means "
2122                            "identifier@got+constant"));
2123                 break;
2124
2125               case BFD_RELOC_PPC_GOT_TLSGD16:
2126               case BFD_RELOC_PPC_GOT_TLSGD16_LO:
2127               case BFD_RELOC_PPC_GOT_TLSGD16_HI:
2128               case BFD_RELOC_PPC_GOT_TLSGD16_HA:
2129               case BFD_RELOC_PPC_GOT_TLSLD16:
2130               case BFD_RELOC_PPC_GOT_TLSLD16_LO:
2131               case BFD_RELOC_PPC_GOT_TLSLD16_HI:
2132               case BFD_RELOC_PPC_GOT_TLSLD16_HA:
2133               case BFD_RELOC_PPC_GOT_DTPREL16:
2134               case BFD_RELOC_PPC_GOT_DTPREL16_LO:
2135               case BFD_RELOC_PPC_GOT_DTPREL16_HI:
2136               case BFD_RELOC_PPC_GOT_DTPREL16_HA:
2137               case BFD_RELOC_PPC_GOT_TPREL16:
2138               case BFD_RELOC_PPC_GOT_TPREL16_LO:
2139               case BFD_RELOC_PPC_GOT_TPREL16_HI:
2140               case BFD_RELOC_PPC_GOT_TPREL16_HA:
2141                 as_bad (_("symbol+offset not supported for got tls"));
2142                 break;
2143               }
2144           }
2145
2146         /* Now check for identifier@suffix+constant.  */
2147         if (*str == '-' || *str == '+')
2148           {
2149             char *orig_line = input_line_pointer;
2150             expressionS new_exp;
2151
2152             input_line_pointer = str;
2153             expression (&new_exp);
2154             if (new_exp.X_op == O_constant)
2155               {
2156                 exp_p->X_add_number += new_exp.X_add_number;
2157                 str = input_line_pointer;
2158               }
2159
2160             if (&input_line_pointer != str_p)
2161               input_line_pointer = orig_line;
2162           }
2163         *str_p = str;
2164
2165         if (reloc == (int) BFD_RELOC_PPC64_TOC
2166             && exp_p->X_op == O_symbol
2167             && strcmp (S_GET_NAME (exp_p->X_add_symbol), ".TOC.") == 0)
2168           {
2169             /* Change the symbol so that the dummy .TOC. symbol can be
2170                omitted from the object file.  */
2171             exp_p->X_add_symbol = &abs_symbol;
2172           }
2173
2174         return (bfd_reloc_code_real_type) reloc;
2175       }
2176
2177   return BFD_RELOC_NONE;
2178 }
2179
2180 /* Support @got, etc. on constants emitted via .short, .int etc.  */
2181
2182 bfd_reloc_code_real_type
2183 ppc_elf_parse_cons (expressionS *exp, unsigned int nbytes)
2184 {
2185   expression (exp);
2186   if (nbytes >= 2 && *input_line_pointer == '@')
2187     return ppc_elf_suffix (&input_line_pointer, exp);
2188   return BFD_RELOC_NONE;
2189 }
2190
2191 /* Warn when emitting data to code sections, unless we are emitting
2192    a relocation that ld --ppc476-workaround uses to recognise data
2193    *and* there was an unconditional branch prior to the data.  */
2194
2195 void
2196 ppc_elf_cons_fix_check (expressionS *exp ATTRIBUTE_UNUSED,
2197                         unsigned int nbytes, fixS *fix)
2198 {
2199   if (warn_476
2200       && (now_seg->flags & SEC_CODE) != 0
2201       && (nbytes != 4
2202           || fix == NULL
2203           || !(fix->fx_r_type == BFD_RELOC_32
2204                || fix->fx_r_type == BFD_RELOC_CTOR
2205                || fix->fx_r_type == BFD_RELOC_32_PCREL)
2206           || !(last_seg == now_seg && last_subseg == now_subseg)
2207           || !((last_insn & (0x3f << 26)) == (18u << 26)
2208                || ((last_insn & (0x3f << 26)) == (16u << 26)
2209                    && (last_insn & (0x14 << 21)) == (0x14 << 21))
2210                || ((last_insn & (0x3f << 26)) == (19u << 26)
2211                    && (last_insn & (0x3ff << 1)) == (16u << 1)
2212                    && (last_insn & (0x14 << 21)) == (0x14 << 21)))))
2213     {
2214       /* Flag that we've warned.  */
2215       if (fix != NULL)
2216         fix->fx_tcbit = 1;
2217
2218       as_warn (_("data in executable section"));
2219     }
2220 }
2221
2222 /* Solaris pseduo op to change to the .rodata section.  */
2223 static void
2224 ppc_elf_rdata (int xxx)
2225 {
2226   char *save_line = input_line_pointer;
2227   static char section[] = ".rodata\n";
2228
2229   /* Just pretend this is .section .rodata  */
2230   input_line_pointer = section;
2231   obj_elf_section (xxx);
2232
2233   input_line_pointer = save_line;
2234 }
2235
2236 /* Pseudo op to make file scope bss items.  */
2237 static void
2238 ppc_elf_lcomm (int xxx ATTRIBUTE_UNUSED)
2239 {
2240   char *name;
2241   char c;
2242   char *p;
2243   offsetT size;
2244   symbolS *symbolP;
2245   offsetT align;
2246   segT old_sec;
2247   int old_subsec;
2248   char *pfrag;
2249   int align2;
2250
2251   c = get_symbol_name (&name);
2252
2253   /* Just after name is now '\0'.  */
2254   p = input_line_pointer;
2255   *p = c;
2256   SKIP_WHITESPACE_AFTER_NAME ();
2257   if (*input_line_pointer != ',')
2258     {
2259       as_bad (_("expected comma after symbol-name: rest of line ignored."));
2260       ignore_rest_of_line ();
2261       return;
2262     }
2263
2264   input_line_pointer++;         /* skip ',' */
2265   if ((size = get_absolute_expression ()) < 0)
2266     {
2267       as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) size);
2268       ignore_rest_of_line ();
2269       return;
2270     }
2271
2272   /* The third argument to .lcomm is the alignment.  */
2273   if (*input_line_pointer != ',')
2274     align = 8;
2275   else
2276     {
2277       ++input_line_pointer;
2278       align = get_absolute_expression ();
2279       if (align <= 0)
2280         {
2281           as_warn (_("ignoring bad alignment"));
2282           align = 8;
2283         }
2284     }
2285
2286   *p = 0;
2287   symbolP = symbol_find_or_make (name);
2288   *p = c;
2289
2290   if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
2291     {
2292       as_bad (_("ignoring attempt to re-define symbol `%s'."),
2293               S_GET_NAME (symbolP));
2294       ignore_rest_of_line ();
2295       return;
2296     }
2297
2298   if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size)
2299     {
2300       as_bad (_("length of .lcomm \"%s\" is already %ld. Not changed to %ld."),
2301               S_GET_NAME (symbolP),
2302               (long) S_GET_VALUE (symbolP),
2303               (long) size);
2304
2305       ignore_rest_of_line ();
2306       return;
2307     }
2308
2309   /* Allocate_bss.  */
2310   old_sec = now_seg;
2311   old_subsec = now_subseg;
2312   if (align)
2313     {
2314       /* Convert to a power of 2 alignment.  */
2315       for (align2 = 0; (align & 1) == 0; align >>= 1, ++align2);
2316       if (align != 1)
2317         {
2318           as_bad (_("common alignment not a power of 2"));
2319           ignore_rest_of_line ();
2320           return;
2321         }
2322     }
2323   else
2324     align2 = 0;
2325
2326   record_alignment (bss_section, align2);
2327   subseg_set (bss_section, 1);
2328   if (align2)
2329     frag_align (align2, 0, 0);
2330   if (S_GET_SEGMENT (symbolP) == bss_section)
2331     symbol_get_frag (symbolP)->fr_symbol = 0;
2332   symbol_set_frag (symbolP, frag_now);
2333   pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, size,
2334                     (char *) 0);
2335   *pfrag = 0;
2336   S_SET_SIZE (symbolP, size);
2337   S_SET_SEGMENT (symbolP, bss_section);
2338   subseg_set (old_sec, old_subsec);
2339   demand_empty_rest_of_line ();
2340 }
2341
2342 /* Pseudo op to set symbol local entry point.  */
2343 static void
2344 ppc_elf_localentry (int ignore ATTRIBUTE_UNUSED)
2345 {
2346   char *name;
2347   char c = get_symbol_name (&name);
2348   char *p;
2349   expressionS exp;
2350   symbolS *sym;
2351   asymbol *bfdsym;
2352   elf_symbol_type *elfsym;
2353
2354   p = input_line_pointer;
2355   *p = c;
2356   SKIP_WHITESPACE_AFTER_NAME ();
2357   if (*input_line_pointer != ',')
2358     {
2359       *p = 0;
2360       as_bad (_("expected comma after name `%s' in .localentry directive"),
2361               name);
2362       *p = c;
2363       ignore_rest_of_line ();
2364       return;
2365     }
2366   input_line_pointer++;
2367   expression (&exp);
2368   if (exp.X_op == O_absent)
2369     {
2370       as_bad (_("missing expression in .localentry directive"));
2371       exp.X_op = O_constant;
2372       exp.X_add_number = 0;
2373     }
2374   *p = 0;
2375   sym = symbol_find_or_make (name);
2376   *p = c;
2377
2378   if (resolve_expression (&exp)
2379       && exp.X_op == O_constant)
2380     {
2381       unsigned char encoded = PPC64_SET_LOCAL_ENTRY_OFFSET (exp.X_add_number);
2382
2383       if (exp.X_add_number != (offsetT) PPC64_LOCAL_ENTRY_OFFSET (encoded))
2384         as_bad (_(".localentry expression for `%s' "
2385                   "is not a valid power of 2"), S_GET_NAME (sym));
2386       else
2387         {
2388           bfdsym = symbol_get_bfdsym (sym);
2389           elfsym = elf_symbol_from (bfd_asymbol_bfd (bfdsym), bfdsym);
2390           gas_assert (elfsym);
2391           elfsym->internal_elf_sym.st_other &= ~STO_PPC64_LOCAL_MASK;
2392           elfsym->internal_elf_sym.st_other |= encoded;
2393           if (ppc_abiversion == 0)
2394             ppc_abiversion = 2;
2395         }
2396     }
2397   else
2398     as_bad (_(".localentry expression for `%s' "
2399               "does not evaluate to a constant"), S_GET_NAME (sym));
2400
2401   demand_empty_rest_of_line ();
2402 }
2403
2404 /* Pseudo op to set ABI version.  */
2405 static void
2406 ppc_elf_abiversion (int ignore ATTRIBUTE_UNUSED)
2407 {
2408   expressionS exp;
2409
2410   expression (&exp);
2411   if (exp.X_op == O_absent)
2412     {
2413       as_bad (_("missing expression in .abiversion directive"));
2414       exp.X_op = O_constant;
2415       exp.X_add_number = 0;
2416     }
2417
2418   if (resolve_expression (&exp)
2419       && exp.X_op == O_constant)
2420     ppc_abiversion = exp.X_add_number;
2421   else
2422     as_bad (_(".abiversion expression does not evaluate to a constant"));
2423   demand_empty_rest_of_line ();
2424 }
2425
2426 /* Parse a .gnu_attribute directive.  */
2427 static void
2428 ppc_elf_gnu_attribute (int ignored ATTRIBUTE_UNUSED)
2429 {
2430   int tag = obj_elf_vendor_attribute (OBJ_ATTR_GNU);
2431
2432   /* Check validity of defined powerpc tags.  */
2433   if (tag == Tag_GNU_Power_ABI_FP
2434       || tag == Tag_GNU_Power_ABI_Vector
2435       || tag == Tag_GNU_Power_ABI_Struct_Return)
2436     {
2437       unsigned int val;
2438
2439       val = bfd_elf_get_obj_attr_int (stdoutput, OBJ_ATTR_GNU, tag);
2440
2441       if ((tag == Tag_GNU_Power_ABI_FP && val > 15)
2442           || (tag == Tag_GNU_Power_ABI_Vector && val > 3)
2443           || (tag == Tag_GNU_Power_ABI_Struct_Return && val > 2))
2444         as_warn (_("unknown .gnu_attribute value"));
2445     }
2446 }
2447
2448 /* Set ABI version in output file.  */
2449 void
2450 ppc_elf_end (void)
2451 {
2452   if (ppc_obj64 && ppc_abiversion != 0)
2453     {
2454       elf_elfheader (stdoutput)->e_flags &= ~EF_PPC64_ABI;
2455       elf_elfheader (stdoutput)->e_flags |= ppc_abiversion & EF_PPC64_ABI;
2456     }
2457 }
2458
2459 /* Validate any relocations emitted for -mrelocatable, possibly adding
2460    fixups for word relocations in writable segments, so we can adjust
2461    them at runtime.  */
2462 static void
2463 ppc_elf_validate_fix (fixS *fixp, segT seg)
2464 {
2465   if (fixp->fx_done || fixp->fx_pcrel)
2466     return;
2467
2468   switch (shlib)
2469     {
2470     case SHLIB_NONE:
2471     case SHLIB_PIC:
2472       return;
2473
2474     case SHLIB_MRELOCATABLE:
2475       if (fixp->fx_r_type != BFD_RELOC_16_GOTOFF
2476           && fixp->fx_r_type != BFD_RELOC_HI16_GOTOFF
2477           && fixp->fx_r_type != BFD_RELOC_LO16_GOTOFF
2478           && fixp->fx_r_type != BFD_RELOC_HI16_S_GOTOFF
2479           && fixp->fx_r_type != BFD_RELOC_16_BASEREL
2480           && fixp->fx_r_type != BFD_RELOC_LO16_BASEREL
2481           && fixp->fx_r_type != BFD_RELOC_HI16_BASEREL
2482           && fixp->fx_r_type != BFD_RELOC_HI16_S_BASEREL
2483           && (seg->flags & SEC_LOAD) != 0
2484           && strcmp (segment_name (seg), ".got2") != 0
2485           && strcmp (segment_name (seg), ".dtors") != 0
2486           && strcmp (segment_name (seg), ".ctors") != 0
2487           && strcmp (segment_name (seg), ".fixup") != 0
2488           && strcmp (segment_name (seg), ".gcc_except_table") != 0
2489           && strcmp (segment_name (seg), ".eh_frame") != 0
2490           && strcmp (segment_name (seg), ".ex_shared") != 0)
2491         {
2492           if ((seg->flags & (SEC_READONLY | SEC_CODE)) != 0
2493               || fixp->fx_r_type != BFD_RELOC_CTOR)
2494             {
2495               as_bad_where (fixp->fx_file, fixp->fx_line,
2496                             _("relocation cannot be done when using -mrelocatable"));
2497             }
2498         }
2499       return;
2500     }
2501 }
2502
2503 /* Prevent elf_frob_file_before_adjust removing a weak undefined
2504    function descriptor sym if the corresponding code sym is used.  */
2505
2506 void
2507 ppc_frob_file_before_adjust (void)
2508 {
2509   symbolS *symp;
2510   asection *toc;
2511
2512   if (!ppc_obj64)
2513     return;
2514
2515   for (symp = symbol_rootP; symp; symp = symbol_next (symp))
2516     {
2517       const char *name;
2518       char *dotname;
2519       symbolS *dotsym;
2520
2521       name = S_GET_NAME (symp);
2522       if (name[0] == '.')
2523         continue;
2524
2525       if (! S_IS_WEAK (symp)
2526           || S_IS_DEFINED (symp))
2527         continue;
2528
2529       dotname = concat (".", name, (char *) NULL);
2530       dotsym = symbol_find_noref (dotname, 1);
2531       free (dotname);
2532       if (dotsym != NULL && (symbol_used_p (dotsym)
2533                              || symbol_used_in_reloc_p (dotsym)))
2534         symbol_mark_used (symp);
2535
2536     }
2537
2538   toc = bfd_get_section_by_name (stdoutput, ".toc");
2539   if (toc != NULL
2540       && toc_reloc_types != has_large_toc_reloc
2541       && bfd_section_size (stdoutput, toc) > 0x10000)
2542     as_warn (_("TOC section size exceeds 64k"));
2543 }
2544
2545 /* .TOC. used in an opd entry as .TOC.@tocbase doesn't need to be
2546    emitted.  Other uses of .TOC. will cause the symbol to be marked
2547    with BSF_KEEP in md_apply_fix.  */
2548
2549 void
2550 ppc_elf_adjust_symtab (void)
2551 {
2552   if (ppc_obj64)
2553     {
2554       symbolS *symp;
2555       symp = symbol_find (".TOC.");
2556       if (symp != NULL)
2557         {
2558           asymbol *bsym = symbol_get_bfdsym (symp);
2559           if ((bsym->flags & BSF_KEEP) == 0)
2560             symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2561         }
2562     }
2563 }
2564 #endif /* OBJ_ELF */
2565 \f
2566 #ifdef TE_PE
2567
2568 /*
2569  * Summary of parse_toc_entry.
2570  *
2571  * in:  Input_line_pointer points to the '[' in one of:
2572  *
2573  *        [toc] [tocv] [toc32] [toc64]
2574  *
2575  *      Anything else is an error of one kind or another.
2576  *
2577  * out:
2578  *   return value: success or failure
2579  *   toc_kind:     kind of toc reference
2580  *   input_line_pointer:
2581  *     success: first char after the ']'
2582  *     failure: unchanged
2583  *
2584  * settings:
2585  *
2586  *     [toc]   - rv == success, toc_kind = default_toc
2587  *     [tocv]  - rv == success, toc_kind = data_in_toc
2588  *     [toc32] - rv == success, toc_kind = must_be_32
2589  *     [toc64] - rv == success, toc_kind = must_be_64
2590  *
2591  */
2592
2593 enum toc_size_qualifier
2594 {
2595   default_toc, /* The toc cell constructed should be the system default size */
2596   data_in_toc, /* This is a direct reference to a toc cell                   */
2597   must_be_32,  /* The toc cell constructed must be 32 bits wide              */
2598   must_be_64   /* The toc cell constructed must be 64 bits wide              */
2599 };
2600
2601 static int
2602 parse_toc_entry (enum toc_size_qualifier *toc_kind)
2603 {
2604   char *start;
2605   char *toc_spec;
2606   char c;
2607   enum toc_size_qualifier t;
2608
2609   /* Save the input_line_pointer.  */
2610   start = input_line_pointer;
2611
2612   /* Skip over the '[' , and whitespace.  */
2613   ++input_line_pointer;
2614   SKIP_WHITESPACE ();
2615
2616   /* Find the spelling of the operand.  */
2617   c = get_symbol_name (&toc_spec);
2618
2619   if (strcmp (toc_spec, "toc") == 0)
2620     {
2621       t = default_toc;
2622     }
2623   else if (strcmp (toc_spec, "tocv") == 0)
2624     {
2625       t = data_in_toc;
2626     }
2627   else if (strcmp (toc_spec, "toc32") == 0)
2628     {
2629       t = must_be_32;
2630     }
2631   else if (strcmp (toc_spec, "toc64") == 0)
2632     {
2633       t = must_be_64;
2634     }
2635   else
2636     {
2637       as_bad (_("syntax error: invalid toc specifier `%s'"), toc_spec);
2638       *input_line_pointer = c;
2639       input_line_pointer = start;
2640       return 0;
2641     }
2642
2643   /* Now find the ']'.  */
2644   *input_line_pointer = c;
2645
2646   SKIP_WHITESPACE_AFTER_NAME ();        /* leading whitespace could be there.  */
2647   c = *input_line_pointer++; /* input_line_pointer->past char in c.  */
2648
2649   if (c != ']')
2650     {
2651       as_bad (_("syntax error: expected `]', found  `%c'"), c);
2652       input_line_pointer = start;
2653       return 0;
2654     }
2655
2656   *toc_kind = t;
2657   return 1;
2658 }
2659 #endif
2660
2661 #if defined (OBJ_XCOFF) || defined (OBJ_ELF)
2662 /* See whether a symbol is in the TOC section.  */
2663
2664 static int
2665 ppc_is_toc_sym (symbolS *sym)
2666 {
2667 #ifdef OBJ_XCOFF
2668   return (symbol_get_tc (sym)->symbol_class == XMC_TC
2669           || symbol_get_tc (sym)->symbol_class == XMC_TC0);
2670 #endif
2671 #ifdef OBJ_ELF
2672   const char *sname = segment_name (S_GET_SEGMENT (sym));
2673   if (ppc_obj64)
2674     return strcmp (sname, ".toc") == 0;
2675   else
2676     return strcmp (sname, ".got") == 0;
2677 #endif
2678 }
2679 #endif /* defined (OBJ_XCOFF) || defined (OBJ_ELF) */
2680 \f
2681
2682 #ifdef OBJ_ELF
2683 #define APUID(a,v)      ((((a) & 0xffff) << 16) | ((v) & 0xffff))
2684 static void
2685 ppc_apuinfo_section_add (unsigned int apu, unsigned int version)
2686 {
2687   unsigned int i;
2688
2689   /* Check we don't already exist.  */
2690   for (i = 0; i < ppc_apuinfo_num; i++)
2691     if (ppc_apuinfo_list[i] == APUID (apu, version))
2692       return;
2693
2694   if (ppc_apuinfo_num == ppc_apuinfo_num_alloc)
2695     {
2696       if (ppc_apuinfo_num_alloc == 0)
2697         {
2698           ppc_apuinfo_num_alloc = 4;
2699           ppc_apuinfo_list = XNEWVEC (unsigned long, ppc_apuinfo_num_alloc);
2700         }
2701       else
2702         {
2703           ppc_apuinfo_num_alloc += 4;
2704           ppc_apuinfo_list = XRESIZEVEC (unsigned long, ppc_apuinfo_list,
2705                                          ppc_apuinfo_num_alloc);
2706         }
2707     }
2708   ppc_apuinfo_list[ppc_apuinfo_num++] = APUID (apu, version);
2709 }
2710 #undef APUID
2711 #endif
2712 \f
2713
2714 /* We need to keep a list of fixups.  We can't simply generate them as
2715    we go, because that would require us to first create the frag, and
2716    that would screw up references to ``.''.  */
2717
2718 struct ppc_fixup
2719 {
2720   expressionS exp;
2721   int opindex;
2722   bfd_reloc_code_real_type reloc;
2723 };
2724
2725 #define MAX_INSN_FIXUPS (5)
2726
2727 /* This routine is called for each instruction to be assembled.  */
2728
2729 void
2730 md_assemble (char *str)
2731 {
2732   char *s;
2733   const struct powerpc_opcode *opcode;
2734   uint64_t insn;
2735   const unsigned char *opindex_ptr;
2736   int skip_optional;
2737   int need_paren;
2738   int next_opindex;
2739   struct ppc_fixup fixups[MAX_INSN_FIXUPS];
2740   int fc;
2741   char *f;
2742   int addr_mask;
2743   int i;
2744   unsigned int insn_length;
2745
2746   /* Get the opcode.  */
2747   for (s = str; *s != '\0' && ! ISSPACE (*s); s++)
2748     ;
2749   if (*s != '\0')
2750     *s++ = '\0';
2751
2752   /* Look up the opcode in the hash table.  */
2753   opcode = (const struct powerpc_opcode *) hash_find (ppc_hash, str);
2754   if (opcode == (const struct powerpc_opcode *) NULL)
2755     {
2756       const struct powerpc_macro *macro;
2757
2758       macro = (const struct powerpc_macro *) hash_find (ppc_macro_hash, str);
2759       if (macro == (const struct powerpc_macro *) NULL)
2760         as_bad (_("unrecognized opcode: `%s'"), str);
2761       else
2762         ppc_macro (s, macro);
2763
2764       return;
2765     }
2766
2767   insn = opcode->opcode;
2768
2769   str = s;
2770   while (ISSPACE (*str))
2771     ++str;
2772
2773   /* PowerPC operands are just expressions.  The only real issue is
2774      that a few operand types are optional.  All cases which might use
2775      an optional operand separate the operands only with commas (in some
2776      cases parentheses are used, as in ``lwz 1,0(1)'' but such cases never
2777      have optional operands).  Most instructions with optional operands
2778      have only one.  Those that have more than one optional operand can
2779      take either all their operands or none.  So, before we start seriously
2780      parsing the operands, we check to see if we have optional operands,
2781      and if we do, we count the number of commas to see which operands
2782      have been omitted.  */
2783   skip_optional = 0;
2784   for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
2785     {
2786       const struct powerpc_operand *operand;
2787
2788       operand = &powerpc_operands[*opindex_ptr];
2789       if ((operand->flags & PPC_OPERAND_OPTIONAL) != 0
2790           && !((operand->flags & PPC_OPERAND_OPTIONAL32) != 0 && ppc_obj64))
2791         {
2792           unsigned int opcount;
2793           unsigned int num_operands_expected;
2794
2795           /* There is an optional operand.  Count the number of
2796              commas in the input line.  */
2797           if (*str == '\0')
2798             opcount = 0;
2799           else
2800             {
2801               opcount = 1;
2802               s = str;
2803               while ((s = strchr (s, ',')) != (char *) NULL)
2804                 {
2805                   ++opcount;
2806                   ++s;
2807                 }
2808             }
2809
2810           /* Compute the number of expected operands.  */
2811           for (num_operands_expected = 0, i = 0; opcode->operands[i]; i ++)
2812             ++ num_operands_expected;
2813
2814           /* If there are fewer operands in the line then are called
2815              for by the instruction, we want to skip the optional
2816              operands.  */
2817           if (opcount < num_operands_expected)
2818             skip_optional = 1;
2819
2820           break;
2821         }
2822     }
2823
2824   /* Gather the operands.  */
2825   need_paren = 0;
2826   next_opindex = 0;
2827   fc = 0;
2828   for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
2829     {
2830       const struct powerpc_operand *operand;
2831       const char *errmsg;
2832       char *hold;
2833       expressionS ex;
2834       char endc;
2835
2836       if (next_opindex == 0)
2837         operand = &powerpc_operands[*opindex_ptr];
2838       else
2839         {
2840           operand = &powerpc_operands[next_opindex];
2841           next_opindex = 0;
2842         }
2843       errmsg = NULL;
2844
2845       /* If this is an optional operand, and we are skipping it, just
2846          insert a zero.  */
2847       if ((operand->flags & PPC_OPERAND_OPTIONAL) != 0
2848           && !((operand->flags & PPC_OPERAND_OPTIONAL32) != 0 && ppc_obj64)
2849           && skip_optional)
2850         {
2851           int64_t val = ppc_optional_operand_value (operand);
2852           if (operand->insert)
2853             {
2854               insn = (*operand->insert) (insn, val, ppc_cpu, &errmsg);
2855               if (errmsg != (const char *) NULL)
2856                 as_bad ("%s", errmsg);
2857             }
2858           else if (operand->shift >= 0)
2859             insn |= (val & operand->bitm) << operand->shift;
2860           else
2861             insn |= (val & operand->bitm) >> -operand->shift;
2862
2863           if ((operand->flags & PPC_OPERAND_NEXT) != 0)
2864             next_opindex = *opindex_ptr + 1;
2865           continue;
2866         }
2867
2868       /* Gather the operand.  */
2869       hold = input_line_pointer;
2870       input_line_pointer = str;
2871
2872 #ifdef TE_PE
2873       if (*input_line_pointer == '[')
2874         {
2875           /* We are expecting something like the second argument here:
2876            *
2877            *    lwz r4,[toc].GS.0.static_int(rtoc)
2878            *           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
2879            * The argument following the `]' must be a symbol name, and the
2880            * register must be the toc register: 'rtoc' or '2'
2881            *
2882            * The effect is to 0 as the displacement field
2883            * in the instruction, and issue an IMAGE_REL_PPC_TOCREL16 (or
2884            * the appropriate variation) reloc against it based on the symbol.
2885            * The linker will build the toc, and insert the resolved toc offset.
2886            *
2887            * Note:
2888            * o The size of the toc entry is currently assumed to be
2889            *   32 bits. This should not be assumed to be a hard coded
2890            *   number.
2891            * o In an effort to cope with a change from 32 to 64 bits,
2892            *   there are also toc entries that are specified to be
2893            *   either 32 or 64 bits:
2894            *     lwz r4,[toc32].GS.0.static_int(rtoc)
2895            *     lwz r4,[toc64].GS.0.static_int(rtoc)
2896            *   These demand toc entries of the specified size, and the
2897            *   instruction probably requires it.
2898            */
2899
2900           int valid_toc;
2901           enum toc_size_qualifier toc_kind;
2902           bfd_reloc_code_real_type toc_reloc;
2903
2904           /* Go parse off the [tocXX] part.  */
2905           valid_toc = parse_toc_entry (&toc_kind);
2906
2907           if (!valid_toc)
2908             {
2909               ignore_rest_of_line ();
2910               break;
2911             }
2912
2913           /* Now get the symbol following the ']'.  */
2914           expression (&ex);
2915
2916           switch (toc_kind)
2917             {
2918             case default_toc:
2919               /* In this case, we may not have seen the symbol yet,
2920                  since  it is allowed to appear on a .extern or .globl
2921                  or just be a label in the .data section.  */
2922               toc_reloc = BFD_RELOC_PPC_TOC16;
2923               break;
2924             case data_in_toc:
2925               /* 1. The symbol must be defined and either in the toc
2926                  section, or a global.
2927                  2. The reloc generated must have the TOCDEFN flag set
2928                  in upper bit mess of the reloc type.
2929                  FIXME: It's a little confusing what the tocv
2930                  qualifier can be used for.  At the very least, I've
2931                  seen three uses, only one of which I'm sure I can
2932                  explain.  */
2933               if (ex.X_op == O_symbol)
2934                 {
2935                   gas_assert (ex.X_add_symbol != NULL);
2936                   if (symbol_get_bfdsym (ex.X_add_symbol)->section
2937                       != tocdata_section)
2938                     {
2939                       as_bad (_("[tocv] symbol is not a toc symbol"));
2940                     }
2941                 }
2942
2943               toc_reloc = BFD_RELOC_PPC_TOC16;
2944               break;
2945             case must_be_32:
2946               /* FIXME: these next two specifically specify 32/64 bit
2947                  toc entries.  We don't support them today.  Is this
2948                  the right way to say that?  */
2949               toc_reloc = BFD_RELOC_NONE;
2950               as_bad (_("unimplemented toc32 expression modifier"));
2951               break;
2952             case must_be_64:
2953               /* FIXME: see above.  */
2954               toc_reloc = BFD_RELOC_NONE;
2955               as_bad (_("unimplemented toc64 expression modifier"));
2956               break;
2957             default:
2958               fprintf (stderr,
2959                        _("Unexpected return value [%d] from parse_toc_entry!\n"),
2960                        toc_kind);
2961               abort ();
2962               break;
2963             }
2964
2965           /* We need to generate a fixup for this expression.  */
2966           if (fc >= MAX_INSN_FIXUPS)
2967             as_fatal (_("too many fixups"));
2968
2969           fixups[fc].reloc = toc_reloc;
2970           fixups[fc].exp = ex;
2971           fixups[fc].opindex = *opindex_ptr;
2972           ++fc;
2973
2974           /* Ok. We've set up the fixup for the instruction. Now make it
2975              look like the constant 0 was found here.  */
2976           ex.X_unsigned = 1;
2977           ex.X_op = O_constant;
2978           ex.X_add_number = 0;
2979           ex.X_add_symbol = NULL;
2980           ex.X_op_symbol = NULL;
2981         }
2982
2983       else
2984 #endif          /* TE_PE */
2985         {
2986           if ((reg_names_p
2987                && (((operand->flags & PPC_OPERAND_CR_BIT) != 0)
2988                    || ((operand->flags & PPC_OPERAND_CR_REG) != 0)))
2989               || !register_name (&ex))
2990             {
2991               char save_lex = lex_type['%'];
2992
2993               if (((operand->flags & PPC_OPERAND_CR_REG) != 0)
2994                   || (operand->flags & PPC_OPERAND_CR_BIT) != 0)
2995                 {
2996                   cr_operand = TRUE;
2997                   lex_type['%'] |= LEX_BEGIN_NAME;
2998                 }
2999               expression (&ex);
3000               cr_operand = FALSE;
3001               lex_type['%'] = save_lex;
3002             }
3003         }
3004
3005       str = input_line_pointer;
3006       input_line_pointer = hold;
3007
3008       if (ex.X_op == O_illegal)
3009         as_bad (_("illegal operand"));
3010       else if (ex.X_op == O_absent)
3011         as_bad (_("missing operand"));
3012       else if (ex.X_op == O_register)
3013         {
3014           if ((ex.X_md
3015                & ~operand->flags
3016                & (PPC_OPERAND_GPR | PPC_OPERAND_FPR | PPC_OPERAND_VR
3017                   | PPC_OPERAND_VSR | PPC_OPERAND_CR_BIT | PPC_OPERAND_CR_REG
3018                   | PPC_OPERAND_SPR | PPC_OPERAND_GQR)) != 0
3019               && !((ex.X_md & PPC_OPERAND_GPR) != 0
3020                    && ex.X_add_number != 0
3021                    && (operand->flags & PPC_OPERAND_GPR_0) != 0))
3022             as_warn (_("invalid register expression"));
3023           insn = ppc_insert_operand (insn, operand, ex.X_add_number,
3024                                      ppc_cpu, (char *) NULL, 0);
3025         }
3026       else if (ex.X_op == O_constant)
3027         {
3028 #ifdef OBJ_ELF
3029           /* Allow @HA, @L, @H on constants.  */
3030           bfd_reloc_code_real_type reloc;
3031           char *orig_str = str;
3032
3033           if ((reloc = ppc_elf_suffix (&str, &ex)) != BFD_RELOC_NONE)
3034             switch (reloc)
3035               {
3036               default:
3037                 str = orig_str;
3038                 break;
3039
3040               case BFD_RELOC_LO16:
3041                 ex.X_add_number &= 0xffff;
3042                 if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
3043                   ex.X_add_number = SEX16 (ex.X_add_number);
3044                 break;
3045
3046               case BFD_RELOC_HI16:
3047                 if (REPORT_OVERFLOW_HI && ppc_obj64)
3048                   {
3049                     /* PowerPC64 @h is tested for overflow.  */
3050                     ex.X_add_number = (addressT) ex.X_add_number >> 16;
3051                     if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
3052                       {
3053                         addressT sign = (((addressT) -1 >> 16) + 1) >> 1;
3054                         ex.X_add_number
3055                           = ((addressT) ex.X_add_number ^ sign) - sign;
3056                       }
3057                     break;
3058                   }
3059                 /* Fallthru */
3060
3061               case BFD_RELOC_PPC64_ADDR16_HIGH:
3062                 ex.X_add_number = PPC_HI (ex.X_add_number);
3063                 if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
3064                   ex.X_add_number = SEX16 (ex.X_add_number);
3065                 break;
3066
3067               case BFD_RELOC_HI16_S:
3068                 if (REPORT_OVERFLOW_HI && ppc_obj64)
3069                   {
3070                     /* PowerPC64 @ha is tested for overflow.  */
3071                     ex.X_add_number
3072                       = ((addressT) ex.X_add_number + 0x8000) >> 16;
3073                     if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
3074                       {
3075                         addressT sign = (((addressT) -1 >> 16) + 1) >> 1;
3076                         ex.X_add_number
3077                           = ((addressT) ex.X_add_number ^ sign) - sign;
3078                       }
3079                     break;
3080                   }
3081                 /* Fallthru */
3082
3083               case BFD_RELOC_PPC64_ADDR16_HIGHA:
3084                 ex.X_add_number = PPC_HA (ex.X_add_number);
3085                 if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
3086                   ex.X_add_number = SEX16 (ex.X_add_number);
3087                 break;
3088
3089               case BFD_RELOC_PPC64_HIGHER:
3090                 ex.X_add_number = PPC_HIGHER (ex.X_add_number);
3091                 if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
3092                   ex.X_add_number = SEX16 (ex.X_add_number);
3093                 break;
3094
3095               case BFD_RELOC_PPC64_HIGHER_S:
3096                 ex.X_add_number = PPC_HIGHERA (ex.X_add_number);
3097                 if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
3098                   ex.X_add_number = SEX16 (ex.X_add_number);
3099                 break;
3100
3101               case BFD_RELOC_PPC64_HIGHEST:
3102                 ex.X_add_number = PPC_HIGHEST (ex.X_add_number);
3103                 if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
3104                   ex.X_add_number = SEX16 (ex.X_add_number);
3105                 break;
3106
3107               case BFD_RELOC_PPC64_HIGHEST_S:
3108                 ex.X_add_number = PPC_HIGHESTA (ex.X_add_number);
3109                 if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
3110                   ex.X_add_number = SEX16 (ex.X_add_number);
3111                 break;
3112               }
3113 #endif /* OBJ_ELF */
3114           insn = ppc_insert_operand (insn, operand, ex.X_add_number,
3115                                      ppc_cpu, (char *) NULL, 0);
3116         }
3117       else
3118         {
3119           bfd_reloc_code_real_type reloc = BFD_RELOC_NONE;
3120 #ifdef OBJ_ELF
3121           if (ex.X_op == O_symbol && str[0] == '(')
3122             {
3123               const char *sym_name = S_GET_NAME (ex.X_add_symbol);
3124               if (sym_name[0] == '.')
3125                 ++sym_name;
3126
3127               if (strcasecmp (sym_name, "__tls_get_addr") == 0)
3128                 {
3129                   expressionS tls_exp;
3130
3131                   hold = input_line_pointer;
3132                   input_line_pointer = str + 1;
3133                   expression (&tls_exp);
3134                   if (tls_exp.X_op == O_symbol)
3135                     {
3136                       reloc = BFD_RELOC_NONE;
3137                       if (strncasecmp (input_line_pointer, "@tlsgd)", 7) == 0)
3138                         {
3139                           reloc = BFD_RELOC_PPC_TLSGD;
3140                           input_line_pointer += 7;
3141                         }
3142                       else if (strncasecmp (input_line_pointer, "@tlsld)", 7) == 0)
3143                         {
3144                           reloc = BFD_RELOC_PPC_TLSLD;
3145                           input_line_pointer += 7;
3146                         }
3147                       if (reloc != BFD_RELOC_NONE)
3148                         {
3149                           SKIP_WHITESPACE ();
3150                           str = input_line_pointer;
3151
3152                           if (fc >= MAX_INSN_FIXUPS)
3153                             as_fatal (_("too many fixups"));
3154                           fixups[fc].exp = tls_exp;
3155                           fixups[fc].opindex = *opindex_ptr;
3156                           fixups[fc].reloc = reloc;
3157                           ++fc;
3158                         }
3159                     }
3160                   input_line_pointer = hold;
3161                 }
3162             }
3163
3164           if ((reloc = ppc_elf_suffix (&str, &ex)) != BFD_RELOC_NONE)
3165             {
3166               /* Some TLS tweaks.  */
3167               switch (reloc)
3168                 {
3169                 default:
3170                   break;
3171
3172                 case BFD_RELOC_PPC_TLS:
3173                   if (!_bfd_elf_ppc_at_tls_transform (opcode->opcode, 0))
3174                     as_bad (_("@tls may not be used with \"%s\" operands"),
3175                             opcode->name);
3176                   else if (operand->shift != 11)
3177                     as_bad (_("@tls may only be used in last operand"));
3178                   else
3179                     insn = ppc_insert_operand (insn, operand,
3180                                                ppc_obj64 ? 13 : 2,
3181                                                ppc_cpu, (char *) NULL, 0);
3182                   break;
3183
3184                   /* We'll only use the 32 (or 64) bit form of these relocations
3185                      in constants.  Instructions get the 16 bit form.  */
3186                 case BFD_RELOC_PPC_DTPREL:
3187                   reloc = BFD_RELOC_PPC_DTPREL16;
3188                   break;
3189                 case BFD_RELOC_PPC_TPREL:
3190                   reloc = BFD_RELOC_PPC_TPREL16;
3191                   break;
3192                 }
3193
3194               /* addpcis.  */
3195               if (opcode->opcode == (19 << 26) + (2 << 1)
3196                   && reloc == BFD_RELOC_HI16_S)
3197                 reloc = BFD_RELOC_PPC_16DX_HA;
3198
3199               /* If VLE-mode convert LO/HI/HA relocations.  */
3200               if (opcode->flags & PPC_OPCODE_VLE)
3201                 {
3202                   uint64_t tmp_insn = insn & opcode->mask;
3203
3204                   int use_a_reloc = (tmp_insn == E_OR2I_INSN
3205                                      || tmp_insn == E_AND2I_DOT_INSN
3206                                      || tmp_insn == E_OR2IS_INSN
3207                                      || tmp_insn == E_LIS_INSN
3208                                      || tmp_insn == E_AND2IS_DOT_INSN);
3209
3210
3211                   int use_d_reloc = (tmp_insn == E_ADD2I_DOT_INSN
3212                                      || tmp_insn == E_ADD2IS_INSN
3213                                      || tmp_insn == E_CMP16I_INSN
3214                                      || tmp_insn == E_MULL2I_INSN
3215                                      || tmp_insn == E_CMPL16I_INSN
3216                                      || tmp_insn == E_CMPH16I_INSN
3217                                      || tmp_insn == E_CMPHL16I_INSN);
3218
3219                   switch (reloc)
3220                     {
3221                     default:
3222                       break;
3223
3224                     case BFD_RELOC_PPC_EMB_SDA21:
3225                       reloc = BFD_RELOC_PPC_VLE_SDA21;
3226                       break;
3227
3228                     case BFD_RELOC_LO16:
3229                       if (use_d_reloc)
3230                         reloc = BFD_RELOC_PPC_VLE_LO16D;
3231                       else if (use_a_reloc)
3232                         reloc = BFD_RELOC_PPC_VLE_LO16A;
3233                       break;
3234
3235                     case BFD_RELOC_HI16:
3236                       if (use_d_reloc)
3237                         reloc = BFD_RELOC_PPC_VLE_HI16D;
3238                       else if (use_a_reloc)
3239                         reloc = BFD_RELOC_PPC_VLE_HI16A;
3240                       break;
3241
3242                     case BFD_RELOC_HI16_S:
3243                       if (use_d_reloc)
3244                         reloc = BFD_RELOC_PPC_VLE_HA16D;
3245                       else if (use_a_reloc)
3246                         reloc = BFD_RELOC_PPC_VLE_HA16A;
3247                       break;
3248
3249                     case BFD_RELOC_PPC_VLE_SDAREL_LO16A:
3250                       if (use_d_reloc)
3251                         reloc = BFD_RELOC_PPC_VLE_SDAREL_LO16D;
3252                       break;
3253
3254                     case BFD_RELOC_PPC_VLE_SDAREL_HI16A:
3255                       if (use_d_reloc)
3256                         reloc = BFD_RELOC_PPC_VLE_SDAREL_HI16D;
3257                       break;
3258
3259                     case BFD_RELOC_PPC_VLE_SDAREL_HA16A:
3260                       if (use_d_reloc)
3261                         reloc = BFD_RELOC_PPC_VLE_SDAREL_HA16D;
3262                       break;
3263                     }
3264                 }
3265             }
3266 #endif /* OBJ_ELF */
3267
3268           if (reloc != BFD_RELOC_NONE)
3269             ;
3270           /* Determine a BFD reloc value based on the operand information.
3271              We are only prepared to turn a few of the operands into
3272              relocs.  */
3273           else if ((operand->flags & (PPC_OPERAND_RELATIVE
3274                                       | PPC_OPERAND_ABSOLUTE)) != 0
3275                    && operand->bitm == 0x3fffffc
3276                    && operand->shift == 0)
3277             reloc = BFD_RELOC_PPC_B26;
3278           else if ((operand->flags & (PPC_OPERAND_RELATIVE
3279                                       | PPC_OPERAND_ABSOLUTE)) != 0
3280                    && operand->bitm == 0xfffc
3281                    && operand->shift == 0)
3282             reloc = BFD_RELOC_PPC_B16;
3283           else if ((operand->flags & PPC_OPERAND_RELATIVE) != 0
3284                    && operand->bitm == 0x1fe
3285                    && operand->shift == -1)
3286             reloc = BFD_RELOC_PPC_VLE_REL8;
3287           else if ((operand->flags & PPC_OPERAND_RELATIVE) != 0
3288                    && operand->bitm == 0xfffe
3289                    && operand->shift == 0)
3290             reloc = BFD_RELOC_PPC_VLE_REL15;
3291           else if ((operand->flags & PPC_OPERAND_RELATIVE) != 0
3292                    && operand->bitm == 0x1fffffe
3293                    && operand->shift == 0)
3294             reloc = BFD_RELOC_PPC_VLE_REL24;
3295           else if ((operand->flags & PPC_OPERAND_NEGATIVE) == 0
3296                    && (operand->bitm & 0xfff0) == 0xfff0
3297                    && operand->shift == 0)
3298             {
3299               reloc = BFD_RELOC_16;
3300 #if defined OBJ_XCOFF || defined OBJ_ELF
3301               /* Note: the symbol may be not yet defined.  */
3302               if ((operand->flags & PPC_OPERAND_PARENS) != 0
3303                   && ppc_is_toc_sym (ex.X_add_symbol))
3304                 {
3305                   reloc = BFD_RELOC_PPC_TOC16;
3306 #ifdef OBJ_ELF
3307                   as_warn (_("assuming %s on symbol"),
3308                            ppc_obj64 ? "@toc" : "@xgot");
3309 #endif
3310                 }
3311 #endif
3312             }
3313
3314           /* For the absolute forms of branches, convert the PC
3315              relative form back into the absolute.  */
3316           if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0)
3317             {
3318               switch (reloc)
3319                 {
3320                 case BFD_RELOC_PPC_B26:
3321                   reloc = BFD_RELOC_PPC_BA26;
3322                   break;
3323                 case BFD_RELOC_PPC_B16:
3324                   reloc = BFD_RELOC_PPC_BA16;
3325                   break;
3326 #ifdef OBJ_ELF
3327                 case BFD_RELOC_PPC_B16_BRTAKEN:
3328                   reloc = BFD_RELOC_PPC_BA16_BRTAKEN;
3329                   break;
3330                 case BFD_RELOC_PPC_B16_BRNTAKEN:
3331                   reloc = BFD_RELOC_PPC_BA16_BRNTAKEN;
3332                   break;
3333 #endif
3334                 default:
3335                   break;
3336                 }
3337             }
3338
3339 #ifdef OBJ_ELF
3340           switch (reloc)
3341             {
3342             case BFD_RELOC_PPC_TOC16:
3343               toc_reloc_types |= has_small_toc_reloc;
3344               break;
3345             case BFD_RELOC_PPC64_TOC16_LO:
3346             case BFD_RELOC_PPC64_TOC16_HI:
3347             case BFD_RELOC_PPC64_TOC16_HA:
3348               toc_reloc_types |= has_large_toc_reloc;
3349               break;
3350             default:
3351               break;
3352             }
3353
3354           if (ppc_obj64
3355               && (operand->flags & (PPC_OPERAND_DS | PPC_OPERAND_DQ)) != 0)
3356             {
3357               switch (reloc)
3358                 {
3359                 case BFD_RELOC_16:
3360                   reloc = BFD_RELOC_PPC64_ADDR16_DS;
3361                   break;
3362                 case BFD_RELOC_LO16:
3363                   reloc = BFD_RELOC_PPC64_ADDR16_LO_DS;
3364                   break;
3365                 case BFD_RELOC_16_GOTOFF:
3366                   reloc = BFD_RELOC_PPC64_GOT16_DS;
3367                   break;
3368                 case BFD_RELOC_LO16_GOTOFF:
3369                   reloc = BFD_RELOC_PPC64_GOT16_LO_DS;
3370                   break;
3371                 case BFD_RELOC_LO16_PLTOFF:
3372                   reloc = BFD_RELOC_PPC64_PLT16_LO_DS;
3373                   break;
3374                 case BFD_RELOC_16_BASEREL:
3375                   reloc = BFD_RELOC_PPC64_SECTOFF_DS;
3376                   break;
3377                 case BFD_RELOC_LO16_BASEREL:
3378                   reloc = BFD_RELOC_PPC64_SECTOFF_LO_DS;
3379                   break;
3380                 case BFD_RELOC_PPC_TOC16:
3381                   reloc = BFD_RELOC_PPC64_TOC16_DS;
3382                   break;
3383                 case BFD_RELOC_PPC64_TOC16_LO:
3384                   reloc = BFD_RELOC_PPC64_TOC16_LO_DS;
3385                   break;
3386                 case BFD_RELOC_PPC64_PLTGOT16:
3387                   reloc = BFD_RELOC_PPC64_PLTGOT16_DS;
3388                   break;
3389                 case BFD_RELOC_PPC64_PLTGOT16_LO:
3390                   reloc = BFD_RELOC_PPC64_PLTGOT16_LO_DS;
3391                   break;
3392                 case BFD_RELOC_PPC_DTPREL16:
3393                   reloc = BFD_RELOC_PPC64_DTPREL16_DS;
3394                   break;
3395                 case BFD_RELOC_PPC_DTPREL16_LO:
3396                   reloc = BFD_RELOC_PPC64_DTPREL16_LO_DS;
3397                   break;
3398                 case BFD_RELOC_PPC_TPREL16:
3399                   reloc = BFD_RELOC_PPC64_TPREL16_DS;
3400                   break;
3401                 case BFD_RELOC_PPC_TPREL16_LO:
3402                   reloc = BFD_RELOC_PPC64_TPREL16_LO_DS;
3403                   break;
3404                 case BFD_RELOC_PPC_GOT_DTPREL16:
3405                 case BFD_RELOC_PPC_GOT_DTPREL16_LO:
3406                 case BFD_RELOC_PPC_GOT_TPREL16:
3407                 case BFD_RELOC_PPC_GOT_TPREL16_LO:
3408                   break;
3409                 default:
3410                   as_bad (_("unsupported relocation for DS offset field"));
3411                   break;
3412                 }
3413             }
3414 #endif
3415
3416           /* We need to generate a fixup for this expression.  */
3417           if (fc >= MAX_INSN_FIXUPS)
3418             as_fatal (_("too many fixups"));
3419           fixups[fc].exp = ex;
3420           fixups[fc].opindex = *opindex_ptr;
3421           fixups[fc].reloc = reloc;
3422           ++fc;
3423         }
3424
3425       if (need_paren)
3426         {
3427           endc = ')';
3428           need_paren = 0;
3429           /* If expecting more operands, then we want to see "),".  */
3430           if (*str == endc && opindex_ptr[1] != 0)
3431             {
3432               do
3433                 ++str;
3434               while (ISSPACE (*str));
3435               endc = ',';
3436             }
3437         }
3438       else if ((operand->flags & PPC_OPERAND_PARENS) != 0)
3439         {
3440           endc = '(';
3441           need_paren = 1;
3442         }
3443       else
3444         endc = ',';
3445
3446       /* The call to expression should have advanced str past any
3447          whitespace.  */
3448       if (*str != endc
3449           && (endc != ',' || *str != '\0'))
3450         {
3451           if (*str == '\0')
3452             as_bad (_("syntax error; end of line, expected `%c'"), endc);
3453           else
3454             as_bad (_("syntax error; found `%c', expected `%c'"), *str, endc);
3455           break;
3456         }
3457
3458       if (*str != '\0')
3459         ++str;
3460     }
3461
3462   while (ISSPACE (*str))
3463     ++str;
3464
3465   if (*str != '\0')
3466     as_bad (_("junk at end of line: `%s'"), str);
3467
3468 #ifdef OBJ_ELF
3469   /* Do we need/want an APUinfo section? */
3470   if ((ppc_cpu & (PPC_OPCODE_E500 | PPC_OPCODE_E500MC | PPC_OPCODE_VLE)) != 0
3471       && !ppc_obj64)
3472     {
3473       /* These are all version "1".  */
3474       if (opcode->flags & PPC_OPCODE_SPE)
3475         ppc_apuinfo_section_add (PPC_APUINFO_SPE, 1);
3476       if (opcode->flags & PPC_OPCODE_ISEL)
3477         ppc_apuinfo_section_add (PPC_APUINFO_ISEL, 1);
3478       if (opcode->flags & PPC_OPCODE_EFS)
3479         ppc_apuinfo_section_add (PPC_APUINFO_EFS, 1);
3480       if (opcode->flags & PPC_OPCODE_BRLOCK)
3481         ppc_apuinfo_section_add (PPC_APUINFO_BRLOCK, 1);
3482       if (opcode->flags & PPC_OPCODE_PMR)
3483         ppc_apuinfo_section_add (PPC_APUINFO_PMR, 1);
3484       if (opcode->flags & PPC_OPCODE_CACHELCK)
3485         ppc_apuinfo_section_add (PPC_APUINFO_CACHELCK, 1);
3486       if (opcode->flags & PPC_OPCODE_RFMCI)
3487         ppc_apuinfo_section_add (PPC_APUINFO_RFMCI, 1);
3488       /* Only set the VLE flag if the instruction has been pulled via
3489          the VLE instruction set.  This way the flag is guaranteed to
3490          be set for VLE-only instructions or for VLE-only processors,
3491          however it'll remain clear for dual-mode instructions on
3492          dual-mode and, more importantly, standard-mode processors.  */
3493       if ((ppc_cpu & opcode->flags) == PPC_OPCODE_VLE)
3494         {
3495           ppc_apuinfo_section_add (PPC_APUINFO_VLE, 1);
3496           if (elf_section_data (now_seg) != NULL)
3497             elf_section_data (now_seg)->this_hdr.sh_flags |= SHF_PPC_VLE;
3498         }
3499     }
3500 #endif
3501
3502   /* Write out the instruction.  */
3503
3504   addr_mask = 3;
3505   if ((ppc_cpu & PPC_OPCODE_VLE) != 0)
3506     /* All instructions can start on a 2 byte boundary for VLE.  */
3507     addr_mask = 1;
3508
3509   if (frag_now->insn_addr != addr_mask)
3510     {
3511       /* Don't emit instructions to a frag started for data, or for a
3512          CPU differing in VLE mode.  Data is allowed to be misaligned,
3513          and it's possible to start a new frag in the middle of
3514          misaligned data.  */
3515       frag_wane (frag_now);
3516       frag_new (0);
3517     }
3518
3519   /* Check that insns within the frag are aligned.  ppc_frag_check
3520      will ensure that the frag start address is aligned.  */
3521   if ((frag_now_fix () & addr_mask) != 0)
3522     as_bad (_("instruction address is not a multiple of %d"), addr_mask + 1);
3523
3524   /* Differentiate between two and four byte insns.  */
3525   insn_length = 4;
3526   if ((ppc_cpu & PPC_OPCODE_VLE) != 0 && PPC_OP_SE_VLE (insn))
3527     insn_length = 2;
3528
3529   f = frag_more (insn_length);
3530   frag_now->insn_addr = addr_mask;
3531   md_number_to_chars (f, insn, insn_length);
3532   last_insn = insn;
3533   last_seg = now_seg;
3534   last_subseg = now_subseg;
3535
3536 #ifdef OBJ_ELF
3537   dwarf2_emit_insn (insn_length);
3538 #endif
3539
3540   /* Create any fixups.  */
3541   for (i = 0; i < fc; i++)
3542     {
3543       fixS *fixP;
3544       if (fixups[i].reloc != BFD_RELOC_NONE)
3545         {
3546           reloc_howto_type *reloc_howto;
3547           int size;
3548           int offset;
3549
3550           reloc_howto = bfd_reloc_type_lookup (stdoutput, fixups[i].reloc);
3551           if (!reloc_howto)
3552             abort ();
3553
3554           size = bfd_get_reloc_size (reloc_howto);
3555           offset = target_big_endian ? (insn_length - size) : 0;
3556
3557           fixP = fix_new_exp (frag_now,
3558                               f - frag_now->fr_literal + offset,
3559                               size,
3560                               &fixups[i].exp,
3561                               reloc_howto->pc_relative,
3562                               fixups[i].reloc);
3563         }
3564       else
3565         {
3566           const struct powerpc_operand *operand;
3567
3568           operand = &powerpc_operands[fixups[i].opindex];
3569           fixP = fix_new_exp (frag_now,
3570                               f - frag_now->fr_literal,
3571                               insn_length,
3572                               &fixups[i].exp,
3573                               (operand->flags & PPC_OPERAND_RELATIVE) != 0,
3574                               BFD_RELOC_NONE);
3575         }
3576       fixP->fx_pcrel_adjust = fixups[i].opindex;
3577     }
3578 }
3579
3580 /* Handle a macro.  Gather all the operands, transform them as
3581    described by the macro, and call md_assemble recursively.  All the
3582    operands are separated by commas; we don't accept parentheses
3583    around operands here.  */
3584
3585 static void
3586 ppc_macro (char *str, const struct powerpc_macro *macro)
3587 {
3588   char *operands[10];
3589   unsigned int count;
3590   char *s;
3591   unsigned int len;
3592   const char *format;
3593   unsigned int arg;
3594   char *send;
3595   char *complete;
3596
3597   /* Gather the users operands into the operands array.  */
3598   count = 0;
3599   s = str;
3600   while (1)
3601     {
3602       if (count >= sizeof operands / sizeof operands[0])
3603         break;
3604       operands[count++] = s;
3605       s = strchr (s, ',');
3606       if (s == (char *) NULL)
3607         break;
3608       *s++ = '\0';
3609     }
3610
3611   if (count != macro->operands)
3612     {
3613       as_bad (_("wrong number of operands"));
3614       return;
3615     }
3616
3617   /* Work out how large the string must be (the size is unbounded
3618      because it includes user input).  */
3619   len = 0;
3620   format = macro->format;
3621   while (*format != '\0')
3622     {
3623       if (*format != '%')
3624         {
3625           ++len;
3626           ++format;
3627         }
3628       else
3629         {
3630           arg = strtol (format + 1, &send, 10);
3631           know (send != format && arg < count);
3632           len += strlen (operands[arg]);
3633           format = send;
3634         }
3635     }
3636
3637   /* Put the string together.  */
3638   complete = s = XNEWVEC (char, len + 1);
3639   format = macro->format;
3640   while (*format != '\0')
3641     {
3642       if (*format != '%')
3643         *s++ = *format++;
3644       else
3645         {
3646           arg = strtol (format + 1, &send, 10);
3647           strcpy (s, operands[arg]);
3648           s += strlen (s);
3649           format = send;
3650         }
3651     }
3652   *s = '\0';
3653
3654   /* Assemble the constructed instruction.  */
3655   md_assemble (complete);
3656   free (complete);
3657 }
3658 \f
3659 #ifdef OBJ_ELF
3660 /* For ELF, add support for SHT_ORDERED.  */
3661
3662 int
3663 ppc_section_type (char *str, size_t len)
3664 {
3665   if (len == 7 && strncmp (str, "ordered", 7) == 0)
3666     return SHT_ORDERED;
3667
3668   return -1;
3669 }
3670
3671 int
3672 ppc_section_flags (flagword flags, bfd_vma attr ATTRIBUTE_UNUSED, int type)
3673 {
3674   if (type == SHT_ORDERED)
3675     flags |= SEC_ALLOC | SEC_LOAD | SEC_SORT_ENTRIES;
3676
3677   return flags;
3678 }
3679
3680 bfd_vma
3681 ppc_elf_section_letter (int letter, const char **ptrmsg)
3682 {
3683   if (letter == 'v')
3684     return SHF_PPC_VLE;
3685
3686   *ptrmsg = _("bad .section directive: want a,e,v,w,x,M,S,G,T in string");
3687   return -1;
3688 }
3689 #endif /* OBJ_ELF */
3690
3691 \f
3692 /* Pseudo-op handling.  */
3693
3694 /* The .byte pseudo-op.  This is similar to the normal .byte
3695    pseudo-op, but it can also take a single ASCII string.  */
3696
3697 static void
3698 ppc_byte (int ignore ATTRIBUTE_UNUSED)
3699 {
3700   int count = 0;
3701
3702   if (*input_line_pointer != '\"')
3703     {
3704       cons (1);
3705       return;
3706     }
3707
3708   /* Gather characters.  A real double quote is doubled.  Unusual
3709      characters are not permitted.  */
3710   ++input_line_pointer;
3711   while (1)
3712     {
3713       char c;
3714
3715       c = *input_line_pointer++;
3716
3717       if (c == '\"')
3718         {
3719           if (*input_line_pointer != '\"')
3720             break;
3721           ++input_line_pointer;
3722         }
3723
3724       FRAG_APPEND_1_CHAR (c);
3725       ++count;
3726     }
3727
3728   if (warn_476 && count != 0 && (now_seg->flags & SEC_CODE) != 0)
3729     as_warn (_("data in executable section"));
3730   demand_empty_rest_of_line ();
3731 }
3732 \f
3733 #ifdef OBJ_XCOFF
3734
3735 /* XCOFF specific pseudo-op handling.  */
3736
3737 /* This is set if we are creating a .stabx symbol, since we don't want
3738    to handle symbol suffixes for such symbols.  */
3739 static bfd_boolean ppc_stab_symbol;
3740
3741 /* The .comm and .lcomm pseudo-ops for XCOFF.  XCOFF puts common
3742    symbols in the .bss segment as though they were local common
3743    symbols, and uses a different smclas.  The native Aix 4.3.3 assembler
3744    aligns .comm and .lcomm to 4 bytes.  */
3745
3746 static void
3747 ppc_comm (int lcomm)
3748 {
3749   asection *current_seg = now_seg;
3750   subsegT current_subseg = now_subseg;
3751   char *name;
3752   char endc;
3753   char *end_name;
3754   offsetT size;
3755   offsetT align;
3756   symbolS *lcomm_sym = NULL;
3757   symbolS *sym;
3758   char *pfrag;
3759
3760   endc = get_symbol_name (&name);
3761   end_name = input_line_pointer;
3762   (void) restore_line_pointer (endc);
3763
3764   if (*input_line_pointer != ',')
3765     {
3766       as_bad (_("missing size"));
3767       ignore_rest_of_line ();
3768       return;
3769     }
3770   ++input_line_pointer;
3771
3772   size = get_absolute_expression ();
3773   if (size < 0)
3774     {
3775       as_bad (_("negative size"));
3776       ignore_rest_of_line ();
3777       return;
3778     }
3779
3780   if (! lcomm)
3781     {
3782       /* The third argument to .comm is the alignment.  */
3783       if (*input_line_pointer != ',')
3784         align = 2;
3785       else
3786         {
3787           ++input_line_pointer;
3788           align = get_absolute_expression ();
3789           if (align <= 0)
3790             {
3791               as_warn (_("ignoring bad alignment"));
3792               align = 2;
3793             }
3794         }
3795     }
3796   else
3797     {
3798       char *lcomm_name;
3799       char lcomm_endc;
3800
3801       /* The third argument to .lcomm appears to be the real local
3802          common symbol to create.  References to the symbol named in
3803          the first argument are turned into references to the third
3804          argument.  */
3805       if (*input_line_pointer != ',')
3806         {
3807           as_bad (_("missing real symbol name"));
3808           ignore_rest_of_line ();
3809           return;
3810         }
3811       ++input_line_pointer;
3812
3813       lcomm_endc = get_symbol_name (&lcomm_name);
3814
3815       lcomm_sym = symbol_find_or_make (lcomm_name);
3816
3817       (void) restore_line_pointer (lcomm_endc);
3818
3819       /* The fourth argument to .lcomm is the alignment.  */
3820       if (*input_line_pointer != ',')
3821         {
3822           if (size <= 4)
3823             align = 2;
3824           else
3825             align = 3;
3826         }
3827       else
3828         {
3829           ++input_line_pointer;
3830           align = get_absolute_expression ();
3831           if (align <= 0)
3832             {
3833               as_warn (_("ignoring bad alignment"));
3834               align = 2;
3835             }
3836         }
3837     }
3838
3839   *end_name = '\0';
3840   sym = symbol_find_or_make (name);
3841   *end_name = endc;
3842
3843   if (S_IS_DEFINED (sym)
3844       || S_GET_VALUE (sym) != 0)
3845     {
3846       as_bad (_("attempt to redefine symbol"));
3847       ignore_rest_of_line ();
3848       return;
3849     }
3850
3851   record_alignment (bss_section, align);
3852
3853   if (! lcomm
3854       || ! S_IS_DEFINED (lcomm_sym))
3855     {
3856       symbolS *def_sym;
3857       offsetT def_size;
3858
3859       if (! lcomm)
3860         {
3861           def_sym = sym;
3862           def_size = size;
3863           S_SET_EXTERNAL (sym);
3864         }
3865       else
3866         {
3867           symbol_get_tc (lcomm_sym)->output = 1;
3868           def_sym = lcomm_sym;
3869           def_size = 0;
3870         }
3871
3872       subseg_set (bss_section, 1);
3873       frag_align (align, 0, 0);
3874
3875       symbol_set_frag (def_sym, frag_now);
3876       pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, def_sym,
3877                         def_size, (char *) NULL);
3878       *pfrag = 0;
3879       S_SET_SEGMENT (def_sym, bss_section);
3880       symbol_get_tc (def_sym)->align = align;
3881     }
3882   else if (lcomm)
3883     {
3884       /* Align the size of lcomm_sym.  */
3885       symbol_get_frag (lcomm_sym)->fr_offset =
3886         ((symbol_get_frag (lcomm_sym)->fr_offset + (1 << align) - 1)
3887          &~ ((1 << align) - 1));
3888       if (align > symbol_get_tc (lcomm_sym)->align)
3889         symbol_get_tc (lcomm_sym)->align = align;
3890     }
3891
3892   if (lcomm)
3893     {
3894       /* Make sym an offset from lcomm_sym.  */
3895       S_SET_SEGMENT (sym, bss_section);
3896       symbol_set_frag (sym, symbol_get_frag (lcomm_sym));
3897       S_SET_VALUE (sym, symbol_get_frag (lcomm_sym)->fr_offset);
3898       symbol_get_frag (lcomm_sym)->fr_offset += size;
3899     }
3900
3901   subseg_set (current_seg, current_subseg);
3902
3903   demand_empty_rest_of_line ();
3904 }
3905
3906 /* The .csect pseudo-op.  This switches us into a different
3907    subsegment.  The first argument is a symbol whose value is the
3908    start of the .csect.  In COFF, csect symbols get special aux
3909    entries defined by the x_csect field of union internal_auxent.  The
3910    optional second argument is the alignment (the default is 2).  */
3911
3912 static void
3913 ppc_csect (int ignore ATTRIBUTE_UNUSED)
3914 {
3915   char *name;
3916   char endc;
3917   symbolS *sym;
3918   offsetT align;
3919
3920   endc = get_symbol_name (&name);
3921
3922   sym = symbol_find_or_make (name);
3923
3924   (void) restore_line_pointer (endc);
3925
3926   if (S_GET_NAME (sym)[0] == '\0')
3927     {
3928       /* An unnamed csect is assumed to be [PR].  */
3929       symbol_get_tc (sym)->symbol_class = XMC_PR;
3930     }
3931
3932   align = 2;
3933   if (*input_line_pointer == ',')
3934     {
3935       ++input_line_pointer;
3936       align = get_absolute_expression ();
3937     }
3938
3939   ppc_change_csect (sym, align);
3940
3941   demand_empty_rest_of_line ();
3942 }
3943
3944 /* Change to a different csect.  */
3945
3946 static void
3947 ppc_change_csect (symbolS *sym, offsetT align)
3948 {
3949   if (S_IS_DEFINED (sym))
3950     subseg_set (S_GET_SEGMENT (sym), symbol_get_tc (sym)->subseg);
3951   else
3952     {
3953       symbolS **list_ptr;
3954       int after_toc;
3955       int hold_chunksize;
3956       symbolS *list;
3957       int is_code;
3958       segT sec;
3959
3960       /* This is a new csect.  We need to look at the symbol class to
3961          figure out whether it should go in the text section or the
3962          data section.  */
3963       after_toc = 0;
3964       is_code = 0;
3965       switch (symbol_get_tc (sym)->symbol_class)
3966         {
3967         case XMC_PR:
3968         case XMC_RO:
3969         case XMC_DB:
3970         case XMC_GL:
3971         case XMC_XO:
3972         case XMC_SV:
3973         case XMC_TI:
3974         case XMC_TB:
3975           S_SET_SEGMENT (sym, text_section);
3976           symbol_get_tc (sym)->subseg = ppc_text_subsegment;
3977           ++ppc_text_subsegment;
3978           list_ptr = &ppc_text_csects;
3979           is_code = 1;
3980           break;
3981         case XMC_RW:
3982         case XMC_TC0:
3983         case XMC_TC:
3984         case XMC_DS:
3985         case XMC_UA:
3986         case XMC_BS:
3987         case XMC_UC:
3988           if (ppc_toc_csect != NULL
3989               && (symbol_get_tc (ppc_toc_csect)->subseg + 1
3990                   == ppc_data_subsegment))
3991             after_toc = 1;
3992           S_SET_SEGMENT (sym, data_section);
3993           symbol_get_tc (sym)->subseg = ppc_data_subsegment;
3994           ++ppc_data_subsegment;
3995           list_ptr = &ppc_data_csects;
3996           break;
3997         default:
3998           abort ();
3999         }
4000
4001       /* We set the obstack chunk size to a small value before
4002          changing subsegments, so that we don't use a lot of memory
4003          space for what may be a small section.  */
4004       hold_chunksize = chunksize;
4005       chunksize = 64;
4006
4007       sec = subseg_new (segment_name (S_GET_SEGMENT (sym)),
4008                         symbol_get_tc (sym)->subseg);
4009
4010       chunksize = hold_chunksize;
4011
4012       if (after_toc)
4013         ppc_after_toc_frag = frag_now;
4014
4015       record_alignment (sec, align);
4016       if (is_code)
4017         frag_align_code (align, 0);
4018       else
4019         frag_align (align, 0, 0);
4020
4021       symbol_set_frag (sym, frag_now);
4022       S_SET_VALUE (sym, (valueT) frag_now_fix ());
4023
4024       symbol_get_tc (sym)->align = align;
4025       symbol_get_tc (sym)->output = 1;
4026       symbol_get_tc (sym)->within = sym;
4027
4028       for (list = *list_ptr;
4029            symbol_get_tc (list)->next != (symbolS *) NULL;
4030            list = symbol_get_tc (list)->next)
4031         ;
4032       symbol_get_tc (list)->next = sym;
4033
4034       symbol_remove (sym, &symbol_rootP, &symbol_lastP);
4035       symbol_append (sym, symbol_get_tc (list)->within, &symbol_rootP,
4036                      &symbol_lastP);
4037     }
4038
4039   ppc_current_csect = sym;
4040 }
4041
4042 static void
4043 ppc_change_debug_section (unsigned int idx, subsegT subseg)
4044 {
4045   segT sec;
4046   flagword oldflags;
4047   const struct xcoff_dwsect_name *dw = &xcoff_dwsect_names[idx];
4048
4049   sec = subseg_new (dw->name, subseg);
4050   oldflags = bfd_get_section_flags (stdoutput, sec);
4051   if (oldflags == SEC_NO_FLAGS)
4052     {
4053       /* Just created section.  */
4054       gas_assert (dw_sections[idx].sect == NULL);
4055
4056       bfd_set_section_flags (stdoutput, sec, SEC_DEBUGGING);
4057       bfd_set_section_alignment (stdoutput, sec, 0);
4058       dw_sections[idx].sect = sec;
4059     }
4060
4061   /* Not anymore in a csect.  */
4062   ppc_current_csect = NULL;
4063 }
4064
4065 /* The .dwsect pseudo-op.  Defines a DWARF section.  Syntax is:
4066      .dwsect flag [, opt-label ]
4067 */
4068
4069 static void
4070 ppc_dwsect (int ignore ATTRIBUTE_UNUSED)
4071 {
4072   offsetT flag;
4073   symbolS *opt_label;
4074   const struct xcoff_dwsect_name *dw;
4075   struct dw_subsection *subseg;
4076   struct dw_section *dws;
4077   int i;
4078
4079   /* Find section.  */
4080   flag = get_absolute_expression ();
4081   dw = NULL;
4082   for (i = 0; i < XCOFF_DWSECT_NBR_NAMES; i++)
4083     if (xcoff_dwsect_names[i].flag == flag)
4084       {
4085         dw = &xcoff_dwsect_names[i];
4086         break;
4087       }
4088
4089   /* Parse opt-label.  */
4090   if (*input_line_pointer == ',')
4091     {
4092       char *label;
4093       char c;
4094
4095       ++input_line_pointer;
4096
4097       c = get_symbol_name (&label);
4098       opt_label = symbol_find_or_make (label);
4099       (void) restore_line_pointer (c);
4100     }
4101   else
4102     opt_label = NULL;
4103
4104   demand_empty_rest_of_line ();
4105
4106   /* Return now in case of unknown subsection.  */
4107   if (dw == NULL)
4108     {
4109       as_bad (_("no known dwarf XCOFF section for flag 0x%08x\n"),
4110               (unsigned)flag);
4111       return;
4112     }
4113
4114   /* Find the subsection.  */
4115   dws = &dw_sections[i];
4116   subseg = NULL;
4117   if (opt_label != NULL && S_IS_DEFINED (opt_label))
4118     {
4119       /* Sanity check (note that in theory S_GET_SEGMENT mustn't be null).  */
4120       if (dws->sect == NULL || S_GET_SEGMENT (opt_label) != dws->sect)
4121         {
4122           as_bad (_("label %s was not defined in this dwarf section"),
4123                   S_GET_NAME (opt_label));
4124           subseg = dws->anon_subseg;
4125           opt_label = NULL;
4126         }
4127       else
4128         subseg = symbol_get_tc (opt_label)->u.dw;
4129     }
4130
4131   if (subseg != NULL)
4132     {
4133       /* Switch to the subsection.  */
4134       ppc_change_debug_section (i, subseg->subseg);
4135     }
4136   else
4137     {
4138       /* Create a new dw subsection.  */
4139       subseg = XNEW (struct dw_subsection);
4140
4141       if (opt_label == NULL)
4142         {
4143           /* The anonymous one.  */
4144           subseg->subseg = 0;
4145           subseg->link = NULL;
4146           dws->anon_subseg = subseg;
4147         }
4148       else
4149         {
4150           /* A named one.  */
4151           if (dws->list_subseg != NULL)
4152             subseg->subseg = dws->list_subseg->subseg + 1;
4153           else
4154             subseg->subseg = 1;
4155
4156           subseg->link = dws->list_subseg;
4157           dws->list_subseg = subseg;
4158           symbol_get_tc (opt_label)->u.dw = subseg;
4159         }
4160
4161       ppc_change_debug_section (i, subseg->subseg);
4162
4163       if (dw->def_size)
4164         {
4165           /* Add the length field.  */
4166           expressionS *exp = &subseg->end_exp;
4167           int sz;
4168
4169           if (opt_label != NULL)
4170             symbol_set_value_now (opt_label);
4171
4172           /* Add the length field.  Note that according to the AIX assembler
4173              manual, the size of the length field is 4 for powerpc32 but
4174              12 for powerpc64.  */
4175           if (ppc_obj64)
4176             {
4177               /* Write the 64bit marker.  */
4178               md_number_to_chars (frag_more (4), -1, 4);
4179             }
4180
4181           exp->X_op = O_subtract;
4182           exp->X_op_symbol = symbol_temp_new_now ();
4183           exp->X_add_symbol = symbol_temp_make ();
4184
4185           sz = ppc_obj64 ? 8 : 4;
4186           exp->X_add_number = -sz;
4187           emit_expr (exp, sz);
4188         }
4189     }
4190 }
4191
4192 /* This function handles the .text and .data pseudo-ops.  These
4193    pseudo-ops aren't really used by XCOFF; we implement them for the
4194    convenience of people who aren't used to XCOFF.  */
4195
4196 static void
4197 ppc_section (int type)
4198 {
4199   const char *name;
4200   symbolS *sym;
4201
4202   if (type == 't')
4203     name = ".text[PR]";
4204   else if (type == 'd')
4205     name = ".data[RW]";
4206   else
4207     abort ();
4208
4209   sym = symbol_find_or_make (name);
4210
4211   ppc_change_csect (sym, 2);
4212
4213   demand_empty_rest_of_line ();
4214 }
4215
4216 /* This function handles the .section pseudo-op.  This is mostly to
4217    give an error, since XCOFF only supports .text, .data and .bss, but
4218    we do permit the user to name the text or data section.  */
4219
4220 static void
4221 ppc_named_section (int ignore ATTRIBUTE_UNUSED)
4222 {
4223   char *user_name;
4224   const char *real_name;
4225   char c;
4226   symbolS *sym;
4227
4228   c = get_symbol_name (&user_name);
4229
4230   if (strcmp (user_name, ".text") == 0)
4231     real_name = ".text[PR]";
4232   else if (strcmp (user_name, ".data") == 0)
4233     real_name = ".data[RW]";
4234   else
4235     {
4236       as_bad (_("the XCOFF file format does not support arbitrary sections"));
4237       (void) restore_line_pointer (c);
4238       ignore_rest_of_line ();
4239       return;
4240     }
4241
4242   (void) restore_line_pointer (c);
4243
4244   sym = symbol_find_or_make (real_name);
4245
4246   ppc_change_csect (sym, 2);
4247
4248   demand_empty_rest_of_line ();
4249 }
4250
4251 /* The .extern pseudo-op.  We create an undefined symbol.  */
4252
4253 static void
4254 ppc_extern (int ignore ATTRIBUTE_UNUSED)
4255 {
4256   char *name;
4257   char endc;
4258
4259   endc = get_symbol_name (&name);
4260
4261   (void) symbol_find_or_make (name);
4262
4263   (void) restore_line_pointer (endc);
4264
4265   demand_empty_rest_of_line ();
4266 }
4267
4268 /* The .lglobl pseudo-op.  Keep the symbol in the symbol table.  */
4269
4270 static void
4271 ppc_lglobl (int ignore ATTRIBUTE_UNUSED)
4272 {
4273   char *name;
4274   char endc;
4275   symbolS *sym;
4276
4277   endc = get_symbol_name (&name);
4278
4279   sym = symbol_find_or_make (name);
4280
4281   (void) restore_line_pointer (endc);
4282
4283   symbol_get_tc (sym)->output = 1;
4284
4285   demand_empty_rest_of_line ();
4286 }
4287
4288 /* The .ref pseudo-op.  It takes a list of symbol names and inserts R_REF
4289    relocations at the beginning of the current csect.
4290
4291    (In principle, there's no reason why the relocations _have_ to be at
4292    the beginning.  Anywhere in the csect would do.  However, inserting
4293    at the beginning is what the native assembler does, and it helps to
4294    deal with cases where the .ref statements follow the section contents.)
4295
4296    ??? .refs don't work for empty .csects.  However, the native assembler
4297    doesn't report an error in this case, and neither yet do we.  */
4298
4299 static void
4300 ppc_ref (int ignore ATTRIBUTE_UNUSED)
4301 {
4302   char *name;
4303   char c;
4304
4305   if (ppc_current_csect == NULL)
4306     {
4307       as_bad (_(".ref outside .csect"));
4308       ignore_rest_of_line ();
4309       return;
4310     }
4311
4312   do
4313     {
4314       c = get_symbol_name (&name);
4315
4316       fix_at_start (symbol_get_frag (ppc_current_csect), 0,
4317                     symbol_find_or_make (name), 0, FALSE, BFD_RELOC_NONE);
4318
4319       *input_line_pointer = c;
4320       SKIP_WHITESPACE_AFTER_NAME ();
4321       c = *input_line_pointer;
4322       if (c == ',')
4323         {
4324           input_line_pointer++;
4325           SKIP_WHITESPACE ();
4326           if (is_end_of_line[(unsigned char) *input_line_pointer])
4327             {
4328               as_bad (_("missing symbol name"));
4329               ignore_rest_of_line ();
4330               return;
4331             }
4332         }
4333     }
4334   while (c == ',');
4335
4336   demand_empty_rest_of_line ();
4337 }
4338
4339 /* The .rename pseudo-op.  The RS/6000 assembler can rename symbols,
4340    although I don't know why it bothers.  */
4341
4342 static void
4343 ppc_rename (int ignore ATTRIBUTE_UNUSED)
4344 {
4345   char *name;
4346   char endc;
4347   symbolS *sym;
4348   int len;
4349
4350   endc = get_symbol_name (&name);
4351
4352   sym = symbol_find_or_make (name);
4353
4354   (void) restore_line_pointer (endc);
4355
4356   if (*input_line_pointer != ',')
4357     {
4358       as_bad (_("missing rename string"));
4359       ignore_rest_of_line ();
4360       return;
4361     }
4362   ++input_line_pointer;
4363
4364   symbol_get_tc (sym)->real_name = demand_copy_C_string (&len);
4365
4366   demand_empty_rest_of_line ();
4367 }
4368
4369 /* The .stabx pseudo-op.  This is similar to a normal .stabs
4370    pseudo-op, but slightly different.  A sample is
4371        .stabx "main:F-1",.main,142,0
4372    The first argument is the symbol name to create.  The second is the
4373    value, and the third is the storage class.  The fourth seems to be
4374    always zero, and I am assuming it is the type.  */
4375
4376 static void
4377 ppc_stabx (int ignore ATTRIBUTE_UNUSED)
4378 {
4379   char *name;
4380   int len;
4381   symbolS *sym;
4382   expressionS exp;
4383
4384   name = demand_copy_C_string (&len);
4385
4386   if (*input_line_pointer != ',')
4387     {
4388       as_bad (_("missing value"));
4389       return;
4390     }
4391   ++input_line_pointer;
4392
4393   ppc_stab_symbol = TRUE;
4394   sym = symbol_make (name);
4395   ppc_stab_symbol = FALSE;
4396
4397   symbol_get_tc (sym)->real_name = name;
4398
4399   (void) expression (&exp);
4400
4401   switch (exp.X_op)
4402     {
4403     case O_illegal:
4404     case O_absent:
4405     case O_big:
4406       as_bad (_("illegal .stabx expression; zero assumed"));
4407       exp.X_add_number = 0;
4408       /* Fall through.  */
4409     case O_constant:
4410       S_SET_VALUE (sym, (valueT) exp.X_add_number);
4411       symbol_set_frag (sym, &zero_address_frag);
4412       break;
4413
4414     case O_symbol:
4415       if (S_GET_SEGMENT (exp.X_add_symbol) == undefined_section)
4416         symbol_set_value_expression (sym, &exp);
4417       else
4418         {
4419           S_SET_VALUE (sym,
4420                        exp.X_add_number + S_GET_VALUE (exp.X_add_symbol));
4421           symbol_set_frag (sym, symbol_get_frag (exp.X_add_symbol));
4422         }
4423       break;
4424
4425     default:
4426       /* The value is some complex expression.  This will probably
4427          fail at some later point, but this is probably the right
4428          thing to do here.  */
4429       symbol_set_value_expression (sym, &exp);
4430       break;
4431     }
4432
4433   S_SET_SEGMENT (sym, ppc_coff_debug_section);
4434   symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
4435
4436   if (*input_line_pointer != ',')
4437     {
4438       as_bad (_("missing class"));
4439       return;
4440     }
4441   ++input_line_pointer;
4442
4443   S_SET_STORAGE_CLASS (sym, get_absolute_expression ());
4444
4445   if (*input_line_pointer != ',')
4446     {
4447       as_bad (_("missing type"));
4448       return;
4449     }
4450   ++input_line_pointer;
4451
4452   S_SET_DATA_TYPE (sym, get_absolute_expression ());
4453
4454   symbol_get_tc (sym)->output = 1;
4455
4456   if (S_GET_STORAGE_CLASS (sym) == C_STSYM)
4457     {
4458       /* In this case :
4459
4460          .bs name
4461          .stabx "z",arrays_,133,0
4462          .es
4463
4464          .comm arrays_,13768,3
4465
4466          resolve_symbol_value will copy the exp's "within" into sym's when the
4467          offset is 0.  Since this seems to be corner case problem,
4468          only do the correction for storage class C_STSYM.  A better solution
4469          would be to have the tc field updated in ppc_symbol_new_hook.  */
4470
4471       if (exp.X_op == O_symbol)
4472         {
4473           if (ppc_current_block == NULL)
4474             as_bad (_(".stabx of storage class stsym must be within .bs/.es"));
4475
4476           symbol_get_tc (sym)->within = ppc_current_block;
4477           symbol_get_tc (exp.X_add_symbol)->within = ppc_current_block;
4478         }
4479     }
4480
4481   if (exp.X_op != O_symbol
4482       || ! S_IS_EXTERNAL (exp.X_add_symbol)
4483       || S_GET_SEGMENT (exp.X_add_symbol) != bss_section)
4484     ppc_frob_label (sym);
4485   else
4486     {
4487       symbol_remove (sym, &symbol_rootP, &symbol_lastP);
4488       symbol_append (sym, exp.X_add_symbol, &symbol_rootP, &symbol_lastP);
4489       if (symbol_get_tc (ppc_current_csect)->within == exp.X_add_symbol)
4490         symbol_get_tc (ppc_current_csect)->within = sym;
4491     }
4492
4493   demand_empty_rest_of_line ();
4494 }
4495
4496 /* The .function pseudo-op.  This takes several arguments.  The first
4497    argument seems to be the external name of the symbol.  The second
4498    argument seems to be the label for the start of the function.  gcc
4499    uses the same name for both.  I have no idea what the third and
4500    fourth arguments are meant to be.  The optional fifth argument is
4501    an expression for the size of the function.  In COFF this symbol
4502    gets an aux entry like that used for a csect.  */
4503
4504 static void
4505 ppc_function (int ignore ATTRIBUTE_UNUSED)
4506 {
4507   char *name;
4508   char endc;
4509   char *s;
4510   symbolS *ext_sym;
4511   symbolS *lab_sym;
4512
4513   endc = get_symbol_name (&name);
4514
4515   /* Ignore any [PR] suffix.  */
4516   name = ppc_canonicalize_symbol_name (name);
4517   s = strchr (name, '[');
4518   if (s != (char *) NULL
4519       && strcmp (s + 1, "PR]") == 0)
4520     *s = '\0';
4521
4522   ext_sym = symbol_find_or_make (name);
4523
4524   (void) restore_line_pointer (endc);
4525
4526   if (*input_line_pointer != ',')
4527     {
4528       as_bad (_("missing symbol name"));
4529       ignore_rest_of_line ();
4530       return;
4531     }
4532   ++input_line_pointer;
4533
4534   endc = get_symbol_name (&name);
4535
4536   lab_sym = symbol_find_or_make (name);
4537
4538   (void) restore_line_pointer (endc);
4539
4540   if (ext_sym != lab_sym)
4541     {
4542       expressionS exp;
4543
4544       exp.X_op = O_symbol;
4545       exp.X_add_symbol = lab_sym;
4546       exp.X_op_symbol = NULL;
4547       exp.X_add_number = 0;
4548       exp.X_unsigned = 0;
4549       symbol_set_value_expression (ext_sym, &exp);
4550     }
4551
4552   if (symbol_get_tc (ext_sym)->symbol_class == -1)
4553     symbol_get_tc (ext_sym)->symbol_class = XMC_PR;
4554   symbol_get_tc (ext_sym)->output = 1;
4555
4556   if (*input_line_pointer == ',')
4557     {
4558       expressionS exp;
4559
4560       /* Ignore the third argument.  */
4561       ++input_line_pointer;
4562       expression (& exp);
4563       if (*input_line_pointer == ',')
4564         {
4565           /* Ignore the fourth argument.  */
4566           ++input_line_pointer;
4567           expression (& exp);
4568           if (*input_line_pointer == ',')
4569             {
4570               /* The fifth argument is the function size.  */
4571               ++input_line_pointer;
4572               symbol_get_tc (ext_sym)->u.size = symbol_new
4573                 ("L0\001", absolute_section,(valueT) 0, &zero_address_frag);
4574               pseudo_set (symbol_get_tc (ext_sym)->u.size);
4575             }
4576         }
4577     }
4578
4579   S_SET_DATA_TYPE (ext_sym, DT_FCN << N_BTSHFT);
4580   SF_SET_FUNCTION (ext_sym);
4581   SF_SET_PROCESS (ext_sym);
4582   coff_add_linesym (ext_sym);
4583
4584   demand_empty_rest_of_line ();
4585 }
4586
4587 /* The .bf pseudo-op.  This is just like a COFF C_FCN symbol named
4588    ".bf".  If the pseudo op .bi was seen before .bf, patch the .bi sym
4589    with the correct line number */
4590
4591 static symbolS *saved_bi_sym = 0;
4592
4593 static void
4594 ppc_bf (int ignore ATTRIBUTE_UNUSED)
4595 {
4596   symbolS *sym;
4597
4598   sym = symbol_make (".bf");
4599   S_SET_SEGMENT (sym, text_section);
4600   symbol_set_frag (sym, frag_now);
4601   S_SET_VALUE (sym, frag_now_fix ());
4602   S_SET_STORAGE_CLASS (sym, C_FCN);
4603
4604   coff_line_base = get_absolute_expression ();
4605
4606   S_SET_NUMBER_AUXILIARY (sym, 1);
4607   SA_SET_SYM_LNNO (sym, coff_line_base);
4608
4609   /* Line number for bi.  */
4610   if (saved_bi_sym)
4611     {
4612       S_SET_VALUE (saved_bi_sym, coff_n_line_nos);
4613       saved_bi_sym = 0;
4614     }
4615
4616
4617   symbol_get_tc (sym)->output = 1;
4618
4619   ppc_frob_label (sym);
4620
4621   demand_empty_rest_of_line ();
4622 }
4623
4624 /* The .ef pseudo-op.  This is just like a COFF C_FCN symbol named
4625    ".ef", except that the line number is absolute, not relative to the
4626    most recent ".bf" symbol.  */
4627
4628 static void
4629 ppc_ef (int ignore ATTRIBUTE_UNUSED)
4630 {
4631   symbolS *sym;
4632
4633   sym = symbol_make (".ef");
4634   S_SET_SEGMENT (sym, text_section);
4635   symbol_set_frag (sym, frag_now);
4636   S_SET_VALUE (sym, frag_now_fix ());
4637   S_SET_STORAGE_CLASS (sym, C_FCN);
4638   S_SET_NUMBER_AUXILIARY (sym, 1);
4639   SA_SET_SYM_LNNO (sym, get_absolute_expression ());
4640   symbol_get_tc (sym)->output = 1;
4641
4642   ppc_frob_label (sym);
4643
4644   demand_empty_rest_of_line ();
4645 }
4646
4647 /* The .bi and .ei pseudo-ops.  These take a string argument and
4648    generates a C_BINCL or C_EINCL symbol, which goes at the start of
4649    the symbol list.  The value of .bi will be know when the next .bf
4650    is encountered.  */
4651
4652 static void
4653 ppc_biei (int ei)
4654 {
4655   static symbolS *last_biei;
4656
4657   char *name;
4658   int len;
4659   symbolS *sym;
4660   symbolS *look;
4661
4662   name = demand_copy_C_string (&len);
4663
4664   /* The value of these symbols is actually file offset.  Here we set
4665      the value to the index into the line number entries.  In
4666      ppc_frob_symbols we set the fix_line field, which will cause BFD
4667      to do the right thing.  */
4668
4669   sym = symbol_make (name);
4670   /* obj-coff.c currently only handles line numbers correctly in the
4671      .text section.  */
4672   S_SET_SEGMENT (sym, text_section);
4673   S_SET_VALUE (sym, coff_n_line_nos);
4674   symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
4675
4676   S_SET_STORAGE_CLASS (sym, ei ? C_EINCL : C_BINCL);
4677   symbol_get_tc (sym)->output = 1;
4678
4679   /* Save bi.  */
4680   if (ei)
4681     saved_bi_sym = 0;
4682   else
4683     saved_bi_sym = sym;
4684
4685   for (look = last_biei ? last_biei : symbol_rootP;
4686        (look != (symbolS *) NULL
4687         && (S_GET_STORAGE_CLASS (look) == C_FILE
4688             || S_GET_STORAGE_CLASS (look) == C_BINCL
4689             || S_GET_STORAGE_CLASS (look) == C_EINCL));
4690        look = symbol_next (look))
4691     ;
4692   if (look != (symbolS *) NULL)
4693     {
4694       symbol_remove (sym, &symbol_rootP, &symbol_lastP);
4695       symbol_insert (sym, look, &symbol_rootP, &symbol_lastP);
4696       last_biei = sym;
4697     }
4698
4699   demand_empty_rest_of_line ();
4700 }
4701
4702 /* The .bs pseudo-op.  This generates a C_BSTAT symbol named ".bs".
4703    There is one argument, which is a csect symbol.  The value of the
4704    .bs symbol is the index of this csect symbol.  */
4705
4706 static void
4707 ppc_bs (int ignore ATTRIBUTE_UNUSED)
4708 {
4709   char *name;
4710   char endc;
4711   symbolS *csect;
4712   symbolS *sym;
4713
4714   if (ppc_current_block != NULL)
4715     as_bad (_("nested .bs blocks"));
4716
4717   endc = get_symbol_name (&name);
4718
4719   csect = symbol_find_or_make (name);
4720
4721   (void) restore_line_pointer (endc);
4722
4723   sym = symbol_make (".bs");
4724   S_SET_SEGMENT (sym, now_seg);
4725   S_SET_STORAGE_CLASS (sym, C_BSTAT);
4726   symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
4727   symbol_get_tc (sym)->output = 1;
4728
4729   symbol_get_tc (sym)->within = csect;
4730
4731   ppc_frob_label (sym);
4732
4733   ppc_current_block = sym;
4734
4735   demand_empty_rest_of_line ();
4736 }
4737
4738 /* The .es pseudo-op.  Generate a C_ESTART symbol named .es.  */
4739
4740 static void
4741 ppc_es (int ignore ATTRIBUTE_UNUSED)
4742 {
4743   symbolS *sym;
4744
4745   if (ppc_current_block == NULL)
4746     as_bad (_(".es without preceding .bs"));
4747
4748   sym = symbol_make (".es");
4749   S_SET_SEGMENT (sym, now_seg);
4750   S_SET_STORAGE_CLASS (sym, C_ESTAT);
4751   symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
4752   symbol_get_tc (sym)->output = 1;
4753
4754   ppc_frob_label (sym);
4755
4756   ppc_current_block = NULL;
4757
4758   demand_empty_rest_of_line ();
4759 }
4760
4761 /* The .bb pseudo-op.  Generate a C_BLOCK symbol named .bb, with a
4762    line number.  */
4763
4764 static void
4765 ppc_bb (int ignore ATTRIBUTE_UNUSED)
4766 {
4767   symbolS *sym;
4768
4769   sym = symbol_make (".bb");
4770   S_SET_SEGMENT (sym, text_section);
4771   symbol_set_frag (sym, frag_now);
4772   S_SET_VALUE (sym, frag_now_fix ());
4773   S_SET_STORAGE_CLASS (sym, C_BLOCK);
4774
4775   S_SET_NUMBER_AUXILIARY (sym, 1);
4776   SA_SET_SYM_LNNO (sym, get_absolute_expression ());
4777
4778   symbol_get_tc (sym)->output = 1;
4779
4780   SF_SET_PROCESS (sym);
4781
4782   ppc_frob_label (sym);
4783
4784   demand_empty_rest_of_line ();
4785 }
4786
4787 /* The .eb pseudo-op.  Generate a C_BLOCK symbol named .eb, with a
4788    line number.  */
4789
4790 static void
4791 ppc_eb (int ignore ATTRIBUTE_UNUSED)
4792 {
4793   symbolS *sym;
4794
4795   sym = symbol_make (".eb");
4796   S_SET_SEGMENT (sym, text_section);
4797   symbol_set_frag (sym, frag_now);
4798   S_SET_VALUE (sym, frag_now_fix ());
4799   S_SET_STORAGE_CLASS (sym, C_BLOCK);
4800   S_SET_NUMBER_AUXILIARY (sym, 1);
4801   SA_SET_SYM_LNNO (sym, get_absolute_expression ());
4802   symbol_get_tc (sym)->output = 1;
4803
4804   SF_SET_PROCESS (sym);
4805
4806   ppc_frob_label (sym);
4807
4808   demand_empty_rest_of_line ();
4809 }
4810
4811 /* The .bc pseudo-op.  This just creates a C_BCOMM symbol with a
4812    specified name.  */
4813
4814 static void
4815 ppc_bc (int ignore ATTRIBUTE_UNUSED)
4816 {
4817   char *name;
4818   int len;
4819   symbolS *sym;
4820
4821   name = demand_copy_C_string (&len);
4822   sym = symbol_make (name);
4823   S_SET_SEGMENT (sym, ppc_coff_debug_section);
4824   symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
4825   S_SET_STORAGE_CLASS (sym, C_BCOMM);
4826   S_SET_VALUE (sym, 0);
4827   symbol_get_tc (sym)->output = 1;
4828
4829   ppc_frob_label (sym);
4830
4831   demand_empty_rest_of_line ();
4832 }
4833
4834 /* The .ec pseudo-op.  This just creates a C_ECOMM symbol.  */
4835
4836 static void
4837 ppc_ec (int ignore ATTRIBUTE_UNUSED)
4838 {
4839   symbolS *sym;
4840
4841   sym = symbol_make (".ec");
4842   S_SET_SEGMENT (sym, ppc_coff_debug_section);
4843   symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
4844   S_SET_STORAGE_CLASS (sym, C_ECOMM);
4845   S_SET_VALUE (sym, 0);
4846   symbol_get_tc (sym)->output = 1;
4847
4848   ppc_frob_label (sym);
4849
4850   demand_empty_rest_of_line ();
4851 }
4852
4853 /* The .toc pseudo-op.  Switch to the .toc subsegment.  */
4854
4855 static void
4856 ppc_toc (int ignore ATTRIBUTE_UNUSED)
4857 {
4858   if (ppc_toc_csect != (symbolS *) NULL)
4859     subseg_set (data_section, symbol_get_tc (ppc_toc_csect)->subseg);
4860   else
4861     {
4862       subsegT subseg;
4863       symbolS *sym;
4864       symbolS *list;
4865
4866       subseg = ppc_data_subsegment;
4867       ++ppc_data_subsegment;
4868
4869       subseg_new (segment_name (data_section), subseg);
4870       ppc_toc_frag = frag_now;
4871
4872       sym = symbol_find_or_make ("TOC[TC0]");
4873       symbol_set_frag (sym, frag_now);
4874       S_SET_SEGMENT (sym, data_section);
4875       S_SET_VALUE (sym, (valueT) frag_now_fix ());
4876       symbol_get_tc (sym)->subseg = subseg;
4877       symbol_get_tc (sym)->output = 1;
4878       symbol_get_tc (sym)->within = sym;
4879
4880       ppc_toc_csect = sym;
4881
4882       for (list = ppc_data_csects;
4883            symbol_get_tc (list)->next != (symbolS *) NULL;
4884            list = symbol_get_tc (list)->next)
4885         ;
4886       symbol_get_tc (list)->next = sym;
4887
4888       symbol_remove (sym, &symbol_rootP, &symbol_lastP);
4889       symbol_append (sym, symbol_get_tc (list)->within, &symbol_rootP,
4890                      &symbol_lastP);
4891     }
4892
4893   ppc_current_csect = ppc_toc_csect;
4894
4895   demand_empty_rest_of_line ();
4896 }
4897
4898 /* The AIX assembler automatically aligns the operands of a .long or
4899    .short pseudo-op, and we want to be compatible.  */
4900
4901 static void
4902 ppc_xcoff_cons (int log_size)
4903 {
4904   frag_align (log_size, 0, 0);
4905   record_alignment (now_seg, log_size);
4906   cons (1 << log_size);
4907 }
4908
4909 static void
4910 ppc_vbyte (int dummy ATTRIBUTE_UNUSED)
4911 {
4912   expressionS exp;
4913   int byte_count;
4914
4915   (void) expression (&exp);
4916
4917   if (exp.X_op != O_constant)
4918     {
4919       as_bad (_("non-constant byte count"));
4920       return;
4921     }
4922
4923   byte_count = exp.X_add_number;
4924
4925   if (*input_line_pointer != ',')
4926     {
4927       as_bad (_("missing value"));
4928       return;
4929     }
4930
4931   ++input_line_pointer;
4932   cons (byte_count);
4933 }
4934
4935 void
4936 ppc_xcoff_end (void)
4937 {
4938   int i;
4939
4940   for (i = 0; i < XCOFF_DWSECT_NBR_NAMES; i++)
4941     {
4942       struct dw_section *dws = &dw_sections[i];
4943       struct dw_subsection *dwss;
4944
4945       if (dws->anon_subseg)
4946         {
4947           dwss = dws->anon_subseg;
4948           dwss->link = dws->list_subseg;
4949         }
4950       else
4951         dwss = dws->list_subseg;
4952
4953       for (; dwss != NULL; dwss = dwss->link)
4954         if (dwss->end_exp.X_add_symbol != NULL)
4955           {
4956             subseg_set (dws->sect, dwss->subseg);
4957             symbol_set_value_now (dwss->end_exp.X_add_symbol);
4958           }
4959     }
4960 }
4961
4962 #endif /* OBJ_XCOFF */
4963 #if defined (OBJ_XCOFF) || defined (OBJ_ELF)
4964 \f
4965 /* The .tc pseudo-op.  This is used when generating either XCOFF or
4966    ELF.  This takes two or more arguments.
4967
4968    When generating XCOFF output, the first argument is the name to
4969    give to this location in the toc; this will be a symbol with class
4970    TC.  The rest of the arguments are N-byte values to actually put at
4971    this location in the TOC; often there is just one more argument, a
4972    relocatable symbol reference.  The size of the value to store
4973    depends on target word size.  A 32-bit target uses 4-byte values, a
4974    64-bit target uses 8-byte values.
4975
4976    When not generating XCOFF output, the arguments are the same, but
4977    the first argument is simply ignored.  */
4978
4979 static void
4980 ppc_tc (int ignore ATTRIBUTE_UNUSED)
4981 {
4982 #ifdef OBJ_XCOFF
4983
4984   /* Define the TOC symbol name.  */
4985   {
4986     char *name;
4987     char endc;
4988     symbolS *sym;
4989
4990     if (ppc_toc_csect == (symbolS *) NULL
4991         || ppc_toc_csect != ppc_current_csect)
4992       {
4993         as_bad (_(".tc not in .toc section"));
4994         ignore_rest_of_line ();
4995         return;
4996       }
4997
4998     endc = get_symbol_name (&name);
4999
5000     sym = symbol_find_or_make (name);
5001
5002     (void) restore_line_pointer (endc);
5003
5004     if (S_IS_DEFINED (sym))
5005       {
5006         symbolS *label;
5007
5008         label = symbol_get_tc (ppc_current_csect)->within;
5009         if (symbol_get_tc (label)->symbol_class != XMC_TC0)
5010           {
5011             as_bad (_(".tc with no label"));
5012             ignore_rest_of_line ();
5013             return;
5014           }
5015
5016         S_SET_SEGMENT (label, S_GET_SEGMENT (sym));
5017         symbol_set_frag (label, symbol_get_frag (sym));
5018         S_SET_VALUE (label, S_GET_VALUE (sym));
5019
5020         while (! is_end_of_line[(unsigned char) *input_line_pointer])
5021           ++input_line_pointer;
5022
5023         return;
5024       }
5025
5026     S_SET_SEGMENT (sym, now_seg);
5027     symbol_set_frag (sym, frag_now);
5028     S_SET_VALUE (sym, (valueT) frag_now_fix ());
5029     symbol_get_tc (sym)->symbol_class = XMC_TC;
5030     symbol_get_tc (sym)->output = 1;
5031
5032     ppc_frob_label (sym);
5033   }
5034
5035 #endif /* OBJ_XCOFF */
5036 #ifdef OBJ_ELF
5037   int align;
5038
5039   /* Skip the TOC symbol name.  */
5040   while (is_part_of_name (*input_line_pointer)
5041          || *input_line_pointer == ' '
5042          || *input_line_pointer == '['
5043          || *input_line_pointer == ']'
5044          || *input_line_pointer == '{'
5045          || *input_line_pointer == '}')
5046     ++input_line_pointer;
5047
5048   /* Align to a four/eight byte boundary.  */
5049   align = ppc_obj64 ? 3 : 2;
5050   frag_align (align, 0, 0);
5051   record_alignment (now_seg, align);
5052 #endif /* OBJ_ELF */
5053
5054   if (*input_line_pointer != ',')
5055     demand_empty_rest_of_line ();
5056   else
5057     {
5058       ++input_line_pointer;
5059       cons (ppc_obj64 ? 8 : 4);
5060     }
5061 }
5062
5063 /* Pseudo-op .machine.  */
5064
5065 static void
5066 ppc_machine (int ignore ATTRIBUTE_UNUSED)
5067 {
5068   char c;
5069   char *cpu_string;
5070 #define MAX_HISTORY 100
5071   static ppc_cpu_t *cpu_history;
5072   static int curr_hist;
5073
5074   SKIP_WHITESPACE ();
5075
5076   c = get_symbol_name (&cpu_string);
5077   cpu_string = xstrdup (cpu_string);
5078   (void) restore_line_pointer (c);
5079
5080   if (cpu_string != NULL)
5081     {
5082       ppc_cpu_t old_cpu = ppc_cpu;
5083       ppc_cpu_t new_cpu;
5084       char *p;
5085
5086       for (p = cpu_string; *p != 0; p++)
5087         *p = TOLOWER (*p);
5088
5089       if (strcmp (cpu_string, "push") == 0)
5090         {
5091           if (cpu_history == NULL)
5092             cpu_history = XNEWVEC (ppc_cpu_t, MAX_HISTORY);
5093
5094           if (curr_hist >= MAX_HISTORY)
5095             as_bad (_(".machine stack overflow"));
5096           else
5097             cpu_history[curr_hist++] = ppc_cpu;
5098         }
5099       else if (strcmp (cpu_string, "pop") == 0)
5100         {
5101           if (curr_hist <= 0)
5102             as_bad (_(".machine stack underflow"));
5103           else
5104             ppc_cpu = cpu_history[--curr_hist];
5105         }
5106       else if ((new_cpu = ppc_parse_cpu (ppc_cpu, &sticky, cpu_string)) != 0)
5107         ppc_cpu = new_cpu;
5108       else
5109         as_bad (_("invalid machine `%s'"), cpu_string);
5110
5111       if (ppc_cpu != old_cpu)
5112         ppc_setup_opcodes ();
5113     }
5114
5115   demand_empty_rest_of_line ();
5116 }
5117 #endif /* defined (OBJ_XCOFF) || defined (OBJ_ELF) */
5118 \f
5119 #ifdef TE_PE
5120
5121 /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format.  */
5122
5123 /* Set the current section.  */
5124 static void
5125 ppc_set_current_section (segT new)
5126 {
5127   ppc_previous_section = ppc_current_section;
5128   ppc_current_section = new;
5129 }
5130
5131 /* pseudo-op: .previous
5132    behaviour: toggles the current section with the previous section.
5133    errors:    None
5134    warnings:  "No previous section"  */
5135
5136 static void
5137 ppc_previous (int ignore ATTRIBUTE_UNUSED)
5138 {
5139   if (ppc_previous_section == NULL)
5140     {
5141       as_warn (_("no previous section to return to, ignored."));
5142       return;
5143     }
5144
5145   subseg_set (ppc_previous_section, 0);
5146
5147   ppc_set_current_section (ppc_previous_section);
5148 }
5149
5150 /* pseudo-op: .pdata
5151    behaviour: predefined read only data section
5152               double word aligned
5153    errors:    None
5154    warnings:  None
5155    initial:   .section .pdata "adr3"
5156               a - don't know -- maybe a misprint
5157               d - initialized data
5158               r - readable
5159               3 - double word aligned (that would be 4 byte boundary)
5160
5161    commentary:
5162    Tag index tables (also known as the function table) for exception
5163    handling, debugging, etc.  */
5164
5165 static void
5166 ppc_pdata (int ignore ATTRIBUTE_UNUSED)
5167 {
5168   if (pdata_section == 0)
5169     {
5170       pdata_section = subseg_new (".pdata", 0);
5171
5172       bfd_set_section_flags (stdoutput, pdata_section,
5173                              (SEC_ALLOC | SEC_LOAD | SEC_RELOC
5174                               | SEC_READONLY | SEC_DATA ));
5175
5176       bfd_set_section_alignment (stdoutput, pdata_section, 2);
5177     }
5178   else
5179     {
5180       pdata_section = subseg_new (".pdata", 0);
5181     }
5182   ppc_set_current_section (pdata_section);
5183 }
5184
5185 /* pseudo-op: .ydata
5186    behaviour: predefined read only data section
5187               double word aligned
5188    errors:    None
5189    warnings:  None
5190    initial:   .section .ydata "drw3"
5191               a - don't know -- maybe a misprint
5192               d - initialized data
5193               r - readable
5194               3 - double word aligned (that would be 4 byte boundary)
5195    commentary:
5196    Tag tables (also known as the scope table) for exception handling,
5197    debugging, etc.  */
5198
5199 static void
5200 ppc_ydata (int ignore ATTRIBUTE_UNUSED)
5201 {
5202   if (ydata_section == 0)
5203     {
5204       ydata_section = subseg_new (".ydata", 0);
5205       bfd_set_section_flags (stdoutput, ydata_section,
5206                              (SEC_ALLOC | SEC_LOAD | SEC_RELOC
5207                               | SEC_READONLY | SEC_DATA ));
5208
5209       bfd_set_section_alignment (stdoutput, ydata_section, 3);
5210     }
5211   else
5212     {
5213       ydata_section = subseg_new (".ydata", 0);
5214     }
5215   ppc_set_current_section (ydata_section);
5216 }
5217
5218 /* pseudo-op: .reldata
5219    behaviour: predefined read write data section
5220               double word aligned (4-byte)
5221               FIXME: relocation is applied to it
5222               FIXME: what's the difference between this and .data?
5223    errors:    None
5224    warnings:  None
5225    initial:   .section .reldata "drw3"
5226               d - initialized data
5227               r - readable
5228               w - writable
5229               3 - double word aligned (that would be 8 byte boundary)
5230
5231    commentary:
5232    Like .data, but intended to hold data subject to relocation, such as
5233    function descriptors, etc.  */
5234
5235 static void
5236 ppc_reldata (int ignore ATTRIBUTE_UNUSED)
5237 {
5238   if (reldata_section == 0)
5239     {
5240       reldata_section = subseg_new (".reldata", 0);
5241
5242       bfd_set_section_flags (stdoutput, reldata_section,
5243                              (SEC_ALLOC | SEC_LOAD | SEC_RELOC
5244                               | SEC_DATA));
5245
5246       bfd_set_section_alignment (stdoutput, reldata_section, 2);
5247     }
5248   else
5249     {
5250       reldata_section = subseg_new (".reldata", 0);
5251     }
5252   ppc_set_current_section (reldata_section);
5253 }
5254
5255 /* pseudo-op: .rdata
5256    behaviour: predefined read only data section
5257               double word aligned
5258    errors:    None
5259    warnings:  None
5260    initial:   .section .rdata "dr3"
5261               d - initialized data
5262               r - readable
5263               3 - double word aligned (that would be 4 byte boundary)  */
5264
5265 static void
5266 ppc_rdata (int ignore ATTRIBUTE_UNUSED)
5267 {
5268   if (rdata_section == 0)
5269     {
5270       rdata_section = subseg_new (".rdata", 0);
5271       bfd_set_section_flags (stdoutput, rdata_section,
5272                              (SEC_ALLOC | SEC_LOAD | SEC_RELOC
5273                               | SEC_READONLY | SEC_DATA ));
5274
5275       bfd_set_section_alignment (stdoutput, rdata_section, 2);
5276     }
5277   else
5278     {
5279       rdata_section = subseg_new (".rdata", 0);
5280     }
5281   ppc_set_current_section (rdata_section);
5282 }
5283
5284 /* pseudo-op: .ualong
5285    behaviour: much like .int, with the exception that no alignment is
5286               performed.
5287               FIXME: test the alignment statement
5288    errors:    None
5289    warnings:  None  */
5290
5291 static void
5292 ppc_ualong (int ignore ATTRIBUTE_UNUSED)
5293 {
5294   /* Try for long.  */
5295   cons (4);
5296 }
5297
5298 /* pseudo-op: .znop  <symbol name>
5299    behaviour: Issue a nop instruction
5300               Issue a IMAGE_REL_PPC_IFGLUE relocation against it, using
5301               the supplied symbol name.
5302    errors:    None
5303    warnings:  Missing symbol name  */
5304
5305 static void
5306 ppc_znop (int ignore ATTRIBUTE_UNUSED)
5307 {
5308   unsigned long insn;
5309   const struct powerpc_opcode *opcode;
5310   char *f;
5311   symbolS *sym;
5312   char *symbol_name;
5313   char c;
5314   char *name;
5315
5316   /* Strip out the symbol name.  */
5317   c = get_symbol_name (&symbol_name);
5318
5319   name = xstrdup (symbol_name);
5320
5321   sym = symbol_find_or_make (name);
5322
5323   *input_line_pointer = c;
5324
5325   SKIP_WHITESPACE_AFTER_NAME ();
5326
5327   /* Look up the opcode in the hash table.  */
5328   opcode = (const struct powerpc_opcode *) hash_find (ppc_hash, "nop");
5329
5330   /* Stick in the nop.  */
5331   insn = opcode->opcode;
5332
5333   /* Write out the instruction.  */
5334   f = frag_more (4);
5335   md_number_to_chars (f, insn, 4);
5336   fix_new (frag_now,
5337            f - frag_now->fr_literal,
5338            4,
5339            sym,
5340            0,
5341            0,
5342            BFD_RELOC_16_GOT_PCREL);
5343
5344 }
5345
5346 /* pseudo-op:
5347    behaviour:
5348    errors:
5349    warnings:  */
5350
5351 static void
5352 ppc_pe_comm (int lcomm)
5353 {
5354   char *name;
5355   char c;
5356   char *p;
5357   offsetT temp;
5358   symbolS *symbolP;
5359   offsetT align;
5360
5361   c = get_symbol_name (&name);
5362
5363   /* just after name is now '\0'.  */
5364   p = input_line_pointer;
5365   *p = c;
5366   SKIP_WHITESPACE_AFTER_NAME ();
5367   if (*input_line_pointer != ',')
5368     {
5369       as_bad (_("expected comma after symbol-name: rest of line ignored."));
5370       ignore_rest_of_line ();
5371       return;
5372     }
5373
5374   input_line_pointer++;         /* skip ',' */
5375   if ((temp = get_absolute_expression ()) < 0)
5376     {
5377       as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) temp);
5378       ignore_rest_of_line ();
5379       return;
5380     }
5381
5382   if (! lcomm)
5383     {
5384       /* The third argument to .comm is the alignment.  */
5385       if (*input_line_pointer != ',')
5386         align = 3;
5387       else
5388         {
5389           ++input_line_pointer;
5390           align = get_absolute_expression ();
5391           if (align <= 0)
5392             {
5393               as_warn (_("ignoring bad alignment"));
5394               align = 3;
5395             }
5396         }
5397     }
5398
5399   *p = 0;
5400   symbolP = symbol_find_or_make (name);
5401
5402   *p = c;
5403   if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
5404     {
5405       as_bad (_("ignoring attempt to re-define symbol `%s'."),
5406               S_GET_NAME (symbolP));
5407       ignore_rest_of_line ();
5408       return;
5409     }
5410
5411   if (S_GET_VALUE (symbolP))
5412     {
5413       if (S_GET_VALUE (symbolP) != (valueT) temp)
5414         as_bad (_("length of .comm \"%s\" is already %ld. Not changed to %ld."),
5415                 S_GET_NAME (symbolP),
5416                 (long) S_GET_VALUE (symbolP),
5417                 (long) temp);
5418     }
5419   else
5420     {
5421       S_SET_VALUE (symbolP, (valueT) temp);
5422       S_SET_EXTERNAL (symbolP);
5423       S_SET_SEGMENT (symbolP, bfd_com_section_ptr);
5424     }
5425
5426   demand_empty_rest_of_line ();
5427 }
5428
5429 /*
5430  * implement the .section pseudo op:
5431  *      .section name {, "flags"}
5432  *                ^         ^
5433  *                |         +--- optional flags: 'b' for bss
5434  *                |                              'i' for info
5435  *                +-- section name               'l' for lib
5436  *                                               'n' for noload
5437  *                                               'o' for over
5438  *                                               'w' for data
5439  *                                               'd' (apparently m88k for data)
5440  *                                               'x' for text
5441  * But if the argument is not a quoted string, treat it as a
5442  * subsegment number.
5443  *
5444  * FIXME: this is a copy of the section processing from obj-coff.c, with
5445  * additions/changes for the moto-pas assembler support. There are three
5446  * categories:
5447  *
5448  * FIXME: I just noticed this. This doesn't work at all really. It it
5449  *        setting bits that bfd probably neither understands or uses. The
5450  *        correct approach (?) will have to incorporate extra fields attached
5451  *        to the section to hold the system specific stuff. (krk)
5452  *
5453  * Section Contents:
5454  * 'a' - unknown - referred to in documentation, but no definition supplied
5455  * 'c' - section has code
5456  * 'd' - section has initialized data
5457  * 'u' - section has uninitialized data
5458  * 'i' - section contains directives (info)
5459  * 'n' - section can be discarded
5460  * 'R' - remove section at link time
5461  *
5462  * Section Protection:
5463  * 'r' - section is readable
5464  * 'w' - section is writable
5465  * 'x' - section is executable
5466  * 's' - section is sharable
5467  *
5468  * Section Alignment:
5469  * '0' - align to byte boundary
5470  * '1' - align to halfword boundary
5471  * '2' - align to word boundary
5472  * '3' - align to doubleword boundary
5473  * '4' - align to quadword boundary
5474  * '5' - align to 32 byte boundary
5475  * '6' - align to 64 byte boundary
5476  *
5477  */
5478
5479 void
5480 ppc_pe_section (int ignore ATTRIBUTE_UNUSED)
5481 {
5482   /* Strip out the section name.  */
5483   char *section_name;
5484   char c;
5485   char *name;
5486   unsigned int exp;
5487   flagword flags;
5488   segT sec;
5489   int align;
5490
5491   c = get_symbol_name (&section_name);
5492
5493   name = xstrdup (section_name);
5494
5495   *input_line_pointer = c;
5496
5497   SKIP_WHITESPACE_AFTER_NAME ();
5498
5499   exp = 0;
5500   flags = SEC_NO_FLAGS;
5501
5502   if (strcmp (name, ".idata$2") == 0)
5503     {
5504       align = 0;
5505     }
5506   else if (strcmp (name, ".idata$3") == 0)
5507     {
5508       align = 0;
5509     }
5510   else if (strcmp (name, ".idata$4") == 0)
5511     {
5512       align = 2;
5513     }
5514   else if (strcmp (name, ".idata$5") == 0)
5515     {
5516       align = 2;
5517     }
5518   else if (strcmp (name, ".idata$6") == 0)
5519     {
5520       align = 1;
5521     }
5522   else
5523     /* Default alignment to 16 byte boundary.  */
5524     align = 4;
5525
5526   if (*input_line_pointer == ',')
5527     {
5528       ++input_line_pointer;
5529       SKIP_WHITESPACE ();
5530       if (*input_line_pointer != '"')
5531         exp = get_absolute_expression ();
5532       else
5533         {
5534           ++input_line_pointer;
5535           while (*input_line_pointer != '"'
5536                  && ! is_end_of_line[(unsigned char) *input_line_pointer])
5537             {
5538               switch (*input_line_pointer)
5539                 {
5540                   /* Section Contents */
5541                 case 'a': /* unknown */
5542                   as_bad (_("unsupported section attribute -- 'a'"));
5543                   break;
5544                 case 'c': /* code section */
5545                   flags |= SEC_CODE;
5546                   break;
5547                 case 'd': /* section has initialized data */
5548                   flags |= SEC_DATA;
5549                   break;
5550                 case 'u': /* section has uninitialized data */
5551                   /* FIXME: This is IMAGE_SCN_CNT_UNINITIALIZED_DATA
5552                      in winnt.h */
5553                   flags |= SEC_ROM;
5554                   break;
5555                 case 'i': /* section contains directives (info) */
5556                   /* FIXME: This is IMAGE_SCN_LNK_INFO
5557                      in winnt.h */
5558                   flags |= SEC_HAS_CONTENTS;
5559                   break;
5560                 case 'n': /* section can be discarded */
5561                   flags &=~ SEC_LOAD;
5562                   break;
5563                 case 'R': /* Remove section at link time */
5564                   flags |= SEC_NEVER_LOAD;
5565                   break;
5566 #if IFLICT_BRAIN_DAMAGE
5567                   /* Section Protection */
5568                 case 'r': /* section is readable */
5569                   flags |= IMAGE_SCN_MEM_READ;
5570                   break;
5571                 case 'w': /* section is writable */
5572                   flags |= IMAGE_SCN_MEM_WRITE;
5573                   break;
5574                 case 'x': /* section is executable */
5575                   flags |= IMAGE_SCN_MEM_EXECUTE;
5576                   break;
5577                 case 's': /* section is sharable */
5578                   flags |= IMAGE_SCN_MEM_SHARED;
5579                   break;
5580
5581                   /* Section Alignment */
5582                 case '0': /* align to byte boundary */
5583                   flags |= IMAGE_SCN_ALIGN_1BYTES;
5584                   align = 0;
5585                   break;
5586                 case '1':  /* align to halfword boundary */
5587                   flags |= IMAGE_SCN_ALIGN_2BYTES;
5588                   align = 1;
5589                   break;
5590                 case '2':  /* align to word boundary */
5591                   flags |= IMAGE_SCN_ALIGN_4BYTES;
5592                   align = 2;
5593                   break;
5594                 case '3':  /* align to doubleword boundary */
5595                   flags |= IMAGE_SCN_ALIGN_8BYTES;
5596                   align = 3;
5597                   break;
5598                 case '4':  /* align to quadword boundary */
5599                   flags |= IMAGE_SCN_ALIGN_16BYTES;
5600                   align = 4;
5601                   break;
5602                 case '5':  /* align to 32 byte boundary */
5603                   flags |= IMAGE_SCN_ALIGN_32BYTES;
5604                   align = 5;
5605                   break;
5606                 case '6':  /* align to 64 byte boundary */
5607                   flags |= IMAGE_SCN_ALIGN_64BYTES;
5608                   align = 6;
5609                   break;
5610 #endif
5611                 default:
5612                   as_bad (_("unknown section attribute '%c'"),
5613                           *input_line_pointer);
5614                   break;
5615                 }
5616               ++input_line_pointer;
5617             }
5618           if (*input_line_pointer == '"')
5619             ++input_line_pointer;
5620         }
5621     }
5622
5623   sec = subseg_new (name, (subsegT) exp);
5624
5625   ppc_set_current_section (sec);
5626
5627   if (flags != SEC_NO_FLAGS)
5628     {
5629       if (! bfd_set_section_flags (stdoutput, sec, flags))
5630         as_bad (_("error setting flags for \"%s\": %s"),
5631                 bfd_section_name (stdoutput, sec),
5632                 bfd_errmsg (bfd_get_error ()));
5633     }
5634
5635   bfd_set_section_alignment (stdoutput, sec, align);
5636 }
5637
5638 static void
5639 ppc_pe_function (int ignore ATTRIBUTE_UNUSED)
5640 {
5641   char *name;
5642   char endc;
5643   symbolS *ext_sym;
5644
5645   endc = get_symbol_name (&name);
5646
5647   ext_sym = symbol_find_or_make (name);
5648
5649   (void) restore_line_pointer (endc);
5650
5651   S_SET_DATA_TYPE (ext_sym, DT_FCN << N_BTSHFT);
5652   SF_SET_FUNCTION (ext_sym);
5653   SF_SET_PROCESS (ext_sym);
5654   coff_add_linesym (ext_sym);
5655
5656   demand_empty_rest_of_line ();
5657 }
5658
5659 static void
5660 ppc_pe_tocd (int ignore ATTRIBUTE_UNUSED)
5661 {
5662   if (tocdata_section == 0)
5663     {
5664       tocdata_section = subseg_new (".tocd", 0);
5665       /* FIXME: section flags won't work.  */
5666       bfd_set_section_flags (stdoutput, tocdata_section,
5667                              (SEC_ALLOC | SEC_LOAD | SEC_RELOC
5668                               | SEC_READONLY | SEC_DATA));
5669
5670       bfd_set_section_alignment (stdoutput, tocdata_section, 2);
5671     }
5672   else
5673     {
5674       rdata_section = subseg_new (".tocd", 0);
5675     }
5676
5677   ppc_set_current_section (tocdata_section);
5678
5679   demand_empty_rest_of_line ();
5680 }
5681
5682 /* Don't adjust TOC relocs to use the section symbol.  */
5683
5684 int
5685 ppc_pe_fix_adjustable (fixS *fix)
5686 {
5687   return fix->fx_r_type != BFD_RELOC_PPC_TOC16;
5688 }
5689
5690 #endif
5691 \f
5692 #ifdef OBJ_XCOFF
5693
5694 /* XCOFF specific symbol and file handling.  */
5695
5696 /* Canonicalize the symbol name.  We use the to force the suffix, if
5697    any, to use square brackets, and to be in upper case.  */
5698
5699 char *
5700 ppc_canonicalize_symbol_name (char *name)
5701 {
5702   char *s;
5703
5704   if (ppc_stab_symbol)
5705     return name;
5706
5707   for (s = name; *s != '\0' && *s != '{' && *s != '['; s++)
5708     ;
5709   if (*s != '\0')
5710     {
5711       char brac;
5712
5713       if (*s == '[')
5714         brac = ']';
5715       else
5716         {
5717           *s = '[';
5718           brac = '}';
5719         }
5720
5721       for (s++; *s != '\0' && *s != brac; s++)
5722         *s = TOUPPER (*s);
5723
5724       if (*s == '\0' || s[1] != '\0')
5725         as_bad (_("bad symbol suffix"));
5726
5727       *s = ']';
5728     }
5729
5730   return name;
5731 }
5732
5733 /* Set the class of a symbol based on the suffix, if any.  This is
5734    called whenever a new symbol is created.  */
5735
5736 void
5737 ppc_symbol_new_hook (symbolS *sym)
5738 {
5739   struct ppc_tc_sy *tc;
5740   const char *s;
5741
5742   tc = symbol_get_tc (sym);
5743   tc->next = NULL;
5744   tc->output = 0;
5745   tc->symbol_class = -1;
5746   tc->real_name = NULL;
5747   tc->subseg = 0;
5748   tc->align = 0;
5749   tc->u.size = NULL;
5750   tc->u.dw = NULL;
5751   tc->within = NULL;
5752
5753   if (ppc_stab_symbol)
5754     return;
5755
5756   s = strchr (S_GET_NAME (sym), '[');
5757   if (s == (const char *) NULL)
5758     {
5759       /* There is no suffix.  */
5760       return;
5761     }
5762
5763   ++s;
5764
5765   switch (s[0])
5766     {
5767     case 'B':
5768       if (strcmp (s, "BS]") == 0)
5769         tc->symbol_class = XMC_BS;
5770       break;
5771     case 'D':
5772       if (strcmp (s, "DB]") == 0)
5773         tc->symbol_class = XMC_DB;
5774       else if (strcmp (s, "DS]") == 0)
5775         tc->symbol_class = XMC_DS;
5776       break;
5777     case 'G':
5778       if (strcmp (s, "GL]") == 0)
5779         tc->symbol_class = XMC_GL;
5780       break;
5781     case 'P':
5782       if (strcmp (s, "PR]") == 0)
5783         tc->symbol_class = XMC_PR;
5784       break;
5785     case 'R':
5786       if (strcmp (s, "RO]") == 0)
5787         tc->symbol_class = XMC_RO;
5788       else if (strcmp (s, "RW]") == 0)
5789         tc->symbol_class = XMC_RW;
5790       break;
5791     case 'S':
5792       if (strcmp (s, "SV]") == 0)
5793         tc->symbol_class = XMC_SV;
5794       break;
5795     case 'T':
5796       if (strcmp (s, "TC]") == 0)
5797         tc->symbol_class = XMC_TC;
5798       else if (strcmp (s, "TI]") == 0)
5799         tc->symbol_class = XMC_TI;
5800       else if (strcmp (s, "TB]") == 0)
5801         tc->symbol_class = XMC_TB;
5802       else if (strcmp (s, "TC0]") == 0 || strcmp (s, "T0]") == 0)
5803         tc->symbol_class = XMC_TC0;
5804       break;
5805     case 'U':
5806       if (strcmp (s, "UA]") == 0)
5807         tc->symbol_class = XMC_UA;
5808       else if (strcmp (s, "UC]") == 0)
5809         tc->symbol_class = XMC_UC;
5810       break;
5811     case 'X':
5812       if (strcmp (s, "XO]") == 0)
5813         tc->symbol_class = XMC_XO;
5814       break;
5815     }
5816
5817   if (tc->symbol_class == -1)
5818     as_bad (_("unrecognized symbol suffix"));
5819 }
5820
5821 /* Set the class of a label based on where it is defined.  This
5822    handles symbols without suffixes.  Also, move the symbol so that it
5823    follows the csect symbol.  */
5824
5825 void
5826 ppc_frob_label (symbolS *sym)
5827 {
5828   if (ppc_current_csect != (symbolS *) NULL)
5829     {
5830       if (symbol_get_tc (sym)->symbol_class == -1)
5831         symbol_get_tc (sym)->symbol_class = symbol_get_tc (ppc_current_csect)->symbol_class;
5832
5833       symbol_remove (sym, &symbol_rootP, &symbol_lastP);
5834       symbol_append (sym, symbol_get_tc (ppc_current_csect)->within,
5835                      &symbol_rootP, &symbol_lastP);
5836       symbol_get_tc (ppc_current_csect)->within = sym;
5837       symbol_get_tc (sym)->within = ppc_current_csect;
5838     }
5839
5840 #ifdef OBJ_ELF
5841   dwarf2_emit_label (sym);
5842 #endif
5843 }
5844
5845 /* This variable is set by ppc_frob_symbol if any absolute symbols are
5846    seen.  It tells ppc_adjust_symtab whether it needs to look through
5847    the symbols.  */
5848
5849 static bfd_boolean ppc_saw_abs;
5850
5851 /* Change the name of a symbol just before writing it out.  Set the
5852    real name if the .rename pseudo-op was used.  Otherwise, remove any
5853    class suffix.  Return 1 if the symbol should not be included in the
5854    symbol table.  */
5855
5856 int
5857 ppc_frob_symbol (symbolS *sym)
5858 {
5859   static symbolS *ppc_last_function;
5860   static symbolS *set_end;
5861
5862   /* Discard symbols that should not be included in the output symbol
5863      table.  */
5864   if (! symbol_used_in_reloc_p (sym)
5865       && ((symbol_get_bfdsym (sym)->flags & BSF_SECTION_SYM) != 0
5866           || (! (S_IS_EXTERNAL (sym) || S_IS_WEAK (sym))
5867               && ! symbol_get_tc (sym)->output
5868               && S_GET_STORAGE_CLASS (sym) != C_FILE)))
5869     return 1;
5870
5871   /* This one will disappear anyway.  Don't make a csect sym for it.  */
5872   if (sym == abs_section_sym)
5873     return 1;
5874
5875   if (symbol_get_tc (sym)->real_name != (char *) NULL)
5876     S_SET_NAME (sym, symbol_get_tc (sym)->real_name);
5877   else
5878     {
5879       const char *name;
5880       const char *s;
5881
5882       name = S_GET_NAME (sym);
5883       s = strchr (name, '[');
5884       if (s != (char *) NULL)
5885         {
5886           unsigned int len;
5887           char *snew;
5888
5889           len = s - name;
5890           snew = xstrndup (name, len);
5891
5892           S_SET_NAME (sym, snew);
5893         }
5894     }
5895
5896   if (set_end != (symbolS *) NULL)
5897     {
5898       SA_SET_SYM_ENDNDX (set_end, sym);
5899       set_end = NULL;
5900     }
5901
5902   if (SF_GET_FUNCTION (sym))
5903     {
5904       if (ppc_last_function != (symbolS *) NULL)
5905         as_bad (_("two .function pseudo-ops with no intervening .ef"));
5906       ppc_last_function = sym;
5907       if (symbol_get_tc (sym)->u.size != (symbolS *) NULL)
5908         {
5909           resolve_symbol_value (symbol_get_tc (sym)->u.size);
5910           SA_SET_SYM_FSIZE (sym,
5911                             (long) S_GET_VALUE (symbol_get_tc (sym)->u.size));
5912         }
5913     }
5914   else if (S_GET_STORAGE_CLASS (sym) == C_FCN
5915            && strcmp (S_GET_NAME (sym), ".ef") == 0)
5916     {
5917       if (ppc_last_function == (symbolS *) NULL)
5918         as_bad (_(".ef with no preceding .function"));
5919       else
5920         {
5921           set_end = ppc_last_function;
5922           ppc_last_function = NULL;
5923
5924           /* We don't have a C_EFCN symbol, but we need to force the
5925              COFF backend to believe that it has seen one.  */
5926           coff_last_function = NULL;
5927         }
5928     }
5929
5930   if (! (S_IS_EXTERNAL (sym) || S_IS_WEAK (sym))
5931       && (symbol_get_bfdsym (sym)->flags & BSF_SECTION_SYM) == 0
5932       && S_GET_STORAGE_CLASS (sym) != C_FILE
5933       && S_GET_STORAGE_CLASS (sym) != C_FCN
5934       && S_GET_STORAGE_CLASS (sym) != C_BLOCK
5935       && S_GET_STORAGE_CLASS (sym) != C_BSTAT
5936       && S_GET_STORAGE_CLASS (sym) != C_ESTAT
5937       && S_GET_STORAGE_CLASS (sym) != C_BINCL
5938       && S_GET_STORAGE_CLASS (sym) != C_EINCL
5939       && S_GET_SEGMENT (sym) != ppc_coff_debug_section)
5940     S_SET_STORAGE_CLASS (sym, C_HIDEXT);
5941
5942   if (S_GET_STORAGE_CLASS (sym) == C_EXT
5943       || S_GET_STORAGE_CLASS (sym) == C_AIX_WEAKEXT
5944       || S_GET_STORAGE_CLASS (sym) == C_HIDEXT)
5945     {
5946       int i;
5947       union internal_auxent *a;
5948
5949       /* Create a csect aux.  */
5950       i = S_GET_NUMBER_AUXILIARY (sym);
5951       S_SET_NUMBER_AUXILIARY (sym, i + 1);
5952       a = &coffsymbol (symbol_get_bfdsym (sym))->native[i + 1].u.auxent;
5953       if (symbol_get_tc (sym)->symbol_class == XMC_TC0)
5954         {
5955           /* This is the TOC table.  */
5956           know (strcmp (S_GET_NAME (sym), "TOC") == 0);
5957           a->x_csect.x_scnlen.l = 0;
5958           a->x_csect.x_smtyp = (2 << 3) | XTY_SD;
5959         }
5960       else if (symbol_get_tc (sym)->subseg != 0)
5961         {
5962           /* This is a csect symbol.  x_scnlen is the size of the
5963              csect.  */
5964           if (symbol_get_tc (sym)->next == (symbolS *) NULL)
5965             a->x_csect.x_scnlen.l = (bfd_section_size (stdoutput,
5966                                                        S_GET_SEGMENT (sym))
5967                                      - S_GET_VALUE (sym));
5968           else
5969             {
5970               resolve_symbol_value (symbol_get_tc (sym)->next);
5971               a->x_csect.x_scnlen.l = (S_GET_VALUE (symbol_get_tc (sym)->next)
5972                                        - S_GET_VALUE (sym));
5973             }
5974           a->x_csect.x_smtyp = (symbol_get_tc (sym)->align << 3) | XTY_SD;
5975         }
5976       else if (S_GET_SEGMENT (sym) == bss_section)
5977         {
5978           /* This is a common symbol.  */
5979           a->x_csect.x_scnlen.l = symbol_get_frag (sym)->fr_offset;
5980           a->x_csect.x_smtyp = (symbol_get_tc (sym)->align << 3) | XTY_CM;
5981           if (S_IS_EXTERNAL (sym))
5982             symbol_get_tc (sym)->symbol_class = XMC_RW;
5983           else
5984             symbol_get_tc (sym)->symbol_class = XMC_BS;
5985         }
5986       else if (S_GET_SEGMENT (sym) == absolute_section)
5987         {
5988           /* This is an absolute symbol.  The csect will be created by
5989              ppc_adjust_symtab.  */
5990           ppc_saw_abs = TRUE;
5991           a->x_csect.x_smtyp = XTY_LD;
5992           if (symbol_get_tc (sym)->symbol_class == -1)
5993             symbol_get_tc (sym)->symbol_class = XMC_XO;
5994         }
5995       else if (! S_IS_DEFINED (sym))
5996         {
5997           /* This is an external symbol.  */
5998           a->x_csect.x_scnlen.l = 0;
5999           a->x_csect.x_smtyp = XTY_ER;
6000         }
6001       else if (symbol_get_tc (sym)->symbol_class == XMC_TC)
6002         {
6003           symbolS *next;
6004
6005           /* This is a TOC definition.  x_scnlen is the size of the
6006              TOC entry.  */
6007           next = symbol_next (sym);
6008           while (symbol_get_tc (next)->symbol_class == XMC_TC0)
6009             next = symbol_next (next);
6010           if (next == (symbolS *) NULL
6011               || symbol_get_tc (next)->symbol_class != XMC_TC)
6012             {
6013               if (ppc_after_toc_frag == (fragS *) NULL)
6014                 a->x_csect.x_scnlen.l = (bfd_section_size (stdoutput,
6015                                                            data_section)
6016                                          - S_GET_VALUE (sym));
6017               else
6018                 a->x_csect.x_scnlen.l = (ppc_after_toc_frag->fr_address
6019                                          - S_GET_VALUE (sym));
6020             }
6021           else
6022             {
6023               resolve_symbol_value (next);
6024               a->x_csect.x_scnlen.l = (S_GET_VALUE (next)
6025                                        - S_GET_VALUE (sym));
6026             }
6027           a->x_csect.x_smtyp = (2 << 3) | XTY_SD;
6028         }
6029       else
6030         {
6031           symbolS *csect;
6032
6033           /* This is a normal symbol definition.  x_scnlen is the
6034              symbol index of the containing csect.  */
6035           if (S_GET_SEGMENT (sym) == text_section)
6036             csect = ppc_text_csects;
6037           else if (S_GET_SEGMENT (sym) == data_section)
6038             csect = ppc_data_csects;
6039           else
6040             abort ();
6041
6042           /* Skip the initial dummy symbol.  */
6043           csect = symbol_get_tc (csect)->next;
6044
6045           if (csect == (symbolS *) NULL)
6046             {
6047               as_warn (_("warning: symbol %s has no csect"), S_GET_NAME (sym));
6048               a->x_csect.x_scnlen.l = 0;
6049             }
6050           else
6051             {
6052               while (symbol_get_tc (csect)->next != (symbolS *) NULL)
6053                 {
6054                   resolve_symbol_value (symbol_get_tc (csect)->next);
6055                   if (S_GET_VALUE (symbol_get_tc (csect)->next)
6056                       > S_GET_VALUE (sym))
6057                     break;
6058                   csect = symbol_get_tc (csect)->next;
6059                 }
6060
6061               a->x_csect.x_scnlen.p =
6062                 coffsymbol (symbol_get_bfdsym (csect))->native;
6063               coffsymbol (symbol_get_bfdsym (sym))->native[i + 1].fix_scnlen =
6064                 1;
6065             }
6066           a->x_csect.x_smtyp = XTY_LD;
6067         }
6068
6069       a->x_csect.x_parmhash = 0;
6070       a->x_csect.x_snhash = 0;
6071       if (symbol_get_tc (sym)->symbol_class == -1)
6072         a->x_csect.x_smclas = XMC_PR;
6073       else
6074         a->x_csect.x_smclas = symbol_get_tc (sym)->symbol_class;
6075       a->x_csect.x_stab = 0;
6076       a->x_csect.x_snstab = 0;
6077
6078       /* Don't let the COFF backend resort these symbols.  */
6079       symbol_get_bfdsym (sym)->flags |= BSF_NOT_AT_END;
6080     }
6081   else if (S_GET_STORAGE_CLASS (sym) == C_BSTAT)
6082     {
6083       /* We want the value to be the symbol index of the referenced
6084          csect symbol.  BFD will do that for us if we set the right
6085          flags.  */
6086       asymbol *bsym = symbol_get_bfdsym (symbol_get_tc (sym)->within);
6087       combined_entry_type *c = coffsymbol (bsym)->native;
6088
6089       S_SET_VALUE (sym, (valueT) (size_t) c);
6090       coffsymbol (symbol_get_bfdsym (sym))->native->fix_value = 1;
6091     }
6092   else if (S_GET_STORAGE_CLASS (sym) == C_STSYM)
6093     {
6094       symbolS *block;
6095       valueT base;
6096
6097       block = symbol_get_tc (sym)->within;
6098       if (block)
6099         {
6100           /* The value is the offset from the enclosing csect.  */
6101           symbolS *csect;
6102
6103           csect = symbol_get_tc (block)->within;
6104           resolve_symbol_value (csect);
6105           base = S_GET_VALUE (csect);
6106         }
6107       else
6108         base = 0;
6109
6110       S_SET_VALUE (sym, S_GET_VALUE (sym) - base);
6111     }
6112   else if (S_GET_STORAGE_CLASS (sym) == C_BINCL
6113            || S_GET_STORAGE_CLASS (sym) == C_EINCL)
6114     {
6115       /* We want the value to be a file offset into the line numbers.
6116          BFD will do that for us if we set the right flags.  We have
6117          already set the value correctly.  */
6118       coffsymbol (symbol_get_bfdsym (sym))->native->fix_line = 1;
6119     }
6120
6121   return 0;
6122 }
6123
6124 /* Adjust the symbol table.  This creates csect symbols for all
6125    absolute symbols.  */
6126
6127 void
6128 ppc_adjust_symtab (void)
6129 {
6130   symbolS *sym;
6131
6132   if (! ppc_saw_abs)
6133     return;
6134
6135   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
6136     {
6137       symbolS *csect;
6138       int i;
6139       union internal_auxent *a;
6140
6141       if (S_GET_SEGMENT (sym) != absolute_section)
6142         continue;
6143
6144       csect = symbol_create (".abs[XO]", absolute_section,
6145                              S_GET_VALUE (sym), &zero_address_frag);
6146       symbol_get_bfdsym (csect)->value = S_GET_VALUE (sym);
6147       S_SET_STORAGE_CLASS (csect, C_HIDEXT);
6148       i = S_GET_NUMBER_AUXILIARY (csect);
6149       S_SET_NUMBER_AUXILIARY (csect, i + 1);
6150       a = &coffsymbol (symbol_get_bfdsym (csect))->native[i + 1].u.auxent;
6151       a->x_csect.x_scnlen.l = 0;
6152       a->x_csect.x_smtyp = XTY_SD;
6153       a->x_csect.x_parmhash = 0;
6154       a->x_csect.x_snhash = 0;
6155       a->x_csect.x_smclas = XMC_XO;
6156       a->x_csect.x_stab = 0;
6157       a->x_csect.x_snstab = 0;
6158
6159       symbol_insert (csect, sym, &symbol_rootP, &symbol_lastP);
6160
6161       i = S_GET_NUMBER_AUXILIARY (sym);
6162       a = &coffsymbol (symbol_get_bfdsym (sym))->native[i].u.auxent;
6163       a->x_csect.x_scnlen.p = coffsymbol (symbol_get_bfdsym (csect))->native;
6164       coffsymbol (symbol_get_bfdsym (sym))->native[i].fix_scnlen = 1;
6165     }
6166
6167   ppc_saw_abs = FALSE;
6168 }
6169
6170 /* Set the VMA for a section.  This is called on all the sections in
6171    turn.  */
6172
6173 void
6174 ppc_frob_section (asection *sec)
6175 {
6176   static bfd_vma vma = 0;
6177
6178   /* Dwarf sections start at 0.  */
6179   if (bfd_get_section_flags (NULL, sec) & SEC_DEBUGGING)
6180     return;
6181
6182   vma = md_section_align (sec, vma);
6183   bfd_set_section_vma (stdoutput, sec, vma);
6184   vma += bfd_section_size (stdoutput, sec);
6185 }
6186
6187 #endif /* OBJ_XCOFF */
6188 \f
6189 const char *
6190 md_atof (int type, char *litp, int *sizep)
6191 {
6192   return ieee_md_atof (type, litp, sizep, target_big_endian);
6193 }
6194
6195 /* Write a value out to the object file, using the appropriate
6196    endianness.  */
6197
6198 void
6199 md_number_to_chars (char *buf, valueT val, int n)
6200 {
6201   if (target_big_endian)
6202     number_to_chars_bigendian (buf, val, n);
6203   else
6204     number_to_chars_littleendian (buf, val, n);
6205 }
6206
6207 /* Align a section (I don't know why this is machine dependent).  */
6208
6209 valueT
6210 md_section_align (asection *seg ATTRIBUTE_UNUSED, valueT addr)
6211 {
6212 #ifdef OBJ_ELF
6213   return addr;
6214 #else
6215   int align = bfd_get_section_alignment (stdoutput, seg);
6216
6217   return ((addr + (1 << align) - 1) & -(1 << align));
6218 #endif
6219 }
6220
6221 /* We don't have any form of relaxing.  */
6222
6223 int
6224 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
6225                                asection *seg ATTRIBUTE_UNUSED)
6226 {
6227   abort ();
6228   return 0;
6229 }
6230
6231 /* Convert a machine dependent frag.  We never generate these.  */
6232
6233 void
6234 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
6235                  asection *sec ATTRIBUTE_UNUSED,
6236                  fragS *fragp ATTRIBUTE_UNUSED)
6237 {
6238   abort ();
6239 }
6240
6241 /* We have no need to default values of symbols.  */
6242
6243 symbolS *
6244 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
6245 {
6246   return 0;
6247 }
6248 \f
6249 /* Functions concerning relocs.  */
6250
6251 /* The location from which a PC relative jump should be calculated,
6252    given a PC relative reloc.  */
6253
6254 long
6255 md_pcrel_from_section (fixS *fixp, segT sec ATTRIBUTE_UNUSED)
6256 {
6257   return fixp->fx_frag->fr_address + fixp->fx_where;
6258 }
6259
6260 #ifdef OBJ_XCOFF
6261
6262 /* This is called to see whether a fixup should be adjusted to use a
6263    section symbol.  We take the opportunity to change a fixup against
6264    a symbol in the TOC subsegment into a reloc against the
6265    corresponding .tc symbol.  */
6266
6267 int
6268 ppc_fix_adjustable (fixS *fix)
6269 {
6270   valueT val = resolve_symbol_value (fix->fx_addsy);
6271   segT symseg = S_GET_SEGMENT (fix->fx_addsy);
6272   TC_SYMFIELD_TYPE *tc;
6273
6274   if (symseg == absolute_section)
6275     return 0;
6276
6277   /* Always adjust symbols in debugging sections.  */
6278   if (bfd_get_section_flags (stdoutput, symseg) & SEC_DEBUGGING)
6279     return 1;
6280
6281   if (ppc_toc_csect != (symbolS *) NULL
6282       && fix->fx_addsy != ppc_toc_csect
6283       && symseg == data_section
6284       && val >= ppc_toc_frag->fr_address
6285       && (ppc_after_toc_frag == (fragS *) NULL
6286           || val < ppc_after_toc_frag->fr_address))
6287     {
6288       symbolS *sy;
6289
6290       for (sy = symbol_next (ppc_toc_csect);
6291            sy != (symbolS *) NULL;
6292            sy = symbol_next (sy))
6293         {
6294           TC_SYMFIELD_TYPE *sy_tc = symbol_get_tc (sy);
6295
6296           if (sy_tc->symbol_class == XMC_TC0)
6297             continue;
6298           if (sy_tc->symbol_class != XMC_TC)
6299             break;
6300           if (val == resolve_symbol_value (sy))
6301             {
6302               fix->fx_addsy = sy;
6303               fix->fx_addnumber = val - ppc_toc_frag->fr_address;
6304               return 0;
6305             }
6306         }
6307
6308       as_bad_where (fix->fx_file, fix->fx_line,
6309                     _("symbol in .toc does not match any .tc"));
6310     }
6311
6312   /* Possibly adjust the reloc to be against the csect.  */
6313   tc = symbol_get_tc (fix->fx_addsy);
6314   if (tc->subseg == 0
6315       && tc->symbol_class != XMC_TC0
6316       && tc->symbol_class != XMC_TC
6317       && symseg != bss_section
6318       /* Don't adjust if this is a reloc in the toc section.  */
6319       && (symseg != data_section
6320           || ppc_toc_csect == NULL
6321           || val < ppc_toc_frag->fr_address
6322           || (ppc_after_toc_frag != NULL
6323               && val >= ppc_after_toc_frag->fr_address)))
6324     {
6325       symbolS *csect = tc->within;
6326
6327       /* If the symbol was not declared by a label (eg: a section symbol),
6328          use the section instead of the csect.  This doesn't happen in
6329          normal AIX assembly code.  */
6330       if (csect == NULL)
6331         csect = seg_info (symseg)->sym;
6332
6333       fix->fx_offset += val - symbol_get_frag (csect)->fr_address;
6334       fix->fx_addsy = csect;
6335
6336       return 0;
6337     }
6338
6339   /* Adjust a reloc against a .lcomm symbol to be against the base
6340      .lcomm.  */
6341   if (symseg == bss_section
6342       && ! S_IS_EXTERNAL (fix->fx_addsy))
6343     {
6344       symbolS *sy = symbol_get_frag (fix->fx_addsy)->fr_symbol;
6345
6346       fix->fx_offset += val - resolve_symbol_value (sy);
6347       fix->fx_addsy = sy;
6348     }
6349
6350   return 0;
6351 }
6352
6353 /* A reloc from one csect to another must be kept.  The assembler
6354    will, of course, keep relocs between sections, and it will keep
6355    absolute relocs, but we need to force it to keep PC relative relocs
6356    between two csects in the same section.  */
6357
6358 int
6359 ppc_force_relocation (fixS *fix)
6360 {
6361   /* At this point fix->fx_addsy should already have been converted to
6362      a csect symbol.  If the csect does not include the fragment, then
6363      we need to force the relocation.  */
6364   if (fix->fx_pcrel
6365       && fix->fx_addsy != NULL
6366       && symbol_get_tc (fix->fx_addsy)->subseg != 0
6367       && ((symbol_get_frag (fix->fx_addsy)->fr_address
6368            > fix->fx_frag->fr_address)
6369           || (symbol_get_tc (fix->fx_addsy)->next != NULL
6370               && (symbol_get_frag (symbol_get_tc (fix->fx_addsy)->next)->fr_address
6371                   <= fix->fx_frag->fr_address))))
6372     return 1;
6373
6374   return generic_force_reloc (fix);
6375 }
6376
6377 void
6378 ppc_new_dot_label (symbolS *sym)
6379 {
6380   /* Anchor this label to the current csect for relocations.  */
6381   symbol_get_tc (sym)->within = ppc_current_csect;
6382 }
6383
6384 #endif /* OBJ_XCOFF */
6385
6386 #ifdef OBJ_ELF
6387 /* If this function returns non-zero, it guarantees that a relocation
6388    will be emitted for a fixup.  */
6389
6390 int
6391 ppc_force_relocation (fixS *fix)
6392 {
6393   /* Branch prediction relocations must force a relocation, as must
6394      the vtable description relocs.  */
6395   switch (fix->fx_r_type)
6396     {
6397     case BFD_RELOC_PPC_B16_BRTAKEN:
6398     case BFD_RELOC_PPC_B16_BRNTAKEN:
6399     case BFD_RELOC_PPC_BA16_BRTAKEN:
6400     case BFD_RELOC_PPC_BA16_BRNTAKEN:
6401     case BFD_RELOC_24_PLT_PCREL:
6402     case BFD_RELOC_PPC64_TOC:
6403       return 1;
6404     case BFD_RELOC_PPC_B26:
6405     case BFD_RELOC_PPC_BA26:
6406     case BFD_RELOC_PPC_B16:
6407     case BFD_RELOC_PPC_BA16:
6408       /* All branch fixups targeting a localentry symbol must
6409          force a relocation.  */
6410       if (fix->fx_addsy)
6411         {
6412           asymbol *bfdsym = symbol_get_bfdsym (fix->fx_addsy);
6413           elf_symbol_type *elfsym
6414             = elf_symbol_from (bfd_asymbol_bfd (bfdsym), bfdsym);
6415           gas_assert (elfsym);
6416           if ((STO_PPC64_LOCAL_MASK & elfsym->internal_elf_sym.st_other) != 0)
6417             return 1;
6418         }
6419       break;
6420     default:
6421       break;
6422     }
6423
6424   if (fix->fx_r_type >= BFD_RELOC_PPC_TLS
6425       && fix->fx_r_type <= BFD_RELOC_PPC64_DTPREL16_HIGHESTA)
6426     return 1;
6427
6428   return generic_force_reloc (fix);
6429 }
6430
6431 int
6432 ppc_fix_adjustable (fixS *fix)
6433 {
6434   switch (fix->fx_r_type)
6435     {
6436       /* All branch fixups targeting a localentry symbol must
6437          continue using the symbol.  */
6438     case BFD_RELOC_PPC_B26:
6439     case BFD_RELOC_PPC_BA26:
6440     case BFD_RELOC_PPC_B16:
6441     case BFD_RELOC_PPC_BA16:
6442     case BFD_RELOC_PPC_B16_BRTAKEN:
6443     case BFD_RELOC_PPC_B16_BRNTAKEN:
6444     case BFD_RELOC_PPC_BA16_BRTAKEN:
6445     case BFD_RELOC_PPC_BA16_BRNTAKEN:
6446       if (fix->fx_addsy)
6447         {
6448           asymbol *bfdsym = symbol_get_bfdsym (fix->fx_addsy);
6449           elf_symbol_type *elfsym
6450             = elf_symbol_from (bfd_asymbol_bfd (bfdsym), bfdsym);
6451           gas_assert (elfsym);
6452           if ((STO_PPC64_LOCAL_MASK & elfsym->internal_elf_sym.st_other) != 0)
6453             return 0;
6454         }
6455       break;
6456     default:
6457       break;
6458     }
6459
6460   return (fix->fx_r_type != BFD_RELOC_16_GOTOFF
6461           && fix->fx_r_type != BFD_RELOC_LO16_GOTOFF
6462           && fix->fx_r_type != BFD_RELOC_HI16_GOTOFF
6463           && fix->fx_r_type != BFD_RELOC_HI16_S_GOTOFF
6464           && fix->fx_r_type != BFD_RELOC_PPC64_GOT16_DS
6465           && fix->fx_r_type != BFD_RELOC_PPC64_GOT16_LO_DS
6466           && fix->fx_r_type != BFD_RELOC_GPREL16
6467           && fix->fx_r_type != BFD_RELOC_VTABLE_INHERIT
6468           && fix->fx_r_type != BFD_RELOC_VTABLE_ENTRY
6469           && !(fix->fx_r_type >= BFD_RELOC_PPC_TLS
6470                && fix->fx_r_type <= BFD_RELOC_PPC64_DTPREL16_HIGHESTA));
6471 }
6472 #endif
6473
6474 void
6475 ppc_frag_check (struct frag *fragP)
6476 {
6477   if ((fragP->fr_address & fragP->insn_addr) != 0)
6478     as_bad_where (fragP->fr_file, fragP->fr_line,
6479                   _("instruction address is not a multiple of %d"),
6480                   fragP->insn_addr + 1);
6481 }
6482
6483 /* Implement HANDLE_ALIGN.  This writes the NOP pattern into an
6484    rs_align_code frag.  */
6485
6486 void
6487 ppc_handle_align (struct frag *fragP)
6488 {
6489   valueT count = (fragP->fr_next->fr_address
6490                   - (fragP->fr_address + fragP->fr_fix));
6491
6492   if ((ppc_cpu & PPC_OPCODE_VLE) != 0 && count != 0 && (count & 1) == 0)
6493     {
6494       char *dest = fragP->fr_literal + fragP->fr_fix;
6495
6496       fragP->fr_var = 2;
6497       md_number_to_chars (dest, 0x4400, 2);
6498     }
6499   else if (count != 0 && (count & 3) == 0)
6500     {
6501       char *dest = fragP->fr_literal + fragP->fr_fix;
6502
6503       fragP->fr_var = 4;
6504
6505       if (count > 4 * nop_limit && count < 0x2000000)
6506         {
6507           struct frag *rest;
6508
6509           /* Make a branch, then follow with nops.  Insert another
6510              frag to handle the nops.  */
6511           md_number_to_chars (dest, 0x48000000 + count, 4);
6512           count -= 4;
6513           if (count == 0)
6514             return;
6515
6516           rest = xmalloc (SIZEOF_STRUCT_FRAG + 4);
6517           memcpy (rest, fragP, SIZEOF_STRUCT_FRAG);
6518           fragP->fr_next = rest;
6519           fragP = rest;
6520           rest->fr_address += rest->fr_fix + 4;
6521           rest->fr_fix = 0;
6522           /* If we leave the next frag as rs_align_code we'll come here
6523              again, resulting in a bunch of branches rather than a
6524              branch followed by nops.  */
6525           rest->fr_type = rs_align;
6526           dest = rest->fr_literal;
6527         }
6528
6529       md_number_to_chars (dest, 0x60000000, 4);
6530
6531       if ((ppc_cpu & PPC_OPCODE_POWER6) != 0
6532           && (ppc_cpu & PPC_OPCODE_POWER9) == 0)
6533         {
6534           /* For power6, power7, and power8, we want the last nop to
6535              be a group terminating one.  Do this by inserting an
6536              rs_fill frag immediately after this one, with its address
6537              set to the last nop location.  This will automatically
6538              reduce the number of nops in the current frag by one.  */
6539           if (count > 4)
6540             {
6541               struct frag *group_nop = xmalloc (SIZEOF_STRUCT_FRAG + 4);
6542
6543               memcpy (group_nop, fragP, SIZEOF_STRUCT_FRAG);
6544               group_nop->fr_address = group_nop->fr_next->fr_address - 4;
6545               group_nop->fr_fix = 0;
6546               group_nop->fr_offset = 1;
6547               group_nop->fr_type = rs_fill;
6548               fragP->fr_next = group_nop;
6549               dest = group_nop->fr_literal;
6550             }
6551
6552           if ((ppc_cpu & PPC_OPCODE_POWER7) != 0)
6553             {
6554               if (ppc_cpu & PPC_OPCODE_E500MC)
6555                 /* e500mc group terminating nop: "ori 0,0,0".  */
6556                 md_number_to_chars (dest, 0x60000000, 4);
6557               else
6558                 /* power7/power8 group terminating nop: "ori 2,2,0".  */
6559                 md_number_to_chars (dest, 0x60420000, 4);
6560             }
6561           else
6562             /* power6 group terminating nop: "ori 1,1,0".  */
6563             md_number_to_chars (dest, 0x60210000, 4);
6564         }
6565     }
6566 }
6567
6568 /* Apply a fixup to the object code.  This is called for all the
6569    fixups we generated by the calls to fix_new_exp, above.  */
6570
6571 void
6572 md_apply_fix (fixS *fixP, valueT *valP, segT seg)
6573 {
6574   valueT value = * valP;
6575   offsetT fieldval;
6576   const struct powerpc_operand *operand;
6577
6578 #ifdef OBJ_ELF
6579   if (fixP->fx_addsy != NULL)
6580     {
6581       /* Hack around bfd_install_relocation brain damage.  */
6582       if (fixP->fx_pcrel)
6583         value += fixP->fx_frag->fr_address + fixP->fx_where;
6584
6585       if (fixP->fx_addsy == abs_section_sym)
6586         fixP->fx_done = 1;
6587     }
6588   else
6589     fixP->fx_done = 1;
6590 #else
6591   /* FIXME FIXME FIXME: The value we are passed in *valP includes
6592      the symbol values.  If we are doing this relocation the code in
6593      write.c is going to call bfd_install_relocation, which is also
6594      going to use the symbol value.  That means that if the reloc is
6595      fully resolved we want to use *valP since bfd_install_relocation is
6596      not being used.
6597      However, if the reloc is not fully resolved we do not want to
6598      use *valP, and must use fx_offset instead.  If the relocation
6599      is PC-relative, we then need to re-apply md_pcrel_from_section
6600      to this new relocation value.  */
6601   if (fixP->fx_addsy == (symbolS *) NULL)
6602     fixP->fx_done = 1;
6603
6604   else
6605     {
6606       value = fixP->fx_offset;
6607       if (fixP->fx_pcrel)
6608         value -= md_pcrel_from_section (fixP, seg);
6609     }
6610 #endif
6611
6612   /* We are only able to convert some relocs to pc-relative.  */
6613   if (fixP->fx_pcrel)
6614     {
6615       switch (fixP->fx_r_type)
6616         {
6617         case BFD_RELOC_LO16:
6618           fixP->fx_r_type = BFD_RELOC_LO16_PCREL;
6619           break;
6620
6621         case BFD_RELOC_HI16:
6622           fixP->fx_r_type = BFD_RELOC_HI16_PCREL;
6623           break;
6624
6625         case BFD_RELOC_HI16_S:
6626           fixP->fx_r_type = BFD_RELOC_HI16_S_PCREL;
6627           break;
6628
6629         case BFD_RELOC_64:
6630           fixP->fx_r_type = BFD_RELOC_64_PCREL;
6631           break;
6632
6633         case BFD_RELOC_32:
6634           fixP->fx_r_type = BFD_RELOC_32_PCREL;
6635           break;
6636
6637         case BFD_RELOC_16:
6638           fixP->fx_r_type = BFD_RELOC_16_PCREL;
6639           break;
6640
6641         case BFD_RELOC_PPC_16DX_HA:
6642           fixP->fx_r_type = BFD_RELOC_PPC_REL16DX_HA;
6643           break;
6644
6645         default:
6646           break;
6647         }
6648     }
6649   else if (!fixP->fx_done
6650            && fixP->fx_r_type == BFD_RELOC_PPC_16DX_HA)
6651     {
6652       /* addpcis is relative to next insn address.  */
6653       value -= 4;
6654       fixP->fx_r_type = BFD_RELOC_PPC_REL16DX_HA;
6655       fixP->fx_pcrel = 1;
6656     }
6657
6658   operand = NULL;
6659   if (fixP->fx_pcrel_adjust != 0)
6660     {
6661       /* This is a fixup on an instruction.  */
6662       int opindex = fixP->fx_pcrel_adjust & 0xff;
6663
6664       operand = &powerpc_operands[opindex];
6665 #ifdef OBJ_XCOFF
6666       /* An instruction like `lwz 9,sym(30)' when `sym' is not a TOC symbol
6667          does not generate a reloc.  It uses the offset of `sym' within its
6668          csect.  Other usages, such as `.long sym', generate relocs.  This
6669          is the documented behaviour of non-TOC symbols.  */
6670       if ((operand->flags & PPC_OPERAND_PARENS) != 0
6671           && (operand->bitm & 0xfff0) == 0xfff0
6672           && operand->shift == 0
6673           && (operand->insert == NULL || ppc_obj64)
6674           && fixP->fx_addsy != NULL
6675           && symbol_get_tc (fixP->fx_addsy)->subseg != 0
6676           && symbol_get_tc (fixP->fx_addsy)->symbol_class != XMC_TC
6677           && symbol_get_tc (fixP->fx_addsy)->symbol_class != XMC_TC0
6678           && S_GET_SEGMENT (fixP->fx_addsy) != bss_section)
6679         {
6680           value = fixP->fx_offset;
6681           fixP->fx_done = 1;
6682         }
6683
6684        /* During parsing of instructions, a TOC16 reloc is generated for
6685           instructions such as 'lwz RT,SYM(RB)' if SYM is a symbol defined
6686           in the toc.  But at parse time, SYM may be not yet defined, so
6687           check again here.  */
6688        if (fixP->fx_r_type == BFD_RELOC_16
6689            && fixP->fx_addsy != NULL
6690            && ppc_is_toc_sym (fixP->fx_addsy))
6691          fixP->fx_r_type = BFD_RELOC_PPC_TOC16;
6692 #endif
6693     }
6694
6695   /* Calculate value to be stored in field.  */
6696   fieldval = value;
6697   switch (fixP->fx_r_type)
6698     {
6699 #ifdef OBJ_ELF
6700     case BFD_RELOC_PPC64_ADDR16_LO_DS:
6701     case BFD_RELOC_PPC_VLE_LO16A:
6702     case BFD_RELOC_PPC_VLE_LO16D:
6703 #endif
6704     case BFD_RELOC_LO16:
6705     case BFD_RELOC_LO16_PCREL:
6706       fieldval = value & 0xffff;
6707     sign_extend_16:
6708       if (operand != NULL && (operand->flags & PPC_OPERAND_SIGNED) != 0)
6709         fieldval = SEX16 (fieldval);
6710       fixP->fx_no_overflow = 1;
6711       break;
6712
6713     case BFD_RELOC_HI16:
6714     case BFD_RELOC_HI16_PCREL:
6715 #ifdef OBJ_ELF
6716       if (REPORT_OVERFLOW_HI && ppc_obj64)
6717         {
6718           fieldval = value >> 16;
6719           if (operand != NULL && (operand->flags & PPC_OPERAND_SIGNED) != 0)
6720             {
6721               valueT sign = (((valueT) -1 >> 16) + 1) >> 1;
6722               fieldval = ((valueT) fieldval ^ sign) - sign;
6723             }
6724           break;
6725         }
6726       /* Fallthru */
6727
6728     case BFD_RELOC_PPC_VLE_HI16A:
6729     case BFD_RELOC_PPC_VLE_HI16D:
6730     case BFD_RELOC_PPC64_ADDR16_HIGH:
6731 #endif
6732       fieldval = PPC_HI (value);
6733       goto sign_extend_16;
6734
6735     case BFD_RELOC_HI16_S:
6736     case BFD_RELOC_HI16_S_PCREL:
6737     case BFD_RELOC_PPC_16DX_HA:
6738     case BFD_RELOC_PPC_REL16DX_HA:
6739 #ifdef OBJ_ELF
6740       if (REPORT_OVERFLOW_HI && ppc_obj64)
6741         {
6742           fieldval = (value + 0x8000) >> 16;
6743           if (operand != NULL && (operand->flags & PPC_OPERAND_SIGNED) != 0)
6744             {
6745               valueT sign = (((valueT) -1 >> 16) + 1) >> 1;
6746               fieldval = ((valueT) fieldval ^ sign) - sign;
6747             }
6748           break;
6749         }
6750       /* Fallthru */
6751
6752     case BFD_RELOC_PPC_VLE_HA16A:
6753     case BFD_RELOC_PPC_VLE_HA16D:
6754     case BFD_RELOC_PPC64_ADDR16_HIGHA:
6755 #endif
6756       fieldval = PPC_HA (value);
6757       goto sign_extend_16;
6758
6759 #ifdef OBJ_ELF
6760     case BFD_RELOC_PPC64_HIGHER:
6761       fieldval = PPC_HIGHER (value);
6762       goto sign_extend_16;
6763
6764     case BFD_RELOC_PPC64_HIGHER_S:
6765       fieldval = PPC_HIGHERA (value);
6766       goto sign_extend_16;
6767
6768     case BFD_RELOC_PPC64_HIGHEST:
6769       fieldval = PPC_HIGHEST (value);
6770       goto sign_extend_16;
6771
6772     case BFD_RELOC_PPC64_HIGHEST_S:
6773       fieldval = PPC_HIGHESTA (value);
6774       goto sign_extend_16;
6775 #endif
6776
6777     default:
6778       break;
6779     }
6780
6781   if (operand != NULL)
6782     {
6783       /* Handle relocs in an insn.  */
6784       switch (fixP->fx_r_type)
6785         {
6786 #ifdef OBJ_ELF
6787           /* The following relocs can't be calculated by the assembler.
6788              Leave the field zero.  */
6789         case BFD_RELOC_PPC_TPREL16:
6790         case BFD_RELOC_PPC_TPREL16_LO:
6791         case BFD_RELOC_PPC_TPREL16_HI:
6792         case BFD_RELOC_PPC_TPREL16_HA:
6793         case BFD_RELOC_PPC_DTPREL16:
6794         case BFD_RELOC_PPC_DTPREL16_LO:
6795         case BFD_RELOC_PPC_DTPREL16_HI:
6796         case BFD_RELOC_PPC_DTPREL16_HA:
6797         case BFD_RELOC_PPC_GOT_TLSGD16:
6798         case BFD_RELOC_PPC_GOT_TLSGD16_LO:
6799         case BFD_RELOC_PPC_GOT_TLSGD16_HI:
6800         case BFD_RELOC_PPC_GOT_TLSGD16_HA:
6801         case BFD_RELOC_PPC_GOT_TLSLD16:
6802         case BFD_RELOC_PPC_GOT_TLSLD16_LO:
6803         case BFD_RELOC_PPC_GOT_TLSLD16_HI:
6804         case BFD_RELOC_PPC_GOT_TLSLD16_HA:
6805         case BFD_RELOC_PPC_GOT_TPREL16:
6806         case BFD_RELOC_PPC_GOT_TPREL16_LO:
6807         case BFD_RELOC_PPC_GOT_TPREL16_HI:
6808         case BFD_RELOC_PPC_GOT_TPREL16_HA:
6809         case BFD_RELOC_PPC_GOT_DTPREL16:
6810         case BFD_RELOC_PPC_GOT_DTPREL16_LO:
6811         case BFD_RELOC_PPC_GOT_DTPREL16_HI:
6812         case BFD_RELOC_PPC_GOT_DTPREL16_HA:
6813         case BFD_RELOC_PPC64_TPREL16_DS:
6814         case BFD_RELOC_PPC64_TPREL16_LO_DS:
6815         case BFD_RELOC_PPC64_TPREL16_HIGH:
6816         case BFD_RELOC_PPC64_TPREL16_HIGHA:
6817         case BFD_RELOC_PPC64_TPREL16_HIGHER:
6818         case BFD_RELOC_PPC64_TPREL16_HIGHERA:
6819         case BFD_RELOC_PPC64_TPREL16_HIGHEST:
6820         case BFD_RELOC_PPC64_TPREL16_HIGHESTA:
6821         case BFD_RELOC_PPC64_DTPREL16_HIGH:
6822         case BFD_RELOC_PPC64_DTPREL16_HIGHA:
6823         case BFD_RELOC_PPC64_DTPREL16_DS:
6824         case BFD_RELOC_PPC64_DTPREL16_LO_DS:
6825         case BFD_RELOC_PPC64_DTPREL16_HIGHER:
6826         case BFD_RELOC_PPC64_DTPREL16_HIGHERA:
6827         case BFD_RELOC_PPC64_DTPREL16_HIGHEST:
6828         case BFD_RELOC_PPC64_DTPREL16_HIGHESTA:
6829           gas_assert (fixP->fx_addsy != NULL);
6830           S_SET_THREAD_LOCAL (fixP->fx_addsy);
6831           fieldval = 0;
6832           break;
6833
6834           /* These also should leave the field zero for the same
6835              reason.  Note that older versions of gas wrote values
6836              here.  If we want to go back to the old behaviour, then
6837              all _LO and _LO_DS cases will need to be treated like
6838              BFD_RELOC_LO16_PCREL above.  Similarly for _HI etc.  */
6839         case BFD_RELOC_16_GOTOFF:
6840         case BFD_RELOC_LO16_GOTOFF:
6841         case BFD_RELOC_HI16_GOTOFF:
6842         case BFD_RELOC_HI16_S_GOTOFF:
6843         case BFD_RELOC_LO16_PLTOFF:
6844         case BFD_RELOC_HI16_PLTOFF:
6845         case BFD_RELOC_HI16_S_PLTOFF:
6846         case BFD_RELOC_GPREL16:
6847         case BFD_RELOC_16_BASEREL:
6848         case BFD_RELOC_LO16_BASEREL:
6849         case BFD_RELOC_HI16_BASEREL:
6850         case BFD_RELOC_HI16_S_BASEREL:
6851         case BFD_RELOC_PPC_TOC16:
6852         case BFD_RELOC_PPC64_TOC16_LO:
6853         case BFD_RELOC_PPC64_TOC16_HI:
6854         case BFD_RELOC_PPC64_TOC16_HA:
6855         case BFD_RELOC_PPC64_PLTGOT16:
6856         case BFD_RELOC_PPC64_PLTGOT16_LO:
6857         case BFD_RELOC_PPC64_PLTGOT16_HI:
6858         case BFD_RELOC_PPC64_PLTGOT16_HA:
6859         case BFD_RELOC_PPC64_GOT16_DS:
6860         case BFD_RELOC_PPC64_GOT16_LO_DS:
6861         case BFD_RELOC_PPC64_PLT16_LO_DS:
6862         case BFD_RELOC_PPC64_SECTOFF_DS:
6863         case BFD_RELOC_PPC64_SECTOFF_LO_DS:
6864         case BFD_RELOC_PPC64_TOC16_DS:
6865         case BFD_RELOC_PPC64_TOC16_LO_DS:
6866         case BFD_RELOC_PPC64_PLTGOT16_DS:
6867         case BFD_RELOC_PPC64_PLTGOT16_LO_DS:
6868         case BFD_RELOC_PPC_EMB_NADDR16:
6869         case BFD_RELOC_PPC_EMB_NADDR16_LO:
6870         case BFD_RELOC_PPC_EMB_NADDR16_HI:
6871         case BFD_RELOC_PPC_EMB_NADDR16_HA:
6872         case BFD_RELOC_PPC_EMB_SDAI16:
6873         case BFD_RELOC_PPC_EMB_SDA2I16:
6874         case BFD_RELOC_PPC_EMB_SDA2REL:
6875         case BFD_RELOC_PPC_EMB_SDA21:
6876         case BFD_RELOC_PPC_EMB_MRKREF:
6877         case BFD_RELOC_PPC_EMB_RELSEC16:
6878         case BFD_RELOC_PPC_EMB_RELST_LO:
6879         case BFD_RELOC_PPC_EMB_RELST_HI:
6880         case BFD_RELOC_PPC_EMB_RELST_HA:
6881         case BFD_RELOC_PPC_EMB_BIT_FLD:
6882         case BFD_RELOC_PPC_EMB_RELSDA:
6883         case BFD_RELOC_PPC_VLE_SDA21:
6884         case BFD_RELOC_PPC_VLE_SDA21_LO:
6885         case BFD_RELOC_PPC_VLE_SDAREL_LO16A:
6886         case BFD_RELOC_PPC_VLE_SDAREL_LO16D:
6887         case BFD_RELOC_PPC_VLE_SDAREL_HI16A:
6888         case BFD_RELOC_PPC_VLE_SDAREL_HI16D:
6889         case BFD_RELOC_PPC_VLE_SDAREL_HA16A:
6890         case BFD_RELOC_PPC_VLE_SDAREL_HA16D:
6891           gas_assert (fixP->fx_addsy != NULL);
6892           /* Fallthru */
6893
6894         case BFD_RELOC_PPC_TLS:
6895         case BFD_RELOC_PPC_TLSGD:
6896         case BFD_RELOC_PPC_TLSLD:
6897           fieldval = 0;
6898           break;
6899 #endif
6900
6901 #ifdef OBJ_XCOFF
6902         case BFD_RELOC_PPC_B16:
6903           /* Adjust the offset to the instruction boundary.  */
6904           fieldval += 2;
6905           break;
6906 #endif
6907
6908         case BFD_RELOC_VTABLE_INHERIT:
6909         case BFD_RELOC_VTABLE_ENTRY:
6910         case BFD_RELOC_PPC_DTPMOD:
6911         case BFD_RELOC_PPC_TPREL:
6912         case BFD_RELOC_PPC_DTPREL:
6913         case BFD_RELOC_PPC_COPY:
6914         case BFD_RELOC_PPC_GLOB_DAT:
6915         case BFD_RELOC_32_PLT_PCREL:
6916         case BFD_RELOC_PPC_EMB_NADDR32:
6917         case BFD_RELOC_PPC64_TOC:
6918         case BFD_RELOC_CTOR:
6919         case BFD_RELOC_32:
6920         case BFD_RELOC_32_PCREL:
6921         case BFD_RELOC_RVA:
6922         case BFD_RELOC_64:
6923         case BFD_RELOC_64_PCREL:
6924         case BFD_RELOC_PPC64_ADDR64_LOCAL:
6925           as_bad_where (fixP->fx_file, fixP->fx_line,
6926                         _("%s unsupported as instruction fixup"),
6927                         bfd_get_reloc_code_name (fixP->fx_r_type));
6928           fixP->fx_done = 1;
6929           return;
6930
6931         default:
6932           break;
6933         }
6934
6935 #ifdef OBJ_ELF
6936 /* powerpc uses RELA style relocs, so if emitting a reloc the field
6937    contents can stay at zero.  */
6938 #define APPLY_RELOC fixP->fx_done
6939 #else
6940 #define APPLY_RELOC 1
6941 #endif
6942       if ((fieldval != 0 && APPLY_RELOC) || operand->insert != NULL)
6943         {
6944           unsigned long insn;
6945           unsigned char *where;
6946
6947           /* Fetch the instruction, insert the fully resolved operand
6948              value, and stuff the instruction back again.  */
6949           where = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
6950           if (target_big_endian)
6951             {
6952               if (fixP->fx_size == 4)
6953                 insn = bfd_getb32 (where);
6954               else
6955                 insn = bfd_getb16 (where);
6956             }
6957           else
6958             {
6959               if (fixP->fx_size == 4)
6960                 insn = bfd_getl32 (where);
6961               else
6962                 insn = bfd_getl16 (where);
6963             }
6964           insn = ppc_insert_operand (insn, operand, fieldval,
6965                                      fixP->tc_fix_data.ppc_cpu,
6966                                      fixP->fx_file, fixP->fx_line);
6967           if (target_big_endian)
6968             {
6969               if (fixP->fx_size == 4)
6970                 bfd_putb32 (insn, where);
6971               else
6972                 bfd_putb16 (insn, where);
6973             }
6974           else
6975             {
6976               if (fixP->fx_size == 4)
6977                 bfd_putl32 (insn, where);
6978               else
6979                 bfd_putl16 (insn, where);
6980             }
6981         }
6982
6983       if (fixP->fx_done)
6984         /* Nothing else to do here.  */
6985         return;
6986
6987       gas_assert (fixP->fx_addsy != NULL);
6988       if (fixP->fx_r_type == BFD_RELOC_NONE)
6989         {
6990           const char *sfile;
6991           unsigned int sline;
6992
6993           /* Use expr_symbol_where to see if this is an expression
6994              symbol.  */
6995           if (expr_symbol_where (fixP->fx_addsy, &sfile, &sline))
6996             as_bad_where (fixP->fx_file, fixP->fx_line,
6997                           _("unresolved expression that must be resolved"));
6998           else
6999             as_bad_where (fixP->fx_file, fixP->fx_line,
7000                           _("unsupported relocation against %s"),
7001                           S_GET_NAME (fixP->fx_addsy));
7002           fixP->fx_done = 1;
7003           return;
7004         }
7005     }
7006   else
7007     {
7008       /* Handle relocs in data.  */
7009       switch (fixP->fx_r_type)
7010         {
7011         case BFD_RELOC_VTABLE_INHERIT:
7012           if (fixP->fx_addsy
7013               && !S_IS_DEFINED (fixP->fx_addsy)
7014               && !S_IS_WEAK (fixP->fx_addsy))
7015             S_SET_WEAK (fixP->fx_addsy);
7016           /* Fallthru */
7017
7018         case BFD_RELOC_VTABLE_ENTRY:
7019           fixP->fx_done = 0;
7020           break;
7021
7022 #ifdef OBJ_ELF
7023           /* These can appear with @l etc. in data.  */
7024         case BFD_RELOC_LO16:
7025         case BFD_RELOC_LO16_PCREL:
7026         case BFD_RELOC_HI16:
7027         case BFD_RELOC_HI16_PCREL:
7028         case BFD_RELOC_HI16_S:
7029         case BFD_RELOC_HI16_S_PCREL:
7030         case BFD_RELOC_PPC64_HIGHER:
7031         case BFD_RELOC_PPC64_HIGHER_S:
7032         case BFD_RELOC_PPC64_HIGHEST:
7033         case BFD_RELOC_PPC64_HIGHEST_S:
7034         case BFD_RELOC_PPC64_ADDR16_HIGH:
7035         case BFD_RELOC_PPC64_ADDR16_HIGHA:
7036         case BFD_RELOC_PPC64_ADDR64_LOCAL:
7037           break;
7038
7039         case BFD_RELOC_PPC_DTPMOD:
7040         case BFD_RELOC_PPC_TPREL:
7041         case BFD_RELOC_PPC_DTPREL:
7042           S_SET_THREAD_LOCAL (fixP->fx_addsy);
7043           break;
7044
7045           /* Just punt all of these to the linker.  */
7046         case BFD_RELOC_PPC_B16_BRTAKEN:
7047         case BFD_RELOC_PPC_B16_BRNTAKEN:
7048         case BFD_RELOC_16_GOTOFF:
7049         case BFD_RELOC_LO16_GOTOFF:
7050         case BFD_RELOC_HI16_GOTOFF:
7051         case BFD_RELOC_HI16_S_GOTOFF:
7052         case BFD_RELOC_LO16_PLTOFF:
7053         case BFD_RELOC_HI16_PLTOFF:
7054         case BFD_RELOC_HI16_S_PLTOFF:
7055         case BFD_RELOC_PPC_COPY:
7056         case BFD_RELOC_PPC_GLOB_DAT:
7057         case BFD_RELOC_16_BASEREL:
7058         case BFD_RELOC_LO16_BASEREL:
7059         case BFD_RELOC_HI16_BASEREL:
7060         case BFD_RELOC_HI16_S_BASEREL:
7061         case BFD_RELOC_PPC_TLS:
7062         case BFD_RELOC_PPC_DTPREL16_LO:
7063         case BFD_RELOC_PPC_DTPREL16_HI:
7064         case BFD_RELOC_PPC_DTPREL16_HA:
7065         case BFD_RELOC_PPC_TPREL16_LO:
7066         case BFD_RELOC_PPC_TPREL16_HI:
7067         case BFD_RELOC_PPC_TPREL16_HA:
7068         case BFD_RELOC_PPC_GOT_TLSGD16:
7069         case BFD_RELOC_PPC_GOT_TLSGD16_LO:
7070         case BFD_RELOC_PPC_GOT_TLSGD16_HI:
7071         case BFD_RELOC_PPC_GOT_TLSGD16_HA:
7072         case BFD_RELOC_PPC_GOT_TLSLD16:
7073         case BFD_RELOC_PPC_GOT_TLSLD16_LO:
7074         case BFD_RELOC_PPC_GOT_TLSLD16_HI:
7075         case BFD_RELOC_PPC_GOT_TLSLD16_HA:
7076         case BFD_RELOC_PPC_GOT_DTPREL16:
7077         case BFD_RELOC_PPC_GOT_DTPREL16_LO:
7078         case BFD_RELOC_PPC_GOT_DTPREL16_HI:
7079         case BFD_RELOC_PPC_GOT_DTPREL16_HA:
7080         case BFD_RELOC_PPC_GOT_TPREL16:
7081         case BFD_RELOC_PPC_GOT_TPREL16_LO:
7082         case BFD_RELOC_PPC_GOT_TPREL16_HI:
7083         case BFD_RELOC_PPC_GOT_TPREL16_HA:
7084         case BFD_RELOC_24_PLT_PCREL:
7085         case BFD_RELOC_PPC_LOCAL24PC:
7086         case BFD_RELOC_32_PLT_PCREL:
7087         case BFD_RELOC_GPREL16:
7088         case BFD_RELOC_PPC_VLE_SDAREL_LO16A:
7089         case BFD_RELOC_PPC_VLE_SDAREL_HI16A:
7090         case BFD_RELOC_PPC_VLE_SDAREL_HA16A:
7091         case BFD_RELOC_PPC_EMB_NADDR32:
7092         case BFD_RELOC_PPC_EMB_NADDR16:
7093         case BFD_RELOC_PPC_EMB_NADDR16_LO:
7094         case BFD_RELOC_PPC_EMB_NADDR16_HI:
7095         case BFD_RELOC_PPC_EMB_NADDR16_HA:
7096         case BFD_RELOC_PPC_EMB_SDAI16:
7097         case BFD_RELOC_PPC_EMB_SDA2REL:
7098         case BFD_RELOC_PPC_EMB_SDA2I16:
7099         case BFD_RELOC_PPC_EMB_SDA21:
7100         case BFD_RELOC_PPC_VLE_SDA21_LO:
7101         case BFD_RELOC_PPC_EMB_MRKREF:
7102         case BFD_RELOC_PPC_EMB_RELSEC16:
7103         case BFD_RELOC_PPC_EMB_RELST_LO:
7104         case BFD_RELOC_PPC_EMB_RELST_HI:
7105         case BFD_RELOC_PPC_EMB_RELST_HA:
7106         case BFD_RELOC_PPC_EMB_BIT_FLD:
7107         case BFD_RELOC_PPC_EMB_RELSDA:
7108         case BFD_RELOC_PPC64_TOC:
7109         case BFD_RELOC_PPC_TOC16:
7110         case BFD_RELOC_PPC64_TOC16_LO:
7111         case BFD_RELOC_PPC64_TOC16_HI:
7112         case BFD_RELOC_PPC64_TOC16_HA:
7113         case BFD_RELOC_PPC64_DTPREL16_HIGH:
7114         case BFD_RELOC_PPC64_DTPREL16_HIGHA:
7115         case BFD_RELOC_PPC64_DTPREL16_HIGHER:
7116         case BFD_RELOC_PPC64_DTPREL16_HIGHERA:
7117         case BFD_RELOC_PPC64_DTPREL16_HIGHEST:
7118         case BFD_RELOC_PPC64_DTPREL16_HIGHESTA:
7119         case BFD_RELOC_PPC64_TPREL16_HIGH:
7120         case BFD_RELOC_PPC64_TPREL16_HIGHA:
7121         case BFD_RELOC_PPC64_TPREL16_HIGHER:
7122         case BFD_RELOC_PPC64_TPREL16_HIGHERA:
7123         case BFD_RELOC_PPC64_TPREL16_HIGHEST:
7124         case BFD_RELOC_PPC64_TPREL16_HIGHESTA:
7125           fixP->fx_done = 0;
7126           break;
7127 #endif
7128
7129 #ifdef OBJ_XCOFF
7130         case BFD_RELOC_NONE:
7131 #endif
7132         case BFD_RELOC_CTOR:
7133         case BFD_RELOC_32:
7134         case BFD_RELOC_32_PCREL:
7135         case BFD_RELOC_RVA:
7136         case BFD_RELOC_64:
7137         case BFD_RELOC_64_PCREL:
7138         case BFD_RELOC_16:
7139         case BFD_RELOC_16_PCREL:
7140         case BFD_RELOC_8:
7141           break;
7142
7143         default:
7144           fprintf (stderr,
7145                    _("Gas failure, reloc value %d\n"), fixP->fx_r_type);
7146           fflush (stderr);
7147           abort ();
7148         }
7149
7150       if (fixP->fx_size && APPLY_RELOC)
7151         md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
7152                             fieldval, fixP->fx_size);
7153       if (warn_476
7154           && (seg->flags & SEC_CODE) != 0
7155           && fixP->fx_size == 4
7156           && fixP->fx_done
7157           && !fixP->fx_tcbit
7158           && (fixP->fx_r_type == BFD_RELOC_32
7159               || fixP->fx_r_type == BFD_RELOC_CTOR
7160               || fixP->fx_r_type == BFD_RELOC_32_PCREL))
7161         as_warn_where (fixP->fx_file, fixP->fx_line,
7162                        _("data in executable section"));
7163     }
7164
7165 #ifdef OBJ_ELF
7166   ppc_elf_validate_fix (fixP, seg);
7167   fixP->fx_addnumber = value;
7168
7169   /* PowerPC uses RELA relocs, ie. the reloc addend is stored separately
7170      from the section contents.  If we are going to be emitting a reloc
7171      then the section contents are immaterial, so don't warn if they
7172      happen to overflow.  Leave such warnings to ld.  */
7173   if (!fixP->fx_done)
7174     {
7175       fixP->fx_no_overflow = 1;
7176
7177       /* Arrange to emit .TOC. as a normal symbol if used in anything
7178          but .TOC.@tocbase.  */
7179       if (ppc_obj64
7180           && fixP->fx_r_type != BFD_RELOC_PPC64_TOC
7181           && fixP->fx_addsy != NULL
7182           && strcmp (S_GET_NAME (fixP->fx_addsy), ".TOC.") == 0)
7183         symbol_get_bfdsym (fixP->fx_addsy)->flags |= BSF_KEEP;
7184     }
7185 #else
7186   if (fixP->fx_r_type != BFD_RELOC_PPC_TOC16)
7187     fixP->fx_addnumber = 0;
7188   else
7189     {
7190 #ifdef TE_PE
7191       fixP->fx_addnumber = 0;
7192 #else
7193       /* We want to use the offset within the toc, not the actual VMA
7194          of the symbol.  */
7195       fixP->fx_addnumber =
7196         - bfd_get_section_vma (stdoutput, S_GET_SEGMENT (fixP->fx_addsy))
7197         - S_GET_VALUE (ppc_toc_csect);
7198       /* Set *valP to avoid errors.  */
7199       *valP = value;
7200 #endif
7201     }
7202 #endif
7203 }
7204
7205 /* Generate a reloc for a fixup.  */
7206
7207 arelent *
7208 tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
7209 {
7210   arelent *reloc;
7211
7212   reloc = XNEW (arelent);
7213
7214   reloc->sym_ptr_ptr = XNEW (asymbol *);
7215   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
7216   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
7217   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
7218   if (reloc->howto == (reloc_howto_type *) NULL)
7219     {
7220       as_bad_where (fixp->fx_file, fixp->fx_line,
7221                     _("reloc %d not supported by object file format"),
7222                     (int) fixp->fx_r_type);
7223       return NULL;
7224     }
7225   reloc->addend = fixp->fx_addnumber;
7226
7227   return reloc;
7228 }
7229
7230 void
7231 ppc_cfi_frame_initial_instructions (void)
7232 {
7233   cfi_add_CFA_def_cfa (1, 0);
7234 }
7235
7236 int
7237 tc_ppc_regname_to_dw2regnum (char *regname)
7238 {
7239   unsigned int regnum = -1;
7240   unsigned int i;
7241   const char *p;
7242   char *q;
7243   static struct { const char *name; int dw2regnum; } regnames[] =
7244     {
7245       { "sp", 1 }, { "r.sp", 1 }, { "rtoc", 2 }, { "r.toc", 2 },
7246       { "mq", 64 }, { "lr", 65 }, { "ctr", 66 }, { "ap", 67 },
7247       { "cr", 70 }, { "xer", 76 }, { "vrsave", 109 }, { "vscr", 110 },
7248       { "spe_acc", 111 }, { "spefscr", 112 }
7249     };
7250
7251   for (i = 0; i < ARRAY_SIZE (regnames); ++i)
7252     if (strcmp (regnames[i].name, regname) == 0)
7253       return regnames[i].dw2regnum;
7254
7255   if (regname[0] == 'r' || regname[0] == 'f' || regname[0] == 'v')
7256     {
7257       p = regname + 1 + (regname[1] == '.');
7258       regnum = strtoul (p, &q, 10);
7259       if (p == q || *q || regnum >= 32)
7260         return -1;
7261       if (regname[0] == 'f')
7262         regnum += 32;
7263       else if (regname[0] == 'v')
7264         regnum += 77;
7265     }
7266   else if (regname[0] == 'c' && regname[1] == 'r')
7267     {
7268       p = regname + 2 + (regname[2] == '.');
7269       if (p[0] < '0' || p[0] > '7' || p[1])
7270         return -1;
7271       regnum = p[0] - '0' + 68;
7272     }
7273   return regnum;
7274 }