* config/obj-elf.c (obj_elf_symver): Temporarily modify lex_type
[binutils.git] / gas / config / tc-ppc.c
blob621b6dbe3191e0d8deee58759e7badb436cd6d6a
1 /* tc-ppc.c -- Assemble for the PowerPC or POWER (RS/6000)
2 Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
3 Free Software Foundation, Inc.
4 Written by Ian Lance Taylor, Cygnus Support.
6 This file is part of GAS, the GNU Assembler.
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA. */
23 #include <stdio.h>
24 #include <ctype.h>
25 #include "as.h"
26 #include "subsegs.h"
28 #include "opcode/ppc.h"
30 #ifdef OBJ_ELF
31 #include "elf/ppc.h"
32 #include "dwarf2dbg.h"
33 #endif
35 #ifdef TE_PE
36 #include "coff/pe.h"
37 #endif
39 /* This is the assembler for the PowerPC or POWER (RS/6000) chips. */
41 /* Tell the main code what the endianness is. */
42 extern int target_big_endian;
44 /* Whether or not, we've set target_big_endian. */
45 static int set_target_endian = 0;
47 /* Whether to use user friendly register names. */
48 #ifndef TARGET_REG_NAMES_P
49 #ifdef TE_PE
50 #define TARGET_REG_NAMES_P true
51 #else
52 #define TARGET_REG_NAMES_P false
53 #endif
54 #endif
56 static boolean reg_names_p = TARGET_REG_NAMES_P;
58 static boolean register_name PARAMS ((expressionS *));
59 static void ppc_set_cpu PARAMS ((void));
60 static unsigned long ppc_insert_operand
61 PARAMS ((unsigned long insn, const struct powerpc_operand *operand,
62 offsetT val, char *file, unsigned int line));
63 static void ppc_macro PARAMS ((char *str, const struct powerpc_macro *macro));
64 static void ppc_byte PARAMS ((int));
65 static int ppc_is_toc_sym PARAMS ((symbolS *sym));
66 static void ppc_tc PARAMS ((int));
68 #ifdef OBJ_XCOFF
69 static void ppc_comm PARAMS ((int));
70 static void ppc_bb PARAMS ((int));
71 static void ppc_bc PARAMS ((int));
72 static void ppc_bf PARAMS ((int));
73 static void ppc_biei PARAMS ((int));
74 static void ppc_bs PARAMS ((int));
75 static void ppc_eb PARAMS ((int));
76 static void ppc_ec PARAMS ((int));
77 static void ppc_ef PARAMS ((int));
78 static void ppc_es PARAMS ((int));
79 static void ppc_csect PARAMS ((int));
80 static void ppc_change_csect PARAMS ((symbolS *));
81 static void ppc_function PARAMS ((int));
82 static void ppc_extern PARAMS ((int));
83 static void ppc_lglobl PARAMS ((int));
84 static void ppc_section PARAMS ((int));
85 static void ppc_named_section PARAMS ((int));
86 static void ppc_stabx PARAMS ((int));
87 static void ppc_rename PARAMS ((int));
88 static void ppc_toc PARAMS ((int));
89 static void ppc_xcoff_cons PARAMS ((int));
90 static void ppc_machine PARAMS ((int));
91 static void ppc_vbyte PARAMS ((int));
92 #endif
94 #ifdef OBJ_ELF
95 static bfd_reloc_code_real_type ppc_elf_suffix PARAMS ((char **, expressionS *));
96 static void ppc_elf_cons PARAMS ((int));
97 static void ppc_elf_rdata PARAMS ((int));
98 static void ppc_elf_lcomm PARAMS ((int));
99 static void ppc_elf_validate_fix PARAMS ((fixS *, segT));
100 #endif
102 #ifdef TE_PE
103 static void ppc_set_current_section PARAMS ((segT));
104 static void ppc_previous PARAMS ((int));
105 static void ppc_pdata PARAMS ((int));
106 static void ppc_ydata PARAMS ((int));
107 static void ppc_reldata PARAMS ((int));
108 static void ppc_rdata PARAMS ((int));
109 static void ppc_ualong PARAMS ((int));
110 static void ppc_znop PARAMS ((int));
111 static void ppc_pe_comm PARAMS ((int));
112 static void ppc_pe_section PARAMS ((int));
113 static void ppc_pe_function PARAMS ((int));
114 static void ppc_pe_tocd PARAMS ((int));
115 #endif
117 /* Generic assembler global variables which must be defined by all
118 targets. */
120 #ifdef OBJ_ELF
121 /* This string holds the chars that always start a comment. If the
122 pre-processor is disabled, these aren't very useful. The macro
123 tc_comment_chars points to this. We use this, rather than the
124 usual comment_chars, so that we can switch for Solaris conventions. */
125 static const char ppc_solaris_comment_chars[] = "#!";
126 static const char ppc_eabi_comment_chars[] = "#";
128 #ifdef TARGET_SOLARIS_COMMENT
129 const char *ppc_comment_chars = ppc_solaris_comment_chars;
130 #else
131 const char *ppc_comment_chars = ppc_eabi_comment_chars;
132 #endif
133 #else
134 const char comment_chars[] = "#";
135 #endif
137 /* Characters which start a comment at the beginning of a line. */
138 const char line_comment_chars[] = "#";
140 /* Characters which may be used to separate multiple commands on a
141 single line. */
142 const char line_separator_chars[] = ";";
144 /* Characters which are used to indicate an exponent in a floating
145 point number. */
146 const char EXP_CHARS[] = "eE";
148 /* Characters which mean that a number is a floating point constant,
149 as in 0d1.0. */
150 const char FLT_CHARS[] = "dD";
152 /* The target specific pseudo-ops which we support. */
154 const pseudo_typeS md_pseudo_table[] =
156 /* Pseudo-ops which must be overridden. */
157 { "byte", ppc_byte, 0 },
159 #ifdef OBJ_XCOFF
160 /* Pseudo-ops specific to the RS/6000 XCOFF format. Some of these
161 legitimately belong in the obj-*.c file. However, XCOFF is based
162 on COFF, and is only implemented for the RS/6000. We just use
163 obj-coff.c, and add what we need here. */
164 { "comm", ppc_comm, 0 },
165 { "lcomm", ppc_comm, 1 },
166 { "bb", ppc_bb, 0 },
167 { "bc", ppc_bc, 0 },
168 { "bf", ppc_bf, 0 },
169 { "bi", ppc_biei, 0 },
170 { "bs", ppc_bs, 0 },
171 { "csect", ppc_csect, 0 },
172 { "data", ppc_section, 'd' },
173 { "eb", ppc_eb, 0 },
174 { "ec", ppc_ec, 0 },
175 { "ef", ppc_ef, 0 },
176 { "ei", ppc_biei, 1 },
177 { "es", ppc_es, 0 },
178 { "extern", ppc_extern, 0 },
179 { "function", ppc_function, 0 },
180 { "lglobl", ppc_lglobl, 0 },
181 { "rename", ppc_rename, 0 },
182 { "section", ppc_named_section, 0 },
183 { "stabx", ppc_stabx, 0 },
184 { "text", ppc_section, 't' },
185 { "toc", ppc_toc, 0 },
186 { "long", ppc_xcoff_cons, 2 },
187 { "llong", ppc_xcoff_cons, 3 },
188 { "word", ppc_xcoff_cons, 1 },
189 { "short", ppc_xcoff_cons, 1 },
190 { "vbyte", ppc_vbyte, 0 },
191 { "machine", ppc_machine, 0 },
192 #endif
194 #ifdef OBJ_ELF
195 { "long", ppc_elf_cons, 4 },
196 { "word", ppc_elf_cons, 2 },
197 { "short", ppc_elf_cons, 2 },
198 { "rdata", ppc_elf_rdata, 0 },
199 { "rodata", ppc_elf_rdata, 0 },
200 { "lcomm", ppc_elf_lcomm, 0 },
201 { "file", dwarf2_directive_file, 0 },
202 { "loc", dwarf2_directive_loc, 0 },
203 #endif
205 #ifdef TE_PE
206 /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format. */
207 { "previous", ppc_previous, 0 },
208 { "pdata", ppc_pdata, 0 },
209 { "ydata", ppc_ydata, 0 },
210 { "reldata", ppc_reldata, 0 },
211 { "rdata", ppc_rdata, 0 },
212 { "ualong", ppc_ualong, 0 },
213 { "znop", ppc_znop, 0 },
214 { "comm", ppc_pe_comm, 0 },
215 { "lcomm", ppc_pe_comm, 1 },
216 { "section", ppc_pe_section, 0 },
217 { "function", ppc_pe_function,0 },
218 { "tocd", ppc_pe_tocd, 0 },
219 #endif
221 /* This pseudo-op is used even when not generating XCOFF output. */
222 { "tc", ppc_tc, 0 },
224 { NULL, NULL, 0 }
228 /* Predefined register names if -mregnames (or default for Windows NT).
229 In general, there are lots of them, in an attempt to be compatible
230 with a number of other Windows NT assemblers. */
232 /* Structure to hold information about predefined registers. */
233 struct pd_reg
235 char *name;
236 int value;
239 /* List of registers that are pre-defined:
241 Each general register has predefined names of the form:
242 1. r<reg_num> which has the value <reg_num>.
243 2. r.<reg_num> which has the value <reg_num>.
245 Each floating point register has predefined names of the form:
246 1. f<reg_num> which has the value <reg_num>.
247 2. f.<reg_num> which has the value <reg_num>.
249 Each vector unit register has predefined names of the form:
250 1. v<reg_num> which has the value <reg_num>.
251 2. v.<reg_num> which has the value <reg_num>.
253 Each condition register has predefined names of the form:
254 1. cr<reg_num> which has the value <reg_num>.
255 2. cr.<reg_num> which has the value <reg_num>.
257 There are individual registers as well:
258 sp or r.sp has the value 1
259 rtoc or r.toc has the value 2
260 fpscr has the value 0
261 xer has the value 1
262 lr has the value 8
263 ctr has the value 9
264 pmr has the value 0
265 dar has the value 19
266 dsisr has the value 18
267 dec has the value 22
268 sdr1 has the value 25
269 srr0 has the value 26
270 srr1 has the value 27
272 The table is sorted. Suitable for searching by a binary search. */
274 static const struct pd_reg pre_defined_registers[] =
276 { "cr.0", 0 }, /* Condition Registers */
277 { "cr.1", 1 },
278 { "cr.2", 2 },
279 { "cr.3", 3 },
280 { "cr.4", 4 },
281 { "cr.5", 5 },
282 { "cr.6", 6 },
283 { "cr.7", 7 },
285 { "cr0", 0 },
286 { "cr1", 1 },
287 { "cr2", 2 },
288 { "cr3", 3 },
289 { "cr4", 4 },
290 { "cr5", 5 },
291 { "cr6", 6 },
292 { "cr7", 7 },
294 { "ctr", 9 },
296 { "dar", 19 }, /* Data Access Register */
297 { "dec", 22 }, /* Decrementer */
298 { "dsisr", 18 }, /* Data Storage Interrupt Status Register */
300 { "f.0", 0 }, /* Floating point registers */
301 { "f.1", 1 },
302 { "f.10", 10 },
303 { "f.11", 11 },
304 { "f.12", 12 },
305 { "f.13", 13 },
306 { "f.14", 14 },
307 { "f.15", 15 },
308 { "f.16", 16 },
309 { "f.17", 17 },
310 { "f.18", 18 },
311 { "f.19", 19 },
312 { "f.2", 2 },
313 { "f.20", 20 },
314 { "f.21", 21 },
315 { "f.22", 22 },
316 { "f.23", 23 },
317 { "f.24", 24 },
318 { "f.25", 25 },
319 { "f.26", 26 },
320 { "f.27", 27 },
321 { "f.28", 28 },
322 { "f.29", 29 },
323 { "f.3", 3 },
324 { "f.30", 30 },
325 { "f.31", 31 },
326 { "f.4", 4 },
327 { "f.5", 5 },
328 { "f.6", 6 },
329 { "f.7", 7 },
330 { "f.8", 8 },
331 { "f.9", 9 },
333 { "f0", 0 },
334 { "f1", 1 },
335 { "f10", 10 },
336 { "f11", 11 },
337 { "f12", 12 },
338 { "f13", 13 },
339 { "f14", 14 },
340 { "f15", 15 },
341 { "f16", 16 },
342 { "f17", 17 },
343 { "f18", 18 },
344 { "f19", 19 },
345 { "f2", 2 },
346 { "f20", 20 },
347 { "f21", 21 },
348 { "f22", 22 },
349 { "f23", 23 },
350 { "f24", 24 },
351 { "f25", 25 },
352 { "f26", 26 },
353 { "f27", 27 },
354 { "f28", 28 },
355 { "f29", 29 },
356 { "f3", 3 },
357 { "f30", 30 },
358 { "f31", 31 },
359 { "f4", 4 },
360 { "f5", 5 },
361 { "f6", 6 },
362 { "f7", 7 },
363 { "f8", 8 },
364 { "f9", 9 },
366 { "fpscr", 0 },
368 { "lr", 8 }, /* Link Register */
370 { "pmr", 0 },
372 { "r.0", 0 }, /* General Purpose Registers */
373 { "r.1", 1 },
374 { "r.10", 10 },
375 { "r.11", 11 },
376 { "r.12", 12 },
377 { "r.13", 13 },
378 { "r.14", 14 },
379 { "r.15", 15 },
380 { "r.16", 16 },
381 { "r.17", 17 },
382 { "r.18", 18 },
383 { "r.19", 19 },
384 { "r.2", 2 },
385 { "r.20", 20 },
386 { "r.21", 21 },
387 { "r.22", 22 },
388 { "r.23", 23 },
389 { "r.24", 24 },
390 { "r.25", 25 },
391 { "r.26", 26 },
392 { "r.27", 27 },
393 { "r.28", 28 },
394 { "r.29", 29 },
395 { "r.3", 3 },
396 { "r.30", 30 },
397 { "r.31", 31 },
398 { "r.4", 4 },
399 { "r.5", 5 },
400 { "r.6", 6 },
401 { "r.7", 7 },
402 { "r.8", 8 },
403 { "r.9", 9 },
405 { "r.sp", 1 }, /* Stack Pointer */
407 { "r.toc", 2 }, /* Pointer to the table of contents */
409 { "r0", 0 }, /* More general purpose registers */
410 { "r1", 1 },
411 { "r10", 10 },
412 { "r11", 11 },
413 { "r12", 12 },
414 { "r13", 13 },
415 { "r14", 14 },
416 { "r15", 15 },
417 { "r16", 16 },
418 { "r17", 17 },
419 { "r18", 18 },
420 { "r19", 19 },
421 { "r2", 2 },
422 { "r20", 20 },
423 { "r21", 21 },
424 { "r22", 22 },
425 { "r23", 23 },
426 { "r24", 24 },
427 { "r25", 25 },
428 { "r26", 26 },
429 { "r27", 27 },
430 { "r28", 28 },
431 { "r29", 29 },
432 { "r3", 3 },
433 { "r30", 30 },
434 { "r31", 31 },
435 { "r4", 4 },
436 { "r5", 5 },
437 { "r6", 6 },
438 { "r7", 7 },
439 { "r8", 8 },
440 { "r9", 9 },
442 { "rtoc", 2 }, /* Table of contents */
444 { "sdr1", 25 }, /* Storage Description Register 1 */
446 { "sp", 1 },
448 { "srr0", 26 }, /* Machine Status Save/Restore Register 0 */
449 { "srr1", 27 }, /* Machine Status Save/Restore Register 1 */
451 { "v.0", 0 }, /* Vector registers */
452 { "v.1", 1 },
453 { "v.10", 10 },
454 { "v.11", 11 },
455 { "v.12", 12 },
456 { "v.13", 13 },
457 { "v.14", 14 },
458 { "v.15", 15 },
459 { "v.16", 16 },
460 { "v.17", 17 },
461 { "v.18", 18 },
462 { "v.19", 19 },
463 { "v.2", 2 },
464 { "v.20", 20 },
465 { "v.21", 21 },
466 { "v.22", 22 },
467 { "v.23", 23 },
468 { "v.24", 24 },
469 { "v.25", 25 },
470 { "v.26", 26 },
471 { "v.27", 27 },
472 { "v.28", 28 },
473 { "v.29", 29 },
474 { "v.3", 3 },
475 { "v.30", 30 },
476 { "v.31", 31 },
477 { "v.4", 4 },
478 { "v.5", 5 },
479 { "v.6", 6 },
480 { "v.7", 7 },
481 { "v.8", 8 },
482 { "v.9", 9 },
484 { "v0", 0 },
485 { "v1", 1 },
486 { "v10", 10 },
487 { "v11", 11 },
488 { "v12", 12 },
489 { "v13", 13 },
490 { "v14", 14 },
491 { "v15", 15 },
492 { "v16", 16 },
493 { "v17", 17 },
494 { "v18", 18 },
495 { "v19", 19 },
496 { "v2", 2 },
497 { "v20", 20 },
498 { "v21", 21 },
499 { "v22", 22 },
500 { "v23", 23 },
501 { "v24", 24 },
502 { "v25", 25 },
503 { "v26", 26 },
504 { "v27", 27 },
505 { "v28", 28 },
506 { "v29", 29 },
507 { "v3", 3 },
508 { "v30", 30 },
509 { "v31", 31 },
510 { "v4", 4 },
511 { "v5", 5 },
512 { "v6", 6 },
513 { "v7", 7 },
514 { "v8", 8 },
515 { "v9", 9 },
517 { "xer", 1 },
521 #define REG_NAME_CNT (sizeof (pre_defined_registers) / sizeof (struct pd_reg))
523 /* Given NAME, find the register number associated with that name, return
524 the integer value associated with the given name or -1 on failure. */
526 static int reg_name_search
527 PARAMS ((const struct pd_reg *, int, const char * name));
529 static int
530 reg_name_search (regs, regcount, name)
531 const struct pd_reg *regs;
532 int regcount;
533 const char *name;
535 int middle, low, high;
536 int cmp;
538 low = 0;
539 high = regcount - 1;
543 middle = (low + high) / 2;
544 cmp = strcasecmp (name, regs[middle].name);
545 if (cmp < 0)
546 high = middle - 1;
547 else if (cmp > 0)
548 low = middle + 1;
549 else
550 return regs[middle].value;
552 while (low <= high);
554 return -1;
558 * Summary of register_name.
560 * in: Input_line_pointer points to 1st char of operand.
562 * out: A expressionS.
563 * The operand may have been a register: in this case, X_op == O_register,
564 * X_add_number is set to the register number, and truth is returned.
565 * Input_line_pointer->(next non-blank) char after operand, or is in its
566 * original state.
569 static boolean
570 register_name (expressionP)
571 expressionS *expressionP;
573 int reg_number;
574 char *name;
575 char *start;
576 char c;
578 /* Find the spelling of the operand. */
579 start = name = input_line_pointer;
580 if (name[0] == '%' && isalpha (name[1]))
581 name = ++input_line_pointer;
583 else if (!reg_names_p || !isalpha (name[0]))
584 return false;
586 c = get_symbol_end ();
587 reg_number = reg_name_search (pre_defined_registers, REG_NAME_CNT, name);
589 /* Put back the delimiting char. */
590 *input_line_pointer = c;
592 /* Look to see if it's in the register table. */
593 if (reg_number >= 0)
595 expressionP->X_op = O_register;
596 expressionP->X_add_number = reg_number;
598 /* Make the rest nice. */
599 expressionP->X_add_symbol = NULL;
600 expressionP->X_op_symbol = NULL;
601 return true;
604 /* Reset the line as if we had not done anything. */
605 input_line_pointer = start;
606 return false;
609 /* This function is called for each symbol seen in an expression. It
610 handles the special parsing which PowerPC assemblers are supposed
611 to use for condition codes. */
613 /* Whether to do the special parsing. */
614 static boolean cr_operand;
616 /* Names to recognize in a condition code. This table is sorted. */
617 static const struct pd_reg cr_names[] =
619 { "cr0", 0 },
620 { "cr1", 1 },
621 { "cr2", 2 },
622 { "cr3", 3 },
623 { "cr4", 4 },
624 { "cr5", 5 },
625 { "cr6", 6 },
626 { "cr7", 7 },
627 { "eq", 2 },
628 { "gt", 1 },
629 { "lt", 0 },
630 { "so", 3 },
631 { "un", 3 }
634 /* Parsing function. This returns non-zero if it recognized an
635 expression. */
638 ppc_parse_name (name, expr)
639 const char *name;
640 expressionS *expr;
642 int val;
644 if (! cr_operand)
645 return 0;
647 val = reg_name_search (cr_names, sizeof cr_names / sizeof cr_names[0],
648 name);
649 if (val < 0)
650 return 0;
652 expr->X_op = O_constant;
653 expr->X_add_number = val;
655 return 1;
658 /* Local variables. */
660 /* The type of processor we are assembling for. This is one or more
661 of the PPC_OPCODE flags defined in opcode/ppc.h. */
662 static int ppc_cpu = 0;
664 /* The size of the processor we are assembling for. This is either
665 PPC_OPCODE_32 or PPC_OPCODE_64. */
666 static unsigned long ppc_size = PPC_OPCODE_32;
668 /* Whether to target xcoff64. */
669 static int ppc_xcoff64 = 0;
671 /* Opcode hash table. */
672 static struct hash_control *ppc_hash;
674 /* Macro hash table. */
675 static struct hash_control *ppc_macro_hash;
677 #ifdef OBJ_ELF
678 /* What type of shared library support to use. */
679 static enum { SHLIB_NONE, SHLIB_PIC, SHLIB_MRELOCATABLE } shlib = SHLIB_NONE;
681 /* Flags to set in the elf header. */
682 static flagword ppc_flags = 0;
684 /* Whether this is Solaris or not. */
685 #ifdef TARGET_SOLARIS_COMMENT
686 #define SOLARIS_P true
687 #else
688 #define SOLARIS_P false
689 #endif
691 static boolean msolaris = SOLARIS_P;
692 #endif
694 #ifdef OBJ_XCOFF
696 /* The RS/6000 assembler uses the .csect pseudo-op to generate code
697 using a bunch of different sections. These assembler sections,
698 however, are all encompassed within the .text or .data sections of
699 the final output file. We handle this by using different
700 subsegments within these main segments. */
702 /* Next subsegment to allocate within the .text segment. */
703 static subsegT ppc_text_subsegment = 2;
705 /* Linked list of csects in the text section. */
706 static symbolS *ppc_text_csects;
708 /* Next subsegment to allocate within the .data segment. */
709 static subsegT ppc_data_subsegment = 2;
711 /* Linked list of csects in the data section. */
712 static symbolS *ppc_data_csects;
714 /* The current csect. */
715 static symbolS *ppc_current_csect;
717 /* The RS/6000 assembler uses a TOC which holds addresses of functions
718 and variables. Symbols are put in the TOC with the .tc pseudo-op.
719 A special relocation is used when accessing TOC entries. We handle
720 the TOC as a subsegment within the .data segment. We set it up if
721 we see a .toc pseudo-op, and save the csect symbol here. */
722 static symbolS *ppc_toc_csect;
724 /* The first frag in the TOC subsegment. */
725 static fragS *ppc_toc_frag;
727 /* The first frag in the first subsegment after the TOC in the .data
728 segment. NULL if there are no subsegments after the TOC. */
729 static fragS *ppc_after_toc_frag;
731 /* The current static block. */
732 static symbolS *ppc_current_block;
734 /* The COFF debugging section; set by md_begin. This is not the
735 .debug section, but is instead the secret BFD section which will
736 cause BFD to set the section number of a symbol to N_DEBUG. */
737 static asection *ppc_coff_debug_section;
739 #endif /* OBJ_XCOFF */
741 #ifdef TE_PE
743 /* Various sections that we need for PE coff support. */
744 static segT ydata_section;
745 static segT pdata_section;
746 static segT reldata_section;
747 static segT rdata_section;
748 static segT tocdata_section;
750 /* The current section and the previous section. See ppc_previous. */
751 static segT ppc_previous_section;
752 static segT ppc_current_section;
754 #endif /* TE_PE */
756 #ifdef OBJ_ELF
757 symbolS *GOT_symbol; /* Pre-defined "_GLOBAL_OFFSET_TABLE" */
758 #endif /* OBJ_ELF */
760 #ifdef OBJ_ELF
761 CONST char *md_shortopts = "b:l:usm:K:VQ:";
762 #else
763 CONST char *md_shortopts = "um:";
764 #endif
765 struct option md_longopts[] = {
766 {NULL, no_argument, NULL, 0}
768 size_t md_longopts_size = sizeof (md_longopts);
771 md_parse_option (c, arg)
772 int c;
773 char *arg;
775 switch (c)
777 case 'u':
778 /* -u means that any undefined symbols should be treated as
779 external, which is the default for gas anyhow. */
780 break;
782 #ifdef OBJ_ELF
783 case 'l':
784 /* Solaris as takes -le (presumably for little endian). For completeness
785 sake, recognize -be also. */
786 if (strcmp (arg, "e") == 0)
788 target_big_endian = 0;
789 set_target_endian = 1;
791 else
792 return 0;
794 break;
796 case 'b':
797 if (strcmp (arg, "e") == 0)
799 target_big_endian = 1;
800 set_target_endian = 1;
802 else
803 return 0;
805 break;
807 case 'K':
808 /* Recognize -K PIC. */
809 if (strcmp (arg, "PIC") == 0 || strcmp (arg, "pic") == 0)
811 shlib = SHLIB_PIC;
812 ppc_flags |= EF_PPC_RELOCATABLE_LIB;
814 else
815 return 0;
817 break;
818 #endif
820 /* a64 and a32 determine whether to use XCOFF64 or XCOFF32. */
821 case 'a':
822 if (strcmp (arg, "64") == 0)
823 ppc_xcoff64 = 1;
824 else if (strcmp (arg, "32") == 0)
825 ppc_xcoff64 = 0;
826 else
827 return 0;
828 break;
830 case 'm':
831 /* -mpwrx and -mpwr2 mean to assemble for the IBM POWER/2
832 (RIOS2). */
833 if (strcmp (arg, "pwrx") == 0 || strcmp (arg, "pwr2") == 0)
834 ppc_cpu = PPC_OPCODE_POWER | PPC_OPCODE_POWER2;
835 /* -mpwr means to assemble for the IBM POWER (RIOS1). */
836 else if (strcmp (arg, "pwr") == 0)
837 ppc_cpu = PPC_OPCODE_POWER;
838 /* -m601 means to assemble for the Motorola PowerPC 601, which includes
839 instructions that are holdovers from the Power. */
840 else if (strcmp (arg, "601") == 0)
841 ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_601;
842 /* -mppc, -mppc32, -m603, and -m604 mean to assemble for the
843 Motorola PowerPC 603/604. */
844 else if (strcmp (arg, "ppc") == 0
845 || strcmp (arg, "ppc32") == 0
846 || strcmp (arg, "403") == 0
847 || strcmp (arg, "405") == 0
848 || strcmp (arg, "603") == 0
849 || strcmp (arg, "604") == 0)
850 ppc_cpu = PPC_OPCODE_PPC;
851 else if (strcmp (arg, "7400") == 0)
852 ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_ALTIVEC;
853 /* -mppc64 and -m620 mean to assemble for the 64-bit PowerPC
854 620. */
855 else if (strcmp (arg, "ppc64") == 0 || strcmp (arg, "620") == 0)
857 ppc_cpu = PPC_OPCODE_PPC;
858 ppc_size = PPC_OPCODE_64;
860 else if (strcmp (arg, "ppc64bridge") == 0)
862 ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_64_BRIDGE;
863 ppc_size = PPC_OPCODE_64;
865 /* -mcom means assemble for the common intersection between Power
866 and PowerPC. At present, we just allow the union, rather
867 than the intersection. */
868 else if (strcmp (arg, "com") == 0)
869 ppc_cpu = PPC_OPCODE_COMMON;
870 /* -many means to assemble for any architecture (PWR/PWRX/PPC). */
871 else if (strcmp (arg, "any") == 0)
872 ppc_cpu = PPC_OPCODE_ANY;
874 else if (strcmp (arg, "regnames") == 0)
875 reg_names_p = true;
877 else if (strcmp (arg, "no-regnames") == 0)
878 reg_names_p = false;
880 #ifdef OBJ_ELF
881 /* -mrelocatable/-mrelocatable-lib -- warn about initializations
882 that require relocation. */
883 else if (strcmp (arg, "relocatable") == 0)
885 shlib = SHLIB_MRELOCATABLE;
886 ppc_flags |= EF_PPC_RELOCATABLE;
889 else if (strcmp (arg, "relocatable-lib") == 0)
891 shlib = SHLIB_MRELOCATABLE;
892 ppc_flags |= EF_PPC_RELOCATABLE_LIB;
895 /* -memb, set embedded bit. */
896 else if (strcmp (arg, "emb") == 0)
897 ppc_flags |= EF_PPC_EMB;
899 /* -mlittle/-mbig set the endianess. */
900 else if (strcmp (arg, "little") == 0
901 || strcmp (arg, "little-endian") == 0)
903 target_big_endian = 0;
904 set_target_endian = 1;
907 else if (strcmp (arg, "big") == 0 || strcmp (arg, "big-endian") == 0)
909 target_big_endian = 1;
910 set_target_endian = 1;
913 else if (strcmp (arg, "solaris") == 0)
915 msolaris = true;
916 ppc_comment_chars = ppc_solaris_comment_chars;
919 else if (strcmp (arg, "no-solaris") == 0)
921 msolaris = false;
922 ppc_comment_chars = ppc_eabi_comment_chars;
924 #endif
925 else
927 as_bad (_("invalid switch -m%s"), arg);
928 return 0;
930 break;
932 #ifdef OBJ_ELF
933 /* -V: SVR4 argument to print version ID. */
934 case 'V':
935 print_version_id ();
936 break;
938 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
939 should be emitted or not. FIXME: Not implemented. */
940 case 'Q':
941 break;
943 /* Solaris takes -s to specify that .stabs go in a .stabs section,
944 rather than .stabs.excl, which is ignored by the linker.
945 FIXME: Not implemented. */
946 case 's':
947 if (arg)
948 return 0;
950 break;
951 #endif
953 default:
954 return 0;
957 return 1;
960 void
961 md_show_usage (stream)
962 FILE *stream;
964 fprintf (stream, _("\
965 PowerPC options:\n\
966 -u ignored\n\
967 -mpwrx, -mpwr2 generate code for IBM POWER/2 (RIOS2)\n\
968 -mpwr generate code for IBM POWER (RIOS1)\n\
969 -m601 generate code for Motorola PowerPC 601\n\
970 -mppc, -mppc32, -m403, -m405, -m603, -m604\n\
971 generate code for Motorola PowerPC 603/604\n\
972 -mppc64, -m620 generate code for Motorola PowerPC 620\n\
973 -mppc64bridge generate code for PowerPC 64, including bridge insns\n\
974 -mcom generate code Power/PowerPC common instructions\n\
975 -many generate code for any architecture (PWR/PWRX/PPC)\n\
976 -mregnames Allow symbolic names for registers\n\
977 -mno-regnames Do not allow symbolic names for registers\n"));
978 #ifdef OBJ_ELF
979 fprintf (stream, _("\
980 -mrelocatable support for GCC's -mrelocatble option\n\
981 -mrelocatable-lib support for GCC's -mrelocatble-lib option\n\
982 -memb set PPC_EMB bit in ELF flags\n\
983 -mlittle, -mlittle-endian\n\
984 generate code for a little endian machine\n\
985 -mbig, -mbig-endian generate code for a big endian machine\n\
986 -msolaris generate code for Solaris\n\
987 -mno-solaris do not generate code for Solaris\n\
988 -V print assembler version number\n\
989 -Qy, -Qn ignored\n"));
990 #endif
993 /* Set ppc_cpu if it is not already set. */
995 static void
996 ppc_set_cpu ()
998 const char *default_os = TARGET_OS;
999 const char *default_cpu = TARGET_CPU;
1001 if (ppc_cpu == 0)
1003 if (strncmp (default_os, "aix", 3) == 0
1004 && default_os[3] >= '4' && default_os[3] <= '9')
1005 ppc_cpu = PPC_OPCODE_COMMON;
1006 else if (strncmp (default_os, "aix3", 4) == 0)
1007 ppc_cpu = PPC_OPCODE_POWER;
1008 else if (strcmp (default_cpu, "rs6000") == 0)
1009 ppc_cpu = PPC_OPCODE_POWER;
1010 else if (strcmp (default_cpu, "powerpc") == 0
1011 || strcmp (default_cpu, "powerpcle") == 0)
1012 ppc_cpu = PPC_OPCODE_PPC;
1013 else
1014 as_fatal (_("Unknown default cpu = %s, os = %s"),
1015 default_cpu, default_os);
1019 /* Figure out the BFD architecture to use. */
1021 enum bfd_architecture
1022 ppc_arch ()
1024 const char *default_cpu = TARGET_CPU;
1025 ppc_set_cpu ();
1027 if ((ppc_cpu & PPC_OPCODE_PPC) != 0)
1028 return bfd_arch_powerpc;
1029 else if ((ppc_cpu & PPC_OPCODE_POWER) != 0)
1030 return bfd_arch_rs6000;
1031 else if ((ppc_cpu & (PPC_OPCODE_COMMON | PPC_OPCODE_ANY)) != 0)
1033 if (strcmp (default_cpu, "rs6000") == 0)
1034 return bfd_arch_rs6000;
1035 else if (strcmp (default_cpu, "powerpc") == 0
1036 || strcmp (default_cpu, "powerpcle") == 0)
1037 return bfd_arch_powerpc;
1040 as_fatal (_("Neither Power nor PowerPC opcodes were selected."));
1041 return bfd_arch_unknown;
1044 unsigned long
1045 ppc_mach ()
1047 return ppc_size == PPC_OPCODE_64 ? 620 : 0;
1051 ppc_subseg_align ()
1053 return ppc_xcoff64 ? 3 : 2;
1056 extern char*
1057 ppc_target_format ()
1059 #ifdef OBJ_COFF
1060 #ifdef TE_PE
1061 return target_big_endian ? "pe-powerpc" : "pe-powerpcle";
1062 #elif TE_POWERMAC
1063 #else
1064 return ppc_xcoff64 ? "aixcoff64-rs6000" : "aixcoff-rs6000";
1065 #endif
1066 #ifdef TE_POWERMAC
1067 return "xcoff-powermac";
1068 #endif
1069 #endif
1070 #ifdef OBJ_ELF
1071 return target_big_endian ? "elf32-powerpc" : "elf32-powerpcle";
1072 #endif
1075 /* This function is called when the assembler starts up. It is called
1076 after the options have been parsed and the output file has been
1077 opened. */
1079 void
1080 md_begin ()
1082 register const struct powerpc_opcode *op;
1083 const struct powerpc_opcode *op_end;
1084 const struct powerpc_macro *macro;
1085 const struct powerpc_macro *macro_end;
1086 boolean dup_insn = false;
1088 ppc_set_cpu ();
1090 #ifdef OBJ_ELF
1091 /* Set the ELF flags if desired. */
1092 if (ppc_flags && !msolaris)
1093 bfd_set_private_flags (stdoutput, ppc_flags);
1094 #endif
1096 /* Insert the opcodes into a hash table. */
1097 ppc_hash = hash_new ();
1099 op_end = powerpc_opcodes + powerpc_num_opcodes;
1100 for (op = powerpc_opcodes; op < op_end; op++)
1102 know ((op->opcode & op->mask) == op->opcode);
1104 if ((op->flags & ppc_cpu) != 0
1105 && ((op->flags & (PPC_OPCODE_32 | PPC_OPCODE_64)) == 0
1106 || (op->flags & (PPC_OPCODE_32 | PPC_OPCODE_64)) == ppc_size
1107 || (ppc_cpu & PPC_OPCODE_64_BRIDGE) != 0))
1109 const char *retval;
1111 retval = hash_insert (ppc_hash, op->name, (PTR) op);
1112 if (retval != (const char *) NULL)
1114 /* Ignore Power duplicates for -m601. */
1115 if ((ppc_cpu & PPC_OPCODE_601) != 0
1116 && (op->flags & PPC_OPCODE_POWER) != 0)
1117 continue;
1119 as_bad (_("Internal assembler error for instruction %s"),
1120 op->name);
1121 dup_insn = true;
1126 /* Insert the macros into a hash table. */
1127 ppc_macro_hash = hash_new ();
1129 macro_end = powerpc_macros + powerpc_num_macros;
1130 for (macro = powerpc_macros; macro < macro_end; macro++)
1132 if ((macro->flags & ppc_cpu) != 0)
1134 const char *retval;
1136 retval = hash_insert (ppc_macro_hash, macro->name, (PTR) macro);
1137 if (retval != (const char *) NULL)
1139 as_bad (_("Internal assembler error for macro %s"), macro->name);
1140 dup_insn = true;
1145 if (dup_insn)
1146 abort ();
1148 /* Tell the main code what the endianness is if it is not overidden
1149 by the user. */
1150 if (!set_target_endian)
1152 set_target_endian = 1;
1153 target_big_endian = PPC_BIG_ENDIAN;
1156 #ifdef OBJ_XCOFF
1157 ppc_coff_debug_section = coff_section_from_bfd_index (stdoutput, N_DEBUG);
1159 /* Create dummy symbols to serve as initial csects. This forces the
1160 text csects to precede the data csects. These symbols will not
1161 be output. */
1162 ppc_text_csects = symbol_make ("dummy\001");
1163 symbol_get_tc (ppc_text_csects)->within = ppc_text_csects;
1164 ppc_data_csects = symbol_make ("dummy\001");
1165 symbol_get_tc (ppc_data_csects)->within = ppc_data_csects;
1166 #endif
1168 #ifdef TE_PE
1170 ppc_current_section = text_section;
1171 ppc_previous_section = 0;
1173 #endif
1176 /* Insert an operand value into an instruction. */
1178 static unsigned long
1179 ppc_insert_operand (insn, operand, val, file, line)
1180 unsigned long insn;
1181 const struct powerpc_operand *operand;
1182 offsetT val;
1183 char *file;
1184 unsigned int line;
1186 if (operand->bits != 32)
1188 long min, max;
1189 offsetT test;
1191 if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
1193 if ((operand->flags & PPC_OPERAND_SIGNOPT) != 0)
1194 max = (1 << operand->bits) - 1;
1195 else
1196 max = (1 << (operand->bits - 1)) - 1;
1197 min = - (1 << (operand->bits - 1));
1199 if (ppc_size == PPC_OPCODE_32)
1201 /* Some people write 32 bit hex constants with the sign
1202 extension done by hand. This shouldn't really be
1203 valid, but, to permit this code to assemble on a 64
1204 bit host, we sign extend the 32 bit value. */
1205 if (val > 0
1206 && (val & (offsetT) 0x80000000) != 0
1207 && (val & (offsetT) 0xffffffff) == val)
1209 val -= 0x80000000;
1210 val -= 0x80000000;
1214 else
1216 max = (1 << operand->bits) - 1;
1217 min = 0;
1220 if ((operand->flags & PPC_OPERAND_NEGATIVE) != 0)
1221 test = - val;
1222 else
1223 test = val;
1225 if (test < (offsetT) min || test > (offsetT) max)
1227 const char *err =
1228 _("operand out of range (%s not between %ld and %ld)");
1229 char buf[100];
1231 sprint_value (buf, test);
1232 if (file == (char *) NULL)
1233 as_bad (err, buf, min, max);
1234 else
1235 as_bad_where (file, line, err, buf, min, max);
1239 if (operand->insert)
1241 const char *errmsg;
1243 errmsg = NULL;
1244 insn = (*operand->insert) (insn, (long) val, &errmsg);
1245 if (errmsg != (const char *) NULL)
1246 as_bad (errmsg);
1248 else
1249 insn |= (((long) val & ((1 << operand->bits) - 1))
1250 << operand->shift);
1252 return insn;
1256 #ifdef OBJ_ELF
1257 /* Parse @got, etc. and return the desired relocation. */
1258 static bfd_reloc_code_real_type
1259 ppc_elf_suffix (str_p, exp_p)
1260 char **str_p;
1261 expressionS *exp_p;
1263 struct map_bfd {
1264 char *string;
1265 int length;
1266 bfd_reloc_code_real_type reloc;
1269 char ident[20];
1270 char *str = *str_p;
1271 char *str2;
1272 int ch;
1273 int len;
1274 struct map_bfd *ptr;
1276 #define MAP(str,reloc) { str, sizeof (str)-1, reloc }
1278 static struct map_bfd mapping[] = {
1279 MAP ("l", BFD_RELOC_LO16),
1280 MAP ("h", BFD_RELOC_HI16),
1281 MAP ("ha", BFD_RELOC_HI16_S),
1282 MAP ("brtaken", BFD_RELOC_PPC_B16_BRTAKEN),
1283 MAP ("brntaken", BFD_RELOC_PPC_B16_BRNTAKEN),
1284 MAP ("got", BFD_RELOC_16_GOTOFF),
1285 MAP ("got@l", BFD_RELOC_LO16_GOTOFF),
1286 MAP ("got@h", BFD_RELOC_HI16_GOTOFF),
1287 MAP ("got@ha", BFD_RELOC_HI16_S_GOTOFF),
1288 MAP ("fixup", BFD_RELOC_CTOR), /* warnings with -mrelocatable */
1289 MAP ("plt", BFD_RELOC_24_PLT_PCREL),
1290 MAP ("pltrel24", BFD_RELOC_24_PLT_PCREL),
1291 MAP ("copy", BFD_RELOC_PPC_COPY),
1292 MAP ("globdat", BFD_RELOC_PPC_GLOB_DAT),
1293 MAP ("local24pc", BFD_RELOC_PPC_LOCAL24PC),
1294 MAP ("local", BFD_RELOC_PPC_LOCAL24PC),
1295 MAP ("pltrel", BFD_RELOC_32_PLT_PCREL),
1296 MAP ("plt@l", BFD_RELOC_LO16_PLTOFF),
1297 MAP ("plt@h", BFD_RELOC_HI16_PLTOFF),
1298 MAP ("plt@ha", BFD_RELOC_HI16_S_PLTOFF),
1299 MAP ("sdarel", BFD_RELOC_GPREL16),
1300 MAP ("sectoff", BFD_RELOC_32_BASEREL),
1301 MAP ("sectoff@l", BFD_RELOC_LO16_BASEREL),
1302 MAP ("sectoff@h", BFD_RELOC_HI16_BASEREL),
1303 MAP ("sectoff@ha", BFD_RELOC_HI16_S_BASEREL),
1304 MAP ("naddr", BFD_RELOC_PPC_EMB_NADDR32),
1305 MAP ("naddr16", BFD_RELOC_PPC_EMB_NADDR16),
1306 MAP ("naddr@l", BFD_RELOC_PPC_EMB_NADDR16_LO),
1307 MAP ("naddr@h", BFD_RELOC_PPC_EMB_NADDR16_HI),
1308 MAP ("naddr@ha", BFD_RELOC_PPC_EMB_NADDR16_HA),
1309 MAP ("sdai16", BFD_RELOC_PPC_EMB_SDAI16),
1310 MAP ("sda2rel", BFD_RELOC_PPC_EMB_SDA2REL),
1311 MAP ("sda2i16", BFD_RELOC_PPC_EMB_SDA2I16),
1312 MAP ("sda21", BFD_RELOC_PPC_EMB_SDA21),
1313 MAP ("mrkref", BFD_RELOC_PPC_EMB_MRKREF),
1314 MAP ("relsect", BFD_RELOC_PPC_EMB_RELSEC16),
1315 MAP ("relsect@l", BFD_RELOC_PPC_EMB_RELST_LO),
1316 MAP ("relsect@h", BFD_RELOC_PPC_EMB_RELST_HI),
1317 MAP ("relsect@ha", BFD_RELOC_PPC_EMB_RELST_HA),
1318 MAP ("bitfld", BFD_RELOC_PPC_EMB_BIT_FLD),
1319 MAP ("relsda", BFD_RELOC_PPC_EMB_RELSDA),
1320 MAP ("xgot", BFD_RELOC_PPC_TOC16),
1322 { (char *) 0, 0, BFD_RELOC_UNUSED }
1325 if (*str++ != '@')
1326 return BFD_RELOC_UNUSED;
1328 for (ch = *str, str2 = ident;
1329 (str2 < ident + sizeof (ident) - 1
1330 && (isalnum (ch) || ch == '@'));
1331 ch = *++str)
1333 *str2++ = (islower (ch)) ? ch : tolower (ch);
1336 *str2 = '\0';
1337 len = str2 - ident;
1339 ch = ident[0];
1340 for (ptr = &mapping[0]; ptr->length > 0; ptr++)
1341 if (ch == ptr->string[0]
1342 && len == ptr->length
1343 && memcmp (ident, ptr->string, ptr->length) == 0)
1345 if (exp_p->X_add_number != 0
1346 && (ptr->reloc == BFD_RELOC_16_GOTOFF
1347 || ptr->reloc == BFD_RELOC_LO16_GOTOFF
1348 || ptr->reloc == BFD_RELOC_HI16_GOTOFF
1349 || ptr->reloc == BFD_RELOC_HI16_S_GOTOFF))
1350 as_warn (_("identifier+constant@got means identifier@got+constant"));
1352 /* Now check for identifier@suffix+constant. */
1353 if (*str == '-' || *str == '+')
1355 char *orig_line = input_line_pointer;
1356 expressionS new_exp;
1358 input_line_pointer = str;
1359 expression (&new_exp);
1360 if (new_exp.X_op == O_constant)
1362 exp_p->X_add_number += new_exp.X_add_number;
1363 str = input_line_pointer;
1366 if (&input_line_pointer != str_p)
1367 input_line_pointer = orig_line;
1370 *str_p = str;
1371 return ptr->reloc;
1374 return BFD_RELOC_UNUSED;
1377 /* Like normal .long/.short/.word, except support @got, etc.
1378 Clobbers input_line_pointer, checks end-of-line. */
1379 static void
1380 ppc_elf_cons (nbytes)
1381 register int nbytes; /* 1=.byte, 2=.word, 4=.long */
1383 expressionS exp;
1384 bfd_reloc_code_real_type reloc;
1386 if (is_it_end_of_statement ())
1388 demand_empty_rest_of_line ();
1389 return;
1394 expression (&exp);
1395 if (exp.X_op == O_symbol
1396 && *input_line_pointer == '@'
1397 && (reloc = ppc_elf_suffix (&input_line_pointer,
1398 &exp)) != BFD_RELOC_UNUSED)
1400 reloc_howto_type *reloc_howto;
1401 int size;
1403 reloc_howto = bfd_reloc_type_lookup (stdoutput, reloc);
1404 size = bfd_get_reloc_size (reloc_howto);
1406 if (size > nbytes)
1407 as_bad (_("%s relocations do not fit in %d bytes\n"),
1408 reloc_howto->name, nbytes);
1410 else
1412 register char *p = frag_more ((int) nbytes);
1413 int offset = nbytes - size;
1415 fix_new_exp (frag_now, p - frag_now->fr_literal + offset, size,
1416 &exp, 0, reloc);
1419 else
1420 emit_expr (&exp, (unsigned int) nbytes);
1422 while (*input_line_pointer++ == ',');
1424 /* Put terminator back into stream. */
1425 input_line_pointer--;
1426 demand_empty_rest_of_line ();
1429 /* Solaris pseduo op to change to the .rodata section. */
1430 static void
1431 ppc_elf_rdata (xxx)
1432 int xxx;
1434 char *save_line = input_line_pointer;
1435 static char section[] = ".rodata\n";
1437 /* Just pretend this is .section .rodata */
1438 input_line_pointer = section;
1439 obj_elf_section (xxx);
1441 input_line_pointer = save_line;
1444 /* Pseudo op to make file scope bss items. */
1445 static void
1446 ppc_elf_lcomm (xxx)
1447 int xxx ATTRIBUTE_UNUSED;
1449 register char *name;
1450 register char c;
1451 register char *p;
1452 offsetT size;
1453 register symbolS *symbolP;
1454 offsetT align;
1455 segT old_sec;
1456 int old_subsec;
1457 char *pfrag;
1458 int align2;
1460 name = input_line_pointer;
1461 c = get_symbol_end ();
1463 /* just after name is now '\0'. */
1464 p = input_line_pointer;
1465 *p = c;
1466 SKIP_WHITESPACE ();
1467 if (*input_line_pointer != ',')
1469 as_bad (_("Expected comma after symbol-name: rest of line ignored."));
1470 ignore_rest_of_line ();
1471 return;
1474 input_line_pointer++; /* skip ',' */
1475 if ((size = get_absolute_expression ()) < 0)
1477 as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) size);
1478 ignore_rest_of_line ();
1479 return;
1482 /* The third argument to .lcomm is the alignment. */
1483 if (*input_line_pointer != ',')
1484 align = 8;
1485 else
1487 ++input_line_pointer;
1488 align = get_absolute_expression ();
1489 if (align <= 0)
1491 as_warn (_("ignoring bad alignment"));
1492 align = 8;
1496 *p = 0;
1497 symbolP = symbol_find_or_make (name);
1498 *p = c;
1500 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
1502 as_bad (_("Ignoring attempt to re-define symbol `%s'."),
1503 S_GET_NAME (symbolP));
1504 ignore_rest_of_line ();
1505 return;
1508 if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size)
1510 as_bad (_("Length of .lcomm \"%s\" is already %ld. Not changed to %ld."),
1511 S_GET_NAME (symbolP),
1512 (long) S_GET_VALUE (symbolP),
1513 (long) size);
1515 ignore_rest_of_line ();
1516 return;
1519 /* Allocate_bss. */
1520 old_sec = now_seg;
1521 old_subsec = now_subseg;
1522 if (align)
1524 /* Convert to a power of 2 alignment. */
1525 for (align2 = 0; (align & 1) == 0; align >>= 1, ++align2);
1526 if (align != 1)
1528 as_bad (_("Common alignment not a power of 2"));
1529 ignore_rest_of_line ();
1530 return;
1533 else
1534 align2 = 0;
1536 record_alignment (bss_section, align2);
1537 subseg_set (bss_section, 0);
1538 if (align2)
1539 frag_align (align2, 0, 0);
1540 if (S_GET_SEGMENT (symbolP) == bss_section)
1541 symbol_get_frag (symbolP)->fr_symbol = 0;
1542 symbol_set_frag (symbolP, frag_now);
1543 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, size,
1544 (char *) 0);
1545 *pfrag = 0;
1546 S_SET_SIZE (symbolP, size);
1547 S_SET_SEGMENT (symbolP, bss_section);
1548 subseg_set (old_sec, old_subsec);
1549 demand_empty_rest_of_line ();
1552 /* Validate any relocations emitted for -mrelocatable, possibly adding
1553 fixups for word relocations in writable segments, so we can adjust
1554 them at runtime. */
1555 static void
1556 ppc_elf_validate_fix (fixp, seg)
1557 fixS *fixp;
1558 segT seg;
1560 if (fixp->fx_done || fixp->fx_pcrel)
1561 return;
1563 switch (shlib)
1565 case SHLIB_NONE:
1566 case SHLIB_PIC:
1567 return;
1569 case SHLIB_MRELOCATABLE:
1570 if (fixp->fx_r_type <= BFD_RELOC_UNUSED
1571 && fixp->fx_r_type != BFD_RELOC_16_GOTOFF
1572 && fixp->fx_r_type != BFD_RELOC_HI16_GOTOFF
1573 && fixp->fx_r_type != BFD_RELOC_LO16_GOTOFF
1574 && fixp->fx_r_type != BFD_RELOC_HI16_S_GOTOFF
1575 && fixp->fx_r_type != BFD_RELOC_32_BASEREL
1576 && fixp->fx_r_type != BFD_RELOC_LO16_BASEREL
1577 && fixp->fx_r_type != BFD_RELOC_HI16_BASEREL
1578 && fixp->fx_r_type != BFD_RELOC_HI16_S_BASEREL
1579 && strcmp (segment_name (seg), ".got2") != 0
1580 && strcmp (segment_name (seg), ".dtors") != 0
1581 && strcmp (segment_name (seg), ".ctors") != 0
1582 && strcmp (segment_name (seg), ".fixup") != 0
1583 && strcmp (segment_name (seg), ".stab") != 0
1584 && strcmp (segment_name (seg), ".gcc_except_table") != 0
1585 && strcmp (segment_name (seg), ".eh_frame") != 0
1586 && strcmp (segment_name (seg), ".ex_shared") != 0)
1588 if ((seg->flags & (SEC_READONLY | SEC_CODE)) != 0
1589 || fixp->fx_r_type != BFD_RELOC_CTOR)
1591 as_bad_where (fixp->fx_file, fixp->fx_line,
1592 _("Relocation cannot be done when using -mrelocatable"));
1595 return;
1598 #endif /* OBJ_ELF */
1600 #ifdef TE_PE
1603 * Summary of parse_toc_entry.
1605 * in: Input_line_pointer points to the '[' in one of:
1607 * [toc] [tocv] [toc32] [toc64]
1609 * Anything else is an error of one kind or another.
1611 * out:
1612 * return value: success or failure
1613 * toc_kind: kind of toc reference
1614 * input_line_pointer:
1615 * success: first char after the ']'
1616 * failure: unchanged
1618 * settings:
1620 * [toc] - rv == success, toc_kind = default_toc
1621 * [tocv] - rv == success, toc_kind = data_in_toc
1622 * [toc32] - rv == success, toc_kind = must_be_32
1623 * [toc64] - rv == success, toc_kind = must_be_64
1627 enum toc_size_qualifier
1629 default_toc, /* The toc cell constructed should be the system default size */
1630 data_in_toc, /* This is a direct reference to a toc cell */
1631 must_be_32, /* The toc cell constructed must be 32 bits wide */
1632 must_be_64 /* The toc cell constructed must be 64 bits wide */
1635 static int
1636 parse_toc_entry (toc_kind)
1637 enum toc_size_qualifier *toc_kind;
1639 char *start;
1640 char *toc_spec;
1641 char c;
1642 enum toc_size_qualifier t;
1644 /* Save the input_line_pointer. */
1645 start = input_line_pointer;
1647 /* Skip over the '[' , and whitespace. */
1648 ++input_line_pointer;
1649 SKIP_WHITESPACE ();
1651 /* Find the spelling of the operand. */
1652 toc_spec = input_line_pointer;
1653 c = get_symbol_end ();
1655 if (strcmp (toc_spec, "toc") == 0)
1657 t = default_toc;
1659 else if (strcmp (toc_spec, "tocv") == 0)
1661 t = data_in_toc;
1663 else if (strcmp (toc_spec, "toc32") == 0)
1665 t = must_be_32;
1667 else if (strcmp (toc_spec, "toc64") == 0)
1669 t = must_be_64;
1671 else
1673 as_bad (_("syntax error: invalid toc specifier `%s'"), toc_spec);
1674 *input_line_pointer = c;
1675 input_line_pointer = start;
1676 return 0;
1679 /* Now find the ']'. */
1680 *input_line_pointer = c;
1682 SKIP_WHITESPACE (); /* leading whitespace could be there. */
1683 c = *input_line_pointer++; /* input_line_pointer->past char in c. */
1685 if (c != ']')
1687 as_bad (_("syntax error: expected `]', found `%c'"), c);
1688 input_line_pointer = start;
1689 return 0;
1692 *toc_kind = t;
1693 return 1;
1695 #endif
1698 /* We need to keep a list of fixups. We can't simply generate them as
1699 we go, because that would require us to first create the frag, and
1700 that would screw up references to ``.''. */
1702 struct ppc_fixup
1704 expressionS exp;
1705 int opindex;
1706 bfd_reloc_code_real_type reloc;
1709 #define MAX_INSN_FIXUPS (5)
1711 /* This routine is called for each instruction to be assembled. */
1713 void
1714 md_assemble (str)
1715 char *str;
1717 char *s;
1718 const struct powerpc_opcode *opcode;
1719 unsigned long insn;
1720 const unsigned char *opindex_ptr;
1721 int skip_optional;
1722 int need_paren;
1723 int next_opindex;
1724 struct ppc_fixup fixups[MAX_INSN_FIXUPS];
1725 int fc;
1726 char *f;
1727 int i;
1728 #ifdef OBJ_ELF
1729 bfd_reloc_code_real_type reloc;
1730 #endif
1732 /* Get the opcode. */
1733 for (s = str; *s != '\0' && ! isspace (*s); s++)
1735 if (*s != '\0')
1736 *s++ = '\0';
1738 /* Look up the opcode in the hash table. */
1739 opcode = (const struct powerpc_opcode *) hash_find (ppc_hash, str);
1740 if (opcode == (const struct powerpc_opcode *) NULL)
1742 const struct powerpc_macro *macro;
1744 macro = (const struct powerpc_macro *) hash_find (ppc_macro_hash, str);
1745 if (macro == (const struct powerpc_macro *) NULL)
1746 as_bad (_("Unrecognized opcode: `%s'"), str);
1747 else
1748 ppc_macro (s, macro);
1750 return;
1753 insn = opcode->opcode;
1755 str = s;
1756 while (isspace (*str))
1757 ++str;
1759 /* PowerPC operands are just expressions. The only real issue is
1760 that a few operand types are optional. All cases which might use
1761 an optional operand separate the operands only with commas (in
1762 some cases parentheses are used, as in ``lwz 1,0(1)'' but such
1763 cases never have optional operands). There is never more than
1764 one optional operand for an instruction. So, before we start
1765 seriously parsing the operands, we check to see if we have an
1766 optional operand, and, if we do, we count the number of commas to
1767 see whether the operand should be omitted. */
1768 skip_optional = 0;
1769 for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
1771 const struct powerpc_operand *operand;
1773 operand = &powerpc_operands[*opindex_ptr];
1774 if ((operand->flags & PPC_OPERAND_OPTIONAL) != 0)
1776 unsigned int opcount;
1778 /* There is an optional operand. Count the number of
1779 commas in the input line. */
1780 if (*str == '\0')
1781 opcount = 0;
1782 else
1784 opcount = 1;
1785 s = str;
1786 while ((s = strchr (s, ',')) != (char *) NULL)
1788 ++opcount;
1789 ++s;
1793 /* If there are fewer operands in the line then are called
1794 for by the instruction, we want to skip the optional
1795 operand. */
1796 if (opcount < strlen (opcode->operands))
1797 skip_optional = 1;
1799 break;
1803 /* Gather the operands. */
1804 need_paren = 0;
1805 next_opindex = 0;
1806 fc = 0;
1807 for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
1809 const struct powerpc_operand *operand;
1810 const char *errmsg;
1811 char *hold;
1812 expressionS ex;
1813 char endc;
1815 if (next_opindex == 0)
1816 operand = &powerpc_operands[*opindex_ptr];
1817 else
1819 operand = &powerpc_operands[next_opindex];
1820 next_opindex = 0;
1823 errmsg = NULL;
1825 /* If this is a fake operand, then we do not expect anything
1826 from the input. */
1827 if ((operand->flags & PPC_OPERAND_FAKE) != 0)
1829 insn = (*operand->insert) (insn, 0L, &errmsg);
1830 if (errmsg != (const char *) NULL)
1831 as_bad (errmsg);
1832 continue;
1835 /* If this is an optional operand, and we are skipping it, just
1836 insert a zero. */
1837 if ((operand->flags & PPC_OPERAND_OPTIONAL) != 0
1838 && skip_optional)
1840 if (operand->insert)
1842 insn = (*operand->insert) (insn, 0L, &errmsg);
1843 if (errmsg != (const char *) NULL)
1844 as_bad (errmsg);
1846 if ((operand->flags & PPC_OPERAND_NEXT) != 0)
1847 next_opindex = *opindex_ptr + 1;
1848 continue;
1851 /* Gather the operand. */
1852 hold = input_line_pointer;
1853 input_line_pointer = str;
1855 #ifdef TE_PE
1856 if (*input_line_pointer == '[')
1858 /* We are expecting something like the second argument here:
1860 * lwz r4,[toc].GS.0.static_int(rtoc)
1861 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^
1862 * The argument following the `]' must be a symbol name, and the
1863 * register must be the toc register: 'rtoc' or '2'
1865 * The effect is to 0 as the displacement field
1866 * in the instruction, and issue an IMAGE_REL_PPC_TOCREL16 (or
1867 * the appropriate variation) reloc against it based on the symbol.
1868 * The linker will build the toc, and insert the resolved toc offset.
1870 * Note:
1871 * o The size of the toc entry is currently assumed to be
1872 * 32 bits. This should not be assumed to be a hard coded
1873 * number.
1874 * o In an effort to cope with a change from 32 to 64 bits,
1875 * there are also toc entries that are specified to be
1876 * either 32 or 64 bits:
1877 * lwz r4,[toc32].GS.0.static_int(rtoc)
1878 * lwz r4,[toc64].GS.0.static_int(rtoc)
1879 * These demand toc entries of the specified size, and the
1880 * instruction probably requires it.
1883 int valid_toc;
1884 enum toc_size_qualifier toc_kind;
1885 bfd_reloc_code_real_type toc_reloc;
1887 /* Go parse off the [tocXX] part. */
1888 valid_toc = parse_toc_entry (&toc_kind);
1890 if (!valid_toc)
1892 /* Note: message has already been issued.
1893 FIXME: what sort of recovery should we do?
1894 demand_rest_of_line (); return; ? */
1897 /* Now get the symbol following the ']'. */
1898 expression (&ex);
1900 switch (toc_kind)
1902 case default_toc:
1903 /* In this case, we may not have seen the symbol yet,
1904 since it is allowed to appear on a .extern or .globl
1905 or just be a label in the .data section. */
1906 toc_reloc = BFD_RELOC_PPC_TOC16;
1907 break;
1908 case data_in_toc:
1909 /* 1. The symbol must be defined and either in the toc
1910 section, or a global.
1911 2. The reloc generated must have the TOCDEFN flag set
1912 in upper bit mess of the reloc type.
1913 FIXME: It's a little confusing what the tocv
1914 qualifier can be used for. At the very least, I've
1915 seen three uses, only one of which I'm sure I can
1916 explain. */
1917 if (ex.X_op == O_symbol)
1919 assert (ex.X_add_symbol != NULL);
1920 if (symbol_get_bfdsym (ex.X_add_symbol)->section
1921 != tocdata_section)
1923 as_bad (_("[tocv] symbol is not a toc symbol"));
1927 toc_reloc = BFD_RELOC_PPC_TOC16;
1928 break;
1929 case must_be_32:
1930 /* FIXME: these next two specifically specify 32/64 bit
1931 toc entries. We don't support them today. Is this
1932 the right way to say that? */
1933 toc_reloc = BFD_RELOC_UNUSED;
1934 as_bad (_("Unimplemented toc32 expression modifier"));
1935 break;
1936 case must_be_64:
1937 /* FIXME: see above. */
1938 toc_reloc = BFD_RELOC_UNUSED;
1939 as_bad (_("Unimplemented toc64 expression modifier"));
1940 break;
1941 default:
1942 fprintf (stderr,
1943 _("Unexpected return value [%d] from parse_toc_entry!\n"),
1944 toc_kind);
1945 abort ();
1946 break;
1949 /* We need to generate a fixup for this expression. */
1950 if (fc >= MAX_INSN_FIXUPS)
1951 as_fatal (_("too many fixups"));
1953 fixups[fc].reloc = toc_reloc;
1954 fixups[fc].exp = ex;
1955 fixups[fc].opindex = *opindex_ptr;
1956 ++fc;
1958 /* Ok. We've set up the fixup for the instruction. Now make it
1959 look like the constant 0 was found here. */
1960 ex.X_unsigned = 1;
1961 ex.X_op = O_constant;
1962 ex.X_add_number = 0;
1963 ex.X_add_symbol = NULL;
1964 ex.X_op_symbol = NULL;
1967 else
1968 #endif /* TE_PE */
1970 if (! register_name (&ex))
1972 if ((operand->flags & PPC_OPERAND_CR) != 0)
1973 cr_operand = true;
1974 expression (&ex);
1975 cr_operand = false;
1979 str = input_line_pointer;
1980 input_line_pointer = hold;
1982 if (ex.X_op == O_illegal)
1983 as_bad (_("illegal operand"));
1984 else if (ex.X_op == O_absent)
1985 as_bad (_("missing operand"));
1986 else if (ex.X_op == O_register)
1988 insn = ppc_insert_operand (insn, operand, ex.X_add_number,
1989 (char *) NULL, 0);
1991 else if (ex.X_op == O_constant)
1993 #ifdef OBJ_ELF
1994 /* Allow @HA, @L, @H on constants. */
1995 char *orig_str = str;
1997 if ((reloc = ppc_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED)
1998 switch (reloc)
2000 default:
2001 str = orig_str;
2002 break;
2004 case BFD_RELOC_LO16:
2005 /* X_unsigned is the default, so if the user has done
2006 something which cleared it, we always produce a
2007 signed value. */
2008 if (ex.X_unsigned
2009 && (operand->flags & PPC_OPERAND_SIGNED) == 0)
2010 ex.X_add_number &= 0xffff;
2011 else
2012 ex.X_add_number = (((ex.X_add_number & 0xffff)
2013 ^ 0x8000)
2014 - 0x8000);
2015 break;
2017 case BFD_RELOC_HI16:
2018 ex.X_add_number = (ex.X_add_number >> 16) & 0xffff;
2019 break;
2021 case BFD_RELOC_HI16_S:
2022 ex.X_add_number = ((((ex.X_add_number >> 16) & 0xffff)
2023 + ((ex.X_add_number >> 15) & 1))
2024 & 0xffff);
2025 break;
2027 #endif
2028 insn = ppc_insert_operand (insn, operand, ex.X_add_number,
2029 (char *) NULL, 0);
2031 #ifdef OBJ_ELF
2032 else if ((reloc = ppc_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED)
2034 /* For the absolute forms of branches, convert the PC
2035 relative form back into the absolute. */
2036 if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0)
2038 switch (reloc)
2040 case BFD_RELOC_PPC_B26:
2041 reloc = BFD_RELOC_PPC_BA26;
2042 break;
2043 case BFD_RELOC_PPC_B16:
2044 reloc = BFD_RELOC_PPC_BA16;
2045 break;
2046 case BFD_RELOC_PPC_B16_BRTAKEN:
2047 reloc = BFD_RELOC_PPC_BA16_BRTAKEN;
2048 break;
2049 case BFD_RELOC_PPC_B16_BRNTAKEN:
2050 reloc = BFD_RELOC_PPC_BA16_BRNTAKEN;
2051 break;
2052 default:
2053 break;
2057 /* We need to generate a fixup for this expression. */
2058 if (fc >= MAX_INSN_FIXUPS)
2059 as_fatal (_("too many fixups"));
2060 fixups[fc].exp = ex;
2061 fixups[fc].opindex = 0;
2062 fixups[fc].reloc = reloc;
2063 ++fc;
2065 #endif /* OBJ_ELF */
2067 else
2069 /* We need to generate a fixup for this expression. */
2070 if (fc >= MAX_INSN_FIXUPS)
2071 as_fatal (_("too many fixups"));
2072 fixups[fc].exp = ex;
2073 fixups[fc].opindex = *opindex_ptr;
2074 fixups[fc].reloc = BFD_RELOC_UNUSED;
2075 ++fc;
2078 if (need_paren)
2080 endc = ')';
2081 need_paren = 0;
2083 else if ((operand->flags & PPC_OPERAND_PARENS) != 0)
2085 endc = '(';
2086 need_paren = 1;
2088 else
2089 endc = ',';
2091 /* The call to expression should have advanced str past any
2092 whitespace. */
2093 if (*str != endc
2094 && (endc != ',' || *str != '\0'))
2096 as_bad (_("syntax error; found `%c' but expected `%c'"), *str, endc);
2097 break;
2100 if (*str != '\0')
2101 ++str;
2104 while (isspace (*str))
2105 ++str;
2107 if (*str != '\0')
2108 as_bad (_("junk at end of line: `%s'"), str);
2110 /* Write out the instruction. */
2111 f = frag_more (4);
2112 md_number_to_chars (f, insn, 4);
2114 #ifdef OBJ_ELF
2115 dwarf2_emit_insn (4);
2116 #endif
2118 /* Create any fixups. At this point we do not use a
2119 bfd_reloc_code_real_type, but instead just use the
2120 BFD_RELOC_UNUSED plus the operand index. This lets us easily
2121 handle fixups for any operand type, although that is admittedly
2122 not a very exciting feature. We pick a BFD reloc type in
2123 md_apply_fix. */
2124 for (i = 0; i < fc; i++)
2126 const struct powerpc_operand *operand;
2128 operand = &powerpc_operands[fixups[i].opindex];
2129 if (fixups[i].reloc != BFD_RELOC_UNUSED)
2131 reloc_howto_type *reloc_howto;
2132 int size;
2133 int offset;
2134 fixS *fixP;
2136 reloc_howto = bfd_reloc_type_lookup (stdoutput, fixups[i].reloc);
2137 if (!reloc_howto)
2138 abort ();
2140 size = bfd_get_reloc_size (reloc_howto);
2141 offset = target_big_endian ? (4 - size) : 0;
2143 if (size < 1 || size > 4)
2144 abort ();
2146 fixP = fix_new_exp (frag_now,
2147 f - frag_now->fr_literal + offset,
2148 size,
2149 &fixups[i].exp,
2150 reloc_howto->pc_relative,
2151 fixups[i].reloc);
2153 /* Turn off complaints that the addend is too large for things like
2154 foo+100000@ha. */
2155 switch (fixups[i].reloc)
2157 case BFD_RELOC_16_GOTOFF:
2158 case BFD_RELOC_PPC_TOC16:
2159 case BFD_RELOC_LO16:
2160 case BFD_RELOC_HI16:
2161 case BFD_RELOC_HI16_S:
2162 fixP->fx_no_overflow = 1;
2163 break;
2164 default:
2165 break;
2168 else
2169 fix_new_exp (frag_now,
2170 f - frag_now->fr_literal,
2172 &fixups[i].exp,
2173 (operand->flags & PPC_OPERAND_RELATIVE) != 0,
2174 ((bfd_reloc_code_real_type)
2175 (fixups[i].opindex + (int) BFD_RELOC_UNUSED)));
2179 /* Handle a macro. Gather all the operands, transform them as
2180 described by the macro, and call md_assemble recursively. All the
2181 operands are separated by commas; we don't accept parentheses
2182 around operands here. */
2184 static void
2185 ppc_macro (str, macro)
2186 char *str;
2187 const struct powerpc_macro *macro;
2189 char *operands[10];
2190 unsigned int count;
2191 char *s;
2192 unsigned int len;
2193 const char *format;
2194 int arg;
2195 char *send;
2196 char *complete;
2198 /* Gather the users operands into the operands array. */
2199 count = 0;
2200 s = str;
2201 while (1)
2203 if (count >= sizeof operands / sizeof operands[0])
2204 break;
2205 operands[count++] = s;
2206 s = strchr (s, ',');
2207 if (s == (char *) NULL)
2208 break;
2209 *s++ = '\0';
2212 if (count != macro->operands)
2214 as_bad (_("wrong number of operands"));
2215 return;
2218 /* Work out how large the string must be (the size is unbounded
2219 because it includes user input). */
2220 len = 0;
2221 format = macro->format;
2222 while (*format != '\0')
2224 if (*format != '%')
2226 ++len;
2227 ++format;
2229 else
2231 arg = strtol (format + 1, &send, 10);
2232 know (send != format && arg >= 0 && arg < count);
2233 len += strlen (operands[arg]);
2234 format = send;
2238 /* Put the string together. */
2239 complete = s = (char *) alloca (len + 1);
2240 format = macro->format;
2241 while (*format != '\0')
2243 if (*format != '%')
2244 *s++ = *format++;
2245 else
2247 arg = strtol (format + 1, &send, 10);
2248 strcpy (s, operands[arg]);
2249 s += strlen (s);
2250 format = send;
2253 *s = '\0';
2255 /* Assemble the constructed instruction. */
2256 md_assemble (complete);
2259 #ifdef OBJ_ELF
2260 /* For ELF, add support for SHF_EXCLUDE and SHT_ORDERED. */
2263 ppc_section_letter (letter, ptr_msg)
2264 int letter;
2265 char **ptr_msg;
2267 if (letter == 'e')
2268 return SHF_EXCLUDE;
2270 *ptr_msg = _("Bad .section directive: want a,w,x,e in string");
2271 return 0;
2275 ppc_section_word (str, len)
2276 char *str;
2277 size_t len;
2279 if (len == 7 && strncmp (str, "exclude", 7) == 0)
2280 return SHF_EXCLUDE;
2282 return -1;
2286 ppc_section_type (str, len)
2287 char *str;
2288 size_t len;
2290 if (len == 7 && strncmp (str, "ordered", 7) == 0)
2291 return SHT_ORDERED;
2293 return -1;
2297 ppc_section_flags (flags, attr, type)
2298 int flags;
2299 int attr;
2300 int type;
2302 if (type == SHT_ORDERED)
2303 flags |= SEC_ALLOC | SEC_LOAD | SEC_SORT_ENTRIES;
2305 if (attr & SHF_EXCLUDE)
2306 flags |= SEC_EXCLUDE;
2308 return flags;
2310 #endif /* OBJ_ELF */
2313 /* Pseudo-op handling. */
2315 /* The .byte pseudo-op. This is similar to the normal .byte
2316 pseudo-op, but it can also take a single ASCII string. */
2318 static void
2319 ppc_byte (ignore)
2320 int ignore ATTRIBUTE_UNUSED;
2322 if (*input_line_pointer != '\"')
2324 cons (1);
2325 return;
2328 /* Gather characters. A real double quote is doubled. Unusual
2329 characters are not permitted. */
2330 ++input_line_pointer;
2331 while (1)
2333 char c;
2335 c = *input_line_pointer++;
2337 if (c == '\"')
2339 if (*input_line_pointer != '\"')
2340 break;
2341 ++input_line_pointer;
2344 FRAG_APPEND_1_CHAR (c);
2347 demand_empty_rest_of_line ();
2350 #ifdef OBJ_XCOFF
2352 /* XCOFF specific pseudo-op handling. */
2354 /* This is set if we are creating a .stabx symbol, since we don't want
2355 to handle symbol suffixes for such symbols. */
2356 static boolean ppc_stab_symbol;
2358 /* The .comm and .lcomm pseudo-ops for XCOFF. XCOFF puts common
2359 symbols in the .bss segment as though they were local common
2360 symbols, and uses a different smclas. The native Aix 4.3.3 assember
2361 aligns .comm and .lcomm to 4 bytes. */
2363 static void
2364 ppc_comm (lcomm)
2365 int lcomm;
2367 asection *current_seg = now_seg;
2368 subsegT current_subseg = now_subseg;
2369 char *name;
2370 char endc;
2371 char *end_name;
2372 offsetT size;
2373 offsetT align;
2374 symbolS *lcomm_sym = NULL;
2375 symbolS *sym;
2376 char *pfrag;
2378 name = input_line_pointer;
2379 endc = get_symbol_end ();
2380 end_name = input_line_pointer;
2381 *end_name = endc;
2383 if (*input_line_pointer != ',')
2385 as_bad (_("missing size"));
2386 ignore_rest_of_line ();
2387 return;
2389 ++input_line_pointer;
2391 size = get_absolute_expression ();
2392 if (size < 0)
2394 as_bad (_("negative size"));
2395 ignore_rest_of_line ();
2396 return;
2399 if (! lcomm)
2401 /* The third argument to .comm is the alignment. */
2402 if (*input_line_pointer != ',')
2403 align = 2;
2404 else
2406 ++input_line_pointer;
2407 align = get_absolute_expression ();
2408 if (align <= 0)
2410 as_warn (_("ignoring bad alignment"));
2411 align = 2;
2415 else
2417 char *lcomm_name;
2418 char lcomm_endc;
2420 if (size <= 4)
2421 align = 2;
2422 else
2423 align = 3;
2425 /* The third argument to .lcomm appears to be the real local
2426 common symbol to create. References to the symbol named in
2427 the first argument are turned into references to the third
2428 argument. */
2429 if (*input_line_pointer != ',')
2431 as_bad (_("missing real symbol name"));
2432 ignore_rest_of_line ();
2433 return;
2435 ++input_line_pointer;
2437 lcomm_name = input_line_pointer;
2438 lcomm_endc = get_symbol_end ();
2440 lcomm_sym = symbol_find_or_make (lcomm_name);
2442 *input_line_pointer = lcomm_endc;
2445 *end_name = '\0';
2446 sym = symbol_find_or_make (name);
2447 *end_name = endc;
2449 if (S_IS_DEFINED (sym)
2450 || S_GET_VALUE (sym) != 0)
2452 as_bad (_("attempt to redefine symbol"));
2453 ignore_rest_of_line ();
2454 return;
2457 record_alignment (bss_section, align);
2459 if (! lcomm
2460 || ! S_IS_DEFINED (lcomm_sym))
2462 symbolS *def_sym;
2463 offsetT def_size;
2465 if (! lcomm)
2467 def_sym = sym;
2468 def_size = size;
2469 S_SET_EXTERNAL (sym);
2471 else
2473 symbol_get_tc (lcomm_sym)->output = 1;
2474 def_sym = lcomm_sym;
2475 def_size = 0;
2478 subseg_set (bss_section, 1);
2479 frag_align (align, 0, 0);
2481 symbol_set_frag (def_sym, frag_now);
2482 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, def_sym,
2483 def_size, (char *) NULL);
2484 *pfrag = 0;
2485 S_SET_SEGMENT (def_sym, bss_section);
2486 symbol_get_tc (def_sym)->align = align;
2488 else if (lcomm)
2490 /* Align the size of lcomm_sym. */
2491 symbol_get_frag (lcomm_sym)->fr_offset =
2492 ((symbol_get_frag (lcomm_sym)->fr_offset + (1 << align) - 1)
2493 &~ ((1 << align) - 1));
2494 if (align > symbol_get_tc (lcomm_sym)->align)
2495 symbol_get_tc (lcomm_sym)->align = align;
2498 if (lcomm)
2500 /* Make sym an offset from lcomm_sym. */
2501 S_SET_SEGMENT (sym, bss_section);
2502 symbol_set_frag (sym, symbol_get_frag (lcomm_sym));
2503 S_SET_VALUE (sym, symbol_get_frag (lcomm_sym)->fr_offset);
2504 symbol_get_frag (lcomm_sym)->fr_offset += size;
2507 subseg_set (current_seg, current_subseg);
2509 demand_empty_rest_of_line ();
2512 /* The .csect pseudo-op. This switches us into a different
2513 subsegment. The first argument is a symbol whose value is the
2514 start of the .csect. In COFF, csect symbols get special aux
2515 entries defined by the x_csect field of union internal_auxent. The
2516 optional second argument is the alignment (the default is 2). */
2518 static void
2519 ppc_csect (ignore)
2520 int ignore ATTRIBUTE_UNUSED;
2522 char *name;
2523 char endc;
2524 symbolS *sym;
2526 name = input_line_pointer;
2527 endc = get_symbol_end ();
2529 sym = symbol_find_or_make (name);
2531 *input_line_pointer = endc;
2533 if (S_GET_NAME (sym)[0] == '\0')
2535 /* An unnamed csect is assumed to be [PR]. */
2536 symbol_get_tc (sym)->class = XMC_PR;
2539 ppc_change_csect (sym);
2541 if (*input_line_pointer == ',')
2543 ++input_line_pointer;
2544 symbol_get_tc (sym)->align = get_absolute_expression ();
2547 demand_empty_rest_of_line ();
2550 /* Change to a different csect. */
2552 static void
2553 ppc_change_csect (sym)
2554 symbolS *sym;
2556 if (S_IS_DEFINED (sym))
2557 subseg_set (S_GET_SEGMENT (sym), symbol_get_tc (sym)->subseg);
2558 else
2560 symbolS **list_ptr;
2561 int after_toc;
2562 int hold_chunksize;
2563 symbolS *list;
2565 /* This is a new csect. We need to look at the symbol class to
2566 figure out whether it should go in the text section or the
2567 data section. */
2568 after_toc = 0;
2569 switch (symbol_get_tc (sym)->class)
2571 case XMC_PR:
2572 case XMC_RO:
2573 case XMC_DB:
2574 case XMC_GL:
2575 case XMC_XO:
2576 case XMC_SV:
2577 case XMC_TI:
2578 case XMC_TB:
2579 S_SET_SEGMENT (sym, text_section);
2580 symbol_get_tc (sym)->subseg = ppc_text_subsegment;
2581 ++ppc_text_subsegment;
2582 list_ptr = &ppc_text_csects;
2583 break;
2584 case XMC_RW:
2585 case XMC_TC0:
2586 case XMC_TC:
2587 case XMC_DS:
2588 case XMC_UA:
2589 case XMC_BS:
2590 case XMC_UC:
2591 if (ppc_toc_csect != NULL
2592 && (symbol_get_tc (ppc_toc_csect)->subseg + 1
2593 == ppc_data_subsegment))
2594 after_toc = 1;
2595 S_SET_SEGMENT (sym, data_section);
2596 symbol_get_tc (sym)->subseg = ppc_data_subsegment;
2597 ++ppc_data_subsegment;
2598 list_ptr = &ppc_data_csects;
2599 break;
2600 default:
2601 abort ();
2604 /* We set the obstack chunk size to a small value before
2605 changing subsegments, so that we don't use a lot of memory
2606 space for what may be a small section. */
2607 hold_chunksize = chunksize;
2608 chunksize = 64;
2610 subseg_new (segment_name (S_GET_SEGMENT (sym)),
2611 symbol_get_tc (sym)->subseg);
2613 chunksize = hold_chunksize;
2615 if (after_toc)
2616 ppc_after_toc_frag = frag_now;
2618 symbol_set_frag (sym, frag_now);
2619 S_SET_VALUE (sym, (valueT) frag_now_fix ());
2621 symbol_get_tc (sym)->align = (ppc_xcoff64) ? 3 : 2;
2622 symbol_get_tc (sym)->output = 1;
2623 symbol_get_tc (sym)->within = sym;
2625 for (list = *list_ptr;
2626 symbol_get_tc (list)->next != (symbolS *) NULL;
2627 list = symbol_get_tc (list)->next)
2629 symbol_get_tc (list)->next = sym;
2631 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
2632 symbol_append (sym, symbol_get_tc (list)->within, &symbol_rootP,
2633 &symbol_lastP);
2636 ppc_current_csect = sym;
2639 /* This function handles the .text and .data pseudo-ops. These
2640 pseudo-ops aren't really used by XCOFF; we implement them for the
2641 convenience of people who aren't used to XCOFF. */
2643 static void
2644 ppc_section (type)
2645 int type;
2647 const char *name;
2648 symbolS *sym;
2650 if (type == 't')
2651 name = ".text[PR]";
2652 else if (type == 'd')
2653 name = ".data[RW]";
2654 else
2655 abort ();
2657 sym = symbol_find_or_make (name);
2659 ppc_change_csect (sym);
2661 demand_empty_rest_of_line ();
2664 /* This function handles the .section pseudo-op. This is mostly to
2665 give an error, since XCOFF only supports .text, .data and .bss, but
2666 we do permit the user to name the text or data section. */
2668 static void
2669 ppc_named_section (ignore)
2670 int ignore ATTRIBUTE_UNUSED;
2672 char *user_name;
2673 const char *real_name;
2674 char c;
2675 symbolS *sym;
2677 user_name = input_line_pointer;
2678 c = get_symbol_end ();
2680 if (strcmp (user_name, ".text") == 0)
2681 real_name = ".text[PR]";
2682 else if (strcmp (user_name, ".data") == 0)
2683 real_name = ".data[RW]";
2684 else
2686 as_bad (_("The XCOFF file format does not support arbitrary sections"));
2687 *input_line_pointer = c;
2688 ignore_rest_of_line ();
2689 return;
2692 *input_line_pointer = c;
2694 sym = symbol_find_or_make (real_name);
2696 ppc_change_csect (sym);
2698 demand_empty_rest_of_line ();
2701 /* The .extern pseudo-op. We create an undefined symbol. */
2703 static void
2704 ppc_extern (ignore)
2705 int ignore ATTRIBUTE_UNUSED;
2707 char *name;
2708 char endc;
2710 name = input_line_pointer;
2711 endc = get_symbol_end ();
2713 (void) symbol_find_or_make (name);
2715 *input_line_pointer = endc;
2717 demand_empty_rest_of_line ();
2720 /* The .lglobl pseudo-op. Keep the symbol in the symbol table. */
2722 static void
2723 ppc_lglobl (ignore)
2724 int ignore ATTRIBUTE_UNUSED;
2726 char *name;
2727 char endc;
2728 symbolS *sym;
2730 name = input_line_pointer;
2731 endc = get_symbol_end ();
2733 sym = symbol_find_or_make (name);
2735 *input_line_pointer = endc;
2737 symbol_get_tc (sym)->output = 1;
2739 demand_empty_rest_of_line ();
2742 /* The .rename pseudo-op. The RS/6000 assembler can rename symbols,
2743 although I don't know why it bothers. */
2745 static void
2746 ppc_rename (ignore)
2747 int ignore ATTRIBUTE_UNUSED;
2749 char *name;
2750 char endc;
2751 symbolS *sym;
2752 int len;
2754 name = input_line_pointer;
2755 endc = get_symbol_end ();
2757 sym = symbol_find_or_make (name);
2759 *input_line_pointer = endc;
2761 if (*input_line_pointer != ',')
2763 as_bad (_("missing rename string"));
2764 ignore_rest_of_line ();
2765 return;
2767 ++input_line_pointer;
2769 symbol_get_tc (sym)->real_name = demand_copy_C_string (&len);
2771 demand_empty_rest_of_line ();
2774 /* The .stabx pseudo-op. This is similar to a normal .stabs
2775 pseudo-op, but slightly different. A sample is
2776 .stabx "main:F-1",.main,142,0
2777 The first argument is the symbol name to create. The second is the
2778 value, and the third is the storage class. The fourth seems to be
2779 always zero, and I am assuming it is the type. */
2781 static void
2782 ppc_stabx (ignore)
2783 int ignore ATTRIBUTE_UNUSED;
2785 char *name;
2786 int len;
2787 symbolS *sym;
2788 expressionS exp;
2790 name = demand_copy_C_string (&len);
2792 if (*input_line_pointer != ',')
2794 as_bad (_("missing value"));
2795 return;
2797 ++input_line_pointer;
2799 ppc_stab_symbol = true;
2800 sym = symbol_make (name);
2801 ppc_stab_symbol = false;
2803 symbol_get_tc (sym)->real_name = name;
2805 (void) expression (&exp);
2807 switch (exp.X_op)
2809 case O_illegal:
2810 case O_absent:
2811 case O_big:
2812 as_bad (_("illegal .stabx expression; zero assumed"));
2813 exp.X_add_number = 0;
2814 /* Fall through. */
2815 case O_constant:
2816 S_SET_VALUE (sym, (valueT) exp.X_add_number);
2817 symbol_set_frag (sym, &zero_address_frag);
2818 break;
2820 case O_symbol:
2821 if (S_GET_SEGMENT (exp.X_add_symbol) == undefined_section)
2822 symbol_set_value_expression (sym, &exp);
2823 else
2825 S_SET_VALUE (sym,
2826 exp.X_add_number + S_GET_VALUE (exp.X_add_symbol));
2827 symbol_set_frag (sym, symbol_get_frag (exp.X_add_symbol));
2829 break;
2831 default:
2832 /* The value is some complex expression. This will probably
2833 fail at some later point, but this is probably the right
2834 thing to do here. */
2835 symbol_set_value_expression (sym, &exp);
2836 break;
2839 S_SET_SEGMENT (sym, ppc_coff_debug_section);
2840 symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
2842 if (*input_line_pointer != ',')
2844 as_bad (_("missing class"));
2845 return;
2847 ++input_line_pointer;
2849 S_SET_STORAGE_CLASS (sym, get_absolute_expression ());
2851 if (*input_line_pointer != ',')
2853 as_bad (_("missing type"));
2854 return;
2856 ++input_line_pointer;
2858 S_SET_DATA_TYPE (sym, get_absolute_expression ());
2860 symbol_get_tc (sym)->output = 1;
2862 if (S_GET_STORAGE_CLASS (sym) == C_STSYM) {
2864 symbol_get_tc (sym)->within = ppc_current_block;
2866 /* In this case :
2868 .bs name
2869 .stabx "z",arrays_,133,0
2872 .comm arrays_,13768,3
2874 resolve_symbol_value will copy the exp's "within" into sym's when the
2875 offset is 0. Since this seems to be corner case problem,
2876 only do the correction for storage class C_STSYM. A better solution
2877 would be to have the tc field updated in ppc_symbol_new_hook. */
2879 if (exp.X_op == O_symbol)
2881 symbol_get_tc (exp.X_add_symbol)->within = ppc_current_block;
2885 if (exp.X_op != O_symbol
2886 || ! S_IS_EXTERNAL (exp.X_add_symbol)
2887 || S_GET_SEGMENT (exp.X_add_symbol) != bss_section)
2888 ppc_frob_label (sym);
2889 else
2891 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
2892 symbol_append (sym, exp.X_add_symbol, &symbol_rootP, &symbol_lastP);
2893 if (symbol_get_tc (ppc_current_csect)->within == exp.X_add_symbol)
2894 symbol_get_tc (ppc_current_csect)->within = sym;
2897 demand_empty_rest_of_line ();
2900 /* The .function pseudo-op. This takes several arguments. The first
2901 argument seems to be the external name of the symbol. The second
2902 argment seems to be the label for the start of the function. gcc
2903 uses the same name for both. I have no idea what the third and
2904 fourth arguments are meant to be. The optional fifth argument is
2905 an expression for the size of the function. In COFF this symbol
2906 gets an aux entry like that used for a csect. */
2908 static void
2909 ppc_function (ignore)
2910 int ignore ATTRIBUTE_UNUSED;
2912 char *name;
2913 char endc;
2914 char *s;
2915 symbolS *ext_sym;
2916 symbolS *lab_sym;
2918 name = input_line_pointer;
2919 endc = get_symbol_end ();
2921 /* Ignore any [PR] suffix. */
2922 name = ppc_canonicalize_symbol_name (name);
2923 s = strchr (name, '[');
2924 if (s != (char *) NULL
2925 && strcmp (s + 1, "PR]") == 0)
2926 *s = '\0';
2928 ext_sym = symbol_find_or_make (name);
2930 *input_line_pointer = endc;
2932 if (*input_line_pointer != ',')
2934 as_bad (_("missing symbol name"));
2935 ignore_rest_of_line ();
2936 return;
2938 ++input_line_pointer;
2940 name = input_line_pointer;
2941 endc = get_symbol_end ();
2943 lab_sym = symbol_find_or_make (name);
2945 *input_line_pointer = endc;
2947 if (ext_sym != lab_sym)
2949 expressionS exp;
2951 exp.X_op = O_symbol;
2952 exp.X_add_symbol = lab_sym;
2953 exp.X_op_symbol = NULL;
2954 exp.X_add_number = 0;
2955 exp.X_unsigned = 0;
2956 symbol_set_value_expression (ext_sym, &exp);
2959 if (symbol_get_tc (ext_sym)->class == -1)
2960 symbol_get_tc (ext_sym)->class = XMC_PR;
2961 symbol_get_tc (ext_sym)->output = 1;
2963 if (*input_line_pointer == ',')
2965 expressionS ignore;
2967 /* Ignore the third argument. */
2968 ++input_line_pointer;
2969 expression (&ignore);
2970 if (*input_line_pointer == ',')
2972 /* Ignore the fourth argument. */
2973 ++input_line_pointer;
2974 expression (&ignore);
2975 if (*input_line_pointer == ',')
2977 /* The fifth argument is the function size. */
2978 ++input_line_pointer;
2979 symbol_get_tc (ext_sym)->size = symbol_new ("L0\001",
2980 absolute_section,
2981 (valueT) 0,
2982 &zero_address_frag);
2983 pseudo_set (symbol_get_tc (ext_sym)->size);
2988 S_SET_DATA_TYPE (ext_sym, DT_FCN << N_BTSHFT);
2989 SF_SET_FUNCTION (ext_sym);
2990 SF_SET_PROCESS (ext_sym);
2991 coff_add_linesym (ext_sym);
2993 demand_empty_rest_of_line ();
2996 /* The .bf pseudo-op. This is just like a COFF C_FCN symbol named
2997 ".bf". */
2999 static void
3000 ppc_bf (ignore)
3001 int ignore ATTRIBUTE_UNUSED;
3003 symbolS *sym;
3005 sym = symbol_make (".bf");
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_FCN);
3011 coff_line_base = get_absolute_expression ();
3013 S_SET_NUMBER_AUXILIARY (sym, 1);
3014 SA_SET_SYM_LNNO (sym, coff_line_base);
3016 symbol_get_tc (sym)->output = 1;
3018 ppc_frob_label (sym);
3020 demand_empty_rest_of_line ();
3023 /* The .ef pseudo-op. This is just like a COFF C_FCN symbol named
3024 ".ef", except that the line number is absolute, not relative to the
3025 most recent ".bf" symbol. */
3027 static void
3028 ppc_ef (ignore)
3029 int ignore ATTRIBUTE_UNUSED;
3031 symbolS *sym;
3033 sym = symbol_make (".ef");
3034 S_SET_SEGMENT (sym, text_section);
3035 symbol_set_frag (sym, frag_now);
3036 S_SET_VALUE (sym, frag_now_fix ());
3037 S_SET_STORAGE_CLASS (sym, C_FCN);
3038 S_SET_NUMBER_AUXILIARY (sym, 1);
3039 SA_SET_SYM_LNNO (sym, get_absolute_expression ());
3040 symbol_get_tc (sym)->output = 1;
3042 ppc_frob_label (sym);
3044 demand_empty_rest_of_line ();
3047 /* The .bi and .ei pseudo-ops. These take a string argument and
3048 generates a C_BINCL or C_EINCL symbol, which goes at the start of
3049 the symbol list. */
3051 static void
3052 ppc_biei (ei)
3053 int ei;
3055 static symbolS *last_biei;
3057 char *name;
3058 int len;
3059 symbolS *sym;
3060 symbolS *look;
3062 name = demand_copy_C_string (&len);
3064 /* The value of these symbols is actually file offset. Here we set
3065 the value to the index into the line number entries. In
3066 ppc_frob_symbols we set the fix_line field, which will cause BFD
3067 to do the right thing. */
3069 sym = symbol_make (name);
3070 /* obj-coff.c currently only handles line numbers correctly in the
3071 .text section. */
3072 S_SET_SEGMENT (sym, text_section);
3073 S_SET_VALUE (sym, coff_n_line_nos);
3074 symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
3076 S_SET_STORAGE_CLASS (sym, ei ? C_EINCL : C_BINCL);
3077 symbol_get_tc (sym)->output = 1;
3079 for (look = last_biei ? last_biei : symbol_rootP;
3080 (look != (symbolS *) NULL
3081 && (S_GET_STORAGE_CLASS (look) == C_FILE
3082 || S_GET_STORAGE_CLASS (look) == C_BINCL
3083 || S_GET_STORAGE_CLASS (look) == C_EINCL));
3084 look = symbol_next (look))
3086 if (look != (symbolS *) NULL)
3088 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
3089 symbol_insert (sym, look, &symbol_rootP, &symbol_lastP);
3090 last_biei = sym;
3093 demand_empty_rest_of_line ();
3096 /* The .bs pseudo-op. This generates a C_BSTAT symbol named ".bs".
3097 There is one argument, which is a csect symbol. The value of the
3098 .bs symbol is the index of this csect symbol. */
3100 static void
3101 ppc_bs (ignore)
3102 int ignore ATTRIBUTE_UNUSED;
3104 char *name;
3105 char endc;
3106 symbolS *csect;
3107 symbolS *sym;
3109 if (ppc_current_block != NULL)
3110 as_bad (_("nested .bs blocks"));
3112 name = input_line_pointer;
3113 endc = get_symbol_end ();
3115 csect = symbol_find_or_make (name);
3117 *input_line_pointer = endc;
3119 sym = symbol_make (".bs");
3120 S_SET_SEGMENT (sym, now_seg);
3121 S_SET_STORAGE_CLASS (sym, C_BSTAT);
3122 symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
3123 symbol_get_tc (sym)->output = 1;
3125 symbol_get_tc (sym)->within = csect;
3127 ppc_frob_label (sym);
3129 ppc_current_block = sym;
3131 demand_empty_rest_of_line ();
3134 /* The .es pseudo-op. Generate a C_ESTART symbol named .es. */
3136 static void
3137 ppc_es (ignore)
3138 int ignore ATTRIBUTE_UNUSED;
3140 symbolS *sym;
3142 if (ppc_current_block == NULL)
3143 as_bad (_(".es without preceding .bs"));
3145 sym = symbol_make (".es");
3146 S_SET_SEGMENT (sym, now_seg);
3147 S_SET_STORAGE_CLASS (sym, C_ESTAT);
3148 symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
3149 symbol_get_tc (sym)->output = 1;
3151 ppc_frob_label (sym);
3153 ppc_current_block = NULL;
3155 demand_empty_rest_of_line ();
3158 /* The .bb pseudo-op. Generate a C_BLOCK symbol named .bb, with a
3159 line number. */
3161 static void
3162 ppc_bb (ignore)
3163 int ignore ATTRIBUTE_UNUSED;
3165 symbolS *sym;
3167 sym = symbol_make (".bb");
3168 S_SET_SEGMENT (sym, text_section);
3169 symbol_set_frag (sym, frag_now);
3170 S_SET_VALUE (sym, frag_now_fix ());
3171 S_SET_STORAGE_CLASS (sym, C_BLOCK);
3173 S_SET_NUMBER_AUXILIARY (sym, 1);
3174 SA_SET_SYM_LNNO (sym, get_absolute_expression ());
3176 symbol_get_tc (sym)->output = 1;
3178 SF_SET_PROCESS (sym);
3180 ppc_frob_label (sym);
3182 demand_empty_rest_of_line ();
3185 /* The .eb pseudo-op. Generate a C_BLOCK symbol named .eb, with a
3186 line number. */
3188 static void
3189 ppc_eb (ignore)
3190 int ignore ATTRIBUTE_UNUSED;
3192 symbolS *sym;
3194 sym = symbol_make (".eb");
3195 S_SET_SEGMENT (sym, text_section);
3196 symbol_set_frag (sym, frag_now);
3197 S_SET_VALUE (sym, frag_now_fix ());
3198 S_SET_STORAGE_CLASS (sym, C_BLOCK);
3199 S_SET_NUMBER_AUXILIARY (sym, 1);
3200 SA_SET_SYM_LNNO (sym, get_absolute_expression ());
3201 symbol_get_tc (sym)->output = 1;
3203 SF_SET_PROCESS (sym);
3205 ppc_frob_label (sym);
3207 demand_empty_rest_of_line ();
3210 /* The .bc pseudo-op. This just creates a C_BCOMM symbol with a
3211 specified name. */
3213 static void
3214 ppc_bc (ignore)
3215 int ignore ATTRIBUTE_UNUSED;
3217 char *name;
3218 int len;
3219 symbolS *sym;
3221 name = demand_copy_C_string (&len);
3222 sym = symbol_make (name);
3223 S_SET_SEGMENT (sym, ppc_coff_debug_section);
3224 symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
3225 S_SET_STORAGE_CLASS (sym, C_BCOMM);
3226 S_SET_VALUE (sym, 0);
3227 symbol_get_tc (sym)->output = 1;
3229 ppc_frob_label (sym);
3231 demand_empty_rest_of_line ();
3234 /* The .ec pseudo-op. This just creates a C_ECOMM symbol. */
3236 static void
3237 ppc_ec (ignore)
3238 int ignore ATTRIBUTE_UNUSED;
3240 symbolS *sym;
3242 sym = symbol_make (".ec");
3243 S_SET_SEGMENT (sym, ppc_coff_debug_section);
3244 symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
3245 S_SET_STORAGE_CLASS (sym, C_ECOMM);
3246 S_SET_VALUE (sym, 0);
3247 symbol_get_tc (sym)->output = 1;
3249 ppc_frob_label (sym);
3251 demand_empty_rest_of_line ();
3254 /* The .toc pseudo-op. Switch to the .toc subsegment. */
3256 static void
3257 ppc_toc (ignore)
3258 int ignore ATTRIBUTE_UNUSED;
3260 if (ppc_toc_csect != (symbolS *) NULL)
3261 subseg_set (data_section, symbol_get_tc (ppc_toc_csect)->subseg);
3262 else
3264 subsegT subseg;
3265 symbolS *sym;
3266 symbolS *list;
3268 subseg = ppc_data_subsegment;
3269 ++ppc_data_subsegment;
3271 subseg_new (segment_name (data_section), subseg);
3272 ppc_toc_frag = frag_now;
3274 sym = symbol_find_or_make ("TOC[TC0]");
3275 symbol_set_frag (sym, frag_now);
3276 S_SET_SEGMENT (sym, data_section);
3277 S_SET_VALUE (sym, (valueT) frag_now_fix ());
3278 symbol_get_tc (sym)->subseg = subseg;
3279 symbol_get_tc (sym)->output = 1;
3280 symbol_get_tc (sym)->within = sym;
3282 ppc_toc_csect = sym;
3284 for (list = ppc_data_csects;
3285 symbol_get_tc (list)->next != (symbolS *) NULL;
3286 list = symbol_get_tc (list)->next)
3288 symbol_get_tc (list)->next = sym;
3290 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
3291 symbol_append (sym, symbol_get_tc (list)->within, &symbol_rootP,
3292 &symbol_lastP);
3295 ppc_current_csect = ppc_toc_csect;
3297 demand_empty_rest_of_line ();
3300 /* The AIX assembler automatically aligns the operands of a .long or
3301 .short pseudo-op, and we want to be compatible. */
3303 static void
3304 ppc_xcoff_cons (log_size)
3305 int log_size;
3307 frag_align (log_size, 0, 0);
3308 record_alignment (now_seg, log_size);
3309 cons (1 << log_size);
3312 static void
3313 ppc_machine(dummy)
3314 int dummy ATTRIBUTE_UNUSED;
3316 discard_rest_of_line();
3317 /* What does aix use this for? */
3320 static void
3321 ppc_vbyte (dummy)
3322 int dummy ATTRIBUTE_UNUSED;
3324 expressionS exp;
3325 int byte_count;
3327 (void) expression (&exp);
3329 if (exp.X_op != O_constant)
3331 as_bad (_("non-constant byte count"));
3332 return;
3335 byte_count = exp.X_add_number;
3337 if (*input_line_pointer != ',')
3339 as_bad (_("missing value"));
3340 return;
3343 ++input_line_pointer;
3344 cons (byte_count);
3347 #endif /* OBJ_XCOFF */
3349 /* The .tc pseudo-op. This is used when generating either XCOFF or
3350 ELF. This takes two or more arguments.
3352 When generating XCOFF output, the first argument is the name to
3353 give to this location in the toc; this will be a symbol with class
3354 TC. The rest of the arguments are 4 byte values to actually put at
3355 this location in the TOC; often there is just one more argument, a
3356 relocateable symbol reference.
3358 When not generating XCOFF output, the arguments are the same, but
3359 the first argument is simply ignored. */
3361 static void
3362 ppc_tc (ignore)
3363 int ignore ATTRIBUTE_UNUSED;
3365 #ifdef OBJ_XCOFF
3367 /* Define the TOC symbol name. */
3369 char *name;
3370 char endc;
3371 symbolS *sym;
3373 if (ppc_toc_csect == (symbolS *) NULL
3374 || ppc_toc_csect != ppc_current_csect)
3376 as_bad (_(".tc not in .toc section"));
3377 ignore_rest_of_line ();
3378 return;
3381 name = input_line_pointer;
3382 endc = get_symbol_end ();
3384 sym = symbol_find_or_make (name);
3386 *input_line_pointer = endc;
3388 if (S_IS_DEFINED (sym))
3390 symbolS *label;
3392 label = symbol_get_tc (ppc_current_csect)->within;
3393 if (symbol_get_tc (label)->class != XMC_TC0)
3395 as_bad (_(".tc with no label"));
3396 ignore_rest_of_line ();
3397 return;
3400 S_SET_SEGMENT (label, S_GET_SEGMENT (sym));
3401 symbol_set_frag (label, symbol_get_frag (sym));
3402 S_SET_VALUE (label, S_GET_VALUE (sym));
3404 while (! is_end_of_line[(unsigned char) *input_line_pointer])
3405 ++input_line_pointer;
3407 return;
3410 S_SET_SEGMENT (sym, now_seg);
3411 symbol_set_frag (sym, frag_now);
3412 S_SET_VALUE (sym, (valueT) frag_now_fix ());
3413 symbol_get_tc (sym)->class = XMC_TC;
3414 symbol_get_tc (sym)->output = 1;
3416 ppc_frob_label (sym);
3419 #else /* ! defined (OBJ_XCOFF) */
3421 /* Skip the TOC symbol name. */
3422 while (is_part_of_name (*input_line_pointer)
3423 || *input_line_pointer == '['
3424 || *input_line_pointer == ']'
3425 || *input_line_pointer == '{'
3426 || *input_line_pointer == '}')
3427 ++input_line_pointer;
3429 /* Align to a four byte boundary. */
3430 frag_align (2, 0, 0);
3431 record_alignment (now_seg, 2);
3433 #endif /* ! defined (OBJ_XCOFF) */
3435 if (*input_line_pointer != ',')
3436 demand_empty_rest_of_line ();
3437 else
3439 ++input_line_pointer;
3440 cons ((ppc_size == PPC_OPCODE_64) ? 8 : 4);
3444 #ifdef TE_PE
3446 /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format. */
3448 /* Set the current section. */
3449 static void
3450 ppc_set_current_section (new)
3451 segT new;
3453 ppc_previous_section = ppc_current_section;
3454 ppc_current_section = new;
3457 /* pseudo-op: .previous
3458 behaviour: toggles the current section with the previous section.
3459 errors: None
3460 warnings: "No previous section" */
3462 static void
3463 ppc_previous (ignore)
3464 int ignore ATTRIBUTE_UNUSED;
3466 symbolS *tmp;
3468 if (ppc_previous_section == NULL)
3470 as_warn (_("No previous section to return to. Directive ignored."));
3471 return;
3474 subseg_set (ppc_previous_section, 0);
3476 ppc_set_current_section (ppc_previous_section);
3479 /* pseudo-op: .pdata
3480 behaviour: predefined read only data section
3481 double word aligned
3482 errors: None
3483 warnings: None
3484 initial: .section .pdata "adr3"
3485 a - don't know -- maybe a misprint
3486 d - initialized data
3487 r - readable
3488 3 - double word aligned (that would be 4 byte boundary)
3490 commentary:
3491 Tag index tables (also known as the function table) for exception
3492 handling, debugging, etc. */
3494 static void
3495 ppc_pdata (ignore)
3496 int ignore ATTRIBUTE_UNUSED;
3498 if (pdata_section == 0)
3500 pdata_section = subseg_new (".pdata", 0);
3502 bfd_set_section_flags (stdoutput, pdata_section,
3503 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
3504 | SEC_READONLY | SEC_DATA ));
3506 bfd_set_section_alignment (stdoutput, pdata_section, 2);
3508 else
3510 pdata_section = subseg_new (".pdata", 0);
3512 ppc_set_current_section (pdata_section);
3515 /* pseudo-op: .ydata
3516 behaviour: predefined read only data section
3517 double word aligned
3518 errors: None
3519 warnings: None
3520 initial: .section .ydata "drw3"
3521 a - don't know -- maybe a misprint
3522 d - initialized data
3523 r - readable
3524 3 - double word aligned (that would be 4 byte boundary)
3525 commentary:
3526 Tag tables (also known as the scope table) for exception handling,
3527 debugging, etc. */
3529 static void
3530 ppc_ydata (ignore)
3531 int ignore ATTRIBUTE_UNUSED;
3533 if (ydata_section == 0)
3535 ydata_section = subseg_new (".ydata", 0);
3536 bfd_set_section_flags (stdoutput, ydata_section,
3537 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
3538 | SEC_READONLY | SEC_DATA ));
3540 bfd_set_section_alignment (stdoutput, ydata_section, 3);
3542 else
3544 ydata_section = subseg_new (".ydata", 0);
3546 ppc_set_current_section (ydata_section);
3549 /* pseudo-op: .reldata
3550 behaviour: predefined read write data section
3551 double word aligned (4-byte)
3552 FIXME: relocation is applied to it
3553 FIXME: what's the difference between this and .data?
3554 errors: None
3555 warnings: None
3556 initial: .section .reldata "drw3"
3557 d - initialized data
3558 r - readable
3559 w - writeable
3560 3 - double word aligned (that would be 8 byte boundary)
3562 commentary:
3563 Like .data, but intended to hold data subject to relocation, such as
3564 function descriptors, etc. */
3566 static void
3567 ppc_reldata (ignore)
3568 int ignore ATTRIBUTE_UNUSED;
3570 if (reldata_section == 0)
3572 reldata_section = subseg_new (".reldata", 0);
3574 bfd_set_section_flags (stdoutput, reldata_section,
3575 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
3576 | SEC_DATA));
3578 bfd_set_section_alignment (stdoutput, reldata_section, 2);
3580 else
3582 reldata_section = subseg_new (".reldata", 0);
3584 ppc_set_current_section (reldata_section);
3587 /* pseudo-op: .rdata
3588 behaviour: predefined read only data section
3589 double word aligned
3590 errors: None
3591 warnings: None
3592 initial: .section .rdata "dr3"
3593 d - initialized data
3594 r - readable
3595 3 - double word aligned (that would be 4 byte boundary) */
3597 static void
3598 ppc_rdata (ignore)
3599 int ignore ATTRIBUTE_UNUSED;
3601 if (rdata_section == 0)
3603 rdata_section = subseg_new (".rdata", 0);
3604 bfd_set_section_flags (stdoutput, rdata_section,
3605 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
3606 | SEC_READONLY | SEC_DATA ));
3608 bfd_set_section_alignment (stdoutput, rdata_section, 2);
3610 else
3612 rdata_section = subseg_new (".rdata", 0);
3614 ppc_set_current_section (rdata_section);
3617 /* pseudo-op: .ualong
3618 behaviour: much like .int, with the exception that no alignment is
3619 performed.
3620 FIXME: test the alignment statement
3621 errors: None
3622 warnings: None */
3624 static void
3625 ppc_ualong (ignore)
3626 int ignore ATTRIBUTE_UNUSED;
3628 /* Try for long. */
3629 cons (4);
3632 /* pseudo-op: .znop <symbol name>
3633 behaviour: Issue a nop instruction
3634 Issue a IMAGE_REL_PPC_IFGLUE relocation against it, using
3635 the supplied symbol name.
3636 errors: None
3637 warnings: Missing symbol name */
3639 static void
3640 ppc_znop (ignore)
3641 int ignore ATTRIBUTE_UNUSED;
3643 unsigned long insn;
3644 const struct powerpc_opcode *opcode;
3645 expressionS ex;
3646 char *f;
3647 symbolS *sym;
3648 char *symbol_name;
3649 char c;
3650 char *name;
3651 unsigned int exp;
3652 flagword flags;
3653 asection *sec;
3655 /* Strip out the symbol name. */
3656 symbol_name = input_line_pointer;
3657 c = get_symbol_end ();
3659 name = xmalloc (input_line_pointer - symbol_name + 1);
3660 strcpy (name, symbol_name);
3662 sym = symbol_find_or_make (name);
3664 *input_line_pointer = c;
3666 SKIP_WHITESPACE ();
3668 /* Look up the opcode in the hash table. */
3669 opcode = (const struct powerpc_opcode *) hash_find (ppc_hash, "nop");
3671 /* Stick in the nop. */
3672 insn = opcode->opcode;
3674 /* Write out the instruction. */
3675 f = frag_more (4);
3676 md_number_to_chars (f, insn, 4);
3677 fix_new (frag_now,
3678 f - frag_now->fr_literal,
3680 sym,
3683 BFD_RELOC_16_GOT_PCREL);
3687 /* pseudo-op:
3688 behaviour:
3689 errors:
3690 warnings: */
3692 static void
3693 ppc_pe_comm (lcomm)
3694 int lcomm;
3696 register char *name;
3697 register char c;
3698 register char *p;
3699 offsetT temp;
3700 register symbolS *symbolP;
3701 offsetT align;
3703 name = input_line_pointer;
3704 c = get_symbol_end ();
3706 /* just after name is now '\0'. */
3707 p = input_line_pointer;
3708 *p = c;
3709 SKIP_WHITESPACE ();
3710 if (*input_line_pointer != ',')
3712 as_bad (_("Expected comma after symbol-name: rest of line ignored."));
3713 ignore_rest_of_line ();
3714 return;
3717 input_line_pointer++; /* skip ',' */
3718 if ((temp = get_absolute_expression ()) < 0)
3720 as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) temp);
3721 ignore_rest_of_line ();
3722 return;
3725 if (! lcomm)
3727 /* The third argument to .comm is the alignment. */
3728 if (*input_line_pointer != ',')
3729 align = 3;
3730 else
3732 ++input_line_pointer;
3733 align = get_absolute_expression ();
3734 if (align <= 0)
3736 as_warn (_("ignoring bad alignment"));
3737 align = 3;
3742 *p = 0;
3743 symbolP = symbol_find_or_make (name);
3745 *p = c;
3746 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
3748 as_bad (_("Ignoring attempt to re-define symbol `%s'."),
3749 S_GET_NAME (symbolP));
3750 ignore_rest_of_line ();
3751 return;
3754 if (S_GET_VALUE (symbolP))
3756 if (S_GET_VALUE (symbolP) != (valueT) temp)
3757 as_bad (_("Length of .comm \"%s\" is already %ld. Not changed to %ld."),
3758 S_GET_NAME (symbolP),
3759 (long) S_GET_VALUE (symbolP),
3760 (long) temp);
3762 else
3764 S_SET_VALUE (symbolP, (valueT) temp);
3765 S_SET_EXTERNAL (symbolP);
3768 demand_empty_rest_of_line ();
3772 * implement the .section pseudo op:
3773 * .section name {, "flags"}
3774 * ^ ^
3775 * | +--- optional flags: 'b' for bss
3776 * | 'i' for info
3777 * +-- section name 'l' for lib
3778 * 'n' for noload
3779 * 'o' for over
3780 * 'w' for data
3781 * 'd' (apparently m88k for data)
3782 * 'x' for text
3783 * But if the argument is not a quoted string, treat it as a
3784 * subsegment number.
3786 * FIXME: this is a copy of the section processing from obj-coff.c, with
3787 * additions/changes for the moto-pas assembler support. There are three
3788 * categories:
3790 * FIXME: I just noticed this. This doesn't work at all really. It it
3791 * setting bits that bfd probably neither understands or uses. The
3792 * correct approach (?) will have to incorporate extra fields attached
3793 * to the section to hold the system specific stuff. (krk)
3795 * Section Contents:
3796 * 'a' - unknown - referred to in documentation, but no definition supplied
3797 * 'c' - section has code
3798 * 'd' - section has initialized data
3799 * 'u' - section has uninitialized data
3800 * 'i' - section contains directives (info)
3801 * 'n' - section can be discarded
3802 * 'R' - remove section at link time
3804 * Section Protection:
3805 * 'r' - section is readable
3806 * 'w' - section is writeable
3807 * 'x' - section is executable
3808 * 's' - section is sharable
3810 * Section Alignment:
3811 * '0' - align to byte boundary
3812 * '1' - align to halfword undary
3813 * '2' - align to word boundary
3814 * '3' - align to doubleword boundary
3815 * '4' - align to quadword boundary
3816 * '5' - align to 32 byte boundary
3817 * '6' - align to 64 byte boundary
3821 void
3822 ppc_pe_section (ignore)
3823 int ignore ATTRIBUTE_UNUSED;
3825 /* Strip out the section name. */
3826 char *section_name;
3827 char c;
3828 char *name;
3829 unsigned int exp;
3830 flagword flags;
3831 segT sec;
3832 int align;
3834 section_name = input_line_pointer;
3835 c = get_symbol_end ();
3837 name = xmalloc (input_line_pointer - section_name + 1);
3838 strcpy (name, section_name);
3840 *input_line_pointer = c;
3842 SKIP_WHITESPACE ();
3844 exp = 0;
3845 flags = SEC_NO_FLAGS;
3847 if (strcmp (name, ".idata$2") == 0)
3849 align = 0;
3851 else if (strcmp (name, ".idata$3") == 0)
3853 align = 0;
3855 else if (strcmp (name, ".idata$4") == 0)
3857 align = 2;
3859 else if (strcmp (name, ".idata$5") == 0)
3861 align = 2;
3863 else if (strcmp (name, ".idata$6") == 0)
3865 align = 1;
3867 else
3868 /* Default alignment to 16 byte boundary. */
3869 align = 4;
3871 if (*input_line_pointer == ',')
3873 ++input_line_pointer;
3874 SKIP_WHITESPACE ();
3875 if (*input_line_pointer != '"')
3876 exp = get_absolute_expression ();
3877 else
3879 ++input_line_pointer;
3880 while (*input_line_pointer != '"'
3881 && ! is_end_of_line[(unsigned char) *input_line_pointer])
3883 switch (*input_line_pointer)
3885 /* Section Contents */
3886 case 'a': /* unknown */
3887 as_bad (_("Unsupported section attribute -- 'a'"));
3888 break;
3889 case 'c': /* code section */
3890 flags |= SEC_CODE;
3891 break;
3892 case 'd': /* section has initialized data */
3893 flags |= SEC_DATA;
3894 break;
3895 case 'u': /* section has uninitialized data */
3896 /* FIXME: This is IMAGE_SCN_CNT_UNINITIALIZED_DATA
3897 in winnt.h */
3898 flags |= SEC_ROM;
3899 break;
3900 case 'i': /* section contains directives (info) */
3901 /* FIXME: This is IMAGE_SCN_LNK_INFO
3902 in winnt.h */
3903 flags |= SEC_HAS_CONTENTS;
3904 break;
3905 case 'n': /* section can be discarded */
3906 flags &=~ SEC_LOAD;
3907 break;
3908 case 'R': /* Remove section at link time */
3909 flags |= SEC_NEVER_LOAD;
3910 break;
3912 /* Section Protection */
3913 case 'r': /* section is readable */
3914 flags |= IMAGE_SCN_MEM_READ;
3915 break;
3916 case 'w': /* section is writeable */
3917 flags |= IMAGE_SCN_MEM_WRITE;
3918 break;
3919 case 'x': /* section is executable */
3920 flags |= IMAGE_SCN_MEM_EXECUTE;
3921 break;
3922 case 's': /* section is sharable */
3923 flags |= IMAGE_SCN_MEM_SHARED;
3924 break;
3926 /* Section Alignment */
3927 case '0': /* align to byte boundary */
3928 flags |= IMAGE_SCN_ALIGN_1BYTES;
3929 align = 0;
3930 break;
3931 case '1': /* align to halfword boundary */
3932 flags |= IMAGE_SCN_ALIGN_2BYTES;
3933 align = 1;
3934 break;
3935 case '2': /* align to word boundary */
3936 flags |= IMAGE_SCN_ALIGN_4BYTES;
3937 align = 2;
3938 break;
3939 case '3': /* align to doubleword boundary */
3940 flags |= IMAGE_SCN_ALIGN_8BYTES;
3941 align = 3;
3942 break;
3943 case '4': /* align to quadword boundary */
3944 flags |= IMAGE_SCN_ALIGN_16BYTES;
3945 align = 4;
3946 break;
3947 case '5': /* align to 32 byte boundary */
3948 flags |= IMAGE_SCN_ALIGN_32BYTES;
3949 align = 5;
3950 break;
3951 case '6': /* align to 64 byte boundary */
3952 flags |= IMAGE_SCN_ALIGN_64BYTES;
3953 align = 6;
3954 break;
3956 default:
3957 as_bad (_("unknown section attribute '%c'"),
3958 *input_line_pointer);
3959 break;
3961 ++input_line_pointer;
3963 if (*input_line_pointer == '"')
3964 ++input_line_pointer;
3968 sec = subseg_new (name, (subsegT) exp);
3970 ppc_set_current_section (sec);
3972 if (flags != SEC_NO_FLAGS)
3974 if (! bfd_set_section_flags (stdoutput, sec, flags))
3975 as_bad (_("error setting flags for \"%s\": %s"),
3976 bfd_section_name (stdoutput, sec),
3977 bfd_errmsg (bfd_get_error ()));
3980 bfd_set_section_alignment (stdoutput, sec, align);
3984 static void
3985 ppc_pe_function (ignore)
3986 int ignore ATTRIBUTE_UNUSED;
3988 char *name;
3989 char endc;
3990 symbolS *ext_sym;
3992 name = input_line_pointer;
3993 endc = get_symbol_end ();
3995 ext_sym = symbol_find_or_make (name);
3997 *input_line_pointer = endc;
3999 S_SET_DATA_TYPE (ext_sym, DT_FCN << N_BTSHFT);
4000 SF_SET_FUNCTION (ext_sym);
4001 SF_SET_PROCESS (ext_sym);
4002 coff_add_linesym (ext_sym);
4004 demand_empty_rest_of_line ();
4007 static void
4008 ppc_pe_tocd (ignore)
4009 int ignore ATTRIBUTE_UNUSED;
4011 if (tocdata_section == 0)
4013 tocdata_section = subseg_new (".tocd", 0);
4014 /* FIXME: section flags won't work. */
4015 bfd_set_section_flags (stdoutput, tocdata_section,
4016 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
4017 | SEC_READONLY | SEC_DATA));
4019 bfd_set_section_alignment (stdoutput, tocdata_section, 2);
4021 else
4023 rdata_section = subseg_new (".tocd", 0);
4026 ppc_set_current_section (tocdata_section);
4028 demand_empty_rest_of_line ();
4031 /* Don't adjust TOC relocs to use the section symbol. */
4034 ppc_pe_fix_adjustable (fix)
4035 fixS *fix;
4037 return fix->fx_r_type != BFD_RELOC_PPC_TOC16;
4040 #endif
4042 #ifdef OBJ_XCOFF
4044 /* XCOFF specific symbol and file handling. */
4046 /* Canonicalize the symbol name. We use the to force the suffix, if
4047 any, to use square brackets, and to be in upper case. */
4049 char *
4050 ppc_canonicalize_symbol_name (name)
4051 char *name;
4053 char *s;
4055 if (ppc_stab_symbol)
4056 return name;
4058 for (s = name; *s != '\0' && *s != '{' && *s != '['; s++)
4060 if (*s != '\0')
4062 char brac;
4064 if (*s == '[')
4065 brac = ']';
4066 else
4068 *s = '[';
4069 brac = '}';
4072 for (s++; *s != '\0' && *s != brac; s++)
4073 if (islower (*s))
4074 *s = toupper (*s);
4076 if (*s == '\0' || s[1] != '\0')
4077 as_bad (_("bad symbol suffix"));
4079 *s = ']';
4082 return name;
4085 /* Set the class of a symbol based on the suffix, if any. This is
4086 called whenever a new symbol is created. */
4088 void
4089 ppc_symbol_new_hook (sym)
4090 symbolS *sym;
4092 struct ppc_tc_sy *tc;
4093 const char *s;
4095 tc = symbol_get_tc (sym);
4096 tc->next = NULL;
4097 tc->output = 0;
4098 tc->class = -1;
4099 tc->real_name = NULL;
4100 tc->subseg = 0;
4101 tc->align = 0;
4102 tc->size = NULL;
4103 tc->within = NULL;
4105 if (ppc_stab_symbol)
4106 return;
4108 s = strchr (S_GET_NAME (sym), '[');
4109 if (s == (const char *) NULL)
4111 /* There is no suffix. */
4112 return;
4115 ++s;
4117 switch (s[0])
4119 case 'B':
4120 if (strcmp (s, "BS]") == 0)
4121 tc->class = XMC_BS;
4122 break;
4123 case 'D':
4124 if (strcmp (s, "DB]") == 0)
4125 tc->class = XMC_DB;
4126 else if (strcmp (s, "DS]") == 0)
4127 tc->class = XMC_DS;
4128 break;
4129 case 'G':
4130 if (strcmp (s, "GL]") == 0)
4131 tc->class = XMC_GL;
4132 break;
4133 case 'P':
4134 if (strcmp (s, "PR]") == 0)
4135 tc->class = XMC_PR;
4136 break;
4137 case 'R':
4138 if (strcmp (s, "RO]") == 0)
4139 tc->class = XMC_RO;
4140 else if (strcmp (s, "RW]") == 0)
4141 tc->class = XMC_RW;
4142 break;
4143 case 'S':
4144 if (strcmp (s, "SV]") == 0)
4145 tc->class = XMC_SV;
4146 break;
4147 case 'T':
4148 if (strcmp (s, "TC]") == 0)
4149 tc->class = XMC_TC;
4150 else if (strcmp (s, "TI]") == 0)
4151 tc->class = XMC_TI;
4152 else if (strcmp (s, "TB]") == 0)
4153 tc->class = XMC_TB;
4154 else if (strcmp (s, "TC0]") == 0 || strcmp (s, "T0]") == 0)
4155 tc->class = XMC_TC0;
4156 break;
4157 case 'U':
4158 if (strcmp (s, "UA]") == 0)
4159 tc->class = XMC_UA;
4160 else if (strcmp (s, "UC]") == 0)
4161 tc->class = XMC_UC;
4162 break;
4163 case 'X':
4164 if (strcmp (s, "XO]") == 0)
4165 tc->class = XMC_XO;
4166 break;
4169 if (tc->class == -1)
4170 as_bad (_("Unrecognized symbol suffix"));
4173 /* Set the class of a label based on where it is defined. This
4174 handles symbols without suffixes. Also, move the symbol so that it
4175 follows the csect symbol. */
4177 void
4178 ppc_frob_label (sym)
4179 symbolS *sym;
4181 if (ppc_current_csect != (symbolS *) NULL)
4183 if (symbol_get_tc (sym)->class == -1)
4184 symbol_get_tc (sym)->class = symbol_get_tc (ppc_current_csect)->class;
4186 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
4187 symbol_append (sym, symbol_get_tc (ppc_current_csect)->within,
4188 &symbol_rootP, &symbol_lastP);
4189 symbol_get_tc (ppc_current_csect)->within = sym;
4193 /* This variable is set by ppc_frob_symbol if any absolute symbols are
4194 seen. It tells ppc_adjust_symtab whether it needs to look through
4195 the symbols. */
4197 static boolean ppc_saw_abs;
4199 /* Change the name of a symbol just before writing it out. Set the
4200 real name if the .rename pseudo-op was used. Otherwise, remove any
4201 class suffix. Return 1 if the symbol should not be included in the
4202 symbol table. */
4205 ppc_frob_symbol (sym)
4206 symbolS *sym;
4208 static symbolS *ppc_last_function;
4209 static symbolS *set_end;
4211 /* Discard symbols that should not be included in the output symbol
4212 table. */
4213 if (! symbol_used_in_reloc_p (sym)
4214 && ((symbol_get_bfdsym (sym)->flags & BSF_SECTION_SYM) != 0
4215 || (! S_IS_EXTERNAL (sym)
4216 && ! symbol_get_tc (sym)->output
4217 && S_GET_STORAGE_CLASS (sym) != C_FILE)))
4218 return 1;
4220 if (symbol_get_tc (sym)->real_name != (char *) NULL)
4221 S_SET_NAME (sym, symbol_get_tc (sym)->real_name);
4222 else
4224 const char *name;
4225 const char *s;
4227 name = S_GET_NAME (sym);
4228 s = strchr (name, '[');
4229 if (s != (char *) NULL)
4231 unsigned int len;
4232 char *snew;
4234 len = s - name;
4235 snew = xmalloc (len + 1);
4236 memcpy (snew, name, len);
4237 snew[len] = '\0';
4239 S_SET_NAME (sym, snew);
4243 if (set_end != (symbolS *) NULL)
4245 SA_SET_SYM_ENDNDX (set_end, sym);
4246 set_end = NULL;
4249 if (SF_GET_FUNCTION (sym))
4251 if (ppc_last_function != (symbolS *) NULL)
4252 as_bad (_("two .function pseudo-ops with no intervening .ef"));
4253 ppc_last_function = sym;
4254 if (symbol_get_tc (sym)->size != (symbolS *) NULL)
4256 resolve_symbol_value (symbol_get_tc (sym)->size);
4257 SA_SET_SYM_FSIZE (sym,
4258 (long) S_GET_VALUE (symbol_get_tc (sym)->size));
4261 else if (S_GET_STORAGE_CLASS (sym) == C_FCN
4262 && strcmp (S_GET_NAME (sym), ".ef") == 0)
4264 if (ppc_last_function == (symbolS *) NULL)
4265 as_bad (_(".ef with no preceding .function"));
4266 else
4268 set_end = ppc_last_function;
4269 ppc_last_function = NULL;
4271 /* We don't have a C_EFCN symbol, but we need to force the
4272 COFF backend to believe that it has seen one. */
4273 coff_last_function = NULL;
4277 if (! S_IS_EXTERNAL (sym)
4278 && (symbol_get_bfdsym (sym)->flags & BSF_SECTION_SYM) == 0
4279 && S_GET_STORAGE_CLASS (sym) != C_FILE
4280 && S_GET_STORAGE_CLASS (sym) != C_FCN
4281 && S_GET_STORAGE_CLASS (sym) != C_BLOCK
4282 && S_GET_STORAGE_CLASS (sym) != C_BSTAT
4283 && S_GET_STORAGE_CLASS (sym) != C_ESTAT
4284 && S_GET_STORAGE_CLASS (sym) != C_BINCL
4285 && S_GET_STORAGE_CLASS (sym) != C_EINCL
4286 && S_GET_SEGMENT (sym) != ppc_coff_debug_section)
4287 S_SET_STORAGE_CLASS (sym, C_HIDEXT);
4289 if (S_GET_STORAGE_CLASS (sym) == C_EXT
4290 || S_GET_STORAGE_CLASS (sym) == C_HIDEXT)
4292 int i;
4293 union internal_auxent *a;
4295 /* Create a csect aux. */
4296 i = S_GET_NUMBER_AUXILIARY (sym);
4297 S_SET_NUMBER_AUXILIARY (sym, i + 1);
4298 a = &coffsymbol (symbol_get_bfdsym (sym))->native[i + 1].u.auxent;
4299 if (symbol_get_tc (sym)->class == XMC_TC0)
4301 /* This is the TOC table. */
4302 know (strcmp (S_GET_NAME (sym), "TOC") == 0);
4303 a->x_csect.x_scnlen.l = 0;
4304 a->x_csect.x_smtyp = (2 << 3) | XTY_SD;
4306 else if (symbol_get_tc (sym)->subseg != 0)
4308 /* This is a csect symbol. x_scnlen is the size of the
4309 csect. */
4310 if (symbol_get_tc (sym)->next == (symbolS *) NULL)
4311 a->x_csect.x_scnlen.l = (bfd_section_size (stdoutput,
4312 S_GET_SEGMENT (sym))
4313 - S_GET_VALUE (sym));
4314 else
4316 resolve_symbol_value (symbol_get_tc (sym)->next);
4317 a->x_csect.x_scnlen.l = (S_GET_VALUE (symbol_get_tc (sym)->next)
4318 - S_GET_VALUE (sym));
4320 a->x_csect.x_smtyp = (symbol_get_tc (sym)->align << 3) | XTY_SD;
4322 else if (S_GET_SEGMENT (sym) == bss_section)
4324 /* This is a common symbol. */
4325 a->x_csect.x_scnlen.l = symbol_get_frag (sym)->fr_offset;
4326 a->x_csect.x_smtyp = (symbol_get_tc (sym)->align << 3) | XTY_CM;
4327 if (S_IS_EXTERNAL (sym))
4328 symbol_get_tc (sym)->class = XMC_RW;
4329 else
4330 symbol_get_tc (sym)->class = XMC_BS;
4332 else if (S_GET_SEGMENT (sym) == absolute_section)
4334 /* This is an absolute symbol. The csect will be created by
4335 ppc_adjust_symtab. */
4336 ppc_saw_abs = true;
4337 a->x_csect.x_smtyp = XTY_LD;
4338 if (symbol_get_tc (sym)->class == -1)
4339 symbol_get_tc (sym)->class = XMC_XO;
4341 else if (! S_IS_DEFINED (sym))
4343 /* This is an external symbol. */
4344 a->x_csect.x_scnlen.l = 0;
4345 a->x_csect.x_smtyp = XTY_ER;
4347 else if (symbol_get_tc (sym)->class == XMC_TC)
4349 symbolS *next;
4351 /* This is a TOC definition. x_scnlen is the size of the
4352 TOC entry. */
4353 next = symbol_next (sym);
4354 while (symbol_get_tc (next)->class == XMC_TC0)
4355 next = symbol_next (next);
4356 if (next == (symbolS *) NULL
4357 || symbol_get_tc (next)->class != XMC_TC)
4359 if (ppc_after_toc_frag == (fragS *) NULL)
4360 a->x_csect.x_scnlen.l = (bfd_section_size (stdoutput,
4361 data_section)
4362 - S_GET_VALUE (sym));
4363 else
4364 a->x_csect.x_scnlen.l = (ppc_after_toc_frag->fr_address
4365 - S_GET_VALUE (sym));
4367 else
4369 resolve_symbol_value (next);
4370 a->x_csect.x_scnlen.l = (S_GET_VALUE (next)
4371 - S_GET_VALUE (sym));
4373 a->x_csect.x_smtyp = (2 << 3) | XTY_SD;
4375 else
4377 symbolS *csect;
4379 /* This is a normal symbol definition. x_scnlen is the
4380 symbol index of the containing csect. */
4381 if (S_GET_SEGMENT (sym) == text_section)
4382 csect = ppc_text_csects;
4383 else if (S_GET_SEGMENT (sym) == data_section)
4384 csect = ppc_data_csects;
4385 else
4386 abort ();
4388 /* Skip the initial dummy symbol. */
4389 csect = symbol_get_tc (csect)->next;
4391 if (csect == (symbolS *) NULL)
4393 as_warn (_("warning: symbol %s has no csect"), S_GET_NAME (sym));
4394 a->x_csect.x_scnlen.l = 0;
4396 else
4398 while (symbol_get_tc (csect)->next != (symbolS *) NULL)
4400 resolve_symbol_value (symbol_get_tc (csect)->next);
4401 if (S_GET_VALUE (symbol_get_tc (csect)->next)
4402 > S_GET_VALUE (sym))
4403 break;
4404 csect = symbol_get_tc (csect)->next;
4407 a->x_csect.x_scnlen.p =
4408 coffsymbol (symbol_get_bfdsym (csect))->native;
4409 coffsymbol (symbol_get_bfdsym (sym))->native[i + 1].fix_scnlen =
4412 a->x_csect.x_smtyp = XTY_LD;
4415 a->x_csect.x_parmhash = 0;
4416 a->x_csect.x_snhash = 0;
4417 if (symbol_get_tc (sym)->class == -1)
4418 a->x_csect.x_smclas = XMC_PR;
4419 else
4420 a->x_csect.x_smclas = symbol_get_tc (sym)->class;
4421 a->x_csect.x_stab = 0;
4422 a->x_csect.x_snstab = 0;
4424 /* Don't let the COFF backend resort these symbols. */
4425 symbol_get_bfdsym (sym)->flags |= BSF_NOT_AT_END;
4427 else if (S_GET_STORAGE_CLASS (sym) == C_BSTAT)
4429 /* We want the value to be the symbol index of the referenced
4430 csect symbol. BFD will do that for us if we set the right
4431 flags. */
4432 S_SET_VALUE (sym,
4433 ((valueT)
4434 coffsymbol (symbol_get_bfdsym
4435 (symbol_get_tc (sym)->within))->native));
4436 coffsymbol (symbol_get_bfdsym (sym))->native->fix_value = 1;
4438 else if (S_GET_STORAGE_CLASS (sym) == C_STSYM)
4440 symbolS *block;
4441 symbolS *csect;
4443 /* The value is the offset from the enclosing csect. */
4444 block = symbol_get_tc (sym)->within;
4445 csect = symbol_get_tc (block)->within;
4446 resolve_symbol_value (csect);
4447 S_SET_VALUE (sym, S_GET_VALUE (sym) - S_GET_VALUE (csect));
4449 else if (S_GET_STORAGE_CLASS (sym) == C_BINCL
4450 || S_GET_STORAGE_CLASS (sym) == C_EINCL)
4452 /* We want the value to be a file offset into the line numbers.
4453 BFD will do that for us if we set the right flags. We have
4454 already set the value correctly. */
4455 coffsymbol (symbol_get_bfdsym (sym))->native->fix_line = 1;
4458 return 0;
4461 /* Adjust the symbol table. This creates csect symbols for all
4462 absolute symbols. */
4464 void
4465 ppc_adjust_symtab ()
4467 symbolS *sym;
4469 if (! ppc_saw_abs)
4470 return;
4472 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
4474 symbolS *csect;
4475 int i;
4476 union internal_auxent *a;
4478 if (S_GET_SEGMENT (sym) != absolute_section)
4479 continue;
4481 csect = symbol_create (".abs[XO]", absolute_section,
4482 S_GET_VALUE (sym), &zero_address_frag);
4483 symbol_get_bfdsym (csect)->value = S_GET_VALUE (sym);
4484 S_SET_STORAGE_CLASS (csect, C_HIDEXT);
4485 i = S_GET_NUMBER_AUXILIARY (csect);
4486 S_SET_NUMBER_AUXILIARY (csect, i + 1);
4487 a = &coffsymbol (symbol_get_bfdsym (csect))->native[i + 1].u.auxent;
4488 a->x_csect.x_scnlen.l = 0;
4489 a->x_csect.x_smtyp = XTY_SD;
4490 a->x_csect.x_parmhash = 0;
4491 a->x_csect.x_snhash = 0;
4492 a->x_csect.x_smclas = XMC_XO;
4493 a->x_csect.x_stab = 0;
4494 a->x_csect.x_snstab = 0;
4496 symbol_insert (csect, sym, &symbol_rootP, &symbol_lastP);
4498 i = S_GET_NUMBER_AUXILIARY (sym);
4499 a = &coffsymbol (symbol_get_bfdsym (sym))->native[i].u.auxent;
4500 a->x_csect.x_scnlen.p = coffsymbol (symbol_get_bfdsym (csect))->native;
4501 coffsymbol (symbol_get_bfdsym (sym))->native[i].fix_scnlen = 1;
4504 ppc_saw_abs = false;
4507 /* Set the VMA for a section. This is called on all the sections in
4508 turn. */
4510 void
4511 ppc_frob_section (sec)
4512 asection *sec;
4514 static bfd_size_type vma = 0;
4516 bfd_set_section_vma (stdoutput, sec, vma);
4517 vma += bfd_section_size (stdoutput, sec);
4520 #endif /* OBJ_XCOFF */
4522 /* Turn a string in input_line_pointer into a floating point constant
4523 of type TYPE, and store the appropriate bytes in *LITP. The number
4524 of LITTLENUMS emitted is stored in *SIZEP. An error message is
4525 returned, or NULL on OK. */
4527 char *
4528 md_atof (type, litp, sizep)
4529 int type;
4530 char *litp;
4531 int *sizep;
4533 int prec;
4534 LITTLENUM_TYPE words[4];
4535 char *t;
4536 int i;
4538 switch (type)
4540 case 'f':
4541 prec = 2;
4542 break;
4544 case 'd':
4545 prec = 4;
4546 break;
4548 default:
4549 *sizep = 0;
4550 return _("bad call to md_atof");
4553 t = atof_ieee (input_line_pointer, type, words);
4554 if (t)
4555 input_line_pointer = t;
4557 *sizep = prec * 2;
4559 if (target_big_endian)
4561 for (i = 0; i < prec; i++)
4563 md_number_to_chars (litp, (valueT) words[i], 2);
4564 litp += 2;
4567 else
4569 for (i = prec - 1; i >= 0; i--)
4571 md_number_to_chars (litp, (valueT) words[i], 2);
4572 litp += 2;
4576 return NULL;
4579 /* Write a value out to the object file, using the appropriate
4580 endianness. */
4582 void
4583 md_number_to_chars (buf, val, n)
4584 char *buf;
4585 valueT val;
4586 int n;
4588 if (target_big_endian)
4589 number_to_chars_bigendian (buf, val, n);
4590 else
4591 number_to_chars_littleendian (buf, val, n);
4594 /* Align a section (I don't know why this is machine dependent). */
4596 valueT
4597 md_section_align (seg, addr)
4598 asection *seg;
4599 valueT addr;
4601 int align = bfd_get_section_alignment (stdoutput, seg);
4603 return ((addr + (1 << align) - 1) & (-1 << align));
4606 /* We don't have any form of relaxing. */
4609 md_estimate_size_before_relax (fragp, seg)
4610 fragS *fragp ATTRIBUTE_UNUSED;
4611 asection *seg ATTRIBUTE_UNUSED;
4613 abort ();
4614 return 0;
4617 /* Convert a machine dependent frag. We never generate these. */
4619 void
4620 md_convert_frag (abfd, sec, fragp)
4621 bfd *abfd ATTRIBUTE_UNUSED;
4622 asection *sec ATTRIBUTE_UNUSED;
4623 fragS *fragp ATTRIBUTE_UNUSED;
4625 abort ();
4628 /* We have no need to default values of symbols. */
4630 symbolS *
4631 md_undefined_symbol (name)
4632 char *name ATTRIBUTE_UNUSED;
4634 return 0;
4637 /* Functions concerning relocs. */
4639 /* The location from which a PC relative jump should be calculated,
4640 given a PC relative reloc. */
4642 long
4643 md_pcrel_from_section (fixp, sec)
4644 fixS *fixp;
4645 segT sec ATTRIBUTE_UNUSED;
4647 return fixp->fx_frag->fr_address + fixp->fx_where;
4650 #ifdef OBJ_XCOFF
4652 /* This is called to see whether a fixup should be adjusted to use a
4653 section symbol. We take the opportunity to change a fixup against
4654 a symbol in the TOC subsegment into a reloc against the
4655 corresponding .tc symbol. */
4658 ppc_fix_adjustable (fix)
4659 fixS *fix;
4661 valueT val;
4663 resolve_symbol_value (fix->fx_addsy);
4664 val = S_GET_VALUE (fix->fx_addsy);
4665 if (ppc_toc_csect != (symbolS *) NULL
4666 && fix->fx_addsy != (symbolS *) NULL
4667 && fix->fx_addsy != ppc_toc_csect
4668 && S_GET_SEGMENT (fix->fx_addsy) == data_section
4669 && val >= ppc_toc_frag->fr_address
4670 && (ppc_after_toc_frag == (fragS *) NULL
4671 || val < ppc_after_toc_frag->fr_address))
4673 symbolS *sy;
4675 for (sy = symbol_next (ppc_toc_csect);
4676 sy != (symbolS *) NULL;
4677 sy = symbol_next (sy))
4679 if (symbol_get_tc (sy)->class == XMC_TC0)
4680 continue;
4681 if (symbol_get_tc (sy)->class != XMC_TC)
4682 break;
4683 resolve_symbol_value (sy);
4684 if (val == S_GET_VALUE (sy))
4686 fix->fx_addsy = sy;
4687 fix->fx_addnumber = val - ppc_toc_frag->fr_address;
4688 return 0;
4692 as_bad_where (fix->fx_file, fix->fx_line,
4693 _("symbol in .toc does not match any .tc"));
4696 /* Possibly adjust the reloc to be against the csect. */
4697 if (fix->fx_addsy != (symbolS *) NULL
4698 && symbol_get_tc (fix->fx_addsy)->subseg == 0
4699 && symbol_get_tc (fix->fx_addsy)->class != XMC_TC0
4700 && symbol_get_tc (fix->fx_addsy)->class != XMC_TC
4701 && S_GET_SEGMENT (fix->fx_addsy) != bss_section
4702 /* Don't adjust if this is a reloc in the toc section. */
4703 && (S_GET_SEGMENT (fix->fx_addsy) != data_section
4704 || ppc_toc_csect == NULL
4705 || val < ppc_toc_frag->fr_address
4706 || (ppc_after_toc_frag != NULL
4707 && val >= ppc_after_toc_frag->fr_address)))
4709 symbolS *csect;
4711 if (S_GET_SEGMENT (fix->fx_addsy) == text_section)
4712 csect = ppc_text_csects;
4713 else if (S_GET_SEGMENT (fix->fx_addsy) == data_section)
4714 csect = ppc_data_csects;
4715 else
4716 abort ();
4718 /* Skip the initial dummy symbol. */
4719 csect = symbol_get_tc (csect)->next;
4721 if (csect != (symbolS *) NULL)
4723 while (symbol_get_tc (csect)->next != (symbolS *) NULL
4724 && (symbol_get_frag (symbol_get_tc (csect)->next)->fr_address
4725 <= val))
4727 /* If the csect address equals the symbol value, then we
4728 have to look through the full symbol table to see
4729 whether this is the csect we want. Note that we will
4730 only get here if the csect has zero length. */
4731 if ((symbol_get_frag (csect)->fr_address == val)
4732 && S_GET_VALUE (csect) == S_GET_VALUE (fix->fx_addsy))
4734 symbolS *scan;
4736 for (scan = symbol_next (csect);
4737 scan != NULL;
4738 scan = symbol_next (scan))
4740 if (symbol_get_tc (scan)->subseg != 0)
4741 break;
4742 if (scan == fix->fx_addsy)
4743 break;
4746 /* If we found the symbol before the next csect
4747 symbol, then this is the csect we want. */
4748 if (scan == fix->fx_addsy)
4749 break;
4752 csect = symbol_get_tc (csect)->next;
4755 fix->fx_offset += (S_GET_VALUE (fix->fx_addsy)
4756 - symbol_get_frag (csect)->fr_address);
4757 fix->fx_addsy = csect;
4761 /* Adjust a reloc against a .lcomm symbol to be against the base
4762 .lcomm. */
4763 if (fix->fx_addsy != (symbolS *) NULL
4764 && S_GET_SEGMENT (fix->fx_addsy) == bss_section
4765 && ! S_IS_EXTERNAL (fix->fx_addsy))
4767 resolve_symbol_value (symbol_get_frag (fix->fx_addsy)->fr_symbol);
4768 fix->fx_offset +=
4769 (S_GET_VALUE (fix->fx_addsy)
4770 - S_GET_VALUE (symbol_get_frag (fix->fx_addsy)->fr_symbol));
4771 fix->fx_addsy = symbol_get_frag (fix->fx_addsy)->fr_symbol;
4774 return 0;
4777 /* A reloc from one csect to another must be kept. The assembler
4778 will, of course, keep relocs between sections, and it will keep
4779 absolute relocs, but we need to force it to keep PC relative relocs
4780 between two csects in the same section. */
4783 ppc_force_relocation (fix)
4784 fixS *fix;
4786 /* At this point fix->fx_addsy should already have been converted to
4787 a csect symbol. If the csect does not include the fragment, then
4788 we need to force the relocation. */
4789 if (fix->fx_pcrel
4790 && fix->fx_addsy != NULL
4791 && symbol_get_tc (fix->fx_addsy)->subseg != 0
4792 && ((symbol_get_frag (fix->fx_addsy)->fr_address
4793 > fix->fx_frag->fr_address)
4794 || (symbol_get_tc (fix->fx_addsy)->next != NULL
4795 && (symbol_get_frag (symbol_get_tc (fix->fx_addsy)->next)->fr_address
4796 <= fix->fx_frag->fr_address))))
4797 return 1;
4799 return 0;
4802 #endif /* OBJ_XCOFF */
4804 /* See whether a symbol is in the TOC section. */
4806 static int
4807 ppc_is_toc_sym (sym)
4808 symbolS *sym;
4810 #ifdef OBJ_XCOFF
4811 return symbol_get_tc (sym)->class == XMC_TC;
4812 #else
4813 return strcmp (segment_name (S_GET_SEGMENT (sym)), ".got") == 0;
4814 #endif
4817 /* Apply a fixup to the object code. This is called for all the
4818 fixups we generated by the call to fix_new_exp, above. In the call
4819 above we used a reloc code which was the largest legal reloc code
4820 plus the operand index. Here we undo that to recover the operand
4821 index. At this point all symbol values should be fully resolved,
4822 and we attempt to completely resolve the reloc. If we can not do
4823 that, we determine the correct reloc code and put it back in the
4824 fixup. */
4827 md_apply_fix3 (fixp, valuep, seg)
4828 fixS *fixp;
4829 valueT *valuep;
4830 segT seg;
4832 valueT value;
4834 #ifdef OBJ_ELF
4835 value = *valuep;
4836 if (fixp->fx_addsy != NULL)
4838 /* `*valuep' may contain the value of the symbol on which the reloc
4839 will be based; we have to remove it. */
4840 if (symbol_used_in_reloc_p (fixp->fx_addsy)
4841 && S_GET_SEGMENT (fixp->fx_addsy) != absolute_section
4842 && S_GET_SEGMENT (fixp->fx_addsy) != undefined_section
4843 && ! bfd_is_com_section (S_GET_SEGMENT (fixp->fx_addsy)))
4844 value -= S_GET_VALUE (fixp->fx_addsy);
4846 /* FIXME: Why '+'? Better yet, what exactly is '*valuep'
4847 supposed to be? I think this is related to various similar
4848 FIXMEs in tc-i386.c and tc-sparc.c. */
4849 if (fixp->fx_pcrel)
4850 value += fixp->fx_frag->fr_address + fixp->fx_where;
4852 else
4854 fixp->fx_done = 1;
4856 #else
4857 /* FIXME FIXME FIXME: The value we are passed in *valuep includes
4858 the symbol values. Since we are using BFD_ASSEMBLER, if we are
4859 doing this relocation the code in write.c is going to call
4860 bfd_install_relocation, which is also going to use the symbol
4861 value. That means that if the reloc is fully resolved we want to
4862 use *valuep since bfd_install_relocation is not being used.
4863 However, if the reloc is not fully resolved we do not want to use
4864 *valuep, and must use fx_offset instead. However, if the reloc
4865 is PC relative, we do want to use *valuep since it includes the
4866 result of md_pcrel_from. This is confusing. */
4867 if (fixp->fx_addsy == (symbolS *) NULL)
4869 value = *valuep;
4870 fixp->fx_done = 1;
4872 else if (fixp->fx_pcrel)
4873 value = *valuep;
4874 else
4876 value = fixp->fx_offset;
4877 if (fixp->fx_subsy != (symbolS *) NULL)
4879 if (S_GET_SEGMENT (fixp->fx_subsy) == absolute_section)
4880 value -= S_GET_VALUE (fixp->fx_subsy);
4881 else
4883 /* We can't actually support subtracting a symbol. */
4884 as_bad_where (fixp->fx_file, fixp->fx_line,
4885 _("expression too complex"));
4889 #endif
4891 if ((int) fixp->fx_r_type >= (int) BFD_RELOC_UNUSED)
4893 int opindex;
4894 const struct powerpc_operand *operand;
4895 char *where;
4896 unsigned long insn;
4898 opindex = (int) fixp->fx_r_type - (int) BFD_RELOC_UNUSED;
4900 operand = &powerpc_operands[opindex];
4902 #ifdef OBJ_XCOFF
4903 /* It appears that an instruction like
4904 l 9,LC..1(30)
4905 when LC..1 is not a TOC symbol does not generate a reloc. It
4906 uses the offset of LC..1 within its csect. However, .long
4907 LC..1 will generate a reloc. I can't find any documentation
4908 on how these cases are to be distinguished, so this is a wild
4909 guess. These cases are generated by gcc -mminimal-toc. */
4910 if ((operand->flags & PPC_OPERAND_PARENS) != 0
4911 && operand->bits == 16
4912 && operand->shift == 0
4913 && operand->insert == NULL
4914 && fixp->fx_addsy != NULL
4915 && symbol_get_tc (fixp->fx_addsy)->subseg != 0
4916 && symbol_get_tc (fixp->fx_addsy)->class != XMC_TC
4917 && symbol_get_tc (fixp->fx_addsy)->class != XMC_TC0
4918 && S_GET_SEGMENT (fixp->fx_addsy) != bss_section)
4920 value = fixp->fx_offset;
4921 fixp->fx_done = 1;
4923 #endif
4925 /* Fetch the instruction, insert the fully resolved operand
4926 value, and stuff the instruction back again. */
4927 where = fixp->fx_frag->fr_literal + fixp->fx_where;
4928 if (target_big_endian)
4929 insn = bfd_getb32 ((unsigned char *) where);
4930 else
4931 insn = bfd_getl32 ((unsigned char *) where);
4932 insn = ppc_insert_operand (insn, operand, (offsetT) value,
4933 fixp->fx_file, fixp->fx_line);
4934 if (target_big_endian)
4935 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
4936 else
4937 bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
4939 if (fixp->fx_done)
4941 /* Nothing else to do here. */
4942 return 1;
4945 /* Determine a BFD reloc value based on the operand information.
4946 We are only prepared to turn a few of the operands into
4947 relocs.
4948 FIXME: We need to handle the DS field at the very least.
4949 FIXME: Selecting the reloc type is a bit haphazard; perhaps
4950 there should be a new field in the operand table. */
4951 if ((operand->flags & PPC_OPERAND_RELATIVE) != 0
4952 && operand->bits == 26
4953 && operand->shift == 0)
4954 fixp->fx_r_type = BFD_RELOC_PPC_B26;
4955 else if ((operand->flags & PPC_OPERAND_RELATIVE) != 0
4956 && operand->bits == 16
4957 && operand->shift == 0)
4958 fixp->fx_r_type = BFD_RELOC_PPC_B16;
4959 else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0
4960 && operand->bits == 26
4961 && operand->shift == 0)
4962 fixp->fx_r_type = BFD_RELOC_PPC_BA26;
4963 else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0
4964 && operand->bits == 16
4965 && operand->shift == 0)
4966 fixp->fx_r_type = BFD_RELOC_PPC_BA16;
4967 else if ((operand->flags & PPC_OPERAND_PARENS) != 0
4968 && operand->bits == 16
4969 && operand->shift == 0
4970 && fixp->fx_addsy != NULL
4971 && ppc_is_toc_sym (fixp->fx_addsy))
4973 fixp->fx_size = 2;
4974 if (target_big_endian)
4975 fixp->fx_where += 2;
4976 fixp->fx_r_type = BFD_RELOC_PPC_TOC16;
4978 else
4980 char *sfile;
4981 unsigned int sline;
4983 /* Use expr_symbol_where to see if this is an expression
4984 symbol. */
4985 if (expr_symbol_where (fixp->fx_addsy, &sfile, &sline))
4986 as_bad_where (fixp->fx_file, fixp->fx_line,
4987 _("unresolved expression that must be resolved"));
4988 else
4989 as_bad_where (fixp->fx_file, fixp->fx_line,
4990 _("unsupported relocation type"));
4991 fixp->fx_done = 1;
4992 return 1;
4995 else
4997 #ifdef OBJ_ELF
4998 ppc_elf_validate_fix (fixp, seg);
4999 #endif
5000 switch (fixp->fx_r_type)
5002 case BFD_RELOC_32:
5003 case BFD_RELOC_CTOR:
5004 if (fixp->fx_pcrel)
5005 fixp->fx_r_type = BFD_RELOC_32_PCREL;
5006 /* fall through */
5008 case BFD_RELOC_RVA:
5009 case BFD_RELOC_32_PCREL:
5010 case BFD_RELOC_32_BASEREL:
5011 case BFD_RELOC_PPC_EMB_NADDR32:
5012 md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
5013 value, 4);
5014 break;
5016 case BFD_RELOC_64:
5017 if (fixp->fx_pcrel)
5018 fixp->fx_r_type = BFD_RELOC_64_PCREL;
5019 /* fall through */
5020 case BFD_RELOC_64_PCREL:
5021 md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
5022 value, 8);
5023 break;
5024 case BFD_RELOC_LO16:
5025 case BFD_RELOC_16:
5026 case BFD_RELOC_GPREL16:
5027 case BFD_RELOC_16_GOT_PCREL:
5028 case BFD_RELOC_16_GOTOFF:
5029 case BFD_RELOC_LO16_GOTOFF:
5030 case BFD_RELOC_HI16_GOTOFF:
5031 case BFD_RELOC_HI16_S_GOTOFF:
5032 case BFD_RELOC_LO16_BASEREL:
5033 case BFD_RELOC_HI16_BASEREL:
5034 case BFD_RELOC_HI16_S_BASEREL:
5035 case BFD_RELOC_PPC_EMB_NADDR16:
5036 case BFD_RELOC_PPC_EMB_NADDR16_LO:
5037 case BFD_RELOC_PPC_EMB_NADDR16_HI:
5038 case BFD_RELOC_PPC_EMB_NADDR16_HA:
5039 case BFD_RELOC_PPC_EMB_SDAI16:
5040 case BFD_RELOC_PPC_EMB_SDA2REL:
5041 case BFD_RELOC_PPC_EMB_SDA2I16:
5042 case BFD_RELOC_PPC_EMB_RELSEC16:
5043 case BFD_RELOC_PPC_EMB_RELST_LO:
5044 case BFD_RELOC_PPC_EMB_RELST_HI:
5045 case BFD_RELOC_PPC_EMB_RELST_HA:
5046 case BFD_RELOC_PPC_EMB_RELSDA:
5047 case BFD_RELOC_PPC_TOC16:
5048 if (fixp->fx_pcrel)
5050 if (fixp->fx_addsy != NULL)
5051 as_bad_where (fixp->fx_file, fixp->fx_line,
5052 _("cannot emit PC relative %s relocation against %s"),
5053 bfd_get_reloc_code_name (fixp->fx_r_type),
5054 S_GET_NAME (fixp->fx_addsy));
5055 else
5056 as_bad_where (fixp->fx_file, fixp->fx_line,
5057 _("cannot emit PC relative %s relocation"),
5058 bfd_get_reloc_code_name (fixp->fx_r_type));
5061 md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
5062 value, 2);
5063 break;
5065 /* This case happens when you write, for example,
5066 lis %r3,(L1-L2)@ha
5067 where L1 and L2 are defined later. */
5068 case BFD_RELOC_HI16:
5069 if (fixp->fx_pcrel)
5070 abort ();
5071 md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
5072 value >> 16, 2);
5073 break;
5074 case BFD_RELOC_HI16_S:
5075 if (fixp->fx_pcrel)
5076 abort ();
5077 md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
5078 (value + 0x8000) >> 16, 2);
5079 break;
5081 /* Because SDA21 modifies the register field, the size is set to 4
5082 bytes, rather than 2, so offset it here appropriately. */
5083 case BFD_RELOC_PPC_EMB_SDA21:
5084 if (fixp->fx_pcrel)
5085 abort ();
5087 md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where
5088 + ((target_big_endian) ? 2 : 0),
5089 value, 2);
5090 break;
5092 case BFD_RELOC_8:
5093 if (fixp->fx_pcrel)
5094 abort ();
5096 md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
5097 value, 1);
5098 break;
5100 case BFD_RELOC_24_PLT_PCREL:
5101 case BFD_RELOC_PPC_LOCAL24PC:
5102 if (!fixp->fx_pcrel && !fixp->fx_done)
5103 abort ();
5105 if (fixp->fx_done)
5107 char *where;
5108 unsigned long insn;
5110 /* Fetch the instruction, insert the fully resolved operand
5111 value, and stuff the instruction back again. */
5112 where = fixp->fx_frag->fr_literal + fixp->fx_where;
5113 if (target_big_endian)
5114 insn = bfd_getb32 ((unsigned char *) where);
5115 else
5116 insn = bfd_getl32 ((unsigned char *) where);
5117 if ((value & 3) != 0)
5118 as_bad_where (fixp->fx_file, fixp->fx_line,
5119 _("must branch to an address a multiple of 4"));
5120 if ((offsetT) value < -0x40000000
5121 || (offsetT) value >= 0x40000000)
5122 as_bad_where (fixp->fx_file, fixp->fx_line,
5123 _("@local or @plt branch destination is too far away, %ld bytes"),
5124 (long) value);
5125 insn = insn | (value & 0x03fffffc);
5126 if (target_big_endian)
5127 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
5128 else
5129 bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
5131 break;
5133 case BFD_RELOC_VTABLE_INHERIT:
5134 fixp->fx_done = 0;
5135 if (fixp->fx_addsy
5136 && !S_IS_DEFINED (fixp->fx_addsy)
5137 && !S_IS_WEAK (fixp->fx_addsy))
5138 S_SET_WEAK (fixp->fx_addsy);
5139 break;
5141 case BFD_RELOC_VTABLE_ENTRY:
5142 fixp->fx_done = 0;
5143 break;
5145 default:
5146 fprintf (stderr,
5147 _("Gas failure, reloc value %d\n"), fixp->fx_r_type);
5148 fflush (stderr);
5149 abort ();
5153 #ifdef OBJ_ELF
5154 fixp->fx_addnumber = value;
5155 #else
5156 if (fixp->fx_r_type != BFD_RELOC_PPC_TOC16)
5157 fixp->fx_addnumber = 0;
5158 else
5160 #ifdef TE_PE
5161 fixp->fx_addnumber = 0;
5162 #else
5163 /* We want to use the offset within the data segment of the
5164 symbol, not the actual VMA of the symbol. */
5165 fixp->fx_addnumber =
5166 - bfd_get_section_vma (stdoutput, S_GET_SEGMENT (fixp->fx_addsy));
5167 #endif
5169 #endif
5171 return 1;
5174 /* Generate a reloc for a fixup. */
5176 arelent *
5177 tc_gen_reloc (seg, fixp)
5178 asection *seg ATTRIBUTE_UNUSED;
5179 fixS *fixp;
5181 arelent *reloc;
5183 reloc = (arelent *) xmalloc (sizeof (arelent));
5185 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
5186 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
5187 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
5188 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
5189 if (reloc->howto == (reloc_howto_type *) NULL)
5191 as_bad_where (fixp->fx_file, fixp->fx_line,
5192 _("reloc %d not supported by object file format"),
5193 (int) fixp->fx_r_type);
5194 return NULL;
5196 reloc->addend = fixp->fx_addnumber;
5198 return reloc;