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