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