1 /* tc-ppc.c -- Assemble for the PowerPC or POWER (RS/6000)
2 Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
3 Free Software Foundation, Inc.
4 Written by Ian Lance Taylor, Cygnus Support.
6 This file is part of GAS, the GNU Assembler.
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)
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.
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
25 #include "safe-ctype.h"
28 #include "opcode/ppc.h"
32 #include "dwarf2dbg.h"
39 /* This is the assembler for the PowerPC or POWER (RS/6000) chips. */
41 /* Tell the main code what the endianness is. */
42 extern int target_big_endian;
44 /* Whether or not, we've set target_big_endian. */
45 static int set_target_endian = 0;
47 /* Whether to use user friendly register names. */
48 #ifndef TARGET_REG_NAMES_P
50 #define TARGET_REG_NAMES_P TRUE
52 #define TARGET_REG_NAMES_P FALSE
56 /* Macros for calculating LO, HI, HA, HIGHER, HIGHERA, HIGHEST,
59 /* #lo(value) denotes the least significant 16 bits of the indicated. */
60 #define PPC_LO(v) ((v) & 0xffff)
62 /* #hi(value) denotes bits 16 through 31 of the indicated value. */
63 #define PPC_HI(v) (((v) >> 16) & 0xffff)
65 /* #ha(value) denotes the high adjusted value: bits 16 through 31 of
66 the indicated value, compensating for #lo() being treated as a
68 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
70 /* #higher(value) denotes bits 32 through 47 of the indicated value. */
71 #define PPC_HIGHER(v) (((v) >> 16 >> 16) & 0xffff)
73 /* #highera(value) denotes bits 32 through 47 of the indicated value,
74 compensating for #lo() being treated as a signed number. */
75 #define PPC_HIGHERA(v) PPC_HIGHER ((v) + 0x8000)
77 /* #highest(value) denotes bits 48 through 63 of the indicated value. */
78 #define PPC_HIGHEST(v) (((v) >> 24 >> 24) & 0xffff)
80 /* #highesta(value) denotes bits 48 through 63 of the indicated value,
81 compensating for #lo being treated as a signed number. */
82 #define PPC_HIGHESTA(v) PPC_HIGHEST ((v) + 0x8000)
84 #define SEX16(val) ((((val) & 0xffff) ^ 0x8000) - 0x8000)
86 static bfd_boolean reg_names_p = TARGET_REG_NAMES_P;
88 static bfd_boolean register_name PARAMS ((expressionS *));
89 static void ppc_set_cpu PARAMS ((void));
90 static unsigned long ppc_insert_operand
91 PARAMS ((unsigned long insn, const struct powerpc_operand *operand,
92 offsetT val, char *file, unsigned int line));
93 static void ppc_macro PARAMS ((char *str, const struct powerpc_macro *macro));
94 static void ppc_byte PARAMS ((int));
96 #if defined (OBJ_XCOFF) || defined (OBJ_ELF)
97 static int ppc_is_toc_sym PARAMS ((symbolS *sym));
98 static void ppc_tc PARAMS ((int));
99 static void ppc_machine PARAMS ((int));
103 static void ppc_comm PARAMS ((int));
104 static void ppc_bb PARAMS ((int));
105 static void ppc_bc PARAMS ((int));
106 static void ppc_bf PARAMS ((int));
107 static void ppc_biei PARAMS ((int));
108 static void ppc_bs PARAMS ((int));
109 static void ppc_eb PARAMS ((int));
110 static void ppc_ec PARAMS ((int));
111 static void ppc_ef PARAMS ((int));
112 static void ppc_es PARAMS ((int));
113 static void ppc_csect PARAMS ((int));
114 static void ppc_change_csect PARAMS ((symbolS *));
115 static void ppc_function PARAMS ((int));
116 static void ppc_extern PARAMS ((int));
117 static void ppc_lglobl PARAMS ((int));
118 static void ppc_section PARAMS ((int));
119 static void ppc_named_section PARAMS ((int));
120 static void ppc_stabx PARAMS ((int));
121 static void ppc_rename PARAMS ((int));
122 static void ppc_toc PARAMS ((int));
123 static void ppc_xcoff_cons PARAMS ((int));
124 static void ppc_vbyte PARAMS ((int));
128 static bfd_reloc_code_real_type ppc_elf_suffix PARAMS ((char **, expressionS *));
129 static void ppc_elf_cons PARAMS ((int));
130 static void ppc_elf_rdata PARAMS ((int));
131 static void ppc_elf_lcomm PARAMS ((int));
132 static void ppc_elf_validate_fix PARAMS ((fixS *, segT));
133 static void ppc_apuinfo_section_add PARAMS ((unsigned int apu, unsigned int version));
137 static void ppc_set_current_section PARAMS ((segT));
138 static void ppc_previous PARAMS ((int));
139 static void ppc_pdata PARAMS ((int));
140 static void ppc_ydata PARAMS ((int));
141 static void ppc_reldata PARAMS ((int));
142 static void ppc_rdata PARAMS ((int));
143 static void ppc_ualong PARAMS ((int));
144 static void ppc_znop PARAMS ((int));
145 static void ppc_pe_comm PARAMS ((int));
146 static void ppc_pe_section PARAMS ((int));
147 static void ppc_pe_function PARAMS ((int));
148 static void ppc_pe_tocd PARAMS ((int));
151 /* Generic assembler global variables which must be defined by all
155 /* This string holds the chars that always start a comment. If the
156 pre-processor is disabled, these aren't very useful. The macro
157 tc_comment_chars points to this. We use this, rather than the
158 usual comment_chars, so that we can switch for Solaris conventions. */
159 static const char ppc_solaris_comment_chars[] = "#!";
160 static const char ppc_eabi_comment_chars[] = "#";
162 #ifdef TARGET_SOLARIS_COMMENT
163 const char *ppc_comment_chars = ppc_solaris_comment_chars;
165 const char *ppc_comment_chars = ppc_eabi_comment_chars;
168 const char comment_chars[] = "#";
171 /* Characters which start a comment at the beginning of a line. */
172 const char line_comment_chars[] = "#";
174 /* Characters which may be used to separate multiple commands on a
176 const char line_separator_chars[] = ";";
178 /* Characters which are used to indicate an exponent in a floating
180 const char EXP_CHARS[] = "eE";
182 /* Characters which mean that a number is a floating point constant,
184 const char FLT_CHARS[] = "dD";
186 /* The target specific pseudo-ops which we support. */
188 const pseudo_typeS md_pseudo_table[] =
190 /* Pseudo-ops which must be overridden. */
191 { "byte", ppc_byte, 0 },
194 /* Pseudo-ops specific to the RS/6000 XCOFF format. Some of these
195 legitimately belong in the obj-*.c file. However, XCOFF is based
196 on COFF, and is only implemented for the RS/6000. We just use
197 obj-coff.c, and add what we need here. */
198 { "comm", ppc_comm, 0 },
199 { "lcomm", ppc_comm, 1 },
203 { "bi", ppc_biei, 0 },
205 { "csect", ppc_csect, 0 },
206 { "data", ppc_section, 'd' },
210 { "ei", ppc_biei, 1 },
212 { "extern", ppc_extern, 0 },
213 { "function", ppc_function, 0 },
214 { "lglobl", ppc_lglobl, 0 },
215 { "rename", ppc_rename, 0 },
216 { "section", ppc_named_section, 0 },
217 { "stabx", ppc_stabx, 0 },
218 { "text", ppc_section, 't' },
219 { "toc", ppc_toc, 0 },
220 { "long", ppc_xcoff_cons, 2 },
221 { "llong", ppc_xcoff_cons, 3 },
222 { "word", ppc_xcoff_cons, 1 },
223 { "short", ppc_xcoff_cons, 1 },
224 { "vbyte", ppc_vbyte, 0 },
228 { "llong", ppc_elf_cons, 8 },
229 { "quad", ppc_elf_cons, 8 },
230 { "long", ppc_elf_cons, 4 },
231 { "word", ppc_elf_cons, 2 },
232 { "short", ppc_elf_cons, 2 },
233 { "rdata", ppc_elf_rdata, 0 },
234 { "rodata", ppc_elf_rdata, 0 },
235 { "lcomm", ppc_elf_lcomm, 0 },
236 { "file", (void (*) PARAMS ((int))) dwarf2_directive_file, 0 },
237 { "loc", dwarf2_directive_loc, 0 },
241 /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format. */
242 { "previous", ppc_previous, 0 },
243 { "pdata", ppc_pdata, 0 },
244 { "ydata", ppc_ydata, 0 },
245 { "reldata", ppc_reldata, 0 },
246 { "rdata", ppc_rdata, 0 },
247 { "ualong", ppc_ualong, 0 },
248 { "znop", ppc_znop, 0 },
249 { "comm", ppc_pe_comm, 0 },
250 { "lcomm", ppc_pe_comm, 1 },
251 { "section", ppc_pe_section, 0 },
252 { "function", ppc_pe_function,0 },
253 { "tocd", ppc_pe_tocd, 0 },
256 #if defined (OBJ_XCOFF) || defined (OBJ_ELF)
258 { "machine", ppc_machine, 0 },
265 /* Predefined register names if -mregnames (or default for Windows NT).
266 In general, there are lots of them, in an attempt to be compatible
267 with a number of other Windows NT assemblers. */
269 /* Structure to hold information about predefined registers. */
276 /* List of registers that are pre-defined:
278 Each general register has predefined names of the form:
279 1. r<reg_num> which has the value <reg_num>.
280 2. r.<reg_num> which has the value <reg_num>.
282 Each floating point register has predefined names of the form:
283 1. f<reg_num> which has the value <reg_num>.
284 2. f.<reg_num> which has the value <reg_num>.
286 Each vector unit register has predefined names of the form:
287 1. v<reg_num> which has the value <reg_num>.
288 2. v.<reg_num> which has the value <reg_num>.
290 Each condition register has predefined names of the form:
291 1. cr<reg_num> which has the value <reg_num>.
292 2. cr.<reg_num> which has the value <reg_num>.
294 There are individual registers as well:
295 sp or r.sp has the value 1
296 rtoc or r.toc has the value 2
297 fpscr has the value 0
303 dsisr has the value 18
305 sdr1 has the value 25
306 srr0 has the value 26
307 srr1 has the value 27
309 The table is sorted. Suitable for searching by a binary search. */
311 static const struct pd_reg pre_defined_registers[] =
313 { "cr.0", 0 }, /* Condition Registers */
333 { "dar", 19 }, /* Data Access Register */
334 { "dec", 22 }, /* Decrementer */
335 { "dsisr", 18 }, /* Data Storage Interrupt Status Register */
337 { "f.0", 0 }, /* Floating point registers */
405 { "lr", 8 }, /* Link Register */
409 { "r.0", 0 }, /* General Purpose Registers */
442 { "r.sp", 1 }, /* Stack Pointer */
444 { "r.toc", 2 }, /* Pointer to the table of contents */
446 { "r0", 0 }, /* More general purpose registers */
479 { "rtoc", 2 }, /* Table of contents */
481 { "sdr1", 25 }, /* Storage Description Register 1 */
485 { "srr0", 26 }, /* Machine Status Save/Restore Register 0 */
486 { "srr1", 27 }, /* Machine Status Save/Restore Register 1 */
488 { "v.0", 0 }, /* Vector registers */
558 #define REG_NAME_CNT (sizeof (pre_defined_registers) / sizeof (struct pd_reg))
560 /* Given NAME, find the register number associated with that name, return
561 the integer value associated with the given name or -1 on failure. */
563 static int reg_name_search
564 PARAMS ((const struct pd_reg *, int, const char * name));
567 reg_name_search (regs, regcount, name)
568 const struct pd_reg *regs;
572 int middle, low, high;
580 middle = (low + high) / 2;
581 cmp = strcasecmp (name, regs[middle].name);
587 return regs[middle].value;
595 * Summary of register_name.
597 * in: Input_line_pointer points to 1st char of operand.
599 * out: A expressionS.
600 * The operand may have been a register: in this case, X_op == O_register,
601 * X_add_number is set to the register number, and truth is returned.
602 * Input_line_pointer->(next non-blank) char after operand, or is in its
607 register_name (expressionP)
608 expressionS *expressionP;
615 /* Find the spelling of the operand. */
616 start = name = input_line_pointer;
617 if (name[0] == '%' && ISALPHA (name[1]))
618 name = ++input_line_pointer;
620 else if (!reg_names_p || !ISALPHA (name[0]))
623 c = get_symbol_end ();
624 reg_number = reg_name_search (pre_defined_registers, REG_NAME_CNT, name);
626 /* Put back the delimiting char. */
627 *input_line_pointer = c;
629 /* Look to see if it's in the register table. */
632 expressionP->X_op = O_register;
633 expressionP->X_add_number = reg_number;
635 /* Make the rest nice. */
636 expressionP->X_add_symbol = NULL;
637 expressionP->X_op_symbol = NULL;
641 /* Reset the line as if we had not done anything. */
642 input_line_pointer = start;
646 /* This function is called for each symbol seen in an expression. It
647 handles the special parsing which PowerPC assemblers are supposed
648 to use for condition codes. */
650 /* Whether to do the special parsing. */
651 static bfd_boolean cr_operand;
653 /* Names to recognize in a condition code. This table is sorted. */
654 static const struct pd_reg cr_names[] =
671 /* Parsing function. This returns non-zero if it recognized an
675 ppc_parse_name (name, expr)
684 val = reg_name_search (cr_names, sizeof cr_names / sizeof cr_names[0],
689 expr->X_op = O_constant;
690 expr->X_add_number = val;
695 /* Local variables. */
697 /* The type of processor we are assembling for. This is one or more
698 of the PPC_OPCODE flags defined in opcode/ppc.h. */
699 static unsigned long ppc_cpu = 0;
701 /* Whether to target xcoff64/elf64. */
702 static unsigned int ppc_obj64 = BFD_DEFAULT_TARGET_SIZE == 64;
704 /* Opcode hash table. */
705 static struct hash_control *ppc_hash;
707 /* Macro hash table. */
708 static struct hash_control *ppc_macro_hash;
711 /* What type of shared library support to use. */
712 static enum { SHLIB_NONE, SHLIB_PIC, SHLIB_MRELOCATABLE } shlib = SHLIB_NONE;
714 /* Flags to set in the elf header. */
715 static flagword ppc_flags = 0;
717 /* Whether this is Solaris or not. */
718 #ifdef TARGET_SOLARIS_COMMENT
719 #define SOLARIS_P TRUE
721 #define SOLARIS_P FALSE
724 static bfd_boolean msolaris = SOLARIS_P;
729 /* The RS/6000 assembler uses the .csect pseudo-op to generate code
730 using a bunch of different sections. These assembler sections,
731 however, are all encompassed within the .text or .data sections of
732 the final output file. We handle this by using different
733 subsegments within these main segments. */
735 /* Next subsegment to allocate within the .text segment. */
736 static subsegT ppc_text_subsegment = 2;
738 /* Linked list of csects in the text section. */
739 static symbolS *ppc_text_csects;
741 /* Next subsegment to allocate within the .data segment. */
742 static subsegT ppc_data_subsegment = 2;
744 /* Linked list of csects in the data section. */
745 static symbolS *ppc_data_csects;
747 /* The current csect. */
748 static symbolS *ppc_current_csect;
750 /* The RS/6000 assembler uses a TOC which holds addresses of functions
751 and variables. Symbols are put in the TOC with the .tc pseudo-op.
752 A special relocation is used when accessing TOC entries. We handle
753 the TOC as a subsegment within the .data segment. We set it up if
754 we see a .toc pseudo-op, and save the csect symbol here. */
755 static symbolS *ppc_toc_csect;
757 /* The first frag in the TOC subsegment. */
758 static fragS *ppc_toc_frag;
760 /* The first frag in the first subsegment after the TOC in the .data
761 segment. NULL if there are no subsegments after the TOC. */
762 static fragS *ppc_after_toc_frag;
764 /* The current static block. */
765 static symbolS *ppc_current_block;
767 /* The COFF debugging section; set by md_begin. This is not the
768 .debug section, but is instead the secret BFD section which will
769 cause BFD to set the section number of a symbol to N_DEBUG. */
770 static asection *ppc_coff_debug_section;
772 #endif /* OBJ_XCOFF */
776 /* Various sections that we need for PE coff support. */
777 static segT ydata_section;
778 static segT pdata_section;
779 static segT reldata_section;
780 static segT rdata_section;
781 static segT tocdata_section;
783 /* The current section and the previous section. See ppc_previous. */
784 static segT ppc_previous_section;
785 static segT ppc_current_section;
790 symbolS *GOT_symbol; /* Pre-defined "_GLOBAL_OFFSET_TABLE" */
791 #define PPC_APUINFO_ISEL 0x40
792 #define PPC_APUINFO_PMR 0x41
793 #define PPC_APUINFO_RFMCI 0x42
794 #define PPC_APUINFO_CACHELCK 0x43
795 #define PPC_APUINFO_SPE 0x100
796 #define PPC_APUINFO_EFS 0x101
797 #define PPC_APUINFO_BRLOCK 0x102
800 * We keep a list of APUinfo
802 unsigned long *ppc_apuinfo_list;
803 unsigned int ppc_apuinfo_num;
804 unsigned int ppc_apuinfo_num_alloc;
808 const char *const md_shortopts = "b:l:usm:K:VQ:";
810 const char *const md_shortopts = "um:";
812 const struct option md_longopts[] = {
813 {NULL, no_argument, NULL, 0}
815 const size_t md_longopts_size = sizeof (md_longopts);
818 md_parse_option (c, arg)
825 /* -u means that any undefined symbols should be treated as
826 external, which is the default for gas anyhow. */
831 /* Solaris as takes -le (presumably for little endian). For completeness
832 sake, recognize -be also. */
833 if (strcmp (arg, "e") == 0)
835 target_big_endian = 0;
836 set_target_endian = 1;
844 if (strcmp (arg, "e") == 0)
846 target_big_endian = 1;
847 set_target_endian = 1;
855 /* Recognize -K PIC. */
856 if (strcmp (arg, "PIC") == 0 || strcmp (arg, "pic") == 0)
859 ppc_flags |= EF_PPC_RELOCATABLE_LIB;
867 /* a64 and a32 determine whether to use XCOFF64 or XCOFF32. */
869 if (strcmp (arg, "64") == 0)
874 as_fatal (_("%s unsupported"), "-a64");
877 else if (strcmp (arg, "32") == 0)
884 /* -mpwrx and -mpwr2 mean to assemble for the IBM POWER/2
886 if (strcmp (arg, "pwrx") == 0 || strcmp (arg, "pwr2") == 0)
887 ppc_cpu = PPC_OPCODE_POWER | PPC_OPCODE_POWER2 | PPC_OPCODE_32;
888 /* -mpwr means to assemble for the IBM POWER (RIOS1). */
889 else if (strcmp (arg, "pwr") == 0)
890 ppc_cpu = PPC_OPCODE_POWER | PPC_OPCODE_32;
891 /* -m601 means to assemble for the PowerPC 601, which includes
892 instructions that are holdovers from the Power. */
893 else if (strcmp (arg, "601") == 0)
894 ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC
895 | PPC_OPCODE_601 | PPC_OPCODE_32);
896 /* -mppc, -mppc32, -m603, and -m604 mean to assemble for the
898 else if (strcmp (arg, "ppc") == 0
899 || strcmp (arg, "ppc32") == 0
900 || strcmp (arg, "603") == 0
901 || strcmp (arg, "604") == 0)
902 ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_32;
903 /* -m403 and -m405 mean to assemble for the PowerPC 403/405. */
904 else if (strcmp (arg, "403") == 0
905 || strcmp (arg, "405") == 0)
906 ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC
907 | PPC_OPCODE_403 | PPC_OPCODE_32);
908 else if (strcmp (arg, "7400") == 0
909 || strcmp (arg, "7410") == 0
910 || strcmp (arg, "7450") == 0
911 || strcmp (arg, "7455") == 0)
912 ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC
913 | PPC_OPCODE_ALTIVEC | PPC_OPCODE_32);
914 else if (strcmp (arg, "altivec") == 0)
917 ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_ALTIVEC;
919 ppc_cpu |= PPC_OPCODE_ALTIVEC;
921 else if (strcmp (arg, "e500") == 0 || strcmp (arg, "e500x2") == 0)
923 ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_SPE
924 | PPC_OPCODE_ISEL | PPC_OPCODE_EFS | PPC_OPCODE_BRLOCK
925 | PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK
928 else if (strcmp (arg, "spe") == 0)
931 ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_SPE | PPC_OPCODE_EFS;
933 ppc_cpu |= PPC_OPCODE_SPE;
935 /* -mppc64 and -m620 mean to assemble for the 64-bit PowerPC
937 else if (strcmp (arg, "ppc64") == 0 || strcmp (arg, "620") == 0)
939 ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_64;
941 else if (strcmp (arg, "ppc64bridge") == 0)
943 ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC
944 | PPC_OPCODE_64_BRIDGE | PPC_OPCODE_64);
946 /* -mbooke/-mbooke32 mean enable 32-bit BookE support. */
947 else if (strcmp (arg, "booke") == 0 || strcmp (arg, "booke32") == 0)
949 ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_32;
951 /* -mbooke64 means enable 64-bit BookE support. */
952 else if (strcmp (arg, "booke64") == 0)
954 ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE
955 | PPC_OPCODE_BOOKE64 | PPC_OPCODE_64);
957 else if (strcmp (arg, "power4") == 0)
959 ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC
960 | PPC_OPCODE_64 | PPC_OPCODE_POWER4);
962 /* -mcom means assemble for the common intersection between Power
963 and PowerPC. At present, we just allow the union, rather
964 than the intersection. */
965 else if (strcmp (arg, "com") == 0)
966 ppc_cpu = PPC_OPCODE_COMMON | PPC_OPCODE_32;
967 /* -many means to assemble for any architecture (PWR/PWRX/PPC). */
968 else if (strcmp (arg, "any") == 0)
969 ppc_cpu = PPC_OPCODE_ANY | PPC_OPCODE_32;
971 else if (strcmp (arg, "regnames") == 0)
974 else if (strcmp (arg, "no-regnames") == 0)
978 /* -mrelocatable/-mrelocatable-lib -- warn about initializations
979 that require relocation. */
980 else if (strcmp (arg, "relocatable") == 0)
982 shlib = SHLIB_MRELOCATABLE;
983 ppc_flags |= EF_PPC_RELOCATABLE;
986 else if (strcmp (arg, "relocatable-lib") == 0)
988 shlib = SHLIB_MRELOCATABLE;
989 ppc_flags |= EF_PPC_RELOCATABLE_LIB;
992 /* -memb, set embedded bit. */
993 else if (strcmp (arg, "emb") == 0)
994 ppc_flags |= EF_PPC_EMB;
996 /* -mlittle/-mbig set the endianess. */
997 else if (strcmp (arg, "little") == 0
998 || strcmp (arg, "little-endian") == 0)
1000 target_big_endian = 0;
1001 set_target_endian = 1;
1004 else if (strcmp (arg, "big") == 0 || strcmp (arg, "big-endian") == 0)
1006 target_big_endian = 1;
1007 set_target_endian = 1;
1010 else if (strcmp (arg, "solaris") == 0)
1013 ppc_comment_chars = ppc_solaris_comment_chars;
1016 else if (strcmp (arg, "no-solaris") == 0)
1019 ppc_comment_chars = ppc_eabi_comment_chars;
1024 as_bad (_("invalid switch -m%s"), arg);
1030 /* -V: SVR4 argument to print version ID. */
1032 print_version_id ();
1035 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
1036 should be emitted or not. FIXME: Not implemented. */
1040 /* Solaris takes -s to specify that .stabs go in a .stabs section,
1041 rather than .stabs.excl, which is ignored by the linker.
1042 FIXME: Not implemented. */
1058 md_show_usage (stream)
1061 fprintf (stream, _("\
1064 -mpwrx, -mpwr2 generate code for POWER/2 (RIOS2)\n\
1065 -mpwr generate code for POWER (RIOS1)\n\
1066 -m601 generate code for PowerPC 601\n\
1067 -mppc, -mppc32, -m603, -m604\n\
1068 generate code for PowerPC 603/604\n\
1069 -m403, -m405 generate code for PowerPC 403/405\n\
1070 -m7400, -m7410, -m7450, -m7455\n\
1071 generate code For PowerPC 7400/7410/7450/7455\n\
1072 -mppc64, -m620 generate code for PowerPC 620/625/630\n\
1073 -mppc64bridge generate code for PowerPC 64, including bridge insns\n\
1074 -mbooke64 generate code for 64-bit PowerPC BookE\n\
1075 -mbooke, mbooke32 generate code for 32-bit PowerPC BookE\n\
1076 -mpower4 generate code for Power4 architecture\n\
1077 -maltivec generate code for AltiVec\n\
1078 -mcom generate code Power/PowerPC common instructions\n\
1079 -many generate code for any architecture (PWR/PWRX/PPC)\n\
1080 -mregnames Allow symbolic names for registers\n\
1081 -mno-regnames Do not allow symbolic names for registers\n"));
1082 fprintf (stream, _("\
1083 -me500, -me500x2 generate code for Motorola e500 core complex\n\
1084 -mspe generate code for Motorola SPE instructions\n"));
1086 fprintf (stream, _("\
1087 -mrelocatable support for GCC's -mrelocatble option\n\
1088 -mrelocatable-lib support for GCC's -mrelocatble-lib option\n\
1089 -memb set PPC_EMB bit in ELF flags\n\
1090 -mlittle, -mlittle-endian\n\
1091 generate code for a little endian machine\n\
1092 -mbig, -mbig-endian generate code for a big endian machine\n\
1093 -msolaris generate code for Solaris\n\
1094 -mno-solaris do not generate code for Solaris\n\
1095 -V print assembler version number\n\
1096 -Qy, -Qn ignored\n"));
1100 /* Set ppc_cpu if it is not already set. */
1105 const char *default_os = TARGET_OS;
1106 const char *default_cpu = TARGET_CPU;
1111 ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_64;
1112 else if (strncmp (default_os, "aix", 3) == 0
1113 && default_os[3] >= '4' && default_os[3] <= '9')
1114 ppc_cpu = PPC_OPCODE_COMMON | PPC_OPCODE_32;
1115 else if (strncmp (default_os, "aix3", 4) == 0)
1116 ppc_cpu = PPC_OPCODE_POWER | PPC_OPCODE_32;
1117 else if (strcmp (default_cpu, "rs6000") == 0)
1118 ppc_cpu = PPC_OPCODE_POWER | PPC_OPCODE_32;
1119 else if (strncmp (default_cpu, "powerpc", 7) == 0)
1121 if (default_cpu[7] == '6' && default_cpu[8] == '4')
1122 ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_64;
1124 ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_32;
1127 as_fatal (_("Unknown default cpu = %s, os = %s"),
1128 default_cpu, default_os);
1132 /* Figure out the BFD architecture to use. */
1134 enum bfd_architecture
1137 const char *default_cpu = TARGET_CPU;
1140 if ((ppc_cpu & PPC_OPCODE_PPC) != 0)
1141 return bfd_arch_powerpc;
1142 else if ((ppc_cpu & PPC_OPCODE_POWER) != 0)
1143 return bfd_arch_rs6000;
1144 else if ((ppc_cpu & (PPC_OPCODE_COMMON | PPC_OPCODE_ANY)) != 0)
1146 if (strcmp (default_cpu, "rs6000") == 0)
1147 return bfd_arch_rs6000;
1148 else if (strncmp (default_cpu, "powerpc", 7) == 0)
1149 return bfd_arch_powerpc;
1152 as_fatal (_("Neither Power nor PowerPC opcodes were selected."));
1153 return bfd_arch_unknown;
1160 return bfd_mach_ppc64;
1161 else if (ppc_arch () == bfd_arch_rs6000)
1162 return bfd_mach_rs6k;
1164 return bfd_mach_ppc;
1168 ppc_target_format ()
1172 return target_big_endian ? "pe-powerpc" : "pe-powerpcle";
1174 return "xcoff-powermac";
1177 return (ppc_obj64 ? "aix5coff64-rs6000" : "aixcoff-rs6000");
1179 return (ppc_obj64 ? "aixcoff64-rs6000" : "aixcoff-rs6000");
1184 return (target_big_endian
1185 ? (ppc_obj64 ? "elf64-powerpc" : "elf32-powerpc")
1186 : (ppc_obj64 ? "elf64-powerpcle" : "elf32-powerpcle"));
1190 /* This function is called when the assembler starts up. It is called
1191 after the options have been parsed and the output file has been
1197 register const struct powerpc_opcode *op;
1198 const struct powerpc_opcode *op_end;
1199 const struct powerpc_macro *macro;
1200 const struct powerpc_macro *macro_end;
1201 bfd_boolean dup_insn = FALSE;
1206 /* Set the ELF flags if desired. */
1207 if (ppc_flags && !msolaris)
1208 bfd_set_private_flags (stdoutput, ppc_flags);
1211 /* Insert the opcodes into a hash table. */
1212 ppc_hash = hash_new ();
1214 op_end = powerpc_opcodes + powerpc_num_opcodes;
1215 for (op = powerpc_opcodes; op < op_end; op++)
1217 know ((op->opcode & op->mask) == op->opcode);
1219 if ((op->flags & ppc_cpu & ~(PPC_OPCODE_32 | PPC_OPCODE_64)) != 0
1220 && ((op->flags & (PPC_OPCODE_32 | PPC_OPCODE_64)) == 0
1221 || ((op->flags & (PPC_OPCODE_32 | PPC_OPCODE_64))
1222 == (ppc_cpu & (PPC_OPCODE_32 | PPC_OPCODE_64)))
1223 || (ppc_cpu & PPC_OPCODE_64_BRIDGE) != 0)
1224 /* Certain instructions (eg: extsw) do not exist in the
1225 32-bit BookE instruction set, but they do exist in the
1226 64-bit BookE instruction set, and other PPC instruction
1227 sets. Check to see if the opcode has the BOOKE64 flag set.
1228 If it does make sure that the target CPU is not the BookE32. */
1229 && ((op->flags & PPC_OPCODE_BOOKE64) == 0
1230 || (ppc_cpu & PPC_OPCODE_BOOKE64) == PPC_OPCODE_BOOKE64
1231 || (ppc_cpu & PPC_OPCODE_BOOKE) == 0)
1232 && ((op->flags & (PPC_OPCODE_POWER4 | PPC_OPCODE_NOPOWER4)) == 0
1233 || ((op->flags & PPC_OPCODE_POWER4)
1234 == (ppc_cpu & PPC_OPCODE_POWER4))))
1238 retval = hash_insert (ppc_hash, op->name, (PTR) op);
1239 if (retval != (const char *) NULL)
1241 /* Ignore Power duplicates for -m601. */
1242 if ((ppc_cpu & PPC_OPCODE_601) != 0
1243 && (op->flags & PPC_OPCODE_POWER) != 0)
1246 as_bad (_("Internal assembler error for instruction %s"),
1253 /* Insert the macros into a hash table. */
1254 ppc_macro_hash = hash_new ();
1256 macro_end = powerpc_macros + powerpc_num_macros;
1257 for (macro = powerpc_macros; macro < macro_end; macro++)
1259 if ((macro->flags & ppc_cpu) != 0)
1263 retval = hash_insert (ppc_macro_hash, macro->name, (PTR) macro);
1264 if (retval != (const char *) NULL)
1266 as_bad (_("Internal assembler error for macro %s"), macro->name);
1275 /* Tell the main code what the endianness is if it is not overidden
1277 if (!set_target_endian)
1279 set_target_endian = 1;
1280 target_big_endian = PPC_BIG_ENDIAN;
1284 ppc_coff_debug_section = coff_section_from_bfd_index (stdoutput, N_DEBUG);
1286 /* Create dummy symbols to serve as initial csects. This forces the
1287 text csects to precede the data csects. These symbols will not
1289 ppc_text_csects = symbol_make ("dummy\001");
1290 symbol_get_tc (ppc_text_csects)->within = ppc_text_csects;
1291 ppc_data_csects = symbol_make ("dummy\001");
1292 symbol_get_tc (ppc_data_csects)->within = ppc_data_csects;
1297 ppc_current_section = text_section;
1298 ppc_previous_section = 0;
1307 if (ppc_apuinfo_list == NULL)
1310 /* Ok, so write the section info out. We have this layout:
1314 0 8 length of "APUinfo\0"
1315 4 (n*4) number of APU's (4 bytes each)
1318 20 APU#1 first APU's info
1319 24 APU#2 second APU's info
1324 asection *seg = now_seg;
1325 subsegT subseg = now_subseg;
1326 asection *apuinfo_secp = (asection *) NULL;
1329 /* Create the .PPC.EMB.apuinfo section. */
1330 apuinfo_secp = subseg_new (".PPC.EMB.apuinfo", 0);
1331 bfd_set_section_flags (stdoutput,
1333 SEC_HAS_CONTENTS | SEC_READONLY);
1336 md_number_to_chars (p, (valueT) 8, 4);
1339 md_number_to_chars (p, (valueT) ppc_apuinfo_num, 4);
1342 md_number_to_chars (p, (valueT) 2, 4);
1345 strcpy (p, "APUinfo");
1347 for (i = 0; i < ppc_apuinfo_num; i++)
1350 md_number_to_chars (p, (valueT) ppc_apuinfo_list[i], 4);
1353 frag_align (2, 0, 0);
1355 /* We probably can't restore the current segment, for there likely
1358 subseg_set (seg, subseg);
1363 /* Insert an operand value into an instruction. */
1365 static unsigned long
1366 ppc_insert_operand (insn, operand, val, file, line)
1368 const struct powerpc_operand *operand;
1373 if (operand->bits != 32)
1378 if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
1380 if ((operand->flags & PPC_OPERAND_SIGNOPT) != 0)
1381 max = (1 << operand->bits) - 1;
1383 max = (1 << (operand->bits - 1)) - 1;
1384 min = - (1 << (operand->bits - 1));
1388 /* Some people write 32 bit hex constants with the sign
1389 extension done by hand. This shouldn't really be
1390 valid, but, to permit this code to assemble on a 64
1391 bit host, we sign extend the 32 bit value. */
1393 && (val & (offsetT) 0x80000000) != 0
1394 && (val & (offsetT) 0xffffffff) == val)
1403 max = (1 << operand->bits) - 1;
1407 if ((operand->flags & PPC_OPERAND_NEGATIVE) != 0)
1412 if (test < (offsetT) min || test > (offsetT) max)
1415 _("operand out of range (%s not between %ld and %ld)");
1418 sprint_value (buf, test);
1419 as_bad_where (file, line, err, buf, min, max);
1423 if (operand->insert)
1428 insn = (*operand->insert) (insn, (long) val, ppc_cpu, &errmsg);
1429 if (errmsg != (const char *) NULL)
1430 as_bad_where (file, line, errmsg);
1433 insn |= (((long) val & ((1 << operand->bits) - 1))
1441 /* Parse @got, etc. and return the desired relocation. */
1442 static bfd_reloc_code_real_type
1443 ppc_elf_suffix (str_p, exp_p)
1458 const struct map_bfd *ptr;
1460 #define MAP(str,reloc) { str, sizeof (str)-1, reloc }
1462 static const struct map_bfd mapping[] = {
1463 MAP ("l", (int) BFD_RELOC_LO16),
1464 MAP ("h", (int) BFD_RELOC_HI16),
1465 MAP ("ha", (int) BFD_RELOC_HI16_S),
1466 MAP ("brtaken", (int) BFD_RELOC_PPC_B16_BRTAKEN),
1467 MAP ("brntaken", (int) BFD_RELOC_PPC_B16_BRNTAKEN),
1468 MAP ("got", (int) BFD_RELOC_16_GOTOFF),
1469 MAP ("got@l", (int) BFD_RELOC_LO16_GOTOFF),
1470 MAP ("got@h", (int) BFD_RELOC_HI16_GOTOFF),
1471 MAP ("got@ha", (int) BFD_RELOC_HI16_S_GOTOFF),
1472 MAP ("fixup", (int) BFD_RELOC_CTOR), /* warning with -mrelocatable */
1473 MAP ("plt", (int) BFD_RELOC_24_PLT_PCREL),
1474 MAP ("pltrel24", (int) BFD_RELOC_24_PLT_PCREL),
1475 MAP ("copy", (int) BFD_RELOC_PPC_COPY),
1476 MAP ("globdat", (int) BFD_RELOC_PPC_GLOB_DAT),
1477 MAP ("local24pc", (int) BFD_RELOC_PPC_LOCAL24PC),
1478 MAP ("local", (int) BFD_RELOC_PPC_LOCAL24PC),
1479 MAP ("pltrel", (int) BFD_RELOC_32_PLT_PCREL),
1480 MAP ("plt@l", (int) BFD_RELOC_LO16_PLTOFF),
1481 MAP ("plt@h", (int) BFD_RELOC_HI16_PLTOFF),
1482 MAP ("plt@ha", (int) BFD_RELOC_HI16_S_PLTOFF),
1483 MAP ("sdarel", (int) BFD_RELOC_GPREL16),
1484 MAP ("sectoff", (int) BFD_RELOC_16_BASEREL),
1485 MAP ("sectoff@l", (int) BFD_RELOC_LO16_BASEREL),
1486 MAP ("sectoff@h", (int) BFD_RELOC_HI16_BASEREL),
1487 MAP ("sectoff@ha", (int) BFD_RELOC_HI16_S_BASEREL),
1488 MAP ("naddr", (int) BFD_RELOC_PPC_EMB_NADDR32),
1489 MAP ("naddr16", (int) BFD_RELOC_PPC_EMB_NADDR16),
1490 MAP ("naddr@l", (int) BFD_RELOC_PPC_EMB_NADDR16_LO),
1491 MAP ("naddr@h", (int) BFD_RELOC_PPC_EMB_NADDR16_HI),
1492 MAP ("naddr@ha", (int) BFD_RELOC_PPC_EMB_NADDR16_HA),
1493 MAP ("sdai16", (int) BFD_RELOC_PPC_EMB_SDAI16),
1494 MAP ("sda2rel", (int) BFD_RELOC_PPC_EMB_SDA2REL),
1495 MAP ("sda2i16", (int) BFD_RELOC_PPC_EMB_SDA2I16),
1496 MAP ("sda21", (int) BFD_RELOC_PPC_EMB_SDA21),
1497 MAP ("mrkref", (int) BFD_RELOC_PPC_EMB_MRKREF),
1498 MAP ("relsect", (int) BFD_RELOC_PPC_EMB_RELSEC16),
1499 MAP ("relsect@l", (int) BFD_RELOC_PPC_EMB_RELST_LO),
1500 MAP ("relsect@h", (int) BFD_RELOC_PPC_EMB_RELST_HI),
1501 MAP ("relsect@ha", (int) BFD_RELOC_PPC_EMB_RELST_HA),
1502 MAP ("bitfld", (int) BFD_RELOC_PPC_EMB_BIT_FLD),
1503 MAP ("relsda", (int) BFD_RELOC_PPC_EMB_RELSDA),
1504 MAP ("xgot", (int) BFD_RELOC_PPC_TOC16),
1505 /* The following are only valid for ppc64. Negative values are
1506 used instead of a flag. */
1507 MAP ("higher", - (int) BFD_RELOC_PPC64_HIGHER),
1508 MAP ("highera", - (int) BFD_RELOC_PPC64_HIGHER_S),
1509 MAP ("highest", - (int) BFD_RELOC_PPC64_HIGHEST),
1510 MAP ("highesta", - (int) BFD_RELOC_PPC64_HIGHEST_S),
1511 MAP ("tocbase", - (int) BFD_RELOC_PPC64_TOC),
1512 MAP ("toc", - (int) BFD_RELOC_PPC_TOC16),
1513 MAP ("toc@l", - (int) BFD_RELOC_PPC64_TOC16_LO),
1514 MAP ("toc@h", - (int) BFD_RELOC_PPC64_TOC16_HI),
1515 MAP ("toc@ha", - (int) BFD_RELOC_PPC64_TOC16_HA),
1516 { (char *) 0, 0, (int) BFD_RELOC_UNUSED }
1520 return BFD_RELOC_UNUSED;
1522 for (ch = *str, str2 = ident;
1523 (str2 < ident + sizeof (ident) - 1
1524 && (ISALNUM (ch) || ch == '@'));
1527 *str2++ = TOLOWER (ch);
1534 for (ptr = &mapping[0]; ptr->length > 0; ptr++)
1535 if (ch == ptr->string[0]
1536 && len == ptr->length
1537 && memcmp (ident, ptr->string, ptr->length) == 0)
1539 int reloc = ptr->reloc;
1544 return BFD_RELOC_UNUSED;
1548 if (exp_p->X_add_number != 0
1549 && (reloc == (int) BFD_RELOC_16_GOTOFF
1550 || reloc == (int) BFD_RELOC_LO16_GOTOFF
1551 || reloc == (int) BFD_RELOC_HI16_GOTOFF
1552 || reloc == (int) BFD_RELOC_HI16_S_GOTOFF))
1553 as_warn (_("identifier+constant@got means identifier@got+constant"));
1555 /* Now check for identifier@suffix+constant. */
1556 if (*str == '-' || *str == '+')
1558 char *orig_line = input_line_pointer;
1559 expressionS new_exp;
1561 input_line_pointer = str;
1562 expression (&new_exp);
1563 if (new_exp.X_op == O_constant)
1565 exp_p->X_add_number += new_exp.X_add_number;
1566 str = input_line_pointer;
1569 if (&input_line_pointer != str_p)
1570 input_line_pointer = orig_line;
1574 if (reloc == (int) BFD_RELOC_PPC64_TOC
1575 && exp_p->X_op == O_symbol)
1577 /* This reloc type ignores the symbol. Change the symbol
1578 so that the dummy .TOC. symbol can be omitted from the
1580 exp_p->X_add_symbol = &abs_symbol;
1583 return (bfd_reloc_code_real_type) reloc;
1586 return BFD_RELOC_UNUSED;
1589 /* Like normal .long/.short/.word, except support @got, etc.
1590 Clobbers input_line_pointer, checks end-of-line. */
1592 ppc_elf_cons (nbytes)
1593 register int nbytes; /* 1=.byte, 2=.word, 4=.long, 8=.llong. */
1596 bfd_reloc_code_real_type reloc;
1598 if (is_it_end_of_statement ())
1600 demand_empty_rest_of_line ();
1607 if (exp.X_op == O_symbol
1608 && *input_line_pointer == '@'
1609 && (reloc = ppc_elf_suffix (&input_line_pointer,
1610 &exp)) != BFD_RELOC_UNUSED)
1612 reloc_howto_type *reloc_howto;
1615 reloc_howto = bfd_reloc_type_lookup (stdoutput, reloc);
1616 size = bfd_get_reloc_size (reloc_howto);
1620 as_bad (_("%s relocations do not fit in %d bytes\n"),
1621 reloc_howto->name, nbytes);
1628 p = frag_more (nbytes);
1630 if (target_big_endian)
1631 offset = nbytes - size;
1632 fix_new_exp (frag_now, p - frag_now->fr_literal + offset, size,
1637 emit_expr (&exp, (unsigned int) nbytes);
1639 while (*input_line_pointer++ == ',');
1641 /* Put terminator back into stream. */
1642 input_line_pointer--;
1643 demand_empty_rest_of_line ();
1646 /* Solaris pseduo op to change to the .rodata section. */
1651 char *save_line = input_line_pointer;
1652 static char section[] = ".rodata\n";
1654 /* Just pretend this is .section .rodata */
1655 input_line_pointer = section;
1656 obj_elf_section (xxx);
1658 input_line_pointer = save_line;
1661 /* Pseudo op to make file scope bss items. */
1664 int xxx ATTRIBUTE_UNUSED;
1666 register char *name;
1670 register symbolS *symbolP;
1677 name = input_line_pointer;
1678 c = get_symbol_end ();
1680 /* just after name is now '\0'. */
1681 p = input_line_pointer;
1684 if (*input_line_pointer != ',')
1686 as_bad (_("Expected comma after symbol-name: rest of line ignored."));
1687 ignore_rest_of_line ();
1691 input_line_pointer++; /* skip ',' */
1692 if ((size = get_absolute_expression ()) < 0)
1694 as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) size);
1695 ignore_rest_of_line ();
1699 /* The third argument to .lcomm is the alignment. */
1700 if (*input_line_pointer != ',')
1704 ++input_line_pointer;
1705 align = get_absolute_expression ();
1708 as_warn (_("ignoring bad alignment"));
1714 symbolP = symbol_find_or_make (name);
1717 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
1719 as_bad (_("Ignoring attempt to re-define symbol `%s'."),
1720 S_GET_NAME (symbolP));
1721 ignore_rest_of_line ();
1725 if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size)
1727 as_bad (_("Length of .lcomm \"%s\" is already %ld. Not changed to %ld."),
1728 S_GET_NAME (symbolP),
1729 (long) S_GET_VALUE (symbolP),
1732 ignore_rest_of_line ();
1738 old_subsec = now_subseg;
1741 /* Convert to a power of 2 alignment. */
1742 for (align2 = 0; (align & 1) == 0; align >>= 1, ++align2);
1745 as_bad (_("Common alignment not a power of 2"));
1746 ignore_rest_of_line ();
1753 record_alignment (bss_section, align2);
1754 subseg_set (bss_section, 0);
1756 frag_align (align2, 0, 0);
1757 if (S_GET_SEGMENT (symbolP) == bss_section)
1758 symbol_get_frag (symbolP)->fr_symbol = 0;
1759 symbol_set_frag (symbolP, frag_now);
1760 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, size,
1763 S_SET_SIZE (symbolP, size);
1764 S_SET_SEGMENT (symbolP, bss_section);
1765 subseg_set (old_sec, old_subsec);
1766 demand_empty_rest_of_line ();
1769 /* Validate any relocations emitted for -mrelocatable, possibly adding
1770 fixups for word relocations in writable segments, so we can adjust
1773 ppc_elf_validate_fix (fixp, seg)
1777 if (fixp->fx_done || fixp->fx_pcrel)
1786 case SHLIB_MRELOCATABLE:
1787 if (fixp->fx_r_type <= BFD_RELOC_UNUSED
1788 && fixp->fx_r_type != BFD_RELOC_16_GOTOFF
1789 && fixp->fx_r_type != BFD_RELOC_HI16_GOTOFF
1790 && fixp->fx_r_type != BFD_RELOC_LO16_GOTOFF
1791 && fixp->fx_r_type != BFD_RELOC_HI16_S_GOTOFF
1792 && fixp->fx_r_type != BFD_RELOC_16_BASEREL
1793 && fixp->fx_r_type != BFD_RELOC_LO16_BASEREL
1794 && fixp->fx_r_type != BFD_RELOC_HI16_BASEREL
1795 && fixp->fx_r_type != BFD_RELOC_HI16_S_BASEREL
1796 && (seg->flags & SEC_LOAD) != 0
1797 && strcmp (segment_name (seg), ".got2") != 0
1798 && strcmp (segment_name (seg), ".dtors") != 0
1799 && strcmp (segment_name (seg), ".ctors") != 0
1800 && strcmp (segment_name (seg), ".fixup") != 0
1801 && strcmp (segment_name (seg), ".gcc_except_table") != 0
1802 && strcmp (segment_name (seg), ".eh_frame") != 0
1803 && strcmp (segment_name (seg), ".ex_shared") != 0)
1805 if ((seg->flags & (SEC_READONLY | SEC_CODE)) != 0
1806 || fixp->fx_r_type != BFD_RELOC_CTOR)
1808 as_bad_where (fixp->fx_file, fixp->fx_line,
1809 _("Relocation cannot be done when using -mrelocatable"));
1816 /* Prevent elf_frob_file_before_adjust removing a weak undefined
1817 function descriptor sym if the corresponding code sym is used. */
1820 ppc_frob_file_before_adjust ()
1827 for (symp = symbol_rootP; symp; symp = symbol_next (symp))
1834 name = S_GET_NAME (symp);
1838 if (! S_IS_WEAK (symp)
1839 || S_IS_DEFINED (symp))
1842 len = strlen (name) + 1;
1843 dotname = xmalloc (len + 1);
1845 memcpy (dotname + 1, name, len);
1846 dotsym = symbol_find (dotname);
1848 if (dotsym != NULL && (symbol_used_p (dotsym)
1849 || symbol_used_in_reloc_p (dotsym)))
1851 symbol_mark_used (symp);
1855 /* Don't emit .TOC. symbol. */
1856 symp = symbol_find (".TOC.");
1858 symbol_remove (symp, &symbol_rootP, &symbol_lastP);
1860 #endif /* OBJ_ELF */
1865 * Summary of parse_toc_entry.
1867 * in: Input_line_pointer points to the '[' in one of:
1869 * [toc] [tocv] [toc32] [toc64]
1871 * Anything else is an error of one kind or another.
1874 * return value: success or failure
1875 * toc_kind: kind of toc reference
1876 * input_line_pointer:
1877 * success: first char after the ']'
1878 * failure: unchanged
1882 * [toc] - rv == success, toc_kind = default_toc
1883 * [tocv] - rv == success, toc_kind = data_in_toc
1884 * [toc32] - rv == success, toc_kind = must_be_32
1885 * [toc64] - rv == success, toc_kind = must_be_64
1889 enum toc_size_qualifier
1891 default_toc, /* The toc cell constructed should be the system default size */
1892 data_in_toc, /* This is a direct reference to a toc cell */
1893 must_be_32, /* The toc cell constructed must be 32 bits wide */
1894 must_be_64 /* The toc cell constructed must be 64 bits wide */
1898 parse_toc_entry (toc_kind)
1899 enum toc_size_qualifier *toc_kind;
1904 enum toc_size_qualifier t;
1906 /* Save the input_line_pointer. */
1907 start = input_line_pointer;
1909 /* Skip over the '[' , and whitespace. */
1910 ++input_line_pointer;
1913 /* Find the spelling of the operand. */
1914 toc_spec = input_line_pointer;
1915 c = get_symbol_end ();
1917 if (strcmp (toc_spec, "toc") == 0)
1921 else if (strcmp (toc_spec, "tocv") == 0)
1925 else if (strcmp (toc_spec, "toc32") == 0)
1929 else if (strcmp (toc_spec, "toc64") == 0)
1935 as_bad (_("syntax error: invalid toc specifier `%s'"), toc_spec);
1936 *input_line_pointer = c;
1937 input_line_pointer = start;
1941 /* Now find the ']'. */
1942 *input_line_pointer = c;
1944 SKIP_WHITESPACE (); /* leading whitespace could be there. */
1945 c = *input_line_pointer++; /* input_line_pointer->past char in c. */
1949 as_bad (_("syntax error: expected `]', found `%c'"), c);
1950 input_line_pointer = start;
1961 #define APUID(a,v) ((((a) & 0xffff) << 16) | ((v) & 0xffff))
1963 ppc_apuinfo_section_add (apu, version)
1964 unsigned int apu, version;
1968 /* Check we don't already exist. */
1969 for (i = 0; i < ppc_apuinfo_num; i++)
1970 if (ppc_apuinfo_list[i] == APUID (apu, version))
1973 if (ppc_apuinfo_num == ppc_apuinfo_num_alloc)
1975 if (ppc_apuinfo_num_alloc == 0)
1977 ppc_apuinfo_num_alloc = 4;
1978 ppc_apuinfo_list = (unsigned long *)
1979 xmalloc (sizeof (unsigned long) * ppc_apuinfo_num_alloc);
1983 ppc_apuinfo_num_alloc += 4;
1984 ppc_apuinfo_list = (unsigned long *) xrealloc (ppc_apuinfo_list,
1985 sizeof (unsigned long) * ppc_apuinfo_num_alloc);
1988 ppc_apuinfo_list[ppc_apuinfo_num++] = APUID (apu, version);
1994 /* We need to keep a list of fixups. We can't simply generate them as
1995 we go, because that would require us to first create the frag, and
1996 that would screw up references to ``.''. */
2002 bfd_reloc_code_real_type reloc;
2005 #define MAX_INSN_FIXUPS (5)
2007 /* This routine is called for each instruction to be assembled. */
2014 const struct powerpc_opcode *opcode;
2016 const unsigned char *opindex_ptr;
2020 struct ppc_fixup fixups[MAX_INSN_FIXUPS];
2025 bfd_reloc_code_real_type reloc;
2028 /* Get the opcode. */
2029 for (s = str; *s != '\0' && ! ISSPACE (*s); s++)
2034 /* Look up the opcode in the hash table. */
2035 opcode = (const struct powerpc_opcode *) hash_find (ppc_hash, str);
2036 if (opcode == (const struct powerpc_opcode *) NULL)
2038 const struct powerpc_macro *macro;
2040 macro = (const struct powerpc_macro *) hash_find (ppc_macro_hash, str);
2041 if (macro == (const struct powerpc_macro *) NULL)
2042 as_bad (_("Unrecognized opcode: `%s'"), str);
2044 ppc_macro (s, macro);
2049 insn = opcode->opcode;
2052 while (ISSPACE (*str))
2055 /* PowerPC operands are just expressions. The only real issue is
2056 that a few operand types are optional. All cases which might use
2057 an optional operand separate the operands only with commas (in
2058 some cases parentheses are used, as in ``lwz 1,0(1)'' but such
2059 cases never have optional operands). There is never more than
2060 one optional operand for an instruction. So, before we start
2061 seriously parsing the operands, we check to see if we have an
2062 optional operand, and, if we do, we count the number of commas to
2063 see whether the operand should be omitted. */
2065 for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
2067 const struct powerpc_operand *operand;
2069 operand = &powerpc_operands[*opindex_ptr];
2070 if ((operand->flags & PPC_OPERAND_OPTIONAL) != 0)
2072 unsigned int opcount;
2073 unsigned int num_operands_expected;
2076 /* There is an optional operand. Count the number of
2077 commas in the input line. */
2084 while ((s = strchr (s, ',')) != (char *) NULL)
2091 /* Compute the number of expected operands.
2092 Do not count fake operands. */
2093 for (num_operands_expected = 0, i = 0; opcode->operands[i]; i ++)
2094 if ((powerpc_operands [opcode->operands[i]].flags & PPC_OPERAND_FAKE) == 0)
2095 ++ num_operands_expected;
2097 /* If there are fewer operands in the line then are called
2098 for by the instruction, we want to skip the optional
2100 if (opcount < num_operands_expected)
2107 /* Gather the operands. */
2111 for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
2113 const struct powerpc_operand *operand;
2119 if (next_opindex == 0)
2120 operand = &powerpc_operands[*opindex_ptr];
2123 operand = &powerpc_operands[next_opindex];
2128 /* If this is a fake operand, then we do not expect anything
2130 if ((operand->flags & PPC_OPERAND_FAKE) != 0)
2132 insn = (*operand->insert) (insn, 0L, ppc_cpu, &errmsg);
2133 if (errmsg != (const char *) NULL)
2138 /* If this is an optional operand, and we are skipping it, just
2140 if ((operand->flags & PPC_OPERAND_OPTIONAL) != 0
2143 if (operand->insert)
2145 insn = (*operand->insert) (insn, 0L, ppc_cpu, &errmsg);
2146 if (errmsg != (const char *) NULL)
2149 if ((operand->flags & PPC_OPERAND_NEXT) != 0)
2150 next_opindex = *opindex_ptr + 1;
2154 /* Gather the operand. */
2155 hold = input_line_pointer;
2156 input_line_pointer = str;
2159 if (*input_line_pointer == '[')
2161 /* We are expecting something like the second argument here:
2163 * lwz r4,[toc].GS.0.static_int(rtoc)
2164 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^
2165 * The argument following the `]' must be a symbol name, and the
2166 * register must be the toc register: 'rtoc' or '2'
2168 * The effect is to 0 as the displacement field
2169 * in the instruction, and issue an IMAGE_REL_PPC_TOCREL16 (or
2170 * the appropriate variation) reloc against it based on the symbol.
2171 * The linker will build the toc, and insert the resolved toc offset.
2174 * o The size of the toc entry is currently assumed to be
2175 * 32 bits. This should not be assumed to be a hard coded
2177 * o In an effort to cope with a change from 32 to 64 bits,
2178 * there are also toc entries that are specified to be
2179 * either 32 or 64 bits:
2180 * lwz r4,[toc32].GS.0.static_int(rtoc)
2181 * lwz r4,[toc64].GS.0.static_int(rtoc)
2182 * These demand toc entries of the specified size, and the
2183 * instruction probably requires it.
2187 enum toc_size_qualifier toc_kind;
2188 bfd_reloc_code_real_type toc_reloc;
2190 /* Go parse off the [tocXX] part. */
2191 valid_toc = parse_toc_entry (&toc_kind);
2195 /* Note: message has already been issued.
2196 FIXME: what sort of recovery should we do?
2197 demand_rest_of_line (); return; ? */
2200 /* Now get the symbol following the ']'. */
2206 /* In this case, we may not have seen the symbol yet,
2207 since it is allowed to appear on a .extern or .globl
2208 or just be a label in the .data section. */
2209 toc_reloc = BFD_RELOC_PPC_TOC16;
2212 /* 1. The symbol must be defined and either in the toc
2213 section, or a global.
2214 2. The reloc generated must have the TOCDEFN flag set
2215 in upper bit mess of the reloc type.
2216 FIXME: It's a little confusing what the tocv
2217 qualifier can be used for. At the very least, I've
2218 seen three uses, only one of which I'm sure I can
2220 if (ex.X_op == O_symbol)
2222 assert (ex.X_add_symbol != NULL);
2223 if (symbol_get_bfdsym (ex.X_add_symbol)->section
2226 as_bad (_("[tocv] symbol is not a toc symbol"));
2230 toc_reloc = BFD_RELOC_PPC_TOC16;
2233 /* FIXME: these next two specifically specify 32/64 bit
2234 toc entries. We don't support them today. Is this
2235 the right way to say that? */
2236 toc_reloc = BFD_RELOC_UNUSED;
2237 as_bad (_("Unimplemented toc32 expression modifier"));
2240 /* FIXME: see above. */
2241 toc_reloc = BFD_RELOC_UNUSED;
2242 as_bad (_("Unimplemented toc64 expression modifier"));
2246 _("Unexpected return value [%d] from parse_toc_entry!\n"),
2252 /* We need to generate a fixup for this expression. */
2253 if (fc >= MAX_INSN_FIXUPS)
2254 as_fatal (_("too many fixups"));
2256 fixups[fc].reloc = toc_reloc;
2257 fixups[fc].exp = ex;
2258 fixups[fc].opindex = *opindex_ptr;
2261 /* Ok. We've set up the fixup for the instruction. Now make it
2262 look like the constant 0 was found here. */
2264 ex.X_op = O_constant;
2265 ex.X_add_number = 0;
2266 ex.X_add_symbol = NULL;
2267 ex.X_op_symbol = NULL;
2273 if (! register_name (&ex))
2275 if ((operand->flags & PPC_OPERAND_CR) != 0)
2282 str = input_line_pointer;
2283 input_line_pointer = hold;
2285 if (ex.X_op == O_illegal)
2286 as_bad (_("illegal operand"));
2287 else if (ex.X_op == O_absent)
2288 as_bad (_("missing operand"));
2289 else if (ex.X_op == O_register)
2291 insn = ppc_insert_operand (insn, operand, ex.X_add_number,
2294 else if (ex.X_op == O_constant)
2297 /* Allow @HA, @L, @H on constants. */
2298 char *orig_str = str;
2300 if ((reloc = ppc_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED)
2307 case BFD_RELOC_LO16:
2308 /* X_unsigned is the default, so if the user has done
2309 something which cleared it, we always produce a
2311 if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED))
2312 ex.X_add_number &= 0xffff;
2314 ex.X_add_number = SEX16 (ex.X_add_number);
2317 case BFD_RELOC_HI16:
2318 if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED))
2319 ex.X_add_number = PPC_HI (ex.X_add_number);
2321 ex.X_add_number = SEX16 (PPC_HI (ex.X_add_number));
2324 case BFD_RELOC_HI16_S:
2325 if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED))
2326 ex.X_add_number = PPC_HA (ex.X_add_number);
2328 ex.X_add_number = SEX16 (PPC_HA (ex.X_add_number));
2331 case BFD_RELOC_PPC64_HIGHER:
2332 if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED))
2333 ex.X_add_number = PPC_HIGHER (ex.X_add_number);
2335 ex.X_add_number = SEX16 (PPC_HIGHER (ex.X_add_number));
2338 case BFD_RELOC_PPC64_HIGHER_S:
2339 if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED))
2340 ex.X_add_number = PPC_HIGHERA (ex.X_add_number);
2342 ex.X_add_number = SEX16 (PPC_HIGHERA (ex.X_add_number));
2345 case BFD_RELOC_PPC64_HIGHEST:
2346 if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED))
2347 ex.X_add_number = PPC_HIGHEST (ex.X_add_number);
2349 ex.X_add_number = SEX16 (PPC_HIGHEST (ex.X_add_number));
2352 case BFD_RELOC_PPC64_HIGHEST_S:
2353 if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED))
2354 ex.X_add_number = PPC_HIGHESTA (ex.X_add_number);
2356 ex.X_add_number = SEX16 (PPC_HIGHESTA (ex.X_add_number));
2359 #endif /* OBJ_ELF */
2360 insn = ppc_insert_operand (insn, operand, ex.X_add_number,
2364 else if ((reloc = ppc_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED)
2366 /* For the absolute forms of branches, convert the PC
2367 relative form back into the absolute. */
2368 if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0)
2372 case BFD_RELOC_PPC_B26:
2373 reloc = BFD_RELOC_PPC_BA26;
2375 case BFD_RELOC_PPC_B16:
2376 reloc = BFD_RELOC_PPC_BA16;
2378 case BFD_RELOC_PPC_B16_BRTAKEN:
2379 reloc = BFD_RELOC_PPC_BA16_BRTAKEN;
2381 case BFD_RELOC_PPC_B16_BRNTAKEN:
2382 reloc = BFD_RELOC_PPC_BA16_BRNTAKEN;
2390 && (operand->flags & PPC_OPERAND_DS) != 0)
2395 reloc = BFD_RELOC_PPC64_ADDR16_DS;
2397 case BFD_RELOC_LO16:
2398 reloc = BFD_RELOC_PPC64_ADDR16_LO_DS;
2400 case BFD_RELOC_16_GOTOFF:
2401 reloc = BFD_RELOC_PPC64_GOT16_DS;
2403 case BFD_RELOC_LO16_GOTOFF:
2404 reloc = BFD_RELOC_PPC64_GOT16_LO_DS;
2406 case BFD_RELOC_LO16_PLTOFF:
2407 reloc = BFD_RELOC_PPC64_PLT16_LO_DS;
2409 case BFD_RELOC_16_BASEREL:
2410 reloc = BFD_RELOC_PPC64_SECTOFF_DS;
2412 case BFD_RELOC_LO16_BASEREL:
2413 reloc = BFD_RELOC_PPC64_SECTOFF_LO_DS;
2415 case BFD_RELOC_PPC_TOC16:
2416 reloc = BFD_RELOC_PPC64_TOC16_DS;
2418 case BFD_RELOC_PPC64_TOC16_LO:
2419 reloc = BFD_RELOC_PPC64_TOC16_LO_DS;
2421 case BFD_RELOC_PPC64_PLTGOT16:
2422 reloc = BFD_RELOC_PPC64_PLTGOT16_DS;
2424 case BFD_RELOC_PPC64_PLTGOT16_LO:
2425 reloc = BFD_RELOC_PPC64_PLTGOT16_LO_DS;
2428 as_bad (_("unsupported relocation for DS offset field"));
2433 /* We need to generate a fixup for this expression. */
2434 if (fc >= MAX_INSN_FIXUPS)
2435 as_fatal (_("too many fixups"));
2436 fixups[fc].exp = ex;
2437 fixups[fc].opindex = 0;
2438 fixups[fc].reloc = reloc;
2441 #endif /* OBJ_ELF */
2445 /* We need to generate a fixup for this expression. */
2446 if (fc >= MAX_INSN_FIXUPS)
2447 as_fatal (_("too many fixups"));
2448 fixups[fc].exp = ex;
2449 fixups[fc].opindex = *opindex_ptr;
2450 fixups[fc].reloc = BFD_RELOC_UNUSED;
2459 else if ((operand->flags & PPC_OPERAND_PARENS) != 0)
2467 /* The call to expression should have advanced str past any
2470 && (endc != ',' || *str != '\0'))
2472 as_bad (_("syntax error; found `%c' but expected `%c'"), *str, endc);
2480 while (ISSPACE (*str))
2484 as_bad (_("junk at end of line: `%s'"), str);
2487 /* Do we need/want a APUinfo section? */
2488 if (ppc_cpu & (PPC_OPCODE_SPE
2489 | PPC_OPCODE_ISEL | PPC_OPCODE_EFS
2490 | PPC_OPCODE_BRLOCK | PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK
2491 | PPC_OPCODE_RFMCI))
2493 /* These are all version "1". */
2494 if (opcode->flags & PPC_OPCODE_SPE)
2495 ppc_apuinfo_section_add (PPC_APUINFO_SPE, 1);
2496 if (opcode->flags & PPC_OPCODE_ISEL)
2497 ppc_apuinfo_section_add (PPC_APUINFO_ISEL, 1);
2498 if (opcode->flags & PPC_OPCODE_EFS)
2499 ppc_apuinfo_section_add (PPC_APUINFO_EFS, 1);
2500 if (opcode->flags & PPC_OPCODE_BRLOCK)
2501 ppc_apuinfo_section_add (PPC_APUINFO_BRLOCK, 1);
2502 if (opcode->flags & PPC_OPCODE_PMR)
2503 ppc_apuinfo_section_add (PPC_APUINFO_PMR, 1);
2504 if (opcode->flags & PPC_OPCODE_CACHELCK)
2505 ppc_apuinfo_section_add (PPC_APUINFO_CACHELCK, 1);
2506 if (opcode->flags & PPC_OPCODE_RFMCI)
2507 ppc_apuinfo_section_add (PPC_APUINFO_RFMCI, 1);
2511 /* Write out the instruction. */
2513 md_number_to_chars (f, insn, 4);
2516 dwarf2_emit_insn (4);
2519 /* Create any fixups. At this point we do not use a
2520 bfd_reloc_code_real_type, but instead just use the
2521 BFD_RELOC_UNUSED plus the operand index. This lets us easily
2522 handle fixups for any operand type, although that is admittedly
2523 not a very exciting feature. We pick a BFD reloc type in
2525 for (i = 0; i < fc; i++)
2527 const struct powerpc_operand *operand;
2529 operand = &powerpc_operands[fixups[i].opindex];
2530 if (fixups[i].reloc != BFD_RELOC_UNUSED)
2532 reloc_howto_type *reloc_howto;
2537 reloc_howto = bfd_reloc_type_lookup (stdoutput, fixups[i].reloc);
2541 size = bfd_get_reloc_size (reloc_howto);
2542 offset = target_big_endian ? (4 - size) : 0;
2544 if (size < 1 || size > 4)
2547 fixP = fix_new_exp (frag_now,
2548 f - frag_now->fr_literal + offset,
2551 reloc_howto->pc_relative,
2554 /* Turn off complaints that the addend is too large for things like
2556 switch (fixups[i].reloc)
2558 case BFD_RELOC_16_GOTOFF:
2559 case BFD_RELOC_PPC_TOC16:
2560 case BFD_RELOC_LO16:
2561 case BFD_RELOC_HI16:
2562 case BFD_RELOC_HI16_S:
2564 case BFD_RELOC_PPC64_HIGHER:
2565 case BFD_RELOC_PPC64_HIGHER_S:
2566 case BFD_RELOC_PPC64_HIGHEST:
2567 case BFD_RELOC_PPC64_HIGHEST_S:
2569 fixP->fx_no_overflow = 1;
2576 fix_new_exp (frag_now,
2577 f - frag_now->fr_literal,
2580 (operand->flags & PPC_OPERAND_RELATIVE) != 0,
2581 ((bfd_reloc_code_real_type)
2582 (fixups[i].opindex + (int) BFD_RELOC_UNUSED)));
2586 /* Handle a macro. Gather all the operands, transform them as
2587 described by the macro, and call md_assemble recursively. All the
2588 operands are separated by commas; we don't accept parentheses
2589 around operands here. */
2592 ppc_macro (str, macro)
2594 const struct powerpc_macro *macro;
2605 /* Gather the users operands into the operands array. */
2610 if (count >= sizeof operands / sizeof operands[0])
2612 operands[count++] = s;
2613 s = strchr (s, ',');
2614 if (s == (char *) NULL)
2619 if (count != macro->operands)
2621 as_bad (_("wrong number of operands"));
2625 /* Work out how large the string must be (the size is unbounded
2626 because it includes user input). */
2628 format = macro->format;
2629 while (*format != '\0')
2638 arg = strtol (format + 1, &send, 10);
2639 know (send != format && arg >= 0 && arg < count);
2640 len += strlen (operands[arg]);
2645 /* Put the string together. */
2646 complete = s = (char *) alloca (len + 1);
2647 format = macro->format;
2648 while (*format != '\0')
2654 arg = strtol (format + 1, &send, 10);
2655 strcpy (s, operands[arg]);
2662 /* Assemble the constructed instruction. */
2663 md_assemble (complete);
2667 /* For ELF, add support for SHF_EXCLUDE and SHT_ORDERED. */
2670 ppc_section_letter (letter, ptr_msg)
2677 *ptr_msg = _("Bad .section directive: want a,e,w,x,M,S,G,T in string");
2682 ppc_section_word (str, len)
2686 if (len == 7 && strncmp (str, "exclude", 7) == 0)
2693 ppc_section_type (str, len)
2697 if (len == 7 && strncmp (str, "ordered", 7) == 0)
2704 ppc_section_flags (flags, attr, type)
2709 if (type == SHT_ORDERED)
2710 flags |= SEC_ALLOC | SEC_LOAD | SEC_SORT_ENTRIES;
2712 if (attr & SHF_EXCLUDE)
2713 flags |= SEC_EXCLUDE;
2717 #endif /* OBJ_ELF */
2720 /* Pseudo-op handling. */
2722 /* The .byte pseudo-op. This is similar to the normal .byte
2723 pseudo-op, but it can also take a single ASCII string. */
2727 int ignore ATTRIBUTE_UNUSED;
2729 if (*input_line_pointer != '\"')
2735 /* Gather characters. A real double quote is doubled. Unusual
2736 characters are not permitted. */
2737 ++input_line_pointer;
2742 c = *input_line_pointer++;
2746 if (*input_line_pointer != '\"')
2748 ++input_line_pointer;
2751 FRAG_APPEND_1_CHAR (c);
2754 demand_empty_rest_of_line ();
2759 /* XCOFF specific pseudo-op handling. */
2761 /* This is set if we are creating a .stabx symbol, since we don't want
2762 to handle symbol suffixes for such symbols. */
2763 static bfd_boolean ppc_stab_symbol;
2765 /* The .comm and .lcomm pseudo-ops for XCOFF. XCOFF puts common
2766 symbols in the .bss segment as though they were local common
2767 symbols, and uses a different smclas. The native Aix 4.3.3 assember
2768 aligns .comm and .lcomm to 4 bytes. */
2774 asection *current_seg = now_seg;
2775 subsegT current_subseg = now_subseg;
2781 symbolS *lcomm_sym = NULL;
2785 name = input_line_pointer;
2786 endc = get_symbol_end ();
2787 end_name = input_line_pointer;
2790 if (*input_line_pointer != ',')
2792 as_bad (_("missing size"));
2793 ignore_rest_of_line ();
2796 ++input_line_pointer;
2798 size = get_absolute_expression ();
2801 as_bad (_("negative size"));
2802 ignore_rest_of_line ();
2808 /* The third argument to .comm is the alignment. */
2809 if (*input_line_pointer != ',')
2813 ++input_line_pointer;
2814 align = get_absolute_expression ();
2817 as_warn (_("ignoring bad alignment"));
2832 /* The third argument to .lcomm appears to be the real local
2833 common symbol to create. References to the symbol named in
2834 the first argument are turned into references to the third
2836 if (*input_line_pointer != ',')
2838 as_bad (_("missing real symbol name"));
2839 ignore_rest_of_line ();
2842 ++input_line_pointer;
2844 lcomm_name = input_line_pointer;
2845 lcomm_endc = get_symbol_end ();
2847 lcomm_sym = symbol_find_or_make (lcomm_name);
2849 *input_line_pointer = lcomm_endc;
2853 sym = symbol_find_or_make (name);
2856 if (S_IS_DEFINED (sym)
2857 || S_GET_VALUE (sym) != 0)
2859 as_bad (_("attempt to redefine symbol"));
2860 ignore_rest_of_line ();
2864 record_alignment (bss_section, align);
2867 || ! S_IS_DEFINED (lcomm_sym))
2876 S_SET_EXTERNAL (sym);
2880 symbol_get_tc (lcomm_sym)->output = 1;
2881 def_sym = lcomm_sym;
2885 subseg_set (bss_section, 1);
2886 frag_align (align, 0, 0);
2888 symbol_set_frag (def_sym, frag_now);
2889 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, def_sym,
2890 def_size, (char *) NULL);
2892 S_SET_SEGMENT (def_sym, bss_section);
2893 symbol_get_tc (def_sym)->align = align;
2897 /* Align the size of lcomm_sym. */
2898 symbol_get_frag (lcomm_sym)->fr_offset =
2899 ((symbol_get_frag (lcomm_sym)->fr_offset + (1 << align) - 1)
2900 &~ ((1 << align) - 1));
2901 if (align > symbol_get_tc (lcomm_sym)->align)
2902 symbol_get_tc (lcomm_sym)->align = align;
2907 /* Make sym an offset from lcomm_sym. */
2908 S_SET_SEGMENT (sym, bss_section);
2909 symbol_set_frag (sym, symbol_get_frag (lcomm_sym));
2910 S_SET_VALUE (sym, symbol_get_frag (lcomm_sym)->fr_offset);
2911 symbol_get_frag (lcomm_sym)->fr_offset += size;
2914 subseg_set (current_seg, current_subseg);
2916 demand_empty_rest_of_line ();
2919 /* The .csect pseudo-op. This switches us into a different
2920 subsegment. The first argument is a symbol whose value is the
2921 start of the .csect. In COFF, csect symbols get special aux
2922 entries defined by the x_csect field of union internal_auxent. The
2923 optional second argument is the alignment (the default is 2). */
2927 int ignore ATTRIBUTE_UNUSED;
2933 name = input_line_pointer;
2934 endc = get_symbol_end ();
2936 sym = symbol_find_or_make (name);
2938 *input_line_pointer = endc;
2940 if (S_GET_NAME (sym)[0] == '\0')
2942 /* An unnamed csect is assumed to be [PR]. */
2943 symbol_get_tc (sym)->class = XMC_PR;
2946 ppc_change_csect (sym);
2948 if (*input_line_pointer == ',')
2950 ++input_line_pointer;
2951 symbol_get_tc (sym)->align = get_absolute_expression ();
2954 demand_empty_rest_of_line ();
2957 /* Change to a different csect. */
2960 ppc_change_csect (sym)
2963 if (S_IS_DEFINED (sym))
2964 subseg_set (S_GET_SEGMENT (sym), symbol_get_tc (sym)->subseg);
2972 /* This is a new csect. We need to look at the symbol class to
2973 figure out whether it should go in the text section or the
2976 switch (symbol_get_tc (sym)->class)
2986 S_SET_SEGMENT (sym, text_section);
2987 symbol_get_tc (sym)->subseg = ppc_text_subsegment;
2988 ++ppc_text_subsegment;
2989 list_ptr = &ppc_text_csects;
2998 if (ppc_toc_csect != NULL
2999 && (symbol_get_tc (ppc_toc_csect)->subseg + 1
3000 == ppc_data_subsegment))
3002 S_SET_SEGMENT (sym, data_section);
3003 symbol_get_tc (sym)->subseg = ppc_data_subsegment;
3004 ++ppc_data_subsegment;
3005 list_ptr = &ppc_data_csects;
3011 /* We set the obstack chunk size to a small value before
3012 changing subsegments, so that we don't use a lot of memory
3013 space for what may be a small section. */
3014 hold_chunksize = chunksize;
3017 subseg_new (segment_name (S_GET_SEGMENT (sym)),
3018 symbol_get_tc (sym)->subseg);
3020 chunksize = hold_chunksize;
3023 ppc_after_toc_frag = frag_now;
3025 symbol_set_frag (sym, frag_now);
3026 S_SET_VALUE (sym, (valueT) frag_now_fix ());
3028 symbol_get_tc (sym)->align = 2;
3029 symbol_get_tc (sym)->output = 1;
3030 symbol_get_tc (sym)->within = sym;
3032 for (list = *list_ptr;
3033 symbol_get_tc (list)->next != (symbolS *) NULL;
3034 list = symbol_get_tc (list)->next)
3036 symbol_get_tc (list)->next = sym;
3038 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
3039 symbol_append (sym, symbol_get_tc (list)->within, &symbol_rootP,
3043 ppc_current_csect = sym;
3046 /* This function handles the .text and .data pseudo-ops. These
3047 pseudo-ops aren't really used by XCOFF; we implement them for the
3048 convenience of people who aren't used to XCOFF. */
3059 else if (type == 'd')
3064 sym = symbol_find_or_make (name);
3066 ppc_change_csect (sym);
3068 demand_empty_rest_of_line ();
3071 /* This function handles the .section pseudo-op. This is mostly to
3072 give an error, since XCOFF only supports .text, .data and .bss, but
3073 we do permit the user to name the text or data section. */
3076 ppc_named_section (ignore)
3077 int ignore ATTRIBUTE_UNUSED;
3080 const char *real_name;
3084 user_name = input_line_pointer;
3085 c = get_symbol_end ();
3087 if (strcmp (user_name, ".text") == 0)
3088 real_name = ".text[PR]";
3089 else if (strcmp (user_name, ".data") == 0)
3090 real_name = ".data[RW]";
3093 as_bad (_("The XCOFF file format does not support arbitrary sections"));
3094 *input_line_pointer = c;
3095 ignore_rest_of_line ();
3099 *input_line_pointer = c;
3101 sym = symbol_find_or_make (real_name);
3103 ppc_change_csect (sym);
3105 demand_empty_rest_of_line ();
3108 /* The .extern pseudo-op. We create an undefined symbol. */
3112 int ignore ATTRIBUTE_UNUSED;
3117 name = input_line_pointer;
3118 endc = get_symbol_end ();
3120 (void) symbol_find_or_make (name);
3122 *input_line_pointer = endc;
3124 demand_empty_rest_of_line ();
3127 /* The .lglobl pseudo-op. Keep the symbol in the symbol table. */
3131 int ignore ATTRIBUTE_UNUSED;
3137 name = input_line_pointer;
3138 endc = get_symbol_end ();
3140 sym = symbol_find_or_make (name);
3142 *input_line_pointer = endc;
3144 symbol_get_tc (sym)->output = 1;
3146 demand_empty_rest_of_line ();
3149 /* The .rename pseudo-op. The RS/6000 assembler can rename symbols,
3150 although I don't know why it bothers. */
3154 int ignore ATTRIBUTE_UNUSED;
3161 name = input_line_pointer;
3162 endc = get_symbol_end ();
3164 sym = symbol_find_or_make (name);
3166 *input_line_pointer = endc;
3168 if (*input_line_pointer != ',')
3170 as_bad (_("missing rename string"));
3171 ignore_rest_of_line ();
3174 ++input_line_pointer;
3176 symbol_get_tc (sym)->real_name = demand_copy_C_string (&len);
3178 demand_empty_rest_of_line ();
3181 /* The .stabx pseudo-op. This is similar to a normal .stabs
3182 pseudo-op, but slightly different. A sample is
3183 .stabx "main:F-1",.main,142,0
3184 The first argument is the symbol name to create. The second is the
3185 value, and the third is the storage class. The fourth seems to be
3186 always zero, and I am assuming it is the type. */
3190 int ignore ATTRIBUTE_UNUSED;
3197 name = demand_copy_C_string (&len);
3199 if (*input_line_pointer != ',')
3201 as_bad (_("missing value"));
3204 ++input_line_pointer;
3206 ppc_stab_symbol = TRUE;
3207 sym = symbol_make (name);
3208 ppc_stab_symbol = FALSE;
3210 symbol_get_tc (sym)->real_name = name;
3212 (void) expression (&exp);
3219 as_bad (_("illegal .stabx expression; zero assumed"));
3220 exp.X_add_number = 0;
3223 S_SET_VALUE (sym, (valueT) exp.X_add_number);
3224 symbol_set_frag (sym, &zero_address_frag);
3228 if (S_GET_SEGMENT (exp.X_add_symbol) == undefined_section)
3229 symbol_set_value_expression (sym, &exp);
3233 exp.X_add_number + S_GET_VALUE (exp.X_add_symbol));
3234 symbol_set_frag (sym, symbol_get_frag (exp.X_add_symbol));
3239 /* The value is some complex expression. This will probably
3240 fail at some later point, but this is probably the right
3241 thing to do here. */
3242 symbol_set_value_expression (sym, &exp);
3246 S_SET_SEGMENT (sym, ppc_coff_debug_section);
3247 symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
3249 if (*input_line_pointer != ',')
3251 as_bad (_("missing class"));
3254 ++input_line_pointer;
3256 S_SET_STORAGE_CLASS (sym, get_absolute_expression ());
3258 if (*input_line_pointer != ',')
3260 as_bad (_("missing type"));
3263 ++input_line_pointer;
3265 S_SET_DATA_TYPE (sym, get_absolute_expression ());
3267 symbol_get_tc (sym)->output = 1;
3269 if (S_GET_STORAGE_CLASS (sym) == C_STSYM) {
3271 symbol_get_tc (sym)->within = ppc_current_block;
3276 .stabx "z",arrays_,133,0
3279 .comm arrays_,13768,3
3281 resolve_symbol_value will copy the exp's "within" into sym's when the
3282 offset is 0. Since this seems to be corner case problem,
3283 only do the correction for storage class C_STSYM. A better solution
3284 would be to have the tc field updated in ppc_symbol_new_hook. */
3286 if (exp.X_op == O_symbol)
3288 symbol_get_tc (exp.X_add_symbol)->within = ppc_current_block;
3292 if (exp.X_op != O_symbol
3293 || ! S_IS_EXTERNAL (exp.X_add_symbol)
3294 || S_GET_SEGMENT (exp.X_add_symbol) != bss_section)
3295 ppc_frob_label (sym);
3298 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
3299 symbol_append (sym, exp.X_add_symbol, &symbol_rootP, &symbol_lastP);
3300 if (symbol_get_tc (ppc_current_csect)->within == exp.X_add_symbol)
3301 symbol_get_tc (ppc_current_csect)->within = sym;
3304 demand_empty_rest_of_line ();
3307 /* The .function pseudo-op. This takes several arguments. The first
3308 argument seems to be the external name of the symbol. The second
3309 argment seems to be the label for the start of the function. gcc
3310 uses the same name for both. I have no idea what the third and
3311 fourth arguments are meant to be. The optional fifth argument is
3312 an expression for the size of the function. In COFF this symbol
3313 gets an aux entry like that used for a csect. */
3316 ppc_function (ignore)
3317 int ignore ATTRIBUTE_UNUSED;
3325 name = input_line_pointer;
3326 endc = get_symbol_end ();
3328 /* Ignore any [PR] suffix. */
3329 name = ppc_canonicalize_symbol_name (name);
3330 s = strchr (name, '[');
3331 if (s != (char *) NULL
3332 && strcmp (s + 1, "PR]") == 0)
3335 ext_sym = symbol_find_or_make (name);
3337 *input_line_pointer = endc;
3339 if (*input_line_pointer != ',')
3341 as_bad (_("missing symbol name"));
3342 ignore_rest_of_line ();
3345 ++input_line_pointer;
3347 name = input_line_pointer;
3348 endc = get_symbol_end ();
3350 lab_sym = symbol_find_or_make (name);
3352 *input_line_pointer = endc;
3354 if (ext_sym != lab_sym)
3358 exp.X_op = O_symbol;
3359 exp.X_add_symbol = lab_sym;
3360 exp.X_op_symbol = NULL;
3361 exp.X_add_number = 0;
3363 symbol_set_value_expression (ext_sym, &exp);
3366 if (symbol_get_tc (ext_sym)->class == -1)
3367 symbol_get_tc (ext_sym)->class = XMC_PR;
3368 symbol_get_tc (ext_sym)->output = 1;
3370 if (*input_line_pointer == ',')
3374 /* Ignore the third argument. */
3375 ++input_line_pointer;
3376 expression (&ignore);
3377 if (*input_line_pointer == ',')
3379 /* Ignore the fourth argument. */
3380 ++input_line_pointer;
3381 expression (&ignore);
3382 if (*input_line_pointer == ',')
3384 /* The fifth argument is the function size. */
3385 ++input_line_pointer;
3386 symbol_get_tc (ext_sym)->size = symbol_new ("L0\001",
3389 &zero_address_frag);
3390 pseudo_set (symbol_get_tc (ext_sym)->size);
3395 S_SET_DATA_TYPE (ext_sym, DT_FCN << N_BTSHFT);
3396 SF_SET_FUNCTION (ext_sym);
3397 SF_SET_PROCESS (ext_sym);
3398 coff_add_linesym (ext_sym);
3400 demand_empty_rest_of_line ();
3403 /* The .bf pseudo-op. This is just like a COFF C_FCN symbol named
3404 ".bf". If the pseudo op .bi was seen before .bf, patch the .bi sym
3405 with the correct line number */
3407 static symbolS *saved_bi_sym = 0;
3411 int ignore ATTRIBUTE_UNUSED;
3415 sym = symbol_make (".bf");
3416 S_SET_SEGMENT (sym, text_section);
3417 symbol_set_frag (sym, frag_now);
3418 S_SET_VALUE (sym, frag_now_fix ());
3419 S_SET_STORAGE_CLASS (sym, C_FCN);
3421 coff_line_base = get_absolute_expression ();
3423 S_SET_NUMBER_AUXILIARY (sym, 1);
3424 SA_SET_SYM_LNNO (sym, coff_line_base);
3426 /* Line number for bi. */
3429 S_SET_VALUE (saved_bi_sym, coff_n_line_nos);
3434 symbol_get_tc (sym)->output = 1;
3436 ppc_frob_label (sym);
3438 demand_empty_rest_of_line ();
3441 /* The .ef pseudo-op. This is just like a COFF C_FCN symbol named
3442 ".ef", except that the line number is absolute, not relative to the
3443 most recent ".bf" symbol. */
3447 int ignore ATTRIBUTE_UNUSED;
3451 sym = symbol_make (".ef");
3452 S_SET_SEGMENT (sym, text_section);
3453 symbol_set_frag (sym, frag_now);
3454 S_SET_VALUE (sym, frag_now_fix ());
3455 S_SET_STORAGE_CLASS (sym, C_FCN);
3456 S_SET_NUMBER_AUXILIARY (sym, 1);
3457 SA_SET_SYM_LNNO (sym, get_absolute_expression ());
3458 symbol_get_tc (sym)->output = 1;
3460 ppc_frob_label (sym);
3462 demand_empty_rest_of_line ();
3465 /* The .bi and .ei pseudo-ops. These take a string argument and
3466 generates a C_BINCL or C_EINCL symbol, which goes at the start of
3467 the symbol list. The value of .bi will be know when the next .bf
3474 static symbolS *last_biei;
3481 name = demand_copy_C_string (&len);
3483 /* The value of these symbols is actually file offset. Here we set
3484 the value to the index into the line number entries. In
3485 ppc_frob_symbols we set the fix_line field, which will cause BFD
3486 to do the right thing. */
3488 sym = symbol_make (name);
3489 /* obj-coff.c currently only handles line numbers correctly in the
3491 S_SET_SEGMENT (sym, text_section);
3492 S_SET_VALUE (sym, coff_n_line_nos);
3493 symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
3495 S_SET_STORAGE_CLASS (sym, ei ? C_EINCL : C_BINCL);
3496 symbol_get_tc (sym)->output = 1;
3504 for (look = last_biei ? last_biei : symbol_rootP;
3505 (look != (symbolS *) NULL
3506 && (S_GET_STORAGE_CLASS (look) == C_FILE
3507 || S_GET_STORAGE_CLASS (look) == C_BINCL
3508 || S_GET_STORAGE_CLASS (look) == C_EINCL));
3509 look = symbol_next (look))
3511 if (look != (symbolS *) NULL)
3513 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
3514 symbol_insert (sym, look, &symbol_rootP, &symbol_lastP);
3518 demand_empty_rest_of_line ();
3521 /* The .bs pseudo-op. This generates a C_BSTAT symbol named ".bs".
3522 There is one argument, which is a csect symbol. The value of the
3523 .bs symbol is the index of this csect symbol. */
3527 int ignore ATTRIBUTE_UNUSED;
3534 if (ppc_current_block != NULL)
3535 as_bad (_("nested .bs blocks"));
3537 name = input_line_pointer;
3538 endc = get_symbol_end ();
3540 csect = symbol_find_or_make (name);
3542 *input_line_pointer = endc;
3544 sym = symbol_make (".bs");
3545 S_SET_SEGMENT (sym, now_seg);
3546 S_SET_STORAGE_CLASS (sym, C_BSTAT);
3547 symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
3548 symbol_get_tc (sym)->output = 1;
3550 symbol_get_tc (sym)->within = csect;
3552 ppc_frob_label (sym);
3554 ppc_current_block = sym;
3556 demand_empty_rest_of_line ();
3559 /* The .es pseudo-op. Generate a C_ESTART symbol named .es. */
3563 int ignore ATTRIBUTE_UNUSED;
3567 if (ppc_current_block == NULL)
3568 as_bad (_(".es without preceding .bs"));
3570 sym = symbol_make (".es");
3571 S_SET_SEGMENT (sym, now_seg);
3572 S_SET_STORAGE_CLASS (sym, C_ESTAT);
3573 symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
3574 symbol_get_tc (sym)->output = 1;
3576 ppc_frob_label (sym);
3578 ppc_current_block = NULL;
3580 demand_empty_rest_of_line ();
3583 /* The .bb pseudo-op. Generate a C_BLOCK symbol named .bb, with a
3588 int ignore ATTRIBUTE_UNUSED;
3592 sym = symbol_make (".bb");
3593 S_SET_SEGMENT (sym, text_section);
3594 symbol_set_frag (sym, frag_now);
3595 S_SET_VALUE (sym, frag_now_fix ());
3596 S_SET_STORAGE_CLASS (sym, C_BLOCK);
3598 S_SET_NUMBER_AUXILIARY (sym, 1);
3599 SA_SET_SYM_LNNO (sym, get_absolute_expression ());
3601 symbol_get_tc (sym)->output = 1;
3603 SF_SET_PROCESS (sym);
3605 ppc_frob_label (sym);
3607 demand_empty_rest_of_line ();
3610 /* The .eb pseudo-op. Generate a C_BLOCK symbol named .eb, with a
3615 int ignore ATTRIBUTE_UNUSED;
3619 sym = symbol_make (".eb");
3620 S_SET_SEGMENT (sym, text_section);
3621 symbol_set_frag (sym, frag_now);
3622 S_SET_VALUE (sym, frag_now_fix ());
3623 S_SET_STORAGE_CLASS (sym, C_BLOCK);
3624 S_SET_NUMBER_AUXILIARY (sym, 1);
3625 SA_SET_SYM_LNNO (sym, get_absolute_expression ());
3626 symbol_get_tc (sym)->output = 1;
3628 SF_SET_PROCESS (sym);
3630 ppc_frob_label (sym);
3632 demand_empty_rest_of_line ();
3635 /* The .bc pseudo-op. This just creates a C_BCOMM symbol with a
3640 int ignore ATTRIBUTE_UNUSED;
3646 name = demand_copy_C_string (&len);
3647 sym = symbol_make (name);
3648 S_SET_SEGMENT (sym, ppc_coff_debug_section);
3649 symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
3650 S_SET_STORAGE_CLASS (sym, C_BCOMM);
3651 S_SET_VALUE (sym, 0);
3652 symbol_get_tc (sym)->output = 1;
3654 ppc_frob_label (sym);
3656 demand_empty_rest_of_line ();
3659 /* The .ec pseudo-op. This just creates a C_ECOMM symbol. */
3663 int ignore ATTRIBUTE_UNUSED;
3667 sym = symbol_make (".ec");
3668 S_SET_SEGMENT (sym, ppc_coff_debug_section);
3669 symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
3670 S_SET_STORAGE_CLASS (sym, C_ECOMM);
3671 S_SET_VALUE (sym, 0);
3672 symbol_get_tc (sym)->output = 1;
3674 ppc_frob_label (sym);
3676 demand_empty_rest_of_line ();
3679 /* The .toc pseudo-op. Switch to the .toc subsegment. */
3683 int ignore ATTRIBUTE_UNUSED;
3685 if (ppc_toc_csect != (symbolS *) NULL)
3686 subseg_set (data_section, symbol_get_tc (ppc_toc_csect)->subseg);
3693 subseg = ppc_data_subsegment;
3694 ++ppc_data_subsegment;
3696 subseg_new (segment_name (data_section), subseg);
3697 ppc_toc_frag = frag_now;
3699 sym = symbol_find_or_make ("TOC[TC0]");
3700 symbol_set_frag (sym, frag_now);
3701 S_SET_SEGMENT (sym, data_section);
3702 S_SET_VALUE (sym, (valueT) frag_now_fix ());
3703 symbol_get_tc (sym)->subseg = subseg;
3704 symbol_get_tc (sym)->output = 1;
3705 symbol_get_tc (sym)->within = sym;
3707 ppc_toc_csect = sym;
3709 for (list = ppc_data_csects;
3710 symbol_get_tc (list)->next != (symbolS *) NULL;
3711 list = symbol_get_tc (list)->next)
3713 symbol_get_tc (list)->next = sym;
3715 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
3716 symbol_append (sym, symbol_get_tc (list)->within, &symbol_rootP,
3720 ppc_current_csect = ppc_toc_csect;
3722 demand_empty_rest_of_line ();
3725 /* The AIX assembler automatically aligns the operands of a .long or
3726 .short pseudo-op, and we want to be compatible. */
3729 ppc_xcoff_cons (log_size)
3732 frag_align (log_size, 0, 0);
3733 record_alignment (now_seg, log_size);
3734 cons (1 << log_size);
3739 int dummy ATTRIBUTE_UNUSED;
3744 (void) expression (&exp);
3746 if (exp.X_op != O_constant)
3748 as_bad (_("non-constant byte count"));
3752 byte_count = exp.X_add_number;
3754 if (*input_line_pointer != ',')
3756 as_bad (_("missing value"));
3760 ++input_line_pointer;
3764 #endif /* OBJ_XCOFF */
3765 #if defined (OBJ_XCOFF) || defined (OBJ_ELF)
3767 /* The .tc pseudo-op. This is used when generating either XCOFF or
3768 ELF. This takes two or more arguments.
3770 When generating XCOFF output, the first argument is the name to
3771 give to this location in the toc; this will be a symbol with class
3772 TC. The rest of the arguments are N-byte values to actually put at
3773 this location in the TOC; often there is just one more argument, a
3774 relocateable symbol reference. The size of the value to store
3775 depends on target word size. A 32-bit target uses 4-byte values, a
3776 64-bit target uses 8-byte values.
3778 When not generating XCOFF output, the arguments are the same, but
3779 the first argument is simply ignored. */
3783 int ignore ATTRIBUTE_UNUSED;
3787 /* Define the TOC symbol name. */
3793 if (ppc_toc_csect == (symbolS *) NULL
3794 || ppc_toc_csect != ppc_current_csect)
3796 as_bad (_(".tc not in .toc section"));
3797 ignore_rest_of_line ();
3801 name = input_line_pointer;
3802 endc = get_symbol_end ();
3804 sym = symbol_find_or_make (name);
3806 *input_line_pointer = endc;
3808 if (S_IS_DEFINED (sym))
3812 label = symbol_get_tc (ppc_current_csect)->within;
3813 if (symbol_get_tc (label)->class != XMC_TC0)
3815 as_bad (_(".tc with no label"));
3816 ignore_rest_of_line ();
3820 S_SET_SEGMENT (label, S_GET_SEGMENT (sym));
3821 symbol_set_frag (label, symbol_get_frag (sym));
3822 S_SET_VALUE (label, S_GET_VALUE (sym));
3824 while (! is_end_of_line[(unsigned char) *input_line_pointer])
3825 ++input_line_pointer;
3830 S_SET_SEGMENT (sym, now_seg);
3831 symbol_set_frag (sym, frag_now);
3832 S_SET_VALUE (sym, (valueT) frag_now_fix ());
3833 symbol_get_tc (sym)->class = XMC_TC;
3834 symbol_get_tc (sym)->output = 1;
3836 ppc_frob_label (sym);
3839 #endif /* OBJ_XCOFF */
3843 /* Skip the TOC symbol name. */
3844 while (is_part_of_name (*input_line_pointer)
3845 || *input_line_pointer == '['
3846 || *input_line_pointer == ']'
3847 || *input_line_pointer == '{'
3848 || *input_line_pointer == '}')
3849 ++input_line_pointer;
3851 /* Align to a four/eight byte boundary. */
3852 align = ppc_obj64 ? 3 : 2;
3853 frag_align (align, 0, 0);
3854 record_alignment (now_seg, align);
3855 #endif /* OBJ_ELF */
3857 if (*input_line_pointer != ',')
3858 demand_empty_rest_of_line ();
3861 ++input_line_pointer;
3862 cons (ppc_obj64 ? 8 : 4);
3866 /* Pseudo-op .machine. */
3867 /* FIXME: `.machine' is a nop for the moment. It would be nice to
3868 accept this directive on the first line of input and set ppc_obj64
3869 and the target format accordingly. Unfortunately, the target
3870 format is selected in output-file.c:output_file_create before we
3871 even get to md_begin, so it's not possible without changing
3875 ppc_machine (ignore)
3876 int ignore ATTRIBUTE_UNUSED;
3878 discard_rest_of_line ();
3881 /* See whether a symbol is in the TOC section. */
3884 ppc_is_toc_sym (sym)
3888 return symbol_get_tc (sym)->class == XMC_TC;
3891 const char *sname = segment_name (S_GET_SEGMENT (sym));
3893 return strcmp (sname, ".toc") == 0;
3895 return strcmp (sname, ".got") == 0;
3898 #endif /* defined (OBJ_XCOFF) || defined (OBJ_ELF) */
3902 /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format. */
3904 /* Set the current section. */
3906 ppc_set_current_section (new)
3909 ppc_previous_section = ppc_current_section;
3910 ppc_current_section = new;
3913 /* pseudo-op: .previous
3914 behaviour: toggles the current section with the previous section.
3916 warnings: "No previous section" */
3919 ppc_previous (ignore)
3920 int ignore ATTRIBUTE_UNUSED;
3924 if (ppc_previous_section == NULL)
3926 as_warn (_("No previous section to return to. Directive ignored."));
3930 subseg_set (ppc_previous_section, 0);
3932 ppc_set_current_section (ppc_previous_section);
3935 /* pseudo-op: .pdata
3936 behaviour: predefined read only data section
3940 initial: .section .pdata "adr3"
3941 a - don't know -- maybe a misprint
3942 d - initialized data
3944 3 - double word aligned (that would be 4 byte boundary)
3947 Tag index tables (also known as the function table) for exception
3948 handling, debugging, etc. */
3952 int ignore ATTRIBUTE_UNUSED;
3954 if (pdata_section == 0)
3956 pdata_section = subseg_new (".pdata", 0);
3958 bfd_set_section_flags (stdoutput, pdata_section,
3959 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
3960 | SEC_READONLY | SEC_DATA ));
3962 bfd_set_section_alignment (stdoutput, pdata_section, 2);
3966 pdata_section = subseg_new (".pdata", 0);
3968 ppc_set_current_section (pdata_section);
3971 /* pseudo-op: .ydata
3972 behaviour: predefined read only data section
3976 initial: .section .ydata "drw3"
3977 a - don't know -- maybe a misprint
3978 d - initialized data
3980 3 - double word aligned (that would be 4 byte boundary)
3982 Tag tables (also known as the scope table) for exception handling,
3987 int ignore ATTRIBUTE_UNUSED;
3989 if (ydata_section == 0)
3991 ydata_section = subseg_new (".ydata", 0);
3992 bfd_set_section_flags (stdoutput, ydata_section,
3993 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
3994 | SEC_READONLY | SEC_DATA ));
3996 bfd_set_section_alignment (stdoutput, ydata_section, 3);
4000 ydata_section = subseg_new (".ydata", 0);
4002 ppc_set_current_section (ydata_section);
4005 /* pseudo-op: .reldata
4006 behaviour: predefined read write data section
4007 double word aligned (4-byte)
4008 FIXME: relocation is applied to it
4009 FIXME: what's the difference between this and .data?
4012 initial: .section .reldata "drw3"
4013 d - initialized data
4016 3 - double word aligned (that would be 8 byte boundary)
4019 Like .data, but intended to hold data subject to relocation, such as
4020 function descriptors, etc. */
4023 ppc_reldata (ignore)
4024 int ignore ATTRIBUTE_UNUSED;
4026 if (reldata_section == 0)
4028 reldata_section = subseg_new (".reldata", 0);
4030 bfd_set_section_flags (stdoutput, reldata_section,
4031 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
4034 bfd_set_section_alignment (stdoutput, reldata_section, 2);
4038 reldata_section = subseg_new (".reldata", 0);
4040 ppc_set_current_section (reldata_section);
4043 /* pseudo-op: .rdata
4044 behaviour: predefined read only data section
4048 initial: .section .rdata "dr3"
4049 d - initialized data
4051 3 - double word aligned (that would be 4 byte boundary) */
4055 int ignore ATTRIBUTE_UNUSED;
4057 if (rdata_section == 0)
4059 rdata_section = subseg_new (".rdata", 0);
4060 bfd_set_section_flags (stdoutput, rdata_section,
4061 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
4062 | SEC_READONLY | SEC_DATA ));
4064 bfd_set_section_alignment (stdoutput, rdata_section, 2);
4068 rdata_section = subseg_new (".rdata", 0);
4070 ppc_set_current_section (rdata_section);
4073 /* pseudo-op: .ualong
4074 behaviour: much like .int, with the exception that no alignment is
4076 FIXME: test the alignment statement
4082 int ignore ATTRIBUTE_UNUSED;
4088 /* pseudo-op: .znop <symbol name>
4089 behaviour: Issue a nop instruction
4090 Issue a IMAGE_REL_PPC_IFGLUE relocation against it, using
4091 the supplied symbol name.
4093 warnings: Missing symbol name */
4097 int ignore ATTRIBUTE_UNUSED;
4100 const struct powerpc_opcode *opcode;
4111 /* Strip out the symbol name. */
4112 symbol_name = input_line_pointer;
4113 c = get_symbol_end ();
4115 name = xmalloc (input_line_pointer - symbol_name + 1);
4116 strcpy (name, symbol_name);
4118 sym = symbol_find_or_make (name);
4120 *input_line_pointer = c;
4124 /* Look up the opcode in the hash table. */
4125 opcode = (const struct powerpc_opcode *) hash_find (ppc_hash, "nop");
4127 /* Stick in the nop. */
4128 insn = opcode->opcode;
4130 /* Write out the instruction. */
4132 md_number_to_chars (f, insn, 4);
4134 f - frag_now->fr_literal,
4139 BFD_RELOC_16_GOT_PCREL);
4152 register char *name;
4156 register symbolS *symbolP;
4159 name = input_line_pointer;
4160 c = get_symbol_end ();
4162 /* just after name is now '\0'. */
4163 p = input_line_pointer;
4166 if (*input_line_pointer != ',')
4168 as_bad (_("Expected comma after symbol-name: rest of line ignored."));
4169 ignore_rest_of_line ();
4173 input_line_pointer++; /* skip ',' */
4174 if ((temp = get_absolute_expression ()) < 0)
4176 as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) temp);
4177 ignore_rest_of_line ();
4183 /* The third argument to .comm is the alignment. */
4184 if (*input_line_pointer != ',')
4188 ++input_line_pointer;
4189 align = get_absolute_expression ();
4192 as_warn (_("ignoring bad alignment"));
4199 symbolP = symbol_find_or_make (name);
4202 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
4204 as_bad (_("Ignoring attempt to re-define symbol `%s'."),
4205 S_GET_NAME (symbolP));
4206 ignore_rest_of_line ();
4210 if (S_GET_VALUE (symbolP))
4212 if (S_GET_VALUE (symbolP) != (valueT) temp)
4213 as_bad (_("Length of .comm \"%s\" is already %ld. Not changed to %ld."),
4214 S_GET_NAME (symbolP),
4215 (long) S_GET_VALUE (symbolP),
4220 S_SET_VALUE (symbolP, (valueT) temp);
4221 S_SET_EXTERNAL (symbolP);
4224 demand_empty_rest_of_line ();
4228 * implement the .section pseudo op:
4229 * .section name {, "flags"}
4231 * | +--- optional flags: 'b' for bss
4233 * +-- section name 'l' for lib
4237 * 'd' (apparently m88k for data)
4239 * But if the argument is not a quoted string, treat it as a
4240 * subsegment number.
4242 * FIXME: this is a copy of the section processing from obj-coff.c, with
4243 * additions/changes for the moto-pas assembler support. There are three
4246 * FIXME: I just noticed this. This doesn't work at all really. It it
4247 * setting bits that bfd probably neither understands or uses. The
4248 * correct approach (?) will have to incorporate extra fields attached
4249 * to the section to hold the system specific stuff. (krk)
4252 * 'a' - unknown - referred to in documentation, but no definition supplied
4253 * 'c' - section has code
4254 * 'd' - section has initialized data
4255 * 'u' - section has uninitialized data
4256 * 'i' - section contains directives (info)
4257 * 'n' - section can be discarded
4258 * 'R' - remove section at link time
4260 * Section Protection:
4261 * 'r' - section is readable
4262 * 'w' - section is writeable
4263 * 'x' - section is executable
4264 * 's' - section is sharable
4266 * Section Alignment:
4267 * '0' - align to byte boundary
4268 * '1' - align to halfword undary
4269 * '2' - align to word boundary
4270 * '3' - align to doubleword boundary
4271 * '4' - align to quadword boundary
4272 * '5' - align to 32 byte boundary
4273 * '6' - align to 64 byte boundary
4278 ppc_pe_section (ignore)
4279 int ignore ATTRIBUTE_UNUSED;
4281 /* Strip out the section name. */
4290 section_name = input_line_pointer;
4291 c = get_symbol_end ();
4293 name = xmalloc (input_line_pointer - section_name + 1);
4294 strcpy (name, section_name);
4296 *input_line_pointer = c;
4301 flags = SEC_NO_FLAGS;
4303 if (strcmp (name, ".idata$2") == 0)
4307 else if (strcmp (name, ".idata$3") == 0)
4311 else if (strcmp (name, ".idata$4") == 0)
4315 else if (strcmp (name, ".idata$5") == 0)
4319 else if (strcmp (name, ".idata$6") == 0)
4324 /* Default alignment to 16 byte boundary. */
4327 if (*input_line_pointer == ',')
4329 ++input_line_pointer;
4331 if (*input_line_pointer != '"')
4332 exp = get_absolute_expression ();
4335 ++input_line_pointer;
4336 while (*input_line_pointer != '"'
4337 && ! is_end_of_line[(unsigned char) *input_line_pointer])
4339 switch (*input_line_pointer)
4341 /* Section Contents */
4342 case 'a': /* unknown */
4343 as_bad (_("Unsupported section attribute -- 'a'"));
4345 case 'c': /* code section */
4348 case 'd': /* section has initialized data */
4351 case 'u': /* section has uninitialized data */
4352 /* FIXME: This is IMAGE_SCN_CNT_UNINITIALIZED_DATA
4356 case 'i': /* section contains directives (info) */
4357 /* FIXME: This is IMAGE_SCN_LNK_INFO
4359 flags |= SEC_HAS_CONTENTS;
4361 case 'n': /* section can be discarded */
4364 case 'R': /* Remove section at link time */
4365 flags |= SEC_NEVER_LOAD;
4368 /* Section Protection */
4369 case 'r': /* section is readable */
4370 flags |= IMAGE_SCN_MEM_READ;
4372 case 'w': /* section is writeable */
4373 flags |= IMAGE_SCN_MEM_WRITE;
4375 case 'x': /* section is executable */
4376 flags |= IMAGE_SCN_MEM_EXECUTE;
4378 case 's': /* section is sharable */
4379 flags |= IMAGE_SCN_MEM_SHARED;
4382 /* Section Alignment */
4383 case '0': /* align to byte boundary */
4384 flags |= IMAGE_SCN_ALIGN_1BYTES;
4387 case '1': /* align to halfword boundary */
4388 flags |= IMAGE_SCN_ALIGN_2BYTES;
4391 case '2': /* align to word boundary */
4392 flags |= IMAGE_SCN_ALIGN_4BYTES;
4395 case '3': /* align to doubleword boundary */
4396 flags |= IMAGE_SCN_ALIGN_8BYTES;
4399 case '4': /* align to quadword boundary */
4400 flags |= IMAGE_SCN_ALIGN_16BYTES;
4403 case '5': /* align to 32 byte boundary */
4404 flags |= IMAGE_SCN_ALIGN_32BYTES;
4407 case '6': /* align to 64 byte boundary */
4408 flags |= IMAGE_SCN_ALIGN_64BYTES;
4413 as_bad (_("unknown section attribute '%c'"),
4414 *input_line_pointer);
4417 ++input_line_pointer;
4419 if (*input_line_pointer == '"')
4420 ++input_line_pointer;
4424 sec = subseg_new (name, (subsegT) exp);
4426 ppc_set_current_section (sec);
4428 if (flags != SEC_NO_FLAGS)
4430 if (! bfd_set_section_flags (stdoutput, sec, flags))
4431 as_bad (_("error setting flags for \"%s\": %s"),
4432 bfd_section_name (stdoutput, sec),
4433 bfd_errmsg (bfd_get_error ()));
4436 bfd_set_section_alignment (stdoutput, sec, align);
4441 ppc_pe_function (ignore)
4442 int ignore ATTRIBUTE_UNUSED;
4448 name = input_line_pointer;
4449 endc = get_symbol_end ();
4451 ext_sym = symbol_find_or_make (name);
4453 *input_line_pointer = endc;
4455 S_SET_DATA_TYPE (ext_sym, DT_FCN << N_BTSHFT);
4456 SF_SET_FUNCTION (ext_sym);
4457 SF_SET_PROCESS (ext_sym);
4458 coff_add_linesym (ext_sym);
4460 demand_empty_rest_of_line ();
4464 ppc_pe_tocd (ignore)
4465 int ignore ATTRIBUTE_UNUSED;
4467 if (tocdata_section == 0)
4469 tocdata_section = subseg_new (".tocd", 0);
4470 /* FIXME: section flags won't work. */
4471 bfd_set_section_flags (stdoutput, tocdata_section,
4472 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
4473 | SEC_READONLY | SEC_DATA));
4475 bfd_set_section_alignment (stdoutput, tocdata_section, 2);
4479 rdata_section = subseg_new (".tocd", 0);
4482 ppc_set_current_section (tocdata_section);
4484 demand_empty_rest_of_line ();
4487 /* Don't adjust TOC relocs to use the section symbol. */
4490 ppc_pe_fix_adjustable (fix)
4493 return fix->fx_r_type != BFD_RELOC_PPC_TOC16;
4500 /* XCOFF specific symbol and file handling. */
4502 /* Canonicalize the symbol name. We use the to force the suffix, if
4503 any, to use square brackets, and to be in upper case. */
4506 ppc_canonicalize_symbol_name (name)
4511 if (ppc_stab_symbol)
4514 for (s = name; *s != '\0' && *s != '{' && *s != '['; s++)
4528 for (s++; *s != '\0' && *s != brac; s++)
4531 if (*s == '\0' || s[1] != '\0')
4532 as_bad (_("bad symbol suffix"));
4540 /* Set the class of a symbol based on the suffix, if any. This is
4541 called whenever a new symbol is created. */
4544 ppc_symbol_new_hook (sym)
4547 struct ppc_tc_sy *tc;
4550 tc = symbol_get_tc (sym);
4554 tc->real_name = NULL;
4560 if (ppc_stab_symbol)
4563 s = strchr (S_GET_NAME (sym), '[');
4564 if (s == (const char *) NULL)
4566 /* There is no suffix. */
4575 if (strcmp (s, "BS]") == 0)
4579 if (strcmp (s, "DB]") == 0)
4581 else if (strcmp (s, "DS]") == 0)
4585 if (strcmp (s, "GL]") == 0)
4589 if (strcmp (s, "PR]") == 0)
4593 if (strcmp (s, "RO]") == 0)
4595 else if (strcmp (s, "RW]") == 0)
4599 if (strcmp (s, "SV]") == 0)
4603 if (strcmp (s, "TC]") == 0)
4605 else if (strcmp (s, "TI]") == 0)
4607 else if (strcmp (s, "TB]") == 0)
4609 else if (strcmp (s, "TC0]") == 0 || strcmp (s, "T0]") == 0)
4610 tc->class = XMC_TC0;
4613 if (strcmp (s, "UA]") == 0)
4615 else if (strcmp (s, "UC]") == 0)
4619 if (strcmp (s, "XO]") == 0)
4624 if (tc->class == -1)
4625 as_bad (_("Unrecognized symbol suffix"));
4628 /* Set the class of a label based on where it is defined. This
4629 handles symbols without suffixes. Also, move the symbol so that it
4630 follows the csect symbol. */
4633 ppc_frob_label (sym)
4636 if (ppc_current_csect != (symbolS *) NULL)
4638 if (symbol_get_tc (sym)->class == -1)
4639 symbol_get_tc (sym)->class = symbol_get_tc (ppc_current_csect)->class;
4641 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
4642 symbol_append (sym, symbol_get_tc (ppc_current_csect)->within,
4643 &symbol_rootP, &symbol_lastP);
4644 symbol_get_tc (ppc_current_csect)->within = sym;
4648 /* This variable is set by ppc_frob_symbol if any absolute symbols are
4649 seen. It tells ppc_adjust_symtab whether it needs to look through
4652 static bfd_boolean ppc_saw_abs;
4654 /* Change the name of a symbol just before writing it out. Set the
4655 real name if the .rename pseudo-op was used. Otherwise, remove any
4656 class suffix. Return 1 if the symbol should not be included in the
4660 ppc_frob_symbol (sym)
4663 static symbolS *ppc_last_function;
4664 static symbolS *set_end;
4666 /* Discard symbols that should not be included in the output symbol
4668 if (! symbol_used_in_reloc_p (sym)
4669 && ((symbol_get_bfdsym (sym)->flags & BSF_SECTION_SYM) != 0
4670 || (! S_IS_EXTERNAL (sym)
4671 && ! symbol_get_tc (sym)->output
4672 && S_GET_STORAGE_CLASS (sym) != C_FILE)))
4675 /* This one will disappear anyway. Don't make a csect sym for it. */
4676 if (sym == abs_section_sym)
4679 if (symbol_get_tc (sym)->real_name != (char *) NULL)
4680 S_SET_NAME (sym, symbol_get_tc (sym)->real_name);
4686 name = S_GET_NAME (sym);
4687 s = strchr (name, '[');
4688 if (s != (char *) NULL)
4694 snew = xmalloc (len + 1);
4695 memcpy (snew, name, len);
4698 S_SET_NAME (sym, snew);
4702 if (set_end != (symbolS *) NULL)
4704 SA_SET_SYM_ENDNDX (set_end, sym);
4708 if (SF_GET_FUNCTION (sym))
4710 if (ppc_last_function != (symbolS *) NULL)
4711 as_bad (_("two .function pseudo-ops with no intervening .ef"));
4712 ppc_last_function = sym;
4713 if (symbol_get_tc (sym)->size != (symbolS *) NULL)
4715 resolve_symbol_value (symbol_get_tc (sym)->size);
4716 SA_SET_SYM_FSIZE (sym,
4717 (long) S_GET_VALUE (symbol_get_tc (sym)->size));
4720 else if (S_GET_STORAGE_CLASS (sym) == C_FCN
4721 && strcmp (S_GET_NAME (sym), ".ef") == 0)
4723 if (ppc_last_function == (symbolS *) NULL)
4724 as_bad (_(".ef with no preceding .function"));
4727 set_end = ppc_last_function;
4728 ppc_last_function = NULL;
4730 /* We don't have a C_EFCN symbol, but we need to force the
4731 COFF backend to believe that it has seen one. */
4732 coff_last_function = NULL;
4736 if (! S_IS_EXTERNAL (sym)
4737 && (symbol_get_bfdsym (sym)->flags & BSF_SECTION_SYM) == 0
4738 && S_GET_STORAGE_CLASS (sym) != C_FILE
4739 && S_GET_STORAGE_CLASS (sym) != C_FCN
4740 && S_GET_STORAGE_CLASS (sym) != C_BLOCK
4741 && S_GET_STORAGE_CLASS (sym) != C_BSTAT
4742 && S_GET_STORAGE_CLASS (sym) != C_ESTAT
4743 && S_GET_STORAGE_CLASS (sym) != C_BINCL
4744 && S_GET_STORAGE_CLASS (sym) != C_EINCL
4745 && S_GET_SEGMENT (sym) != ppc_coff_debug_section)
4746 S_SET_STORAGE_CLASS (sym, C_HIDEXT);
4748 if (S_GET_STORAGE_CLASS (sym) == C_EXT
4749 || S_GET_STORAGE_CLASS (sym) == C_HIDEXT)
4752 union internal_auxent *a;
4754 /* Create a csect aux. */
4755 i = S_GET_NUMBER_AUXILIARY (sym);
4756 S_SET_NUMBER_AUXILIARY (sym, i + 1);
4757 a = &coffsymbol (symbol_get_bfdsym (sym))->native[i + 1].u.auxent;
4758 if (symbol_get_tc (sym)->class == XMC_TC0)
4760 /* This is the TOC table. */
4761 know (strcmp (S_GET_NAME (sym), "TOC") == 0);
4762 a->x_csect.x_scnlen.l = 0;
4763 a->x_csect.x_smtyp = (2 << 3) | XTY_SD;
4765 else if (symbol_get_tc (sym)->subseg != 0)
4767 /* This is a csect symbol. x_scnlen is the size of the
4769 if (symbol_get_tc (sym)->next == (symbolS *) NULL)
4770 a->x_csect.x_scnlen.l = (bfd_section_size (stdoutput,
4771 S_GET_SEGMENT (sym))
4772 - S_GET_VALUE (sym));
4775 resolve_symbol_value (symbol_get_tc (sym)->next);
4776 a->x_csect.x_scnlen.l = (S_GET_VALUE (symbol_get_tc (sym)->next)
4777 - S_GET_VALUE (sym));
4779 a->x_csect.x_smtyp = (symbol_get_tc (sym)->align << 3) | XTY_SD;
4781 else if (S_GET_SEGMENT (sym) == bss_section)
4783 /* This is a common symbol. */
4784 a->x_csect.x_scnlen.l = symbol_get_frag (sym)->fr_offset;
4785 a->x_csect.x_smtyp = (symbol_get_tc (sym)->align << 3) | XTY_CM;
4786 if (S_IS_EXTERNAL (sym))
4787 symbol_get_tc (sym)->class = XMC_RW;
4789 symbol_get_tc (sym)->class = XMC_BS;
4791 else if (S_GET_SEGMENT (sym) == absolute_section)
4793 /* This is an absolute symbol. The csect will be created by
4794 ppc_adjust_symtab. */
4796 a->x_csect.x_smtyp = XTY_LD;
4797 if (symbol_get_tc (sym)->class == -1)
4798 symbol_get_tc (sym)->class = XMC_XO;
4800 else if (! S_IS_DEFINED (sym))
4802 /* This is an external symbol. */
4803 a->x_csect.x_scnlen.l = 0;
4804 a->x_csect.x_smtyp = XTY_ER;
4806 else if (symbol_get_tc (sym)->class == XMC_TC)
4810 /* This is a TOC definition. x_scnlen is the size of the
4812 next = symbol_next (sym);
4813 while (symbol_get_tc (next)->class == XMC_TC0)
4814 next = symbol_next (next);
4815 if (next == (symbolS *) NULL
4816 || symbol_get_tc (next)->class != XMC_TC)
4818 if (ppc_after_toc_frag == (fragS *) NULL)
4819 a->x_csect.x_scnlen.l = (bfd_section_size (stdoutput,
4821 - S_GET_VALUE (sym));
4823 a->x_csect.x_scnlen.l = (ppc_after_toc_frag->fr_address
4824 - S_GET_VALUE (sym));
4828 resolve_symbol_value (next);
4829 a->x_csect.x_scnlen.l = (S_GET_VALUE (next)
4830 - S_GET_VALUE (sym));
4832 a->x_csect.x_smtyp = (2 << 3) | XTY_SD;
4838 /* This is a normal symbol definition. x_scnlen is the
4839 symbol index of the containing csect. */
4840 if (S_GET_SEGMENT (sym) == text_section)
4841 csect = ppc_text_csects;
4842 else if (S_GET_SEGMENT (sym) == data_section)
4843 csect = ppc_data_csects;
4847 /* Skip the initial dummy symbol. */
4848 csect = symbol_get_tc (csect)->next;
4850 if (csect == (symbolS *) NULL)
4852 as_warn (_("warning: symbol %s has no csect"), S_GET_NAME (sym));
4853 a->x_csect.x_scnlen.l = 0;
4857 while (symbol_get_tc (csect)->next != (symbolS *) NULL)
4859 resolve_symbol_value (symbol_get_tc (csect)->next);
4860 if (S_GET_VALUE (symbol_get_tc (csect)->next)
4861 > S_GET_VALUE (sym))
4863 csect = symbol_get_tc (csect)->next;
4866 a->x_csect.x_scnlen.p =
4867 coffsymbol (symbol_get_bfdsym (csect))->native;
4868 coffsymbol (symbol_get_bfdsym (sym))->native[i + 1].fix_scnlen =
4871 a->x_csect.x_smtyp = XTY_LD;
4874 a->x_csect.x_parmhash = 0;
4875 a->x_csect.x_snhash = 0;
4876 if (symbol_get_tc (sym)->class == -1)
4877 a->x_csect.x_smclas = XMC_PR;
4879 a->x_csect.x_smclas = symbol_get_tc (sym)->class;
4880 a->x_csect.x_stab = 0;
4881 a->x_csect.x_snstab = 0;
4883 /* Don't let the COFF backend resort these symbols. */
4884 symbol_get_bfdsym (sym)->flags |= BSF_NOT_AT_END;
4886 else if (S_GET_STORAGE_CLASS (sym) == C_BSTAT)
4888 /* We want the value to be the symbol index of the referenced
4889 csect symbol. BFD will do that for us if we set the right
4891 asymbol *bsym = symbol_get_bfdsym (symbol_get_tc (sym)->within);
4892 combined_entry_type *c = coffsymbol (bsym)->native;
4894 S_SET_VALUE (sym, (valueT) (size_t) c);
4895 coffsymbol (symbol_get_bfdsym (sym))->native->fix_value = 1;
4897 else if (S_GET_STORAGE_CLASS (sym) == C_STSYM)
4902 /* The value is the offset from the enclosing csect. */
4903 block = symbol_get_tc (sym)->within;
4904 csect = symbol_get_tc (block)->within;
4905 resolve_symbol_value (csect);
4906 S_SET_VALUE (sym, S_GET_VALUE (sym) - S_GET_VALUE (csect));
4908 else if (S_GET_STORAGE_CLASS (sym) == C_BINCL
4909 || S_GET_STORAGE_CLASS (sym) == C_EINCL)
4911 /* We want the value to be a file offset into the line numbers.
4912 BFD will do that for us if we set the right flags. We have
4913 already set the value correctly. */
4914 coffsymbol (symbol_get_bfdsym (sym))->native->fix_line = 1;
4920 /* Adjust the symbol table. This creates csect symbols for all
4921 absolute symbols. */
4924 ppc_adjust_symtab ()
4931 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
4935 union internal_auxent *a;
4937 if (S_GET_SEGMENT (sym) != absolute_section)
4940 csect = symbol_create (".abs[XO]", absolute_section,
4941 S_GET_VALUE (sym), &zero_address_frag);
4942 symbol_get_bfdsym (csect)->value = S_GET_VALUE (sym);
4943 S_SET_STORAGE_CLASS (csect, C_HIDEXT);
4944 i = S_GET_NUMBER_AUXILIARY (csect);
4945 S_SET_NUMBER_AUXILIARY (csect, i + 1);
4946 a = &coffsymbol (symbol_get_bfdsym (csect))->native[i + 1].u.auxent;
4947 a->x_csect.x_scnlen.l = 0;
4948 a->x_csect.x_smtyp = XTY_SD;
4949 a->x_csect.x_parmhash = 0;
4950 a->x_csect.x_snhash = 0;
4951 a->x_csect.x_smclas = XMC_XO;
4952 a->x_csect.x_stab = 0;
4953 a->x_csect.x_snstab = 0;
4955 symbol_insert (csect, sym, &symbol_rootP, &symbol_lastP);
4957 i = S_GET_NUMBER_AUXILIARY (sym);
4958 a = &coffsymbol (symbol_get_bfdsym (sym))->native[i].u.auxent;
4959 a->x_csect.x_scnlen.p = coffsymbol (symbol_get_bfdsym (csect))->native;
4960 coffsymbol (symbol_get_bfdsym (sym))->native[i].fix_scnlen = 1;
4963 ppc_saw_abs = FALSE;
4966 /* Set the VMA for a section. This is called on all the sections in
4970 ppc_frob_section (sec)
4973 static bfd_size_type vma = 0;
4975 bfd_set_section_vma (stdoutput, sec, vma);
4976 vma += bfd_section_size (stdoutput, sec);
4979 #endif /* OBJ_XCOFF */
4981 /* Turn a string in input_line_pointer into a floating point constant
4982 of type TYPE, and store the appropriate bytes in *LITP. The number
4983 of LITTLENUMS emitted is stored in *SIZEP. An error message is
4984 returned, or NULL on OK. */
4987 md_atof (type, litp, sizep)
4993 LITTLENUM_TYPE words[4];
5009 return _("bad call to md_atof");
5012 t = atof_ieee (input_line_pointer, type, words);
5014 input_line_pointer = t;
5018 if (target_big_endian)
5020 for (i = 0; i < prec; i++)
5022 md_number_to_chars (litp, (valueT) words[i], 2);
5028 for (i = prec - 1; i >= 0; i--)
5030 md_number_to_chars (litp, (valueT) words[i], 2);
5038 /* Write a value out to the object file, using the appropriate
5042 md_number_to_chars (buf, val, n)
5047 if (target_big_endian)
5048 number_to_chars_bigendian (buf, val, n);
5050 number_to_chars_littleendian (buf, val, n);
5053 /* Align a section (I don't know why this is machine dependent). */
5056 md_section_align (seg, addr)
5060 int align = bfd_get_section_alignment (stdoutput, seg);
5062 return ((addr + (1 << align) - 1) & (-1 << align));
5065 /* We don't have any form of relaxing. */
5068 md_estimate_size_before_relax (fragp, seg)
5069 fragS *fragp ATTRIBUTE_UNUSED;
5070 asection *seg ATTRIBUTE_UNUSED;
5076 /* Convert a machine dependent frag. We never generate these. */
5079 md_convert_frag (abfd, sec, fragp)
5080 bfd *abfd ATTRIBUTE_UNUSED;
5081 asection *sec ATTRIBUTE_UNUSED;
5082 fragS *fragp ATTRIBUTE_UNUSED;
5087 /* We have no need to default values of symbols. */
5090 md_undefined_symbol (name)
5091 char *name ATTRIBUTE_UNUSED;
5096 /* Functions concerning relocs. */
5098 /* The location from which a PC relative jump should be calculated,
5099 given a PC relative reloc. */
5102 md_pcrel_from_section (fixp, sec)
5104 segT sec ATTRIBUTE_UNUSED;
5106 return fixp->fx_frag->fr_address + fixp->fx_where;
5111 /* This is called to see whether a fixup should be adjusted to use a
5112 section symbol. We take the opportunity to change a fixup against
5113 a symbol in the TOC subsegment into a reloc against the
5114 corresponding .tc symbol. */
5117 ppc_fix_adjustable (fix)
5120 valueT val = resolve_symbol_value (fix->fx_addsy);
5121 segT symseg = S_GET_SEGMENT (fix->fx_addsy);
5122 TC_SYMFIELD_TYPE *tc;
5124 if (symseg == absolute_section)
5127 if (ppc_toc_csect != (symbolS *) NULL
5128 && fix->fx_addsy != ppc_toc_csect
5129 && symseg == data_section
5130 && val >= ppc_toc_frag->fr_address
5131 && (ppc_after_toc_frag == (fragS *) NULL
5132 || val < ppc_after_toc_frag->fr_address))
5136 for (sy = symbol_next (ppc_toc_csect);
5137 sy != (symbolS *) NULL;
5138 sy = symbol_next (sy))
5140 TC_SYMFIELD_TYPE *sy_tc = symbol_get_tc (sy);
5142 if (sy_tc->class == XMC_TC0)
5144 if (sy_tc->class != XMC_TC)
5146 if (val == resolve_symbol_value (sy))
5149 fix->fx_addnumber = val - ppc_toc_frag->fr_address;
5154 as_bad_where (fix->fx_file, fix->fx_line,
5155 _("symbol in .toc does not match any .tc"));
5158 /* Possibly adjust the reloc to be against the csect. */
5159 tc = symbol_get_tc (fix->fx_addsy);
5161 && tc->class != XMC_TC0
5162 && tc->class != XMC_TC
5163 && symseg != bss_section
5164 /* Don't adjust if this is a reloc in the toc section. */
5165 && (symseg != data_section
5166 || ppc_toc_csect == NULL
5167 || val < ppc_toc_frag->fr_address
5168 || (ppc_after_toc_frag != NULL
5169 && val >= ppc_after_toc_frag->fr_address)))
5172 symbolS *next_csect;
5174 if (symseg == text_section)
5175 csect = ppc_text_csects;
5176 else if (symseg == data_section)
5177 csect = ppc_data_csects;
5181 /* Skip the initial dummy symbol. */
5182 csect = symbol_get_tc (csect)->next;
5184 if (csect != (symbolS *) NULL)
5186 while ((next_csect = symbol_get_tc (csect)->next) != (symbolS *) NULL
5187 && (symbol_get_frag (next_csect)->fr_address <= val))
5189 /* If the csect address equals the symbol value, then we
5190 have to look through the full symbol table to see
5191 whether this is the csect we want. Note that we will
5192 only get here if the csect has zero length. */
5193 if (symbol_get_frag (csect)->fr_address == val
5194 && S_GET_VALUE (csect) == val)
5198 for (scan = symbol_next (csect);
5200 scan = symbol_next (scan))
5202 if (symbol_get_tc (scan)->subseg != 0)
5204 if (scan == fix->fx_addsy)
5208 /* If we found the symbol before the next csect
5209 symbol, then this is the csect we want. */
5210 if (scan == fix->fx_addsy)
5217 fix->fx_offset += val - symbol_get_frag (csect)->fr_address;
5218 fix->fx_addsy = csect;
5223 /* Adjust a reloc against a .lcomm symbol to be against the base
5225 if (symseg == bss_section
5226 && ! S_IS_EXTERNAL (fix->fx_addsy))
5228 symbolS *sy = symbol_get_frag (fix->fx_addsy)->fr_symbol;
5230 fix->fx_offset += val - resolve_symbol_value (sy);
5237 /* A reloc from one csect to another must be kept. The assembler
5238 will, of course, keep relocs between sections, and it will keep
5239 absolute relocs, but we need to force it to keep PC relative relocs
5240 between two csects in the same section. */
5243 ppc_force_relocation (fix)
5246 /* At this point fix->fx_addsy should already have been converted to
5247 a csect symbol. If the csect does not include the fragment, then
5248 we need to force the relocation. */
5250 && fix->fx_addsy != NULL
5251 && symbol_get_tc (fix->fx_addsy)->subseg != 0
5252 && ((symbol_get_frag (fix->fx_addsy)->fr_address
5253 > fix->fx_frag->fr_address)
5254 || (symbol_get_tc (fix->fx_addsy)->next != NULL
5255 && (symbol_get_frag (symbol_get_tc (fix->fx_addsy)->next)->fr_address
5256 <= fix->fx_frag->fr_address))))
5259 return S_FORCE_RELOC (fix->fx_addsy);
5262 #endif /* OBJ_XCOFF */
5265 /* If this function returns non-zero, it guarantees that a relocation
5266 will be emitted for a fixup. */
5269 ppc_force_relocation (fix)
5272 /* Branch prediction relocations must force a relocation, as must
5273 the vtable description relocs. */
5274 switch (fix->fx_r_type)
5276 case BFD_RELOC_PPC_B16_BRTAKEN:
5277 case BFD_RELOC_PPC_B16_BRNTAKEN:
5278 case BFD_RELOC_PPC_BA16_BRTAKEN:
5279 case BFD_RELOC_PPC_BA16_BRNTAKEN:
5280 case BFD_RELOC_PPC64_TOC:
5281 case BFD_RELOC_VTABLE_INHERIT:
5282 case BFD_RELOC_VTABLE_ENTRY:
5288 return S_FORCE_RELOC (fix->fx_addsy);
5292 ppc_fix_adjustable (fix)
5295 return (fix->fx_r_type != BFD_RELOC_16_GOTOFF
5296 && fix->fx_r_type != BFD_RELOC_LO16_GOTOFF
5297 && fix->fx_r_type != BFD_RELOC_HI16_GOTOFF
5298 && fix->fx_r_type != BFD_RELOC_HI16_S_GOTOFF
5299 && fix->fx_r_type != BFD_RELOC_GPREL16
5300 && fix->fx_r_type != BFD_RELOC_VTABLE_INHERIT
5301 && fix->fx_r_type != BFD_RELOC_VTABLE_ENTRY
5303 || (fix->fx_subsy != NULL
5304 && (S_GET_SEGMENT (fix->fx_subsy)
5305 == S_GET_SEGMENT (fix->fx_addsy)))
5306 || S_IS_LOCAL (fix->fx_addsy)));
5310 /* Apply a fixup to the object code. This is called for all the
5311 fixups we generated by the call to fix_new_exp, above. In the call
5312 above we used a reloc code which was the largest legal reloc code
5313 plus the operand index. Here we undo that to recover the operand
5314 index. At this point all symbol values should be fully resolved,
5315 and we attempt to completely resolve the reloc. If we can not do
5316 that, we determine the correct reloc code and put it back in the
5320 md_apply_fix3 (fixP, valP, seg)
5323 segT seg ATTRIBUTE_UNUSED;
5325 valueT value = * valP;
5328 if (fixP->fx_addsy != NULL)
5330 /* Hack around bfd_install_relocation brain damage. */
5332 value += fixP->fx_frag->fr_address + fixP->fx_where;
5337 /* FIXME FIXME FIXME: The value we are passed in *valP includes
5338 the symbol values. Since we are using BFD_ASSEMBLER, if we are
5339 doing this relocation the code in write.c is going to call
5340 bfd_install_relocation, which is also going to use the symbol
5341 value. That means that if the reloc is fully resolved we want to
5342 use *valP since bfd_install_relocation is not being used.
5343 However, if the reloc is not fully resolved we do not want to use
5344 *valP, and must use fx_offset instead. However, if the reloc
5345 is PC relative, we do want to use *valP since it includes the
5346 result of md_pcrel_from. This is confusing. */
5347 if (fixP->fx_addsy == (symbolS *) NULL)
5350 else if (fixP->fx_pcrel)
5354 value = fixP->fx_offset;
5357 if (fixP->fx_subsy != (symbolS *) NULL)
5359 /* We can't actually support subtracting a symbol. */
5360 as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
5363 if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
5366 const struct powerpc_operand *operand;
5370 opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
5372 operand = &powerpc_operands[opindex];
5375 /* An instruction like `lwz 9,sym(30)' when `sym' is not a TOC symbol
5376 does not generate a reloc. It uses the offset of `sym' within its
5377 csect. Other usages, such as `.long sym', generate relocs. This
5378 is the documented behaviour of non-TOC symbols. */
5379 if ((operand->flags & PPC_OPERAND_PARENS) != 0
5380 && operand->bits == 16
5381 && operand->shift == 0
5382 && (operand->insert == NULL || ppc_obj64)
5383 && fixP->fx_addsy != NULL
5384 && symbol_get_tc (fixP->fx_addsy)->subseg != 0
5385 && symbol_get_tc (fixP->fx_addsy)->class != XMC_TC
5386 && symbol_get_tc (fixP->fx_addsy)->class != XMC_TC0
5387 && S_GET_SEGMENT (fixP->fx_addsy) != bss_section)
5389 value = fixP->fx_offset;
5394 /* Fetch the instruction, insert the fully resolved operand
5395 value, and stuff the instruction back again. */
5396 where = fixP->fx_frag->fr_literal + fixP->fx_where;
5397 if (target_big_endian)
5398 insn = bfd_getb32 ((unsigned char *) where);
5400 insn = bfd_getl32 ((unsigned char *) where);
5401 insn = ppc_insert_operand (insn, operand, (offsetT) value,
5402 fixP->fx_file, fixP->fx_line);
5403 if (target_big_endian)
5404 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
5406 bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
5409 /* Nothing else to do here. */
5412 assert (fixP->fx_addsy != NULL);
5414 /* Determine a BFD reloc value based on the operand information.
5415 We are only prepared to turn a few of the operands into
5417 if ((operand->flags & PPC_OPERAND_RELATIVE) != 0
5418 && operand->bits == 26
5419 && operand->shift == 0)
5420 fixP->fx_r_type = BFD_RELOC_PPC_B26;
5421 else if ((operand->flags & PPC_OPERAND_RELATIVE) != 0
5422 && operand->bits == 16
5423 && operand->shift == 0)
5425 fixP->fx_r_type = BFD_RELOC_PPC_B16;
5428 if (target_big_endian)
5429 fixP->fx_where += 2;
5432 else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0
5433 && operand->bits == 26
5434 && operand->shift == 0)
5435 fixP->fx_r_type = BFD_RELOC_PPC_BA26;
5436 else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0
5437 && operand->bits == 16
5438 && operand->shift == 0)
5440 fixP->fx_r_type = BFD_RELOC_PPC_BA16;
5443 if (target_big_endian)
5444 fixP->fx_where += 2;
5447 #if defined (OBJ_XCOFF) || defined (OBJ_ELF)
5448 else if ((operand->flags & PPC_OPERAND_PARENS) != 0
5449 && operand->bits == 16
5450 && operand->shift == 0
5451 && ppc_is_toc_sym (fixP->fx_addsy))
5453 fixP->fx_r_type = BFD_RELOC_PPC_TOC16;
5456 && (operand->flags & PPC_OPERAND_DS) != 0)
5457 fixP->fx_r_type = BFD_RELOC_PPC64_TOC16_DS;
5460 if (target_big_endian)
5461 fixP->fx_where += 2;
5463 #endif /* defined (OBJ_XCOFF) || defined (OBJ_ELF) */
5469 /* Use expr_symbol_where to see if this is an expression
5471 if (expr_symbol_where (fixP->fx_addsy, &sfile, &sline))
5472 as_bad_where (fixP->fx_file, fixP->fx_line,
5473 _("unresolved expression that must be resolved"));
5475 as_bad_where (fixP->fx_file, fixP->fx_line,
5476 _("unsupported relocation against %s"),
5477 S_GET_NAME (fixP->fx_addsy));
5485 ppc_elf_validate_fix (fixP, seg);
5487 switch (fixP->fx_r_type)
5489 case BFD_RELOC_CTOR:
5496 fixP->fx_r_type = BFD_RELOC_32_PCREL;
5500 case BFD_RELOC_32_PCREL:
5501 case BFD_RELOC_PPC_EMB_NADDR32:
5502 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5509 fixP->fx_r_type = BFD_RELOC_64_PCREL;
5512 case BFD_RELOC_64_PCREL:
5513 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5517 case BFD_RELOC_LO16:
5519 case BFD_RELOC_GPREL16:
5520 case BFD_RELOC_16_GOT_PCREL:
5521 case BFD_RELOC_16_GOTOFF:
5522 case BFD_RELOC_LO16_GOTOFF:
5523 case BFD_RELOC_HI16_GOTOFF:
5524 case BFD_RELOC_HI16_S_GOTOFF:
5525 case BFD_RELOC_16_BASEREL:
5526 case BFD_RELOC_LO16_BASEREL:
5527 case BFD_RELOC_HI16_BASEREL:
5528 case BFD_RELOC_HI16_S_BASEREL:
5529 case BFD_RELOC_PPC_EMB_NADDR16:
5530 case BFD_RELOC_PPC_EMB_NADDR16_LO:
5531 case BFD_RELOC_PPC_EMB_NADDR16_HI:
5532 case BFD_RELOC_PPC_EMB_NADDR16_HA:
5533 case BFD_RELOC_PPC_EMB_SDAI16:
5534 case BFD_RELOC_PPC_EMB_SDA2REL:
5535 case BFD_RELOC_PPC_EMB_SDA2I16:
5536 case BFD_RELOC_PPC_EMB_RELSEC16:
5537 case BFD_RELOC_PPC_EMB_RELST_LO:
5538 case BFD_RELOC_PPC_EMB_RELST_HI:
5539 case BFD_RELOC_PPC_EMB_RELST_HA:
5540 case BFD_RELOC_PPC_EMB_RELSDA:
5541 case BFD_RELOC_PPC_TOC16:
5543 case BFD_RELOC_PPC64_TOC16_LO:
5544 case BFD_RELOC_PPC64_TOC16_HI:
5545 case BFD_RELOC_PPC64_TOC16_HA:
5549 if (fixP->fx_addsy != NULL)
5550 as_bad_where (fixP->fx_file, fixP->fx_line,
5551 _("cannot emit PC relative %s relocation against %s"),
5552 bfd_get_reloc_code_name (fixP->fx_r_type),
5553 S_GET_NAME (fixP->fx_addsy));
5555 as_bad_where (fixP->fx_file, fixP->fx_line,
5556 _("cannot emit PC relative %s relocation"),
5557 bfd_get_reloc_code_name (fixP->fx_r_type));
5560 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5564 /* This case happens when you write, for example,
5566 where L1 and L2 are defined later. */
5567 case BFD_RELOC_HI16:
5570 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5574 case BFD_RELOC_HI16_S:
5577 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5582 case BFD_RELOC_PPC64_HIGHER:
5585 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5586 PPC_HIGHER (value), 2);
5589 case BFD_RELOC_PPC64_HIGHER_S:
5592 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5593 PPC_HIGHERA (value), 2);
5596 case BFD_RELOC_PPC64_HIGHEST:
5599 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5600 PPC_HIGHEST (value), 2);
5603 case BFD_RELOC_PPC64_HIGHEST_S:
5606 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5607 PPC_HIGHESTA (value), 2);
5610 case BFD_RELOC_PPC64_ADDR16_DS:
5611 case BFD_RELOC_PPC64_ADDR16_LO_DS:
5612 case BFD_RELOC_PPC64_GOT16_DS:
5613 case BFD_RELOC_PPC64_GOT16_LO_DS:
5614 case BFD_RELOC_PPC64_PLT16_LO_DS:
5615 case BFD_RELOC_PPC64_SECTOFF_DS:
5616 case BFD_RELOC_PPC64_SECTOFF_LO_DS:
5617 case BFD_RELOC_PPC64_TOC16_DS:
5618 case BFD_RELOC_PPC64_TOC16_LO_DS:
5619 case BFD_RELOC_PPC64_PLTGOT16_DS:
5620 case BFD_RELOC_PPC64_PLTGOT16_LO_DS:
5624 unsigned char *where = fixP->fx_frag->fr_literal + fixP->fx_where;
5627 if (target_big_endian)
5628 val = bfd_getb16 (where);
5630 val = bfd_getl16 (where);
5631 val |= (value & 0xfffc);
5632 if (target_big_endian)
5633 bfd_putb16 ((bfd_vma) val, where);
5635 bfd_putl16 ((bfd_vma) val, where);
5639 /* Because SDA21 modifies the register field, the size is set to 4
5640 bytes, rather than 2, so offset it here appropriately. */
5641 case BFD_RELOC_PPC_EMB_SDA21:
5645 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where
5646 + ((target_big_endian) ? 2 : 0),
5654 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5658 case BFD_RELOC_24_PLT_PCREL:
5659 case BFD_RELOC_PPC_LOCAL24PC:
5660 if (!fixP->fx_pcrel && !fixP->fx_done)
5668 /* Fetch the instruction, insert the fully resolved operand
5669 value, and stuff the instruction back again. */
5670 where = fixP->fx_frag->fr_literal + fixP->fx_where;
5671 if (target_big_endian)
5672 insn = bfd_getb32 ((unsigned char *) where);
5674 insn = bfd_getl32 ((unsigned char *) where);
5675 if ((value & 3) != 0)
5676 as_bad_where (fixP->fx_file, fixP->fx_line,
5677 _("must branch to an address a multiple of 4"));
5678 if ((offsetT) value < -0x40000000
5679 || (offsetT) value >= 0x40000000)
5680 as_bad_where (fixP->fx_file, fixP->fx_line,
5681 _("@local or @plt branch destination is too far away, %ld bytes"),
5683 insn = insn | (value & 0x03fffffc);
5684 if (target_big_endian)
5685 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
5687 bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
5691 case BFD_RELOC_VTABLE_INHERIT:
5694 && !S_IS_DEFINED (fixP->fx_addsy)
5695 && !S_IS_WEAK (fixP->fx_addsy))
5696 S_SET_WEAK (fixP->fx_addsy);
5699 case BFD_RELOC_VTABLE_ENTRY:
5704 /* Generated by reference to `sym@tocbase'. The sym is
5705 ignored by the linker. */
5706 case BFD_RELOC_PPC64_TOC:
5712 _("Gas failure, reloc value %d\n"), fixP->fx_r_type);
5719 fixP->fx_addnumber = value;
5721 if (fixP->fx_r_type != BFD_RELOC_PPC_TOC16)
5722 fixP->fx_addnumber = 0;
5726 fixP->fx_addnumber = 0;
5728 /* We want to use the offset within the data segment of the
5729 symbol, not the actual VMA of the symbol. */
5730 fixP->fx_addnumber =
5731 - bfd_get_section_vma (stdoutput, S_GET_SEGMENT (fixP->fx_addsy));
5737 /* Generate a reloc for a fixup. */
5740 tc_gen_reloc (seg, fixp)
5741 asection *seg ATTRIBUTE_UNUSED;
5746 reloc = (arelent *) xmalloc (sizeof (arelent));
5748 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
5749 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
5750 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
5751 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
5752 if (reloc->howto == (reloc_howto_type *) NULL)
5754 as_bad_where (fixp->fx_file, fixp->fx_line,
5755 _("reloc %d not supported by object file format"),
5756 (int) fixp->fx_r_type);
5759 reloc->addend = fixp->fx_addnumber;