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_cpu
= TARGET_CPU
;
794 if (strcmp (default_cpu
, "rs6000") == 0)
795 ppc_cpu
= PPC_OPCODE_POWER
;
796 else if (strcmp (default_cpu
, "powerpc") == 0
797 || strcmp (default_cpu
, "powerpcle") == 0)
798 ppc_cpu
= PPC_OPCODE_PPC
;
800 as_fatal ("Unknown default cpu = %s", default_cpu
);
804 /* Figure out the BFD architecture to use. */
806 enum bfd_architecture
809 const char *default_cpu
= TARGET_CPU
;
812 if ((ppc_cpu
& PPC_OPCODE_PPC
) != 0)
813 return bfd_arch_powerpc
;
814 else if ((ppc_cpu
& PPC_OPCODE_POWER
) != 0)
815 return bfd_arch_rs6000
;
816 else if ((ppc_cpu
& (PPC_OPCODE_COMMON
| PPC_OPCODE_ANY
)) != 0)
818 if (strcmp (default_cpu
, "rs6000") == 0)
819 return bfd_arch_rs6000
;
820 else if (strcmp (default_cpu
, "powerpc") == 0
821 || strcmp (default_cpu
, "powerpcle") == 0)
822 return bfd_arch_powerpc
;
825 as_fatal ("Neither Power nor PowerPC opcodes were selected.");
826 return bfd_arch_unknown
;
829 /* This function is called when the assembler starts up. It is called
830 after the options have been parsed and the output file has been
836 register const struct powerpc_opcode
*op
;
837 const struct powerpc_opcode
*op_end
;
838 const struct powerpc_macro
*macro
;
839 const struct powerpc_macro
*macro_end
;
840 boolean dup_insn
= false;
845 /* Set the ELF flags if desired. */
847 bfd_set_private_flags (stdoutput
, ppc_flags
);
850 /* Insert the opcodes into a hash table. */
851 ppc_hash
= hash_new ();
853 op_end
= powerpc_opcodes
+ powerpc_num_opcodes
;
854 for (op
= powerpc_opcodes
; op
< op_end
; op
++)
856 know ((op
->opcode
& op
->mask
) == op
->opcode
);
858 if ((op
->flags
& ppc_cpu
) != 0
859 && ((op
->flags
& (PPC_OPCODE_32
| PPC_OPCODE_64
)) == 0
860 || (op
->flags
& (PPC_OPCODE_32
| PPC_OPCODE_64
)) == ppc_size
))
864 retval
= hash_insert (ppc_hash
, op
->name
, (PTR
) op
);
865 if (retval
!= (const char *) NULL
)
867 /* Ignore Power duplicates for -m601 */
868 if ((ppc_cpu
& PPC_OPCODE_601
) != 0
869 && (op
->flags
& PPC_OPCODE_POWER
) != 0)
872 as_bad ("Internal assembler error for instruction %s", op
->name
);
878 /* Insert the macros into a hash table. */
879 ppc_macro_hash
= hash_new ();
881 macro_end
= powerpc_macros
+ powerpc_num_macros
;
882 for (macro
= powerpc_macros
; macro
< macro_end
; macro
++)
884 if ((macro
->flags
& ppc_cpu
) != 0)
888 retval
= hash_insert (ppc_macro_hash
, macro
->name
, (PTR
) macro
);
889 if (retval
!= (const char *) NULL
)
891 as_bad ("Internal assembler error for macro %s", macro
->name
);
900 /* Tell the main code what the endianness is if it is not overidden by the user. */
901 if (!set_target_endian
)
903 set_target_endian
= 1;
904 target_big_endian
= PPC_BIG_ENDIAN
;
908 ppc_coff_debug_section
= coff_section_from_bfd_index (stdoutput
, N_DEBUG
);
910 /* Create dummy symbols to serve as initial csects. This forces the
911 text csects to precede the data csects. These symbols will not
913 ppc_text_csects
= symbol_make ("dummy\001");
914 ppc_text_csects
->sy_tc
.within
= ppc_text_csects
;
915 ppc_data_csects
= symbol_make ("dummy\001");
916 ppc_data_csects
->sy_tc
.within
= ppc_data_csects
;
921 ppc_current_section
= text_section
;
922 ppc_previous_section
= 0;
927 /* Insert an operand value into an instruction. */
930 ppc_insert_operand (insn
, operand
, val
, file
, line
)
932 const struct powerpc_operand
*operand
;
937 if (operand
->bits
!= 32)
942 if ((operand
->flags
& PPC_OPERAND_SIGNED
) != 0)
944 if ((operand
->flags
& PPC_OPERAND_SIGNOPT
) != 0
945 && ppc_size
== PPC_OPCODE_32
)
946 max
= (1 << operand
->bits
) - 1;
948 max
= (1 << (operand
->bits
- 1)) - 1;
949 min
= - (1 << (operand
->bits
- 1));
953 max
= (1 << operand
->bits
) - 1;
957 if ((operand
->flags
& PPC_OPERAND_NEGATIVE
) != 0)
962 if (test
< (offsetT
) min
|| test
> (offsetT
) max
)
965 "operand out of range (%s not between %ld and %ld)";
968 sprint_value (buf
, test
);
969 if (file
== (char *) NULL
)
970 as_warn (err
, buf
, min
, max
);
972 as_warn_where (file
, line
, err
, buf
, min
, max
);
981 insn
= (*operand
->insert
) (insn
, (long) val
, &errmsg
);
982 if (errmsg
!= (const char *) NULL
)
986 insn
|= (((long) val
& ((1 << operand
->bits
) - 1))
993 /* Parse @got, etc. and return the desired relocation. */
994 static bfd_reloc_code_real_type
995 ppc_elf_suffix (str_p
)
1001 bfd_reloc_code_real_type reloc
;
1009 struct map_bfd
*ptr
;
1011 #define MAP(str,reloc) { str, sizeof(str)-1, reloc }
1013 static struct map_bfd mapping
[] = {
1014 MAP ("l", BFD_RELOC_LO16
),
1015 MAP ("h", BFD_RELOC_HI16
),
1016 MAP ("ha", BFD_RELOC_HI16_S
),
1017 MAP ("brtaken", BFD_RELOC_PPC_B16_BRTAKEN
),
1018 MAP ("brntaken", BFD_RELOC_PPC_B16_BRNTAKEN
),
1019 MAP ("got", BFD_RELOC_16_GOTOFF
),
1020 MAP ("got@l", BFD_RELOC_LO16_GOTOFF
),
1021 MAP ("got@h", BFD_RELOC_HI16_GOTOFF
),
1022 MAP ("got@ha", BFD_RELOC_HI16_S_GOTOFF
),
1023 MAP ("fixup", BFD_RELOC_CTOR
), /* warnings with -mrelocatable */
1024 MAP ("pltrel24", BFD_RELOC_24_PLT_PCREL
),
1025 MAP ("copy", BFD_RELOC_PPC_COPY
),
1026 MAP ("globdat", BFD_RELOC_PPC_GLOB_DAT
),
1027 MAP ("local24pc", BFD_RELOC_PPC_LOCAL24PC
),
1028 MAP ("plt", BFD_RELOC_32_PLTOFF
),
1029 MAP ("pltrel", BFD_RELOC_32_PLT_PCREL
),
1030 MAP ("plt@l", BFD_RELOC_LO16_PLTOFF
),
1031 MAP ("plt@h", BFD_RELOC_HI16_PLTOFF
),
1032 MAP ("plt@ha", BFD_RELOC_HI16_S_PLTOFF
),
1033 MAP ("sdarel", BFD_RELOC_GPREL16
),
1034 MAP ("sectoff", BFD_RELOC_32_BASEREL
),
1035 MAP ("sectoff@l", BFD_RELOC_LO16_BASEREL
),
1036 MAP ("sectoff@h", BFD_RELOC_HI16_BASEREL
),
1037 MAP ("sectoff@ha", BFD_RELOC_HI16_S_BASEREL
),
1038 MAP ("naddr", BFD_RELOC_PPC_EMB_NADDR32
),
1039 MAP ("naddr16", BFD_RELOC_PPC_EMB_NADDR16
),
1040 MAP ("naddr@l", BFD_RELOC_PPC_EMB_NADDR16_LO
),
1041 MAP ("naddr@h", BFD_RELOC_PPC_EMB_NADDR16_HI
),
1042 MAP ("naddr@ha", BFD_RELOC_PPC_EMB_NADDR16_HA
),
1043 MAP ("sdai16", BFD_RELOC_PPC_EMB_SDAI16
),
1044 MAP ("sda2rel", BFD_RELOC_PPC_EMB_SDA2REL
),
1045 MAP ("sda2i16", BFD_RELOC_PPC_EMB_SDA2I16
),
1046 MAP ("sda21", BFD_RELOC_PPC_EMB_SDA21
),
1047 MAP ("mrkref", BFD_RELOC_PPC_EMB_MRKREF
),
1048 MAP ("relsect", BFD_RELOC_PPC_EMB_RELSEC16
),
1049 MAP ("relsect@l", BFD_RELOC_PPC_EMB_RELST_LO
),
1050 MAP ("relsect@h", BFD_RELOC_PPC_EMB_RELST_HI
),
1051 MAP ("relsect@ha", BFD_RELOC_PPC_EMB_RELST_HA
),
1052 MAP ("bitfld", BFD_RELOC_PPC_EMB_BIT_FLD
),
1053 MAP ("relsda", BFD_RELOC_PPC_EMB_RELSDA
),
1054 MAP ("xgot", BFD_RELOC_PPC_TOC16
),
1056 { (char *)0, 0, BFD_RELOC_UNUSED
}
1060 return BFD_RELOC_UNUSED
;
1062 for (ch
= *str
, str2
= ident
;
1063 str2
< ident
+ sizeof(ident
) - 1 && isalnum (ch
) || ch
== '@';
1066 *str2
++ = (islower (ch
)) ? ch
: tolower (ch
);
1073 for (ptr
= &mapping
[0]; ptr
->length
> 0; ptr
++)
1074 if (ch
== ptr
->string
[0] && len
== ptr
->length
&& memcmp (ident
, ptr
->string
, ptr
->length
) == 0)
1080 return BFD_RELOC_UNUSED
;
1083 /* Like normal .long/.short/.word, except support @got, etc. */
1084 /* clobbers input_line_pointer, checks */
1087 ppc_elf_cons (nbytes
)
1088 register int nbytes
; /* 1=.byte, 2=.word, 4=.long */
1091 bfd_reloc_code_real_type reloc
;
1093 if (is_it_end_of_statement ())
1095 demand_empty_rest_of_line ();
1102 if (exp
.X_op
== O_symbol
1103 && *input_line_pointer
== '@'
1104 && (reloc
= ppc_elf_suffix (&input_line_pointer
)) != BFD_RELOC_UNUSED
)
1106 reloc_howto_type
*reloc_howto
= bfd_reloc_type_lookup (stdoutput
, reloc
);
1107 int size
= bfd_get_reloc_size (reloc_howto
);
1110 as_bad ("%s relocations do not fit in %d bytes\n", reloc_howto
->name
, nbytes
);
1114 register char *p
= frag_more ((int) nbytes
);
1115 int offset
= nbytes
- size
;
1117 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
+ offset
, size
, &exp
, 0, reloc
);
1121 emit_expr (&exp
, (unsigned int) nbytes
);
1123 while (*input_line_pointer
++ == ',');
1125 input_line_pointer
--; /* Put terminator back into stream. */
1126 demand_empty_rest_of_line ();
1129 /* Validate any relocations emitted for -mrelocatable, possibly adding
1130 fixups for word relocations in writable segments, so we can adjust
1133 ppc_elf_validate_fix (fixp
, seg
)
1140 && fixp
->fx_r_type
<= BFD_RELOC_UNUSED
1141 && strcmp (segment_name (seg
), ".got2") != 0
1142 && strcmp (segment_name (seg
), ".dtors") != 0
1143 && strcmp (segment_name (seg
), ".ctors") != 0
1144 && strcmp (segment_name (seg
), ".fixup") != 0
1145 && strcmp (segment_name (seg
), ".stab") != 0
1146 && strcmp (segment_name (seg
), ".gcc_except_table") != 0)
1148 if ((seg
->flags
& (SEC_READONLY
| SEC_CODE
)) != 0
1149 || fixp
->fx_r_type
!= BFD_RELOC_CTOR
)
1151 as_warn_where (fixp
->fx_file
, fixp
->fx_line
,
1152 "Relocation cannot be done when using -mrelocatable");
1157 #endif /* OBJ_ELF */
1162 * Summary of parse_toc_entry().
1164 * in: Input_line_pointer points to the '[' in one of:
1166 * [toc] [tocv] [toc32] [toc64]
1168 * Anything else is an error of one kind or another.
1171 * return value: success or failure
1172 * toc_kind: kind of toc reference
1173 * input_line_pointer:
1174 * success: first char after the ']'
1175 * failure: unchanged
1179 * [toc] - rv == success, toc_kind = default_toc
1180 * [tocv] - rv == success, toc_kind = data_in_toc
1181 * [toc32] - rv == success, toc_kind = must_be_32
1182 * [toc64] - rv == success, toc_kind = must_be_64
1186 enum toc_size_qualifier
1188 default_toc
, /* The toc cell constructed should be the system default size */
1189 data_in_toc
, /* This is a direct reference to a toc cell */
1190 must_be_32
, /* The toc cell constructed must be 32 bits wide */
1191 must_be_64
/* The toc cell constructed must be 64 bits wide */
1195 parse_toc_entry(toc_kind
)
1196 enum toc_size_qualifier
*toc_kind
;
1201 enum toc_size_qualifier t
;
1203 /* save the input_line_pointer */
1204 start
= input_line_pointer
;
1206 /* skip over the '[' , and whitespace */
1207 ++input_line_pointer
;
1210 /* find the spelling of the operand */
1211 toc_spec
= input_line_pointer
;
1212 c
= get_symbol_end ();
1214 if (strcmp(toc_spec
, "toc") == 0)
1218 else if (strcmp(toc_spec
, "tocv") == 0)
1222 else if (strcmp(toc_spec
, "toc32") == 0)
1226 else if (strcmp(toc_spec
, "toc64") == 0)
1232 as_bad ("syntax error: invalid toc specifier `%s'", toc_spec
);
1233 *input_line_pointer
= c
; /* put back the delimiting char */
1234 input_line_pointer
= start
; /* reset input_line pointer */
1238 /* now find the ']' */
1239 *input_line_pointer
= c
; /* put back the delimiting char */
1241 SKIP_WHITESPACE (); /* leading whitespace could be there. */
1242 c
= *input_line_pointer
++; /* input_line_pointer->past char in c. */
1246 as_bad ("syntax error: expected `]', found `%c'", c
);
1247 input_line_pointer
= start
; /* reset input_line pointer */
1251 *toc_kind
= t
; /* set return value */
1258 /* We need to keep a list of fixups. We can't simply generate them as
1259 we go, because that would require us to first create the frag, and
1260 that would screw up references to ``.''. */
1266 bfd_reloc_code_real_type reloc
;
1269 #define MAX_INSN_FIXUPS (5)
1271 /* This routine is called for each instruction to be assembled. */
1278 const struct powerpc_opcode
*opcode
;
1280 const unsigned char *opindex_ptr
;
1284 struct ppc_fixup fixups
[MAX_INSN_FIXUPS
];
1289 bfd_reloc_code_real_type reloc
;
1292 /* Get the opcode. */
1293 for (s
= str
; *s
!= '\0' && ! isspace (*s
); s
++)
1298 /* Look up the opcode in the hash table. */
1299 opcode
= (const struct powerpc_opcode
*) hash_find (ppc_hash
, str
);
1300 if (opcode
== (const struct powerpc_opcode
*) NULL
)
1302 const struct powerpc_macro
*macro
;
1304 macro
= (const struct powerpc_macro
*) hash_find (ppc_macro_hash
, str
);
1305 if (macro
== (const struct powerpc_macro
*) NULL
)
1306 as_bad ("Unrecognized opcode: `%s'", str
);
1308 ppc_macro (s
, macro
);
1313 insn
= opcode
->opcode
;
1316 while (isspace (*str
))
1319 /* PowerPC operands are just expressions. The only real issue is
1320 that a few operand types are optional. All cases which might use
1321 an optional operand separate the operands only with commas (in
1322 some cases parentheses are used, as in ``lwz 1,0(1)'' but such
1323 cases never have optional operands). There is never more than
1324 one optional operand for an instruction. So, before we start
1325 seriously parsing the operands, we check to see if we have an
1326 optional operand, and, if we do, we count the number of commas to
1327 see whether the operand should be omitted. */
1329 for (opindex_ptr
= opcode
->operands
; *opindex_ptr
!= 0; opindex_ptr
++)
1331 const struct powerpc_operand
*operand
;
1333 operand
= &powerpc_operands
[*opindex_ptr
];
1334 if ((operand
->flags
& PPC_OPERAND_OPTIONAL
) != 0)
1336 unsigned int opcount
;
1338 /* There is an optional operand. Count the number of
1339 commas in the input line. */
1346 while ((s
= strchr (s
, ',')) != (char *) NULL
)
1353 /* If there are fewer operands in the line then are called
1354 for by the instruction, we want to skip the optional
1356 if (opcount
< strlen (opcode
->operands
))
1363 /* Gather the operands. */
1367 for (opindex_ptr
= opcode
->operands
; *opindex_ptr
!= 0; opindex_ptr
++)
1369 const struct powerpc_operand
*operand
;
1375 if (next_opindex
== 0)
1376 operand
= &powerpc_operands
[*opindex_ptr
];
1379 operand
= &powerpc_operands
[next_opindex
];
1385 /* If this is a fake operand, then we do not expect anything
1387 if ((operand
->flags
& PPC_OPERAND_FAKE
) != 0)
1389 insn
= (*operand
->insert
) (insn
, 0L, &errmsg
);
1390 if (errmsg
!= (const char *) NULL
)
1395 /* If this is an optional operand, and we are skipping it, just
1397 if ((operand
->flags
& PPC_OPERAND_OPTIONAL
) != 0
1400 if (operand
->insert
)
1402 insn
= (*operand
->insert
) (insn
, 0L, &errmsg
);
1403 if (errmsg
!= (const char *) NULL
)
1406 if ((operand
->flags
& PPC_OPERAND_NEXT
) != 0)
1407 next_opindex
= *opindex_ptr
+ 1;
1411 /* Gather the operand. */
1412 hold
= input_line_pointer
;
1413 input_line_pointer
= str
;
1416 if (*input_line_pointer
== '[')
1418 /* We are expecting something like the second argument here:
1420 lwz r4,[toc].GS.0.static_int(rtoc)
1421 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
1422 The argument following the `]' must be a symbol name, and the
1423 register must be the toc register: 'rtoc' or '2'
1425 The effect is to 0 as the displacement field
1426 in the instruction, and issue an IMAGE_REL_PPC_TOCREL16 (or
1427 the appropriate variation) reloc against it based on the symbol.
1428 The linker will build the toc, and insert the resolved toc offset.
1431 o The size of the toc entry is currently assumed to be
1432 32 bits. This should not be assumed to be a hard coded
1434 o In an effort to cope with a change from 32 to 64 bits,
1435 there are also toc entries that are specified to be
1436 either 32 or 64 bits:
1437 lwz r4,[toc32].GS.0.static_int(rtoc)
1438 lwz r4,[toc64].GS.0.static_int(rtoc)
1439 These demand toc entries of the specified size, and the
1440 instruction probably requires it.
1444 enum toc_size_qualifier toc_kind
;
1445 bfd_reloc_code_real_type toc_reloc
;
1447 /* go parse off the [tocXX] part */
1448 valid_toc
= parse_toc_entry(&toc_kind
);
1452 /* Note: message has already been issued. */
1453 /* FIXME: what sort of recovery should we do? */
1454 /* demand_rest_of_line(); return; ? */
1457 /* Now get the symbol following the ']' */
1463 /* In this case, we may not have seen the symbol yet, since */
1464 /* it is allowed to appear on a .extern or .globl or just be */
1465 /* a label in the .data section. */
1466 toc_reloc
= BFD_RELOC_PPC_TOC16
;
1469 /* 1. The symbol must be defined and either in the toc */
1470 /* section, or a global. */
1471 /* 2. The reloc generated must have the TOCDEFN flag set in */
1472 /* upper bit mess of the reloc type. */
1473 /* FIXME: It's a little confusing what the tocv qualifier can */
1474 /* be used for. At the very least, I've seen three */
1475 /* uses, only one of which I'm sure I can explain. */
1476 if (ex
.X_op
== O_symbol
)
1478 assert (ex
.X_add_symbol
!= NULL
);
1479 if (ex
.X_add_symbol
->bsym
->section
!= tocdata_section
)
1481 as_warn("[tocv] symbol is not a toc symbol");
1485 toc_reloc
= BFD_RELOC_PPC_TOC16
;
1488 /* FIXME: these next two specifically specify 32/64 bit toc */
1489 /* entries. We don't support them today. Is this the */
1490 /* right way to say that? */
1491 toc_reloc
= BFD_RELOC_UNUSED
;
1492 as_bad ("Unimplemented toc32 expression modifier");
1495 /* FIXME: see above */
1496 toc_reloc
= BFD_RELOC_UNUSED
;
1497 as_bad ("Unimplemented toc64 expression modifier");
1501 "Unexpected return value [%d] from parse_toc_entry!\n",
1507 /* We need to generate a fixup for this expression. */
1508 if (fc
>= MAX_INSN_FIXUPS
)
1509 as_fatal ("too many fixups");
1511 fixups
[fc
].reloc
= toc_reloc
;
1512 fixups
[fc
].exp
= ex
;
1513 fixups
[fc
].opindex
= *opindex_ptr
;
1516 /* Ok. We've set up the fixup for the instruction. Now make it
1517 look like the constant 0 was found here */
1519 ex
.X_op
= O_constant
;
1520 ex
.X_add_number
= 0;
1521 ex
.X_add_symbol
= NULL
;
1522 ex
.X_op_symbol
= NULL
;
1527 if (!register_name(&ex
))
1530 str
= input_line_pointer
;
1531 input_line_pointer
= hold
;
1533 if (ex
.X_op
== O_illegal
)
1534 as_bad ("illegal operand");
1535 else if (ex
.X_op
== O_absent
)
1536 as_bad ("missing operand");
1537 else if (ex
.X_op
== O_register
)
1539 insn
= ppc_insert_operand (insn
, operand
, ex
.X_add_number
,
1542 else if (ex
.X_op
== O_constant
)
1545 /* Allow @HA, @L, @H on constants. */
1546 char *orig_str
= str
;
1548 if ((reloc
= ppc_elf_suffix (&str
)) != BFD_RELOC_UNUSED
)
1555 case BFD_RELOC_LO16
:
1556 ex
.X_add_number
= ((ex
.X_add_number
& 0xffff) ^ 0x8000) - 0x8000;
1559 case BFD_RELOC_HI16
:
1560 ex
.X_add_number
= (ex
.X_add_number
>> 16) & 0xffff;
1563 case BFD_RELOC_HI16_S
:
1564 ex
.X_add_number
= ((ex
.X_add_number
>> 16) & 0xffff)
1565 + ((ex
.X_add_number
>> 15) & 1);
1569 insn
= ppc_insert_operand (insn
, operand
, ex
.X_add_number
,
1573 else if ((reloc
= ppc_elf_suffix (&str
)) != BFD_RELOC_UNUSED
)
1575 /* For the absoulte forms of branchs, convert the PC relative form back into
1577 if ((operand
->flags
& PPC_OPERAND_ABSOLUTE
) != 0)
1580 case BFD_RELOC_PPC_B26
: reloc
= BFD_RELOC_PPC_BA26
; break;
1581 case BFD_RELOC_PPC_B16
: reloc
= BFD_RELOC_PPC_BA16
; break;
1582 case BFD_RELOC_PPC_B16_BRTAKEN
: reloc
= BFD_RELOC_PPC_BA16_BRTAKEN
; break;
1583 case BFD_RELOC_PPC_B16_BRNTAKEN
: reloc
= BFD_RELOC_PPC_BA16_BRNTAKEN
; break;
1586 /* We need to generate a fixup for this expression. */
1587 if (fc
>= MAX_INSN_FIXUPS
)
1588 as_fatal ("too many fixups");
1589 fixups
[fc
].exp
= ex
;
1590 fixups
[fc
].opindex
= 0;
1591 fixups
[fc
].reloc
= reloc
;
1594 #endif /* OBJ_ELF */
1598 /* We need to generate a fixup for this expression. */
1599 if (fc
>= MAX_INSN_FIXUPS
)
1600 as_fatal ("too many fixups");
1601 fixups
[fc
].exp
= ex
;
1602 fixups
[fc
].opindex
= *opindex_ptr
;
1603 fixups
[fc
].reloc
= BFD_RELOC_UNUSED
;
1612 else if ((operand
->flags
& PPC_OPERAND_PARENS
) != 0)
1620 /* The call to expression should have advanced str past any
1623 && (endc
!= ',' || *str
!= '\0'))
1625 as_bad ("syntax error; found `%c' but expected `%c'", *str
, endc
);
1633 while (isspace (*str
))
1637 as_bad ("junk at end of line: `%s'", str
);
1639 /* Write out the instruction. */
1641 md_number_to_chars (f
, insn
, 4);
1643 /* Create any fixups. At this point we do not use a
1644 bfd_reloc_code_real_type, but instead just use the
1645 BFD_RELOC_UNUSED plus the operand index. This lets us easily
1646 handle fixups for any operand type, although that is admittedly
1647 not a very exciting feature. We pick a BFD reloc type in
1649 for (i
= 0; i
< fc
; i
++)
1651 const struct powerpc_operand
*operand
;
1653 operand
= &powerpc_operands
[fixups
[i
].opindex
];
1654 if (fixups
[i
].reloc
!= BFD_RELOC_UNUSED
)
1656 reloc_howto_type
*reloc_howto
= bfd_reloc_type_lookup (stdoutput
, fixups
[i
].reloc
);
1664 size
= bfd_get_reloc_size (reloc_howto
);
1665 offset
= target_big_endian
? (4 - size
) : 0;
1667 if (size
< 1 || size
> 4)
1670 fixP
= fix_new_exp (frag_now
, f
- frag_now
->fr_literal
+ offset
, size
,
1671 &fixups
[i
].exp
, reloc_howto
->pc_relative
,
1674 /* Turn off complaints that the addend is too large for things like
1676 switch (fixups
[i
].reloc
)
1678 case BFD_RELOC_16_GOTOFF
:
1679 case BFD_RELOC_PPC_TOC16
:
1680 case BFD_RELOC_LO16
:
1681 case BFD_RELOC_HI16
:
1682 case BFD_RELOC_HI16_S
:
1683 fixP
->fx_no_overflow
= 1;
1690 fix_new_exp (frag_now
, f
- frag_now
->fr_literal
, 4,
1692 (operand
->flags
& PPC_OPERAND_RELATIVE
) != 0,
1693 ((bfd_reloc_code_real_type
)
1694 (fixups
[i
].opindex
+ (int) BFD_RELOC_UNUSED
)));
1698 #ifndef WORKING_DOT_WORD
1699 /* Handle long and short jumps */
1701 md_create_short_jump (ptr
, from_addr
, to_addr
, frag
, to_symbol
)
1703 addressT from_addr
, to_addr
;
1711 md_create_long_jump (ptr
, from_addr
, to_addr
, frag
, to_symbol
)
1713 addressT from_addr
, to_addr
;
1721 /* Handle a macro. Gather all the operands, transform them as
1722 described by the macro, and call md_assemble recursively. All the
1723 operands are separated by commas; we don't accept parentheses
1724 around operands here. */
1727 ppc_macro (str
, macro
)
1729 const struct powerpc_macro
*macro
;
1740 /* Gather the users operands into the operands array. */
1745 if (count
>= sizeof operands
/ sizeof operands
[0])
1747 operands
[count
++] = s
;
1748 s
= strchr (s
, ',');
1749 if (s
== (char *) NULL
)
1754 if (count
!= macro
->operands
)
1756 as_bad ("wrong number of operands");
1760 /* Work out how large the string must be (the size is unbounded
1761 because it includes user input). */
1763 format
= macro
->format
;
1764 while (*format
!= '\0')
1773 arg
= strtol (format
+ 1, &send
, 10);
1774 know (send
!= format
&& arg
>= 0 && arg
< count
);
1775 len
+= strlen (operands
[arg
]);
1780 /* Put the string together. */
1781 complete
= s
= (char *) alloca (len
+ 1);
1782 format
= macro
->format
;
1783 while (*format
!= '\0')
1789 arg
= strtol (format
+ 1, &send
, 10);
1790 strcpy (s
, operands
[arg
]);
1797 /* Assemble the constructed instruction. */
1798 md_assemble (complete
);
1802 /* For ELF, add support for SHF_EXCLUDE and SHT_ORDERED */
1805 ppc_section_letter (letter
, ptr_msg
)
1812 *ptr_msg
= "Bad .section directive: want a,w,x,e in string";
1817 ppc_section_word (ptr_str
)
1820 if (strncmp (*ptr_str
, "exclude", sizeof ("exclude")-1) == 0)
1822 *ptr_str
+= sizeof ("exclude")-1;
1830 ppc_section_type (ptr_str
)
1833 if (strncmp (*ptr_str
, "ordered", sizeof ("ordered")-1) == 0)
1835 *ptr_str
+= sizeof ("ordered")-1;
1843 ppc_section_flags (flags
, attr
, type
)
1848 if (type
== SHT_ORDERED
)
1849 flags
|= SEC_ALLOC
| SEC_LOAD
| SEC_SORT_ENTRIES
;
1851 if (attr
& SHF_EXCLUDE
)
1852 flags
|= SEC_EXCLUDE
;
1856 #endif /* OBJ_ELF */
1859 /* Pseudo-op handling. */
1861 /* The .byte pseudo-op. This is similar to the normal .byte
1862 pseudo-op, but it can also take a single ASCII string. */
1868 if (*input_line_pointer
!= '\"')
1874 /* Gather characters. A real double quote is doubled. Unusual
1875 characters are not permitted. */
1876 ++input_line_pointer
;
1881 c
= *input_line_pointer
++;
1885 if (*input_line_pointer
!= '\"')
1887 ++input_line_pointer
;
1890 FRAG_APPEND_1_CHAR (c
);
1893 demand_empty_rest_of_line ();
1898 /* XCOFF specific pseudo-op handling. */
1900 /* This is set if we are creating a .stabx symbol, since we don't want
1901 to handle symbol suffixes for such symbols. */
1902 static boolean ppc_stab_symbol
;
1904 /* The .comm and .lcomm pseudo-ops for XCOFF. XCOFF puts common
1905 symbols in the .bss segment as though they were local common
1906 symbols, and uses a different smclas. */
1912 asection
*current_seg
= now_seg
;
1913 subsegT current_subseg
= now_subseg
;
1919 symbolS
*lcomm_sym
= NULL
;
1923 name
= input_line_pointer
;
1924 endc
= get_symbol_end ();
1925 end_name
= input_line_pointer
;
1928 if (*input_line_pointer
!= ',')
1930 as_bad ("missing size");
1931 ignore_rest_of_line ();
1934 ++input_line_pointer
;
1936 size
= get_absolute_expression ();
1939 as_bad ("negative size");
1940 ignore_rest_of_line ();
1946 /* The third argument to .comm is the alignment. */
1947 if (*input_line_pointer
!= ',')
1951 ++input_line_pointer
;
1952 align
= get_absolute_expression ();
1955 as_warn ("ignoring bad alignment");
1974 /* The third argument to .lcomm appears to be the real local
1975 common symbol to create. References to the symbol named in
1976 the first argument are turned into references to the third
1978 if (*input_line_pointer
!= ',')
1980 as_bad ("missing real symbol name");
1981 ignore_rest_of_line ();
1984 ++input_line_pointer
;
1986 lcomm_name
= input_line_pointer
;
1987 lcomm_endc
= get_symbol_end ();
1989 lcomm_sym
= symbol_find_or_make (lcomm_name
);
1991 *input_line_pointer
= lcomm_endc
;
1995 sym
= symbol_find_or_make (name
);
1998 if (S_IS_DEFINED (sym
)
1999 || S_GET_VALUE (sym
) != 0)
2001 as_bad ("attempt to redefine symbol");
2002 ignore_rest_of_line ();
2006 record_alignment (bss_section
, align
);
2009 || ! S_IS_DEFINED (lcomm_sym
))
2018 S_SET_EXTERNAL (sym
);
2022 lcomm_sym
->sy_tc
.output
= 1;
2023 def_sym
= lcomm_sym
;
2027 subseg_set (bss_section
, 1);
2028 frag_align (align
, 0);
2030 def_sym
->sy_frag
= frag_now
;
2031 pfrag
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, def_sym
,
2032 def_size
, (char *) NULL
);
2034 S_SET_SEGMENT (def_sym
, bss_section
);
2035 def_sym
->sy_tc
.align
= align
;
2039 /* Align the size of lcomm_sym. */
2040 lcomm_sym
->sy_frag
->fr_offset
=
2041 ((lcomm_sym
->sy_frag
->fr_offset
+ (1 << align
) - 1)
2042 &~ ((1 << align
) - 1));
2043 if (align
> lcomm_sym
->sy_tc
.align
)
2044 lcomm_sym
->sy_tc
.align
= align
;
2049 /* Make sym an offset from lcomm_sym. */
2050 S_SET_SEGMENT (sym
, bss_section
);
2051 sym
->sy_frag
= lcomm_sym
->sy_frag
;
2052 S_SET_VALUE (sym
, lcomm_sym
->sy_frag
->fr_offset
);
2053 lcomm_sym
->sy_frag
->fr_offset
+= size
;
2056 subseg_set (current_seg
, current_subseg
);
2058 demand_empty_rest_of_line ();
2061 /* The .csect pseudo-op. This switches us into a different
2062 subsegment. The first argument is a symbol whose value is the
2063 start of the .csect. In COFF, csect symbols get special aux
2064 entries defined by the x_csect field of union internal_auxent. The
2065 optional second argument is the alignment (the default is 2). */
2075 name
= input_line_pointer
;
2076 endc
= get_symbol_end ();
2078 sym
= symbol_find_or_make (name
);
2080 *input_line_pointer
= endc
;
2082 if (S_GET_NAME (sym
)[0] == '\0')
2084 /* An unnamed csect is assumed to be [PR]. */
2085 sym
->sy_tc
.class = XMC_PR
;
2088 ppc_change_csect (sym
);
2090 if (*input_line_pointer
== ',')
2092 ++input_line_pointer
;
2093 sym
->sy_tc
.align
= get_absolute_expression ();
2096 demand_empty_rest_of_line ();
2099 /* Change to a different csect. */
2102 ppc_change_csect (sym
)
2105 if (S_IS_DEFINED (sym
))
2106 subseg_set (S_GET_SEGMENT (sym
), sym
->sy_tc
.subseg
);
2113 /* This is a new csect. We need to look at the symbol class to
2114 figure out whether it should go in the text section or the
2117 switch (sym
->sy_tc
.class)
2127 S_SET_SEGMENT (sym
, text_section
);
2128 sym
->sy_tc
.subseg
= ppc_text_subsegment
;
2129 ++ppc_text_subsegment
;
2130 list_ptr
= &ppc_text_csects
;
2139 if (ppc_toc_csect
!= NULL
2140 && ppc_toc_csect
->sy_tc
.subseg
+ 1 == ppc_data_subsegment
)
2142 S_SET_SEGMENT (sym
, data_section
);
2143 sym
->sy_tc
.subseg
= ppc_data_subsegment
;
2144 ++ppc_data_subsegment
;
2145 list_ptr
= &ppc_data_csects
;
2151 subseg_new (segment_name (S_GET_SEGMENT (sym
)), sym
->sy_tc
.subseg
);
2153 ppc_after_toc_frag
= frag_now
;
2155 sym
->sy_frag
= frag_now
;
2156 S_SET_VALUE (sym
, (valueT
) frag_now_fix ());
2158 sym
->sy_tc
.align
= 2;
2159 sym
->sy_tc
.output
= 1;
2160 sym
->sy_tc
.within
= sym
;
2162 for (list
= *list_ptr
;
2163 list
->sy_tc
.next
!= (symbolS
*) NULL
;
2164 list
= list
->sy_tc
.next
)
2166 list
->sy_tc
.next
= sym
;
2168 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
2169 symbol_append (sym
, list
->sy_tc
.within
, &symbol_rootP
, &symbol_lastP
);
2172 ppc_current_csect
= sym
;
2175 /* This function handles the .text and .data pseudo-ops. These
2176 pseudo-ops aren't really used by XCOFF; we implement them for the
2177 convenience of people who aren't used to XCOFF. */
2188 else if (type
== 'd')
2193 sym
= symbol_find_or_make (name
);
2195 ppc_change_csect (sym
);
2197 demand_empty_rest_of_line ();
2200 /* The .extern pseudo-op. We create an undefined symbol. */
2209 name
= input_line_pointer
;
2210 endc
= get_symbol_end ();
2212 (void) symbol_find_or_make (name
);
2214 *input_line_pointer
= endc
;
2216 demand_empty_rest_of_line ();
2219 /* The .lglobl pseudo-op. Keep the symbol in the symbol table. */
2229 name
= input_line_pointer
;
2230 endc
= get_symbol_end ();
2232 sym
= symbol_find_or_make (name
);
2234 *input_line_pointer
= endc
;
2236 sym
->sy_tc
.output
= 1;
2238 demand_empty_rest_of_line ();
2241 /* The .rename pseudo-op. The RS/6000 assembler can rename symbols,
2242 although I don't know why it bothers. */
2253 name
= input_line_pointer
;
2254 endc
= get_symbol_end ();
2256 sym
= symbol_find_or_make (name
);
2258 *input_line_pointer
= endc
;
2260 if (*input_line_pointer
!= ',')
2262 as_bad ("missing rename string");
2263 ignore_rest_of_line ();
2266 ++input_line_pointer
;
2268 sym
->sy_tc
.real_name
= demand_copy_C_string (&len
);
2270 demand_empty_rest_of_line ();
2273 /* The .stabx pseudo-op. This is similar to a normal .stabs
2274 pseudo-op, but slightly different. A sample is
2275 .stabx "main:F-1",.main,142,0
2276 The first argument is the symbol name to create. The second is the
2277 value, and the third is the storage class. The fourth seems to be
2278 always zero, and I am assuming it is the type. */
2289 name
= demand_copy_C_string (&len
);
2291 if (*input_line_pointer
!= ',')
2293 as_bad ("missing value");
2296 ++input_line_pointer
;
2298 ppc_stab_symbol
= true;
2299 sym
= symbol_make (name
);
2300 ppc_stab_symbol
= false;
2302 sym
->sy_tc
.real_name
= name
;
2304 (void) expression (&exp
);
2311 as_bad ("illegal .stabx expression; zero assumed");
2312 exp
.X_add_number
= 0;
2315 S_SET_VALUE (sym
, (valueT
) exp
.X_add_number
);
2316 sym
->sy_frag
= &zero_address_frag
;
2320 if (S_GET_SEGMENT (exp
.X_add_symbol
) == undefined_section
)
2321 sym
->sy_value
= exp
;
2325 exp
.X_add_number
+ S_GET_VALUE (exp
.X_add_symbol
));
2326 sym
->sy_frag
= exp
.X_add_symbol
->sy_frag
;
2331 /* The value is some complex expression. This will probably
2332 fail at some later point, but this is probably the right
2333 thing to do here. */
2334 sym
->sy_value
= exp
;
2338 S_SET_SEGMENT (sym
, ppc_coff_debug_section
);
2339 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2341 if (*input_line_pointer
!= ',')
2343 as_bad ("missing class");
2346 ++input_line_pointer
;
2348 S_SET_STORAGE_CLASS (sym
, get_absolute_expression ());
2350 if (*input_line_pointer
!= ',')
2352 as_bad ("missing type");
2355 ++input_line_pointer
;
2357 S_SET_DATA_TYPE (sym
, get_absolute_expression ());
2359 sym
->sy_tc
.output
= 1;
2361 if (S_GET_STORAGE_CLASS (sym
) == C_STSYM
)
2362 sym
->sy_tc
.within
= ppc_current_block
;
2364 if (exp
.X_op
!= O_symbol
2365 || ! S_IS_EXTERNAL (exp
.X_add_symbol
)
2366 || S_GET_SEGMENT (exp
.X_add_symbol
) != bss_section
)
2367 ppc_frob_label (sym
);
2370 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
2371 symbol_append (sym
, exp
.X_add_symbol
, &symbol_rootP
, &symbol_lastP
);
2372 if (ppc_current_csect
->sy_tc
.within
== exp
.X_add_symbol
)
2373 ppc_current_csect
->sy_tc
.within
= sym
;
2376 demand_empty_rest_of_line ();
2379 /* The .function pseudo-op. This takes several arguments. The first
2380 argument seems to be the external name of the symbol. The second
2381 argment seems to be the label for the start of the function. gcc
2382 uses the same name for both. I have no idea what the third and
2383 fourth arguments are meant to be. The optional fifth argument is
2384 an expression for the size of the function. In COFF this symbol
2385 gets an aux entry like that used for a csect. */
2388 ppc_function (ignore
)
2397 name
= input_line_pointer
;
2398 endc
= get_symbol_end ();
2400 /* Ignore any [PR] suffix. */
2401 name
= ppc_canonicalize_symbol_name (name
);
2402 s
= strchr (name
, '[');
2403 if (s
!= (char *) NULL
2404 && strcmp (s
+ 1, "PR]") == 0)
2407 ext_sym
= symbol_find_or_make (name
);
2409 *input_line_pointer
= endc
;
2411 if (*input_line_pointer
!= ',')
2413 as_bad ("missing symbol name");
2414 ignore_rest_of_line ();
2417 ++input_line_pointer
;
2419 name
= input_line_pointer
;
2420 endc
= get_symbol_end ();
2422 lab_sym
= symbol_find_or_make (name
);
2424 *input_line_pointer
= endc
;
2426 if (ext_sym
!= lab_sym
)
2428 ext_sym
->sy_value
.X_op
= O_symbol
;
2429 ext_sym
->sy_value
.X_add_symbol
= lab_sym
;
2430 ext_sym
->sy_value
.X_op_symbol
= NULL
;
2431 ext_sym
->sy_value
.X_add_number
= 0;
2434 if (ext_sym
->sy_tc
.class == -1)
2435 ext_sym
->sy_tc
.class = XMC_PR
;
2436 ext_sym
->sy_tc
.output
= 1;
2438 if (*input_line_pointer
== ',')
2442 /* Ignore the third argument. */
2443 ++input_line_pointer
;
2444 expression (&ignore
);
2445 if (*input_line_pointer
== ',')
2447 /* Ignore the fourth argument. */
2448 ++input_line_pointer
;
2449 expression (&ignore
);
2450 if (*input_line_pointer
== ',')
2452 /* The fifth argument is the function size. */
2453 ++input_line_pointer
;
2454 ext_sym
->sy_tc
.size
= symbol_new ("L0\001",
2457 &zero_address_frag
);
2458 pseudo_set (ext_sym
->sy_tc
.size
);
2463 S_SET_DATA_TYPE (ext_sym
, DT_FCN
<< N_BTSHFT
);
2464 SF_SET_FUNCTION (ext_sym
);
2465 SF_SET_PROCESS (ext_sym
);
2466 coff_add_linesym (ext_sym
);
2468 demand_empty_rest_of_line ();
2471 /* The .bf pseudo-op. This is just like a COFF C_FCN symbol named
2480 sym
= symbol_make (".bf");
2481 S_SET_SEGMENT (sym
, text_section
);
2482 sym
->sy_frag
= frag_now
;
2483 S_SET_VALUE (sym
, frag_now_fix ());
2484 S_SET_STORAGE_CLASS (sym
, C_FCN
);
2486 coff_line_base
= get_absolute_expression ();
2488 S_SET_NUMBER_AUXILIARY (sym
, 1);
2489 SA_SET_SYM_LNNO (sym
, coff_line_base
);
2491 sym
->sy_tc
.output
= 1;
2493 ppc_frob_label (sym
);
2495 demand_empty_rest_of_line ();
2498 /* The .ef pseudo-op. This is just like a COFF C_FCN symbol named
2499 ".ef", except that the line number is absolute, not relative to the
2500 most recent ".bf" symbol. */
2508 sym
= symbol_make (".ef");
2509 S_SET_SEGMENT (sym
, text_section
);
2510 sym
->sy_frag
= frag_now
;
2511 S_SET_VALUE (sym
, frag_now_fix ());
2512 S_SET_STORAGE_CLASS (sym
, C_FCN
);
2513 S_SET_NUMBER_AUXILIARY (sym
, 1);
2514 SA_SET_SYM_LNNO (sym
, get_absolute_expression ());
2515 sym
->sy_tc
.output
= 1;
2517 ppc_frob_label (sym
);
2519 demand_empty_rest_of_line ();
2522 /* The .bi and .ei pseudo-ops. These take a string argument and
2523 generates a C_BINCL or C_EINCL symbol, which goes at the start of
2535 name
= demand_copy_C_string (&len
);
2537 /* The value of these symbols is actually file offset. Here we set
2538 the value to the index into the line number entries. In
2539 ppc_frob_symbols we set the fix_line field, which will cause BFD
2540 to do the right thing. */
2542 sym
= symbol_make (name
);
2543 /* obj-coff.c currently only handles line numbers correctly in the
2545 S_SET_SEGMENT (sym
, text_section
);
2546 S_SET_VALUE (sym
, coff_n_line_nos
);
2547 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2549 S_SET_STORAGE_CLASS (sym
, ei
? C_EINCL
: C_BINCL
);
2550 sym
->sy_tc
.output
= 1;
2552 for (look
= symbol_rootP
;
2553 (look
!= (symbolS
*) NULL
2554 && (S_GET_STORAGE_CLASS (look
) == C_FILE
2555 || S_GET_STORAGE_CLASS (look
) == C_BINCL
2556 || S_GET_STORAGE_CLASS (look
) == C_EINCL
));
2557 look
= symbol_next (look
))
2559 if (look
!= (symbolS
*) NULL
)
2561 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
2562 symbol_insert (sym
, look
, &symbol_rootP
, &symbol_lastP
);
2565 demand_empty_rest_of_line ();
2568 /* The .bs pseudo-op. This generates a C_BSTAT symbol named ".bs".
2569 There is one argument, which is a csect symbol. The value of the
2570 .bs symbol is the index of this csect symbol. */
2581 if (ppc_current_block
!= NULL
)
2582 as_bad ("nested .bs blocks");
2584 name
= input_line_pointer
;
2585 endc
= get_symbol_end ();
2587 csect
= symbol_find_or_make (name
);
2589 *input_line_pointer
= endc
;
2591 sym
= symbol_make (".bs");
2592 S_SET_SEGMENT (sym
, now_seg
);
2593 S_SET_STORAGE_CLASS (sym
, C_BSTAT
);
2594 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2595 sym
->sy_tc
.output
= 1;
2597 sym
->sy_tc
.within
= csect
;
2599 ppc_frob_label (sym
);
2601 ppc_current_block
= sym
;
2603 demand_empty_rest_of_line ();
2606 /* The .es pseudo-op. Generate a C_ESTART symbol named .es. */
2614 if (ppc_current_block
== NULL
)
2615 as_bad (".es without preceding .bs");
2617 sym
= symbol_make (".es");
2618 S_SET_SEGMENT (sym
, now_seg
);
2619 S_SET_STORAGE_CLASS (sym
, C_ESTAT
);
2620 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2621 sym
->sy_tc
.output
= 1;
2623 ppc_frob_label (sym
);
2625 ppc_current_block
= NULL
;
2627 demand_empty_rest_of_line ();
2630 /* The .bb pseudo-op. Generate a C_BLOCK symbol named .bb, with a
2639 sym
= symbol_make (".bb");
2640 S_SET_SEGMENT (sym
, text_section
);
2641 sym
->sy_frag
= frag_now
;
2642 S_SET_VALUE (sym
, frag_now_fix ());
2643 S_SET_STORAGE_CLASS (sym
, C_BLOCK
);
2645 S_SET_NUMBER_AUXILIARY (sym
, 1);
2646 SA_SET_SYM_LNNO (sym
, get_absolute_expression ());
2648 sym
->sy_tc
.output
= 1;
2650 SF_SET_PROCESS (sym
);
2652 ppc_frob_label (sym
);
2654 demand_empty_rest_of_line ();
2657 /* The .eb pseudo-op. Generate a C_BLOCK symbol named .eb, with a
2666 sym
= symbol_make (".eb");
2667 S_SET_SEGMENT (sym
, text_section
);
2668 sym
->sy_frag
= frag_now
;
2669 S_SET_VALUE (sym
, frag_now_fix ());
2670 S_SET_STORAGE_CLASS (sym
, C_BLOCK
);
2671 S_SET_NUMBER_AUXILIARY (sym
, 1);
2672 SA_SET_SYM_LNNO (sym
, get_absolute_expression ());
2673 sym
->sy_tc
.output
= 1;
2675 SF_SET_PROCESS (sym
);
2677 ppc_frob_label (sym
);
2679 demand_empty_rest_of_line ();
2682 /* The .bc pseudo-op. This just creates a C_BCOMM symbol with a
2693 name
= demand_copy_C_string (&len
);
2694 sym
= symbol_make (name
);
2695 S_SET_SEGMENT (sym
, ppc_coff_debug_section
);
2696 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2697 S_SET_STORAGE_CLASS (sym
, C_BCOMM
);
2698 S_SET_VALUE (sym
, 0);
2699 sym
->sy_tc
.output
= 1;
2701 ppc_frob_label (sym
);
2703 demand_empty_rest_of_line ();
2706 /* The .ec pseudo-op. This just creates a C_ECOMM symbol. */
2714 sym
= symbol_make (".ec");
2715 S_SET_SEGMENT (sym
, ppc_coff_debug_section
);
2716 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2717 S_SET_STORAGE_CLASS (sym
, C_ECOMM
);
2718 S_SET_VALUE (sym
, 0);
2719 sym
->sy_tc
.output
= 1;
2721 ppc_frob_label (sym
);
2723 demand_empty_rest_of_line ();
2726 /* The .toc pseudo-op. Switch to the .toc subsegment. */
2732 if (ppc_toc_csect
!= (symbolS
*) NULL
)
2733 subseg_set (data_section
, ppc_toc_csect
->sy_tc
.subseg
);
2740 subseg
= ppc_data_subsegment
;
2741 ++ppc_data_subsegment
;
2743 subseg_new (segment_name (data_section
), subseg
);
2744 ppc_toc_frag
= frag_now
;
2746 sym
= symbol_find_or_make ("TOC[TC0]");
2747 sym
->sy_frag
= frag_now
;
2748 S_SET_SEGMENT (sym
, data_section
);
2749 S_SET_VALUE (sym
, (valueT
) frag_now_fix ());
2750 sym
->sy_tc
.subseg
= subseg
;
2751 sym
->sy_tc
.output
= 1;
2752 sym
->sy_tc
.within
= sym
;
2754 ppc_toc_csect
= sym
;
2756 for (list
= ppc_data_csects
;
2757 list
->sy_tc
.next
!= (symbolS
*) NULL
;
2758 list
= list
->sy_tc
.next
)
2760 list
->sy_tc
.next
= sym
;
2762 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
2763 symbol_append (sym
, list
->sy_tc
.within
, &symbol_rootP
, &symbol_lastP
);
2766 ppc_current_csect
= ppc_toc_csect
;
2768 demand_empty_rest_of_line ();
2771 #endif /* OBJ_XCOFF */
2773 /* The .tc pseudo-op. This is used when generating either XCOFF or
2774 ELF. This takes two or more arguments.
2776 When generating XCOFF output, the first argument is the name to
2777 give to this location in the toc; this will be a symbol with class
2778 TC. The rest of the arguments are 4 byte values to actually put at
2779 this location in the TOC; often there is just one more argument, a
2780 relocateable symbol reference.
2782 When not generating XCOFF output, the arguments are the same, but
2783 the first argument is simply ignored. */
2791 /* Define the TOC symbol name. */
2797 if (ppc_toc_csect
== (symbolS
*) NULL
2798 || ppc_toc_csect
!= ppc_current_csect
)
2800 as_bad (".tc not in .toc section");
2801 ignore_rest_of_line ();
2805 name
= input_line_pointer
;
2806 endc
= get_symbol_end ();
2808 sym
= symbol_find_or_make (name
);
2810 *input_line_pointer
= endc
;
2812 if (S_IS_DEFINED (sym
))
2816 label
= ppc_current_csect
->sy_tc
.within
;
2817 if (label
->sy_tc
.class != XMC_TC0
)
2819 as_warn (".tc with no label");
2820 ignore_rest_of_line ();
2824 S_SET_SEGMENT (label
, S_GET_SEGMENT (sym
));
2825 label
->sy_frag
= sym
->sy_frag
;
2826 S_SET_VALUE (label
, S_GET_VALUE (sym
));
2828 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
2829 ++input_line_pointer
;
2834 S_SET_SEGMENT (sym
, now_seg
);
2835 sym
->sy_frag
= frag_now
;
2836 S_SET_VALUE (sym
, (valueT
) frag_now_fix ());
2837 sym
->sy_tc
.class = XMC_TC
;
2838 sym
->sy_tc
.output
= 1;
2840 ppc_frob_label (sym
);
2843 #else /* ! defined (OBJ_XCOFF) */
2845 /* Skip the TOC symbol name. */
2846 while (is_part_of_name (*input_line_pointer
)
2847 || *input_line_pointer
== '['
2848 || *input_line_pointer
== ']'
2849 || *input_line_pointer
== '{'
2850 || *input_line_pointer
== '}')
2851 ++input_line_pointer
;
2853 /* Align to a four byte boundary. */
2855 record_alignment (now_seg
, 2);
2857 #endif /* ! defined (OBJ_XCOFF) */
2859 if (*input_line_pointer
!= ',')
2860 demand_empty_rest_of_line ();
2863 ++input_line_pointer
;
2870 /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format */
2872 /* Set the current section. */
2874 ppc_set_current_section (new)
2877 ppc_previous_section
= ppc_current_section
;
2878 ppc_current_section
= new;
2881 /* pseudo-op: .previous
2882 behaviour: toggles the current section with the previous section.
2884 warnings: "No previous section"
2887 ppc_previous(ignore
)
2892 if (ppc_previous_section
== NULL
)
2894 as_warn("No previous section to return to. Directive ignored.");
2898 subseg_set(ppc_previous_section
, 0);
2900 ppc_set_current_section(ppc_previous_section
);
2903 /* pseudo-op: .pdata
2904 behaviour: predefined read only data section
2908 initial: .section .pdata "adr3"
2909 a - don't know -- maybe a misprint
2910 d - initialized data
2912 3 - double word aligned (that would be 4 byte boundary)
2915 Tag index tables (also known as the function table) for exception
2916 handling, debugging, etc.
2923 if (pdata_section
== 0)
2925 pdata_section
= subseg_new (".pdata", 0);
2927 bfd_set_section_flags (stdoutput
, pdata_section
,
2928 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
2929 | SEC_READONLY
| SEC_DATA
));
2931 bfd_set_section_alignment (stdoutput
, pdata_section
, 2);
2935 pdata_section
= subseg_new(".pdata", 0);
2937 ppc_set_current_section(pdata_section
);
2940 /* pseudo-op: .ydata
2941 behaviour: predefined read only data section
2945 initial: .section .ydata "drw3"
2946 a - don't know -- maybe a misprint
2947 d - initialized data
2949 3 - double word aligned (that would be 4 byte boundary)
2951 Tag tables (also known as the scope table) for exception handling,
2958 if (ydata_section
== 0)
2960 ydata_section
= subseg_new (".ydata", 0);
2961 bfd_set_section_flags (stdoutput
, ydata_section
,
2962 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
2963 | SEC_READONLY
| SEC_DATA
));
2965 bfd_set_section_alignment (stdoutput
, ydata_section
, 3);
2969 ydata_section
= subseg_new (".ydata", 0);
2971 ppc_set_current_section(ydata_section
);
2974 /* pseudo-op: .reldata
2975 behaviour: predefined read write data section
2976 double word aligned (4-byte)
2977 FIXME: relocation is applied to it
2978 FIXME: what's the difference between this and .data?
2981 initial: .section .reldata "drw3"
2982 d - initialized data
2985 3 - double word aligned (that would be 8 byte boundary)
2988 Like .data, but intended to hold data subject to relocation, such as
2989 function descriptors, etc.
2995 if (reldata_section
== 0)
2997 reldata_section
= subseg_new (".reldata", 0);
2999 bfd_set_section_flags (stdoutput
, reldata_section
,
3000 ( SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
3003 bfd_set_section_alignment (stdoutput
, reldata_section
, 2);
3007 reldata_section
= subseg_new (".reldata", 0);
3009 ppc_set_current_section(reldata_section
);
3012 /* pseudo-op: .rdata
3013 behaviour: predefined read only data section
3017 initial: .section .rdata "dr3"
3018 d - initialized data
3020 3 - double word aligned (that would be 4 byte boundary)
3026 if (rdata_section
== 0)
3028 rdata_section
= subseg_new (".rdata", 0);
3029 bfd_set_section_flags (stdoutput
, rdata_section
,
3030 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
3031 | SEC_READONLY
| SEC_DATA
));
3033 bfd_set_section_alignment (stdoutput
, rdata_section
, 2);
3037 rdata_section
= subseg_new (".rdata", 0);
3039 ppc_set_current_section(rdata_section
);
3042 /* pseudo-op: .ualong
3043 behaviour: much like .int, with the exception that no alignment is
3045 FIXME: test the alignment statement
3057 /* pseudo-op: .znop <symbol name>
3058 behaviour: Issue a nop instruction
3059 Issue a IMAGE_REL_PPC_IFGLUE relocation against it, using
3060 the supplied symbol name.
3062 warnings: Missing symbol name
3069 const struct powerpc_opcode
*opcode
;
3075 /* Strip out the symbol name */
3083 symbol_name
= input_line_pointer
;
3084 c
= get_symbol_end ();
3086 name
= xmalloc (input_line_pointer
- symbol_name
+ 1);
3087 strcpy (name
, symbol_name
);
3089 sym
= symbol_find_or_make (name
);
3091 *input_line_pointer
= c
;
3095 /* Look up the opcode in the hash table. */
3096 opcode
= (const struct powerpc_opcode
*) hash_find (ppc_hash
, "nop");
3098 /* stick in the nop */
3099 insn
= opcode
->opcode
;
3101 /* Write out the instruction. */
3103 md_number_to_chars (f
, insn
, 4);
3105 f
- frag_now
->fr_literal
,
3110 BFD_RELOC_16_GOT_PCREL
);
3123 register char *name
;
3127 register symbolS
*symbolP
;
3130 name
= input_line_pointer
;
3131 c
= get_symbol_end ();
3133 /* just after name is now '\0' */
3134 p
= input_line_pointer
;
3137 if (*input_line_pointer
!= ',')
3139 as_bad ("Expected comma after symbol-name: rest of line ignored.");
3140 ignore_rest_of_line ();
3144 input_line_pointer
++; /* skip ',' */
3145 if ((temp
= get_absolute_expression ()) < 0)
3147 as_warn (".COMMon length (%ld.) <0! Ignored.", (long) temp
);
3148 ignore_rest_of_line ();
3154 /* The third argument to .comm is the alignment. */
3155 if (*input_line_pointer
!= ',')
3159 ++input_line_pointer
;
3160 align
= get_absolute_expression ();
3163 as_warn ("ignoring bad alignment");
3170 symbolP
= symbol_find_or_make (name
);
3173 if (S_IS_DEFINED (symbolP
))
3175 as_bad ("Ignoring attempt to re-define symbol `%s'.",
3176 S_GET_NAME (symbolP
));
3177 ignore_rest_of_line ();
3181 if (S_GET_VALUE (symbolP
))
3183 if (S_GET_VALUE (symbolP
) != (valueT
) temp
)
3184 as_bad ("Length of .comm \"%s\" is already %ld. Not changed to %ld.",
3185 S_GET_NAME (symbolP
),
3186 (long) S_GET_VALUE (symbolP
),
3191 S_SET_VALUE (symbolP
, (valueT
) temp
);
3192 S_SET_EXTERNAL (symbolP
);
3195 demand_empty_rest_of_line ();
3199 * implement the .section pseudo op:
3200 * .section name {, "flags"}
3202 * | +--- optional flags: 'b' for bss
3204 * +-- section name 'l' for lib
3208 * 'd' (apparently m88k for data)
3210 * But if the argument is not a quoted string, treat it as a
3211 * subsegment number.
3213 * FIXME: this is a copy of the section processing from obj-coff.c, with
3214 * additions/changes for the moto-pas assembler support. There are three
3217 * FIXME: I just noticed this. This doesn't work at all really. It it
3218 * setting bits that bfd probably neither understands or uses. The
3219 * correct approach (?) will have to incorporate extra fields attached
3220 * to the section to hold the system specific stuff. (krk)
3223 * 'a' - unknown - referred to in documentation, but no definition supplied
3224 * 'c' - section has code
3225 * 'd' - section has initialized data
3226 * 'u' - section has uninitialized data
3227 * 'i' - section contains directives (info)
3228 * 'n' - section can be discarded
3229 * 'R' - remove section at link time
3231 * Section Protection:
3232 * 'r' - section is readable
3233 * 'w' - section is writeable
3234 * 'x' - section is executable
3235 * 's' - section is sharable
3237 * Section Alignment:
3238 * '0' - align to byte boundary
3239 * '1' - align to halfword undary
3240 * '2' - align to word boundary
3241 * '3' - align to doubleword boundary
3242 * '4' - align to quadword boundary
3243 * '5' - align to 32 byte boundary
3244 * '6' - align to 64 byte boundary
3249 ppc_pe_section (ignore
)
3252 /* Strip out the section name */
3261 section_name
= input_line_pointer
;
3262 c
= get_symbol_end ();
3264 name
= xmalloc (input_line_pointer
- section_name
+ 1);
3265 strcpy (name
, section_name
);
3267 *input_line_pointer
= c
;
3272 flags
= SEC_NO_FLAGS
;
3274 if (strcmp (name
, ".idata$2") == 0)
3278 else if (strcmp (name
, ".idata$3") == 0)
3282 else if (strcmp (name
, ".idata$4") == 0)
3286 else if (strcmp (name
, ".idata$5") == 0)
3290 else if (strcmp (name
, ".idata$6") == 0)
3295 align
= 4; /* default alignment to 16 byte boundary */
3297 if (*input_line_pointer
== ',')
3299 ++input_line_pointer
;
3301 if (*input_line_pointer
!= '"')
3302 exp
= get_absolute_expression ();
3305 ++input_line_pointer
;
3306 while (*input_line_pointer
!= '"'
3307 && ! is_end_of_line
[(unsigned char) *input_line_pointer
])
3309 switch (*input_line_pointer
)
3311 /* Section Contents */
3312 case 'a': /* unknown */
3313 as_warn ("Unsupported section attribute -- 'a'");
3315 case 'c': /* code section */
3318 case 'd': /* section has initialized data */
3321 case 'u': /* section has uninitialized data */
3322 /* FIXME: This is IMAGE_SCN_CNT_UNINITIALIZED_DATA
3326 case 'i': /* section contains directives (info) */
3327 /* FIXME: This is IMAGE_SCN_LNK_INFO
3329 flags
|= SEC_HAS_CONTENTS
;
3331 case 'n': /* section can be discarded */
3334 case 'R': /* Remove section at link time */
3335 flags
|= SEC_NEVER_LOAD
;
3338 /* Section Protection */
3339 case 'r': /* section is readable */
3340 flags
|= IMAGE_SCN_MEM_READ
;
3342 case 'w': /* section is writeable */
3343 flags
|= IMAGE_SCN_MEM_WRITE
;
3345 case 'x': /* section is executable */
3346 flags
|= IMAGE_SCN_MEM_EXECUTE
;
3348 case 's': /* section is sharable */
3349 flags
|= IMAGE_SCN_MEM_SHARED
;
3352 /* Section Alignment */
3353 case '0': /* align to byte boundary */
3354 flags
|= IMAGE_SCN_ALIGN_1BYTES
;
3357 case '1': /* align to halfword boundary */
3358 flags
|= IMAGE_SCN_ALIGN_2BYTES
;
3361 case '2': /* align to word boundary */
3362 flags
|= IMAGE_SCN_ALIGN_4BYTES
;
3365 case '3': /* align to doubleword boundary */
3366 flags
|= IMAGE_SCN_ALIGN_8BYTES
;
3369 case '4': /* align to quadword boundary */
3370 flags
|= IMAGE_SCN_ALIGN_16BYTES
;
3373 case '5': /* align to 32 byte boundary */
3374 flags
|= IMAGE_SCN_ALIGN_32BYTES
;
3377 case '6': /* align to 64 byte boundary */
3378 flags
|= IMAGE_SCN_ALIGN_64BYTES
;
3383 as_warn("unknown section attribute '%c'",
3384 *input_line_pointer
);
3387 ++input_line_pointer
;
3389 if (*input_line_pointer
== '"')
3390 ++input_line_pointer
;
3394 sec
= subseg_new (name
, (subsegT
) exp
);
3396 ppc_set_current_section(sec
);
3398 if (flags
!= SEC_NO_FLAGS
)
3400 if (! bfd_set_section_flags (stdoutput
, sec
, flags
))
3401 as_warn ("error setting flags for \"%s\": %s",
3402 bfd_section_name (stdoutput
, sec
),
3403 bfd_errmsg (bfd_get_error ()));
3406 bfd_set_section_alignment(stdoutput
, sec
, align
);
3411 ppc_pe_function (ignore
)
3418 name
= input_line_pointer
;
3419 endc
= get_symbol_end ();
3421 ext_sym
= symbol_find_or_make (name
);
3423 *input_line_pointer
= endc
;
3425 S_SET_DATA_TYPE (ext_sym
, DT_FCN
<< N_BTSHFT
);
3426 SF_SET_FUNCTION (ext_sym
);
3427 SF_SET_PROCESS (ext_sym
);
3428 coff_add_linesym (ext_sym
);
3430 demand_empty_rest_of_line ();
3434 ppc_pe_tocd (ignore
)
3437 if (tocdata_section
== 0)
3439 tocdata_section
= subseg_new (".tocd", 0);
3440 /* FIXME: section flags won't work */
3441 bfd_set_section_flags (stdoutput
, tocdata_section
,
3442 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
3443 | SEC_READONLY
| SEC_DATA
));
3445 bfd_set_section_alignment (stdoutput
, tocdata_section
, 2);
3449 rdata_section
= subseg_new (".tocd", 0);
3452 ppc_set_current_section(tocdata_section
);
3454 demand_empty_rest_of_line ();
3457 /* Don't adjust TOC relocs to use the section symbol. */
3460 ppc_pe_fix_adjustable (fix
)
3463 return fix
->fx_r_type
!= BFD_RELOC_PPC_TOC16
;
3470 /* XCOFF specific symbol and file handling. */
3472 /* Canonicalize the symbol name. We use the to force the suffix, if
3473 any, to use square brackets, and to be in upper case. */
3476 ppc_canonicalize_symbol_name (name
)
3481 if (ppc_stab_symbol
)
3484 for (s
= name
; *s
!= '\0' && *s
!= '{' && *s
!= '['; s
++)
3498 for (s
++; *s
!= '\0' && *s
!= brac
; s
++)
3502 if (*s
== '\0' || s
[1] != '\0')
3503 as_bad ("bad symbol suffix");
3511 /* Set the class of a symbol based on the suffix, if any. This is
3512 called whenever a new symbol is created. */
3515 ppc_symbol_new_hook (sym
)
3520 sym
->sy_tc
.next
= NULL
;
3521 sym
->sy_tc
.output
= 0;
3522 sym
->sy_tc
.class = -1;
3523 sym
->sy_tc
.real_name
= NULL
;
3524 sym
->sy_tc
.subseg
= 0;
3525 sym
->sy_tc
.align
= 0;
3526 sym
->sy_tc
.size
= NULL
;
3527 sym
->sy_tc
.within
= NULL
;
3529 if (ppc_stab_symbol
)
3532 s
= strchr (S_GET_NAME (sym
), '[');
3533 if (s
== (const char *) NULL
)
3535 /* There is no suffix. */
3544 if (strcmp (s
, "BS]") == 0)
3545 sym
->sy_tc
.class = XMC_BS
;
3548 if (strcmp (s
, "DB]") == 0)
3549 sym
->sy_tc
.class = XMC_DB
;
3550 else if (strcmp (s
, "DS]") == 0)
3551 sym
->sy_tc
.class = XMC_DS
;
3554 if (strcmp (s
, "GL]") == 0)
3555 sym
->sy_tc
.class = XMC_GL
;
3558 if (strcmp (s
, "PR]") == 0)
3559 sym
->sy_tc
.class = XMC_PR
;
3562 if (strcmp (s
, "RO]") == 0)
3563 sym
->sy_tc
.class = XMC_RO
;
3564 else if (strcmp (s
, "RW]") == 0)
3565 sym
->sy_tc
.class = XMC_RW
;
3568 if (strcmp (s
, "SV]") == 0)
3569 sym
->sy_tc
.class = XMC_SV
;
3572 if (strcmp (s
, "TC]") == 0)
3573 sym
->sy_tc
.class = XMC_TC
;
3574 else if (strcmp (s
, "TI]") == 0)
3575 sym
->sy_tc
.class = XMC_TI
;
3576 else if (strcmp (s
, "TB]") == 0)
3577 sym
->sy_tc
.class = XMC_TB
;
3578 else if (strcmp (s
, "TC0]") == 0 || strcmp (s
, "T0]") == 0)
3579 sym
->sy_tc
.class = XMC_TC0
;
3582 if (strcmp (s
, "UA]") == 0)
3583 sym
->sy_tc
.class = XMC_UA
;
3584 else if (strcmp (s
, "UC]") == 0)
3585 sym
->sy_tc
.class = XMC_UC
;
3588 if (strcmp (s
, "XO]") == 0)
3589 sym
->sy_tc
.class = XMC_XO
;
3593 if (sym
->sy_tc
.class == -1)
3594 as_bad ("Unrecognized symbol suffix");
3597 /* Set the class of a label based on where it is defined. This
3598 handles symbols without suffixes. Also, move the symbol so that it
3599 follows the csect symbol. */
3602 ppc_frob_label (sym
)
3605 if (ppc_current_csect
!= (symbolS
*) NULL
)
3607 if (sym
->sy_tc
.class == -1)
3608 sym
->sy_tc
.class = ppc_current_csect
->sy_tc
.class;
3610 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
3611 symbol_append (sym
, ppc_current_csect
->sy_tc
.within
, &symbol_rootP
,
3613 ppc_current_csect
->sy_tc
.within
= sym
;
3617 /* This variable is set by ppc_frob_symbol if any absolute symbols are
3618 seen. It tells ppc_adjust_symtab whether it needs to look through
3621 static boolean ppc_saw_abs
;
3623 /* Change the name of a symbol just before writing it out. Set the
3624 real name if the .rename pseudo-op was used. Otherwise, remove any
3625 class suffix. Return 1 if the symbol should not be included in the
3629 ppc_frob_symbol (sym
)
3632 static symbolS
*ppc_last_function
;
3633 static symbolS
*set_end
;
3635 /* Discard symbols that should not be included in the output symbol
3637 if (! sym
->sy_used_in_reloc
3638 && ((sym
->bsym
->flags
& BSF_SECTION_SYM
) != 0
3639 || (! S_IS_EXTERNAL (sym
)
3640 && ! sym
->sy_tc
.output
3641 && S_GET_STORAGE_CLASS (sym
) != C_FILE
)))
3644 if (sym
->sy_tc
.real_name
!= (char *) NULL
)
3645 S_SET_NAME (sym
, sym
->sy_tc
.real_name
);
3651 name
= S_GET_NAME (sym
);
3652 s
= strchr (name
, '[');
3653 if (s
!= (char *) NULL
)
3659 snew
= xmalloc (len
+ 1);
3660 memcpy (snew
, name
, len
);
3663 S_SET_NAME (sym
, snew
);
3667 if (set_end
!= (symbolS
*) NULL
)
3669 SA_SET_SYM_ENDNDX (set_end
, sym
);
3673 if (SF_GET_FUNCTION (sym
))
3675 if (ppc_last_function
!= (symbolS
*) NULL
)
3676 as_warn ("two .function pseudo-ops with no intervening .ef");
3677 ppc_last_function
= sym
;
3678 if (sym
->sy_tc
.size
!= (symbolS
*) NULL
)
3680 resolve_symbol_value (sym
->sy_tc
.size
);
3681 SA_SET_SYM_FSIZE (sym
, (long) S_GET_VALUE (sym
->sy_tc
.size
));
3684 else if (S_GET_STORAGE_CLASS (sym
) == C_FCN
3685 && strcmp (S_GET_NAME (sym
), ".ef") == 0)
3687 if (ppc_last_function
== (symbolS
*) NULL
)
3688 as_warn (".ef with no preceding .function");
3691 set_end
= ppc_last_function
;
3692 ppc_last_function
= NULL
;
3694 /* We don't have a C_EFCN symbol, but we need to force the
3695 COFF backend to believe that it has seen one. */
3696 coff_last_function
= NULL
;
3700 if (! S_IS_EXTERNAL (sym
)
3701 && (sym
->bsym
->flags
& BSF_SECTION_SYM
) == 0
3702 && S_GET_STORAGE_CLASS (sym
) != C_FILE
3703 && S_GET_STORAGE_CLASS (sym
) != C_FCN
3704 && S_GET_STORAGE_CLASS (sym
) != C_BLOCK
3705 && S_GET_STORAGE_CLASS (sym
) != C_BSTAT
3706 && S_GET_STORAGE_CLASS (sym
) != C_ESTAT
3707 && S_GET_STORAGE_CLASS (sym
) != C_BINCL
3708 && S_GET_STORAGE_CLASS (sym
) != C_EINCL
3709 && S_GET_SEGMENT (sym
) != ppc_coff_debug_section
)
3710 S_SET_STORAGE_CLASS (sym
, C_HIDEXT
);
3712 if (S_GET_STORAGE_CLASS (sym
) == C_EXT
3713 || S_GET_STORAGE_CLASS (sym
) == C_HIDEXT
)
3716 union internal_auxent
*a
;
3718 /* Create a csect aux. */
3719 i
= S_GET_NUMBER_AUXILIARY (sym
);
3720 S_SET_NUMBER_AUXILIARY (sym
, i
+ 1);
3721 a
= &coffsymbol (sym
->bsym
)->native
[i
+ 1].u
.auxent
;
3722 if (sym
->sy_tc
.class == XMC_TC0
)
3724 /* This is the TOC table. */
3725 know (strcmp (S_GET_NAME (sym
), "TOC") == 0);
3726 a
->x_csect
.x_scnlen
.l
= 0;
3727 a
->x_csect
.x_smtyp
= (2 << 3) | XTY_SD
;
3729 else if (sym
->sy_tc
.subseg
!= 0)
3731 /* This is a csect symbol. x_scnlen is the size of the
3733 if (sym
->sy_tc
.next
== (symbolS
*) NULL
)
3734 a
->x_csect
.x_scnlen
.l
= (bfd_section_size (stdoutput
,
3735 S_GET_SEGMENT (sym
))
3736 - S_GET_VALUE (sym
));
3739 resolve_symbol_value (sym
->sy_tc
.next
);
3740 a
->x_csect
.x_scnlen
.l
= (S_GET_VALUE (sym
->sy_tc
.next
)
3741 - S_GET_VALUE (sym
));
3743 a
->x_csect
.x_smtyp
= (sym
->sy_tc
.align
<< 3) | XTY_SD
;
3745 else if (S_GET_SEGMENT (sym
) == bss_section
)
3747 /* This is a common symbol. */
3748 a
->x_csect
.x_scnlen
.l
= sym
->sy_frag
->fr_offset
;
3749 a
->x_csect
.x_smtyp
= (sym
->sy_tc
.align
<< 3) | XTY_CM
;
3750 if (S_IS_EXTERNAL (sym
))
3751 sym
->sy_tc
.class = XMC_RW
;
3753 sym
->sy_tc
.class = XMC_BS
;
3755 else if (S_GET_SEGMENT (sym
) == absolute_section
)
3757 /* This is an absolute symbol. The csect will be created by
3758 ppc_adjust_symtab. */
3760 a
->x_csect
.x_smtyp
= XTY_LD
;
3761 if (sym
->sy_tc
.class == -1)
3762 sym
->sy_tc
.class = XMC_XO
;
3764 else if (! S_IS_DEFINED (sym
))
3766 /* This is an external symbol. */
3767 a
->x_csect
.x_scnlen
.l
= 0;
3768 a
->x_csect
.x_smtyp
= XTY_ER
;
3770 else if (sym
->sy_tc
.class == XMC_TC
)
3774 /* This is a TOC definition. x_scnlen is the size of the
3776 next
= symbol_next (sym
);
3777 while (next
->sy_tc
.class == XMC_TC0
)
3778 next
= symbol_next (next
);
3779 if (next
== (symbolS
*) NULL
3780 || next
->sy_tc
.class != XMC_TC
)
3782 if (ppc_after_toc_frag
== (fragS
*) NULL
)
3783 a
->x_csect
.x_scnlen
.l
= (bfd_section_size (stdoutput
,
3785 - S_GET_VALUE (sym
));
3787 a
->x_csect
.x_scnlen
.l
= (ppc_after_toc_frag
->fr_address
3788 - S_GET_VALUE (sym
));
3792 resolve_symbol_value (next
);
3793 a
->x_csect
.x_scnlen
.l
= (S_GET_VALUE (next
)
3794 - S_GET_VALUE (sym
));
3796 a
->x_csect
.x_smtyp
= (2 << 3) | XTY_SD
;
3802 /* This is a normal symbol definition. x_scnlen is the
3803 symbol index of the containing csect. */
3804 if (S_GET_SEGMENT (sym
) == text_section
)
3805 csect
= ppc_text_csects
;
3806 else if (S_GET_SEGMENT (sym
) == data_section
)
3807 csect
= ppc_data_csects
;
3811 /* Skip the initial dummy symbol. */
3812 csect
= csect
->sy_tc
.next
;
3814 if (csect
== (symbolS
*) NULL
)
3816 as_warn ("warning: symbol %s has no csect", S_GET_NAME (sym
));
3817 a
->x_csect
.x_scnlen
.l
= 0;
3821 while (csect
->sy_tc
.next
!= (symbolS
*) NULL
)
3823 resolve_symbol_value (csect
->sy_tc
.next
);
3824 if (S_GET_VALUE (csect
->sy_tc
.next
) > S_GET_VALUE (sym
))
3826 csect
= csect
->sy_tc
.next
;
3829 a
->x_csect
.x_scnlen
.p
= coffsymbol (csect
->bsym
)->native
;
3830 coffsymbol (sym
->bsym
)->native
[i
+ 1].fix_scnlen
= 1;
3832 a
->x_csect
.x_smtyp
= XTY_LD
;
3835 a
->x_csect
.x_parmhash
= 0;
3836 a
->x_csect
.x_snhash
= 0;
3837 if (sym
->sy_tc
.class == -1)
3838 a
->x_csect
.x_smclas
= XMC_PR
;
3840 a
->x_csect
.x_smclas
= sym
->sy_tc
.class;
3841 a
->x_csect
.x_stab
= 0;
3842 a
->x_csect
.x_snstab
= 0;
3844 /* Don't let the COFF backend resort these symbols. */
3845 sym
->bsym
->flags
|= BSF_NOT_AT_END
;
3847 else if (S_GET_STORAGE_CLASS (sym
) == C_BSTAT
)
3849 /* We want the value to be the symbol index of the referenced
3850 csect symbol. BFD will do that for us if we set the right
3853 (valueT
) coffsymbol (sym
->sy_tc
.within
->bsym
)->native
);
3854 coffsymbol (sym
->bsym
)->native
->fix_value
= 1;
3856 else if (S_GET_STORAGE_CLASS (sym
) == C_STSYM
)
3861 /* The value is the offset from the enclosing csect. */
3862 block
= sym
->sy_tc
.within
;
3863 csect
= block
->sy_tc
.within
;
3864 resolve_symbol_value (csect
);
3865 S_SET_VALUE (sym
, S_GET_VALUE (sym
) - S_GET_VALUE (csect
));
3867 else if (S_GET_STORAGE_CLASS (sym
) == C_BINCL
3868 || S_GET_STORAGE_CLASS (sym
) == C_EINCL
)
3870 /* We want the value to be a file offset into the line numbers.
3871 BFD will do that for us if we set the right flags. We have
3872 already set the value correctly. */
3873 coffsymbol (sym
->bsym
)->native
->fix_line
= 1;
3879 /* Adjust the symbol table. This creates csect symbols for all
3880 absolute symbols. */
3883 ppc_adjust_symtab ()
3890 for (sym
= symbol_rootP
; sym
!= NULL
; sym
= symbol_next (sym
))
3894 union internal_auxent
*a
;
3896 if (S_GET_SEGMENT (sym
) != absolute_section
)
3899 csect
= symbol_create (".abs[XO]", absolute_section
,
3900 S_GET_VALUE (sym
), &zero_address_frag
);
3901 csect
->bsym
->value
= S_GET_VALUE (sym
);
3902 S_SET_STORAGE_CLASS (csect
, C_HIDEXT
);
3903 i
= S_GET_NUMBER_AUXILIARY (csect
);
3904 S_SET_NUMBER_AUXILIARY (csect
, i
+ 1);
3905 a
= &coffsymbol (csect
->bsym
)->native
[i
+ 1].u
.auxent
;
3906 a
->x_csect
.x_scnlen
.l
= 0;
3907 a
->x_csect
.x_smtyp
= XTY_SD
;
3908 a
->x_csect
.x_parmhash
= 0;
3909 a
->x_csect
.x_snhash
= 0;
3910 a
->x_csect
.x_smclas
= XMC_XO
;
3911 a
->x_csect
.x_stab
= 0;
3912 a
->x_csect
.x_snstab
= 0;
3914 symbol_insert (csect
, sym
, &symbol_rootP
, &symbol_lastP
);
3916 i
= S_GET_NUMBER_AUXILIARY (sym
);
3917 a
= &coffsymbol (sym
->bsym
)->native
[i
].u
.auxent
;
3918 a
->x_csect
.x_scnlen
.p
= coffsymbol (csect
->bsym
)->native
;
3919 coffsymbol (sym
->bsym
)->native
[i
].fix_scnlen
= 1;
3922 ppc_saw_abs
= false;
3925 /* Set the VMA for a section. This is called on all the sections in
3929 ppc_frob_section (sec
)
3932 static bfd_size_type vma
= 0;
3934 bfd_set_section_vma (stdoutput
, sec
, vma
);
3935 vma
+= bfd_section_size (stdoutput
, sec
);
3938 #endif /* OBJ_XCOFF */
3940 /* Turn a string in input_line_pointer into a floating point constant
3941 of type type, and store the appropriate bytes in *litp. The number
3942 of LITTLENUMS emitted is stored in *sizep . An error message is
3943 returned, or NULL on OK. */
3946 md_atof (type
, litp
, sizep
)
3952 LITTLENUM_TYPE words
[4];
3968 return "bad call to md_atof";
3971 t
= atof_ieee (input_line_pointer
, type
, words
);
3973 input_line_pointer
= t
;
3977 if (target_big_endian
)
3979 for (i
= 0; i
< prec
; i
++)
3981 md_number_to_chars (litp
, (valueT
) words
[i
], 2);
3987 for (i
= prec
- 1; i
>= 0; i
--)
3989 md_number_to_chars (litp
, (valueT
) words
[i
], 2);
3997 /* Write a value out to the object file, using the appropriate
4001 md_number_to_chars (buf
, val
, n
)
4006 if (target_big_endian
)
4007 number_to_chars_bigendian (buf
, val
, n
);
4009 number_to_chars_littleendian (buf
, val
, n
);
4012 /* Align a section (I don't know why this is machine dependent). */
4015 md_section_align (seg
, addr
)
4019 int align
= bfd_get_section_alignment (stdoutput
, seg
);
4021 return ((addr
+ (1 << align
) - 1) & (-1 << align
));
4024 /* We don't have any form of relaxing. */
4027 md_estimate_size_before_relax (fragp
, seg
)
4035 /* Convert a machine dependent frag. We never generate these. */
4038 md_convert_frag (abfd
, sec
, fragp
)
4046 /* We have no need to default values of symbols. */
4050 md_undefined_symbol (name
)
4056 /* Functions concerning relocs. */
4058 /* The location from which a PC relative jump should be calculated,
4059 given a PC relative reloc. */
4062 md_pcrel_from_section (fixp
, sec
)
4067 if (fixp
->fx_addsy
!= (symbolS
*) NULL
4068 && (! S_IS_DEFINED (fixp
->fx_addsy
)
4069 || TC_FORCE_RELOCATION_SECTION (fixp
, sec
)))
4073 return fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
4078 /* This is called to see whether a fixup should be adjusted to use a
4079 section symbol. We take the opportunity to change a fixup against
4080 a symbol in the TOC subsegment into a reloc against the
4081 corresponding .tc symbol. */
4084 ppc_fix_adjustable (fix
)
4089 resolve_symbol_value (fix
->fx_addsy
);
4090 val
= S_GET_VALUE (fix
->fx_addsy
);
4091 if (ppc_toc_csect
!= (symbolS
*) NULL
4092 && fix
->fx_addsy
!= (symbolS
*) NULL
4093 && fix
->fx_addsy
!= ppc_toc_csect
4094 && S_GET_SEGMENT (fix
->fx_addsy
) == data_section
4095 && val
>= ppc_toc_frag
->fr_address
4096 && (ppc_after_toc_frag
== (fragS
*) NULL
4097 || val
< ppc_after_toc_frag
->fr_address
))
4101 for (sy
= symbol_next (ppc_toc_csect
);
4102 sy
!= (symbolS
*) NULL
;
4103 sy
= symbol_next (sy
))
4105 if (sy
->sy_tc
.class == XMC_TC0
)
4107 if (sy
->sy_tc
.class != XMC_TC
)
4109 resolve_symbol_value (sy
);
4110 if (val
== S_GET_VALUE (sy
))
4113 fix
->fx_addnumber
= val
- ppc_toc_frag
->fr_address
;
4118 as_bad_where (fix
->fx_file
, fix
->fx_line
,
4119 "symbol in .toc does not match any .tc");
4122 /* Possibly adjust the reloc to be against the csect. */
4123 if (fix
->fx_addsy
!= (symbolS
*) NULL
4124 && fix
->fx_addsy
->sy_tc
.subseg
== 0
4125 && fix
->fx_addsy
->sy_tc
.class != XMC_TC0
4126 && fix
->fx_addsy
->sy_tc
.class != XMC_TC
4127 && S_GET_SEGMENT (fix
->fx_addsy
) != bss_section
)
4131 if (S_GET_SEGMENT (fix
->fx_addsy
) == text_section
)
4132 csect
= ppc_text_csects
;
4133 else if (S_GET_SEGMENT (fix
->fx_addsy
) == data_section
)
4134 csect
= ppc_data_csects
;
4138 /* Skip the initial dummy symbol. */
4139 csect
= csect
->sy_tc
.next
;
4141 if (csect
!= (symbolS
*) NULL
)
4143 while (csect
->sy_tc
.next
!= (symbolS
*) NULL
4144 && (csect
->sy_tc
.next
->sy_frag
->fr_address
4145 <= fix
->fx_addsy
->sy_frag
->fr_address
))
4146 csect
= csect
->sy_tc
.next
;
4148 fix
->fx_offset
+= (S_GET_VALUE (fix
->fx_addsy
)
4149 - csect
->sy_frag
->fr_address
);
4150 fix
->fx_addsy
= csect
;
4154 /* Adjust a reloc against a .lcomm symbol to be against the base
4156 if (fix
->fx_addsy
!= (symbolS
*) NULL
4157 && S_GET_SEGMENT (fix
->fx_addsy
) == bss_section
4158 && ! S_IS_EXTERNAL (fix
->fx_addsy
))
4160 resolve_symbol_value (fix
->fx_addsy
->sy_frag
->fr_symbol
);
4161 fix
->fx_offset
+= (S_GET_VALUE (fix
->fx_addsy
)
4162 - S_GET_VALUE (fix
->fx_addsy
->sy_frag
->fr_symbol
));
4163 fix
->fx_addsy
= fix
->fx_addsy
->sy_frag
->fr_symbol
;
4171 /* See whether a symbol is in the TOC section. */
4174 ppc_is_toc_sym (sym
)
4178 return sym
->sy_tc
.class == XMC_TC
;
4180 return strcmp (segment_name (S_GET_SEGMENT (sym
)), ".got") == 0;
4184 /* Apply a fixup to the object code. This is called for all the
4185 fixups we generated by the call to fix_new_exp, above. In the call
4186 above we used a reloc code which was the largest legal reloc code
4187 plus the operand index. Here we undo that to recover the operand
4188 index. At this point all symbol values should be fully resolved,
4189 and we attempt to completely resolve the reloc. If we can not do
4190 that, we determine the correct reloc code and put it back in the
4194 md_apply_fix3 (fixp
, valuep
, seg
)
4201 /* FIXME FIXME FIXME: The value we are passed in *valuep includes
4202 the symbol values. Since we are using BFD_ASSEMBLER, if we are
4203 doing this relocation the code in write.c is going to call
4204 bfd_perform_relocation, which is also going to use the symbol
4205 value. That means that if the reloc is fully resolved we want to
4206 use *valuep since bfd_perform_relocation is not being used.
4207 However, if the reloc is not fully resolved we do not want to use
4208 *valuep, and must use fx_offset instead. However, if the reloc
4209 is PC relative, we do want to use *valuep since it includes the
4210 result of md_pcrel_from. This is confusing. */
4212 if (fixp
->fx_addsy
== (symbolS
*) NULL
)
4217 else if (fixp
->fx_pcrel
)
4221 value
= fixp
->fx_offset
;
4222 if (fixp
->fx_subsy
!= (symbolS
*) NULL
)
4224 if (S_GET_SEGMENT (fixp
->fx_subsy
) == absolute_section
)
4225 value
-= S_GET_VALUE (fixp
->fx_subsy
);
4228 /* We can't actually support subtracting a symbol. */
4229 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
4230 "expression too complex");
4235 if ((int) fixp
->fx_r_type
>= (int) BFD_RELOC_UNUSED
)
4238 const struct powerpc_operand
*operand
;
4242 opindex
= (int) fixp
->fx_r_type
- (int) BFD_RELOC_UNUSED
;
4244 operand
= &powerpc_operands
[opindex
];
4247 /* It appears that an instruction like
4249 when LC..1 is not a TOC symbol does not generate a reloc. It
4250 uses the offset of LC..1 within its csect. However, .long
4251 LC..1 will generate a reloc. I can't find any documentation
4252 on how these cases are to be distinguished, so this is a wild
4253 guess. These cases are generated by gcc -mminimal-toc. */
4254 if ((operand
->flags
& PPC_OPERAND_PARENS
) != 0
4255 && operand
->bits
== 16
4256 && operand
->shift
== 0
4257 && operand
->insert
== NULL
4258 && fixp
->fx_addsy
!= NULL
4259 && fixp
->fx_addsy
->sy_tc
.subseg
!= 0
4260 && fixp
->fx_addsy
->sy_tc
.class != XMC_TC
4261 && fixp
->fx_addsy
->sy_tc
.class != XMC_TC0
4262 && S_GET_SEGMENT (fixp
->fx_addsy
) != bss_section
)
4264 value
= fixp
->fx_offset
;
4269 /* Fetch the instruction, insert the fully resolved operand
4270 value, and stuff the instruction back again. */
4271 where
= fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
;
4272 if (target_big_endian
)
4273 insn
= bfd_getb32 ((unsigned char *) where
);
4275 insn
= bfd_getl32 ((unsigned char *) where
);
4276 insn
= ppc_insert_operand (insn
, operand
, (offsetT
) value
,
4277 fixp
->fx_file
, fixp
->fx_line
);
4278 if (target_big_endian
)
4279 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
4281 bfd_putl32 ((bfd_vma
) insn
, (unsigned char *) where
);
4285 /* Nothing else to do here. */
4289 /* Determine a BFD reloc value based on the operand information.
4290 We are only prepared to turn a few of the operands into
4292 FIXME: We need to handle the DS field at the very least.
4293 FIXME: Selecting the reloc type is a bit haphazard; perhaps
4294 there should be a new field in the operand table. */
4295 if ((operand
->flags
& PPC_OPERAND_RELATIVE
) != 0
4296 && operand
->bits
== 26
4297 && operand
->shift
== 0)
4298 fixp
->fx_r_type
= BFD_RELOC_PPC_B26
;
4299 else if ((operand
->flags
& PPC_OPERAND_RELATIVE
) != 0
4300 && operand
->bits
== 16
4301 && operand
->shift
== 0)
4302 fixp
->fx_r_type
= BFD_RELOC_PPC_B16
;
4303 else if ((operand
->flags
& PPC_OPERAND_ABSOLUTE
) != 0
4304 && operand
->bits
== 26
4305 && operand
->shift
== 0)
4306 fixp
->fx_r_type
= BFD_RELOC_PPC_BA26
;
4307 else if ((operand
->flags
& PPC_OPERAND_ABSOLUTE
) != 0
4308 && operand
->bits
== 16
4309 && operand
->shift
== 0)
4310 fixp
->fx_r_type
= BFD_RELOC_PPC_BA16
;
4311 else if ((operand
->flags
& PPC_OPERAND_PARENS
) != 0
4312 && operand
->bits
== 16
4313 && operand
->shift
== 0
4314 && operand
->insert
== NULL
4315 && fixp
->fx_addsy
!= NULL
4316 && ppc_is_toc_sym (fixp
->fx_addsy
))
4319 if (target_big_endian
)
4320 fixp
->fx_where
+= 2;
4321 fixp
->fx_r_type
= BFD_RELOC_PPC_TOC16
;
4325 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
4326 "unresolved expression that must be resolved");
4334 ppc_elf_validate_fix (fixp
, seg
);
4336 switch (fixp
->fx_r_type
)
4339 case BFD_RELOC_CTOR
:
4341 fixp
->fx_r_type
= BFD_RELOC_32_PCREL
;
4345 case BFD_RELOC_32_PCREL
:
4346 case BFD_RELOC_32_BASEREL
:
4347 case BFD_RELOC_PPC_EMB_NADDR32
:
4348 md_number_to_chars (fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
,
4352 case BFD_RELOC_LO16
:
4353 case BFD_RELOC_HI16
:
4354 case BFD_RELOC_HI16_S
:
4356 case BFD_RELOC_GPREL16
:
4357 case BFD_RELOC_16_GOT_PCREL
:
4358 case BFD_RELOC_16_GOTOFF
:
4359 case BFD_RELOC_LO16_GOTOFF
:
4360 case BFD_RELOC_HI16_GOTOFF
:
4361 case BFD_RELOC_HI16_S_GOTOFF
:
4362 case BFD_RELOC_LO16_BASEREL
:
4363 case BFD_RELOC_HI16_BASEREL
:
4364 case BFD_RELOC_HI16_S_BASEREL
:
4365 case BFD_RELOC_PPC_EMB_NADDR16
:
4366 case BFD_RELOC_PPC_EMB_NADDR16_LO
:
4367 case BFD_RELOC_PPC_EMB_NADDR16_HI
:
4368 case BFD_RELOC_PPC_EMB_NADDR16_HA
:
4369 case BFD_RELOC_PPC_EMB_SDAI16
:
4370 case BFD_RELOC_PPC_EMB_SDA2REL
:
4371 case BFD_RELOC_PPC_EMB_SDA2I16
:
4372 case BFD_RELOC_PPC_EMB_RELSEC16
:
4373 case BFD_RELOC_PPC_EMB_RELST_LO
:
4374 case BFD_RELOC_PPC_EMB_RELST_HI
:
4375 case BFD_RELOC_PPC_EMB_RELST_HA
:
4376 case BFD_RELOC_PPC_EMB_RELSDA
:
4377 case BFD_RELOC_PPC_TOC16
:
4381 md_number_to_chars (fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
,
4385 /* Because SDA21 modifies the register field, the size is set to 4
4386 bytes, rather than 2, so offset it here appropriately */
4387 case BFD_RELOC_PPC_EMB_SDA21
:
4391 md_number_to_chars (fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
4392 + ((target_big_endian
) ? 2 : 0),
4400 md_number_to_chars (fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
,
4406 "Gas failure, reloc value %d\n", fixp
->fx_r_type
);
4413 fixp
->fx_addnumber
= value
;
4415 if (fixp
->fx_r_type
!= BFD_RELOC_PPC_TOC16
)
4416 fixp
->fx_addnumber
= 0;
4420 fixp
->fx_addnumber
= 0;
4422 /* We want to use the offset within the data segment of the
4423 symbol, not the actual VMA of the symbol. */
4424 fixp
->fx_addnumber
=
4425 - bfd_get_section_vma (stdoutput
, S_GET_SEGMENT (fixp
->fx_addsy
));
4433 /* Generate a reloc for a fixup. */
4436 tc_gen_reloc (seg
, fixp
)
4442 reloc
= (arelent
*) bfd_alloc_by_size_t (stdoutput
, sizeof (arelent
));
4444 reloc
->sym_ptr_ptr
= &fixp
->fx_addsy
->bsym
;
4445 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
4446 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
4447 if (reloc
->howto
== (reloc_howto_type
*) NULL
)
4449 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
4450 "reloc %d not supported by object file format", (int)fixp
->fx_r_type
);
4453 reloc
->addend
= fixp
->fx_addnumber
;