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