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