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