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