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