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