1 /* tc-ppc.c -- Assemble for the PowerPC or POWER (RS/6000)
2 Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor, Cygnus Support.
5 This file is part of GAS, the GNU Assembler.
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
26 #include "opcode/ppc.h"
36 /* This is the assembler for the PowerPC or POWER (RS/6000) chips. */
38 /* Tell the main code what the endianness is. */
39 extern int target_big_endian
;
41 /* Whether or not, we've set target_big_endian. */
42 static int set_target_endian
= 0;
44 /* Whether to use user friendly register names. */
45 #ifndef TARGET_REG_NAMES_P
47 #define TARGET_REG_NAMES_P true
49 #define TARGET_REG_NAMES_P false
53 static boolean reg_names_p
= TARGET_REG_NAMES_P
;
55 static void ppc_set_cpu
PARAMS ((void));
56 static unsigned long ppc_insert_operand
57 PARAMS ((unsigned long insn
, const struct powerpc_operand
*operand
,
58 offsetT val
, char *file
, unsigned int line
));
59 static void ppc_macro
PARAMS ((char *str
, const struct powerpc_macro
*macro
));
60 static void ppc_byte
PARAMS ((int));
61 static int ppc_is_toc_sym
PARAMS ((symbolS
*sym
));
62 static void ppc_tc
PARAMS ((int));
65 static void ppc_comm
PARAMS ((int));
66 static void ppc_bb
PARAMS ((int));
67 static void ppc_bc
PARAMS ((int));
68 static void ppc_bf
PARAMS ((int));
69 static void ppc_biei
PARAMS ((int));
70 static void ppc_bs
PARAMS ((int));
71 static void ppc_eb
PARAMS ((int));
72 static void ppc_ec
PARAMS ((int));
73 static void ppc_ef
PARAMS ((int));
74 static void ppc_es
PARAMS ((int));
75 static void ppc_csect
PARAMS ((int));
76 static void ppc_change_csect
PARAMS ((symbolS
*));
77 static void ppc_function
PARAMS ((int));
78 static void ppc_extern
PARAMS ((int));
79 static void ppc_lglobl
PARAMS ((int));
80 static void ppc_section
PARAMS ((int));
81 static void ppc_stabx
PARAMS ((int));
82 static void ppc_rename
PARAMS ((int));
83 static void ppc_toc
PARAMS ((int));
87 static bfd_reloc_code_real_type ppc_elf_suffix
PARAMS ((char **));
88 static void ppc_elf_cons
PARAMS ((int));
89 static void ppc_elf_validate_fix
PARAMS ((fixS
*, segT
));
93 static void ppc_set_current_section
PARAMS ((segT
));
94 static void ppc_previous
PARAMS ((int));
95 static void ppc_pdata
PARAMS ((int));
96 static void ppc_ydata
PARAMS ((int));
97 static void ppc_reldata
PARAMS ((int));
98 static void ppc_rdata
PARAMS ((int));
99 static void ppc_ualong
PARAMS ((int));
100 static void ppc_znop
PARAMS ((int));
101 static void ppc_pe_comm
PARAMS ((int));
102 static void ppc_pe_section
PARAMS ((int));
103 static void ppc_pe_function
PARAMS ((int));
104 static void ppc_pe_tocd
PARAMS ((int));
107 /* Generic assembler global variables which must be defined by all
110 /* Characters which always start a comment. */
111 const char comment_chars
[] = "#!";
113 /* Characters which start a comment at the beginning of a line. */
114 const char line_comment_chars
[] = "#";
116 /* Characters which may be used to separate multiple commands on a
118 const char line_separator_chars
[] = ";";
120 /* Characters which are used to indicate an exponent in a floating
122 const char EXP_CHARS
[] = "eE";
124 /* Characters which mean that a number is a floating point constant,
126 const char FLT_CHARS
[] = "dD";
128 /* The target specific pseudo-ops which we support. */
130 const pseudo_typeS md_pseudo_table
[] =
132 /* Pseudo-ops which must be overridden. */
133 { "byte", ppc_byte
, 0 },
136 /* Pseudo-ops specific to the RS/6000 XCOFF format. Some of these
137 legitimately belong in the obj-*.c file. However, XCOFF is based
138 on COFF, and is only implemented for the RS/6000. We just use
139 obj-coff.c, and add what we need here. */
140 { "comm", ppc_comm
, 0 },
141 { "lcomm", ppc_comm
, 1 },
145 { "bi", ppc_biei
, 0 },
147 { "csect", ppc_csect
, 0 },
148 { "data", ppc_section
, 'd' },
152 { "ei", ppc_biei
, 1 },
154 { "extern", ppc_extern
, 0 },
155 { "function", ppc_function
, 0 },
156 { "lglobl", ppc_lglobl
, 0 },
157 { "rename", ppc_rename
, 0 },
158 { "stabx", ppc_stabx
, 0 },
159 { "text", ppc_section
, 't' },
160 { "toc", ppc_toc
, 0 },
164 { "long", ppc_elf_cons
, 4 },
165 { "word", ppc_elf_cons
, 2 },
166 { "short", ppc_elf_cons
, 2 },
170 /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format */
171 { "previous", ppc_previous
, 0 },
172 { "pdata", ppc_pdata
, 0 },
173 { "ydata", ppc_ydata
, 0 },
174 { "reldata", ppc_reldata
, 0 },
175 { "rdata", ppc_rdata
, 0 },
176 { "ualong", ppc_ualong
, 0 },
177 { "znop", ppc_znop
, 0 },
178 { "comm", ppc_pe_comm
, 0 },
179 { "lcomm", ppc_pe_comm
, 1 },
180 { "section", ppc_pe_section
, 0 },
181 { "function", ppc_pe_function
,0 },
182 { "tocd", ppc_pe_tocd
, 0 },
185 /* This pseudo-op is used even when not generating XCOFF output. */
192 /* Predefined register names if -mregnames (or default for Windows NT). */
193 /* In general, there are lots of them, in an attempt to be compatible */
194 /* with a number of other Windows NT assemblers. */
196 /* Structure to hold information about predefined registers. */
203 /* List of registers that are pre-defined:
205 Each general register has predefined names of the form:
206 1. r<reg_num> which has the value <reg_num>.
207 2. r.<reg_num> which has the value <reg_num>.
210 Each floating point register has predefined names of the form:
211 1. f<reg_num> which has the value <reg_num>.
212 2. f.<reg_num> which has the value <reg_num>.
214 Each condition register has predefined names of the form:
215 1. cr<reg_num> which has the value <reg_num>.
216 2. cr.<reg_num> which has the value <reg_num>.
218 There are individual registers as well:
219 sp or r.sp has the value 1
220 rtoc or r.toc has the value 2
221 fpscr has the value 0
227 dsisr has the value 18
229 sdr1 has the value 25
230 srr0 has the value 26
231 srr1 has the value 27
233 The table is sorted. Suitable for searching by a binary search. */
235 static const struct pd_reg pre_defined_registers
[] =
237 { "cr.0", 0 }, /* Condition Registers */
257 { "dar", 19 }, /* Data Access Register */
258 { "dec", 22 }, /* Decrementer */
259 { "dsisr", 18 }, /* Data Storage Interrupt Status Register */
261 { "f.0", 0 }, /* Floating point registers */
329 { "lr", 8 }, /* Link Register */
333 { "r.0", 0 }, /* General Purpose Registers */
366 { "r.sp", 1 }, /* Stack Pointer */
368 { "r.toc", 2 }, /* Pointer to the table of contents */
370 { "r0", 0 }, /* More general purpose registers */
403 { "rtoc", 2 }, /* Table of contents */
405 { "sdr1", 25 }, /* Storage Description Register 1 */
409 { "srr0", 26 }, /* Machine Status Save/Restore Register 0 */
410 { "srr1", 27 }, /* Machine Status Save/Restore Register 1 */
416 #define REG_NAME_CNT (sizeof(pre_defined_registers) / sizeof(struct pd_reg))
418 /* Given NAME, find the register number associated with that name, return
419 the integer value associated with the given name or -1 on failure. */
421 static int reg_name_search
PARAMS ( (char * name
) );
424 reg_name_search (name
)
427 int middle
, low
, high
;
431 high
= REG_NAME_CNT
- 1;
435 middle
= (low
+ high
) / 2;
436 cmp
= strcasecmp (name
, pre_defined_registers
[middle
].name
);
442 return pre_defined_registers
[middle
].value
;
450 * Summary of register_name().
452 * in: Input_line_pointer points to 1st char of operand.
454 * out: A expressionS.
455 * The operand may have been a register: in this case, X_op == O_register,
456 * X_add_number is set to the register number, and truth is returned.
457 * Input_line_pointer->(next non-blank) char after operand, or is in its
462 register_name (expressionP
)
463 expressionS
*expressionP
;
470 /* Find the spelling of the operand */
471 start
= name
= input_line_pointer
;
472 if (name
[0] == '%' && isalpha (name
[1]))
473 name
= ++input_line_pointer
;
475 else if (!reg_names_p
|| !isalpha (name
[0]))
478 c
= get_symbol_end ();
479 reg_number
= reg_name_search (name
);
481 /* look to see if it's in the register table */
484 expressionP
->X_op
= O_register
;
485 expressionP
->X_add_number
= reg_number
;
487 /* make the rest nice */
488 expressionP
->X_add_symbol
= NULL
;
489 expressionP
->X_op_symbol
= NULL
;
490 *input_line_pointer
= c
; /* put back the delimiting char */
495 /* reset the line as if we had not done anything */
496 *input_line_pointer
= c
; /* put back the delimiting char */
497 input_line_pointer
= start
; /* reset input_line pointer */
503 /* Local variables. */
505 /* The type of processor we are assembling for. This is one or more
506 of the PPC_OPCODE flags defined in opcode/ppc.h. */
507 static int ppc_cpu
= 0;
509 /* The size of the processor we are assembling for. This is either
510 PPC_OPCODE_32 or PPC_OPCODE_64. */
511 static int ppc_size
= PPC_OPCODE_32
;
513 /* Opcode hash table. */
514 static struct hash_control
*ppc_hash
;
516 /* Macro hash table. */
517 static struct hash_control
*ppc_macro_hash
;
520 /* Whether to warn about non PC relative relocations that aren't
521 in the .got2 section. */
522 static boolean mrelocatable
= false;
524 /* Flags to set in the elf header */
525 static flagword ppc_flags
= 0;
530 /* The RS/6000 assembler uses the .csect pseudo-op to generate code
531 using a bunch of different sections. These assembler sections,
532 however, are all encompassed within the .text or .data sections of
533 the final output file. We handle this by using different
534 subsegments within these main segments. */
536 /* Next subsegment to allocate within the .text segment. */
537 static subsegT ppc_text_subsegment
= 2;
539 /* Linked list of csects in the text section. */
540 static symbolS
*ppc_text_csects
;
542 /* Next subsegment to allocate within the .data segment. */
543 static subsegT ppc_data_subsegment
= 2;
545 /* Linked list of csects in the data section. */
546 static symbolS
*ppc_data_csects
;
548 /* The current csect. */
549 static symbolS
*ppc_current_csect
;
551 /* The RS/6000 assembler uses a TOC which holds addresses of functions
552 and variables. Symbols are put in the TOC with the .tc pseudo-op.
553 A special relocation is used when accessing TOC entries. We handle
554 the TOC as a subsegment within the .data segment. We set it up if
555 we see a .toc pseudo-op, and save the csect symbol here. */
556 static symbolS
*ppc_toc_csect
;
558 /* The first frag in the TOC subsegment. */
559 static fragS
*ppc_toc_frag
;
561 /* The first frag in the first subsegment after the TOC in the .data
562 segment. NULL if there are no subsegments after the TOC. */
563 static fragS
*ppc_after_toc_frag
;
565 /* The current static block. */
566 static symbolS
*ppc_current_block
;
568 /* The COFF debugging section; set by md_begin. This is not the
569 .debug section, but is instead the secret BFD section which will
570 cause BFD to set the section number of a symbol to N_DEBUG. */
571 static asection
*ppc_coff_debug_section
;
573 #endif /* OBJ_XCOFF */
577 /* Various sections that we need for PE coff support. */
578 static segT ydata_section
;
579 static segT pdata_section
;
580 static segT reldata_section
;
581 static segT rdata_section
;
582 static segT tocdata_section
;
584 /* The current section and the previous section. See ppc_previous. */
585 static segT ppc_previous_section
;
586 static segT ppc_current_section
;
591 symbolS
*GOT_symbol
; /* Pre-defined "_GLOBAL_OFFSET_TABLE" */
594 #ifndef WORKING_DOT_WORD
595 const int md_short_jump_size
= 4;
596 const int md_long_jump_size
= 4;
600 CONST
char *md_shortopts
= "b:l:usm:VQ:";
602 CONST
char *md_shortopts
= "um:";
604 struct option md_longopts
[] = {
605 {NULL
, no_argument
, NULL
, 0}
607 size_t md_longopts_size
= sizeof(md_longopts
);
610 md_parse_option (c
, arg
)
617 /* -u means that any undefined symbols should be treated as
618 external, which is the default for gas anyhow. */
623 /* Solaris as takes -le (presumably for little endian). For completeness
624 sake, recognize -be also. */
625 if (strcmp (arg
, "e") == 0)
627 target_big_endian
= 0;
628 set_target_endian
= 1;
636 if (strcmp (arg
, "e") == 0)
638 target_big_endian
= 1;
639 set_target_endian
= 1;
648 /* -mpwrx and -mpwr2 mean to assemble for the IBM POWER/2
650 if (strcmp (arg
, "pwrx") == 0 || strcmp (arg
, "pwr2") == 0)
651 ppc_cpu
= PPC_OPCODE_POWER
| PPC_OPCODE_POWER2
;
652 /* -mpwr means to assemble for the IBM POWER (RIOS1). */
653 else if (strcmp (arg
, "pwr") == 0)
654 ppc_cpu
= PPC_OPCODE_POWER
;
655 /* -m601 means to assemble for the Motorola PowerPC 601, which includes
656 instructions that are holdovers from the Power. */
657 else if (strcmp (arg
, "601") == 0)
658 ppc_cpu
= PPC_OPCODE_PPC
| PPC_OPCODE_601
;
659 /* -mppc, -mppc32, -m603, and -m604 mean to assemble for the
660 Motorola PowerPC 603/604. */
661 else if (strcmp (arg
, "ppc") == 0
662 || strcmp (arg
, "ppc32") == 0
663 || strcmp (arg
, "403") == 0
664 || strcmp (arg
, "603") == 0
665 || strcmp (arg
, "604") == 0)
666 ppc_cpu
= PPC_OPCODE_PPC
;
667 /* -mppc64 and -m620 mean to assemble for the 64-bit PowerPC
669 else if (strcmp (arg
, "ppc64") == 0 || strcmp (arg
, "620") == 0)
671 ppc_cpu
= PPC_OPCODE_PPC
;
672 ppc_size
= PPC_OPCODE_64
;
674 /* -mcom means assemble for the common intersection between Power
675 and PowerPC. At present, we just allow the union, rather
676 than the intersection. */
677 else if (strcmp (arg
, "com") == 0)
678 ppc_cpu
= PPC_OPCODE_COMMON
;
679 /* -many means to assemble for any architecture (PWR/PWRX/PPC). */
680 else if (strcmp (arg
, "any") == 0)
681 ppc_cpu
= PPC_OPCODE_ANY
;
683 else if (strcmp (arg
, "regnames") == 0)
686 else if (strcmp (arg
, "no-regnames") == 0)
690 /* -mrelocatable/-mrelocatable-lib -- warn about initializations that require relocation */
691 else if (strcmp (arg
, "relocatable") == 0)
694 ppc_flags
|= EF_PPC_RELOCATABLE
;
697 else if (strcmp (arg
, "relocatable-lib") == 0)
700 ppc_flags
|= EF_PPC_RELOCATABLE_LIB
;
703 /* -memb, set embedded bit */
704 else if (strcmp (arg
, "emb") == 0)
705 ppc_flags
|= EF_PPC_EMB
;
707 /* -mlittle/-mbig set the endianess */
708 else if (strcmp (arg
, "little") == 0 || strcmp (arg
, "little-endian") == 0)
710 target_big_endian
= 0;
711 set_target_endian
= 1;
714 else if (strcmp (arg
, "big") == 0 || strcmp (arg
, "big-endian") == 0)
716 target_big_endian
= 1;
717 set_target_endian
= 1;
722 as_bad ("invalid switch -m%s", arg
);
728 /* -V: SVR4 argument to print version ID. */
733 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
734 should be emitted or not. FIXME: Not implemented. */
738 /* Solaris takes -s to specify that .stabs go in a .stabs section,
739 rather than .stabs.excl, which is ignored by the linker.
740 FIXME: Not implemented. */
756 md_show_usage (stream
)
762 -mpwrx, -mpwr2 generate code for IBM POWER/2 (RIOS2)\n\
763 -mpwr generate code for IBM POWER (RIOS1)\n\
764 -m601 generate code for Motorola PowerPC 601\n\
765 -mppc, -mppc32, -m403, -m603, -m604\n\
766 generate code for Motorola PowerPC 603/604\n\
767 -mppc64, -m620 generate code for Motorola PowerPC 620\n\
768 -mcom generate code Power/PowerPC common instructions\n\
769 -many generate code for any architecture (PWR/PWRX/PPC)\n\
770 -mregnames Allow symbolic names for registers\n\
771 -mno-regnames Do not allow symbolic names for registers\n");
774 -mrelocatable support for GCC's -mrelocatble option\n\
775 -mrelocatable-lib support for GCC's -mrelocatble-lib option\n\
776 -memb set PPC_EMB bit in ELF flags\n\
777 -mlittle, -mlittle-endian\n\
778 generate code for a little endian machine\n\
779 -mbig, -mbig-endian generate code for a big endian machine\n\
780 -V print assembler version number\n\
781 -Qy, -Qn ignored\n");
785 /* Set ppc_cpu if it is not already set. */
790 const char *default_os
= TARGET_OS
;
791 const char *default_cpu
= TARGET_CPU
;
795 if (strncmp (default_os
, "aix", 3) == 0
796 && default_os
[3] >= '4' && default_os
[3] <= '9')
797 ppc_cpu
= PPC_OPCODE_COMMON
;
798 else if (strncmp (default_os
, "aix3", 4) == 0)
799 ppc_cpu
= PPC_OPCODE_POWER
;
800 else if (strcmp (default_cpu
, "rs6000") == 0)
801 ppc_cpu
= PPC_OPCODE_POWER
;
802 else if (strcmp (default_cpu
, "powerpc") == 0
803 || strcmp (default_cpu
, "powerpcle") == 0)
804 ppc_cpu
= PPC_OPCODE_PPC
;
806 as_fatal ("Unknown default cpu = %s, os = %s", default_cpu
, default_os
);
810 /* Figure out the BFD architecture to use. */
812 enum bfd_architecture
815 const char *default_cpu
= TARGET_CPU
;
818 if ((ppc_cpu
& PPC_OPCODE_PPC
) != 0)
819 return bfd_arch_powerpc
;
820 else if ((ppc_cpu
& PPC_OPCODE_POWER
) != 0)
821 return bfd_arch_rs6000
;
822 else if ((ppc_cpu
& (PPC_OPCODE_COMMON
| PPC_OPCODE_ANY
)) != 0)
824 if (strcmp (default_cpu
, "rs6000") == 0)
825 return bfd_arch_rs6000
;
826 else if (strcmp (default_cpu
, "powerpc") == 0
827 || strcmp (default_cpu
, "powerpcle") == 0)
828 return bfd_arch_powerpc
;
831 as_fatal ("Neither Power nor PowerPC opcodes were selected.");
832 return bfd_arch_unknown
;
835 /* This function is called when the assembler starts up. It is called
836 after the options have been parsed and the output file has been
842 register const struct powerpc_opcode
*op
;
843 const struct powerpc_opcode
*op_end
;
844 const struct powerpc_macro
*macro
;
845 const struct powerpc_macro
*macro_end
;
846 boolean dup_insn
= false;
851 /* Set the ELF flags if desired. */
853 bfd_set_private_flags (stdoutput
, ppc_flags
);
856 /* Insert the opcodes into a hash table. */
857 ppc_hash
= hash_new ();
859 op_end
= powerpc_opcodes
+ powerpc_num_opcodes
;
860 for (op
= powerpc_opcodes
; op
< op_end
; op
++)
862 know ((op
->opcode
& op
->mask
) == op
->opcode
);
864 if ((op
->flags
& ppc_cpu
) != 0
865 && ((op
->flags
& (PPC_OPCODE_32
| PPC_OPCODE_64
)) == 0
866 || (op
->flags
& (PPC_OPCODE_32
| PPC_OPCODE_64
)) == ppc_size
))
870 retval
= hash_insert (ppc_hash
, op
->name
, (PTR
) op
);
871 if (retval
!= (const char *) NULL
)
873 /* Ignore Power duplicates for -m601 */
874 if ((ppc_cpu
& PPC_OPCODE_601
) != 0
875 && (op
->flags
& PPC_OPCODE_POWER
) != 0)
878 as_bad ("Internal assembler error for instruction %s", op
->name
);
884 /* Insert the macros into a hash table. */
885 ppc_macro_hash
= hash_new ();
887 macro_end
= powerpc_macros
+ powerpc_num_macros
;
888 for (macro
= powerpc_macros
; macro
< macro_end
; macro
++)
890 if ((macro
->flags
& ppc_cpu
) != 0)
894 retval
= hash_insert (ppc_macro_hash
, macro
->name
, (PTR
) macro
);
895 if (retval
!= (const char *) NULL
)
897 as_bad ("Internal assembler error for macro %s", macro
->name
);
906 /* Tell the main code what the endianness is if it is not overidden by the user. */
907 if (!set_target_endian
)
909 set_target_endian
= 1;
910 target_big_endian
= PPC_BIG_ENDIAN
;
914 ppc_coff_debug_section
= coff_section_from_bfd_index (stdoutput
, N_DEBUG
);
916 /* Create dummy symbols to serve as initial csects. This forces the
917 text csects to precede the data csects. These symbols will not
919 ppc_text_csects
= symbol_make ("dummy\001");
920 ppc_text_csects
->sy_tc
.within
= ppc_text_csects
;
921 ppc_data_csects
= symbol_make ("dummy\001");
922 ppc_data_csects
->sy_tc
.within
= ppc_data_csects
;
927 ppc_current_section
= text_section
;
928 ppc_previous_section
= 0;
933 /* Insert an operand value into an instruction. */
936 ppc_insert_operand (insn
, operand
, val
, file
, line
)
938 const struct powerpc_operand
*operand
;
943 if (operand
->bits
!= 32)
948 if ((operand
->flags
& PPC_OPERAND_SIGNED
) != 0)
950 if ((operand
->flags
& PPC_OPERAND_SIGNOPT
) != 0
951 && ppc_size
== PPC_OPCODE_32
)
952 max
= (1 << operand
->bits
) - 1;
954 max
= (1 << (operand
->bits
- 1)) - 1;
955 min
= - (1 << (operand
->bits
- 1));
959 max
= (1 << operand
->bits
) - 1;
963 if ((operand
->flags
& PPC_OPERAND_NEGATIVE
) != 0)
968 if (test
< (offsetT
) min
|| test
> (offsetT
) max
)
971 "operand out of range (%s not between %ld and %ld)";
974 sprint_value (buf
, test
);
975 if (file
== (char *) NULL
)
976 as_warn (err
, buf
, min
, max
);
978 as_warn_where (file
, line
, err
, buf
, min
, max
);
987 insn
= (*operand
->insert
) (insn
, (long) val
, &errmsg
);
988 if (errmsg
!= (const char *) NULL
)
992 insn
|= (((long) val
& ((1 << operand
->bits
) - 1))
999 /* Parse @got, etc. and return the desired relocation. */
1000 static bfd_reloc_code_real_type
1001 ppc_elf_suffix (str_p
)
1007 bfd_reloc_code_real_type reloc
;
1015 struct map_bfd
*ptr
;
1017 #define MAP(str,reloc) { str, sizeof(str)-1, reloc }
1019 static struct map_bfd mapping
[] = {
1020 MAP ("l", BFD_RELOC_LO16
),
1021 MAP ("h", BFD_RELOC_HI16
),
1022 MAP ("ha", BFD_RELOC_HI16_S
),
1023 MAP ("brtaken", BFD_RELOC_PPC_B16_BRTAKEN
),
1024 MAP ("brntaken", BFD_RELOC_PPC_B16_BRNTAKEN
),
1025 MAP ("got", BFD_RELOC_16_GOTOFF
),
1026 MAP ("got@l", BFD_RELOC_LO16_GOTOFF
),
1027 MAP ("got@h", BFD_RELOC_HI16_GOTOFF
),
1028 MAP ("got@ha", BFD_RELOC_HI16_S_GOTOFF
),
1029 MAP ("fixup", BFD_RELOC_CTOR
), /* warnings with -mrelocatable */
1030 MAP ("pltrel24", BFD_RELOC_24_PLT_PCREL
),
1031 MAP ("copy", BFD_RELOC_PPC_COPY
),
1032 MAP ("globdat", BFD_RELOC_PPC_GLOB_DAT
),
1033 MAP ("local24pc", BFD_RELOC_PPC_LOCAL24PC
),
1034 MAP ("plt", BFD_RELOC_32_PLTOFF
),
1035 MAP ("pltrel", BFD_RELOC_32_PLT_PCREL
),
1036 MAP ("plt@l", BFD_RELOC_LO16_PLTOFF
),
1037 MAP ("plt@h", BFD_RELOC_HI16_PLTOFF
),
1038 MAP ("plt@ha", BFD_RELOC_HI16_S_PLTOFF
),
1039 MAP ("sdarel", BFD_RELOC_GPREL16
),
1040 MAP ("sectoff", BFD_RELOC_32_BASEREL
),
1041 MAP ("sectoff@l", BFD_RELOC_LO16_BASEREL
),
1042 MAP ("sectoff@h", BFD_RELOC_HI16_BASEREL
),
1043 MAP ("sectoff@ha", BFD_RELOC_HI16_S_BASEREL
),
1044 MAP ("naddr", BFD_RELOC_PPC_EMB_NADDR32
),
1045 MAP ("naddr16", BFD_RELOC_PPC_EMB_NADDR16
),
1046 MAP ("naddr@l", BFD_RELOC_PPC_EMB_NADDR16_LO
),
1047 MAP ("naddr@h", BFD_RELOC_PPC_EMB_NADDR16_HI
),
1048 MAP ("naddr@ha", BFD_RELOC_PPC_EMB_NADDR16_HA
),
1049 MAP ("sdai16", BFD_RELOC_PPC_EMB_SDAI16
),
1050 MAP ("sda2rel", BFD_RELOC_PPC_EMB_SDA2REL
),
1051 MAP ("sda2i16", BFD_RELOC_PPC_EMB_SDA2I16
),
1052 MAP ("sda21", BFD_RELOC_PPC_EMB_SDA21
),
1053 MAP ("mrkref", BFD_RELOC_PPC_EMB_MRKREF
),
1054 MAP ("relsect", BFD_RELOC_PPC_EMB_RELSEC16
),
1055 MAP ("relsect@l", BFD_RELOC_PPC_EMB_RELST_LO
),
1056 MAP ("relsect@h", BFD_RELOC_PPC_EMB_RELST_HI
),
1057 MAP ("relsect@ha", BFD_RELOC_PPC_EMB_RELST_HA
),
1058 MAP ("bitfld", BFD_RELOC_PPC_EMB_BIT_FLD
),
1059 MAP ("relsda", BFD_RELOC_PPC_EMB_RELSDA
),
1060 MAP ("xgot", BFD_RELOC_PPC_TOC16
),
1062 { (char *)0, 0, BFD_RELOC_UNUSED
}
1066 return BFD_RELOC_UNUSED
;
1068 for (ch
= *str
, str2
= ident
;
1069 str2
< ident
+ sizeof(ident
) - 1 && isalnum (ch
) || ch
== '@';
1072 *str2
++ = (islower (ch
)) ? ch
: tolower (ch
);
1079 for (ptr
= &mapping
[0]; ptr
->length
> 0; ptr
++)
1080 if (ch
== ptr
->string
[0] && len
== ptr
->length
&& memcmp (ident
, ptr
->string
, ptr
->length
) == 0)
1086 return BFD_RELOC_UNUSED
;
1089 /* Like normal .long/.short/.word, except support @got, etc. */
1090 /* clobbers input_line_pointer, checks */
1093 ppc_elf_cons (nbytes
)
1094 register int nbytes
; /* 1=.byte, 2=.word, 4=.long */
1097 bfd_reloc_code_real_type reloc
;
1099 if (is_it_end_of_statement ())
1101 demand_empty_rest_of_line ();
1108 if (exp
.X_op
== O_symbol
1109 && *input_line_pointer
== '@'
1110 && (reloc
= ppc_elf_suffix (&input_line_pointer
)) != BFD_RELOC_UNUSED
)
1112 reloc_howto_type
*reloc_howto
= bfd_reloc_type_lookup (stdoutput
, reloc
);
1113 int size
= bfd_get_reloc_size (reloc_howto
);
1116 as_bad ("%s relocations do not fit in %d bytes\n", reloc_howto
->name
, nbytes
);
1120 register char *p
= frag_more ((int) nbytes
);
1121 int offset
= nbytes
- size
;
1123 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
+ offset
, size
, &exp
, 0, reloc
);
1127 emit_expr (&exp
, (unsigned int) nbytes
);
1129 while (*input_line_pointer
++ == ',');
1131 input_line_pointer
--; /* Put terminator back into stream. */
1132 demand_empty_rest_of_line ();
1135 /* Validate any relocations emitted for -mrelocatable, possibly adding
1136 fixups for word relocations in writable segments, so we can adjust
1139 ppc_elf_validate_fix (fixp
, seg
)
1146 && fixp
->fx_r_type
<= BFD_RELOC_UNUSED
1147 && fixp
->fx_r_type
!= BFD_RELOC_16_GOTOFF
1148 && fixp
->fx_r_type
!= BFD_RELOC_HI16_GOTOFF
1149 && fixp
->fx_r_type
!= BFD_RELOC_LO16_GOTOFF
1150 && fixp
->fx_r_type
!= BFD_RELOC_HI16_S_GOTOFF
1151 && fixp
->fx_r_type
!= BFD_RELOC_32_BASEREL
1152 && fixp
->fx_r_type
!= BFD_RELOC_LO16_BASEREL
1153 && fixp
->fx_r_type
!= BFD_RELOC_HI16_BASEREL
1154 && fixp
->fx_r_type
!= BFD_RELOC_HI16_S_BASEREL
1155 && strcmp (segment_name (seg
), ".got2") != 0
1156 && strcmp (segment_name (seg
), ".dtors") != 0
1157 && strcmp (segment_name (seg
), ".ctors") != 0
1158 && strcmp (segment_name (seg
), ".fixup") != 0
1159 && strcmp (segment_name (seg
), ".stab") != 0
1160 && strcmp (segment_name (seg
), ".gcc_except_table") != 0
1161 && strcmp (segment_name (seg
), ".ex_shared") != 0)
1163 if ((seg
->flags
& (SEC_READONLY
| SEC_CODE
)) != 0
1164 || fixp
->fx_r_type
!= BFD_RELOC_CTOR
)
1166 as_warn_where (fixp
->fx_file
, fixp
->fx_line
,
1167 "Relocation cannot be done when using -mrelocatable");
1172 #endif /* OBJ_ELF */
1177 * Summary of parse_toc_entry().
1179 * in: Input_line_pointer points to the '[' in one of:
1181 * [toc] [tocv] [toc32] [toc64]
1183 * Anything else is an error of one kind or another.
1186 * return value: success or failure
1187 * toc_kind: kind of toc reference
1188 * input_line_pointer:
1189 * success: first char after the ']'
1190 * failure: unchanged
1194 * [toc] - rv == success, toc_kind = default_toc
1195 * [tocv] - rv == success, toc_kind = data_in_toc
1196 * [toc32] - rv == success, toc_kind = must_be_32
1197 * [toc64] - rv == success, toc_kind = must_be_64
1201 enum toc_size_qualifier
1203 default_toc
, /* The toc cell constructed should be the system default size */
1204 data_in_toc
, /* This is a direct reference to a toc cell */
1205 must_be_32
, /* The toc cell constructed must be 32 bits wide */
1206 must_be_64
/* The toc cell constructed must be 64 bits wide */
1210 parse_toc_entry(toc_kind
)
1211 enum toc_size_qualifier
*toc_kind
;
1216 enum toc_size_qualifier t
;
1218 /* save the input_line_pointer */
1219 start
= input_line_pointer
;
1221 /* skip over the '[' , and whitespace */
1222 ++input_line_pointer
;
1225 /* find the spelling of the operand */
1226 toc_spec
= input_line_pointer
;
1227 c
= get_symbol_end ();
1229 if (strcmp(toc_spec
, "toc") == 0)
1233 else if (strcmp(toc_spec
, "tocv") == 0)
1237 else if (strcmp(toc_spec
, "toc32") == 0)
1241 else if (strcmp(toc_spec
, "toc64") == 0)
1247 as_bad ("syntax error: invalid toc specifier `%s'", toc_spec
);
1248 *input_line_pointer
= c
; /* put back the delimiting char */
1249 input_line_pointer
= start
; /* reset input_line pointer */
1253 /* now find the ']' */
1254 *input_line_pointer
= c
; /* put back the delimiting char */
1256 SKIP_WHITESPACE (); /* leading whitespace could be there. */
1257 c
= *input_line_pointer
++; /* input_line_pointer->past char in c. */
1261 as_bad ("syntax error: expected `]', found `%c'", c
);
1262 input_line_pointer
= start
; /* reset input_line pointer */
1266 *toc_kind
= t
; /* set return value */
1273 /* We need to keep a list of fixups. We can't simply generate them as
1274 we go, because that would require us to first create the frag, and
1275 that would screw up references to ``.''. */
1281 bfd_reloc_code_real_type reloc
;
1284 #define MAX_INSN_FIXUPS (5)
1286 /* This routine is called for each instruction to be assembled. */
1293 const struct powerpc_opcode
*opcode
;
1295 const unsigned char *opindex_ptr
;
1299 struct ppc_fixup fixups
[MAX_INSN_FIXUPS
];
1304 bfd_reloc_code_real_type reloc
;
1307 /* Get the opcode. */
1308 for (s
= str
; *s
!= '\0' && ! isspace (*s
); s
++)
1313 /* Look up the opcode in the hash table. */
1314 opcode
= (const struct powerpc_opcode
*) hash_find (ppc_hash
, str
);
1315 if (opcode
== (const struct powerpc_opcode
*) NULL
)
1317 const struct powerpc_macro
*macro
;
1319 macro
= (const struct powerpc_macro
*) hash_find (ppc_macro_hash
, str
);
1320 if (macro
== (const struct powerpc_macro
*) NULL
)
1321 as_bad ("Unrecognized opcode: `%s'", str
);
1323 ppc_macro (s
, macro
);
1328 insn
= opcode
->opcode
;
1331 while (isspace (*str
))
1334 /* PowerPC operands are just expressions. The only real issue is
1335 that a few operand types are optional. All cases which might use
1336 an optional operand separate the operands only with commas (in
1337 some cases parentheses are used, as in ``lwz 1,0(1)'' but such
1338 cases never have optional operands). There is never more than
1339 one optional operand for an instruction. So, before we start
1340 seriously parsing the operands, we check to see if we have an
1341 optional operand, and, if we do, we count the number of commas to
1342 see whether the operand should be omitted. */
1344 for (opindex_ptr
= opcode
->operands
; *opindex_ptr
!= 0; opindex_ptr
++)
1346 const struct powerpc_operand
*operand
;
1348 operand
= &powerpc_operands
[*opindex_ptr
];
1349 if ((operand
->flags
& PPC_OPERAND_OPTIONAL
) != 0)
1351 unsigned int opcount
;
1353 /* There is an optional operand. Count the number of
1354 commas in the input line. */
1361 while ((s
= strchr (s
, ',')) != (char *) NULL
)
1368 /* If there are fewer operands in the line then are called
1369 for by the instruction, we want to skip the optional
1371 if (opcount
< strlen (opcode
->operands
))
1378 /* Gather the operands. */
1382 for (opindex_ptr
= opcode
->operands
; *opindex_ptr
!= 0; opindex_ptr
++)
1384 const struct powerpc_operand
*operand
;
1390 if (next_opindex
== 0)
1391 operand
= &powerpc_operands
[*opindex_ptr
];
1394 operand
= &powerpc_operands
[next_opindex
];
1400 /* If this is a fake operand, then we do not expect anything
1402 if ((operand
->flags
& PPC_OPERAND_FAKE
) != 0)
1404 insn
= (*operand
->insert
) (insn
, 0L, &errmsg
);
1405 if (errmsg
!= (const char *) NULL
)
1410 /* If this is an optional operand, and we are skipping it, just
1412 if ((operand
->flags
& PPC_OPERAND_OPTIONAL
) != 0
1415 if (operand
->insert
)
1417 insn
= (*operand
->insert
) (insn
, 0L, &errmsg
);
1418 if (errmsg
!= (const char *) NULL
)
1421 if ((operand
->flags
& PPC_OPERAND_NEXT
) != 0)
1422 next_opindex
= *opindex_ptr
+ 1;
1426 /* Gather the operand. */
1427 hold
= input_line_pointer
;
1428 input_line_pointer
= str
;
1431 if (*input_line_pointer
== '[')
1433 /* We are expecting something like the second argument here:
1435 lwz r4,[toc].GS.0.static_int(rtoc)
1436 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
1437 The argument following the `]' must be a symbol name, and the
1438 register must be the toc register: 'rtoc' or '2'
1440 The effect is to 0 as the displacement field
1441 in the instruction, and issue an IMAGE_REL_PPC_TOCREL16 (or
1442 the appropriate variation) reloc against it based on the symbol.
1443 The linker will build the toc, and insert the resolved toc offset.
1446 o The size of the toc entry is currently assumed to be
1447 32 bits. This should not be assumed to be a hard coded
1449 o In an effort to cope with a change from 32 to 64 bits,
1450 there are also toc entries that are specified to be
1451 either 32 or 64 bits:
1452 lwz r4,[toc32].GS.0.static_int(rtoc)
1453 lwz r4,[toc64].GS.0.static_int(rtoc)
1454 These demand toc entries of the specified size, and the
1455 instruction probably requires it.
1459 enum toc_size_qualifier toc_kind
;
1460 bfd_reloc_code_real_type toc_reloc
;
1462 /* go parse off the [tocXX] part */
1463 valid_toc
= parse_toc_entry(&toc_kind
);
1467 /* Note: message has already been issued. */
1468 /* FIXME: what sort of recovery should we do? */
1469 /* demand_rest_of_line(); return; ? */
1472 /* Now get the symbol following the ']' */
1478 /* In this case, we may not have seen the symbol yet, since */
1479 /* it is allowed to appear on a .extern or .globl or just be */
1480 /* a label in the .data section. */
1481 toc_reloc
= BFD_RELOC_PPC_TOC16
;
1484 /* 1. The symbol must be defined and either in the toc */
1485 /* section, or a global. */
1486 /* 2. The reloc generated must have the TOCDEFN flag set in */
1487 /* upper bit mess of the reloc type. */
1488 /* FIXME: It's a little confusing what the tocv qualifier can */
1489 /* be used for. At the very least, I've seen three */
1490 /* uses, only one of which I'm sure I can explain. */
1491 if (ex
.X_op
== O_symbol
)
1493 assert (ex
.X_add_symbol
!= NULL
);
1494 if (ex
.X_add_symbol
->bsym
->section
!= tocdata_section
)
1496 as_warn("[tocv] symbol is not a toc symbol");
1500 toc_reloc
= BFD_RELOC_PPC_TOC16
;
1503 /* FIXME: these next two specifically specify 32/64 bit toc */
1504 /* entries. We don't support them today. Is this the */
1505 /* right way to say that? */
1506 toc_reloc
= BFD_RELOC_UNUSED
;
1507 as_bad ("Unimplemented toc32 expression modifier");
1510 /* FIXME: see above */
1511 toc_reloc
= BFD_RELOC_UNUSED
;
1512 as_bad ("Unimplemented toc64 expression modifier");
1516 "Unexpected return value [%d] from parse_toc_entry!\n",
1522 /* We need to generate a fixup for this expression. */
1523 if (fc
>= MAX_INSN_FIXUPS
)
1524 as_fatal ("too many fixups");
1526 fixups
[fc
].reloc
= toc_reloc
;
1527 fixups
[fc
].exp
= ex
;
1528 fixups
[fc
].opindex
= *opindex_ptr
;
1531 /* Ok. We've set up the fixup for the instruction. Now make it
1532 look like the constant 0 was found here */
1534 ex
.X_op
= O_constant
;
1535 ex
.X_add_number
= 0;
1536 ex
.X_add_symbol
= NULL
;
1537 ex
.X_op_symbol
= NULL
;
1542 if (!register_name(&ex
))
1545 str
= input_line_pointer
;
1546 input_line_pointer
= hold
;
1548 if (ex
.X_op
== O_illegal
)
1549 as_bad ("illegal operand");
1550 else if (ex
.X_op
== O_absent
)
1551 as_bad ("missing operand");
1552 else if (ex
.X_op
== O_register
)
1554 insn
= ppc_insert_operand (insn
, operand
, ex
.X_add_number
,
1557 else if (ex
.X_op
== O_constant
)
1560 /* Allow @HA, @L, @H on constants. */
1561 char *orig_str
= str
;
1563 if ((reloc
= ppc_elf_suffix (&str
)) != BFD_RELOC_UNUSED
)
1570 case BFD_RELOC_LO16
:
1571 ex
.X_add_number
= ((ex
.X_add_number
& 0xffff) ^ 0x8000) - 0x8000;
1574 case BFD_RELOC_HI16
:
1575 ex
.X_add_number
= (ex
.X_add_number
>> 16) & 0xffff;
1578 case BFD_RELOC_HI16_S
:
1579 ex
.X_add_number
= ((ex
.X_add_number
>> 16) & 0xffff)
1580 + ((ex
.X_add_number
>> 15) & 1);
1584 insn
= ppc_insert_operand (insn
, operand
, ex
.X_add_number
,
1588 else if ((reloc
= ppc_elf_suffix (&str
)) != BFD_RELOC_UNUSED
)
1590 /* For the absoulte forms of branchs, convert the PC relative form back into
1592 if ((operand
->flags
& PPC_OPERAND_ABSOLUTE
) != 0)
1595 case BFD_RELOC_PPC_B26
: reloc
= BFD_RELOC_PPC_BA26
; break;
1596 case BFD_RELOC_PPC_B16
: reloc
= BFD_RELOC_PPC_BA16
; break;
1597 case BFD_RELOC_PPC_B16_BRTAKEN
: reloc
= BFD_RELOC_PPC_BA16_BRTAKEN
; break;
1598 case BFD_RELOC_PPC_B16_BRNTAKEN
: reloc
= BFD_RELOC_PPC_BA16_BRNTAKEN
; break;
1601 /* We need to generate a fixup for this expression. */
1602 if (fc
>= MAX_INSN_FIXUPS
)
1603 as_fatal ("too many fixups");
1604 fixups
[fc
].exp
= ex
;
1605 fixups
[fc
].opindex
= 0;
1606 fixups
[fc
].reloc
= reloc
;
1609 #endif /* OBJ_ELF */
1613 /* We need to generate a fixup for this expression. */
1614 if (fc
>= MAX_INSN_FIXUPS
)
1615 as_fatal ("too many fixups");
1616 fixups
[fc
].exp
= ex
;
1617 fixups
[fc
].opindex
= *opindex_ptr
;
1618 fixups
[fc
].reloc
= BFD_RELOC_UNUSED
;
1627 else if ((operand
->flags
& PPC_OPERAND_PARENS
) != 0)
1635 /* The call to expression should have advanced str past any
1638 && (endc
!= ',' || *str
!= '\0'))
1640 as_bad ("syntax error; found `%c' but expected `%c'", *str
, endc
);
1648 while (isspace (*str
))
1652 as_bad ("junk at end of line: `%s'", str
);
1654 /* Write out the instruction. */
1656 md_number_to_chars (f
, insn
, 4);
1658 /* Create any fixups. At this point we do not use a
1659 bfd_reloc_code_real_type, but instead just use the
1660 BFD_RELOC_UNUSED plus the operand index. This lets us easily
1661 handle fixups for any operand type, although that is admittedly
1662 not a very exciting feature. We pick a BFD reloc type in
1664 for (i
= 0; i
< fc
; i
++)
1666 const struct powerpc_operand
*operand
;
1668 operand
= &powerpc_operands
[fixups
[i
].opindex
];
1669 if (fixups
[i
].reloc
!= BFD_RELOC_UNUSED
)
1671 reloc_howto_type
*reloc_howto
= bfd_reloc_type_lookup (stdoutput
, fixups
[i
].reloc
);
1679 size
= bfd_get_reloc_size (reloc_howto
);
1680 offset
= target_big_endian
? (4 - size
) : 0;
1682 if (size
< 1 || size
> 4)
1685 fixP
= fix_new_exp (frag_now
, f
- frag_now
->fr_literal
+ offset
, size
,
1686 &fixups
[i
].exp
, reloc_howto
->pc_relative
,
1689 /* Turn off complaints that the addend is too large for things like
1691 switch (fixups
[i
].reloc
)
1693 case BFD_RELOC_16_GOTOFF
:
1694 case BFD_RELOC_PPC_TOC16
:
1695 case BFD_RELOC_LO16
:
1696 case BFD_RELOC_HI16
:
1697 case BFD_RELOC_HI16_S
:
1698 fixP
->fx_no_overflow
= 1;
1705 fix_new_exp (frag_now
, f
- frag_now
->fr_literal
, 4,
1707 (operand
->flags
& PPC_OPERAND_RELATIVE
) != 0,
1708 ((bfd_reloc_code_real_type
)
1709 (fixups
[i
].opindex
+ (int) BFD_RELOC_UNUSED
)));
1713 #ifndef WORKING_DOT_WORD
1714 /* Handle long and short jumps */
1716 md_create_short_jump (ptr
, from_addr
, to_addr
, frag
, to_symbol
)
1718 addressT from_addr
, to_addr
;
1726 md_create_long_jump (ptr
, from_addr
, to_addr
, frag
, to_symbol
)
1728 addressT from_addr
, to_addr
;
1736 /* Handle a macro. Gather all the operands, transform them as
1737 described by the macro, and call md_assemble recursively. All the
1738 operands are separated by commas; we don't accept parentheses
1739 around operands here. */
1742 ppc_macro (str
, macro
)
1744 const struct powerpc_macro
*macro
;
1755 /* Gather the users operands into the operands array. */
1760 if (count
>= sizeof operands
/ sizeof operands
[0])
1762 operands
[count
++] = s
;
1763 s
= strchr (s
, ',');
1764 if (s
== (char *) NULL
)
1769 if (count
!= macro
->operands
)
1771 as_bad ("wrong number of operands");
1775 /* Work out how large the string must be (the size is unbounded
1776 because it includes user input). */
1778 format
= macro
->format
;
1779 while (*format
!= '\0')
1788 arg
= strtol (format
+ 1, &send
, 10);
1789 know (send
!= format
&& arg
>= 0 && arg
< count
);
1790 len
+= strlen (operands
[arg
]);
1795 /* Put the string together. */
1796 complete
= s
= (char *) alloca (len
+ 1);
1797 format
= macro
->format
;
1798 while (*format
!= '\0')
1804 arg
= strtol (format
+ 1, &send
, 10);
1805 strcpy (s
, operands
[arg
]);
1812 /* Assemble the constructed instruction. */
1813 md_assemble (complete
);
1817 /* For ELF, add support for SHF_EXCLUDE and SHT_ORDERED */
1820 ppc_section_letter (letter
, ptr_msg
)
1827 *ptr_msg
= "Bad .section directive: want a,w,x,e in string";
1832 ppc_section_word (ptr_str
)
1835 if (strncmp (*ptr_str
, "exclude", sizeof ("exclude")-1) == 0)
1837 *ptr_str
+= sizeof ("exclude")-1;
1845 ppc_section_type (ptr_str
)
1848 if (strncmp (*ptr_str
, "ordered", sizeof ("ordered")-1) == 0)
1850 *ptr_str
+= sizeof ("ordered")-1;
1858 ppc_section_flags (flags
, attr
, type
)
1863 if (type
== SHT_ORDERED
)
1864 flags
|= SEC_ALLOC
| SEC_LOAD
| SEC_SORT_ENTRIES
;
1866 if (attr
& SHF_EXCLUDE
)
1867 flags
|= SEC_EXCLUDE
;
1871 #endif /* OBJ_ELF */
1874 /* Pseudo-op handling. */
1876 /* The .byte pseudo-op. This is similar to the normal .byte
1877 pseudo-op, but it can also take a single ASCII string. */
1883 if (*input_line_pointer
!= '\"')
1889 /* Gather characters. A real double quote is doubled. Unusual
1890 characters are not permitted. */
1891 ++input_line_pointer
;
1896 c
= *input_line_pointer
++;
1900 if (*input_line_pointer
!= '\"')
1902 ++input_line_pointer
;
1905 FRAG_APPEND_1_CHAR (c
);
1908 demand_empty_rest_of_line ();
1913 /* XCOFF specific pseudo-op handling. */
1915 /* This is set if we are creating a .stabx symbol, since we don't want
1916 to handle symbol suffixes for such symbols. */
1917 static boolean ppc_stab_symbol
;
1919 /* The .comm and .lcomm pseudo-ops for XCOFF. XCOFF puts common
1920 symbols in the .bss segment as though they were local common
1921 symbols, and uses a different smclas. */
1927 asection
*current_seg
= now_seg
;
1928 subsegT current_subseg
= now_subseg
;
1934 symbolS
*lcomm_sym
= NULL
;
1938 name
= input_line_pointer
;
1939 endc
= get_symbol_end ();
1940 end_name
= input_line_pointer
;
1943 if (*input_line_pointer
!= ',')
1945 as_bad ("missing size");
1946 ignore_rest_of_line ();
1949 ++input_line_pointer
;
1951 size
= get_absolute_expression ();
1954 as_bad ("negative size");
1955 ignore_rest_of_line ();
1961 /* The third argument to .comm is the alignment. */
1962 if (*input_line_pointer
!= ',')
1966 ++input_line_pointer
;
1967 align
= get_absolute_expression ();
1970 as_warn ("ignoring bad alignment");
1989 /* The third argument to .lcomm appears to be the real local
1990 common symbol to create. References to the symbol named in
1991 the first argument are turned into references to the third
1993 if (*input_line_pointer
!= ',')
1995 as_bad ("missing real symbol name");
1996 ignore_rest_of_line ();
1999 ++input_line_pointer
;
2001 lcomm_name
= input_line_pointer
;
2002 lcomm_endc
= get_symbol_end ();
2004 lcomm_sym
= symbol_find_or_make (lcomm_name
);
2006 *input_line_pointer
= lcomm_endc
;
2010 sym
= symbol_find_or_make (name
);
2013 if (S_IS_DEFINED (sym
)
2014 || S_GET_VALUE (sym
) != 0)
2016 as_bad ("attempt to redefine symbol");
2017 ignore_rest_of_line ();
2021 record_alignment (bss_section
, align
);
2024 || ! S_IS_DEFINED (lcomm_sym
))
2033 S_SET_EXTERNAL (sym
);
2037 lcomm_sym
->sy_tc
.output
= 1;
2038 def_sym
= lcomm_sym
;
2042 subseg_set (bss_section
, 1);
2043 frag_align (align
, 0);
2045 def_sym
->sy_frag
= frag_now
;
2046 pfrag
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, def_sym
,
2047 def_size
, (char *) NULL
);
2049 S_SET_SEGMENT (def_sym
, bss_section
);
2050 def_sym
->sy_tc
.align
= align
;
2054 /* Align the size of lcomm_sym. */
2055 lcomm_sym
->sy_frag
->fr_offset
=
2056 ((lcomm_sym
->sy_frag
->fr_offset
+ (1 << align
) - 1)
2057 &~ ((1 << align
) - 1));
2058 if (align
> lcomm_sym
->sy_tc
.align
)
2059 lcomm_sym
->sy_tc
.align
= align
;
2064 /* Make sym an offset from lcomm_sym. */
2065 S_SET_SEGMENT (sym
, bss_section
);
2066 sym
->sy_frag
= lcomm_sym
->sy_frag
;
2067 S_SET_VALUE (sym
, lcomm_sym
->sy_frag
->fr_offset
);
2068 lcomm_sym
->sy_frag
->fr_offset
+= size
;
2071 subseg_set (current_seg
, current_subseg
);
2073 demand_empty_rest_of_line ();
2076 /* The .csect pseudo-op. This switches us into a different
2077 subsegment. The first argument is a symbol whose value is the
2078 start of the .csect. In COFF, csect symbols get special aux
2079 entries defined by the x_csect field of union internal_auxent. The
2080 optional second argument is the alignment (the default is 2). */
2090 name
= input_line_pointer
;
2091 endc
= get_symbol_end ();
2093 sym
= symbol_find_or_make (name
);
2095 *input_line_pointer
= endc
;
2097 if (S_GET_NAME (sym
)[0] == '\0')
2099 /* An unnamed csect is assumed to be [PR]. */
2100 sym
->sy_tc
.class = XMC_PR
;
2103 ppc_change_csect (sym
);
2105 if (*input_line_pointer
== ',')
2107 ++input_line_pointer
;
2108 sym
->sy_tc
.align
= get_absolute_expression ();
2111 demand_empty_rest_of_line ();
2114 /* Change to a different csect. */
2117 ppc_change_csect (sym
)
2120 if (S_IS_DEFINED (sym
))
2121 subseg_set (S_GET_SEGMENT (sym
), sym
->sy_tc
.subseg
);
2128 /* This is a new csect. We need to look at the symbol class to
2129 figure out whether it should go in the text section or the
2132 switch (sym
->sy_tc
.class)
2142 S_SET_SEGMENT (sym
, text_section
);
2143 sym
->sy_tc
.subseg
= ppc_text_subsegment
;
2144 ++ppc_text_subsegment
;
2145 list_ptr
= &ppc_text_csects
;
2154 if (ppc_toc_csect
!= NULL
2155 && ppc_toc_csect
->sy_tc
.subseg
+ 1 == ppc_data_subsegment
)
2157 S_SET_SEGMENT (sym
, data_section
);
2158 sym
->sy_tc
.subseg
= ppc_data_subsegment
;
2159 ++ppc_data_subsegment
;
2160 list_ptr
= &ppc_data_csects
;
2166 subseg_new (segment_name (S_GET_SEGMENT (sym
)), sym
->sy_tc
.subseg
);
2168 ppc_after_toc_frag
= frag_now
;
2170 sym
->sy_frag
= frag_now
;
2171 S_SET_VALUE (sym
, (valueT
) frag_now_fix ());
2173 sym
->sy_tc
.align
= 2;
2174 sym
->sy_tc
.output
= 1;
2175 sym
->sy_tc
.within
= sym
;
2177 for (list
= *list_ptr
;
2178 list
->sy_tc
.next
!= (symbolS
*) NULL
;
2179 list
= list
->sy_tc
.next
)
2181 list
->sy_tc
.next
= sym
;
2183 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
2184 symbol_append (sym
, list
->sy_tc
.within
, &symbol_rootP
, &symbol_lastP
);
2187 ppc_current_csect
= sym
;
2190 /* This function handles the .text and .data pseudo-ops. These
2191 pseudo-ops aren't really used by XCOFF; we implement them for the
2192 convenience of people who aren't used to XCOFF. */
2203 else if (type
== 'd')
2208 sym
= symbol_find_or_make (name
);
2210 ppc_change_csect (sym
);
2212 demand_empty_rest_of_line ();
2215 /* The .extern pseudo-op. We create an undefined symbol. */
2224 name
= input_line_pointer
;
2225 endc
= get_symbol_end ();
2227 (void) symbol_find_or_make (name
);
2229 *input_line_pointer
= endc
;
2231 demand_empty_rest_of_line ();
2234 /* The .lglobl pseudo-op. Keep the symbol in the symbol table. */
2244 name
= input_line_pointer
;
2245 endc
= get_symbol_end ();
2247 sym
= symbol_find_or_make (name
);
2249 *input_line_pointer
= endc
;
2251 sym
->sy_tc
.output
= 1;
2253 demand_empty_rest_of_line ();
2256 /* The .rename pseudo-op. The RS/6000 assembler can rename symbols,
2257 although I don't know why it bothers. */
2268 name
= input_line_pointer
;
2269 endc
= get_symbol_end ();
2271 sym
= symbol_find_or_make (name
);
2273 *input_line_pointer
= endc
;
2275 if (*input_line_pointer
!= ',')
2277 as_bad ("missing rename string");
2278 ignore_rest_of_line ();
2281 ++input_line_pointer
;
2283 sym
->sy_tc
.real_name
= demand_copy_C_string (&len
);
2285 demand_empty_rest_of_line ();
2288 /* The .stabx pseudo-op. This is similar to a normal .stabs
2289 pseudo-op, but slightly different. A sample is
2290 .stabx "main:F-1",.main,142,0
2291 The first argument is the symbol name to create. The second is the
2292 value, and the third is the storage class. The fourth seems to be
2293 always zero, and I am assuming it is the type. */
2304 name
= demand_copy_C_string (&len
);
2306 if (*input_line_pointer
!= ',')
2308 as_bad ("missing value");
2311 ++input_line_pointer
;
2313 ppc_stab_symbol
= true;
2314 sym
= symbol_make (name
);
2315 ppc_stab_symbol
= false;
2317 sym
->sy_tc
.real_name
= name
;
2319 (void) expression (&exp
);
2326 as_bad ("illegal .stabx expression; zero assumed");
2327 exp
.X_add_number
= 0;
2330 S_SET_VALUE (sym
, (valueT
) exp
.X_add_number
);
2331 sym
->sy_frag
= &zero_address_frag
;
2335 if (S_GET_SEGMENT (exp
.X_add_symbol
) == undefined_section
)
2336 sym
->sy_value
= exp
;
2340 exp
.X_add_number
+ S_GET_VALUE (exp
.X_add_symbol
));
2341 sym
->sy_frag
= exp
.X_add_symbol
->sy_frag
;
2346 /* The value is some complex expression. This will probably
2347 fail at some later point, but this is probably the right
2348 thing to do here. */
2349 sym
->sy_value
= exp
;
2353 S_SET_SEGMENT (sym
, ppc_coff_debug_section
);
2354 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2356 if (*input_line_pointer
!= ',')
2358 as_bad ("missing class");
2361 ++input_line_pointer
;
2363 S_SET_STORAGE_CLASS (sym
, get_absolute_expression ());
2365 if (*input_line_pointer
!= ',')
2367 as_bad ("missing type");
2370 ++input_line_pointer
;
2372 S_SET_DATA_TYPE (sym
, get_absolute_expression ());
2374 sym
->sy_tc
.output
= 1;
2376 if (S_GET_STORAGE_CLASS (sym
) == C_STSYM
)
2377 sym
->sy_tc
.within
= ppc_current_block
;
2379 if (exp
.X_op
!= O_symbol
2380 || ! S_IS_EXTERNAL (exp
.X_add_symbol
)
2381 || S_GET_SEGMENT (exp
.X_add_symbol
) != bss_section
)
2382 ppc_frob_label (sym
);
2385 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
2386 symbol_append (sym
, exp
.X_add_symbol
, &symbol_rootP
, &symbol_lastP
);
2387 if (ppc_current_csect
->sy_tc
.within
== exp
.X_add_symbol
)
2388 ppc_current_csect
->sy_tc
.within
= sym
;
2391 demand_empty_rest_of_line ();
2394 /* The .function pseudo-op. This takes several arguments. The first
2395 argument seems to be the external name of the symbol. The second
2396 argment seems to be the label for the start of the function. gcc
2397 uses the same name for both. I have no idea what the third and
2398 fourth arguments are meant to be. The optional fifth argument is
2399 an expression for the size of the function. In COFF this symbol
2400 gets an aux entry like that used for a csect. */
2403 ppc_function (ignore
)
2412 name
= input_line_pointer
;
2413 endc
= get_symbol_end ();
2415 /* Ignore any [PR] suffix. */
2416 name
= ppc_canonicalize_symbol_name (name
);
2417 s
= strchr (name
, '[');
2418 if (s
!= (char *) NULL
2419 && strcmp (s
+ 1, "PR]") == 0)
2422 ext_sym
= symbol_find_or_make (name
);
2424 *input_line_pointer
= endc
;
2426 if (*input_line_pointer
!= ',')
2428 as_bad ("missing symbol name");
2429 ignore_rest_of_line ();
2432 ++input_line_pointer
;
2434 name
= input_line_pointer
;
2435 endc
= get_symbol_end ();
2437 lab_sym
= symbol_find_or_make (name
);
2439 *input_line_pointer
= endc
;
2441 if (ext_sym
!= lab_sym
)
2443 ext_sym
->sy_value
.X_op
= O_symbol
;
2444 ext_sym
->sy_value
.X_add_symbol
= lab_sym
;
2445 ext_sym
->sy_value
.X_op_symbol
= NULL
;
2446 ext_sym
->sy_value
.X_add_number
= 0;
2449 if (ext_sym
->sy_tc
.class == -1)
2450 ext_sym
->sy_tc
.class = XMC_PR
;
2451 ext_sym
->sy_tc
.output
= 1;
2453 if (*input_line_pointer
== ',')
2457 /* Ignore the third argument. */
2458 ++input_line_pointer
;
2459 expression (&ignore
);
2460 if (*input_line_pointer
== ',')
2462 /* Ignore the fourth argument. */
2463 ++input_line_pointer
;
2464 expression (&ignore
);
2465 if (*input_line_pointer
== ',')
2467 /* The fifth argument is the function size. */
2468 ++input_line_pointer
;
2469 ext_sym
->sy_tc
.size
= symbol_new ("L0\001",
2472 &zero_address_frag
);
2473 pseudo_set (ext_sym
->sy_tc
.size
);
2478 S_SET_DATA_TYPE (ext_sym
, DT_FCN
<< N_BTSHFT
);
2479 SF_SET_FUNCTION (ext_sym
);
2480 SF_SET_PROCESS (ext_sym
);
2481 coff_add_linesym (ext_sym
);
2483 demand_empty_rest_of_line ();
2486 /* The .bf pseudo-op. This is just like a COFF C_FCN symbol named
2495 sym
= symbol_make (".bf");
2496 S_SET_SEGMENT (sym
, text_section
);
2497 sym
->sy_frag
= frag_now
;
2498 S_SET_VALUE (sym
, frag_now_fix ());
2499 S_SET_STORAGE_CLASS (sym
, C_FCN
);
2501 coff_line_base
= get_absolute_expression ();
2503 S_SET_NUMBER_AUXILIARY (sym
, 1);
2504 SA_SET_SYM_LNNO (sym
, coff_line_base
);
2506 sym
->sy_tc
.output
= 1;
2508 ppc_frob_label (sym
);
2510 demand_empty_rest_of_line ();
2513 /* The .ef pseudo-op. This is just like a COFF C_FCN symbol named
2514 ".ef", except that the line number is absolute, not relative to the
2515 most recent ".bf" symbol. */
2523 sym
= symbol_make (".ef");
2524 S_SET_SEGMENT (sym
, text_section
);
2525 sym
->sy_frag
= frag_now
;
2526 S_SET_VALUE (sym
, frag_now_fix ());
2527 S_SET_STORAGE_CLASS (sym
, C_FCN
);
2528 S_SET_NUMBER_AUXILIARY (sym
, 1);
2529 SA_SET_SYM_LNNO (sym
, get_absolute_expression ());
2530 sym
->sy_tc
.output
= 1;
2532 ppc_frob_label (sym
);
2534 demand_empty_rest_of_line ();
2537 /* The .bi and .ei pseudo-ops. These take a string argument and
2538 generates a C_BINCL or C_EINCL symbol, which goes at the start of
2550 name
= demand_copy_C_string (&len
);
2552 /* The value of these symbols is actually file offset. Here we set
2553 the value to the index into the line number entries. In
2554 ppc_frob_symbols we set the fix_line field, which will cause BFD
2555 to do the right thing. */
2557 sym
= symbol_make (name
);
2558 /* obj-coff.c currently only handles line numbers correctly in the
2560 S_SET_SEGMENT (sym
, text_section
);
2561 S_SET_VALUE (sym
, coff_n_line_nos
);
2562 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2564 S_SET_STORAGE_CLASS (sym
, ei
? C_EINCL
: C_BINCL
);
2565 sym
->sy_tc
.output
= 1;
2567 for (look
= symbol_rootP
;
2568 (look
!= (symbolS
*) NULL
2569 && (S_GET_STORAGE_CLASS (look
) == C_FILE
2570 || S_GET_STORAGE_CLASS (look
) == C_BINCL
2571 || S_GET_STORAGE_CLASS (look
) == C_EINCL
));
2572 look
= symbol_next (look
))
2574 if (look
!= (symbolS
*) NULL
)
2576 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
2577 symbol_insert (sym
, look
, &symbol_rootP
, &symbol_lastP
);
2580 demand_empty_rest_of_line ();
2583 /* The .bs pseudo-op. This generates a C_BSTAT symbol named ".bs".
2584 There is one argument, which is a csect symbol. The value of the
2585 .bs symbol is the index of this csect symbol. */
2596 if (ppc_current_block
!= NULL
)
2597 as_bad ("nested .bs blocks");
2599 name
= input_line_pointer
;
2600 endc
= get_symbol_end ();
2602 csect
= symbol_find_or_make (name
);
2604 *input_line_pointer
= endc
;
2606 sym
= symbol_make (".bs");
2607 S_SET_SEGMENT (sym
, now_seg
);
2608 S_SET_STORAGE_CLASS (sym
, C_BSTAT
);
2609 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2610 sym
->sy_tc
.output
= 1;
2612 sym
->sy_tc
.within
= csect
;
2614 ppc_frob_label (sym
);
2616 ppc_current_block
= sym
;
2618 demand_empty_rest_of_line ();
2621 /* The .es pseudo-op. Generate a C_ESTART symbol named .es. */
2629 if (ppc_current_block
== NULL
)
2630 as_bad (".es without preceding .bs");
2632 sym
= symbol_make (".es");
2633 S_SET_SEGMENT (sym
, now_seg
);
2634 S_SET_STORAGE_CLASS (sym
, C_ESTAT
);
2635 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2636 sym
->sy_tc
.output
= 1;
2638 ppc_frob_label (sym
);
2640 ppc_current_block
= NULL
;
2642 demand_empty_rest_of_line ();
2645 /* The .bb pseudo-op. Generate a C_BLOCK symbol named .bb, with a
2654 sym
= symbol_make (".bb");
2655 S_SET_SEGMENT (sym
, text_section
);
2656 sym
->sy_frag
= frag_now
;
2657 S_SET_VALUE (sym
, frag_now_fix ());
2658 S_SET_STORAGE_CLASS (sym
, C_BLOCK
);
2660 S_SET_NUMBER_AUXILIARY (sym
, 1);
2661 SA_SET_SYM_LNNO (sym
, get_absolute_expression ());
2663 sym
->sy_tc
.output
= 1;
2665 SF_SET_PROCESS (sym
);
2667 ppc_frob_label (sym
);
2669 demand_empty_rest_of_line ();
2672 /* The .eb pseudo-op. Generate a C_BLOCK symbol named .eb, with a
2681 sym
= symbol_make (".eb");
2682 S_SET_SEGMENT (sym
, text_section
);
2683 sym
->sy_frag
= frag_now
;
2684 S_SET_VALUE (sym
, frag_now_fix ());
2685 S_SET_STORAGE_CLASS (sym
, C_BLOCK
);
2686 S_SET_NUMBER_AUXILIARY (sym
, 1);
2687 SA_SET_SYM_LNNO (sym
, get_absolute_expression ());
2688 sym
->sy_tc
.output
= 1;
2690 SF_SET_PROCESS (sym
);
2692 ppc_frob_label (sym
);
2694 demand_empty_rest_of_line ();
2697 /* The .bc pseudo-op. This just creates a C_BCOMM symbol with a
2708 name
= demand_copy_C_string (&len
);
2709 sym
= symbol_make (name
);
2710 S_SET_SEGMENT (sym
, ppc_coff_debug_section
);
2711 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2712 S_SET_STORAGE_CLASS (sym
, C_BCOMM
);
2713 S_SET_VALUE (sym
, 0);
2714 sym
->sy_tc
.output
= 1;
2716 ppc_frob_label (sym
);
2718 demand_empty_rest_of_line ();
2721 /* The .ec pseudo-op. This just creates a C_ECOMM symbol. */
2729 sym
= symbol_make (".ec");
2730 S_SET_SEGMENT (sym
, ppc_coff_debug_section
);
2731 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2732 S_SET_STORAGE_CLASS (sym
, C_ECOMM
);
2733 S_SET_VALUE (sym
, 0);
2734 sym
->sy_tc
.output
= 1;
2736 ppc_frob_label (sym
);
2738 demand_empty_rest_of_line ();
2741 /* The .toc pseudo-op. Switch to the .toc subsegment. */
2747 if (ppc_toc_csect
!= (symbolS
*) NULL
)
2748 subseg_set (data_section
, ppc_toc_csect
->sy_tc
.subseg
);
2755 subseg
= ppc_data_subsegment
;
2756 ++ppc_data_subsegment
;
2758 subseg_new (segment_name (data_section
), subseg
);
2759 ppc_toc_frag
= frag_now
;
2761 sym
= symbol_find_or_make ("TOC[TC0]");
2762 sym
->sy_frag
= frag_now
;
2763 S_SET_SEGMENT (sym
, data_section
);
2764 S_SET_VALUE (sym
, (valueT
) frag_now_fix ());
2765 sym
->sy_tc
.subseg
= subseg
;
2766 sym
->sy_tc
.output
= 1;
2767 sym
->sy_tc
.within
= sym
;
2769 ppc_toc_csect
= sym
;
2771 for (list
= ppc_data_csects
;
2772 list
->sy_tc
.next
!= (symbolS
*) NULL
;
2773 list
= list
->sy_tc
.next
)
2775 list
->sy_tc
.next
= sym
;
2777 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
2778 symbol_append (sym
, list
->sy_tc
.within
, &symbol_rootP
, &symbol_lastP
);
2781 ppc_current_csect
= ppc_toc_csect
;
2783 demand_empty_rest_of_line ();
2786 #endif /* OBJ_XCOFF */
2788 /* The .tc pseudo-op. This is used when generating either XCOFF or
2789 ELF. This takes two or more arguments.
2791 When generating XCOFF output, the first argument is the name to
2792 give to this location in the toc; this will be a symbol with class
2793 TC. The rest of the arguments are 4 byte values to actually put at
2794 this location in the TOC; often there is just one more argument, a
2795 relocateable symbol reference.
2797 When not generating XCOFF output, the arguments are the same, but
2798 the first argument is simply ignored. */
2806 /* Define the TOC symbol name. */
2812 if (ppc_toc_csect
== (symbolS
*) NULL
2813 || ppc_toc_csect
!= ppc_current_csect
)
2815 as_bad (".tc not in .toc section");
2816 ignore_rest_of_line ();
2820 name
= input_line_pointer
;
2821 endc
= get_symbol_end ();
2823 sym
= symbol_find_or_make (name
);
2825 *input_line_pointer
= endc
;
2827 if (S_IS_DEFINED (sym
))
2831 label
= ppc_current_csect
->sy_tc
.within
;
2832 if (label
->sy_tc
.class != XMC_TC0
)
2834 as_warn (".tc with no label");
2835 ignore_rest_of_line ();
2839 S_SET_SEGMENT (label
, S_GET_SEGMENT (sym
));
2840 label
->sy_frag
= sym
->sy_frag
;
2841 S_SET_VALUE (label
, S_GET_VALUE (sym
));
2843 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
2844 ++input_line_pointer
;
2849 S_SET_SEGMENT (sym
, now_seg
);
2850 sym
->sy_frag
= frag_now
;
2851 S_SET_VALUE (sym
, (valueT
) frag_now_fix ());
2852 sym
->sy_tc
.class = XMC_TC
;
2853 sym
->sy_tc
.output
= 1;
2855 ppc_frob_label (sym
);
2858 #else /* ! defined (OBJ_XCOFF) */
2860 /* Skip the TOC symbol name. */
2861 while (is_part_of_name (*input_line_pointer
)
2862 || *input_line_pointer
== '['
2863 || *input_line_pointer
== ']'
2864 || *input_line_pointer
== '{'
2865 || *input_line_pointer
== '}')
2866 ++input_line_pointer
;
2868 /* Align to a four byte boundary. */
2870 record_alignment (now_seg
, 2);
2872 #endif /* ! defined (OBJ_XCOFF) */
2874 if (*input_line_pointer
!= ',')
2875 demand_empty_rest_of_line ();
2878 ++input_line_pointer
;
2885 /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format */
2887 /* Set the current section. */
2889 ppc_set_current_section (new)
2892 ppc_previous_section
= ppc_current_section
;
2893 ppc_current_section
= new;
2896 /* pseudo-op: .previous
2897 behaviour: toggles the current section with the previous section.
2899 warnings: "No previous section"
2902 ppc_previous(ignore
)
2907 if (ppc_previous_section
== NULL
)
2909 as_warn("No previous section to return to. Directive ignored.");
2913 subseg_set(ppc_previous_section
, 0);
2915 ppc_set_current_section(ppc_previous_section
);
2918 /* pseudo-op: .pdata
2919 behaviour: predefined read only data section
2923 initial: .section .pdata "adr3"
2924 a - don't know -- maybe a misprint
2925 d - initialized data
2927 3 - double word aligned (that would be 4 byte boundary)
2930 Tag index tables (also known as the function table) for exception
2931 handling, debugging, etc.
2938 if (pdata_section
== 0)
2940 pdata_section
= subseg_new (".pdata", 0);
2942 bfd_set_section_flags (stdoutput
, pdata_section
,
2943 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
2944 | SEC_READONLY
| SEC_DATA
));
2946 bfd_set_section_alignment (stdoutput
, pdata_section
, 2);
2950 pdata_section
= subseg_new(".pdata", 0);
2952 ppc_set_current_section(pdata_section
);
2955 /* pseudo-op: .ydata
2956 behaviour: predefined read only data section
2960 initial: .section .ydata "drw3"
2961 a - don't know -- maybe a misprint
2962 d - initialized data
2964 3 - double word aligned (that would be 4 byte boundary)
2966 Tag tables (also known as the scope table) for exception handling,
2973 if (ydata_section
== 0)
2975 ydata_section
= subseg_new (".ydata", 0);
2976 bfd_set_section_flags (stdoutput
, ydata_section
,
2977 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
2978 | SEC_READONLY
| SEC_DATA
));
2980 bfd_set_section_alignment (stdoutput
, ydata_section
, 3);
2984 ydata_section
= subseg_new (".ydata", 0);
2986 ppc_set_current_section(ydata_section
);
2989 /* pseudo-op: .reldata
2990 behaviour: predefined read write data section
2991 double word aligned (4-byte)
2992 FIXME: relocation is applied to it
2993 FIXME: what's the difference between this and .data?
2996 initial: .section .reldata "drw3"
2997 d - initialized data
3000 3 - double word aligned (that would be 8 byte boundary)
3003 Like .data, but intended to hold data subject to relocation, such as
3004 function descriptors, etc.
3010 if (reldata_section
== 0)
3012 reldata_section
= subseg_new (".reldata", 0);
3014 bfd_set_section_flags (stdoutput
, reldata_section
,
3015 ( SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
3018 bfd_set_section_alignment (stdoutput
, reldata_section
, 2);
3022 reldata_section
= subseg_new (".reldata", 0);
3024 ppc_set_current_section(reldata_section
);
3027 /* pseudo-op: .rdata
3028 behaviour: predefined read only data section
3032 initial: .section .rdata "dr3"
3033 d - initialized data
3035 3 - double word aligned (that would be 4 byte boundary)
3041 if (rdata_section
== 0)
3043 rdata_section
= subseg_new (".rdata", 0);
3044 bfd_set_section_flags (stdoutput
, rdata_section
,
3045 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
3046 | SEC_READONLY
| SEC_DATA
));
3048 bfd_set_section_alignment (stdoutput
, rdata_section
, 2);
3052 rdata_section
= subseg_new (".rdata", 0);
3054 ppc_set_current_section(rdata_section
);
3057 /* pseudo-op: .ualong
3058 behaviour: much like .int, with the exception that no alignment is
3060 FIXME: test the alignment statement
3072 /* pseudo-op: .znop <symbol name>
3073 behaviour: Issue a nop instruction
3074 Issue a IMAGE_REL_PPC_IFGLUE relocation against it, using
3075 the supplied symbol name.
3077 warnings: Missing symbol name
3084 const struct powerpc_opcode
*opcode
;
3090 /* Strip out the symbol name */
3098 symbol_name
= input_line_pointer
;
3099 c
= get_symbol_end ();
3101 name
= xmalloc (input_line_pointer
- symbol_name
+ 1);
3102 strcpy (name
, symbol_name
);
3104 sym
= symbol_find_or_make (name
);
3106 *input_line_pointer
= c
;
3110 /* Look up the opcode in the hash table. */
3111 opcode
= (const struct powerpc_opcode
*) hash_find (ppc_hash
, "nop");
3113 /* stick in the nop */
3114 insn
= opcode
->opcode
;
3116 /* Write out the instruction. */
3118 md_number_to_chars (f
, insn
, 4);
3120 f
- frag_now
->fr_literal
,
3125 BFD_RELOC_16_GOT_PCREL
);
3138 register char *name
;
3142 register symbolS
*symbolP
;
3145 name
= input_line_pointer
;
3146 c
= get_symbol_end ();
3148 /* just after name is now '\0' */
3149 p
= input_line_pointer
;
3152 if (*input_line_pointer
!= ',')
3154 as_bad ("Expected comma after symbol-name: rest of line ignored.");
3155 ignore_rest_of_line ();
3159 input_line_pointer
++; /* skip ',' */
3160 if ((temp
= get_absolute_expression ()) < 0)
3162 as_warn (".COMMon length (%ld.) <0! Ignored.", (long) temp
);
3163 ignore_rest_of_line ();
3169 /* The third argument to .comm is the alignment. */
3170 if (*input_line_pointer
!= ',')
3174 ++input_line_pointer
;
3175 align
= get_absolute_expression ();
3178 as_warn ("ignoring bad alignment");
3185 symbolP
= symbol_find_or_make (name
);
3188 if (S_IS_DEFINED (symbolP
))
3190 as_bad ("Ignoring attempt to re-define symbol `%s'.",
3191 S_GET_NAME (symbolP
));
3192 ignore_rest_of_line ();
3196 if (S_GET_VALUE (symbolP
))
3198 if (S_GET_VALUE (symbolP
) != (valueT
) temp
)
3199 as_bad ("Length of .comm \"%s\" is already %ld. Not changed to %ld.",
3200 S_GET_NAME (symbolP
),
3201 (long) S_GET_VALUE (symbolP
),
3206 S_SET_VALUE (symbolP
, (valueT
) temp
);
3207 S_SET_EXTERNAL (symbolP
);
3210 demand_empty_rest_of_line ();
3214 * implement the .section pseudo op:
3215 * .section name {, "flags"}
3217 * | +--- optional flags: 'b' for bss
3219 * +-- section name 'l' for lib
3223 * 'd' (apparently m88k for data)
3225 * But if the argument is not a quoted string, treat it as a
3226 * subsegment number.
3228 * FIXME: this is a copy of the section processing from obj-coff.c, with
3229 * additions/changes for the moto-pas assembler support. There are three
3232 * FIXME: I just noticed this. This doesn't work at all really. It it
3233 * setting bits that bfd probably neither understands or uses. The
3234 * correct approach (?) will have to incorporate extra fields attached
3235 * to the section to hold the system specific stuff. (krk)
3238 * 'a' - unknown - referred to in documentation, but no definition supplied
3239 * 'c' - section has code
3240 * 'd' - section has initialized data
3241 * 'u' - section has uninitialized data
3242 * 'i' - section contains directives (info)
3243 * 'n' - section can be discarded
3244 * 'R' - remove section at link time
3246 * Section Protection:
3247 * 'r' - section is readable
3248 * 'w' - section is writeable
3249 * 'x' - section is executable
3250 * 's' - section is sharable
3252 * Section Alignment:
3253 * '0' - align to byte boundary
3254 * '1' - align to halfword undary
3255 * '2' - align to word boundary
3256 * '3' - align to doubleword boundary
3257 * '4' - align to quadword boundary
3258 * '5' - align to 32 byte boundary
3259 * '6' - align to 64 byte boundary
3264 ppc_pe_section (ignore
)
3267 /* Strip out the section name */
3276 section_name
= input_line_pointer
;
3277 c
= get_symbol_end ();
3279 name
= xmalloc (input_line_pointer
- section_name
+ 1);
3280 strcpy (name
, section_name
);
3282 *input_line_pointer
= c
;
3287 flags
= SEC_NO_FLAGS
;
3289 if (strcmp (name
, ".idata$2") == 0)
3293 else if (strcmp (name
, ".idata$3") == 0)
3297 else if (strcmp (name
, ".idata$4") == 0)
3301 else if (strcmp (name
, ".idata$5") == 0)
3305 else if (strcmp (name
, ".idata$6") == 0)
3310 align
= 4; /* default alignment to 16 byte boundary */
3312 if (*input_line_pointer
== ',')
3314 ++input_line_pointer
;
3316 if (*input_line_pointer
!= '"')
3317 exp
= get_absolute_expression ();
3320 ++input_line_pointer
;
3321 while (*input_line_pointer
!= '"'
3322 && ! is_end_of_line
[(unsigned char) *input_line_pointer
])
3324 switch (*input_line_pointer
)
3326 /* Section Contents */
3327 case 'a': /* unknown */
3328 as_warn ("Unsupported section attribute -- 'a'");
3330 case 'c': /* code section */
3333 case 'd': /* section has initialized data */
3336 case 'u': /* section has uninitialized data */
3337 /* FIXME: This is IMAGE_SCN_CNT_UNINITIALIZED_DATA
3341 case 'i': /* section contains directives (info) */
3342 /* FIXME: This is IMAGE_SCN_LNK_INFO
3344 flags
|= SEC_HAS_CONTENTS
;
3346 case 'n': /* section can be discarded */
3349 case 'R': /* Remove section at link time */
3350 flags
|= SEC_NEVER_LOAD
;
3353 /* Section Protection */
3354 case 'r': /* section is readable */
3355 flags
|= IMAGE_SCN_MEM_READ
;
3357 case 'w': /* section is writeable */
3358 flags
|= IMAGE_SCN_MEM_WRITE
;
3360 case 'x': /* section is executable */
3361 flags
|= IMAGE_SCN_MEM_EXECUTE
;
3363 case 's': /* section is sharable */
3364 flags
|= IMAGE_SCN_MEM_SHARED
;
3367 /* Section Alignment */
3368 case '0': /* align to byte boundary */
3369 flags
|= IMAGE_SCN_ALIGN_1BYTES
;
3372 case '1': /* align to halfword boundary */
3373 flags
|= IMAGE_SCN_ALIGN_2BYTES
;
3376 case '2': /* align to word boundary */
3377 flags
|= IMAGE_SCN_ALIGN_4BYTES
;
3380 case '3': /* align to doubleword boundary */
3381 flags
|= IMAGE_SCN_ALIGN_8BYTES
;
3384 case '4': /* align to quadword boundary */
3385 flags
|= IMAGE_SCN_ALIGN_16BYTES
;
3388 case '5': /* align to 32 byte boundary */
3389 flags
|= IMAGE_SCN_ALIGN_32BYTES
;
3392 case '6': /* align to 64 byte boundary */
3393 flags
|= IMAGE_SCN_ALIGN_64BYTES
;
3398 as_warn("unknown section attribute '%c'",
3399 *input_line_pointer
);
3402 ++input_line_pointer
;
3404 if (*input_line_pointer
== '"')
3405 ++input_line_pointer
;
3409 sec
= subseg_new (name
, (subsegT
) exp
);
3411 ppc_set_current_section(sec
);
3413 if (flags
!= SEC_NO_FLAGS
)
3415 if (! bfd_set_section_flags (stdoutput
, sec
, flags
))
3416 as_warn ("error setting flags for \"%s\": %s",
3417 bfd_section_name (stdoutput
, sec
),
3418 bfd_errmsg (bfd_get_error ()));
3421 bfd_set_section_alignment(stdoutput
, sec
, align
);
3426 ppc_pe_function (ignore
)
3433 name
= input_line_pointer
;
3434 endc
= get_symbol_end ();
3436 ext_sym
= symbol_find_or_make (name
);
3438 *input_line_pointer
= endc
;
3440 S_SET_DATA_TYPE (ext_sym
, DT_FCN
<< N_BTSHFT
);
3441 SF_SET_FUNCTION (ext_sym
);
3442 SF_SET_PROCESS (ext_sym
);
3443 coff_add_linesym (ext_sym
);
3445 demand_empty_rest_of_line ();
3449 ppc_pe_tocd (ignore
)
3452 if (tocdata_section
== 0)
3454 tocdata_section
= subseg_new (".tocd", 0);
3455 /* FIXME: section flags won't work */
3456 bfd_set_section_flags (stdoutput
, tocdata_section
,
3457 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
3458 | SEC_READONLY
| SEC_DATA
));
3460 bfd_set_section_alignment (stdoutput
, tocdata_section
, 2);
3464 rdata_section
= subseg_new (".tocd", 0);
3467 ppc_set_current_section(tocdata_section
);
3469 demand_empty_rest_of_line ();
3472 /* Don't adjust TOC relocs to use the section symbol. */
3475 ppc_pe_fix_adjustable (fix
)
3478 return fix
->fx_r_type
!= BFD_RELOC_PPC_TOC16
;
3485 /* XCOFF specific symbol and file handling. */
3487 /* Canonicalize the symbol name. We use the to force the suffix, if
3488 any, to use square brackets, and to be in upper case. */
3491 ppc_canonicalize_symbol_name (name
)
3496 if (ppc_stab_symbol
)
3499 for (s
= name
; *s
!= '\0' && *s
!= '{' && *s
!= '['; s
++)
3513 for (s
++; *s
!= '\0' && *s
!= brac
; s
++)
3517 if (*s
== '\0' || s
[1] != '\0')
3518 as_bad ("bad symbol suffix");
3526 /* Set the class of a symbol based on the suffix, if any. This is
3527 called whenever a new symbol is created. */
3530 ppc_symbol_new_hook (sym
)
3535 sym
->sy_tc
.next
= NULL
;
3536 sym
->sy_tc
.output
= 0;
3537 sym
->sy_tc
.class = -1;
3538 sym
->sy_tc
.real_name
= NULL
;
3539 sym
->sy_tc
.subseg
= 0;
3540 sym
->sy_tc
.align
= 0;
3541 sym
->sy_tc
.size
= NULL
;
3542 sym
->sy_tc
.within
= NULL
;
3544 if (ppc_stab_symbol
)
3547 s
= strchr (S_GET_NAME (sym
), '[');
3548 if (s
== (const char *) NULL
)
3550 /* There is no suffix. */
3559 if (strcmp (s
, "BS]") == 0)
3560 sym
->sy_tc
.class = XMC_BS
;
3563 if (strcmp (s
, "DB]") == 0)
3564 sym
->sy_tc
.class = XMC_DB
;
3565 else if (strcmp (s
, "DS]") == 0)
3566 sym
->sy_tc
.class = XMC_DS
;
3569 if (strcmp (s
, "GL]") == 0)
3570 sym
->sy_tc
.class = XMC_GL
;
3573 if (strcmp (s
, "PR]") == 0)
3574 sym
->sy_tc
.class = XMC_PR
;
3577 if (strcmp (s
, "RO]") == 0)
3578 sym
->sy_tc
.class = XMC_RO
;
3579 else if (strcmp (s
, "RW]") == 0)
3580 sym
->sy_tc
.class = XMC_RW
;
3583 if (strcmp (s
, "SV]") == 0)
3584 sym
->sy_tc
.class = XMC_SV
;
3587 if (strcmp (s
, "TC]") == 0)
3588 sym
->sy_tc
.class = XMC_TC
;
3589 else if (strcmp (s
, "TI]") == 0)
3590 sym
->sy_tc
.class = XMC_TI
;
3591 else if (strcmp (s
, "TB]") == 0)
3592 sym
->sy_tc
.class = XMC_TB
;
3593 else if (strcmp (s
, "TC0]") == 0 || strcmp (s
, "T0]") == 0)
3594 sym
->sy_tc
.class = XMC_TC0
;
3597 if (strcmp (s
, "UA]") == 0)
3598 sym
->sy_tc
.class = XMC_UA
;
3599 else if (strcmp (s
, "UC]") == 0)
3600 sym
->sy_tc
.class = XMC_UC
;
3603 if (strcmp (s
, "XO]") == 0)
3604 sym
->sy_tc
.class = XMC_XO
;
3608 if (sym
->sy_tc
.class == -1)
3609 as_bad ("Unrecognized symbol suffix");
3612 /* Set the class of a label based on where it is defined. This
3613 handles symbols without suffixes. Also, move the symbol so that it
3614 follows the csect symbol. */
3617 ppc_frob_label (sym
)
3620 if (ppc_current_csect
!= (symbolS
*) NULL
)
3622 if (sym
->sy_tc
.class == -1)
3623 sym
->sy_tc
.class = ppc_current_csect
->sy_tc
.class;
3625 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
3626 symbol_append (sym
, ppc_current_csect
->sy_tc
.within
, &symbol_rootP
,
3628 ppc_current_csect
->sy_tc
.within
= sym
;
3632 /* This variable is set by ppc_frob_symbol if any absolute symbols are
3633 seen. It tells ppc_adjust_symtab whether it needs to look through
3636 static boolean ppc_saw_abs
;
3638 /* Change the name of a symbol just before writing it out. Set the
3639 real name if the .rename pseudo-op was used. Otherwise, remove any
3640 class suffix. Return 1 if the symbol should not be included in the
3644 ppc_frob_symbol (sym
)
3647 static symbolS
*ppc_last_function
;
3648 static symbolS
*set_end
;
3650 /* Discard symbols that should not be included in the output symbol
3652 if (! sym
->sy_used_in_reloc
3653 && ((sym
->bsym
->flags
& BSF_SECTION_SYM
) != 0
3654 || (! S_IS_EXTERNAL (sym
)
3655 && ! sym
->sy_tc
.output
3656 && S_GET_STORAGE_CLASS (sym
) != C_FILE
)))
3659 if (sym
->sy_tc
.real_name
!= (char *) NULL
)
3660 S_SET_NAME (sym
, sym
->sy_tc
.real_name
);
3666 name
= S_GET_NAME (sym
);
3667 s
= strchr (name
, '[');
3668 if (s
!= (char *) NULL
)
3674 snew
= xmalloc (len
+ 1);
3675 memcpy (snew
, name
, len
);
3678 S_SET_NAME (sym
, snew
);
3682 if (set_end
!= (symbolS
*) NULL
)
3684 SA_SET_SYM_ENDNDX (set_end
, sym
);
3688 if (SF_GET_FUNCTION (sym
))
3690 if (ppc_last_function
!= (symbolS
*) NULL
)
3691 as_warn ("two .function pseudo-ops with no intervening .ef");
3692 ppc_last_function
= sym
;
3693 if (sym
->sy_tc
.size
!= (symbolS
*) NULL
)
3695 resolve_symbol_value (sym
->sy_tc
.size
);
3696 SA_SET_SYM_FSIZE (sym
, (long) S_GET_VALUE (sym
->sy_tc
.size
));
3699 else if (S_GET_STORAGE_CLASS (sym
) == C_FCN
3700 && strcmp (S_GET_NAME (sym
), ".ef") == 0)
3702 if (ppc_last_function
== (symbolS
*) NULL
)
3703 as_warn (".ef with no preceding .function");
3706 set_end
= ppc_last_function
;
3707 ppc_last_function
= NULL
;
3709 /* We don't have a C_EFCN symbol, but we need to force the
3710 COFF backend to believe that it has seen one. */
3711 coff_last_function
= NULL
;
3715 if (! S_IS_EXTERNAL (sym
)
3716 && (sym
->bsym
->flags
& BSF_SECTION_SYM
) == 0
3717 && S_GET_STORAGE_CLASS (sym
) != C_FILE
3718 && S_GET_STORAGE_CLASS (sym
) != C_FCN
3719 && S_GET_STORAGE_CLASS (sym
) != C_BLOCK
3720 && S_GET_STORAGE_CLASS (sym
) != C_BSTAT
3721 && S_GET_STORAGE_CLASS (sym
) != C_ESTAT
3722 && S_GET_STORAGE_CLASS (sym
) != C_BINCL
3723 && S_GET_STORAGE_CLASS (sym
) != C_EINCL
3724 && S_GET_SEGMENT (sym
) != ppc_coff_debug_section
)
3725 S_SET_STORAGE_CLASS (sym
, C_HIDEXT
);
3727 if (S_GET_STORAGE_CLASS (sym
) == C_EXT
3728 || S_GET_STORAGE_CLASS (sym
) == C_HIDEXT
)
3731 union internal_auxent
*a
;
3733 /* Create a csect aux. */
3734 i
= S_GET_NUMBER_AUXILIARY (sym
);
3735 S_SET_NUMBER_AUXILIARY (sym
, i
+ 1);
3736 a
= &coffsymbol (sym
->bsym
)->native
[i
+ 1].u
.auxent
;
3737 if (sym
->sy_tc
.class == XMC_TC0
)
3739 /* This is the TOC table. */
3740 know (strcmp (S_GET_NAME (sym
), "TOC") == 0);
3741 a
->x_csect
.x_scnlen
.l
= 0;
3742 a
->x_csect
.x_smtyp
= (2 << 3) | XTY_SD
;
3744 else if (sym
->sy_tc
.subseg
!= 0)
3746 /* This is a csect symbol. x_scnlen is the size of the
3748 if (sym
->sy_tc
.next
== (symbolS
*) NULL
)
3749 a
->x_csect
.x_scnlen
.l
= (bfd_section_size (stdoutput
,
3750 S_GET_SEGMENT (sym
))
3751 - S_GET_VALUE (sym
));
3754 resolve_symbol_value (sym
->sy_tc
.next
);
3755 a
->x_csect
.x_scnlen
.l
= (S_GET_VALUE (sym
->sy_tc
.next
)
3756 - S_GET_VALUE (sym
));
3758 a
->x_csect
.x_smtyp
= (sym
->sy_tc
.align
<< 3) | XTY_SD
;
3760 else if (S_GET_SEGMENT (sym
) == bss_section
)
3762 /* This is a common symbol. */
3763 a
->x_csect
.x_scnlen
.l
= sym
->sy_frag
->fr_offset
;
3764 a
->x_csect
.x_smtyp
= (sym
->sy_tc
.align
<< 3) | XTY_CM
;
3765 if (S_IS_EXTERNAL (sym
))
3766 sym
->sy_tc
.class = XMC_RW
;
3768 sym
->sy_tc
.class = XMC_BS
;
3770 else if (S_GET_SEGMENT (sym
) == absolute_section
)
3772 /* This is an absolute symbol. The csect will be created by
3773 ppc_adjust_symtab. */
3775 a
->x_csect
.x_smtyp
= XTY_LD
;
3776 if (sym
->sy_tc
.class == -1)
3777 sym
->sy_tc
.class = XMC_XO
;
3779 else if (! S_IS_DEFINED (sym
))
3781 /* This is an external symbol. */
3782 a
->x_csect
.x_scnlen
.l
= 0;
3783 a
->x_csect
.x_smtyp
= XTY_ER
;
3785 else if (sym
->sy_tc
.class == XMC_TC
)
3789 /* This is a TOC definition. x_scnlen is the size of the
3791 next
= symbol_next (sym
);
3792 while (next
->sy_tc
.class == XMC_TC0
)
3793 next
= symbol_next (next
);
3794 if (next
== (symbolS
*) NULL
3795 || next
->sy_tc
.class != XMC_TC
)
3797 if (ppc_after_toc_frag
== (fragS
*) NULL
)
3798 a
->x_csect
.x_scnlen
.l
= (bfd_section_size (stdoutput
,
3800 - S_GET_VALUE (sym
));
3802 a
->x_csect
.x_scnlen
.l
= (ppc_after_toc_frag
->fr_address
3803 - S_GET_VALUE (sym
));
3807 resolve_symbol_value (next
);
3808 a
->x_csect
.x_scnlen
.l
= (S_GET_VALUE (next
)
3809 - S_GET_VALUE (sym
));
3811 a
->x_csect
.x_smtyp
= (2 << 3) | XTY_SD
;
3817 /* This is a normal symbol definition. x_scnlen is the
3818 symbol index of the containing csect. */
3819 if (S_GET_SEGMENT (sym
) == text_section
)
3820 csect
= ppc_text_csects
;
3821 else if (S_GET_SEGMENT (sym
) == data_section
)
3822 csect
= ppc_data_csects
;
3826 /* Skip the initial dummy symbol. */
3827 csect
= csect
->sy_tc
.next
;
3829 if (csect
== (symbolS
*) NULL
)
3831 as_warn ("warning: symbol %s has no csect", S_GET_NAME (sym
));
3832 a
->x_csect
.x_scnlen
.l
= 0;
3836 while (csect
->sy_tc
.next
!= (symbolS
*) NULL
)
3838 resolve_symbol_value (csect
->sy_tc
.next
);
3839 if (S_GET_VALUE (csect
->sy_tc
.next
) > S_GET_VALUE (sym
))
3841 csect
= csect
->sy_tc
.next
;
3844 a
->x_csect
.x_scnlen
.p
= coffsymbol (csect
->bsym
)->native
;
3845 coffsymbol (sym
->bsym
)->native
[i
+ 1].fix_scnlen
= 1;
3847 a
->x_csect
.x_smtyp
= XTY_LD
;
3850 a
->x_csect
.x_parmhash
= 0;
3851 a
->x_csect
.x_snhash
= 0;
3852 if (sym
->sy_tc
.class == -1)
3853 a
->x_csect
.x_smclas
= XMC_PR
;
3855 a
->x_csect
.x_smclas
= sym
->sy_tc
.class;
3856 a
->x_csect
.x_stab
= 0;
3857 a
->x_csect
.x_snstab
= 0;
3859 /* Don't let the COFF backend resort these symbols. */
3860 sym
->bsym
->flags
|= BSF_NOT_AT_END
;
3862 else if (S_GET_STORAGE_CLASS (sym
) == C_BSTAT
)
3864 /* We want the value to be the symbol index of the referenced
3865 csect symbol. BFD will do that for us if we set the right
3868 (valueT
) coffsymbol (sym
->sy_tc
.within
->bsym
)->native
);
3869 coffsymbol (sym
->bsym
)->native
->fix_value
= 1;
3871 else if (S_GET_STORAGE_CLASS (sym
) == C_STSYM
)
3876 /* The value is the offset from the enclosing csect. */
3877 block
= sym
->sy_tc
.within
;
3878 csect
= block
->sy_tc
.within
;
3879 resolve_symbol_value (csect
);
3880 S_SET_VALUE (sym
, S_GET_VALUE (sym
) - S_GET_VALUE (csect
));
3882 else if (S_GET_STORAGE_CLASS (sym
) == C_BINCL
3883 || S_GET_STORAGE_CLASS (sym
) == C_EINCL
)
3885 /* We want the value to be a file offset into the line numbers.
3886 BFD will do that for us if we set the right flags. We have
3887 already set the value correctly. */
3888 coffsymbol (sym
->bsym
)->native
->fix_line
= 1;
3894 /* Adjust the symbol table. This creates csect symbols for all
3895 absolute symbols. */
3898 ppc_adjust_symtab ()
3905 for (sym
= symbol_rootP
; sym
!= NULL
; sym
= symbol_next (sym
))
3909 union internal_auxent
*a
;
3911 if (S_GET_SEGMENT (sym
) != absolute_section
)
3914 csect
= symbol_create (".abs[XO]", absolute_section
,
3915 S_GET_VALUE (sym
), &zero_address_frag
);
3916 csect
->bsym
->value
= S_GET_VALUE (sym
);
3917 S_SET_STORAGE_CLASS (csect
, C_HIDEXT
);
3918 i
= S_GET_NUMBER_AUXILIARY (csect
);
3919 S_SET_NUMBER_AUXILIARY (csect
, i
+ 1);
3920 a
= &coffsymbol (csect
->bsym
)->native
[i
+ 1].u
.auxent
;
3921 a
->x_csect
.x_scnlen
.l
= 0;
3922 a
->x_csect
.x_smtyp
= XTY_SD
;
3923 a
->x_csect
.x_parmhash
= 0;
3924 a
->x_csect
.x_snhash
= 0;
3925 a
->x_csect
.x_smclas
= XMC_XO
;
3926 a
->x_csect
.x_stab
= 0;
3927 a
->x_csect
.x_snstab
= 0;
3929 symbol_insert (csect
, sym
, &symbol_rootP
, &symbol_lastP
);
3931 i
= S_GET_NUMBER_AUXILIARY (sym
);
3932 a
= &coffsymbol (sym
->bsym
)->native
[i
].u
.auxent
;
3933 a
->x_csect
.x_scnlen
.p
= coffsymbol (csect
->bsym
)->native
;
3934 coffsymbol (sym
->bsym
)->native
[i
].fix_scnlen
= 1;
3937 ppc_saw_abs
= false;
3940 /* Set the VMA for a section. This is called on all the sections in
3944 ppc_frob_section (sec
)
3947 static bfd_size_type vma
= 0;
3949 bfd_set_section_vma (stdoutput
, sec
, vma
);
3950 vma
+= bfd_section_size (stdoutput
, sec
);
3953 #endif /* OBJ_XCOFF */
3955 /* Turn a string in input_line_pointer into a floating point constant
3956 of type type, and store the appropriate bytes in *litp. The number
3957 of LITTLENUMS emitted is stored in *sizep . An error message is
3958 returned, or NULL on OK. */
3961 md_atof (type
, litp
, sizep
)
3967 LITTLENUM_TYPE words
[4];
3983 return "bad call to md_atof";
3986 t
= atof_ieee (input_line_pointer
, type
, words
);
3988 input_line_pointer
= t
;
3992 if (target_big_endian
)
3994 for (i
= 0; i
< prec
; i
++)
3996 md_number_to_chars (litp
, (valueT
) words
[i
], 2);
4002 for (i
= prec
- 1; i
>= 0; i
--)
4004 md_number_to_chars (litp
, (valueT
) words
[i
], 2);
4012 /* Write a value out to the object file, using the appropriate
4016 md_number_to_chars (buf
, val
, n
)
4021 if (target_big_endian
)
4022 number_to_chars_bigendian (buf
, val
, n
);
4024 number_to_chars_littleendian (buf
, val
, n
);
4027 /* Align a section (I don't know why this is machine dependent). */
4030 md_section_align (seg
, addr
)
4034 int align
= bfd_get_section_alignment (stdoutput
, seg
);
4036 return ((addr
+ (1 << align
) - 1) & (-1 << align
));
4039 /* We don't have any form of relaxing. */
4042 md_estimate_size_before_relax (fragp
, seg
)
4050 /* Convert a machine dependent frag. We never generate these. */
4053 md_convert_frag (abfd
, sec
, fragp
)
4061 /* We have no need to default values of symbols. */
4065 md_undefined_symbol (name
)
4071 /* Functions concerning relocs. */
4073 /* The location from which a PC relative jump should be calculated,
4074 given a PC relative reloc. */
4077 md_pcrel_from_section (fixp
, sec
)
4082 if (fixp
->fx_addsy
!= (symbolS
*) NULL
4083 && (! S_IS_DEFINED (fixp
->fx_addsy
)
4084 || TC_FORCE_RELOCATION_SECTION (fixp
, sec
)))
4088 return fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
4093 /* This is called to see whether a fixup should be adjusted to use a
4094 section symbol. We take the opportunity to change a fixup against
4095 a symbol in the TOC subsegment into a reloc against the
4096 corresponding .tc symbol. */
4099 ppc_fix_adjustable (fix
)
4104 resolve_symbol_value (fix
->fx_addsy
);
4105 val
= S_GET_VALUE (fix
->fx_addsy
);
4106 if (ppc_toc_csect
!= (symbolS
*) NULL
4107 && fix
->fx_addsy
!= (symbolS
*) NULL
4108 && fix
->fx_addsy
!= ppc_toc_csect
4109 && S_GET_SEGMENT (fix
->fx_addsy
) == data_section
4110 && val
>= ppc_toc_frag
->fr_address
4111 && (ppc_after_toc_frag
== (fragS
*) NULL
4112 || val
< ppc_after_toc_frag
->fr_address
))
4116 for (sy
= symbol_next (ppc_toc_csect
);
4117 sy
!= (symbolS
*) NULL
;
4118 sy
= symbol_next (sy
))
4120 if (sy
->sy_tc
.class == XMC_TC0
)
4122 if (sy
->sy_tc
.class != XMC_TC
)
4124 resolve_symbol_value (sy
);
4125 if (val
== S_GET_VALUE (sy
))
4128 fix
->fx_addnumber
= val
- ppc_toc_frag
->fr_address
;
4133 as_bad_where (fix
->fx_file
, fix
->fx_line
,
4134 "symbol in .toc does not match any .tc");
4137 /* Possibly adjust the reloc to be against the csect. */
4138 if (fix
->fx_addsy
!= (symbolS
*) NULL
4139 && fix
->fx_addsy
->sy_tc
.subseg
== 0
4140 && fix
->fx_addsy
->sy_tc
.class != XMC_TC0
4141 && fix
->fx_addsy
->sy_tc
.class != XMC_TC
4142 && S_GET_SEGMENT (fix
->fx_addsy
) != bss_section
)
4146 if (S_GET_SEGMENT (fix
->fx_addsy
) == text_section
)
4147 csect
= ppc_text_csects
;
4148 else if (S_GET_SEGMENT (fix
->fx_addsy
) == data_section
)
4149 csect
= ppc_data_csects
;
4153 /* Skip the initial dummy symbol. */
4154 csect
= csect
->sy_tc
.next
;
4156 if (csect
!= (symbolS
*) NULL
)
4158 while (csect
->sy_tc
.next
!= (symbolS
*) NULL
4159 && (csect
->sy_tc
.next
->sy_frag
->fr_address
4160 <= fix
->fx_addsy
->sy_frag
->fr_address
))
4161 csect
= csect
->sy_tc
.next
;
4163 fix
->fx_offset
+= (S_GET_VALUE (fix
->fx_addsy
)
4164 - csect
->sy_frag
->fr_address
);
4165 fix
->fx_addsy
= csect
;
4169 /* Adjust a reloc against a .lcomm symbol to be against the base
4171 if (fix
->fx_addsy
!= (symbolS
*) NULL
4172 && S_GET_SEGMENT (fix
->fx_addsy
) == bss_section
4173 && ! S_IS_EXTERNAL (fix
->fx_addsy
))
4175 resolve_symbol_value (fix
->fx_addsy
->sy_frag
->fr_symbol
);
4176 fix
->fx_offset
+= (S_GET_VALUE (fix
->fx_addsy
)
4177 - S_GET_VALUE (fix
->fx_addsy
->sy_frag
->fr_symbol
));
4178 fix
->fx_addsy
= fix
->fx_addsy
->sy_frag
->fr_symbol
;
4186 /* See whether a symbol is in the TOC section. */
4189 ppc_is_toc_sym (sym
)
4193 return sym
->sy_tc
.class == XMC_TC
;
4195 return strcmp (segment_name (S_GET_SEGMENT (sym
)), ".got") == 0;
4199 /* Apply a fixup to the object code. This is called for all the
4200 fixups we generated by the call to fix_new_exp, above. In the call
4201 above we used a reloc code which was the largest legal reloc code
4202 plus the operand index. Here we undo that to recover the operand
4203 index. At this point all symbol values should be fully resolved,
4204 and we attempt to completely resolve the reloc. If we can not do
4205 that, we determine the correct reloc code and put it back in the
4209 md_apply_fix3 (fixp
, valuep
, seg
)
4216 /* FIXME FIXME FIXME: The value we are passed in *valuep includes
4217 the symbol values. Since we are using BFD_ASSEMBLER, if we are
4218 doing this relocation the code in write.c is going to call
4219 bfd_perform_relocation, which is also going to use the symbol
4220 value. That means that if the reloc is fully resolved we want to
4221 use *valuep since bfd_perform_relocation is not being used.
4222 However, if the reloc is not fully resolved we do not want to use
4223 *valuep, and must use fx_offset instead. However, if the reloc
4224 is PC relative, we do want to use *valuep since it includes the
4225 result of md_pcrel_from. This is confusing. */
4227 if (fixp
->fx_addsy
== (symbolS
*) NULL
)
4232 else if (fixp
->fx_pcrel
)
4236 value
= fixp
->fx_offset
;
4237 if (fixp
->fx_subsy
!= (symbolS
*) NULL
)
4239 if (S_GET_SEGMENT (fixp
->fx_subsy
) == absolute_section
)
4240 value
-= S_GET_VALUE (fixp
->fx_subsy
);
4243 /* We can't actually support subtracting a symbol. */
4244 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
4245 "expression too complex");
4250 if ((int) fixp
->fx_r_type
>= (int) BFD_RELOC_UNUSED
)
4253 const struct powerpc_operand
*operand
;
4257 opindex
= (int) fixp
->fx_r_type
- (int) BFD_RELOC_UNUSED
;
4259 operand
= &powerpc_operands
[opindex
];
4262 /* It appears that an instruction like
4264 when LC..1 is not a TOC symbol does not generate a reloc. It
4265 uses the offset of LC..1 within its csect. However, .long
4266 LC..1 will generate a reloc. I can't find any documentation
4267 on how these cases are to be distinguished, so this is a wild
4268 guess. These cases are generated by gcc -mminimal-toc. */
4269 if ((operand
->flags
& PPC_OPERAND_PARENS
) != 0
4270 && operand
->bits
== 16
4271 && operand
->shift
== 0
4272 && operand
->insert
== NULL
4273 && fixp
->fx_addsy
!= NULL
4274 && fixp
->fx_addsy
->sy_tc
.subseg
!= 0
4275 && fixp
->fx_addsy
->sy_tc
.class != XMC_TC
4276 && fixp
->fx_addsy
->sy_tc
.class != XMC_TC0
4277 && S_GET_SEGMENT (fixp
->fx_addsy
) != bss_section
)
4279 value
= fixp
->fx_offset
;
4284 /* Fetch the instruction, insert the fully resolved operand
4285 value, and stuff the instruction back again. */
4286 where
= fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
;
4287 if (target_big_endian
)
4288 insn
= bfd_getb32 ((unsigned char *) where
);
4290 insn
= bfd_getl32 ((unsigned char *) where
);
4291 insn
= ppc_insert_operand (insn
, operand
, (offsetT
) value
,
4292 fixp
->fx_file
, fixp
->fx_line
);
4293 if (target_big_endian
)
4294 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
4296 bfd_putl32 ((bfd_vma
) insn
, (unsigned char *) where
);
4300 /* Nothing else to do here. */
4304 /* Determine a BFD reloc value based on the operand information.
4305 We are only prepared to turn a few of the operands into
4307 FIXME: We need to handle the DS field at the very least.
4308 FIXME: Selecting the reloc type is a bit haphazard; perhaps
4309 there should be a new field in the operand table. */
4310 if ((operand
->flags
& PPC_OPERAND_RELATIVE
) != 0
4311 && operand
->bits
== 26
4312 && operand
->shift
== 0)
4313 fixp
->fx_r_type
= BFD_RELOC_PPC_B26
;
4314 else if ((operand
->flags
& PPC_OPERAND_RELATIVE
) != 0
4315 && operand
->bits
== 16
4316 && operand
->shift
== 0)
4317 fixp
->fx_r_type
= BFD_RELOC_PPC_B16
;
4318 else if ((operand
->flags
& PPC_OPERAND_ABSOLUTE
) != 0
4319 && operand
->bits
== 26
4320 && operand
->shift
== 0)
4321 fixp
->fx_r_type
= BFD_RELOC_PPC_BA26
;
4322 else if ((operand
->flags
& PPC_OPERAND_ABSOLUTE
) != 0
4323 && operand
->bits
== 16
4324 && operand
->shift
== 0)
4325 fixp
->fx_r_type
= BFD_RELOC_PPC_BA16
;
4326 else if ((operand
->flags
& PPC_OPERAND_PARENS
) != 0
4327 && operand
->bits
== 16
4328 && operand
->shift
== 0
4329 && operand
->insert
== NULL
4330 && fixp
->fx_addsy
!= NULL
4331 && ppc_is_toc_sym (fixp
->fx_addsy
))
4334 if (target_big_endian
)
4335 fixp
->fx_where
+= 2;
4336 fixp
->fx_r_type
= BFD_RELOC_PPC_TOC16
;
4340 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
4341 "unresolved expression that must be resolved");
4349 ppc_elf_validate_fix (fixp
, seg
);
4351 switch (fixp
->fx_r_type
)
4354 case BFD_RELOC_CTOR
:
4356 fixp
->fx_r_type
= BFD_RELOC_32_PCREL
;
4360 case BFD_RELOC_32_PCREL
:
4361 case BFD_RELOC_32_BASEREL
:
4362 case BFD_RELOC_PPC_EMB_NADDR32
:
4363 md_number_to_chars (fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
,
4367 case BFD_RELOC_LO16
:
4368 case BFD_RELOC_HI16
:
4369 case BFD_RELOC_HI16_S
:
4371 case BFD_RELOC_GPREL16
:
4372 case BFD_RELOC_16_GOT_PCREL
:
4373 case BFD_RELOC_16_GOTOFF
:
4374 case BFD_RELOC_LO16_GOTOFF
:
4375 case BFD_RELOC_HI16_GOTOFF
:
4376 case BFD_RELOC_HI16_S_GOTOFF
:
4377 case BFD_RELOC_LO16_BASEREL
:
4378 case BFD_RELOC_HI16_BASEREL
:
4379 case BFD_RELOC_HI16_S_BASEREL
:
4380 case BFD_RELOC_PPC_EMB_NADDR16
:
4381 case BFD_RELOC_PPC_EMB_NADDR16_LO
:
4382 case BFD_RELOC_PPC_EMB_NADDR16_HI
:
4383 case BFD_RELOC_PPC_EMB_NADDR16_HA
:
4384 case BFD_RELOC_PPC_EMB_SDAI16
:
4385 case BFD_RELOC_PPC_EMB_SDA2REL
:
4386 case BFD_RELOC_PPC_EMB_SDA2I16
:
4387 case BFD_RELOC_PPC_EMB_RELSEC16
:
4388 case BFD_RELOC_PPC_EMB_RELST_LO
:
4389 case BFD_RELOC_PPC_EMB_RELST_HI
:
4390 case BFD_RELOC_PPC_EMB_RELST_HA
:
4391 case BFD_RELOC_PPC_EMB_RELSDA
:
4392 case BFD_RELOC_PPC_TOC16
:
4396 md_number_to_chars (fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
,
4400 /* Because SDA21 modifies the register field, the size is set to 4
4401 bytes, rather than 2, so offset it here appropriately */
4402 case BFD_RELOC_PPC_EMB_SDA21
:
4406 md_number_to_chars (fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
4407 + ((target_big_endian
) ? 2 : 0),
4415 md_number_to_chars (fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
,
4421 "Gas failure, reloc value %d\n", fixp
->fx_r_type
);
4428 fixp
->fx_addnumber
= value
;
4430 if (fixp
->fx_r_type
!= BFD_RELOC_PPC_TOC16
)
4431 fixp
->fx_addnumber
= 0;
4435 fixp
->fx_addnumber
= 0;
4437 /* We want to use the offset within the data segment of the
4438 symbol, not the actual VMA of the symbol. */
4439 fixp
->fx_addnumber
=
4440 - bfd_get_section_vma (stdoutput
, S_GET_SEGMENT (fixp
->fx_addsy
));
4448 /* Generate a reloc for a fixup. */
4451 tc_gen_reloc (seg
, fixp
)
4457 reloc
= (arelent
*) bfd_alloc_by_size_t (stdoutput
, sizeof (arelent
));
4459 reloc
->sym_ptr_ptr
= &fixp
->fx_addsy
->bsym
;
4460 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
4461 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
4462 if (reloc
->howto
== (reloc_howto_type
*) NULL
)
4464 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
4465 "reloc %d not supported by object file format", (int)fixp
->fx_r_type
);
4468 reloc
->addend
= fixp
->fx_addnumber
;