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