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