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