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