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