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