1 /* tc-ppc.c -- Assemble for the PowerPC or POWER (RS/6000)
2 Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor, Cygnus Support.
5 This file is part of GAS, the GNU Assembler.
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
27 #include "opcode/ppc.h"
37 /* This is the assembler for the PowerPC or POWER (RS/6000) chips. */
39 /* Tell the main code what the endianness is. */
40 extern int target_big_endian;
42 /* Whether or not, we've set target_big_endian. */
43 static int set_target_endian = 0;
45 /* Whether to use user friendly register names. */
46 #ifndef TARGET_REG_NAMES_P
48 #define TARGET_REG_NAMES_P true
50 #define TARGET_REG_NAMES_P false
54 static boolean reg_names_p = TARGET_REG_NAMES_P;
56 static boolean register_name PARAMS ((expressionS *));
57 static void ppc_set_cpu PARAMS ((void));
58 static unsigned long ppc_insert_operand
59 PARAMS ((unsigned long insn, const struct powerpc_operand *operand,
60 offsetT val, char *file, unsigned int line));
61 static void ppc_macro PARAMS ((char *str, const struct powerpc_macro *macro));
62 static void ppc_byte PARAMS ((int));
63 static int ppc_is_toc_sym PARAMS ((symbolS *sym));
64 static void ppc_tc PARAMS ((int));
67 static void ppc_comm PARAMS ((int));
68 static void ppc_bb PARAMS ((int));
69 static void ppc_bc PARAMS ((int));
70 static void ppc_bf PARAMS ((int));
71 static void ppc_biei PARAMS ((int));
72 static void ppc_bs PARAMS ((int));
73 static void ppc_eb PARAMS ((int));
74 static void ppc_ec PARAMS ((int));
75 static void ppc_ef PARAMS ((int));
76 static void ppc_es PARAMS ((int));
77 static void ppc_csect PARAMS ((int));
78 static void ppc_change_csect PARAMS ((symbolS *));
79 static void ppc_function PARAMS ((int));
80 static void ppc_extern PARAMS ((int));
81 static void ppc_lglobl PARAMS ((int));
82 static void ppc_section PARAMS ((int));
83 static void ppc_stabx PARAMS ((int));
84 static void ppc_rename PARAMS ((int));
85 static void ppc_toc PARAMS ((int));
86 static void ppc_xcoff_cons PARAMS ((int));
90 static bfd_reloc_code_real_type ppc_elf_suffix PARAMS ((char **, expressionS *));
91 static void ppc_elf_cons PARAMS ((int));
92 static void ppc_elf_rdata PARAMS ((int));
93 static void ppc_elf_lcomm PARAMS ((int));
94 static void ppc_elf_validate_fix PARAMS ((fixS *, segT));
98 static void ppc_set_current_section PARAMS ((segT));
99 static void ppc_previous PARAMS ((int));
100 static void ppc_pdata PARAMS ((int));
101 static void ppc_ydata PARAMS ((int));
102 static void ppc_reldata PARAMS ((int));
103 static void ppc_rdata PARAMS ((int));
104 static void ppc_ualong PARAMS ((int));
105 static void ppc_znop PARAMS ((int));
106 static void ppc_pe_comm PARAMS ((int));
107 static void ppc_pe_section PARAMS ((int));
108 static void ppc_pe_function PARAMS ((int));
109 static void ppc_pe_tocd PARAMS ((int));
112 /* Generic assembler global variables which must be defined by all
116 /* This string holds the chars that always start a comment. If the
117 pre-processor is disabled, these aren't very useful. The macro
118 tc_comment_chars points to this. We use this, rather than the
119 usual comment_chars, so that we can switch for Solaris conventions. */
120 static const char ppc_solaris_comment_chars[] = "#!";
121 static const char ppc_eabi_comment_chars[] = "#";
123 #ifdef TARGET_SOLARIS_COMMENT
124 const char *ppc_comment_chars = ppc_solaris_comment_chars;
126 const char *ppc_comment_chars = ppc_eabi_comment_chars;
129 const char comment_chars[] = "#";
132 /* Characters which start a comment at the beginning of a line. */
133 const char line_comment_chars[] = "#";
135 /* Characters which may be used to separate multiple commands on a
137 const char line_separator_chars[] = ";";
139 /* Characters which are used to indicate an exponent in a floating
141 const char EXP_CHARS[] = "eE";
143 /* Characters which mean that a number is a floating point constant,
145 const char FLT_CHARS[] = "dD";
147 /* The target specific pseudo-ops which we support. */
149 const pseudo_typeS md_pseudo_table[] =
151 /* Pseudo-ops which must be overridden. */
152 { "byte", ppc_byte, 0 },
155 /* Pseudo-ops specific to the RS/6000 XCOFF format. Some of these
156 legitimately belong in the obj-*.c file. However, XCOFF is based
157 on COFF, and is only implemented for the RS/6000. We just use
158 obj-coff.c, and add what we need here. */
159 { "comm", ppc_comm, 0 },
160 { "lcomm", ppc_comm, 1 },
164 { "bi", ppc_biei, 0 },
166 { "csect", ppc_csect, 0 },
167 { "data", ppc_section, 'd' },
171 { "ei", ppc_biei, 1 },
173 { "extern", ppc_extern, 0 },
174 { "function", ppc_function, 0 },
175 { "lglobl", ppc_lglobl, 0 },
176 { "rename", ppc_rename, 0 },
177 { "stabx", ppc_stabx, 0 },
178 { "text", ppc_section, 't' },
179 { "toc", ppc_toc, 0 },
180 { "long", ppc_xcoff_cons, 2 },
181 { "word", ppc_xcoff_cons, 1 },
182 { "short", ppc_xcoff_cons, 1 },
186 { "long", ppc_elf_cons, 4 },
187 { "word", ppc_elf_cons, 2 },
188 { "short", ppc_elf_cons, 2 },
189 { "rdata", ppc_elf_rdata, 0 },
190 { "rodata", ppc_elf_rdata, 0 },
191 { "lcomm", ppc_elf_lcomm, 0 },
195 /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format */
196 { "previous", ppc_previous, 0 },
197 { "pdata", ppc_pdata, 0 },
198 { "ydata", ppc_ydata, 0 },
199 { "reldata", ppc_reldata, 0 },
200 { "rdata", ppc_rdata, 0 },
201 { "ualong", ppc_ualong, 0 },
202 { "znop", ppc_znop, 0 },
203 { "comm", ppc_pe_comm, 0 },
204 { "lcomm", ppc_pe_comm, 1 },
205 { "section", ppc_pe_section, 0 },
206 { "function", ppc_pe_function,0 },
207 { "tocd", ppc_pe_tocd, 0 },
210 /* This pseudo-op is used even when not generating XCOFF output. */
217 /* Predefined register names if -mregnames (or default for Windows NT). */
218 /* In general, there are lots of them, in an attempt to be compatible */
219 /* with a number of other Windows NT assemblers. */
221 /* Structure to hold information about predefined registers. */
228 /* List of registers that are pre-defined:
230 Each general register has predefined names of the form:
231 1. r<reg_num> which has the value <reg_num>.
232 2. r.<reg_num> which has the value <reg_num>.
235 Each floating point register has predefined names of the form:
236 1. f<reg_num> which has the value <reg_num>.
237 2. f.<reg_num> which has the value <reg_num>.
239 Each condition register has predefined names of the form:
240 1. cr<reg_num> which has the value <reg_num>.
241 2. cr.<reg_num> which has the value <reg_num>.
243 There are individual registers as well:
244 sp or r.sp has the value 1
245 rtoc or r.toc has the value 2
246 fpscr has the value 0
252 dsisr has the value 18
254 sdr1 has the value 25
255 srr0 has the value 26
256 srr1 has the value 27
258 The table is sorted. Suitable for searching by a binary search. */
260 static const struct pd_reg pre_defined_registers[] =
262 { "cr.0", 0 }, /* Condition Registers */
282 { "dar", 19 }, /* Data Access Register */
283 { "dec", 22 }, /* Decrementer */
284 { "dsisr", 18 }, /* Data Storage Interrupt Status Register */
286 { "f.0", 0 }, /* Floating point registers */
354 { "lr", 8 }, /* Link Register */
358 { "r.0", 0 }, /* General Purpose Registers */
391 { "r.sp", 1 }, /* Stack Pointer */
393 { "r.toc", 2 }, /* Pointer to the table of contents */
395 { "r0", 0 }, /* More general purpose registers */
428 { "rtoc", 2 }, /* Table of contents */
430 { "sdr1", 25 }, /* Storage Description Register 1 */
434 { "srr0", 26 }, /* Machine Status Save/Restore Register 0 */
435 { "srr1", 27 }, /* Machine Status Save/Restore Register 1 */
441 #define REG_NAME_CNT (sizeof(pre_defined_registers) / sizeof(struct pd_reg))
443 /* Given NAME, find the register number associated with that name, return
444 the integer value associated with the given name or -1 on failure. */
446 static int reg_name_search
447 PARAMS ((const struct pd_reg *, int, const char * name));
450 reg_name_search (regs, regcount, name)
451 const struct pd_reg *regs;
455 int middle, low, high;
463 middle = (low + high) / 2;
464 cmp = strcasecmp (name, regs[middle].name);
470 return regs[middle].value;
478 * Summary of register_name().
480 * in: Input_line_pointer points to 1st char of operand.
482 * out: A expressionS.
483 * The operand may have been a register: in this case, X_op == O_register,
484 * X_add_number is set to the register number, and truth is returned.
485 * Input_line_pointer->(next non-blank) char after operand, or is in its
490 register_name (expressionP)
491 expressionS *expressionP;
498 /* Find the spelling of the operand */
499 start = name = input_line_pointer;
500 if (name[0] == '%' && isalpha (name[1]))
501 name = ++input_line_pointer;
503 else if (!reg_names_p || !isalpha (name[0]))
506 c = get_symbol_end ();
507 reg_number = reg_name_search (pre_defined_registers, REG_NAME_CNT, name);
509 /* look to see if it's in the register table */
512 expressionP->X_op = O_register;
513 expressionP->X_add_number = reg_number;
515 /* make the rest nice */
516 expressionP->X_add_symbol = NULL;
517 expressionP->X_op_symbol = NULL;
518 *input_line_pointer = c; /* put back the delimiting char */
523 /* reset the line as if we had not done anything */
524 *input_line_pointer = c; /* put back the delimiting char */
525 input_line_pointer = start; /* reset input_line pointer */
530 /* This function is called for each symbol seen in an expression. It
531 handles the special parsing which PowerPC assemblers are supposed
532 to use for condition codes. */
534 /* Whether to do the special parsing. */
535 static boolean cr_operand;
537 /* Names to recognize in a condition code. This table is sorted. */
538 static const struct pd_reg cr_names[] =
555 /* Parsing function. This returns non-zero if it recognized an
559 ppc_parse_name (name, expr)
568 val = reg_name_search (cr_names, sizeof cr_names / sizeof cr_names[0],
573 expr->X_op = O_constant;
574 expr->X_add_number = val;
579 /* Local variables. */
581 /* The type of processor we are assembling for. This is one or more
582 of the PPC_OPCODE flags defined in opcode/ppc.h. */
583 static int ppc_cpu = 0;
585 /* The size of the processor we are assembling for. This is either
586 PPC_OPCODE_32 or PPC_OPCODE_64. */
587 static int ppc_size = PPC_OPCODE_32;
589 /* Opcode hash table. */
590 static struct hash_control *ppc_hash;
592 /* Macro hash table. */
593 static struct hash_control *ppc_macro_hash;
596 /* What type of shared library support to use */
597 static enum { SHLIB_NONE, SHLIB_PIC, SHILB_MRELOCATABLE } shlib = SHLIB_NONE;
599 /* Flags to set in the elf header */
600 static flagword ppc_flags = 0;
602 /* Whether this is Solaris or not. */
603 #ifdef TARGET_SOLARIS_COMMENT
604 #define SOLARIS_P true
606 #define SOLARIS_P false
609 static boolean msolaris = SOLARIS_P;
614 /* The RS/6000 assembler uses the .csect pseudo-op to generate code
615 using a bunch of different sections. These assembler sections,
616 however, are all encompassed within the .text or .data sections of
617 the final output file. We handle this by using different
618 subsegments within these main segments. */
620 /* Next subsegment to allocate within the .text segment. */
621 static subsegT ppc_text_subsegment = 2;
623 /* Linked list of csects in the text section. */
624 static symbolS *ppc_text_csects;
626 /* Next subsegment to allocate within the .data segment. */
627 static subsegT ppc_data_subsegment = 2;
629 /* Linked list of csects in the data section. */
630 static symbolS *ppc_data_csects;
632 /* The current csect. */
633 static symbolS *ppc_current_csect;
635 /* The RS/6000 assembler uses a TOC which holds addresses of functions
636 and variables. Symbols are put in the TOC with the .tc pseudo-op.
637 A special relocation is used when accessing TOC entries. We handle
638 the TOC as a subsegment within the .data segment. We set it up if
639 we see a .toc pseudo-op, and save the csect symbol here. */
640 static symbolS *ppc_toc_csect;
642 /* The first frag in the TOC subsegment. */
643 static fragS *ppc_toc_frag;
645 /* The first frag in the first subsegment after the TOC in the .data
646 segment. NULL if there are no subsegments after the TOC. */
647 static fragS *ppc_after_toc_frag;
649 /* The current static block. */
650 static symbolS *ppc_current_block;
652 /* The COFF debugging section; set by md_begin. This is not the
653 .debug section, but is instead the secret BFD section which will
654 cause BFD to set the section number of a symbol to N_DEBUG. */
655 static asection *ppc_coff_debug_section;
657 #endif /* OBJ_XCOFF */
661 /* Various sections that we need for PE coff support. */
662 static segT ydata_section;
663 static segT pdata_section;
664 static segT reldata_section;
665 static segT rdata_section;
666 static segT tocdata_section;
668 /* The current section and the previous section. See ppc_previous. */
669 static segT ppc_previous_section;
670 static segT ppc_current_section;
675 symbolS *GOT_symbol; /* Pre-defined "_GLOBAL_OFFSET_TABLE" */
678 #ifndef WORKING_DOT_WORD
679 const int md_short_jump_size = 4;
680 const int md_long_jump_size = 4;
684 CONST char *md_shortopts = "b:l:usm:K:VQ:";
686 CONST char *md_shortopts = "um:";
688 struct option md_longopts[] = {
689 {NULL, no_argument, NULL, 0}
691 size_t md_longopts_size = sizeof(md_longopts);
694 md_parse_option (c, arg)
701 /* -u means that any undefined symbols should be treated as
702 external, which is the default for gas anyhow. */
707 /* Solaris as takes -le (presumably for little endian). For completeness
708 sake, recognize -be also. */
709 if (strcmp (arg, "e") == 0)
711 target_big_endian = 0;
712 set_target_endian = 1;
720 if (strcmp (arg, "e") == 0)
722 target_big_endian = 1;
723 set_target_endian = 1;
731 /* Recognize -K PIC */
732 if (strcmp (arg, "PIC") == 0 || strcmp (arg, "pic") == 0)
735 ppc_flags |= EF_PPC_RELOCATABLE_LIB;
744 /* -mpwrx and -mpwr2 mean to assemble for the IBM POWER/2
746 if (strcmp (arg, "pwrx") == 0 || strcmp (arg, "pwr2") == 0)
747 ppc_cpu = PPC_OPCODE_POWER | PPC_OPCODE_POWER2;
748 /* -mpwr means to assemble for the IBM POWER (RIOS1). */
749 else if (strcmp (arg, "pwr") == 0)
750 ppc_cpu = PPC_OPCODE_POWER;
751 /* -m601 means to assemble for the Motorola PowerPC 601, which includes
752 instructions that are holdovers from the Power. */
753 else if (strcmp (arg, "601") == 0)
754 ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_601;
755 /* -mppc, -mppc32, -m603, and -m604 mean to assemble for the
756 Motorola PowerPC 603/604. */
757 else if (strcmp (arg, "ppc") == 0
758 || strcmp (arg, "ppc32") == 0
759 || strcmp (arg, "403") == 0
760 || strcmp (arg, "603") == 0
761 || strcmp (arg, "604") == 0)
762 ppc_cpu = PPC_OPCODE_PPC;
763 /* -mppc64 and -m620 mean to assemble for the 64-bit PowerPC
765 else if (strcmp (arg, "ppc64") == 0 || strcmp (arg, "620") == 0)
767 ppc_cpu = PPC_OPCODE_PPC;
768 ppc_size = PPC_OPCODE_64;
770 /* -mcom means assemble for the common intersection between Power
771 and PowerPC. At present, we just allow the union, rather
772 than the intersection. */
773 else if (strcmp (arg, "com") == 0)
774 ppc_cpu = PPC_OPCODE_COMMON;
775 /* -many means to assemble for any architecture (PWR/PWRX/PPC). */
776 else if (strcmp (arg, "any") == 0)
777 ppc_cpu = PPC_OPCODE_ANY;
779 else if (strcmp (arg, "regnames") == 0)
782 else if (strcmp (arg, "no-regnames") == 0)
786 /* -mrelocatable/-mrelocatable-lib -- warn about initializations that require relocation */
787 else if (strcmp (arg, "relocatable") == 0)
789 shlib = SHILB_MRELOCATABLE;
790 ppc_flags |= EF_PPC_RELOCATABLE;
793 else if (strcmp (arg, "relocatable-lib") == 0)
795 shlib = SHILB_MRELOCATABLE;
796 ppc_flags |= EF_PPC_RELOCATABLE_LIB;
799 /* -memb, set embedded bit */
800 else if (strcmp (arg, "emb") == 0)
801 ppc_flags |= EF_PPC_EMB;
803 /* -mlittle/-mbig set the endianess */
804 else if (strcmp (arg, "little") == 0 || strcmp (arg, "little-endian") == 0)
806 target_big_endian = 0;
807 set_target_endian = 1;
810 else if (strcmp (arg, "big") == 0 || strcmp (arg, "big-endian") == 0)
812 target_big_endian = 1;
813 set_target_endian = 1;
816 else if (strcmp (arg, "solaris") == 0)
819 ppc_comment_chars = ppc_solaris_comment_chars;
822 else if (strcmp (arg, "no-solaris") == 0)
825 ppc_comment_chars = ppc_eabi_comment_chars;
830 as_bad ("invalid switch -m%s", arg);
836 /* -V: SVR4 argument to print version ID. */
841 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
842 should be emitted or not. FIXME: Not implemented. */
846 /* Solaris takes -s to specify that .stabs go in a .stabs section,
847 rather than .stabs.excl, which is ignored by the linker.
848 FIXME: Not implemented. */
864 md_show_usage (stream)
870 -mpwrx, -mpwr2 generate code for IBM POWER/2 (RIOS2)\n\
871 -mpwr generate code for IBM POWER (RIOS1)\n\
872 -m601 generate code for Motorola PowerPC 601\n\
873 -mppc, -mppc32, -m403, -m603, -m604\n\
874 generate code for Motorola PowerPC 603/604\n\
875 -mppc64, -m620 generate code for Motorola PowerPC 620\n\
876 -mcom generate code Power/PowerPC common instructions\n\
877 -many generate code for any architecture (PWR/PWRX/PPC)\n\
878 -mregnames Allow symbolic names for registers\n\
879 -mno-regnames Do not allow symbolic names for registers\n");
882 -mrelocatable support for GCC's -mrelocatble option\n\
883 -mrelocatable-lib support for GCC's -mrelocatble-lib option\n\
884 -memb set PPC_EMB bit in ELF flags\n\
885 -mlittle, -mlittle-endian\n\
886 generate code for a little endian machine\n\
887 -mbig, -mbig-endian generate code for a big endian machine\n\
888 -msolaris generate code for Solaris\n\
889 -mno-solaris do not generate code for Solaris\n\
890 -V print assembler version number\n\
891 -Qy, -Qn ignored\n");
895 /* Set ppc_cpu if it is not already set. */
900 const char *default_os = TARGET_OS;
901 const char *default_cpu = TARGET_CPU;
905 if (strncmp (default_os, "aix", 3) == 0
906 && default_os[3] >= '4' && default_os[3] <= '9')
907 ppc_cpu = PPC_OPCODE_COMMON;
908 else if (strncmp (default_os, "aix3", 4) == 0)
909 ppc_cpu = PPC_OPCODE_POWER;
910 else if (strcmp (default_cpu, "rs6000") == 0)
911 ppc_cpu = PPC_OPCODE_POWER;
912 else if (strcmp (default_cpu, "powerpc") == 0
913 || strcmp (default_cpu, "powerpcle") == 0)
914 ppc_cpu = PPC_OPCODE_PPC;
916 as_fatal ("Unknown default cpu = %s, os = %s", default_cpu, default_os);
920 /* Figure out the BFD architecture to use. */
922 enum bfd_architecture
925 const char *default_cpu = TARGET_CPU;
928 if ((ppc_cpu & PPC_OPCODE_PPC) != 0)
929 return bfd_arch_powerpc;
930 else if ((ppc_cpu & PPC_OPCODE_POWER) != 0)
931 return bfd_arch_rs6000;
932 else if ((ppc_cpu & (PPC_OPCODE_COMMON | PPC_OPCODE_ANY)) != 0)
934 if (strcmp (default_cpu, "rs6000") == 0)
935 return bfd_arch_rs6000;
936 else if (strcmp (default_cpu, "powerpc") == 0
937 || strcmp (default_cpu, "powerpcle") == 0)
938 return bfd_arch_powerpc;
941 as_fatal ("Neither Power nor PowerPC opcodes were selected.");
942 return bfd_arch_unknown;
945 /* This function is called when the assembler starts up. It is called
946 after the options have been parsed and the output file has been
952 register const struct powerpc_opcode *op;
953 const struct powerpc_opcode *op_end;
954 const struct powerpc_macro *macro;
955 const struct powerpc_macro *macro_end;
956 boolean dup_insn = false;
961 /* Set the ELF flags if desired. */
962 if (ppc_flags && !msolaris)
963 bfd_set_private_flags (stdoutput, ppc_flags);
966 /* Insert the opcodes into a hash table. */
967 ppc_hash = hash_new ();
969 op_end = powerpc_opcodes + powerpc_num_opcodes;
970 for (op = powerpc_opcodes; op < op_end; op++)
972 know ((op->opcode & op->mask) == op->opcode);
974 if ((op->flags & ppc_cpu) != 0
975 && ((op->flags & (PPC_OPCODE_32 | PPC_OPCODE_64)) == 0
976 || (op->flags & (PPC_OPCODE_32 | PPC_OPCODE_64)) == ppc_size))
980 retval = hash_insert (ppc_hash, op->name, (PTR) op);
981 if (retval != (const char *) NULL)
983 /* Ignore Power duplicates for -m601 */
984 if ((ppc_cpu & PPC_OPCODE_601) != 0
985 && (op->flags & PPC_OPCODE_POWER) != 0)
988 as_bad ("Internal assembler error for instruction %s", op->name);
994 /* Insert the macros into a hash table. */
995 ppc_macro_hash = hash_new ();
997 macro_end = powerpc_macros + powerpc_num_macros;
998 for (macro = powerpc_macros; macro < macro_end; macro++)
1000 if ((macro->flags & ppc_cpu) != 0)
1004 retval = hash_insert (ppc_macro_hash, macro->name, (PTR) macro);
1005 if (retval != (const char *) NULL)
1007 as_bad ("Internal assembler error for macro %s", macro->name);
1016 /* Tell the main code what the endianness is if it is not overidden by the user. */
1017 if (!set_target_endian)
1019 set_target_endian = 1;
1020 target_big_endian = PPC_BIG_ENDIAN;
1024 ppc_coff_debug_section = coff_section_from_bfd_index (stdoutput, N_DEBUG);
1026 /* Create dummy symbols to serve as initial csects. This forces the
1027 text csects to precede the data csects. These symbols will not
1029 ppc_text_csects = symbol_make ("dummy\001");
1030 ppc_text_csects->sy_tc.within = ppc_text_csects;
1031 ppc_data_csects = symbol_make ("dummy\001");
1032 ppc_data_csects->sy_tc.within = ppc_data_csects;
1037 ppc_current_section = text_section;
1038 ppc_previous_section = 0;
1043 /* Insert an operand value into an instruction. */
1045 static unsigned long
1046 ppc_insert_operand (insn, operand, val, file, line)
1048 const struct powerpc_operand *operand;
1053 if (operand->bits != 32)
1058 if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
1060 if ((operand->flags & PPC_OPERAND_SIGNOPT) != 0
1061 && ppc_size == PPC_OPCODE_32)
1062 max = (1 << operand->bits) - 1;
1064 max = (1 << (operand->bits - 1)) - 1;
1065 min = - (1 << (operand->bits - 1));
1067 if (ppc_size == PPC_OPCODE_32)
1069 /* Some people write 32 bit hex constants with the sign
1070 extension done by hand. This shouldn't really be
1071 valid, but, to permit this code to assemble on a 64
1072 bit host, we sign extend the 32 bit value. */
1074 && (val & 0x80000000) != 0
1075 && (val & 0xffffffff) == val)
1084 max = (1 << operand->bits) - 1;
1088 if ((operand->flags & PPC_OPERAND_NEGATIVE) != 0)
1093 if (test < (offsetT) min || test > (offsetT) max)
1096 "operand out of range (%s not between %ld and %ld)";
1099 sprint_value (buf, test);
1100 if (file == (char *) NULL)
1101 as_bad (err, buf, min, max);
1103 as_bad_where (file, line, err, buf, min, max);
1107 if (operand->insert)
1112 insn = (*operand->insert) (insn, (long) val, &errmsg);
1113 if (errmsg != (const char *) NULL)
1117 insn |= (((long) val & ((1 << operand->bits) - 1))
1125 /* Parse @got, etc. and return the desired relocation. */
1126 static bfd_reloc_code_real_type
1127 ppc_elf_suffix (str_p, exp_p)
1134 bfd_reloc_code_real_type reloc;
1142 struct map_bfd *ptr;
1144 #define MAP(str,reloc) { str, sizeof(str)-1, reloc }
1146 static struct map_bfd mapping[] = {
1147 MAP ("l", BFD_RELOC_LO16),
1148 MAP ("h", BFD_RELOC_HI16),
1149 MAP ("ha", BFD_RELOC_HI16_S),
1150 MAP ("brtaken", BFD_RELOC_PPC_B16_BRTAKEN),
1151 MAP ("brntaken", BFD_RELOC_PPC_B16_BRNTAKEN),
1152 MAP ("got", BFD_RELOC_16_GOTOFF),
1153 MAP ("got@l", BFD_RELOC_LO16_GOTOFF),
1154 MAP ("got@h", BFD_RELOC_HI16_GOTOFF),
1155 MAP ("got@ha", BFD_RELOC_HI16_S_GOTOFF),
1156 MAP ("fixup", BFD_RELOC_CTOR), /* warnings with -mrelocatable */
1157 MAP ("plt", BFD_RELOC_24_PLT_PCREL),
1158 MAP ("pltrel24", BFD_RELOC_24_PLT_PCREL),
1159 MAP ("copy", BFD_RELOC_PPC_COPY),
1160 MAP ("globdat", BFD_RELOC_PPC_GLOB_DAT),
1161 MAP ("local24pc", BFD_RELOC_PPC_LOCAL24PC),
1162 MAP ("local", BFD_RELOC_PPC_LOCAL24PC),
1163 MAP ("pltrel", BFD_RELOC_32_PLT_PCREL),
1164 MAP ("plt@l", BFD_RELOC_LO16_PLTOFF),
1165 MAP ("plt@h", BFD_RELOC_HI16_PLTOFF),
1166 MAP ("plt@ha", BFD_RELOC_HI16_S_PLTOFF),
1167 MAP ("sdarel", BFD_RELOC_GPREL16),
1168 MAP ("sectoff", BFD_RELOC_32_BASEREL),
1169 MAP ("sectoff@l", BFD_RELOC_LO16_BASEREL),
1170 MAP ("sectoff@h", BFD_RELOC_HI16_BASEREL),
1171 MAP ("sectoff@ha", BFD_RELOC_HI16_S_BASEREL),
1172 MAP ("naddr", BFD_RELOC_PPC_EMB_NADDR32),
1173 MAP ("naddr16", BFD_RELOC_PPC_EMB_NADDR16),
1174 MAP ("naddr@l", BFD_RELOC_PPC_EMB_NADDR16_LO),
1175 MAP ("naddr@h", BFD_RELOC_PPC_EMB_NADDR16_HI),
1176 MAP ("naddr@ha", BFD_RELOC_PPC_EMB_NADDR16_HA),
1177 MAP ("sdai16", BFD_RELOC_PPC_EMB_SDAI16),
1178 MAP ("sda2rel", BFD_RELOC_PPC_EMB_SDA2REL),
1179 MAP ("sda2i16", BFD_RELOC_PPC_EMB_SDA2I16),
1180 MAP ("sda21", BFD_RELOC_PPC_EMB_SDA21),
1181 MAP ("mrkref", BFD_RELOC_PPC_EMB_MRKREF),
1182 MAP ("relsect", BFD_RELOC_PPC_EMB_RELSEC16),
1183 MAP ("relsect@l", BFD_RELOC_PPC_EMB_RELST_LO),
1184 MAP ("relsect@h", BFD_RELOC_PPC_EMB_RELST_HI),
1185 MAP ("relsect@ha", BFD_RELOC_PPC_EMB_RELST_HA),
1186 MAP ("bitfld", BFD_RELOC_PPC_EMB_BIT_FLD),
1187 MAP ("relsda", BFD_RELOC_PPC_EMB_RELSDA),
1188 MAP ("xgot", BFD_RELOC_PPC_TOC16),
1190 { (char *)0, 0, BFD_RELOC_UNUSED }
1194 return BFD_RELOC_UNUSED;
1196 for (ch = *str, str2 = ident;
1197 (str2 < ident + sizeof (ident) - 1
1198 && (isalnum (ch) || ch == '@'));
1201 *str2++ = (islower (ch)) ? ch : tolower (ch);
1208 for (ptr = &mapping[0]; ptr->length > 0; ptr++)
1209 if (ch == ptr->string[0]
1210 && len == ptr->length
1211 && memcmp (ident, ptr->string, ptr->length) == 0)
1213 if (exp_p->X_add_number != 0
1214 && (ptr->reloc == BFD_RELOC_16_GOTOFF
1215 || ptr->reloc == BFD_RELOC_LO16_GOTOFF
1216 || ptr->reloc == BFD_RELOC_HI16_GOTOFF
1217 || ptr->reloc == BFD_RELOC_HI16_S_GOTOFF))
1218 as_warn ("identifier+constant@got means identifier@got+constant");
1220 /* Now check for identifier@suffix+constant */
1221 if (*str == '-' || *str == '+')
1223 char *orig_line = input_line_pointer;
1224 expressionS new_exp;
1226 input_line_pointer = str;
1227 expression (&new_exp);
1228 if (new_exp.X_op == O_constant)
1230 exp_p->X_add_number += new_exp.X_add_number;
1231 str = input_line_pointer;
1234 if (&input_line_pointer != str_p)
1235 input_line_pointer = orig_line;
1242 return BFD_RELOC_UNUSED;
1245 /* Like normal .long/.short/.word, except support @got, etc. */
1246 /* clobbers input_line_pointer, checks */
1249 ppc_elf_cons (nbytes)
1250 register int nbytes; /* 1=.byte, 2=.word, 4=.long */
1253 bfd_reloc_code_real_type reloc;
1255 if (is_it_end_of_statement ())
1257 demand_empty_rest_of_line ();
1264 if (exp.X_op == O_symbol
1265 && *input_line_pointer == '@'
1266 && (reloc = ppc_elf_suffix (&input_line_pointer, &exp)) != BFD_RELOC_UNUSED)
1268 reloc_howto_type *reloc_howto = bfd_reloc_type_lookup (stdoutput, reloc);
1269 int size = bfd_get_reloc_size (reloc_howto);
1272 as_bad ("%s relocations do not fit in %d bytes\n", reloc_howto->name, nbytes);
1276 register char *p = frag_more ((int) nbytes);
1277 int offset = nbytes - size;
1279 fix_new_exp (frag_now, p - frag_now->fr_literal + offset, size, &exp, 0, reloc);
1283 emit_expr (&exp, (unsigned int) nbytes);
1285 while (*input_line_pointer++ == ',');
1287 input_line_pointer--; /* Put terminator back into stream. */
1288 demand_empty_rest_of_line ();
1291 /* Solaris pseduo op to change to the .rodata section. */
1296 char *save_line = input_line_pointer;
1297 static char section[] = ".rodata\n";
1299 /* Just pretend this is .section .rodata */
1300 input_line_pointer = section;
1301 obj_elf_section (xxx);
1303 input_line_pointer = save_line;
1306 /* Pseudo op to make file scope bss items */
1311 register char *name;
1315 register symbolS *symbolP;
1322 name = input_line_pointer;
1323 c = get_symbol_end ();
1325 /* just after name is now '\0' */
1326 p = input_line_pointer;
1329 if (*input_line_pointer != ',')
1331 as_bad ("Expected comma after symbol-name: rest of line ignored.");
1332 ignore_rest_of_line ();
1336 input_line_pointer++; /* skip ',' */
1337 if ((size = get_absolute_expression ()) < 0)
1339 as_warn (".COMMon length (%ld.) <0! Ignored.", (long) size);
1340 ignore_rest_of_line ();
1344 /* The third argument to .lcomm is the alignment. */
1345 if (*input_line_pointer != ',')
1349 ++input_line_pointer;
1350 align = get_absolute_expression ();
1353 as_warn ("ignoring bad alignment");
1359 symbolP = symbol_find_or_make (name);
1362 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
1364 as_bad ("Ignoring attempt to re-define symbol `%s'.",
1365 S_GET_NAME (symbolP));
1366 ignore_rest_of_line ();
1370 if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size)
1372 as_bad ("Length of .lcomm \"%s\" is already %ld. Not changed to %ld.",
1373 S_GET_NAME (symbolP),
1374 (long) S_GET_VALUE (symbolP),
1377 ignore_rest_of_line ();
1383 old_subsec = now_subseg;
1386 /* convert to a power of 2 alignment */
1387 for (align2 = 0; (align & 1) == 0; align >>= 1, ++align2);
1390 as_bad ("Common alignment not a power of 2");
1391 ignore_rest_of_line ();
1398 record_alignment (bss_section, align2);
1399 subseg_set (bss_section, 0);
1401 frag_align (align2, 0, 0);
1402 if (S_GET_SEGMENT (symbolP) == bss_section)
1403 symbolP->sy_frag->fr_symbol = 0;
1404 symbolP->sy_frag = frag_now;
1405 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, size,
1408 S_SET_SIZE (symbolP, size);
1409 S_SET_SEGMENT (symbolP, bss_section);
1410 subseg_set (old_sec, old_subsec);
1411 demand_empty_rest_of_line ();
1414 /* Validate any relocations emitted for -mrelocatable, possibly adding
1415 fixups for word relocations in writable segments, so we can adjust
1418 ppc_elf_validate_fix (fixp, seg)
1422 if (fixp->fx_done || fixp->fx_pcrel)
1431 case SHILB_MRELOCATABLE:
1432 if (fixp->fx_r_type <= BFD_RELOC_UNUSED
1433 && fixp->fx_r_type != BFD_RELOC_16_GOTOFF
1434 && fixp->fx_r_type != BFD_RELOC_HI16_GOTOFF
1435 && fixp->fx_r_type != BFD_RELOC_LO16_GOTOFF
1436 && fixp->fx_r_type != BFD_RELOC_HI16_S_GOTOFF
1437 && fixp->fx_r_type != BFD_RELOC_32_BASEREL
1438 && fixp->fx_r_type != BFD_RELOC_LO16_BASEREL
1439 && fixp->fx_r_type != BFD_RELOC_HI16_BASEREL
1440 && fixp->fx_r_type != BFD_RELOC_HI16_S_BASEREL
1441 && strcmp (segment_name (seg), ".got2") != 0
1442 && strcmp (segment_name (seg), ".dtors") != 0
1443 && strcmp (segment_name (seg), ".ctors") != 0
1444 && strcmp (segment_name (seg), ".fixup") != 0
1445 && strcmp (segment_name (seg), ".stab") != 0
1446 && strcmp (segment_name (seg), ".gcc_except_table") != 0
1447 && strcmp (segment_name (seg), ".ex_shared") != 0)
1449 if ((seg->flags & (SEC_READONLY | SEC_CODE)) != 0
1450 || fixp->fx_r_type != BFD_RELOC_CTOR)
1452 as_bad_where (fixp->fx_file, fixp->fx_line,
1453 "Relocation cannot be done when using -mrelocatable");
1459 #endif /* OBJ_ELF */
1464 * Summary of parse_toc_entry().
1466 * in: Input_line_pointer points to the '[' in one of:
1468 * [toc] [tocv] [toc32] [toc64]
1470 * Anything else is an error of one kind or another.
1473 * return value: success or failure
1474 * toc_kind: kind of toc reference
1475 * input_line_pointer:
1476 * success: first char after the ']'
1477 * failure: unchanged
1481 * [toc] - rv == success, toc_kind = default_toc
1482 * [tocv] - rv == success, toc_kind = data_in_toc
1483 * [toc32] - rv == success, toc_kind = must_be_32
1484 * [toc64] - rv == success, toc_kind = must_be_64
1488 enum toc_size_qualifier
1490 default_toc, /* The toc cell constructed should be the system default size */
1491 data_in_toc, /* This is a direct reference to a toc cell */
1492 must_be_32, /* The toc cell constructed must be 32 bits wide */
1493 must_be_64 /* The toc cell constructed must be 64 bits wide */
1497 parse_toc_entry(toc_kind)
1498 enum toc_size_qualifier *toc_kind;
1503 enum toc_size_qualifier t;
1505 /* save the input_line_pointer */
1506 start = input_line_pointer;
1508 /* skip over the '[' , and whitespace */
1509 ++input_line_pointer;
1512 /* find the spelling of the operand */
1513 toc_spec = input_line_pointer;
1514 c = get_symbol_end ();
1516 if (strcmp(toc_spec, "toc") == 0)
1520 else if (strcmp(toc_spec, "tocv") == 0)
1524 else if (strcmp(toc_spec, "toc32") == 0)
1528 else if (strcmp(toc_spec, "toc64") == 0)
1534 as_bad ("syntax error: invalid toc specifier `%s'", toc_spec);
1535 *input_line_pointer = c; /* put back the delimiting char */
1536 input_line_pointer = start; /* reset input_line pointer */
1540 /* now find the ']' */
1541 *input_line_pointer = c; /* put back the delimiting char */
1543 SKIP_WHITESPACE (); /* leading whitespace could be there. */
1544 c = *input_line_pointer++; /* input_line_pointer->past char in c. */
1548 as_bad ("syntax error: expected `]', found `%c'", c);
1549 input_line_pointer = start; /* reset input_line pointer */
1553 *toc_kind = t; /* set return value */
1559 /* We need to keep a list of fixups. We can't simply generate them as
1560 we go, because that would require us to first create the frag, and
1561 that would screw up references to ``.''. */
1567 bfd_reloc_code_real_type reloc;
1570 #define MAX_INSN_FIXUPS (5)
1572 /* This routine is called for each instruction to be assembled. */
1579 const struct powerpc_opcode *opcode;
1581 const unsigned char *opindex_ptr;
1585 struct ppc_fixup fixups[MAX_INSN_FIXUPS];
1590 bfd_reloc_code_real_type reloc;
1593 /* Get the opcode. */
1594 for (s = str; *s != '\0' && ! isspace (*s); s++)
1599 /* Look up the opcode in the hash table. */
1600 opcode = (const struct powerpc_opcode *) hash_find (ppc_hash, str);
1601 if (opcode == (const struct powerpc_opcode *) NULL)
1603 const struct powerpc_macro *macro;
1605 macro = (const struct powerpc_macro *) hash_find (ppc_macro_hash, str);
1606 if (macro == (const struct powerpc_macro *) NULL)
1607 as_bad ("Unrecognized opcode: `%s'", str);
1609 ppc_macro (s, macro);
1614 insn = opcode->opcode;
1617 while (isspace (*str))
1620 /* PowerPC operands are just expressions. The only real issue is
1621 that a few operand types are optional. All cases which might use
1622 an optional operand separate the operands only with commas (in
1623 some cases parentheses are used, as in ``lwz 1,0(1)'' but such
1624 cases never have optional operands). There is never more than
1625 one optional operand for an instruction. So, before we start
1626 seriously parsing the operands, we check to see if we have an
1627 optional operand, and, if we do, we count the number of commas to
1628 see whether the operand should be omitted. */
1630 for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
1632 const struct powerpc_operand *operand;
1634 operand = &powerpc_operands[*opindex_ptr];
1635 if ((operand->flags & PPC_OPERAND_OPTIONAL) != 0)
1637 unsigned int opcount;
1639 /* There is an optional operand. Count the number of
1640 commas in the input line. */
1647 while ((s = strchr (s, ',')) != (char *) NULL)
1654 /* If there are fewer operands in the line then are called
1655 for by the instruction, we want to skip the optional
1657 if (opcount < strlen (opcode->operands))
1664 /* Gather the operands. */
1668 for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
1670 const struct powerpc_operand *operand;
1676 if (next_opindex == 0)
1677 operand = &powerpc_operands[*opindex_ptr];
1680 operand = &powerpc_operands[next_opindex];
1686 /* If this is a fake operand, then we do not expect anything
1688 if ((operand->flags & PPC_OPERAND_FAKE) != 0)
1690 insn = (*operand->insert) (insn, 0L, &errmsg);
1691 if (errmsg != (const char *) NULL)
1696 /* If this is an optional operand, and we are skipping it, just
1698 if ((operand->flags & PPC_OPERAND_OPTIONAL) != 0
1701 if (operand->insert)
1703 insn = (*operand->insert) (insn, 0L, &errmsg);
1704 if (errmsg != (const char *) NULL)
1707 if ((operand->flags & PPC_OPERAND_NEXT) != 0)
1708 next_opindex = *opindex_ptr + 1;
1712 /* Gather the operand. */
1713 hold = input_line_pointer;
1714 input_line_pointer = str;
1717 if (*input_line_pointer == '[')
1719 /* We are expecting something like the second argument here:
1721 lwz r4,[toc].GS.0.static_int(rtoc)
1722 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
1723 The argument following the `]' must be a symbol name, and the
1724 register must be the toc register: 'rtoc' or '2'
1726 The effect is to 0 as the displacement field
1727 in the instruction, and issue an IMAGE_REL_PPC_TOCREL16 (or
1728 the appropriate variation) reloc against it based on the symbol.
1729 The linker will build the toc, and insert the resolved toc offset.
1732 o The size of the toc entry is currently assumed to be
1733 32 bits. This should not be assumed to be a hard coded
1735 o In an effort to cope with a change from 32 to 64 bits,
1736 there are also toc entries that are specified to be
1737 either 32 or 64 bits:
1738 lwz r4,[toc32].GS.0.static_int(rtoc)
1739 lwz r4,[toc64].GS.0.static_int(rtoc)
1740 These demand toc entries of the specified size, and the
1741 instruction probably requires it.
1745 enum toc_size_qualifier toc_kind;
1746 bfd_reloc_code_real_type toc_reloc;
1748 /* go parse off the [tocXX] part */
1749 valid_toc = parse_toc_entry(&toc_kind);
1753 /* Note: message has already been issued. */
1754 /* FIXME: what sort of recovery should we do? */
1755 /* demand_rest_of_line(); return; ? */
1758 /* Now get the symbol following the ']' */
1764 /* In this case, we may not have seen the symbol yet, since */
1765 /* it is allowed to appear on a .extern or .globl or just be */
1766 /* a label in the .data section. */
1767 toc_reloc = BFD_RELOC_PPC_TOC16;
1770 /* 1. The symbol must be defined and either in the toc */
1771 /* section, or a global. */
1772 /* 2. The reloc generated must have the TOCDEFN flag set in */
1773 /* upper bit mess of the reloc type. */
1774 /* FIXME: It's a little confusing what the tocv qualifier can */
1775 /* be used for. At the very least, I've seen three */
1776 /* uses, only one of which I'm sure I can explain. */
1777 if (ex.X_op == O_symbol)
1779 assert (ex.X_add_symbol != NULL);
1780 if (ex.X_add_symbol->bsym->section != tocdata_section)
1782 as_bad("[tocv] symbol is not a toc symbol");
1786 toc_reloc = BFD_RELOC_PPC_TOC16;
1789 /* FIXME: these next two specifically specify 32/64 bit toc */
1790 /* entries. We don't support them today. Is this the */
1791 /* right way to say that? */
1792 toc_reloc = BFD_RELOC_UNUSED;
1793 as_bad ("Unimplemented toc32 expression modifier");
1796 /* FIXME: see above */
1797 toc_reloc = BFD_RELOC_UNUSED;
1798 as_bad ("Unimplemented toc64 expression modifier");
1802 "Unexpected return value [%d] from parse_toc_entry!\n",
1808 /* We need to generate a fixup for this expression. */
1809 if (fc >= MAX_INSN_FIXUPS)
1810 as_fatal ("too many fixups");
1812 fixups[fc].reloc = toc_reloc;
1813 fixups[fc].exp = ex;
1814 fixups[fc].opindex = *opindex_ptr;
1817 /* Ok. We've set up the fixup for the instruction. Now make it
1818 look like the constant 0 was found here */
1820 ex.X_op = O_constant;
1821 ex.X_add_number = 0;
1822 ex.X_add_symbol = NULL;
1823 ex.X_op_symbol = NULL;
1829 if (! register_name (&ex))
1831 if ((operand->flags & PPC_OPERAND_CR) != 0)
1838 str = input_line_pointer;
1839 input_line_pointer = hold;
1841 if (ex.X_op == O_illegal)
1842 as_bad ("illegal operand");
1843 else if (ex.X_op == O_absent)
1844 as_bad ("missing operand");
1845 else if (ex.X_op == O_register)
1847 insn = ppc_insert_operand (insn, operand, ex.X_add_number,
1850 else if (ex.X_op == O_constant)
1853 /* Allow @HA, @L, @H on constants. */
1854 char *orig_str = str;
1856 if ((reloc = ppc_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED)
1863 case BFD_RELOC_LO16:
1864 /* X_unsigned is the default, so if the user has done
1865 something which cleared it, we always produce a
1868 && (operand->flags & PPC_OPERAND_SIGNED) == 0)
1869 ex.X_add_number &= 0xffff;
1871 ex.X_add_number = (((ex.X_add_number & 0xffff)
1876 case BFD_RELOC_HI16:
1877 ex.X_add_number = (ex.X_add_number >> 16) & 0xffff;
1880 case BFD_RELOC_HI16_S:
1881 ex.X_add_number = (((ex.X_add_number >> 16) & 0xffff)
1882 + ((ex.X_add_number >> 15) & 1));
1886 insn = ppc_insert_operand (insn, operand, ex.X_add_number,
1890 else if ((reloc = ppc_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED)
1892 /* For the absoulte forms of branchs, convert the PC relative form back into
1894 if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0)
1898 case BFD_RELOC_PPC_B26:
1899 reloc = BFD_RELOC_PPC_BA26;
1901 case BFD_RELOC_PPC_B16:
1902 reloc = BFD_RELOC_PPC_BA16;
1904 case BFD_RELOC_PPC_B16_BRTAKEN:
1905 reloc = BFD_RELOC_PPC_BA16_BRTAKEN;
1907 case BFD_RELOC_PPC_B16_BRNTAKEN:
1908 reloc = BFD_RELOC_PPC_BA16_BRNTAKEN;
1915 /* We need to generate a fixup for this expression. */
1916 if (fc >= MAX_INSN_FIXUPS)
1917 as_fatal ("too many fixups");
1918 fixups[fc].exp = ex;
1919 fixups[fc].opindex = 0;
1920 fixups[fc].reloc = reloc;
1923 #endif /* OBJ_ELF */
1927 /* We need to generate a fixup for this expression. */
1928 if (fc >= MAX_INSN_FIXUPS)
1929 as_fatal ("too many fixups");
1930 fixups[fc].exp = ex;
1931 fixups[fc].opindex = *opindex_ptr;
1932 fixups[fc].reloc = BFD_RELOC_UNUSED;
1941 else if ((operand->flags & PPC_OPERAND_PARENS) != 0)
1949 /* The call to expression should have advanced str past any
1952 && (endc != ',' || *str != '\0'))
1954 as_bad ("syntax error; found `%c' but expected `%c'", *str, endc);
1962 while (isspace (*str))
1966 as_bad ("junk at end of line: `%s'", str);
1968 /* Write out the instruction. */
1970 md_number_to_chars (f, insn, 4);
1972 /* Create any fixups. At this point we do not use a
1973 bfd_reloc_code_real_type, but instead just use the
1974 BFD_RELOC_UNUSED plus the operand index. This lets us easily
1975 handle fixups for any operand type, although that is admittedly
1976 not a very exciting feature. We pick a BFD reloc type in
1978 for (i = 0; i < fc; i++)
1980 const struct powerpc_operand *operand;
1982 operand = &powerpc_operands[fixups[i].opindex];
1983 if (fixups[i].reloc != BFD_RELOC_UNUSED)
1985 reloc_howto_type *reloc_howto = bfd_reloc_type_lookup (stdoutput, fixups[i].reloc);
1993 size = bfd_get_reloc_size (reloc_howto);
1994 offset = target_big_endian ? (4 - size) : 0;
1996 if (size < 1 || size > 4)
1999 fixP = fix_new_exp (frag_now, f - frag_now->fr_literal + offset, size,
2000 &fixups[i].exp, reloc_howto->pc_relative,
2003 /* Turn off complaints that the addend is too large for things like
2005 switch (fixups[i].reloc)
2007 case BFD_RELOC_16_GOTOFF:
2008 case BFD_RELOC_PPC_TOC16:
2009 case BFD_RELOC_LO16:
2010 case BFD_RELOC_HI16:
2011 case BFD_RELOC_HI16_S:
2012 fixP->fx_no_overflow = 1;
2019 fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
2021 (operand->flags & PPC_OPERAND_RELATIVE) != 0,
2022 ((bfd_reloc_code_real_type)
2023 (fixups[i].opindex + (int) BFD_RELOC_UNUSED)));
2027 #ifndef WORKING_DOT_WORD
2028 /* Handle long and short jumps */
2030 md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
2032 addressT from_addr, to_addr;
2040 md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
2042 addressT from_addr, to_addr;
2050 /* Handle a macro. Gather all the operands, transform them as
2051 described by the macro, and call md_assemble recursively. All the
2052 operands are separated by commas; we don't accept parentheses
2053 around operands here. */
2056 ppc_macro (str, macro)
2058 const struct powerpc_macro *macro;
2069 /* Gather the users operands into the operands array. */
2074 if (count >= sizeof operands / sizeof operands[0])
2076 operands[count++] = s;
2077 s = strchr (s, ',');
2078 if (s == (char *) NULL)
2083 if (count != macro->operands)
2085 as_bad ("wrong number of operands");
2089 /* Work out how large the string must be (the size is unbounded
2090 because it includes user input). */
2092 format = macro->format;
2093 while (*format != '\0')
2102 arg = strtol (format + 1, &send, 10);
2103 know (send != format && arg >= 0 && arg < count);
2104 len += strlen (operands[arg]);
2109 /* Put the string together. */
2110 complete = s = (char *) alloca (len + 1);
2111 format = macro->format;
2112 while (*format != '\0')
2118 arg = strtol (format + 1, &send, 10);
2119 strcpy (s, operands[arg]);
2126 /* Assemble the constructed instruction. */
2127 md_assemble (complete);
2131 /* For ELF, add support for SHF_EXCLUDE and SHT_ORDERED */
2134 ppc_section_letter (letter, ptr_msg)
2141 *ptr_msg = "Bad .section directive: want a,w,x,e in string";
2146 ppc_section_word (ptr_str)
2149 if (strncmp (*ptr_str, "exclude", sizeof ("exclude")-1) == 0)
2151 *ptr_str += sizeof ("exclude")-1;
2159 ppc_section_type (ptr_str)
2162 if (strncmp (*ptr_str, "ordered", sizeof ("ordered")-1) == 0)
2164 *ptr_str += sizeof ("ordered")-1;
2172 ppc_section_flags (flags, attr, type)
2177 if (type == SHT_ORDERED)
2178 flags |= SEC_ALLOC | SEC_LOAD | SEC_SORT_ENTRIES;
2180 if (attr & SHF_EXCLUDE)
2181 flags |= SEC_EXCLUDE;
2185 #endif /* OBJ_ELF */
2188 /* Pseudo-op handling. */
2190 /* The .byte pseudo-op. This is similar to the normal .byte
2191 pseudo-op, but it can also take a single ASCII string. */
2197 if (*input_line_pointer != '\"')
2203 /* Gather characters. A real double quote is doubled. Unusual
2204 characters are not permitted. */
2205 ++input_line_pointer;
2210 c = *input_line_pointer++;
2214 if (*input_line_pointer != '\"')
2216 ++input_line_pointer;
2219 FRAG_APPEND_1_CHAR (c);
2222 demand_empty_rest_of_line ();
2227 /* XCOFF specific pseudo-op handling. */
2229 /* This is set if we are creating a .stabx symbol, since we don't want
2230 to handle symbol suffixes for such symbols. */
2231 static boolean ppc_stab_symbol;
2233 /* The .comm and .lcomm pseudo-ops for XCOFF. XCOFF puts common
2234 symbols in the .bss segment as though they were local common
2235 symbols, and uses a different smclas. */
2241 asection *current_seg = now_seg;
2242 subsegT current_subseg = now_subseg;
2248 symbolS *lcomm_sym = NULL;
2252 name = input_line_pointer;
2253 endc = get_symbol_end ();
2254 end_name = input_line_pointer;
2257 if (*input_line_pointer != ',')
2259 as_bad ("missing size");
2260 ignore_rest_of_line ();
2263 ++input_line_pointer;
2265 size = get_absolute_expression ();
2268 as_bad ("negative size");
2269 ignore_rest_of_line ();
2275 /* The third argument to .comm is the alignment. */
2276 if (*input_line_pointer != ',')
2280 ++input_line_pointer;
2281 align = get_absolute_expression ();
2284 as_warn ("ignoring bad alignment");
2303 /* The third argument to .lcomm appears to be the real local
2304 common symbol to create. References to the symbol named in
2305 the first argument are turned into references to the third
2307 if (*input_line_pointer != ',')
2309 as_bad ("missing real symbol name");
2310 ignore_rest_of_line ();
2313 ++input_line_pointer;
2315 lcomm_name = input_line_pointer;
2316 lcomm_endc = get_symbol_end ();
2318 lcomm_sym = symbol_find_or_make (lcomm_name);
2320 *input_line_pointer = lcomm_endc;
2324 sym = symbol_find_or_make (name);
2327 if (S_IS_DEFINED (sym)
2328 || S_GET_VALUE (sym) != 0)
2330 as_bad ("attempt to redefine symbol");
2331 ignore_rest_of_line ();
2335 record_alignment (bss_section, align);
2338 || ! S_IS_DEFINED (lcomm_sym))
2347 S_SET_EXTERNAL (sym);
2351 lcomm_sym->sy_tc.output = 1;
2352 def_sym = lcomm_sym;
2356 subseg_set (bss_section, 1);
2357 frag_align (align, 0, 0);
2359 def_sym->sy_frag = frag_now;
2360 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, def_sym,
2361 def_size, (char *) NULL);
2363 S_SET_SEGMENT (def_sym, bss_section);
2364 def_sym->sy_tc.align = align;
2368 /* Align the size of lcomm_sym. */
2369 lcomm_sym->sy_frag->fr_offset =
2370 ((lcomm_sym->sy_frag->fr_offset + (1 << align) - 1)
2371 &~ ((1 << align) - 1));
2372 if (align > lcomm_sym->sy_tc.align)
2373 lcomm_sym->sy_tc.align = align;
2378 /* Make sym an offset from lcomm_sym. */
2379 S_SET_SEGMENT (sym, bss_section);
2380 sym->sy_frag = lcomm_sym->sy_frag;
2381 S_SET_VALUE (sym, lcomm_sym->sy_frag->fr_offset);
2382 lcomm_sym->sy_frag->fr_offset += size;
2385 subseg_set (current_seg, current_subseg);
2387 demand_empty_rest_of_line ();
2390 /* The .csect pseudo-op. This switches us into a different
2391 subsegment. The first argument is a symbol whose value is the
2392 start of the .csect. In COFF, csect symbols get special aux
2393 entries defined by the x_csect field of union internal_auxent. The
2394 optional second argument is the alignment (the default is 2). */
2404 name = input_line_pointer;
2405 endc = get_symbol_end ();
2407 sym = symbol_find_or_make (name);
2409 *input_line_pointer = endc;
2411 if (S_GET_NAME (sym)[0] == '\0')
2413 /* An unnamed csect is assumed to be [PR]. */
2414 sym->sy_tc.class = XMC_PR;
2417 ppc_change_csect (sym);
2419 if (*input_line_pointer == ',')
2421 ++input_line_pointer;
2422 sym->sy_tc.align = get_absolute_expression ();
2425 demand_empty_rest_of_line ();
2428 /* Change to a different csect. */
2431 ppc_change_csect (sym)
2434 if (S_IS_DEFINED (sym))
2435 subseg_set (S_GET_SEGMENT (sym), sym->sy_tc.subseg);
2443 /* This is a new csect. We need to look at the symbol class to
2444 figure out whether it should go in the text section or the
2447 switch (sym->sy_tc.class)
2457 S_SET_SEGMENT (sym, text_section);
2458 sym->sy_tc.subseg = ppc_text_subsegment;
2459 ++ppc_text_subsegment;
2460 list_ptr = &ppc_text_csects;
2469 if (ppc_toc_csect != NULL
2470 && ppc_toc_csect->sy_tc.subseg + 1 == ppc_data_subsegment)
2472 S_SET_SEGMENT (sym, data_section);
2473 sym->sy_tc.subseg = ppc_data_subsegment;
2474 ++ppc_data_subsegment;
2475 list_ptr = &ppc_data_csects;
2481 /* We set the obstack chunk size to a small value before
2482 changing subsegments, so that we don't use a lot of memory
2483 space for what may be a small section. */
2484 hold_chunksize = chunksize;
2487 subseg_new (segment_name (S_GET_SEGMENT (sym)), sym->sy_tc.subseg);
2489 chunksize = hold_chunksize;
2492 ppc_after_toc_frag = frag_now;
2494 sym->sy_frag = frag_now;
2495 S_SET_VALUE (sym, (valueT) frag_now_fix ());
2497 sym->sy_tc.align = 2;
2498 sym->sy_tc.output = 1;
2499 sym->sy_tc.within = sym;
2501 for (list = *list_ptr;
2502 list->sy_tc.next != (symbolS *) NULL;
2503 list = list->sy_tc.next)
2505 list->sy_tc.next = sym;
2507 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
2508 symbol_append (sym, list->sy_tc.within, &symbol_rootP, &symbol_lastP);
2511 ppc_current_csect = sym;
2514 /* This function handles the .text and .data pseudo-ops. These
2515 pseudo-ops aren't really used by XCOFF; we implement them for the
2516 convenience of people who aren't used to XCOFF. */
2527 else if (type == 'd')
2532 sym = symbol_find_or_make (name);
2534 ppc_change_csect (sym);
2536 demand_empty_rest_of_line ();
2539 /* The .extern pseudo-op. We create an undefined symbol. */
2548 name = input_line_pointer;
2549 endc = get_symbol_end ();
2551 (void) symbol_find_or_make (name);
2553 *input_line_pointer = endc;
2555 demand_empty_rest_of_line ();
2558 /* The .lglobl pseudo-op. Keep the symbol in the symbol table. */
2568 name = input_line_pointer;
2569 endc = get_symbol_end ();
2571 sym = symbol_find_or_make (name);
2573 *input_line_pointer = endc;
2575 sym->sy_tc.output = 1;
2577 demand_empty_rest_of_line ();
2580 /* The .rename pseudo-op. The RS/6000 assembler can rename symbols,
2581 although I don't know why it bothers. */
2592 name = input_line_pointer;
2593 endc = get_symbol_end ();
2595 sym = symbol_find_or_make (name);
2597 *input_line_pointer = endc;
2599 if (*input_line_pointer != ',')
2601 as_bad ("missing rename string");
2602 ignore_rest_of_line ();
2605 ++input_line_pointer;
2607 sym->sy_tc.real_name = demand_copy_C_string (&len);
2609 demand_empty_rest_of_line ();
2612 /* The .stabx pseudo-op. This is similar to a normal .stabs
2613 pseudo-op, but slightly different. A sample is
2614 .stabx "main:F-1",.main,142,0
2615 The first argument is the symbol name to create. The second is the
2616 value, and the third is the storage class. The fourth seems to be
2617 always zero, and I am assuming it is the type. */
2628 name = demand_copy_C_string (&len);
2630 if (*input_line_pointer != ',')
2632 as_bad ("missing value");
2635 ++input_line_pointer;
2637 ppc_stab_symbol = true;
2638 sym = symbol_make (name);
2639 ppc_stab_symbol = false;
2641 sym->sy_tc.real_name = name;
2643 (void) expression (&exp);
2650 as_bad ("illegal .stabx expression; zero assumed");
2651 exp.X_add_number = 0;
2654 S_SET_VALUE (sym, (valueT) exp.X_add_number);
2655 sym->sy_frag = &zero_address_frag;
2659 if (S_GET_SEGMENT (exp.X_add_symbol) == undefined_section)
2660 sym->sy_value = exp;
2664 exp.X_add_number + S_GET_VALUE (exp.X_add_symbol));
2665 sym->sy_frag = exp.X_add_symbol->sy_frag;
2670 /* The value is some complex expression. This will probably
2671 fail at some later point, but this is probably the right
2672 thing to do here. */
2673 sym->sy_value = exp;
2677 S_SET_SEGMENT (sym, ppc_coff_debug_section);
2678 sym->bsym->flags |= BSF_DEBUGGING;
2680 if (*input_line_pointer != ',')
2682 as_bad ("missing class");
2685 ++input_line_pointer;
2687 S_SET_STORAGE_CLASS (sym, get_absolute_expression ());
2689 if (*input_line_pointer != ',')
2691 as_bad ("missing type");
2694 ++input_line_pointer;
2696 S_SET_DATA_TYPE (sym, get_absolute_expression ());
2698 sym->sy_tc.output = 1;
2700 if (S_GET_STORAGE_CLASS (sym) == C_STSYM)
2701 sym->sy_tc.within = ppc_current_block;
2703 if (exp.X_op != O_symbol
2704 || ! S_IS_EXTERNAL (exp.X_add_symbol)
2705 || S_GET_SEGMENT (exp.X_add_symbol) != bss_section)
2706 ppc_frob_label (sym);
2709 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
2710 symbol_append (sym, exp.X_add_symbol, &symbol_rootP, &symbol_lastP);
2711 if (ppc_current_csect->sy_tc.within == exp.X_add_symbol)
2712 ppc_current_csect->sy_tc.within = sym;
2715 demand_empty_rest_of_line ();
2718 /* The .function pseudo-op. This takes several arguments. The first
2719 argument seems to be the external name of the symbol. The second
2720 argment seems to be the label for the start of the function. gcc
2721 uses the same name for both. I have no idea what the third and
2722 fourth arguments are meant to be. The optional fifth argument is
2723 an expression for the size of the function. In COFF this symbol
2724 gets an aux entry like that used for a csect. */
2727 ppc_function (ignore)
2736 name = input_line_pointer;
2737 endc = get_symbol_end ();
2739 /* Ignore any [PR] suffix. */
2740 name = ppc_canonicalize_symbol_name (name);
2741 s = strchr (name, '[');
2742 if (s != (char *) NULL
2743 && strcmp (s + 1, "PR]") == 0)
2746 ext_sym = symbol_find_or_make (name);
2748 *input_line_pointer = endc;
2750 if (*input_line_pointer != ',')
2752 as_bad ("missing symbol name");
2753 ignore_rest_of_line ();
2756 ++input_line_pointer;
2758 name = input_line_pointer;
2759 endc = get_symbol_end ();
2761 lab_sym = symbol_find_or_make (name);
2763 *input_line_pointer = endc;
2765 if (ext_sym != lab_sym)
2767 ext_sym->sy_value.X_op = O_symbol;
2768 ext_sym->sy_value.X_add_symbol = lab_sym;
2769 ext_sym->sy_value.X_op_symbol = NULL;
2770 ext_sym->sy_value.X_add_number = 0;
2773 if (ext_sym->sy_tc.class == -1)
2774 ext_sym->sy_tc.class = XMC_PR;
2775 ext_sym->sy_tc.output = 1;
2777 if (*input_line_pointer == ',')
2781 /* Ignore the third argument. */
2782 ++input_line_pointer;
2783 expression (&ignore);
2784 if (*input_line_pointer == ',')
2786 /* Ignore the fourth argument. */
2787 ++input_line_pointer;
2788 expression (&ignore);
2789 if (*input_line_pointer == ',')
2791 /* The fifth argument is the function size. */
2792 ++input_line_pointer;
2793 ext_sym->sy_tc.size = symbol_new ("L0\001",
2796 &zero_address_frag);
2797 pseudo_set (ext_sym->sy_tc.size);
2802 S_SET_DATA_TYPE (ext_sym, DT_FCN << N_BTSHFT);
2803 SF_SET_FUNCTION (ext_sym);
2804 SF_SET_PROCESS (ext_sym);
2805 coff_add_linesym (ext_sym);
2807 demand_empty_rest_of_line ();
2810 /* The .bf pseudo-op. This is just like a COFF C_FCN symbol named
2819 sym = symbol_make (".bf");
2820 S_SET_SEGMENT (sym, text_section);
2821 sym->sy_frag = frag_now;
2822 S_SET_VALUE (sym, frag_now_fix ());
2823 S_SET_STORAGE_CLASS (sym, C_FCN);
2825 coff_line_base = get_absolute_expression ();
2827 S_SET_NUMBER_AUXILIARY (sym, 1);
2828 SA_SET_SYM_LNNO (sym, coff_line_base);
2830 sym->sy_tc.output = 1;
2832 ppc_frob_label (sym);
2834 demand_empty_rest_of_line ();
2837 /* The .ef pseudo-op. This is just like a COFF C_FCN symbol named
2838 ".ef", except that the line number is absolute, not relative to the
2839 most recent ".bf" symbol. */
2847 sym = symbol_make (".ef");
2848 S_SET_SEGMENT (sym, text_section);
2849 sym->sy_frag = frag_now;
2850 S_SET_VALUE (sym, frag_now_fix ());
2851 S_SET_STORAGE_CLASS (sym, C_FCN);
2852 S_SET_NUMBER_AUXILIARY (sym, 1);
2853 SA_SET_SYM_LNNO (sym, get_absolute_expression ());
2854 sym->sy_tc.output = 1;
2856 ppc_frob_label (sym);
2858 demand_empty_rest_of_line ();
2861 /* The .bi and .ei pseudo-ops. These take a string argument and
2862 generates a C_BINCL or C_EINCL symbol, which goes at the start of
2869 static symbolS *last_biei;
2876 name = demand_copy_C_string (&len);
2878 /* The value of these symbols is actually file offset. Here we set
2879 the value to the index into the line number entries. In
2880 ppc_frob_symbols we set the fix_line field, which will cause BFD
2881 to do the right thing. */
2883 sym = symbol_make (name);
2884 /* obj-coff.c currently only handles line numbers correctly in the
2886 S_SET_SEGMENT (sym, text_section);
2887 S_SET_VALUE (sym, coff_n_line_nos);
2888 sym->bsym->flags |= BSF_DEBUGGING;
2890 S_SET_STORAGE_CLASS (sym, ei ? C_EINCL : C_BINCL);
2891 sym->sy_tc.output = 1;
2893 for (look = last_biei ? last_biei : symbol_rootP;
2894 (look != (symbolS *) NULL
2895 && (S_GET_STORAGE_CLASS (look) == C_FILE
2896 || S_GET_STORAGE_CLASS (look) == C_BINCL
2897 || S_GET_STORAGE_CLASS (look) == C_EINCL));
2898 look = symbol_next (look))
2900 if (look != (symbolS *) NULL)
2902 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
2903 symbol_insert (sym, look, &symbol_rootP, &symbol_lastP);
2907 demand_empty_rest_of_line ();
2910 /* The .bs pseudo-op. This generates a C_BSTAT symbol named ".bs".
2911 There is one argument, which is a csect symbol. The value of the
2912 .bs symbol is the index of this csect symbol. */
2923 if (ppc_current_block != NULL)
2924 as_bad ("nested .bs blocks");
2926 name = input_line_pointer;
2927 endc = get_symbol_end ();
2929 csect = symbol_find_or_make (name);
2931 *input_line_pointer = endc;
2933 sym = symbol_make (".bs");
2934 S_SET_SEGMENT (sym, now_seg);
2935 S_SET_STORAGE_CLASS (sym, C_BSTAT);
2936 sym->bsym->flags |= BSF_DEBUGGING;
2937 sym->sy_tc.output = 1;
2939 sym->sy_tc.within = csect;
2941 ppc_frob_label (sym);
2943 ppc_current_block = sym;
2945 demand_empty_rest_of_line ();
2948 /* The .es pseudo-op. Generate a C_ESTART symbol named .es. */
2956 if (ppc_current_block == NULL)
2957 as_bad (".es without preceding .bs");
2959 sym = symbol_make (".es");
2960 S_SET_SEGMENT (sym, now_seg);
2961 S_SET_STORAGE_CLASS (sym, C_ESTAT);
2962 sym->bsym->flags |= BSF_DEBUGGING;
2963 sym->sy_tc.output = 1;
2965 ppc_frob_label (sym);
2967 ppc_current_block = NULL;
2969 demand_empty_rest_of_line ();
2972 /* The .bb pseudo-op. Generate a C_BLOCK symbol named .bb, with a
2981 sym = symbol_make (".bb");
2982 S_SET_SEGMENT (sym, text_section);
2983 sym->sy_frag = frag_now;
2984 S_SET_VALUE (sym, frag_now_fix ());
2985 S_SET_STORAGE_CLASS (sym, C_BLOCK);
2987 S_SET_NUMBER_AUXILIARY (sym, 1);
2988 SA_SET_SYM_LNNO (sym, get_absolute_expression ());
2990 sym->sy_tc.output = 1;
2992 SF_SET_PROCESS (sym);
2994 ppc_frob_label (sym);
2996 demand_empty_rest_of_line ();
2999 /* The .eb pseudo-op. Generate a C_BLOCK symbol named .eb, with a
3008 sym = symbol_make (".eb");
3009 S_SET_SEGMENT (sym, text_section);
3010 sym->sy_frag = frag_now;
3011 S_SET_VALUE (sym, frag_now_fix ());
3012 S_SET_STORAGE_CLASS (sym, C_BLOCK);
3013 S_SET_NUMBER_AUXILIARY (sym, 1);
3014 SA_SET_SYM_LNNO (sym, get_absolute_expression ());
3015 sym->sy_tc.output = 1;
3017 SF_SET_PROCESS (sym);
3019 ppc_frob_label (sym);
3021 demand_empty_rest_of_line ();
3024 /* The .bc pseudo-op. This just creates a C_BCOMM symbol with a
3035 name = demand_copy_C_string (&len);
3036 sym = symbol_make (name);
3037 S_SET_SEGMENT (sym, ppc_coff_debug_section);
3038 sym->bsym->flags |= BSF_DEBUGGING;
3039 S_SET_STORAGE_CLASS (sym, C_BCOMM);
3040 S_SET_VALUE (sym, 0);
3041 sym->sy_tc.output = 1;
3043 ppc_frob_label (sym);
3045 demand_empty_rest_of_line ();
3048 /* The .ec pseudo-op. This just creates a C_ECOMM symbol. */
3056 sym = symbol_make (".ec");
3057 S_SET_SEGMENT (sym, ppc_coff_debug_section);
3058 sym->bsym->flags |= BSF_DEBUGGING;
3059 S_SET_STORAGE_CLASS (sym, C_ECOMM);
3060 S_SET_VALUE (sym, 0);
3061 sym->sy_tc.output = 1;
3063 ppc_frob_label (sym);
3065 demand_empty_rest_of_line ();
3068 /* The .toc pseudo-op. Switch to the .toc subsegment. */
3074 if (ppc_toc_csect != (symbolS *) NULL)
3075 subseg_set (data_section, ppc_toc_csect->sy_tc.subseg);
3082 subseg = ppc_data_subsegment;
3083 ++ppc_data_subsegment;
3085 subseg_new (segment_name (data_section), subseg);
3086 ppc_toc_frag = frag_now;
3088 sym = symbol_find_or_make ("TOC[TC0]");
3089 sym->sy_frag = frag_now;
3090 S_SET_SEGMENT (sym, data_section);
3091 S_SET_VALUE (sym, (valueT) frag_now_fix ());
3092 sym->sy_tc.subseg = subseg;
3093 sym->sy_tc.output = 1;
3094 sym->sy_tc.within = sym;
3096 ppc_toc_csect = sym;
3098 for (list = ppc_data_csects;
3099 list->sy_tc.next != (symbolS *) NULL;
3100 list = list->sy_tc.next)
3102 list->sy_tc.next = sym;
3104 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
3105 symbol_append (sym, list->sy_tc.within, &symbol_rootP, &symbol_lastP);
3108 ppc_current_csect = ppc_toc_csect;
3110 demand_empty_rest_of_line ();
3113 /* The AIX assembler automatically aligns the operands of a .long or
3114 .short pseudo-op, and we want to be compatible. */
3117 ppc_xcoff_cons (log_size)
3120 frag_align (log_size, 0, 0);
3121 record_alignment (now_seg, log_size);
3122 cons (1 << log_size);
3125 #endif /* OBJ_XCOFF */
3127 /* The .tc pseudo-op. This is used when generating either XCOFF or
3128 ELF. This takes two or more arguments.
3130 When generating XCOFF output, the first argument is the name to
3131 give to this location in the toc; this will be a symbol with class
3132 TC. The rest of the arguments are 4 byte values to actually put at
3133 this location in the TOC; often there is just one more argument, a
3134 relocateable symbol reference.
3136 When not generating XCOFF output, the arguments are the same, but
3137 the first argument is simply ignored. */
3145 /* Define the TOC symbol name. */
3151 if (ppc_toc_csect == (symbolS *) NULL
3152 || ppc_toc_csect != ppc_current_csect)
3154 as_bad (".tc not in .toc section");
3155 ignore_rest_of_line ();
3159 name = input_line_pointer;
3160 endc = get_symbol_end ();
3162 sym = symbol_find_or_make (name);
3164 *input_line_pointer = endc;
3166 if (S_IS_DEFINED (sym))
3170 label = ppc_current_csect->sy_tc.within;
3171 if (label->sy_tc.class != XMC_TC0)
3173 as_bad (".tc with no label");
3174 ignore_rest_of_line ();
3178 S_SET_SEGMENT (label, S_GET_SEGMENT (sym));
3179 label->sy_frag = sym->sy_frag;
3180 S_SET_VALUE (label, S_GET_VALUE (sym));
3182 while (! is_end_of_line[(unsigned char) *input_line_pointer])
3183 ++input_line_pointer;
3188 S_SET_SEGMENT (sym, now_seg);
3189 sym->sy_frag = frag_now;
3190 S_SET_VALUE (sym, (valueT) frag_now_fix ());
3191 sym->sy_tc.class = XMC_TC;
3192 sym->sy_tc.output = 1;
3194 ppc_frob_label (sym);
3197 #else /* ! defined (OBJ_XCOFF) */
3199 /* Skip the TOC symbol name. */
3200 while (is_part_of_name (*input_line_pointer)
3201 || *input_line_pointer == '['
3202 || *input_line_pointer == ']'
3203 || *input_line_pointer == '{'
3204 || *input_line_pointer == '}')
3205 ++input_line_pointer;
3207 /* Align to a four byte boundary. */
3208 frag_align (2, 0, 0);
3209 record_alignment (now_seg, 2);
3211 #endif /* ! defined (OBJ_XCOFF) */
3213 if (*input_line_pointer != ',')
3214 demand_empty_rest_of_line ();
3217 ++input_line_pointer;
3224 /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format */
3226 /* Set the current section. */
3228 ppc_set_current_section (new)
3231 ppc_previous_section = ppc_current_section;
3232 ppc_current_section = new;
3235 /* pseudo-op: .previous
3236 behaviour: toggles the current section with the previous section.
3238 warnings: "No previous section"
3241 ppc_previous(ignore)
3246 if (ppc_previous_section == NULL)
3248 as_warn("No previous section to return to. Directive ignored.");
3252 subseg_set(ppc_previous_section, 0);
3254 ppc_set_current_section(ppc_previous_section);
3257 /* pseudo-op: .pdata
3258 behaviour: predefined read only data section
3262 initial: .section .pdata "adr3"
3263 a - don't know -- maybe a misprint
3264 d - initialized data
3266 3 - double word aligned (that would be 4 byte boundary)
3269 Tag index tables (also known as the function table) for exception
3270 handling, debugging, etc.
3277 if (pdata_section == 0)
3279 pdata_section = subseg_new (".pdata", 0);
3281 bfd_set_section_flags (stdoutput, pdata_section,
3282 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
3283 | SEC_READONLY | SEC_DATA ));
3285 bfd_set_section_alignment (stdoutput, pdata_section, 2);
3289 pdata_section = subseg_new(".pdata", 0);
3291 ppc_set_current_section(pdata_section);
3294 /* pseudo-op: .ydata
3295 behaviour: predefined read only data section
3299 initial: .section .ydata "drw3"
3300 a - don't know -- maybe a misprint
3301 d - initialized data
3303 3 - double word aligned (that would be 4 byte boundary)
3305 Tag tables (also known as the scope table) for exception handling,
3312 if (ydata_section == 0)
3314 ydata_section = subseg_new (".ydata", 0);
3315 bfd_set_section_flags (stdoutput, ydata_section,
3316 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
3317 | SEC_READONLY | SEC_DATA ));
3319 bfd_set_section_alignment (stdoutput, ydata_section, 3);
3323 ydata_section = subseg_new (".ydata", 0);
3325 ppc_set_current_section(ydata_section);
3328 /* pseudo-op: .reldata
3329 behaviour: predefined read write data section
3330 double word aligned (4-byte)
3331 FIXME: relocation is applied to it
3332 FIXME: what's the difference between this and .data?
3335 initial: .section .reldata "drw3"
3336 d - initialized data
3339 3 - double word aligned (that would be 8 byte boundary)
3342 Like .data, but intended to hold data subject to relocation, such as
3343 function descriptors, etc.
3349 if (reldata_section == 0)
3351 reldata_section = subseg_new (".reldata", 0);
3353 bfd_set_section_flags (stdoutput, reldata_section,
3354 ( SEC_ALLOC | SEC_LOAD | SEC_RELOC
3357 bfd_set_section_alignment (stdoutput, reldata_section, 2);
3361 reldata_section = subseg_new (".reldata", 0);
3363 ppc_set_current_section(reldata_section);
3366 /* pseudo-op: .rdata
3367 behaviour: predefined read only data section
3371 initial: .section .rdata "dr3"
3372 d - initialized data
3374 3 - double word aligned (that would be 4 byte boundary)
3380 if (rdata_section == 0)
3382 rdata_section = subseg_new (".rdata", 0);
3383 bfd_set_section_flags (stdoutput, rdata_section,
3384 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
3385 | SEC_READONLY | SEC_DATA ));
3387 bfd_set_section_alignment (stdoutput, rdata_section, 2);
3391 rdata_section = subseg_new (".rdata", 0);
3393 ppc_set_current_section(rdata_section);
3396 /* pseudo-op: .ualong
3397 behaviour: much like .int, with the exception that no alignment is
3399 FIXME: test the alignment statement
3411 /* pseudo-op: .znop <symbol name>
3412 behaviour: Issue a nop instruction
3413 Issue a IMAGE_REL_PPC_IFGLUE relocation against it, using
3414 the supplied symbol name.
3416 warnings: Missing symbol name
3423 const struct powerpc_opcode *opcode;
3429 /* Strip out the symbol name */
3437 symbol_name = input_line_pointer;
3438 c = get_symbol_end ();
3440 name = xmalloc (input_line_pointer - symbol_name + 1);
3441 strcpy (name, symbol_name);
3443 sym = symbol_find_or_make (name);
3445 *input_line_pointer = c;
3449 /* Look up the opcode in the hash table. */
3450 opcode = (const struct powerpc_opcode *) hash_find (ppc_hash, "nop");
3452 /* stick in the nop */
3453 insn = opcode->opcode;
3455 /* Write out the instruction. */
3457 md_number_to_chars (f, insn, 4);
3459 f - frag_now->fr_literal,
3464 BFD_RELOC_16_GOT_PCREL);
3477 register char *name;
3481 register symbolS *symbolP;
3484 name = input_line_pointer;
3485 c = get_symbol_end ();
3487 /* just after name is now '\0' */
3488 p = input_line_pointer;
3491 if (*input_line_pointer != ',')
3493 as_bad ("Expected comma after symbol-name: rest of line ignored.");
3494 ignore_rest_of_line ();
3498 input_line_pointer++; /* skip ',' */
3499 if ((temp = get_absolute_expression ()) < 0)
3501 as_warn (".COMMon length (%ld.) <0! Ignored.", (long) temp);
3502 ignore_rest_of_line ();
3508 /* The third argument to .comm is the alignment. */
3509 if (*input_line_pointer != ',')
3513 ++input_line_pointer;
3514 align = get_absolute_expression ();
3517 as_warn ("ignoring bad alignment");
3524 symbolP = symbol_find_or_make (name);
3527 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
3529 as_bad ("Ignoring attempt to re-define symbol `%s'.",
3530 S_GET_NAME (symbolP));
3531 ignore_rest_of_line ();
3535 if (S_GET_VALUE (symbolP))
3537 if (S_GET_VALUE (symbolP) != (valueT) temp)
3538 as_bad ("Length of .comm \"%s\" is already %ld. Not changed to %ld.",
3539 S_GET_NAME (symbolP),
3540 (long) S_GET_VALUE (symbolP),
3545 S_SET_VALUE (symbolP, (valueT) temp);
3546 S_SET_EXTERNAL (symbolP);
3549 demand_empty_rest_of_line ();
3553 * implement the .section pseudo op:
3554 * .section name {, "flags"}
3556 * | +--- optional flags: 'b' for bss
3558 * +-- section name 'l' for lib
3562 * 'd' (apparently m88k for data)
3564 * But if the argument is not a quoted string, treat it as a
3565 * subsegment number.
3567 * FIXME: this is a copy of the section processing from obj-coff.c, with
3568 * additions/changes for the moto-pas assembler support. There are three
3571 * FIXME: I just noticed this. This doesn't work at all really. It it
3572 * setting bits that bfd probably neither understands or uses. The
3573 * correct approach (?) will have to incorporate extra fields attached
3574 * to the section to hold the system specific stuff. (krk)
3577 * 'a' - unknown - referred to in documentation, but no definition supplied
3578 * 'c' - section has code
3579 * 'd' - section has initialized data
3580 * 'u' - section has uninitialized data
3581 * 'i' - section contains directives (info)
3582 * 'n' - section can be discarded
3583 * 'R' - remove section at link time
3585 * Section Protection:
3586 * 'r' - section is readable
3587 * 'w' - section is writeable
3588 * 'x' - section is executable
3589 * 's' - section is sharable
3591 * Section Alignment:
3592 * '0' - align to byte boundary
3593 * '1' - align to halfword undary
3594 * '2' - align to word boundary
3595 * '3' - align to doubleword boundary
3596 * '4' - align to quadword boundary
3597 * '5' - align to 32 byte boundary
3598 * '6' - align to 64 byte boundary
3603 ppc_pe_section (ignore)
3606 /* Strip out the section name */
3615 section_name = input_line_pointer;
3616 c = get_symbol_end ();
3618 name = xmalloc (input_line_pointer - section_name + 1);
3619 strcpy (name, section_name);
3621 *input_line_pointer = c;
3626 flags = SEC_NO_FLAGS;
3628 if (strcmp (name, ".idata$2") == 0)
3632 else if (strcmp (name, ".idata$3") == 0)
3636 else if (strcmp (name, ".idata$4") == 0)
3640 else if (strcmp (name, ".idata$5") == 0)
3644 else if (strcmp (name, ".idata$6") == 0)
3649 align = 4; /* default alignment to 16 byte boundary */
3651 if (*input_line_pointer == ',')
3653 ++input_line_pointer;
3655 if (*input_line_pointer != '"')
3656 exp = get_absolute_expression ();
3659 ++input_line_pointer;
3660 while (*input_line_pointer != '"'
3661 && ! is_end_of_line[(unsigned char) *input_line_pointer])
3663 switch (*input_line_pointer)
3665 /* Section Contents */
3666 case 'a': /* unknown */
3667 as_bad ("Unsupported section attribute -- 'a'");
3669 case 'c': /* code section */
3672 case 'd': /* section has initialized data */
3675 case 'u': /* section has uninitialized data */
3676 /* FIXME: This is IMAGE_SCN_CNT_UNINITIALIZED_DATA
3680 case 'i': /* section contains directives (info) */
3681 /* FIXME: This is IMAGE_SCN_LNK_INFO
3683 flags |= SEC_HAS_CONTENTS;
3685 case 'n': /* section can be discarded */
3688 case 'R': /* Remove section at link time */
3689 flags |= SEC_NEVER_LOAD;
3692 /* Section Protection */
3693 case 'r': /* section is readable */
3694 flags |= IMAGE_SCN_MEM_READ;
3696 case 'w': /* section is writeable */
3697 flags |= IMAGE_SCN_MEM_WRITE;
3699 case 'x': /* section is executable */
3700 flags |= IMAGE_SCN_MEM_EXECUTE;
3702 case 's': /* section is sharable */
3703 flags |= IMAGE_SCN_MEM_SHARED;
3706 /* Section Alignment */
3707 case '0': /* align to byte boundary */
3708 flags |= IMAGE_SCN_ALIGN_1BYTES;
3711 case '1': /* align to halfword boundary */
3712 flags |= IMAGE_SCN_ALIGN_2BYTES;
3715 case '2': /* align to word boundary */
3716 flags |= IMAGE_SCN_ALIGN_4BYTES;
3719 case '3': /* align to doubleword boundary */
3720 flags |= IMAGE_SCN_ALIGN_8BYTES;
3723 case '4': /* align to quadword boundary */
3724 flags |= IMAGE_SCN_ALIGN_16BYTES;
3727 case '5': /* align to 32 byte boundary */
3728 flags |= IMAGE_SCN_ALIGN_32BYTES;
3731 case '6': /* align to 64 byte boundary */
3732 flags |= IMAGE_SCN_ALIGN_64BYTES;
3737 as_bad("unknown section attribute '%c'",
3738 *input_line_pointer);
3741 ++input_line_pointer;
3743 if (*input_line_pointer == '"')
3744 ++input_line_pointer;
3748 sec = subseg_new (name, (subsegT) exp);
3750 ppc_set_current_section(sec);
3752 if (flags != SEC_NO_FLAGS)
3754 if (! bfd_set_section_flags (stdoutput, sec, flags))
3755 as_bad ("error setting flags for \"%s\": %s",
3756 bfd_section_name (stdoutput, sec),
3757 bfd_errmsg (bfd_get_error ()));
3760 bfd_set_section_alignment(stdoutput, sec, align);
3765 ppc_pe_function (ignore)
3772 name = input_line_pointer;
3773 endc = get_symbol_end ();
3775 ext_sym = symbol_find_or_make (name);
3777 *input_line_pointer = endc;
3779 S_SET_DATA_TYPE (ext_sym, DT_FCN << N_BTSHFT);
3780 SF_SET_FUNCTION (ext_sym);
3781 SF_SET_PROCESS (ext_sym);
3782 coff_add_linesym (ext_sym);
3784 demand_empty_rest_of_line ();
3788 ppc_pe_tocd (ignore)
3791 if (tocdata_section == 0)
3793 tocdata_section = subseg_new (".tocd", 0);
3794 /* FIXME: section flags won't work */
3795 bfd_set_section_flags (stdoutput, tocdata_section,
3796 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
3797 | SEC_READONLY | SEC_DATA ));
3799 bfd_set_section_alignment (stdoutput, tocdata_section, 2);
3803 rdata_section = subseg_new (".tocd", 0);
3806 ppc_set_current_section(tocdata_section);
3808 demand_empty_rest_of_line ();
3811 /* Don't adjust TOC relocs to use the section symbol. */
3814 ppc_pe_fix_adjustable (fix)
3817 return fix->fx_r_type != BFD_RELOC_PPC_TOC16;
3824 /* XCOFF specific symbol and file handling. */
3826 /* Canonicalize the symbol name. We use the to force the suffix, if
3827 any, to use square brackets, and to be in upper case. */
3830 ppc_canonicalize_symbol_name (name)
3835 if (ppc_stab_symbol)
3838 for (s = name; *s != '\0' && *s != '{' && *s != '['; s++)
3852 for (s++; *s != '\0' && *s != brac; s++)
3856 if (*s == '\0' || s[1] != '\0')
3857 as_bad ("bad symbol suffix");
3865 /* Set the class of a symbol based on the suffix, if any. This is
3866 called whenever a new symbol is created. */
3869 ppc_symbol_new_hook (sym)
3874 sym->sy_tc.next = NULL;
3875 sym->sy_tc.output = 0;
3876 sym->sy_tc.class = -1;
3877 sym->sy_tc.real_name = NULL;
3878 sym->sy_tc.subseg = 0;
3879 sym->sy_tc.align = 0;
3880 sym->sy_tc.size = NULL;
3881 sym->sy_tc.within = NULL;
3883 if (ppc_stab_symbol)
3886 s = strchr (S_GET_NAME (sym), '[');
3887 if (s == (const char *) NULL)
3889 /* There is no suffix. */
3898 if (strcmp (s, "BS]") == 0)
3899 sym->sy_tc.class = XMC_BS;
3902 if (strcmp (s, "DB]") == 0)
3903 sym->sy_tc.class = XMC_DB;
3904 else if (strcmp (s, "DS]") == 0)
3905 sym->sy_tc.class = XMC_DS;
3908 if (strcmp (s, "GL]") == 0)
3909 sym->sy_tc.class = XMC_GL;
3912 if (strcmp (s, "PR]") == 0)
3913 sym->sy_tc.class = XMC_PR;
3916 if (strcmp (s, "RO]") == 0)
3917 sym->sy_tc.class = XMC_RO;
3918 else if (strcmp (s, "RW]") == 0)
3919 sym->sy_tc.class = XMC_RW;
3922 if (strcmp (s, "SV]") == 0)
3923 sym->sy_tc.class = XMC_SV;
3926 if (strcmp (s, "TC]") == 0)
3927 sym->sy_tc.class = XMC_TC;
3928 else if (strcmp (s, "TI]") == 0)
3929 sym->sy_tc.class = XMC_TI;
3930 else if (strcmp (s, "TB]") == 0)
3931 sym->sy_tc.class = XMC_TB;
3932 else if (strcmp (s, "TC0]") == 0 || strcmp (s, "T0]") == 0)
3933 sym->sy_tc.class = XMC_TC0;
3936 if (strcmp (s, "UA]") == 0)
3937 sym->sy_tc.class = XMC_UA;
3938 else if (strcmp (s, "UC]") == 0)
3939 sym->sy_tc.class = XMC_UC;
3942 if (strcmp (s, "XO]") == 0)
3943 sym->sy_tc.class = XMC_XO;
3947 if (sym->sy_tc.class == -1)
3948 as_bad ("Unrecognized symbol suffix");
3951 /* Set the class of a label based on where it is defined. This
3952 handles symbols without suffixes. Also, move the symbol so that it
3953 follows the csect symbol. */
3956 ppc_frob_label (sym)
3959 if (ppc_current_csect != (symbolS *) NULL)
3961 if (sym->sy_tc.class == -1)
3962 sym->sy_tc.class = ppc_current_csect->sy_tc.class;
3964 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
3965 symbol_append (sym, ppc_current_csect->sy_tc.within, &symbol_rootP,
3967 ppc_current_csect->sy_tc.within = sym;
3971 /* This variable is set by ppc_frob_symbol if any absolute symbols are
3972 seen. It tells ppc_adjust_symtab whether it needs to look through
3975 static boolean ppc_saw_abs;
3977 /* Change the name of a symbol just before writing it out. Set the
3978 real name if the .rename pseudo-op was used. Otherwise, remove any
3979 class suffix. Return 1 if the symbol should not be included in the
3983 ppc_frob_symbol (sym)
3986 static symbolS *ppc_last_function;
3987 static symbolS *set_end;
3989 /* Discard symbols that should not be included in the output symbol
3991 if (! sym->sy_used_in_reloc
3992 && ((sym->bsym->flags & BSF_SECTION_SYM) != 0
3993 || (! S_IS_EXTERNAL (sym)
3994 && ! sym->sy_tc.output
3995 && S_GET_STORAGE_CLASS (sym) != C_FILE)))
3998 if (sym->sy_tc.real_name != (char *) NULL)
3999 S_SET_NAME (sym, sym->sy_tc.real_name);
4005 name = S_GET_NAME (sym);
4006 s = strchr (name, '[');
4007 if (s != (char *) NULL)
4013 snew = xmalloc (len + 1);
4014 memcpy (snew, name, len);
4017 S_SET_NAME (sym, snew);
4021 if (set_end != (symbolS *) NULL)
4023 SA_SET_SYM_ENDNDX (set_end, sym);
4027 if (SF_GET_FUNCTION (sym))
4029 if (ppc_last_function != (symbolS *) NULL)
4030 as_bad ("two .function pseudo-ops with no intervening .ef");
4031 ppc_last_function = sym;
4032 if (sym->sy_tc.size != (symbolS *) NULL)
4034 resolve_symbol_value (sym->sy_tc.size, 1);
4035 SA_SET_SYM_FSIZE (sym, (long) S_GET_VALUE (sym->sy_tc.size));
4038 else if (S_GET_STORAGE_CLASS (sym) == C_FCN
4039 && strcmp (S_GET_NAME (sym), ".ef") == 0)
4041 if (ppc_last_function == (symbolS *) NULL)
4042 as_bad (".ef with no preceding .function");
4045 set_end = ppc_last_function;
4046 ppc_last_function = NULL;
4048 /* We don't have a C_EFCN symbol, but we need to force the
4049 COFF backend to believe that it has seen one. */
4050 coff_last_function = NULL;
4054 if (! S_IS_EXTERNAL (sym)
4055 && (sym->bsym->flags & BSF_SECTION_SYM) == 0
4056 && S_GET_STORAGE_CLASS (sym) != C_FILE
4057 && S_GET_STORAGE_CLASS (sym) != C_FCN
4058 && S_GET_STORAGE_CLASS (sym) != C_BLOCK
4059 && S_GET_STORAGE_CLASS (sym) != C_BSTAT
4060 && S_GET_STORAGE_CLASS (sym) != C_ESTAT
4061 && S_GET_STORAGE_CLASS (sym) != C_BINCL
4062 && S_GET_STORAGE_CLASS (sym) != C_EINCL
4063 && S_GET_SEGMENT (sym) != ppc_coff_debug_section)
4064 S_SET_STORAGE_CLASS (sym, C_HIDEXT);
4066 if (S_GET_STORAGE_CLASS (sym) == C_EXT
4067 || S_GET_STORAGE_CLASS (sym) == C_HIDEXT)
4070 union internal_auxent *a;
4072 /* Create a csect aux. */
4073 i = S_GET_NUMBER_AUXILIARY (sym);
4074 S_SET_NUMBER_AUXILIARY (sym, i + 1);
4075 a = &coffsymbol (sym->bsym)->native[i + 1].u.auxent;
4076 if (sym->sy_tc.class == XMC_TC0)
4078 /* This is the TOC table. */
4079 know (strcmp (S_GET_NAME (sym), "TOC") == 0);
4080 a->x_csect.x_scnlen.l = 0;
4081 a->x_csect.x_smtyp = (2 << 3) | XTY_SD;
4083 else if (sym->sy_tc.subseg != 0)
4085 /* This is a csect symbol. x_scnlen is the size of the
4087 if (sym->sy_tc.next == (symbolS *) NULL)
4088 a->x_csect.x_scnlen.l = (bfd_section_size (stdoutput,
4089 S_GET_SEGMENT (sym))
4090 - S_GET_VALUE (sym));
4093 resolve_symbol_value (sym->sy_tc.next, 1);
4094 a->x_csect.x_scnlen.l = (S_GET_VALUE (sym->sy_tc.next)
4095 - S_GET_VALUE (sym));
4097 a->x_csect.x_smtyp = (sym->sy_tc.align << 3) | XTY_SD;
4099 else if (S_GET_SEGMENT (sym) == bss_section)
4101 /* This is a common symbol. */
4102 a->x_csect.x_scnlen.l = sym->sy_frag->fr_offset;
4103 a->x_csect.x_smtyp = (sym->sy_tc.align << 3) | XTY_CM;
4104 if (S_IS_EXTERNAL (sym))
4105 sym->sy_tc.class = XMC_RW;
4107 sym->sy_tc.class = XMC_BS;
4109 else if (S_GET_SEGMENT (sym) == absolute_section)
4111 /* This is an absolute symbol. The csect will be created by
4112 ppc_adjust_symtab. */
4114 a->x_csect.x_smtyp = XTY_LD;
4115 if (sym->sy_tc.class == -1)
4116 sym->sy_tc.class = XMC_XO;
4118 else if (! S_IS_DEFINED (sym))
4120 /* This is an external symbol. */
4121 a->x_csect.x_scnlen.l = 0;
4122 a->x_csect.x_smtyp = XTY_ER;
4124 else if (sym->sy_tc.class == XMC_TC)
4128 /* This is a TOC definition. x_scnlen is the size of the
4130 next = symbol_next (sym);
4131 while (next->sy_tc.class == XMC_TC0)
4132 next = symbol_next (next);
4133 if (next == (symbolS *) NULL
4134 || next->sy_tc.class != XMC_TC)
4136 if (ppc_after_toc_frag == (fragS *) NULL)
4137 a->x_csect.x_scnlen.l = (bfd_section_size (stdoutput,
4139 - S_GET_VALUE (sym));
4141 a->x_csect.x_scnlen.l = (ppc_after_toc_frag->fr_address
4142 - S_GET_VALUE (sym));
4146 resolve_symbol_value (next, 1);
4147 a->x_csect.x_scnlen.l = (S_GET_VALUE (next)
4148 - S_GET_VALUE (sym));
4150 a->x_csect.x_smtyp = (2 << 3) | XTY_SD;
4156 /* This is a normal symbol definition. x_scnlen is the
4157 symbol index of the containing csect. */
4158 if (S_GET_SEGMENT (sym) == text_section)
4159 csect = ppc_text_csects;
4160 else if (S_GET_SEGMENT (sym) == data_section)
4161 csect = ppc_data_csects;
4165 /* Skip the initial dummy symbol. */
4166 csect = csect->sy_tc.next;
4168 if (csect == (symbolS *) NULL)
4170 as_warn ("warning: symbol %s has no csect", S_GET_NAME (sym));
4171 a->x_csect.x_scnlen.l = 0;
4175 while (csect->sy_tc.next != (symbolS *) NULL)
4177 resolve_symbol_value (csect->sy_tc.next, 1);
4178 if (S_GET_VALUE (csect->sy_tc.next) > S_GET_VALUE (sym))
4180 csect = csect->sy_tc.next;
4183 a->x_csect.x_scnlen.p = coffsymbol (csect->bsym)->native;
4184 coffsymbol (sym->bsym)->native[i + 1].fix_scnlen = 1;
4186 a->x_csect.x_smtyp = XTY_LD;
4189 a->x_csect.x_parmhash = 0;
4190 a->x_csect.x_snhash = 0;
4191 if (sym->sy_tc.class == -1)
4192 a->x_csect.x_smclas = XMC_PR;
4194 a->x_csect.x_smclas = sym->sy_tc.class;
4195 a->x_csect.x_stab = 0;
4196 a->x_csect.x_snstab = 0;
4198 /* Don't let the COFF backend resort these symbols. */
4199 sym->bsym->flags |= BSF_NOT_AT_END;
4201 else if (S_GET_STORAGE_CLASS (sym) == C_BSTAT)
4203 /* We want the value to be the symbol index of the referenced
4204 csect symbol. BFD will do that for us if we set the right
4207 (valueT) coffsymbol (sym->sy_tc.within->bsym)->native);
4208 coffsymbol (sym->bsym)->native->fix_value = 1;
4210 else if (S_GET_STORAGE_CLASS (sym) == C_STSYM)
4215 /* The value is the offset from the enclosing csect. */
4216 block = sym->sy_tc.within;
4217 csect = block->sy_tc.within;
4218 resolve_symbol_value (csect, 1);
4219 S_SET_VALUE (sym, S_GET_VALUE (sym) - S_GET_VALUE (csect));
4221 else if (S_GET_STORAGE_CLASS (sym) == C_BINCL
4222 || S_GET_STORAGE_CLASS (sym) == C_EINCL)
4224 /* We want the value to be a file offset into the line numbers.
4225 BFD will do that for us if we set the right flags. We have
4226 already set the value correctly. */
4227 coffsymbol (sym->bsym)->native->fix_line = 1;
4233 /* Adjust the symbol table. This creates csect symbols for all
4234 absolute symbols. */
4237 ppc_adjust_symtab ()
4244 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
4248 union internal_auxent *a;
4250 if (S_GET_SEGMENT (sym) != absolute_section)
4253 csect = symbol_create (".abs[XO]", absolute_section,
4254 S_GET_VALUE (sym), &zero_address_frag);
4255 csect->bsym->value = S_GET_VALUE (sym);
4256 S_SET_STORAGE_CLASS (csect, C_HIDEXT);
4257 i = S_GET_NUMBER_AUXILIARY (csect);
4258 S_SET_NUMBER_AUXILIARY (csect, i + 1);
4259 a = &coffsymbol (csect->bsym)->native[i + 1].u.auxent;
4260 a->x_csect.x_scnlen.l = 0;
4261 a->x_csect.x_smtyp = XTY_SD;
4262 a->x_csect.x_parmhash = 0;
4263 a->x_csect.x_snhash = 0;
4264 a->x_csect.x_smclas = XMC_XO;
4265 a->x_csect.x_stab = 0;
4266 a->x_csect.x_snstab = 0;
4268 symbol_insert (csect, sym, &symbol_rootP, &symbol_lastP);
4270 i = S_GET_NUMBER_AUXILIARY (sym);
4271 a = &coffsymbol (sym->bsym)->native[i].u.auxent;
4272 a->x_csect.x_scnlen.p = coffsymbol (csect->bsym)->native;
4273 coffsymbol (sym->bsym)->native[i].fix_scnlen = 1;
4276 ppc_saw_abs = false;
4279 /* Set the VMA for a section. This is called on all the sections in
4283 ppc_frob_section (sec)
4286 static bfd_size_type vma = 0;
4288 bfd_set_section_vma (stdoutput, sec, vma);
4289 vma += bfd_section_size (stdoutput, sec);
4292 #endif /* OBJ_XCOFF */
4294 /* Turn a string in input_line_pointer into a floating point constant
4295 of type type, and store the appropriate bytes in *litp. The number
4296 of LITTLENUMS emitted is stored in *sizep . An error message is
4297 returned, or NULL on OK. */
4300 md_atof (type, litp, sizep)
4306 LITTLENUM_TYPE words[4];
4322 return "bad call to md_atof";
4325 t = atof_ieee (input_line_pointer, type, words);
4327 input_line_pointer = t;
4331 if (target_big_endian)
4333 for (i = 0; i < prec; i++)
4335 md_number_to_chars (litp, (valueT) words[i], 2);
4341 for (i = prec - 1; i >= 0; i--)
4343 md_number_to_chars (litp, (valueT) words[i], 2);
4351 /* Write a value out to the object file, using the appropriate
4355 md_number_to_chars (buf, val, n)
4360 if (target_big_endian)
4361 number_to_chars_bigendian (buf, val, n);
4363 number_to_chars_littleendian (buf, val, n);
4366 /* Align a section (I don't know why this is machine dependent). */
4369 md_section_align (seg, addr)
4373 int align = bfd_get_section_alignment (stdoutput, seg);
4375 return ((addr + (1 << align) - 1) & (-1 << align));
4378 /* We don't have any form of relaxing. */
4381 md_estimate_size_before_relax (fragp, seg)
4389 /* Convert a machine dependent frag. We never generate these. */
4392 md_convert_frag (abfd, sec, fragp)
4400 /* We have no need to default values of symbols. */
4404 md_undefined_symbol (name)
4410 /* Functions concerning relocs. */
4412 /* The location from which a PC relative jump should be calculated,
4413 given a PC relative reloc. */
4416 md_pcrel_from_section (fixp, sec)
4420 return fixp->fx_frag->fr_address + fixp->fx_where;
4425 /* This is called to see whether a fixup should be adjusted to use a
4426 section symbol. We take the opportunity to change a fixup against
4427 a symbol in the TOC subsegment into a reloc against the
4428 corresponding .tc symbol. */
4431 ppc_fix_adjustable (fix)
4436 resolve_symbol_value (fix->fx_addsy, 1);
4437 val = S_GET_VALUE (fix->fx_addsy);
4438 if (ppc_toc_csect != (symbolS *) NULL
4439 && fix->fx_addsy != (symbolS *) NULL
4440 && fix->fx_addsy != ppc_toc_csect
4441 && S_GET_SEGMENT (fix->fx_addsy) == data_section
4442 && val >= ppc_toc_frag->fr_address
4443 && (ppc_after_toc_frag == (fragS *) NULL
4444 || val < ppc_after_toc_frag->fr_address))
4448 for (sy = symbol_next (ppc_toc_csect);
4449 sy != (symbolS *) NULL;
4450 sy = symbol_next (sy))
4452 if (sy->sy_tc.class == XMC_TC0)
4454 if (sy->sy_tc.class != XMC_TC)
4456 resolve_symbol_value (sy, 1);
4457 if (val == S_GET_VALUE (sy))
4460 fix->fx_addnumber = val - ppc_toc_frag->fr_address;
4465 as_bad_where (fix->fx_file, fix->fx_line,
4466 "symbol in .toc does not match any .tc");
4469 /* Possibly adjust the reloc to be against the csect. */
4470 if (fix->fx_addsy != (symbolS *) NULL
4471 && fix->fx_addsy->sy_tc.subseg == 0
4472 && fix->fx_addsy->sy_tc.class != XMC_TC0
4473 && fix->fx_addsy->sy_tc.class != XMC_TC
4474 && S_GET_SEGMENT (fix->fx_addsy) != bss_section
4475 /* Don't adjust if this is a reloc in the toc section. */
4476 && (S_GET_SEGMENT (fix->fx_addsy) != data_section
4477 || ppc_toc_csect == NULL
4478 || fix->fx_frag->fr_address < ppc_toc_frag->fr_address
4479 || (ppc_after_toc_frag != NULL
4480 && fix->fx_frag->fr_address >= ppc_after_toc_frag->fr_address)))
4484 if (S_GET_SEGMENT (fix->fx_addsy) == text_section)
4485 csect = ppc_text_csects;
4486 else if (S_GET_SEGMENT (fix->fx_addsy) == data_section)
4487 csect = ppc_data_csects;
4491 /* Skip the initial dummy symbol. */
4492 csect = csect->sy_tc.next;
4494 if (csect != (symbolS *) NULL)
4496 while (csect->sy_tc.next != (symbolS *) NULL
4497 && (csect->sy_tc.next->sy_frag->fr_address
4498 <= fix->fx_addsy->sy_frag->fr_address))
4500 /* If the csect address equals the symbol value, then we
4501 have to look through the full symbol table to see
4502 whether this is the csect we want. Note that we will
4503 only get here if the csect has zero length. */
4504 if ((csect->sy_frag->fr_address
4505 == fix->fx_addsy->sy_frag->fr_address)
4506 && S_GET_VALUE (csect) == S_GET_VALUE (fix->fx_addsy))
4510 for (scan = csect->sy_next;
4512 scan = scan->sy_next)
4514 if (scan->sy_tc.subseg != 0)
4516 if (scan == fix->fx_addsy)
4520 /* If we found the symbol before the next csect
4521 symbol, then this is the csect we want. */
4522 if (scan == fix->fx_addsy)
4526 csect = csect->sy_tc.next;
4529 fix->fx_offset += (S_GET_VALUE (fix->fx_addsy)
4530 - csect->sy_frag->fr_address);
4531 fix->fx_addsy = csect;
4535 /* Adjust a reloc against a .lcomm symbol to be against the base
4537 if (fix->fx_addsy != (symbolS *) NULL
4538 && S_GET_SEGMENT (fix->fx_addsy) == bss_section
4539 && ! S_IS_EXTERNAL (fix->fx_addsy))
4541 resolve_symbol_value (fix->fx_addsy->sy_frag->fr_symbol, 1);
4542 fix->fx_offset += (S_GET_VALUE (fix->fx_addsy)
4543 - S_GET_VALUE (fix->fx_addsy->sy_frag->fr_symbol));
4544 fix->fx_addsy = fix->fx_addsy->sy_frag->fr_symbol;
4550 /* A reloc from one csect to another must be kept. The assembler
4551 will, of course, keep relocs between sections, and it will keep
4552 absolute relocs, but we need to force it to keep PC relative relocs
4553 between two csects in the same section. */
4556 ppc_force_relocation (fix)
4559 /* At this point fix->fx_addsy should already have been converted to
4560 a csect symbol. If the csect does not include the fragment, then
4561 we need to force the relocation. */
4563 && fix->fx_addsy != NULL
4564 && fix->fx_addsy->sy_tc.subseg != 0
4565 && (fix->fx_addsy->sy_frag->fr_address > fix->fx_frag->fr_address
4566 || (fix->fx_addsy->sy_tc.next != NULL
4567 && (fix->fx_addsy->sy_tc.next->sy_frag->fr_address
4568 <= fix->fx_frag->fr_address))))
4574 #endif /* OBJ_XCOFF */
4576 /* See whether a symbol is in the TOC section. */
4579 ppc_is_toc_sym (sym)
4583 return sym->sy_tc.class == XMC_TC;
4585 return strcmp (segment_name (S_GET_SEGMENT (sym)), ".got") == 0;
4589 /* Apply a fixup to the object code. This is called for all the
4590 fixups we generated by the call to fix_new_exp, above. In the call
4591 above we used a reloc code which was the largest legal reloc code
4592 plus the operand index. Here we undo that to recover the operand
4593 index. At this point all symbol values should be fully resolved,
4594 and we attempt to completely resolve the reloc. If we can not do
4595 that, we determine the correct reloc code and put it back in the
4599 md_apply_fix3 (fixp, valuep, seg)
4608 if (fixp->fx_addsy != NULL)
4610 /* `*valuep' may contain the value of the symbol on which the reloc
4611 will be based; we have to remove it. */
4612 if (fixp->fx_addsy->sy_used_in_reloc
4613 && S_GET_SEGMENT (fixp->fx_addsy) != absolute_section
4614 && S_GET_SEGMENT (fixp->fx_addsy) != undefined_section
4615 && ! bfd_is_com_section (S_GET_SEGMENT (fixp->fx_addsy)))
4616 value -= S_GET_VALUE (fixp->fx_addsy);
4618 /* FIXME: Why '+'? Better yet, what exactly is '*valuep'
4619 supposed to be? I think this is related to various similar
4620 FIXMEs in tc-i386.c and tc-sparc.c. */
4622 value += fixp->fx_frag->fr_address + fixp->fx_where;
4629 /* FIXME FIXME FIXME: The value we are passed in *valuep includes
4630 the symbol values. Since we are using BFD_ASSEMBLER, if we are
4631 doing this relocation the code in write.c is going to call
4632 bfd_install_relocation, which is also going to use the symbol
4633 value. That means that if the reloc is fully resolved we want to
4634 use *valuep since bfd_install_relocation is not being used.
4635 However, if the reloc is not fully resolved we do not want to use
4636 *valuep, and must use fx_offset instead. However, if the reloc
4637 is PC relative, we do want to use *valuep since it includes the
4638 result of md_pcrel_from. This is confusing. */
4639 if (fixp->fx_addsy == (symbolS *) NULL)
4644 else if (fixp->fx_pcrel)
4648 value = fixp->fx_offset;
4649 if (fixp->fx_subsy != (symbolS *) NULL)
4651 if (S_GET_SEGMENT (fixp->fx_subsy) == absolute_section)
4652 value -= S_GET_VALUE (fixp->fx_subsy);
4655 /* We can't actually support subtracting a symbol. */
4656 as_bad_where (fixp->fx_file, fixp->fx_line,
4657 "expression too complex");
4663 if ((int) fixp->fx_r_type >= (int) BFD_RELOC_UNUSED)
4666 const struct powerpc_operand *operand;
4670 opindex = (int) fixp->fx_r_type - (int) BFD_RELOC_UNUSED;
4672 operand = &powerpc_operands[opindex];
4675 /* It appears that an instruction like
4677 when LC..1 is not a TOC symbol does not generate a reloc. It
4678 uses the offset of LC..1 within its csect. However, .long
4679 LC..1 will generate a reloc. I can't find any documentation
4680 on how these cases are to be distinguished, so this is a wild
4681 guess. These cases are generated by gcc -mminimal-toc. */
4682 if ((operand->flags & PPC_OPERAND_PARENS) != 0
4683 && operand->bits == 16
4684 && operand->shift == 0
4685 && operand->insert == NULL
4686 && fixp->fx_addsy != NULL
4687 && fixp->fx_addsy->sy_tc.subseg != 0
4688 && fixp->fx_addsy->sy_tc.class != XMC_TC
4689 && fixp->fx_addsy->sy_tc.class != XMC_TC0
4690 && S_GET_SEGMENT (fixp->fx_addsy) != bss_section)
4692 value = fixp->fx_offset;
4697 /* Fetch the instruction, insert the fully resolved operand
4698 value, and stuff the instruction back again. */
4699 where = fixp->fx_frag->fr_literal + fixp->fx_where;
4700 if (target_big_endian)
4701 insn = bfd_getb32 ((unsigned char *) where);
4703 insn = bfd_getl32 ((unsigned char *) where);
4704 insn = ppc_insert_operand (insn, operand, (offsetT) value,
4705 fixp->fx_file, fixp->fx_line);
4706 if (target_big_endian)
4707 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
4709 bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
4713 /* Nothing else to do here. */
4717 /* Determine a BFD reloc value based on the operand information.
4718 We are only prepared to turn a few of the operands into
4720 FIXME: We need to handle the DS field at the very least.
4721 FIXME: Selecting the reloc type is a bit haphazard; perhaps
4722 there should be a new field in the operand table. */
4723 if ((operand->flags & PPC_OPERAND_RELATIVE) != 0
4724 && operand->bits == 26
4725 && operand->shift == 0)
4726 fixp->fx_r_type = BFD_RELOC_PPC_B26;
4727 else if ((operand->flags & PPC_OPERAND_RELATIVE) != 0
4728 && operand->bits == 16
4729 && operand->shift == 0)
4730 fixp->fx_r_type = BFD_RELOC_PPC_B16;
4731 else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0
4732 && operand->bits == 26
4733 && operand->shift == 0)
4734 fixp->fx_r_type = BFD_RELOC_PPC_BA26;
4735 else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0
4736 && operand->bits == 16
4737 && operand->shift == 0)
4738 fixp->fx_r_type = BFD_RELOC_PPC_BA16;
4739 else if ((operand->flags & PPC_OPERAND_PARENS) != 0
4740 && operand->bits == 16
4741 && operand->shift == 0
4742 && operand->insert == NULL
4743 && fixp->fx_addsy != NULL
4744 && ppc_is_toc_sym (fixp->fx_addsy))
4747 if (target_big_endian)
4748 fixp->fx_where += 2;
4749 fixp->fx_r_type = BFD_RELOC_PPC_TOC16;
4756 /* Use expr_symbol_where to see if this is an expression
4758 if (expr_symbol_where (fixp->fx_addsy, &sfile, &sline))
4759 as_bad_where (fixp->fx_file, fixp->fx_line,
4760 "unresolved expression that must be resolved");
4762 as_bad_where (fixp->fx_file, fixp->fx_line,
4763 "unsupported relocation type");
4771 ppc_elf_validate_fix (fixp, seg);
4773 switch (fixp->fx_r_type)
4776 case BFD_RELOC_CTOR:
4778 fixp->fx_r_type = BFD_RELOC_32_PCREL;
4782 case BFD_RELOC_32_PCREL:
4783 case BFD_RELOC_32_BASEREL:
4784 case BFD_RELOC_PPC_EMB_NADDR32:
4785 md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
4789 case BFD_RELOC_LO16:
4791 case BFD_RELOC_GPREL16:
4792 case BFD_RELOC_16_GOT_PCREL:
4793 case BFD_RELOC_16_GOTOFF:
4794 case BFD_RELOC_LO16_GOTOFF:
4795 case BFD_RELOC_HI16_GOTOFF:
4796 case BFD_RELOC_HI16_S_GOTOFF:
4797 case BFD_RELOC_LO16_BASEREL:
4798 case BFD_RELOC_HI16_BASEREL:
4799 case BFD_RELOC_HI16_S_BASEREL:
4800 case BFD_RELOC_PPC_EMB_NADDR16:
4801 case BFD_RELOC_PPC_EMB_NADDR16_LO:
4802 case BFD_RELOC_PPC_EMB_NADDR16_HI:
4803 case BFD_RELOC_PPC_EMB_NADDR16_HA:
4804 case BFD_RELOC_PPC_EMB_SDAI16:
4805 case BFD_RELOC_PPC_EMB_SDA2REL:
4806 case BFD_RELOC_PPC_EMB_SDA2I16:
4807 case BFD_RELOC_PPC_EMB_RELSEC16:
4808 case BFD_RELOC_PPC_EMB_RELST_LO:
4809 case BFD_RELOC_PPC_EMB_RELST_HI:
4810 case BFD_RELOC_PPC_EMB_RELST_HA:
4811 case BFD_RELOC_PPC_EMB_RELSDA:
4812 case BFD_RELOC_PPC_TOC16:
4814 as_bad_where (fixp->fx_file, fixp->fx_line,
4815 "cannot emit PC relative %s relocation%s%s",
4816 bfd_get_reloc_code_name (fixp->fx_r_type),
4817 fixp->fx_addsy != NULL ? " against " : "",
4818 (fixp->fx_addsy != NULL
4819 ? S_GET_NAME (fixp->fx_addsy)
4822 md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
4826 /* This case happens when you write, for example,
4828 where L1 and L2 are defined later. */
4829 case BFD_RELOC_HI16:
4832 md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
4835 case BFD_RELOC_HI16_S:
4838 md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
4839 value + 0x8000 >> 16, 2);
4842 /* Because SDA21 modifies the register field, the size is set to 4
4843 bytes, rather than 2, so offset it here appropriately */
4844 case BFD_RELOC_PPC_EMB_SDA21:
4848 md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where
4849 + ((target_big_endian) ? 2 : 0),
4857 md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
4861 case BFD_RELOC_24_PLT_PCREL:
4862 case BFD_RELOC_PPC_LOCAL24PC:
4863 if (!fixp->fx_pcrel && !fixp->fx_done)
4871 /* Fetch the instruction, insert the fully resolved operand
4872 value, and stuff the instruction back again. */
4873 where = fixp->fx_frag->fr_literal + fixp->fx_where;
4874 if (target_big_endian)
4875 insn = bfd_getb32 ((unsigned char *) where);
4877 insn = bfd_getl32 ((unsigned char *) where);
4878 if ((value & 3) != 0)
4879 as_bad_where (fixp->fx_file, fixp->fx_line,
4880 "must branch to an address a multiple of 4");
4881 if ((offsetT) value < -0x40000000
4882 || (offsetT) value >= 0x40000000)
4883 as_bad_where (fixp->fx_file, fixp->fx_line,
4884 "@local or @plt branch destination is too far "
4887 insn = insn | (value & 0x03fffffc);
4888 if (target_big_endian)
4889 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
4891 bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
4897 "Gas failure, reloc value %d\n", fixp->fx_r_type);
4904 fixp->fx_addnumber = value;
4906 if (fixp->fx_r_type != BFD_RELOC_PPC_TOC16)
4907 fixp->fx_addnumber = 0;
4911 fixp->fx_addnumber = 0;
4913 /* We want to use the offset within the data segment of the
4914 symbol, not the actual VMA of the symbol. */
4915 fixp->fx_addnumber =
4916 - bfd_get_section_vma (stdoutput, S_GET_SEGMENT (fixp->fx_addsy));
4924 /* Generate a reloc for a fixup. */
4927 tc_gen_reloc (seg, fixp)
4933 reloc = (arelent *) xmalloc (sizeof (arelent));
4935 reloc->sym_ptr_ptr = &fixp->fx_addsy->bsym;
4936 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
4937 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
4938 if (reloc->howto == (reloc_howto_type *) NULL)
4940 as_bad_where (fixp->fx_file, fixp->fx_line,
4941 "reloc %d not supported by object file format", (int)fixp->fx_r_type);
4944 reloc->addend = fixp->fx_addnumber;