1 /* tc-ppc.c -- Assemble for the PowerPC or POWER (RS/6000)
2 Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor, Cygnus Support.
5 This file is part of GAS, the GNU Assembler.
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
26 #include "opcode/ppc.h"
36 /* This is the assembler for the PowerPC or POWER (RS/6000) chips. */
38 /* Tell the main code what the endianness is. */
39 extern int target_big_endian;
41 /* Whether or not, we've set target_big_endian. */
42 static int set_target_endian = 0;
44 /* Whether to use user friendly register names. */
45 #ifndef TARGET_REG_NAMES_P
47 #define TARGET_REG_NAMES_P true
49 #define TARGET_REG_NAMES_P false
53 static boolean reg_names_p = TARGET_REG_NAMES_P;
55 static void ppc_set_cpu PARAMS ((void));
56 static unsigned long ppc_insert_operand
57 PARAMS ((unsigned long insn, const struct powerpc_operand *operand,
58 offsetT val, char *file, unsigned int line));
59 static void ppc_macro PARAMS ((char *str, const struct powerpc_macro *macro));
60 static void ppc_byte PARAMS ((int));
61 static int ppc_is_toc_sym PARAMS ((symbolS *sym));
62 static void ppc_tc PARAMS ((int));
65 static void ppc_comm PARAMS ((int));
66 static void ppc_bb PARAMS ((int));
67 static void ppc_bc PARAMS ((int));
68 static void ppc_bf PARAMS ((int));
69 static void ppc_biei PARAMS ((int));
70 static void ppc_bs PARAMS ((int));
71 static void ppc_eb PARAMS ((int));
72 static void ppc_ec PARAMS ((int));
73 static void ppc_ef PARAMS ((int));
74 static void ppc_es PARAMS ((int));
75 static void ppc_csect PARAMS ((int));
76 static void ppc_change_csect PARAMS ((symbolS *));
77 static void ppc_function PARAMS ((int));
78 static void ppc_extern PARAMS ((int));
79 static void ppc_lglobl PARAMS ((int));
80 static void ppc_section PARAMS ((int));
81 static void ppc_stabx PARAMS ((int));
82 static void ppc_rename PARAMS ((int));
83 static void ppc_toc PARAMS ((int));
87 static bfd_reloc_code_real_type ppc_elf_suffix PARAMS ((char **));
88 static void ppc_elf_cons PARAMS ((int));
89 static void ppc_elf_validate_fix PARAMS ((fixS *, segT));
93 static void ppc_set_current_section PARAMS ((segT));
94 static void ppc_previous PARAMS ((int));
95 static void ppc_pdata PARAMS ((int));
96 static void ppc_ydata PARAMS ((int));
97 static void ppc_reldata PARAMS ((int));
98 static void ppc_rdata PARAMS ((int));
99 static void ppc_ualong PARAMS ((int));
100 static void ppc_znop PARAMS ((int));
101 static void ppc_pe_comm PARAMS ((int));
102 static void ppc_pe_section PARAMS ((int));
103 static void ppc_pe_function PARAMS ((int));
104 static void ppc_pe_tocd PARAMS ((int));
107 /* Generic assembler global variables which must be defined by all
110 /* Characters which always start a comment. */
111 const char comment_chars[] = "#";
113 /* Characters which start a comment at the beginning of a line. */
114 const char line_comment_chars[] = "#";
116 /* Characters which may be used to separate multiple commands on a
118 const char line_separator_chars[] = ";";
120 /* Characters which are used to indicate an exponent in a floating
122 const char EXP_CHARS[] = "eE";
124 /* Characters which mean that a number is a floating point constant,
126 const char FLT_CHARS[] = "dD";
128 /* The target specific pseudo-ops which we support. */
130 const pseudo_typeS md_pseudo_table[] =
132 /* Pseudo-ops which must be overridden. */
133 { "byte", ppc_byte, 0 },
136 /* Pseudo-ops specific to the RS/6000 XCOFF format. Some of these
137 legitimately belong in the obj-*.c file. However, XCOFF is based
138 on COFF, and is only implemented for the RS/6000. We just use
139 obj-coff.c, and add what we need here. */
140 { "comm", ppc_comm, 0 },
141 { "lcomm", ppc_comm, 1 },
145 { "bi", ppc_biei, 0 },
147 { "csect", ppc_csect, 0 },
148 { "data", ppc_section, 'd' },
152 { "ei", ppc_biei, 1 },
154 { "extern", ppc_extern, 0 },
155 { "function", ppc_function, 0 },
156 { "lglobl", ppc_lglobl, 0 },
157 { "rename", ppc_rename, 0 },
158 { "stabx", ppc_stabx, 0 },
159 { "text", ppc_section, 't' },
160 { "toc", ppc_toc, 0 },
164 { "long", ppc_elf_cons, 4 },
165 { "word", ppc_elf_cons, 2 },
166 { "short", ppc_elf_cons, 2 },
170 /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format */
171 { "previous", ppc_previous, 0 },
172 { "pdata", ppc_pdata, 0 },
173 { "ydata", ppc_ydata, 0 },
174 { "reldata", ppc_reldata, 0 },
175 { "rdata", ppc_rdata, 0 },
176 { "ualong", ppc_ualong, 0 },
177 { "znop", ppc_znop, 0 },
178 { "comm", ppc_pe_comm, 0 },
179 { "lcomm", ppc_pe_comm, 1 },
180 { "section", ppc_pe_section, 0 },
181 { "function", ppc_pe_function,0 },
182 { "tocd", ppc_pe_tocd, 0 },
185 /* This pseudo-op is used even when not generating XCOFF output. */
192 /* Predefined register names if -mregnames (or default for Windows NT). */
193 /* In general, there are lots of them, in an attempt to be compatible */
194 /* with a number of other Windows NT assemblers. */
196 /* Structure to hold information about predefined registers. */
203 /* List of registers that are pre-defined:
205 Each general register has predefined names of the form:
206 1. r<reg_num> which has the value <reg_num>.
207 2. r.<reg_num> which has the value <reg_num>.
210 Each floating point register has predefined names of the form:
211 1. f<reg_num> which has the value <reg_num>.
212 2. f.<reg_num> which has the value <reg_num>.
214 Each condition register has predefined names of the form:
215 1. cr<reg_num> which has the value <reg_num>.
216 2. cr.<reg_num> which has the value <reg_num>.
218 There are individual registers as well:
219 sp or r.sp has the value 1
220 rtoc or r.toc has the value 2
221 fpscr has the value 0
227 dsisr has the value 18
229 sdr1 has the value 25
230 srr0 has the value 26
231 srr1 has the value 27
233 The table is sorted. Suitable for searching by a binary search. */
235 static const struct pd_reg pre_defined_registers[] =
237 { "cr.0", 0 }, /* Condition Registers */
257 { "dar", 19 }, /* Data Access Register */
258 { "dec", 22 }, /* Decrementer */
259 { "dsisr", 18 }, /* Data Storage Interrupt Status Register */
261 { "f.0", 0 }, /* Floating point registers */
329 { "lr", 8 }, /* Link Register */
333 { "r.0", 0 }, /* General Purpose Registers */
366 { "r.sp", 1 }, /* Stack Pointer */
368 { "r.toc", 2 }, /* Pointer to the table of contents */
370 { "r0", 0 }, /* More general purpose registers */
403 { "rtoc", 2 }, /* Table of contents */
405 { "sdr1", 25 }, /* Storage Description Register 1 */
409 { "srr0", 26 }, /* Machine Status Save/Restore Register 0 */
410 { "srr1", 27 }, /* Machine Status Save/Restore Register 1 */
416 #define REG_NAME_CNT (sizeof(pre_defined_registers) / sizeof(struct pd_reg))
418 /* Given NAME, find the register number associated with that name, return
419 the integer value associated with the given name or -1 on failure. */
421 static int reg_name_search PARAMS ( (char * name) );
424 reg_name_search (name)
427 int middle, low, high;
431 high = REG_NAME_CNT - 1;
435 middle = (low + high) / 2;
436 cmp = strcasecmp (name, pre_defined_registers[middle].name);
442 return pre_defined_registers[middle].value;
450 * Summary of register_name().
452 * in: Input_line_pointer points to 1st char of operand.
454 * out: A expressionS.
455 * The operand may have been a register: in this case, X_op == O_register,
456 * X_add_number is set to the register number, and truth is returned.
457 * Input_line_pointer->(next non-blank) char after operand, or is in its
462 register_name (expressionP)
463 expressionS *expressionP;
470 /* Find the spelling of the operand */
471 start = name = input_line_pointer;
472 if (name[0] == '%' && isalpha (name[1]))
473 name = ++input_line_pointer;
475 else if (!reg_names_p || !isalpha (name[0]))
478 c = get_symbol_end ();
479 reg_number = reg_name_search (name);
481 /* look to see if it's in the register table */
484 expressionP->X_op = O_register;
485 expressionP->X_add_number = reg_number;
487 /* make the rest nice */
488 expressionP->X_add_symbol = NULL;
489 expressionP->X_op_symbol = NULL;
490 *input_line_pointer = c; /* put back the delimiting char */
495 /* reset the line as if we had not done anything */
496 *input_line_pointer = c; /* put back the delimiting char */
497 input_line_pointer = start; /* reset input_line pointer */
503 /* Local variables. */
505 /* The type of processor we are assembling for. This is one or more
506 of the PPC_OPCODE flags defined in opcode/ppc.h. */
507 static int ppc_cpu = 0;
509 /* The size of the processor we are assembling for. This is either
510 PPC_OPCODE_32 or PPC_OPCODE_64. */
511 static int ppc_size = PPC_OPCODE_32;
513 /* Opcode hash table. */
514 static struct hash_control *ppc_hash;
516 /* Macro hash table. */
517 static struct hash_control *ppc_macro_hash;
520 /* Whether to warn about non PC relative relocations that aren't
521 in the .got2 section. */
522 static boolean mrelocatable = false;
524 /* Flags to set in the elf header */
525 static flagword ppc_flags = 0;
530 /* The RS/6000 assembler uses the .csect pseudo-op to generate code
531 using a bunch of different sections. These assembler sections,
532 however, are all encompassed within the .text or .data sections of
533 the final output file. We handle this by using different
534 subsegments within these main segments. */
536 /* Next subsegment to allocate within the .text segment. */
537 static subsegT ppc_text_subsegment = 2;
539 /* Linked list of csects in the text section. */
540 static symbolS *ppc_text_csects;
542 /* Next subsegment to allocate within the .data segment. */
543 static subsegT ppc_data_subsegment = 2;
545 /* Linked list of csects in the data section. */
546 static symbolS *ppc_data_csects;
548 /* The current csect. */
549 static symbolS *ppc_current_csect;
551 /* The RS/6000 assembler uses a TOC which holds addresses of functions
552 and variables. Symbols are put in the TOC with the .tc pseudo-op.
553 A special relocation is used when accessing TOC entries. We handle
554 the TOC as a subsegment within the .data segment. We set it up if
555 we see a .toc pseudo-op, and save the csect symbol here. */
556 static symbolS *ppc_toc_csect;
558 /* The first frag in the TOC subsegment. */
559 static fragS *ppc_toc_frag;
561 /* The first frag in the first subsegment after the TOC in the .data
562 segment. NULL if there are no subsegments after the TOC. */
563 static fragS *ppc_after_toc_frag;
565 /* The current static block. */
566 static symbolS *ppc_current_block;
568 /* The COFF debugging section; set by md_begin. This is not the
569 .debug section, but is instead the secret BFD section which will
570 cause BFD to set the section number of a symbol to N_DEBUG. */
571 static asection *ppc_coff_debug_section;
573 #endif /* OBJ_XCOFF */
577 /* Various sections that we need for PE coff support. */
578 static segT ydata_section;
579 static segT pdata_section;
580 static segT reldata_section;
581 static segT rdata_section;
582 static segT tocdata_section;
584 /* The current section and the previous section. See ppc_previous. */
585 static segT ppc_previous_section;
586 static segT ppc_current_section;
591 symbolS *GOT_symbol; /* Pre-defined "_GLOBAL_OFFSET_TABLE" */
594 #ifndef WORKING_DOT_WORD
595 const int md_short_jump_size = 4;
596 const int md_long_jump_size = 4;
600 CONST char *md_shortopts = "um:VQ:";
602 CONST char *md_shortopts = "um:";
604 struct option md_longopts[] = {
605 {NULL, no_argument, NULL, 0}
607 size_t md_longopts_size = sizeof(md_longopts);
610 md_parse_option (c, arg)
617 /* -u means that any undefined symbols should be treated as
618 external, which is the default for gas anyhow. */
622 /* -mpwrx and -mpwr2 mean to assemble for the IBM POWER/2
624 if (strcmp (arg, "pwrx") == 0 || strcmp (arg, "pwr2") == 0)
625 ppc_cpu = PPC_OPCODE_POWER | PPC_OPCODE_POWER2;
626 /* -mpwr means to assemble for the IBM POWER (RIOS1). */
627 else if (strcmp (arg, "pwr") == 0)
628 ppc_cpu = PPC_OPCODE_POWER;
629 /* -m601 means to assemble for the Motorola PowerPC 601, which includes
630 instructions that are holdovers from the Power. */
631 else if (strcmp (arg, "601") == 0)
632 ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_601;
633 /* -mppc, -mppc32, -m603, and -m604 mean to assemble for the
634 Motorola PowerPC 603/604. */
635 else if (strcmp (arg, "ppc") == 0
636 || strcmp (arg, "ppc32") == 0
637 || strcmp (arg, "403") == 0
638 || strcmp (arg, "603") == 0
639 || strcmp (arg, "604") == 0)
640 ppc_cpu = PPC_OPCODE_PPC;
641 /* -mppc64 and -m620 mean to assemble for the 64-bit PowerPC
643 else if (strcmp (arg, "ppc64") == 0 || strcmp (arg, "620") == 0)
645 ppc_cpu = PPC_OPCODE_PPC;
646 ppc_size = PPC_OPCODE_64;
648 /* -mcom means assemble for the common intersection between Power
649 and PowerPC. At present, we just allow the union, rather
650 than the intersection. */
651 else if (strcmp (arg, "com") == 0)
652 ppc_cpu = PPC_OPCODE_COMMON;
653 /* -many means to assemble for any architecture (PWR/PWRX/PPC). */
654 else if (strcmp (arg, "any") == 0)
655 ppc_cpu = PPC_OPCODE_ANY;
657 else if (strcmp (arg, "regnames") == 0)
660 else if (strcmp (arg, "no-regnames") == 0)
664 /* -mrelocatable/-mrelocatable-lib -- warn about initializations that require relocation */
665 else if (strcmp (arg, "relocatable") == 0)
668 ppc_flags |= EF_PPC_RELOCATABLE;
671 else if (strcmp (arg, "relocatable-lib") == 0)
674 ppc_flags |= EF_PPC_RELOCATABLE_LIB;
677 /* -memb, set embedded bit */
678 else if (strcmp (arg, "emb") == 0)
679 ppc_flags |= EF_PPC_EMB;
681 /* -mlittle/-mbig set the endianess */
682 else if (strcmp (arg, "little") == 0 || strcmp (arg, "little-endian") == 0)
684 target_big_endian = 0;
685 set_target_endian = 1;
688 else if (strcmp (arg, "big") == 0 || strcmp (arg, "big-endian") == 0)
690 target_big_endian = 1;
691 set_target_endian = 1;
696 as_bad ("invalid switch -m%s", arg);
702 /* -V: SVR4 argument to print version ID. */
707 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
708 should be emitted or not. FIXME: Not implemented. */
721 md_show_usage (stream)
727 -mpwrx, -mpwr2 generate code for IBM POWER/2 (RIOS2)\n\
728 -mpwr generate code for IBM POWER (RIOS1)\n\
729 -m601 generate code for Motorola PowerPC 601\n\
730 -mppc, -mppc32, -m403, -m603, -m604\n\
731 generate code for Motorola PowerPC 603/604\n\
732 -mppc64, -m620 generate code for Motorola PowerPC 620\n\
733 -mcom generate code Power/PowerPC common instructions\n\
734 -many generate code for any architecture (PWR/PWRX/PPC)\n\
735 -mregnames Allow symbolic names for registers\n\
736 -mno-regnames Do not allow symbolic names for registers\n");
739 -mrelocatable support for GCC's -mrelocatble option\n\
740 -mrelocatable-lib support for GCC's -mrelocatble-lib option\n\
741 -memb set PPC_EMB bit in ELF flags\n\
742 -mlittle, -mlittle-endian\n\
743 generate code for a little endian machine\n\
744 -mbig, -mbig-endian generate code for a big endian machine\n\
745 -V print assembler version number\n\
746 -Qy, -Qn ignored\n");
750 /* Set ppc_cpu if it is not already set. */
755 const char *default_cpu = TARGET_CPU;
759 if (strcmp (default_cpu, "rs6000") == 0)
760 ppc_cpu = PPC_OPCODE_POWER;
761 else if (strcmp (default_cpu, "powerpc") == 0
762 || strcmp (default_cpu, "powerpcle") == 0)
763 ppc_cpu = PPC_OPCODE_PPC;
765 as_fatal ("Unknown default cpu = %s", default_cpu);
769 /* Figure out the BFD architecture to use. */
771 enum bfd_architecture
774 const char *default_cpu = TARGET_CPU;
777 if ((ppc_cpu & PPC_OPCODE_PPC) != 0)
778 return bfd_arch_powerpc;
779 else if ((ppc_cpu & PPC_OPCODE_POWER) != 0)
780 return bfd_arch_rs6000;
781 else if ((ppc_cpu & (PPC_OPCODE_COMMON | PPC_OPCODE_ANY)) != 0)
783 if (strcmp (default_cpu, "rs6000") == 0)
784 return bfd_arch_rs6000;
785 else if (strcmp (default_cpu, "powerpc") == 0
786 || strcmp (default_cpu, "powerpcle") == 0)
787 return bfd_arch_powerpc;
790 as_fatal ("Neither Power nor PowerPC opcodes were selected.");
791 return bfd_arch_unknown;
794 /* This function is called when the assembler starts up. It is called
795 after the options have been parsed and the output file has been
801 register const struct powerpc_opcode *op;
802 const struct powerpc_opcode *op_end;
803 const struct powerpc_macro *macro;
804 const struct powerpc_macro *macro_end;
805 boolean dup_insn = false;
810 /* Set the ELF flags if desired. */
812 bfd_set_private_flags (stdoutput, ppc_flags);
815 /* Insert the opcodes into a hash table. */
816 ppc_hash = hash_new ();
818 op_end = powerpc_opcodes + powerpc_num_opcodes;
819 for (op = powerpc_opcodes; op < op_end; op++)
821 know ((op->opcode & op->mask) == op->opcode);
823 if ((op->flags & ppc_cpu) != 0
824 && ((op->flags & (PPC_OPCODE_32 | PPC_OPCODE_64)) == 0
825 || (op->flags & (PPC_OPCODE_32 | PPC_OPCODE_64)) == ppc_size))
829 retval = hash_insert (ppc_hash, op->name, (PTR) op);
830 if (retval != (const char *) NULL)
832 /* Ignore Power duplicates for -m601 */
833 if ((ppc_cpu & PPC_OPCODE_601) != 0
834 && (op->flags & PPC_OPCODE_POWER) != 0)
837 as_bad ("Internal assembler error for instruction %s", op->name);
843 /* Insert the macros into a hash table. */
844 ppc_macro_hash = hash_new ();
846 macro_end = powerpc_macros + powerpc_num_macros;
847 for (macro = powerpc_macros; macro < macro_end; macro++)
849 if ((macro->flags & ppc_cpu) != 0)
853 retval = hash_insert (ppc_macro_hash, macro->name, (PTR) macro);
854 if (retval != (const char *) NULL)
856 as_bad ("Internal assembler error for macro %s", macro->name);
865 /* Tell the main code what the endianness is if it is not overidden by the user. */
866 if (!set_target_endian)
868 set_target_endian = 1;
869 target_big_endian = PPC_BIG_ENDIAN;
873 ppc_coff_debug_section = coff_section_from_bfd_index (stdoutput, N_DEBUG);
875 /* Create dummy symbols to serve as initial csects. This forces the
876 text csects to precede the data csects. These symbols will not
878 ppc_text_csects = symbol_make ("dummy\001");
879 ppc_text_csects->sy_tc.within = ppc_text_csects;
880 ppc_data_csects = symbol_make ("dummy\001");
881 ppc_data_csects->sy_tc.within = ppc_data_csects;
886 ppc_current_section = text_section;
887 ppc_previous_section = 0;
892 /* Insert an operand value into an instruction. */
895 ppc_insert_operand (insn, operand, val, file, line)
897 const struct powerpc_operand *operand;
902 if (operand->bits != 32)
907 if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
909 if ((operand->flags & PPC_OPERAND_SIGNOPT) != 0
910 && ppc_size == PPC_OPCODE_32)
911 max = (1 << operand->bits) - 1;
913 max = (1 << (operand->bits - 1)) - 1;
914 min = - (1 << (operand->bits - 1));
918 max = (1 << operand->bits) - 1;
922 if ((operand->flags & PPC_OPERAND_NEGATIVE) != 0)
927 if (test < (offsetT) min || test > (offsetT) max)
930 "operand out of range (%s not between %ld and %ld)";
933 sprint_value (buf, test);
934 if (file == (char *) NULL)
935 as_warn (err, buf, min, max);
937 as_warn_where (file, line, err, buf, min, max);
946 insn = (*operand->insert) (insn, (long) val, &errmsg);
947 if (errmsg != (const char *) NULL)
951 insn |= (((long) val & ((1 << operand->bits) - 1))
958 /* Parse @got, etc. and return the desired relocation. */
959 static bfd_reloc_code_real_type
960 ppc_elf_suffix (str_p)
966 bfd_reloc_code_real_type reloc;
976 #define MAP(str,reloc) { str, sizeof(str)-1, reloc }
978 static struct map_bfd mapping[] = {
979 MAP ("l", BFD_RELOC_LO16),
980 MAP ("h", BFD_RELOC_HI16),
981 MAP ("ha", BFD_RELOC_HI16_S),
982 MAP ("brtaken", BFD_RELOC_PPC_B16_BRTAKEN),
983 MAP ("brntaken", BFD_RELOC_PPC_B16_BRNTAKEN),
984 MAP ("got", BFD_RELOC_16_GOTOFF),
985 MAP ("got@l", BFD_RELOC_LO16_GOTOFF),
986 MAP ("got@h", BFD_RELOC_HI16_GOTOFF),
987 MAP ("got@ha", BFD_RELOC_HI16_S_GOTOFF),
988 MAP ("fixup", BFD_RELOC_CTOR), /* warnings with -mrelocatable */
989 MAP ("pltrel24", BFD_RELOC_24_PLT_PCREL),
990 MAP ("copy", BFD_RELOC_PPC_COPY),
991 MAP ("globdat", BFD_RELOC_PPC_GLOB_DAT),
992 MAP ("local24pc", BFD_RELOC_PPC_LOCAL24PC),
993 MAP ("plt", BFD_RELOC_32_PLTOFF),
994 MAP ("pltrel", BFD_RELOC_32_PLT_PCREL),
995 MAP ("plt@l", BFD_RELOC_LO16_PLTOFF),
996 MAP ("plt@h", BFD_RELOC_HI16_PLTOFF),
997 MAP ("plt@ha", BFD_RELOC_HI16_S_PLTOFF),
998 MAP ("sdarel", BFD_RELOC_GPREL16),
999 MAP ("sectoff", BFD_RELOC_32_BASEREL),
1000 MAP ("sectoff@l", BFD_RELOC_LO16_BASEREL),
1001 MAP ("sectoff@h", BFD_RELOC_HI16_BASEREL),
1002 MAP ("sectoff@ha", BFD_RELOC_HI16_S_BASEREL),
1003 MAP ("naddr", BFD_RELOC_PPC_EMB_NADDR32),
1004 MAP ("naddr16", BFD_RELOC_PPC_EMB_NADDR16),
1005 MAP ("naddr@l", BFD_RELOC_PPC_EMB_NADDR16_LO),
1006 MAP ("naddr@h", BFD_RELOC_PPC_EMB_NADDR16_HI),
1007 MAP ("naddr@ha", BFD_RELOC_PPC_EMB_NADDR16_HA),
1008 MAP ("sdai16", BFD_RELOC_PPC_EMB_SDAI16),
1009 MAP ("sda2rel", BFD_RELOC_PPC_EMB_SDA2REL),
1010 MAP ("sda2i16", BFD_RELOC_PPC_EMB_SDA2I16),
1011 MAP ("sda21", BFD_RELOC_PPC_EMB_SDA21),
1012 MAP ("mrkref", BFD_RELOC_PPC_EMB_MRKREF),
1013 MAP ("relsect", BFD_RELOC_PPC_EMB_RELSEC16),
1014 MAP ("relsect@l", BFD_RELOC_PPC_EMB_RELST_LO),
1015 MAP ("relsect@h", BFD_RELOC_PPC_EMB_RELST_HI),
1016 MAP ("relsect@ha", BFD_RELOC_PPC_EMB_RELST_HA),
1017 MAP ("bitfld", BFD_RELOC_PPC_EMB_BIT_FLD),
1018 MAP ("relsda", BFD_RELOC_PPC_EMB_RELSDA),
1019 MAP ("xgot", BFD_RELOC_PPC_TOC16),
1021 { (char *)0, 0, BFD_RELOC_UNUSED }
1025 return BFD_RELOC_UNUSED;
1027 for (ch = *str, str2 = ident;
1028 str2 < ident + sizeof(ident) - 1 && isalnum (ch) || ch == '@';
1031 *str2++ = (islower (ch)) ? ch : tolower (ch);
1038 for (ptr = &mapping[0]; ptr->length > 0; ptr++)
1039 if (ch == ptr->string[0] && len == ptr->length && memcmp (ident, ptr->string, ptr->length) == 0)
1045 return BFD_RELOC_UNUSED;
1048 /* Like normal .long/.short/.word, except support @got, etc. */
1049 /* clobbers input_line_pointer, checks */
1052 ppc_elf_cons (nbytes)
1053 register int nbytes; /* 1=.byte, 2=.word, 4=.long */
1056 bfd_reloc_code_real_type reloc;
1058 if (is_it_end_of_statement ())
1060 demand_empty_rest_of_line ();
1067 if (exp.X_op == O_symbol
1068 && *input_line_pointer == '@'
1069 && (reloc = ppc_elf_suffix (&input_line_pointer)) != BFD_RELOC_UNUSED)
1071 reloc_howto_type *reloc_howto = bfd_reloc_type_lookup (stdoutput, reloc);
1072 int size = bfd_get_reloc_size (reloc_howto);
1075 as_bad ("%s relocations do not fit in %d bytes\n", reloc_howto->name, nbytes);
1079 register char *p = frag_more ((int) nbytes);
1080 int offset = nbytes - size;
1082 fix_new_exp (frag_now, p - frag_now->fr_literal + offset, size, &exp, 0, reloc);
1086 emit_expr (&exp, (unsigned int) nbytes);
1088 while (*input_line_pointer++ == ',');
1090 input_line_pointer--; /* Put terminator back into stream. */
1091 demand_empty_rest_of_line ();
1094 /* Validate any relocations emitted for -mrelocatable, possibly adding
1095 fixups for word relocations in writable segments, so we can adjust
1098 ppc_elf_validate_fix (fixp, seg)
1105 && fixp->fx_r_type <= BFD_RELOC_UNUSED
1106 && strcmp (segment_name (seg), ".got2") != 0
1107 && strcmp (segment_name (seg), ".dtors") != 0
1108 && strcmp (segment_name (seg), ".ctors") != 0
1109 && strcmp (segment_name (seg), ".fixup") != 0
1110 && strcmp (segment_name (seg), ".stab") != 0
1111 && strcmp (segment_name (seg), ".gcc_except_table") != 0)
1113 if ((seg->flags & (SEC_READONLY | SEC_CODE)) != 0
1114 || fixp->fx_r_type != BFD_RELOC_CTOR)
1116 as_warn_where (fixp->fx_file, fixp->fx_line,
1117 "Relocation cannot be done when using -mrelocatable");
1122 #endif /* OBJ_ELF */
1127 * Summary of parse_toc_entry().
1129 * in: Input_line_pointer points to the '[' in one of:
1131 * [toc] [tocv] [toc32] [toc64]
1133 * Anything else is an error of one kind or another.
1136 * return value: success or failure
1137 * toc_kind: kind of toc reference
1138 * input_line_pointer:
1139 * success: first char after the ']'
1140 * failure: unchanged
1144 * [toc] - rv == success, toc_kind = default_toc
1145 * [tocv] - rv == success, toc_kind = data_in_toc
1146 * [toc32] - rv == success, toc_kind = must_be_32
1147 * [toc64] - rv == success, toc_kind = must_be_64
1151 enum toc_size_qualifier
1153 default_toc, /* The toc cell constructed should be the system default size */
1154 data_in_toc, /* This is a direct reference to a toc cell */
1155 must_be_32, /* The toc cell constructed must be 32 bits wide */
1156 must_be_64 /* The toc cell constructed must be 64 bits wide */
1160 parse_toc_entry(toc_kind)
1161 enum toc_size_qualifier *toc_kind;
1166 enum toc_size_qualifier t;
1168 /* save the input_line_pointer */
1169 start = input_line_pointer;
1171 /* skip over the '[' , and whitespace */
1172 ++input_line_pointer;
1175 /* find the spelling of the operand */
1176 toc_spec = input_line_pointer;
1177 c = get_symbol_end ();
1179 if (strcmp(toc_spec, "toc") == 0)
1183 else if (strcmp(toc_spec, "tocv") == 0)
1187 else if (strcmp(toc_spec, "toc32") == 0)
1191 else if (strcmp(toc_spec, "toc64") == 0)
1197 as_bad ("syntax error: invalid toc specifier `%s'", toc_spec);
1198 *input_line_pointer = c; /* put back the delimiting char */
1199 input_line_pointer = start; /* reset input_line pointer */
1203 /* now find the ']' */
1204 *input_line_pointer = c; /* put back the delimiting char */
1206 SKIP_WHITESPACE (); /* leading whitespace could be there. */
1207 c = *input_line_pointer++; /* input_line_pointer->past char in c. */
1211 as_bad ("syntax error: expected `]', found `%c'", c);
1212 input_line_pointer = start; /* reset input_line pointer */
1216 *toc_kind = t; /* set return value */
1223 /* We need to keep a list of fixups. We can't simply generate them as
1224 we go, because that would require us to first create the frag, and
1225 that would screw up references to ``.''. */
1231 bfd_reloc_code_real_type reloc;
1234 #define MAX_INSN_FIXUPS (5)
1236 /* This routine is called for each instruction to be assembled. */
1243 const struct powerpc_opcode *opcode;
1245 const unsigned char *opindex_ptr;
1249 struct ppc_fixup fixups[MAX_INSN_FIXUPS];
1254 bfd_reloc_code_real_type reloc;
1257 /* Get the opcode. */
1258 for (s = str; *s != '\0' && ! isspace (*s); s++)
1263 /* Look up the opcode in the hash table. */
1264 opcode = (const struct powerpc_opcode *) hash_find (ppc_hash, str);
1265 if (opcode == (const struct powerpc_opcode *) NULL)
1267 const struct powerpc_macro *macro;
1269 macro = (const struct powerpc_macro *) hash_find (ppc_macro_hash, str);
1270 if (macro == (const struct powerpc_macro *) NULL)
1271 as_bad ("Unrecognized opcode: `%s'", str);
1273 ppc_macro (s, macro);
1278 insn = opcode->opcode;
1281 while (isspace (*str))
1284 /* PowerPC operands are just expressions. The only real issue is
1285 that a few operand types are optional. All cases which might use
1286 an optional operand separate the operands only with commas (in
1287 some cases parentheses are used, as in ``lwz 1,0(1)'' but such
1288 cases never have optional operands). There is never more than
1289 one optional operand for an instruction. So, before we start
1290 seriously parsing the operands, we check to see if we have an
1291 optional operand, and, if we do, we count the number of commas to
1292 see whether the operand should be omitted. */
1294 for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
1296 const struct powerpc_operand *operand;
1298 operand = &powerpc_operands[*opindex_ptr];
1299 if ((operand->flags & PPC_OPERAND_OPTIONAL) != 0)
1301 unsigned int opcount;
1303 /* There is an optional operand. Count the number of
1304 commas in the input line. */
1311 while ((s = strchr (s, ',')) != (char *) NULL)
1318 /* If there are fewer operands in the line then are called
1319 for by the instruction, we want to skip the optional
1321 if (opcount < strlen (opcode->operands))
1328 /* Gather the operands. */
1332 for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
1334 const struct powerpc_operand *operand;
1340 if (next_opindex == 0)
1341 operand = &powerpc_operands[*opindex_ptr];
1344 operand = &powerpc_operands[next_opindex];
1350 /* If this is a fake operand, then we do not expect anything
1352 if ((operand->flags & PPC_OPERAND_FAKE) != 0)
1354 insn = (*operand->insert) (insn, 0L, &errmsg);
1355 if (errmsg != (const char *) NULL)
1360 /* If this is an optional operand, and we are skipping it, just
1362 if ((operand->flags & PPC_OPERAND_OPTIONAL) != 0
1365 if (operand->insert)
1367 insn = (*operand->insert) (insn, 0L, &errmsg);
1368 if (errmsg != (const char *) NULL)
1371 if ((operand->flags & PPC_OPERAND_NEXT) != 0)
1372 next_opindex = *opindex_ptr + 1;
1376 /* Gather the operand. */
1377 hold = input_line_pointer;
1378 input_line_pointer = str;
1381 if (*input_line_pointer == '[')
1383 /* We are expecting something like the second argument here:
1385 lwz r4,[toc].GS.0.static_int(rtoc)
1386 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
1387 The argument following the `]' must be a symbol name, and the
1388 register must be the toc register: 'rtoc' or '2'
1390 The effect is to 0 as the displacement field
1391 in the instruction, and issue an IMAGE_REL_PPC_TOCREL16 (or
1392 the appropriate variation) reloc against it based on the symbol.
1393 The linker will build the toc, and insert the resolved toc offset.
1396 o The size of the toc entry is currently assumed to be
1397 32 bits. This should not be assumed to be a hard coded
1399 o In an effort to cope with a change from 32 to 64 bits,
1400 there are also toc entries that are specified to be
1401 either 32 or 64 bits:
1402 lwz r4,[toc32].GS.0.static_int(rtoc)
1403 lwz r4,[toc64].GS.0.static_int(rtoc)
1404 These demand toc entries of the specified size, and the
1405 instruction probably requires it.
1409 enum toc_size_qualifier toc_kind;
1410 bfd_reloc_code_real_type toc_reloc;
1412 /* go parse off the [tocXX] part */
1413 valid_toc = parse_toc_entry(&toc_kind);
1417 /* Note: message has already been issued. */
1418 /* FIXME: what sort of recovery should we do? */
1419 /* demand_rest_of_line(); return; ? */
1422 /* Now get the symbol following the ']' */
1428 /* In this case, we may not have seen the symbol yet, since */
1429 /* it is allowed to appear on a .extern or .globl or just be */
1430 /* a label in the .data section. */
1431 toc_reloc = BFD_RELOC_PPC_TOC16;
1434 /* 1. The symbol must be defined and either in the toc */
1435 /* section, or a global. */
1436 /* 2. The reloc generated must have the TOCDEFN flag set in */
1437 /* upper bit mess of the reloc type. */
1438 /* FIXME: It's a little confusing what the tocv qualifier can */
1439 /* be used for. At the very least, I've seen three */
1440 /* uses, only one of which I'm sure I can explain. */
1441 if (ex.X_op == O_symbol)
1443 assert (ex.X_add_symbol != NULL);
1444 if (ex.X_add_symbol->bsym->section != tocdata_section)
1446 as_warn("[tocv] symbol is not a toc symbol");
1450 toc_reloc = BFD_RELOC_PPC_TOC16;
1453 /* FIXME: these next two specifically specify 32/64 bit toc */
1454 /* entries. We don't support them today. Is this the */
1455 /* right way to say that? */
1456 toc_reloc = BFD_RELOC_UNUSED;
1457 as_bad ("Unimplemented toc32 expression modifier");
1460 /* FIXME: see above */
1461 toc_reloc = BFD_RELOC_UNUSED;
1462 as_bad ("Unimplemented toc64 expression modifier");
1466 "Unexpected return value [%d] from parse_toc_entry!\n",
1472 /* We need to generate a fixup for this expression. */
1473 if (fc >= MAX_INSN_FIXUPS)
1474 as_fatal ("too many fixups");
1476 fixups[fc].reloc = toc_reloc;
1477 fixups[fc].exp = ex;
1478 fixups[fc].opindex = *opindex_ptr;
1481 /* Ok. We've set up the fixup for the instruction. Now make it
1482 look like the constant 0 was found here */
1484 ex.X_op = O_constant;
1485 ex.X_add_number = 0;
1486 ex.X_add_symbol = NULL;
1487 ex.X_op_symbol = NULL;
1492 if (!register_name(&ex))
1495 str = input_line_pointer;
1496 input_line_pointer = hold;
1498 if (ex.X_op == O_illegal)
1499 as_bad ("illegal operand");
1500 else if (ex.X_op == O_absent)
1501 as_bad ("missing operand");
1502 else if (ex.X_op == O_register)
1504 insn = ppc_insert_operand (insn, operand, ex.X_add_number,
1507 else if (ex.X_op == O_constant)
1510 /* Allow @HA, @L, @H on constants. */
1511 char *orig_str = str;
1513 if ((reloc = ppc_elf_suffix (&str)) != BFD_RELOC_UNUSED)
1520 case BFD_RELOC_LO16:
1521 ex.X_add_number = ((ex.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
1524 case BFD_RELOC_HI16:
1525 ex.X_add_number = (ex.X_add_number >> 16) & 0xffff;
1528 case BFD_RELOC_HI16_S:
1529 ex.X_add_number = ((ex.X_add_number >> 16) & 0xffff)
1530 + ((ex.X_add_number >> 15) & 1);
1534 insn = ppc_insert_operand (insn, operand, ex.X_add_number,
1538 else if ((reloc = ppc_elf_suffix (&str)) != BFD_RELOC_UNUSED)
1540 /* For the absoulte forms of branchs, convert the PC relative form back into
1542 if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0)
1545 case BFD_RELOC_PPC_B26: reloc = BFD_RELOC_PPC_BA26; break;
1546 case BFD_RELOC_PPC_B16: reloc = BFD_RELOC_PPC_BA16; break;
1547 case BFD_RELOC_PPC_B16_BRTAKEN: reloc = BFD_RELOC_PPC_BA16_BRTAKEN; break;
1548 case BFD_RELOC_PPC_B16_BRNTAKEN: reloc = BFD_RELOC_PPC_BA16_BRNTAKEN; break;
1551 /* We need to generate a fixup for this expression. */
1552 if (fc >= MAX_INSN_FIXUPS)
1553 as_fatal ("too many fixups");
1554 fixups[fc].exp = ex;
1555 fixups[fc].opindex = 0;
1556 fixups[fc].reloc = reloc;
1559 #endif /* OBJ_ELF */
1563 /* We need to generate a fixup for this expression. */
1564 if (fc >= MAX_INSN_FIXUPS)
1565 as_fatal ("too many fixups");
1566 fixups[fc].exp = ex;
1567 fixups[fc].opindex = *opindex_ptr;
1568 fixups[fc].reloc = BFD_RELOC_UNUSED;
1577 else if ((operand->flags & PPC_OPERAND_PARENS) != 0)
1585 /* The call to expression should have advanced str past any
1588 && (endc != ',' || *str != '\0'))
1590 as_bad ("syntax error; found `%c' but expected `%c'", *str, endc);
1598 while (isspace (*str))
1602 as_bad ("junk at end of line: `%s'", str);
1604 /* Write out the instruction. */
1606 md_number_to_chars (f, insn, 4);
1608 /* Create any fixups. At this point we do not use a
1609 bfd_reloc_code_real_type, but instead just use the
1610 BFD_RELOC_UNUSED plus the operand index. This lets us easily
1611 handle fixups for any operand type, although that is admittedly
1612 not a very exciting feature. We pick a BFD reloc type in
1614 for (i = 0; i < fc; i++)
1616 const struct powerpc_operand *operand;
1618 operand = &powerpc_operands[fixups[i].opindex];
1619 if (fixups[i].reloc != BFD_RELOC_UNUSED)
1621 reloc_howto_type *reloc_howto = bfd_reloc_type_lookup (stdoutput, fixups[i].reloc);
1629 size = bfd_get_reloc_size (reloc_howto);
1630 offset = target_big_endian ? (4 - size) : 0;
1632 if (size < 1 || size > 4)
1635 fixP = fix_new_exp (frag_now, f - frag_now->fr_literal + offset, size,
1636 &fixups[i].exp, reloc_howto->pc_relative,
1639 /* Turn off complaints that the addend is too large for things like
1641 switch (fixups[i].reloc)
1643 case BFD_RELOC_16_GOTOFF:
1644 case BFD_RELOC_PPC_TOC16:
1645 case BFD_RELOC_LO16:
1646 case BFD_RELOC_HI16:
1647 case BFD_RELOC_HI16_S:
1648 fixP->fx_no_overflow = 1;
1655 fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
1657 (operand->flags & PPC_OPERAND_RELATIVE) != 0,
1658 ((bfd_reloc_code_real_type)
1659 (fixups[i].opindex + (int) BFD_RELOC_UNUSED)));
1663 #ifndef WORKING_DOT_WORD
1664 /* Handle long and short jumps */
1666 md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
1668 addressT from_addr, to_addr;
1676 md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
1678 addressT from_addr, to_addr;
1686 /* Handle a macro. Gather all the operands, transform them as
1687 described by the macro, and call md_assemble recursively. All the
1688 operands are separated by commas; we don't accept parentheses
1689 around operands here. */
1692 ppc_macro (str, macro)
1694 const struct powerpc_macro *macro;
1705 /* Gather the users operands into the operands array. */
1710 if (count >= sizeof operands / sizeof operands[0])
1712 operands[count++] = s;
1713 s = strchr (s, ',');
1714 if (s == (char *) NULL)
1719 if (count != macro->operands)
1721 as_bad ("wrong number of operands");
1725 /* Work out how large the string must be (the size is unbounded
1726 because it includes user input). */
1728 format = macro->format;
1729 while (*format != '\0')
1738 arg = strtol (format + 1, &send, 10);
1739 know (send != format && arg >= 0 && arg < count);
1740 len += strlen (operands[arg]);
1745 /* Put the string together. */
1746 complete = s = (char *) alloca (len + 1);
1747 format = macro->format;
1748 while (*format != '\0')
1754 arg = strtol (format + 1, &send, 10);
1755 strcpy (s, operands[arg]);
1762 /* Assemble the constructed instruction. */
1763 md_assemble (complete);
1767 /* For ELF, add support for SHF_EXCLUDE and SHT_ORDERED */
1770 ppc_section_letter (letter, ptr_msg)
1777 *ptr_msg = "Bad .section directive: want a,w,x,e in string";
1782 ppc_section_word (ptr_str)
1785 if (strncmp (*ptr_str, "exclude", sizeof ("exclude")-1) == 0)
1787 *ptr_str += sizeof ("exclude")-1;
1795 ppc_section_type (ptr_str)
1798 if (strncmp (*ptr_str, "ordered", sizeof ("ordered")-1) == 0)
1800 *ptr_str += sizeof ("ordered")-1;
1808 ppc_section_flags (flags, attr, type)
1813 if (type == SHT_ORDERED)
1814 flags |= SEC_ALLOC | SEC_LOAD | SEC_SORT_ENTRIES;
1816 if (attr & SHF_EXCLUDE)
1817 flags |= SEC_EXCLUDE;
1821 #endif /* OBJ_ELF */
1824 /* Pseudo-op handling. */
1826 /* The .byte pseudo-op. This is similar to the normal .byte
1827 pseudo-op, but it can also take a single ASCII string. */
1833 if (*input_line_pointer != '\"')
1839 /* Gather characters. A real double quote is doubled. Unusual
1840 characters are not permitted. */
1841 ++input_line_pointer;
1846 c = *input_line_pointer++;
1850 if (*input_line_pointer != '\"')
1852 ++input_line_pointer;
1855 FRAG_APPEND_1_CHAR (c);
1858 demand_empty_rest_of_line ();
1863 /* XCOFF specific pseudo-op handling. */
1865 /* This is set if we are creating a .stabx symbol, since we don't want
1866 to handle symbol suffixes for such symbols. */
1867 static boolean ppc_stab_symbol;
1869 /* The .comm and .lcomm pseudo-ops for XCOFF. XCOFF puts common
1870 symbols in the .bss segment as though they were local common
1871 symbols, and uses a different smclas. */
1877 asection *current_seg = now_seg;
1878 subsegT current_subseg = now_subseg;
1884 symbolS *lcomm_sym = NULL;
1888 name = input_line_pointer;
1889 endc = get_symbol_end ();
1890 end_name = input_line_pointer;
1893 if (*input_line_pointer != ',')
1895 as_bad ("missing size");
1896 ignore_rest_of_line ();
1899 ++input_line_pointer;
1901 size = get_absolute_expression ();
1904 as_bad ("negative size");
1905 ignore_rest_of_line ();
1911 /* The third argument to .comm is the alignment. */
1912 if (*input_line_pointer != ',')
1916 ++input_line_pointer;
1917 align = get_absolute_expression ();
1920 as_warn ("ignoring bad alignment");
1939 /* The third argument to .lcomm appears to be the real local
1940 common symbol to create. References to the symbol named in
1941 the first argument are turned into references to the third
1943 if (*input_line_pointer != ',')
1945 as_bad ("missing real symbol name");
1946 ignore_rest_of_line ();
1949 ++input_line_pointer;
1951 lcomm_name = input_line_pointer;
1952 lcomm_endc = get_symbol_end ();
1954 lcomm_sym = symbol_find_or_make (lcomm_name);
1956 *input_line_pointer = lcomm_endc;
1960 sym = symbol_find_or_make (name);
1963 if (S_IS_DEFINED (sym)
1964 || S_GET_VALUE (sym) != 0)
1966 as_bad ("attempt to redefine symbol");
1967 ignore_rest_of_line ();
1971 record_alignment (bss_section, align);
1974 || ! S_IS_DEFINED (lcomm_sym))
1983 S_SET_EXTERNAL (sym);
1987 lcomm_sym->sy_tc.output = 1;
1988 def_sym = lcomm_sym;
1992 subseg_set (bss_section, 1);
1993 frag_align (align, 0);
1995 def_sym->sy_frag = frag_now;
1996 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, def_sym,
1997 def_size, (char *) NULL);
1999 S_SET_SEGMENT (def_sym, bss_section);
2000 def_sym->sy_tc.align = align;
2004 /* Align the size of lcomm_sym. */
2005 lcomm_sym->sy_frag->fr_offset =
2006 ((lcomm_sym->sy_frag->fr_offset + (1 << align) - 1)
2007 &~ ((1 << align) - 1));
2008 if (align > lcomm_sym->sy_tc.align)
2009 lcomm_sym->sy_tc.align = align;
2014 /* Make sym an offset from lcomm_sym. */
2015 S_SET_SEGMENT (sym, bss_section);
2016 sym->sy_frag = lcomm_sym->sy_frag;
2017 S_SET_VALUE (sym, lcomm_sym->sy_frag->fr_offset);
2018 lcomm_sym->sy_frag->fr_offset += size;
2021 subseg_set (current_seg, current_subseg);
2023 demand_empty_rest_of_line ();
2026 /* The .csect pseudo-op. This switches us into a different
2027 subsegment. The first argument is a symbol whose value is the
2028 start of the .csect. In COFF, csect symbols get special aux
2029 entries defined by the x_csect field of union internal_auxent. The
2030 optional second argument is the alignment (the default is 2). */
2040 name = input_line_pointer;
2041 endc = get_symbol_end ();
2043 sym = symbol_find_or_make (name);
2045 *input_line_pointer = endc;
2047 if (S_GET_NAME (sym)[0] == '\0')
2049 /* An unnamed csect is assumed to be [PR]. */
2050 sym->sy_tc.class = XMC_PR;
2053 ppc_change_csect (sym);
2055 if (*input_line_pointer == ',')
2057 ++input_line_pointer;
2058 sym->sy_tc.align = get_absolute_expression ();
2061 demand_empty_rest_of_line ();
2064 /* Change to a different csect. */
2067 ppc_change_csect (sym)
2070 if (S_IS_DEFINED (sym))
2071 subseg_set (S_GET_SEGMENT (sym), sym->sy_tc.subseg);
2078 /* This is a new csect. We need to look at the symbol class to
2079 figure out whether it should go in the text section or the
2082 switch (sym->sy_tc.class)
2092 S_SET_SEGMENT (sym, text_section);
2093 sym->sy_tc.subseg = ppc_text_subsegment;
2094 ++ppc_text_subsegment;
2095 list_ptr = &ppc_text_csects;
2104 if (ppc_toc_csect != NULL
2105 && ppc_toc_csect->sy_tc.subseg + 1 == ppc_data_subsegment)
2107 S_SET_SEGMENT (sym, data_section);
2108 sym->sy_tc.subseg = ppc_data_subsegment;
2109 ++ppc_data_subsegment;
2110 list_ptr = &ppc_data_csects;
2116 subseg_new (segment_name (S_GET_SEGMENT (sym)), sym->sy_tc.subseg);
2118 ppc_after_toc_frag = frag_now;
2120 sym->sy_frag = frag_now;
2121 S_SET_VALUE (sym, (valueT) frag_now_fix ());
2123 sym->sy_tc.align = 2;
2124 sym->sy_tc.output = 1;
2125 sym->sy_tc.within = sym;
2127 for (list = *list_ptr;
2128 list->sy_tc.next != (symbolS *) NULL;
2129 list = list->sy_tc.next)
2131 list->sy_tc.next = sym;
2133 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
2134 symbol_append (sym, list->sy_tc.within, &symbol_rootP, &symbol_lastP);
2137 ppc_current_csect = sym;
2140 /* This function handles the .text and .data pseudo-ops. These
2141 pseudo-ops aren't really used by XCOFF; we implement them for the
2142 convenience of people who aren't used to XCOFF. */
2153 else if (type == 'd')
2158 sym = symbol_find_or_make (name);
2160 ppc_change_csect (sym);
2162 demand_empty_rest_of_line ();
2165 /* The .extern pseudo-op. We create an undefined symbol. */
2174 name = input_line_pointer;
2175 endc = get_symbol_end ();
2177 (void) symbol_find_or_make (name);
2179 *input_line_pointer = endc;
2181 demand_empty_rest_of_line ();
2184 /* The .lglobl pseudo-op. Keep the symbol in the symbol table. */
2194 name = input_line_pointer;
2195 endc = get_symbol_end ();
2197 sym = symbol_find_or_make (name);
2199 *input_line_pointer = endc;
2201 sym->sy_tc.output = 1;
2203 demand_empty_rest_of_line ();
2206 /* The .rename pseudo-op. The RS/6000 assembler can rename symbols,
2207 although I don't know why it bothers. */
2218 name = input_line_pointer;
2219 endc = get_symbol_end ();
2221 sym = symbol_find_or_make (name);
2223 *input_line_pointer = endc;
2225 if (*input_line_pointer != ',')
2227 as_bad ("missing rename string");
2228 ignore_rest_of_line ();
2231 ++input_line_pointer;
2233 sym->sy_tc.real_name = demand_copy_C_string (&len);
2235 demand_empty_rest_of_line ();
2238 /* The .stabx pseudo-op. This is similar to a normal .stabs
2239 pseudo-op, but slightly different. A sample is
2240 .stabx "main:F-1",.main,142,0
2241 The first argument is the symbol name to create. The second is the
2242 value, and the third is the storage class. The fourth seems to be
2243 always zero, and I am assuming it is the type. */
2254 name = demand_copy_C_string (&len);
2256 if (*input_line_pointer != ',')
2258 as_bad ("missing value");
2261 ++input_line_pointer;
2263 ppc_stab_symbol = true;
2264 sym = symbol_make (name);
2265 ppc_stab_symbol = false;
2267 sym->sy_tc.real_name = name;
2269 (void) expression (&exp);
2276 as_bad ("illegal .stabx expression; zero assumed");
2277 exp.X_add_number = 0;
2280 S_SET_VALUE (sym, (valueT) exp.X_add_number);
2281 sym->sy_frag = &zero_address_frag;
2285 if (S_GET_SEGMENT (exp.X_add_symbol) == undefined_section)
2286 sym->sy_value = exp;
2290 exp.X_add_number + S_GET_VALUE (exp.X_add_symbol));
2291 sym->sy_frag = exp.X_add_symbol->sy_frag;
2296 /* The value is some complex expression. This will probably
2297 fail at some later point, but this is probably the right
2298 thing to do here. */
2299 sym->sy_value = exp;
2303 S_SET_SEGMENT (sym, ppc_coff_debug_section);
2304 sym->bsym->flags |= BSF_DEBUGGING;
2306 if (*input_line_pointer != ',')
2308 as_bad ("missing class");
2311 ++input_line_pointer;
2313 S_SET_STORAGE_CLASS (sym, get_absolute_expression ());
2315 if (*input_line_pointer != ',')
2317 as_bad ("missing type");
2320 ++input_line_pointer;
2322 S_SET_DATA_TYPE (sym, get_absolute_expression ());
2324 sym->sy_tc.output = 1;
2326 if (S_GET_STORAGE_CLASS (sym) == C_STSYM)
2327 sym->sy_tc.within = ppc_current_block;
2329 if (exp.X_op != O_symbol
2330 || ! S_IS_EXTERNAL (exp.X_add_symbol)
2331 || S_GET_SEGMENT (exp.X_add_symbol) != bss_section)
2332 ppc_frob_label (sym);
2335 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
2336 symbol_append (sym, exp.X_add_symbol, &symbol_rootP, &symbol_lastP);
2337 if (ppc_current_csect->sy_tc.within == exp.X_add_symbol)
2338 ppc_current_csect->sy_tc.within = sym;
2341 demand_empty_rest_of_line ();
2344 /* The .function pseudo-op. This takes several arguments. The first
2345 argument seems to be the external name of the symbol. The second
2346 argment seems to be the label for the start of the function. gcc
2347 uses the same name for both. I have no idea what the third and
2348 fourth arguments are meant to be. The optional fifth argument is
2349 an expression for the size of the function. In COFF this symbol
2350 gets an aux entry like that used for a csect. */
2353 ppc_function (ignore)
2362 name = input_line_pointer;
2363 endc = get_symbol_end ();
2365 /* Ignore any [PR] suffix. */
2366 name = ppc_canonicalize_symbol_name (name);
2367 s = strchr (name, '[');
2368 if (s != (char *) NULL
2369 && strcmp (s + 1, "PR]") == 0)
2372 ext_sym = symbol_find_or_make (name);
2374 *input_line_pointer = endc;
2376 if (*input_line_pointer != ',')
2378 as_bad ("missing symbol name");
2379 ignore_rest_of_line ();
2382 ++input_line_pointer;
2384 name = input_line_pointer;
2385 endc = get_symbol_end ();
2387 lab_sym = symbol_find_or_make (name);
2389 *input_line_pointer = endc;
2391 if (ext_sym != lab_sym)
2393 ext_sym->sy_value.X_op = O_symbol;
2394 ext_sym->sy_value.X_add_symbol = lab_sym;
2395 ext_sym->sy_value.X_op_symbol = NULL;
2396 ext_sym->sy_value.X_add_number = 0;
2399 if (ext_sym->sy_tc.class == -1)
2400 ext_sym->sy_tc.class = XMC_PR;
2401 ext_sym->sy_tc.output = 1;
2403 if (*input_line_pointer == ',')
2407 /* Ignore the third argument. */
2408 ++input_line_pointer;
2409 expression (&ignore);
2410 if (*input_line_pointer == ',')
2412 /* Ignore the fourth argument. */
2413 ++input_line_pointer;
2414 expression (&ignore);
2415 if (*input_line_pointer == ',')
2417 /* The fifth argument is the function size. */
2418 ++input_line_pointer;
2419 ext_sym->sy_tc.size = symbol_new ("L0\001",
2422 &zero_address_frag);
2423 pseudo_set (ext_sym->sy_tc.size);
2428 S_SET_DATA_TYPE (ext_sym, DT_FCN << N_BTSHFT);
2429 SF_SET_FUNCTION (ext_sym);
2430 SF_SET_PROCESS (ext_sym);
2431 coff_add_linesym (ext_sym);
2433 demand_empty_rest_of_line ();
2436 /* The .bf pseudo-op. This is just like a COFF C_FCN symbol named
2445 sym = symbol_make (".bf");
2446 S_SET_SEGMENT (sym, text_section);
2447 sym->sy_frag = frag_now;
2448 S_SET_VALUE (sym, frag_now_fix ());
2449 S_SET_STORAGE_CLASS (sym, C_FCN);
2451 coff_line_base = get_absolute_expression ();
2453 S_SET_NUMBER_AUXILIARY (sym, 1);
2454 SA_SET_SYM_LNNO (sym, coff_line_base);
2456 sym->sy_tc.output = 1;
2458 ppc_frob_label (sym);
2460 demand_empty_rest_of_line ();
2463 /* The .ef pseudo-op. This is just like a COFF C_FCN symbol named
2464 ".ef", except that the line number is absolute, not relative to the
2465 most recent ".bf" symbol. */
2473 sym = symbol_make (".ef");
2474 S_SET_SEGMENT (sym, text_section);
2475 sym->sy_frag = frag_now;
2476 S_SET_VALUE (sym, frag_now_fix ());
2477 S_SET_STORAGE_CLASS (sym, C_FCN);
2478 S_SET_NUMBER_AUXILIARY (sym, 1);
2479 SA_SET_SYM_LNNO (sym, get_absolute_expression ());
2480 sym->sy_tc.output = 1;
2482 ppc_frob_label (sym);
2484 demand_empty_rest_of_line ();
2487 /* The .bi and .ei pseudo-ops. These take a string argument and
2488 generates a C_BINCL or C_EINCL symbol, which goes at the start of
2500 name = demand_copy_C_string (&len);
2502 /* The value of these symbols is actually file offset. Here we set
2503 the value to the index into the line number entries. In
2504 ppc_frob_symbols we set the fix_line field, which will cause BFD
2505 to do the right thing. */
2507 sym = symbol_make (name);
2508 /* obj-coff.c currently only handles line numbers correctly in the
2510 S_SET_SEGMENT (sym, text_section);
2511 S_SET_VALUE (sym, coff_n_line_nos);
2512 sym->bsym->flags |= BSF_DEBUGGING;
2514 S_SET_STORAGE_CLASS (sym, ei ? C_EINCL : C_BINCL);
2515 sym->sy_tc.output = 1;
2517 for (look = symbol_rootP;
2518 (look != (symbolS *) NULL
2519 && (S_GET_STORAGE_CLASS (look) == C_FILE
2520 || S_GET_STORAGE_CLASS (look) == C_BINCL
2521 || S_GET_STORAGE_CLASS (look) == C_EINCL));
2522 look = symbol_next (look))
2524 if (look != (symbolS *) NULL)
2526 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
2527 symbol_insert (sym, look, &symbol_rootP, &symbol_lastP);
2530 demand_empty_rest_of_line ();
2533 /* The .bs pseudo-op. This generates a C_BSTAT symbol named ".bs".
2534 There is one argument, which is a csect symbol. The value of the
2535 .bs symbol is the index of this csect symbol. */
2546 if (ppc_current_block != NULL)
2547 as_bad ("nested .bs blocks");
2549 name = input_line_pointer;
2550 endc = get_symbol_end ();
2552 csect = symbol_find_or_make (name);
2554 *input_line_pointer = endc;
2556 sym = symbol_make (".bs");
2557 S_SET_SEGMENT (sym, now_seg);
2558 S_SET_STORAGE_CLASS (sym, C_BSTAT);
2559 sym->bsym->flags |= BSF_DEBUGGING;
2560 sym->sy_tc.output = 1;
2562 sym->sy_tc.within = csect;
2564 ppc_frob_label (sym);
2566 ppc_current_block = sym;
2568 demand_empty_rest_of_line ();
2571 /* The .es pseudo-op. Generate a C_ESTART symbol named .es. */
2579 if (ppc_current_block == NULL)
2580 as_bad (".es without preceding .bs");
2582 sym = symbol_make (".es");
2583 S_SET_SEGMENT (sym, now_seg);
2584 S_SET_STORAGE_CLASS (sym, C_ESTAT);
2585 sym->bsym->flags |= BSF_DEBUGGING;
2586 sym->sy_tc.output = 1;
2588 ppc_frob_label (sym);
2590 ppc_current_block = NULL;
2592 demand_empty_rest_of_line ();
2595 /* The .bb pseudo-op. Generate a C_BLOCK symbol named .bb, with a
2604 sym = symbol_make (".bb");
2605 S_SET_SEGMENT (sym, text_section);
2606 sym->sy_frag = frag_now;
2607 S_SET_VALUE (sym, frag_now_fix ());
2608 S_SET_STORAGE_CLASS (sym, C_BLOCK);
2610 S_SET_NUMBER_AUXILIARY (sym, 1);
2611 SA_SET_SYM_LNNO (sym, get_absolute_expression ());
2613 sym->sy_tc.output = 1;
2615 SF_SET_PROCESS (sym);
2617 ppc_frob_label (sym);
2619 demand_empty_rest_of_line ();
2622 /* The .eb pseudo-op. Generate a C_BLOCK symbol named .eb, with a
2631 sym = symbol_make (".eb");
2632 S_SET_SEGMENT (sym, text_section);
2633 sym->sy_frag = frag_now;
2634 S_SET_VALUE (sym, frag_now_fix ());
2635 S_SET_STORAGE_CLASS (sym, C_BLOCK);
2636 S_SET_NUMBER_AUXILIARY (sym, 1);
2637 SA_SET_SYM_LNNO (sym, get_absolute_expression ());
2638 sym->sy_tc.output = 1;
2640 SF_SET_PROCESS (sym);
2642 ppc_frob_label (sym);
2644 demand_empty_rest_of_line ();
2647 /* The .bc pseudo-op. This just creates a C_BCOMM symbol with a
2658 name = demand_copy_C_string (&len);
2659 sym = symbol_make (name);
2660 S_SET_SEGMENT (sym, ppc_coff_debug_section);
2661 sym->bsym->flags |= BSF_DEBUGGING;
2662 S_SET_STORAGE_CLASS (sym, C_BCOMM);
2663 S_SET_VALUE (sym, 0);
2664 sym->sy_tc.output = 1;
2666 ppc_frob_label (sym);
2668 demand_empty_rest_of_line ();
2671 /* The .ec pseudo-op. This just creates a C_ECOMM symbol. */
2679 sym = symbol_make (".ec");
2680 S_SET_SEGMENT (sym, ppc_coff_debug_section);
2681 sym->bsym->flags |= BSF_DEBUGGING;
2682 S_SET_STORAGE_CLASS (sym, C_ECOMM);
2683 S_SET_VALUE (sym, 0);
2684 sym->sy_tc.output = 1;
2686 ppc_frob_label (sym);
2688 demand_empty_rest_of_line ();
2691 /* The .toc pseudo-op. Switch to the .toc subsegment. */
2697 if (ppc_toc_csect != (symbolS *) NULL)
2698 subseg_set (data_section, ppc_toc_csect->sy_tc.subseg);
2705 subseg = ppc_data_subsegment;
2706 ++ppc_data_subsegment;
2708 subseg_new (segment_name (data_section), subseg);
2709 ppc_toc_frag = frag_now;
2711 sym = symbol_find_or_make ("TOC[TC0]");
2712 sym->sy_frag = frag_now;
2713 S_SET_SEGMENT (sym, data_section);
2714 S_SET_VALUE (sym, (valueT) frag_now_fix ());
2715 sym->sy_tc.subseg = subseg;
2716 sym->sy_tc.output = 1;
2717 sym->sy_tc.within = sym;
2719 ppc_toc_csect = sym;
2721 for (list = ppc_data_csects;
2722 list->sy_tc.next != (symbolS *) NULL;
2723 list = list->sy_tc.next)
2725 list->sy_tc.next = sym;
2727 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
2728 symbol_append (sym, list->sy_tc.within, &symbol_rootP, &symbol_lastP);
2731 ppc_current_csect = ppc_toc_csect;
2733 demand_empty_rest_of_line ();
2736 #endif /* OBJ_XCOFF */
2738 /* The .tc pseudo-op. This is used when generating either XCOFF or
2739 ELF. This takes two or more arguments.
2741 When generating XCOFF output, the first argument is the name to
2742 give to this location in the toc; this will be a symbol with class
2743 TC. The rest of the arguments are 4 byte values to actually put at
2744 this location in the TOC; often there is just one more argument, a
2745 relocateable symbol reference.
2747 When not generating XCOFF output, the arguments are the same, but
2748 the first argument is simply ignored. */
2756 /* Define the TOC symbol name. */
2762 if (ppc_toc_csect == (symbolS *) NULL
2763 || ppc_toc_csect != ppc_current_csect)
2765 as_bad (".tc not in .toc section");
2766 ignore_rest_of_line ();
2770 name = input_line_pointer;
2771 endc = get_symbol_end ();
2773 sym = symbol_find_or_make (name);
2775 *input_line_pointer = endc;
2777 if (S_IS_DEFINED (sym))
2781 label = ppc_current_csect->sy_tc.within;
2782 if (label->sy_tc.class != XMC_TC0)
2784 as_warn (".tc with no label");
2785 ignore_rest_of_line ();
2789 S_SET_SEGMENT (label, S_GET_SEGMENT (sym));
2790 label->sy_frag = sym->sy_frag;
2791 S_SET_VALUE (label, S_GET_VALUE (sym));
2793 while (! is_end_of_line[(unsigned char) *input_line_pointer])
2794 ++input_line_pointer;
2799 S_SET_SEGMENT (sym, now_seg);
2800 sym->sy_frag = frag_now;
2801 S_SET_VALUE (sym, (valueT) frag_now_fix ());
2802 sym->sy_tc.class = XMC_TC;
2803 sym->sy_tc.output = 1;
2805 ppc_frob_label (sym);
2808 #else /* ! defined (OBJ_XCOFF) */
2810 /* Skip the TOC symbol name. */
2811 while (is_part_of_name (*input_line_pointer)
2812 || *input_line_pointer == '['
2813 || *input_line_pointer == ']'
2814 || *input_line_pointer == '{'
2815 || *input_line_pointer == '}')
2816 ++input_line_pointer;
2818 /* Align to a four byte boundary. */
2820 record_alignment (now_seg, 2);
2822 #endif /* ! defined (OBJ_XCOFF) */
2824 if (*input_line_pointer != ',')
2825 demand_empty_rest_of_line ();
2828 ++input_line_pointer;
2835 /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format */
2837 /* Set the current section. */
2839 ppc_set_current_section (new)
2842 ppc_previous_section = ppc_current_section;
2843 ppc_current_section = new;
2846 /* pseudo-op: .previous
2847 behaviour: toggles the current section with the previous section.
2849 warnings: "No previous section"
2852 ppc_previous(ignore)
2857 if (ppc_previous_section == NULL)
2859 as_warn("No previous section to return to. Directive ignored.");
2863 subseg_set(ppc_previous_section, 0);
2865 ppc_set_current_section(ppc_previous_section);
2868 /* pseudo-op: .pdata
2869 behaviour: predefined read only data section
2873 initial: .section .pdata "adr3"
2874 a - don't know -- maybe a misprint
2875 d - initialized data
2877 3 - double word aligned (that would be 4 byte boundary)
2880 Tag index tables (also known as the function table) for exception
2881 handling, debugging, etc.
2888 if (pdata_section == 0)
2890 pdata_section = subseg_new (".pdata", 0);
2892 bfd_set_section_flags (stdoutput, pdata_section,
2893 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
2894 | SEC_READONLY | SEC_DATA ));
2896 bfd_set_section_alignment (stdoutput, pdata_section, 2);
2900 pdata_section = subseg_new(".pdata", 0);
2902 ppc_set_current_section(pdata_section);
2905 /* pseudo-op: .ydata
2906 behaviour: predefined read only data section
2910 initial: .section .ydata "drw3"
2911 a - don't know -- maybe a misprint
2912 d - initialized data
2914 3 - double word aligned (that would be 4 byte boundary)
2916 Tag tables (also known as the scope table) for exception handling,
2923 if (ydata_section == 0)
2925 ydata_section = subseg_new (".ydata", 0);
2926 bfd_set_section_flags (stdoutput, ydata_section,
2927 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
2928 | SEC_READONLY | SEC_DATA ));
2930 bfd_set_section_alignment (stdoutput, ydata_section, 3);
2934 ydata_section = subseg_new (".ydata", 0);
2936 ppc_set_current_section(ydata_section);
2939 /* pseudo-op: .reldata
2940 behaviour: predefined read write data section
2941 double word aligned (4-byte)
2942 FIXME: relocation is applied to it
2943 FIXME: what's the difference between this and .data?
2946 initial: .section .reldata "drw3"
2947 d - initialized data
2950 3 - double word aligned (that would be 8 byte boundary)
2953 Like .data, but intended to hold data subject to relocation, such as
2954 function descriptors, etc.
2960 if (reldata_section == 0)
2962 reldata_section = subseg_new (".reldata", 0);
2964 bfd_set_section_flags (stdoutput, reldata_section,
2965 ( SEC_ALLOC | SEC_LOAD | SEC_RELOC
2968 bfd_set_section_alignment (stdoutput, reldata_section, 2);
2972 reldata_section = subseg_new (".reldata", 0);
2974 ppc_set_current_section(reldata_section);
2977 /* pseudo-op: .rdata
2978 behaviour: predefined read only data section
2982 initial: .section .rdata "dr3"
2983 d - initialized data
2985 3 - double word aligned (that would be 4 byte boundary)
2991 if (rdata_section == 0)
2993 rdata_section = subseg_new (".rdata", 0);
2994 bfd_set_section_flags (stdoutput, rdata_section,
2995 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
2996 | SEC_READONLY | SEC_DATA ));
2998 bfd_set_section_alignment (stdoutput, rdata_section, 2);
3002 rdata_section = subseg_new (".rdata", 0);
3004 ppc_set_current_section(rdata_section);
3007 /* pseudo-op: .ualong
3008 behaviour: much like .int, with the exception that no alignment is
3010 FIXME: test the alignment statement
3022 /* pseudo-op: .znop <symbol name>
3023 behaviour: Issue a nop instruction
3024 Issue a IMAGE_REL_PPC_IFGLUE relocation against it, using
3025 the supplied symbol name.
3027 warnings: Missing symbol name
3034 const struct powerpc_opcode *opcode;
3040 /* Strip out the symbol name */
3048 symbol_name = input_line_pointer;
3049 c = get_symbol_end ();
3051 name = xmalloc (input_line_pointer - symbol_name + 1);
3052 strcpy (name, symbol_name);
3054 sym = symbol_find_or_make (name);
3056 *input_line_pointer = c;
3060 /* Look up the opcode in the hash table. */
3061 opcode = (const struct powerpc_opcode *) hash_find (ppc_hash, "nop");
3063 /* stick in the nop */
3064 insn = opcode->opcode;
3066 /* Write out the instruction. */
3068 md_number_to_chars (f, insn, 4);
3070 f - frag_now->fr_literal,
3075 BFD_RELOC_16_GOT_PCREL);
3088 register char *name;
3092 register symbolS *symbolP;
3095 name = input_line_pointer;
3096 c = get_symbol_end ();
3098 /* just after name is now '\0' */
3099 p = input_line_pointer;
3102 if (*input_line_pointer != ',')
3104 as_bad ("Expected comma after symbol-name: rest of line ignored.");
3105 ignore_rest_of_line ();
3109 input_line_pointer++; /* skip ',' */
3110 if ((temp = get_absolute_expression ()) < 0)
3112 as_warn (".COMMon length (%ld.) <0! Ignored.", (long) temp);
3113 ignore_rest_of_line ();
3119 /* The third argument to .comm is the alignment. */
3120 if (*input_line_pointer != ',')
3124 ++input_line_pointer;
3125 align = get_absolute_expression ();
3128 as_warn ("ignoring bad alignment");
3135 symbolP = symbol_find_or_make (name);
3138 if (S_IS_DEFINED (symbolP))
3140 as_bad ("Ignoring attempt to re-define symbol `%s'.",
3141 S_GET_NAME (symbolP));
3142 ignore_rest_of_line ();
3146 if (S_GET_VALUE (symbolP))
3148 if (S_GET_VALUE (symbolP) != (valueT) temp)
3149 as_bad ("Length of .comm \"%s\" is already %ld. Not changed to %ld.",
3150 S_GET_NAME (symbolP),
3151 (long) S_GET_VALUE (symbolP),
3156 S_SET_VALUE (symbolP, (valueT) temp);
3157 S_SET_EXTERNAL (symbolP);
3160 demand_empty_rest_of_line ();
3164 * implement the .section pseudo op:
3165 * .section name {, "flags"}
3167 * | +--- optional flags: 'b' for bss
3169 * +-- section name 'l' for lib
3173 * 'd' (apparently m88k for data)
3175 * But if the argument is not a quoted string, treat it as a
3176 * subsegment number.
3178 * FIXME: this is a copy of the section processing from obj-coff.c, with
3179 * additions/changes for the moto-pas assembler support. There are three
3182 * FIXME: I just noticed this. This doesn't work at all really. It it
3183 * setting bits that bfd probably neither understands or uses. The
3184 * correct approach (?) will have to incorporate extra fields attached
3185 * to the section to hold the system specific stuff. (krk)
3188 * 'a' - unknown - referred to in documentation, but no definition supplied
3189 * 'c' - section has code
3190 * 'd' - section has initialized data
3191 * 'u' - section has uninitialized data
3192 * 'i' - section contains directives (info)
3193 * 'n' - section can be discarded
3194 * 'R' - remove section at link time
3196 * Section Protection:
3197 * 'r' - section is readable
3198 * 'w' - section is writeable
3199 * 'x' - section is executable
3200 * 's' - section is sharable
3202 * Section Alignment:
3203 * '0' - align to byte boundary
3204 * '1' - align to halfword undary
3205 * '2' - align to word boundary
3206 * '3' - align to doubleword boundary
3207 * '4' - align to quadword boundary
3208 * '5' - align to 32 byte boundary
3209 * '6' - align to 64 byte boundary
3214 ppc_pe_section (ignore)
3217 /* Strip out the section name */
3226 section_name = input_line_pointer;
3227 c = get_symbol_end ();
3229 name = xmalloc (input_line_pointer - section_name + 1);
3230 strcpy (name, section_name);
3232 *input_line_pointer = c;
3237 flags = SEC_NO_FLAGS;
3239 if (strcmp (name, ".idata$2") == 0)
3243 else if (strcmp (name, ".idata$3") == 0)
3247 else if (strcmp (name, ".idata$4") == 0)
3251 else if (strcmp (name, ".idata$5") == 0)
3255 else if (strcmp (name, ".idata$6") == 0)
3260 align = 4; /* default alignment to 16 byte boundary */
3262 if (*input_line_pointer == ',')
3264 ++input_line_pointer;
3266 if (*input_line_pointer != '"')
3267 exp = get_absolute_expression ();
3270 ++input_line_pointer;
3271 while (*input_line_pointer != '"'
3272 && ! is_end_of_line[(unsigned char) *input_line_pointer])
3274 switch (*input_line_pointer)
3276 /* Section Contents */
3277 case 'a': /* unknown */
3278 as_warn ("Unsupported section attribute -- 'a'");
3280 case 'c': /* code section */
3283 case 'd': /* section has initialized data */
3286 case 'u': /* section has uninitialized data */
3287 /* FIXME: This is IMAGE_SCN_CNT_UNINITIALIZED_DATA
3291 case 'i': /* section contains directives (info) */
3292 /* FIXME: This is IMAGE_SCN_LNK_INFO
3294 flags |= SEC_HAS_CONTENTS;
3296 case 'n': /* section can be discarded */
3299 case 'R': /* Remove section at link time */
3300 flags |= SEC_NEVER_LOAD;
3303 /* Section Protection */
3304 case 'r': /* section is readable */
3305 flags |= IMAGE_SCN_MEM_READ;
3307 case 'w': /* section is writeable */
3308 flags |= IMAGE_SCN_MEM_WRITE;
3310 case 'x': /* section is executable */
3311 flags |= IMAGE_SCN_MEM_EXECUTE;
3313 case 's': /* section is sharable */
3314 flags |= IMAGE_SCN_MEM_SHARED;
3317 /* Section Alignment */
3318 case '0': /* align to byte boundary */
3319 flags |= IMAGE_SCN_ALIGN_1BYTES;
3322 case '1': /* align to halfword boundary */
3323 flags |= IMAGE_SCN_ALIGN_2BYTES;
3326 case '2': /* align to word boundary */
3327 flags |= IMAGE_SCN_ALIGN_4BYTES;
3330 case '3': /* align to doubleword boundary */
3331 flags |= IMAGE_SCN_ALIGN_8BYTES;
3334 case '4': /* align to quadword boundary */
3335 flags |= IMAGE_SCN_ALIGN_16BYTES;
3338 case '5': /* align to 32 byte boundary */
3339 flags |= IMAGE_SCN_ALIGN_32BYTES;
3342 case '6': /* align to 64 byte boundary */
3343 flags |= IMAGE_SCN_ALIGN_64BYTES;
3348 as_warn("unknown section attribute '%c'",
3349 *input_line_pointer);
3352 ++input_line_pointer;
3354 if (*input_line_pointer == '"')
3355 ++input_line_pointer;
3359 sec = subseg_new (name, (subsegT) exp);
3361 ppc_set_current_section(sec);
3363 if (flags != SEC_NO_FLAGS)
3365 if (! bfd_set_section_flags (stdoutput, sec, flags))
3366 as_warn ("error setting flags for \"%s\": %s",
3367 bfd_section_name (stdoutput, sec),
3368 bfd_errmsg (bfd_get_error ()));
3371 bfd_set_section_alignment(stdoutput, sec, align);
3376 ppc_pe_function (ignore)
3383 name = input_line_pointer;
3384 endc = get_symbol_end ();
3386 ext_sym = symbol_find_or_make (name);
3388 *input_line_pointer = endc;
3390 S_SET_DATA_TYPE (ext_sym, DT_FCN << N_BTSHFT);
3391 SF_SET_FUNCTION (ext_sym);
3392 SF_SET_PROCESS (ext_sym);
3393 coff_add_linesym (ext_sym);
3395 demand_empty_rest_of_line ();
3399 ppc_pe_tocd (ignore)
3402 if (tocdata_section == 0)
3404 tocdata_section = subseg_new (".tocd", 0);
3405 /* FIXME: section flags won't work */
3406 bfd_set_section_flags (stdoutput, tocdata_section,
3407 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
3408 | SEC_READONLY | SEC_DATA ));
3410 bfd_set_section_alignment (stdoutput, tocdata_section, 2);
3414 rdata_section = subseg_new (".tocd", 0);
3417 ppc_set_current_section(tocdata_section);
3419 demand_empty_rest_of_line ();
3422 /* Don't adjust TOC relocs to use the section symbol. */
3425 ppc_pe_fix_adjustable (fix)
3428 return fix->fx_r_type != BFD_RELOC_PPC_TOC16;
3435 /* XCOFF specific symbol and file handling. */
3437 /* Canonicalize the symbol name. We use the to force the suffix, if
3438 any, to use square brackets, and to be in upper case. */
3441 ppc_canonicalize_symbol_name (name)
3446 if (ppc_stab_symbol)
3449 for (s = name; *s != '\0' && *s != '{' && *s != '['; s++)
3463 for (s++; *s != '\0' && *s != brac; s++)
3467 if (*s == '\0' || s[1] != '\0')
3468 as_bad ("bad symbol suffix");
3476 /* Set the class of a symbol based on the suffix, if any. This is
3477 called whenever a new symbol is created. */
3480 ppc_symbol_new_hook (sym)
3485 sym->sy_tc.next = NULL;
3486 sym->sy_tc.output = 0;
3487 sym->sy_tc.class = -1;
3488 sym->sy_tc.real_name = NULL;
3489 sym->sy_tc.subseg = 0;
3490 sym->sy_tc.align = 0;
3491 sym->sy_tc.size = NULL;
3492 sym->sy_tc.within = NULL;
3494 if (ppc_stab_symbol)
3497 s = strchr (S_GET_NAME (sym), '[');
3498 if (s == (const char *) NULL)
3500 /* There is no suffix. */
3509 if (strcmp (s, "BS]") == 0)
3510 sym->sy_tc.class = XMC_BS;
3513 if (strcmp (s, "DB]") == 0)
3514 sym->sy_tc.class = XMC_DB;
3515 else if (strcmp (s, "DS]") == 0)
3516 sym->sy_tc.class = XMC_DS;
3519 if (strcmp (s, "GL]") == 0)
3520 sym->sy_tc.class = XMC_GL;
3523 if (strcmp (s, "PR]") == 0)
3524 sym->sy_tc.class = XMC_PR;
3527 if (strcmp (s, "RO]") == 0)
3528 sym->sy_tc.class = XMC_RO;
3529 else if (strcmp (s, "RW]") == 0)
3530 sym->sy_tc.class = XMC_RW;
3533 if (strcmp (s, "SV]") == 0)
3534 sym->sy_tc.class = XMC_SV;
3537 if (strcmp (s, "TC]") == 0)
3538 sym->sy_tc.class = XMC_TC;
3539 else if (strcmp (s, "TI]") == 0)
3540 sym->sy_tc.class = XMC_TI;
3541 else if (strcmp (s, "TB]") == 0)
3542 sym->sy_tc.class = XMC_TB;
3543 else if (strcmp (s, "TC0]") == 0 || strcmp (s, "T0]") == 0)
3544 sym->sy_tc.class = XMC_TC0;
3547 if (strcmp (s, "UA]") == 0)
3548 sym->sy_tc.class = XMC_UA;
3549 else if (strcmp (s, "UC]") == 0)
3550 sym->sy_tc.class = XMC_UC;
3553 if (strcmp (s, "XO]") == 0)
3554 sym->sy_tc.class = XMC_XO;
3558 if (sym->sy_tc.class == -1)
3559 as_bad ("Unrecognized symbol suffix");
3562 /* Set the class of a label based on where it is defined. This
3563 handles symbols without suffixes. Also, move the symbol so that it
3564 follows the csect symbol. */
3567 ppc_frob_label (sym)
3570 if (ppc_current_csect != (symbolS *) NULL)
3572 if (sym->sy_tc.class == -1)
3573 sym->sy_tc.class = ppc_current_csect->sy_tc.class;
3575 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
3576 symbol_append (sym, ppc_current_csect->sy_tc.within, &symbol_rootP,
3578 ppc_current_csect->sy_tc.within = sym;
3582 /* This variable is set by ppc_frob_symbol if any absolute symbols are
3583 seen. It tells ppc_adjust_symtab whether it needs to look through
3586 static boolean ppc_saw_abs;
3588 /* Change the name of a symbol just before writing it out. Set the
3589 real name if the .rename pseudo-op was used. Otherwise, remove any
3590 class suffix. Return 1 if the symbol should not be included in the
3594 ppc_frob_symbol (sym)
3597 static symbolS *ppc_last_function;
3598 static symbolS *set_end;
3600 /* Discard symbols that should not be included in the output symbol
3602 if (! sym->sy_used_in_reloc
3603 && ((sym->bsym->flags & BSF_SECTION_SYM) != 0
3604 || (! S_IS_EXTERNAL (sym)
3605 && ! sym->sy_tc.output
3606 && S_GET_STORAGE_CLASS (sym) != C_FILE)))
3609 if (sym->sy_tc.real_name != (char *) NULL)
3610 S_SET_NAME (sym, sym->sy_tc.real_name);
3616 name = S_GET_NAME (sym);
3617 s = strchr (name, '[');
3618 if (s != (char *) NULL)
3624 snew = xmalloc (len + 1);
3625 memcpy (snew, name, len);
3628 S_SET_NAME (sym, snew);
3632 if (set_end != (symbolS *) NULL)
3634 SA_SET_SYM_ENDNDX (set_end, sym);
3638 if (SF_GET_FUNCTION (sym))
3640 if (ppc_last_function != (symbolS *) NULL)
3641 as_warn ("two .function pseudo-ops with no intervening .ef");
3642 ppc_last_function = sym;
3643 if (sym->sy_tc.size != (symbolS *) NULL)
3645 resolve_symbol_value (sym->sy_tc.size);
3646 SA_SET_SYM_FSIZE (sym, (long) S_GET_VALUE (sym->sy_tc.size));
3649 else if (S_GET_STORAGE_CLASS (sym) == C_FCN
3650 && strcmp (S_GET_NAME (sym), ".ef") == 0)
3652 if (ppc_last_function == (symbolS *) NULL)
3653 as_warn (".ef with no preceding .function");
3656 set_end = ppc_last_function;
3657 ppc_last_function = NULL;
3659 /* We don't have a C_EFCN symbol, but we need to force the
3660 COFF backend to believe that it has seen one. */
3661 coff_last_function = NULL;
3665 if (! S_IS_EXTERNAL (sym)
3666 && (sym->bsym->flags & BSF_SECTION_SYM) == 0
3667 && S_GET_STORAGE_CLASS (sym) != C_FILE
3668 && S_GET_STORAGE_CLASS (sym) != C_FCN
3669 && S_GET_STORAGE_CLASS (sym) != C_BLOCK
3670 && S_GET_STORAGE_CLASS (sym) != C_BSTAT
3671 && S_GET_STORAGE_CLASS (sym) != C_ESTAT
3672 && S_GET_STORAGE_CLASS (sym) != C_BINCL
3673 && S_GET_STORAGE_CLASS (sym) != C_EINCL
3674 && S_GET_SEGMENT (sym) != ppc_coff_debug_section)
3675 S_SET_STORAGE_CLASS (sym, C_HIDEXT);
3677 if (S_GET_STORAGE_CLASS (sym) == C_EXT
3678 || S_GET_STORAGE_CLASS (sym) == C_HIDEXT)
3681 union internal_auxent *a;
3683 /* Create a csect aux. */
3684 i = S_GET_NUMBER_AUXILIARY (sym);
3685 S_SET_NUMBER_AUXILIARY (sym, i + 1);
3686 a = &coffsymbol (sym->bsym)->native[i + 1].u.auxent;
3687 if (sym->sy_tc.class == XMC_TC0)
3689 /* This is the TOC table. */
3690 know (strcmp (S_GET_NAME (sym), "TOC") == 0);
3691 a->x_csect.x_scnlen.l = 0;
3692 a->x_csect.x_smtyp = (2 << 3) | XTY_SD;
3694 else if (sym->sy_tc.subseg != 0)
3696 /* This is a csect symbol. x_scnlen is the size of the
3698 if (sym->sy_tc.next == (symbolS *) NULL)
3699 a->x_csect.x_scnlen.l = (bfd_section_size (stdoutput,
3700 S_GET_SEGMENT (sym))
3701 - S_GET_VALUE (sym));
3704 resolve_symbol_value (sym->sy_tc.next);
3705 a->x_csect.x_scnlen.l = (S_GET_VALUE (sym->sy_tc.next)
3706 - S_GET_VALUE (sym));
3708 a->x_csect.x_smtyp = (sym->sy_tc.align << 3) | XTY_SD;
3710 else if (S_GET_SEGMENT (sym) == bss_section)
3712 /* This is a common symbol. */
3713 a->x_csect.x_scnlen.l = sym->sy_frag->fr_offset;
3714 a->x_csect.x_smtyp = (sym->sy_tc.align << 3) | XTY_CM;
3715 if (S_IS_EXTERNAL (sym))
3716 sym->sy_tc.class = XMC_RW;
3718 sym->sy_tc.class = XMC_BS;
3720 else if (S_GET_SEGMENT (sym) == absolute_section)
3722 /* This is an absolute symbol. The csect will be created by
3723 ppc_adjust_symtab. */
3725 a->x_csect.x_smtyp = XTY_LD;
3726 if (sym->sy_tc.class == -1)
3727 sym->sy_tc.class = XMC_XO;
3729 else if (! S_IS_DEFINED (sym))
3731 /* This is an external symbol. */
3732 a->x_csect.x_scnlen.l = 0;
3733 a->x_csect.x_smtyp = XTY_ER;
3735 else if (sym->sy_tc.class == XMC_TC)
3739 /* This is a TOC definition. x_scnlen is the size of the
3741 next = symbol_next (sym);
3742 while (next->sy_tc.class == XMC_TC0)
3743 next = symbol_next (next);
3744 if (next == (symbolS *) NULL
3745 || next->sy_tc.class != XMC_TC)
3747 if (ppc_after_toc_frag == (fragS *) NULL)
3748 a->x_csect.x_scnlen.l = (bfd_section_size (stdoutput,
3750 - S_GET_VALUE (sym));
3752 a->x_csect.x_scnlen.l = (ppc_after_toc_frag->fr_address
3753 - S_GET_VALUE (sym));
3757 resolve_symbol_value (next);
3758 a->x_csect.x_scnlen.l = (S_GET_VALUE (next)
3759 - S_GET_VALUE (sym));
3761 a->x_csect.x_smtyp = (2 << 3) | XTY_SD;
3767 /* This is a normal symbol definition. x_scnlen is the
3768 symbol index of the containing csect. */
3769 if (S_GET_SEGMENT (sym) == text_section)
3770 csect = ppc_text_csects;
3771 else if (S_GET_SEGMENT (sym) == data_section)
3772 csect = ppc_data_csects;
3776 /* Skip the initial dummy symbol. */
3777 csect = csect->sy_tc.next;
3779 if (csect == (symbolS *) NULL)
3781 as_warn ("warning: symbol %s has no csect", S_GET_NAME (sym));
3782 a->x_csect.x_scnlen.l = 0;
3786 while (csect->sy_tc.next != (symbolS *) NULL)
3788 resolve_symbol_value (csect->sy_tc.next);
3789 if (S_GET_VALUE (csect->sy_tc.next) > S_GET_VALUE (sym))
3791 csect = csect->sy_tc.next;
3794 a->x_csect.x_scnlen.p = coffsymbol (csect->bsym)->native;
3795 coffsymbol (sym->bsym)->native[i + 1].fix_scnlen = 1;
3797 a->x_csect.x_smtyp = XTY_LD;
3800 a->x_csect.x_parmhash = 0;
3801 a->x_csect.x_snhash = 0;
3802 if (sym->sy_tc.class == -1)
3803 a->x_csect.x_smclas = XMC_PR;
3805 a->x_csect.x_smclas = sym->sy_tc.class;
3806 a->x_csect.x_stab = 0;
3807 a->x_csect.x_snstab = 0;
3809 /* Don't let the COFF backend resort these symbols. */
3810 sym->bsym->flags |= BSF_NOT_AT_END;
3812 else if (S_GET_STORAGE_CLASS (sym) == C_BSTAT)
3814 /* We want the value to be the symbol index of the referenced
3815 csect symbol. BFD will do that for us if we set the right
3818 (valueT) coffsymbol (sym->sy_tc.within->bsym)->native);
3819 coffsymbol (sym->bsym)->native->fix_value = 1;
3821 else if (S_GET_STORAGE_CLASS (sym) == C_STSYM)
3826 /* The value is the offset from the enclosing csect. */
3827 block = sym->sy_tc.within;
3828 csect = block->sy_tc.within;
3829 resolve_symbol_value (csect);
3830 S_SET_VALUE (sym, S_GET_VALUE (sym) - S_GET_VALUE (csect));
3832 else if (S_GET_STORAGE_CLASS (sym) == C_BINCL
3833 || S_GET_STORAGE_CLASS (sym) == C_EINCL)
3835 /* We want the value to be a file offset into the line numbers.
3836 BFD will do that for us if we set the right flags. We have
3837 already set the value correctly. */
3838 coffsymbol (sym->bsym)->native->fix_line = 1;
3844 /* Adjust the symbol table. This creates csect symbols for all
3845 absolute symbols. */
3848 ppc_adjust_symtab ()
3855 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
3859 union internal_auxent *a;
3861 if (S_GET_SEGMENT (sym) != absolute_section)
3864 csect = symbol_create (".abs[XO]", absolute_section,
3865 S_GET_VALUE (sym), &zero_address_frag);
3866 csect->bsym->value = S_GET_VALUE (sym);
3867 S_SET_STORAGE_CLASS (csect, C_HIDEXT);
3868 i = S_GET_NUMBER_AUXILIARY (csect);
3869 S_SET_NUMBER_AUXILIARY (csect, i + 1);
3870 a = &coffsymbol (csect->bsym)->native[i + 1].u.auxent;
3871 a->x_csect.x_scnlen.l = 0;
3872 a->x_csect.x_smtyp = XTY_SD;
3873 a->x_csect.x_parmhash = 0;
3874 a->x_csect.x_snhash = 0;
3875 a->x_csect.x_smclas = XMC_XO;
3876 a->x_csect.x_stab = 0;
3877 a->x_csect.x_snstab = 0;
3879 symbol_insert (csect, sym, &symbol_rootP, &symbol_lastP);
3881 i = S_GET_NUMBER_AUXILIARY (sym);
3882 a = &coffsymbol (sym->bsym)->native[i].u.auxent;
3883 a->x_csect.x_scnlen.p = coffsymbol (csect->bsym)->native;
3884 coffsymbol (sym->bsym)->native[i].fix_scnlen = 1;
3887 ppc_saw_abs = false;
3890 /* Set the VMA for a section. This is called on all the sections in
3894 ppc_frob_section (sec)
3897 static bfd_size_type vma = 0;
3899 bfd_set_section_vma (stdoutput, sec, vma);
3900 vma += bfd_section_size (stdoutput, sec);
3903 #endif /* OBJ_XCOFF */
3905 /* Turn a string in input_line_pointer into a floating point constant
3906 of type type, and store the appropriate bytes in *litp. The number
3907 of LITTLENUMS emitted is stored in *sizep . An error message is
3908 returned, or NULL on OK. */
3911 md_atof (type, litp, sizep)
3917 LITTLENUM_TYPE words[4];
3933 return "bad call to md_atof";
3936 t = atof_ieee (input_line_pointer, type, words);
3938 input_line_pointer = t;
3942 if (target_big_endian)
3944 for (i = 0; i < prec; i++)
3946 md_number_to_chars (litp, (valueT) words[i], 2);
3952 for (i = prec - 1; i >= 0; i--)
3954 md_number_to_chars (litp, (valueT) words[i], 2);
3962 /* Write a value out to the object file, using the appropriate
3966 md_number_to_chars (buf, val, n)
3971 if (target_big_endian)
3972 number_to_chars_bigendian (buf, val, n);
3974 number_to_chars_littleendian (buf, val, n);
3977 /* Align a section (I don't know why this is machine dependent). */
3980 md_section_align (seg, addr)
3984 int align = bfd_get_section_alignment (stdoutput, seg);
3986 return ((addr + (1 << align) - 1) & (-1 << align));
3989 /* We don't have any form of relaxing. */
3992 md_estimate_size_before_relax (fragp, seg)
4000 /* Convert a machine dependent frag. We never generate these. */
4003 md_convert_frag (abfd, sec, fragp)
4011 /* We have no need to default values of symbols. */
4015 md_undefined_symbol (name)
4021 /* Functions concerning relocs. */
4023 /* The location from which a PC relative jump should be calculated,
4024 given a PC relative reloc. */
4027 md_pcrel_from_section (fixp, sec)
4032 if (fixp->fx_addsy != (symbolS *) NULL
4033 && (! S_IS_DEFINED (fixp->fx_addsy)
4034 || TC_FORCE_RELOCATION_SECTION (fixp, sec)))
4038 return fixp->fx_frag->fr_address + fixp->fx_where;
4043 /* This is called to see whether a fixup should be adjusted to use a
4044 section symbol. We take the opportunity to change a fixup against
4045 a symbol in the TOC subsegment into a reloc against the
4046 corresponding .tc symbol. */
4049 ppc_fix_adjustable (fix)
4054 resolve_symbol_value (fix->fx_addsy);
4055 val = S_GET_VALUE (fix->fx_addsy);
4056 if (ppc_toc_csect != (symbolS *) NULL
4057 && fix->fx_addsy != (symbolS *) NULL
4058 && fix->fx_addsy != ppc_toc_csect
4059 && S_GET_SEGMENT (fix->fx_addsy) == data_section
4060 && val >= ppc_toc_frag->fr_address
4061 && (ppc_after_toc_frag == (fragS *) NULL
4062 || val < ppc_after_toc_frag->fr_address))
4066 for (sy = symbol_next (ppc_toc_csect);
4067 sy != (symbolS *) NULL;
4068 sy = symbol_next (sy))
4070 if (sy->sy_tc.class == XMC_TC0)
4072 if (sy->sy_tc.class != XMC_TC)
4074 resolve_symbol_value (sy);
4075 if (val == S_GET_VALUE (sy))
4078 fix->fx_addnumber = val - ppc_toc_frag->fr_address;
4083 as_bad_where (fix->fx_file, fix->fx_line,
4084 "symbol in .toc does not match any .tc");
4087 /* Possibly adjust the reloc to be against the csect. */
4088 if (fix->fx_addsy != (symbolS *) NULL
4089 && fix->fx_addsy->sy_tc.subseg == 0
4090 && fix->fx_addsy->sy_tc.class != XMC_TC0
4091 && fix->fx_addsy->sy_tc.class != XMC_TC
4092 && S_GET_SEGMENT (fix->fx_addsy) != bss_section)
4096 if (S_GET_SEGMENT (fix->fx_addsy) == text_section)
4097 csect = ppc_text_csects;
4098 else if (S_GET_SEGMENT (fix->fx_addsy) == data_section)
4099 csect = ppc_data_csects;
4103 /* Skip the initial dummy symbol. */
4104 csect = csect->sy_tc.next;
4106 if (csect != (symbolS *) NULL)
4108 while (csect->sy_tc.next != (symbolS *) NULL
4109 && (csect->sy_tc.next->sy_frag->fr_address
4110 <= fix->fx_addsy->sy_frag->fr_address))
4111 csect = csect->sy_tc.next;
4113 fix->fx_offset += (S_GET_VALUE (fix->fx_addsy)
4114 - csect->sy_frag->fr_address);
4115 fix->fx_addsy = csect;
4119 /* Adjust a reloc against a .lcomm symbol to be against the base
4121 if (fix->fx_addsy != (symbolS *) NULL
4122 && S_GET_SEGMENT (fix->fx_addsy) == bss_section
4123 && ! S_IS_EXTERNAL (fix->fx_addsy))
4125 resolve_symbol_value (fix->fx_addsy->sy_frag->fr_symbol);
4126 fix->fx_offset += (S_GET_VALUE (fix->fx_addsy)
4127 - S_GET_VALUE (fix->fx_addsy->sy_frag->fr_symbol));
4128 fix->fx_addsy = fix->fx_addsy->sy_frag->fr_symbol;
4136 /* See whether a symbol is in the TOC section. */
4139 ppc_is_toc_sym (sym)
4143 return sym->sy_tc.class == XMC_TC;
4145 return strcmp (segment_name (S_GET_SEGMENT (sym)), ".got") == 0;
4149 /* Apply a fixup to the object code. This is called for all the
4150 fixups we generated by the call to fix_new_exp, above. In the call
4151 above we used a reloc code which was the largest legal reloc code
4152 plus the operand index. Here we undo that to recover the operand
4153 index. At this point all symbol values should be fully resolved,
4154 and we attempt to completely resolve the reloc. If we can not do
4155 that, we determine the correct reloc code and put it back in the
4159 md_apply_fix3 (fixp, valuep, seg)
4166 /* FIXME FIXME FIXME: The value we are passed in *valuep includes
4167 the symbol values. Since we are using BFD_ASSEMBLER, if we are
4168 doing this relocation the code in write.c is going to call
4169 bfd_perform_relocation, which is also going to use the symbol
4170 value. That means that if the reloc is fully resolved we want to
4171 use *valuep since bfd_perform_relocation is not being used.
4172 However, if the reloc is not fully resolved we do not want to use
4173 *valuep, and must use fx_offset instead. However, if the reloc
4174 is PC relative, we do want to use *valuep since it includes the
4175 result of md_pcrel_from. This is confusing. */
4177 if (fixp->fx_addsy == (symbolS *) NULL)
4182 else if (fixp->fx_pcrel)
4186 value = fixp->fx_offset;
4187 if (fixp->fx_subsy != (symbolS *) NULL)
4189 if (S_GET_SEGMENT (fixp->fx_subsy) == absolute_section)
4190 value -= S_GET_VALUE (fixp->fx_subsy);
4193 /* We can't actually support subtracting a symbol. */
4194 as_bad_where (fixp->fx_file, fixp->fx_line,
4195 "expression too complex");
4200 if ((int) fixp->fx_r_type >= (int) BFD_RELOC_UNUSED)
4203 const struct powerpc_operand *operand;
4207 opindex = (int) fixp->fx_r_type - (int) BFD_RELOC_UNUSED;
4209 operand = &powerpc_operands[opindex];
4212 /* It appears that an instruction like
4214 when LC..1 is not a TOC symbol does not generate a reloc. It
4215 uses the offset of LC..1 within its csect. However, .long
4216 LC..1 will generate a reloc. I can't find any documentation
4217 on how these cases are to be distinguished, so this is a wild
4218 guess. These cases are generated by gcc -mminimal-toc. */
4219 if ((operand->flags & PPC_OPERAND_PARENS) != 0
4220 && operand->bits == 16
4221 && operand->shift == 0
4222 && operand->insert == NULL
4223 && fixp->fx_addsy != NULL
4224 && fixp->fx_addsy->sy_tc.subseg != 0
4225 && fixp->fx_addsy->sy_tc.class != XMC_TC
4226 && fixp->fx_addsy->sy_tc.class != XMC_TC0
4227 && S_GET_SEGMENT (fixp->fx_addsy) != bss_section)
4229 value = fixp->fx_offset;
4234 /* Fetch the instruction, insert the fully resolved operand
4235 value, and stuff the instruction back again. */
4236 where = fixp->fx_frag->fr_literal + fixp->fx_where;
4237 if (target_big_endian)
4238 insn = bfd_getb32 ((unsigned char *) where);
4240 insn = bfd_getl32 ((unsigned char *) where);
4241 insn = ppc_insert_operand (insn, operand, (offsetT) value,
4242 fixp->fx_file, fixp->fx_line);
4243 if (target_big_endian)
4244 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
4246 bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
4250 /* Nothing else to do here. */
4254 /* Determine a BFD reloc value based on the operand information.
4255 We are only prepared to turn a few of the operands into
4257 FIXME: We need to handle the DS field at the very least.
4258 FIXME: Selecting the reloc type is a bit haphazard; perhaps
4259 there should be a new field in the operand table. */
4260 if ((operand->flags & PPC_OPERAND_RELATIVE) != 0
4261 && operand->bits == 26
4262 && operand->shift == 0)
4263 fixp->fx_r_type = BFD_RELOC_PPC_B26;
4264 else if ((operand->flags & PPC_OPERAND_RELATIVE) != 0
4265 && operand->bits == 16
4266 && operand->shift == 0)
4267 fixp->fx_r_type = BFD_RELOC_PPC_B16;
4268 else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0
4269 && operand->bits == 26
4270 && operand->shift == 0)
4271 fixp->fx_r_type = BFD_RELOC_PPC_BA26;
4272 else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0
4273 && operand->bits == 16
4274 && operand->shift == 0)
4275 fixp->fx_r_type = BFD_RELOC_PPC_BA16;
4276 else if ((operand->flags & PPC_OPERAND_PARENS) != 0
4277 && operand->bits == 16
4278 && operand->shift == 0
4279 && operand->insert == NULL
4280 && fixp->fx_addsy != NULL
4281 && ppc_is_toc_sym (fixp->fx_addsy))
4284 if (target_big_endian)
4285 fixp->fx_where += 2;
4286 fixp->fx_r_type = BFD_RELOC_PPC_TOC16;
4290 as_bad_where (fixp->fx_file, fixp->fx_line,
4291 "unresolved expression that must be resolved");
4299 ppc_elf_validate_fix (fixp, seg);
4301 switch (fixp->fx_r_type)
4304 case BFD_RELOC_CTOR:
4306 fixp->fx_r_type = BFD_RELOC_32_PCREL;
4310 case BFD_RELOC_32_PCREL:
4311 case BFD_RELOC_32_BASEREL:
4312 case BFD_RELOC_PPC_EMB_NADDR32:
4313 md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
4317 case BFD_RELOC_LO16:
4318 case BFD_RELOC_HI16:
4319 case BFD_RELOC_HI16_S:
4321 case BFD_RELOC_GPREL16:
4322 case BFD_RELOC_16_GOT_PCREL:
4323 case BFD_RELOC_16_GOTOFF:
4324 case BFD_RELOC_LO16_GOTOFF:
4325 case BFD_RELOC_HI16_GOTOFF:
4326 case BFD_RELOC_HI16_S_GOTOFF:
4327 case BFD_RELOC_LO16_BASEREL:
4328 case BFD_RELOC_HI16_BASEREL:
4329 case BFD_RELOC_HI16_S_BASEREL:
4330 case BFD_RELOC_PPC_EMB_NADDR16:
4331 case BFD_RELOC_PPC_EMB_NADDR16_LO:
4332 case BFD_RELOC_PPC_EMB_NADDR16_HI:
4333 case BFD_RELOC_PPC_EMB_NADDR16_HA:
4334 case BFD_RELOC_PPC_EMB_SDAI16:
4335 case BFD_RELOC_PPC_EMB_SDA2REL:
4336 case BFD_RELOC_PPC_EMB_SDA2I16:
4337 case BFD_RELOC_PPC_EMB_RELSEC16:
4338 case BFD_RELOC_PPC_EMB_RELST_LO:
4339 case BFD_RELOC_PPC_EMB_RELST_HI:
4340 case BFD_RELOC_PPC_EMB_RELST_HA:
4341 case BFD_RELOC_PPC_EMB_RELSDA:
4342 case BFD_RELOC_PPC_TOC16:
4346 md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
4350 /* Because SDA21 modifies the register field, the size is set to 4
4351 bytes, rather than 2, so offset it here appropriately */
4352 case BFD_RELOC_PPC_EMB_SDA21:
4356 md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where
4357 + ((target_big_endian) ? 2 : 0),
4365 md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
4371 "Gas failure, reloc value %d\n", fixp->fx_r_type);
4378 fixp->fx_addnumber = value;
4380 if (fixp->fx_r_type != BFD_RELOC_PPC_TOC16)
4381 fixp->fx_addnumber = 0;
4385 fixp->fx_addnumber = 0;
4387 /* We want to use the offset within the data segment of the
4388 symbol, not the actual VMA of the symbol. */
4389 fixp->fx_addnumber =
4390 - bfd_get_section_vma (stdoutput, S_GET_SEGMENT (fixp->fx_addsy));
4398 /* Generate a reloc for a fixup. */
4401 tc_gen_reloc (seg, fixp)
4407 reloc = (arelent *) bfd_alloc_by_size_t (stdoutput, sizeof (arelent));
4409 reloc->sym_ptr_ptr = &fixp->fx_addsy->bsym;
4410 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
4411 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
4412 if (reloc->howto == (reloc_howto_type *) NULL)
4414 as_bad_where (fixp->fx_file, fixp->fx_line,
4415 "reloc %d not supported by object file format", (int)fixp->fx_r_type);
4418 reloc->addend = fixp->fx_addnumber;