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