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