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