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