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