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