1 /* tc-ppc.c -- Assemble for the PowerPC or POWER (RS/6000)
2 Copyright (C) 1994 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 static void ppc_set_cpu
PARAMS ((void));
45 static unsigned long ppc_insert_operand
46 PARAMS ((unsigned long insn
, const struct powerpc_operand
*operand
,
47 offsetT val
, char *file
, unsigned int line
));
48 static void ppc_macro
PARAMS ((char *str
, const struct powerpc_macro
*macro
));
49 static void ppc_byte
PARAMS ((int));
50 static int ppc_is_toc_sym
PARAMS ((symbolS
*sym
));
51 static void ppc_tc
PARAMS ((int));
54 static void ppc_comm
PARAMS ((int));
55 static void ppc_bb
PARAMS ((int));
56 static void ppc_bc
PARAMS ((int));
57 static void ppc_bf
PARAMS ((int));
58 static void ppc_biei
PARAMS ((int));
59 static void ppc_bs
PARAMS ((int));
60 static void ppc_eb
PARAMS ((int));
61 static void ppc_ec
PARAMS ((int));
62 static void ppc_ef
PARAMS ((int));
63 static void ppc_es
PARAMS ((int));
64 static void ppc_csect
PARAMS ((int));
65 static void ppc_change_csect
PARAMS ((symbolS
*));
66 static void ppc_function
PARAMS ((int));
67 static void ppc_extern
PARAMS ((int));
68 static void ppc_lglobl
PARAMS ((int));
69 static void ppc_section
PARAMS ((int));
70 static void ppc_stabx
PARAMS ((int));
71 static void ppc_rename
PARAMS ((int));
72 static void ppc_toc
PARAMS ((int));
76 static bfd_reloc_code_real_type ppc_elf_suffix
PARAMS ((char **));
77 static void ppc_elf_cons
PARAMS ((int));
78 static void ppc_elf_validate_fix
PARAMS ((fixS
*, segT
));
82 static void ppc_set_current_section
PARAMS ((segT
));
83 static void ppc_previous
PARAMS ((int));
84 static void ppc_pdata
PARAMS ((int));
85 static void ppc_ydata
PARAMS ((int));
86 static void ppc_reldata
PARAMS ((int));
87 static void ppc_rdata
PARAMS ((int));
88 static void ppc_ualong
PARAMS ((int));
89 static void ppc_znop
PARAMS ((int));
90 static void ppc_pe_comm
PARAMS ((int));
91 static void ppc_pe_section
PARAMS ((int));
92 static void ppc_pe_function
PARAMS ((int));
93 static void ppc_pe_tocd
PARAMS ((int));
96 /* Generic assembler global variables which must be defined by all
99 /* Characters which always start a comment. */
100 const char comment_chars
[] = "#";
102 /* Characters which start a comment at the beginning of a line. */
103 const char line_comment_chars
[] = "#";
105 /* Characters which may be used to separate multiple commands on a
107 const char line_separator_chars
[] = ";";
109 /* Characters which are used to indicate an exponent in a floating
111 const char EXP_CHARS
[] = "eE";
113 /* Characters which mean that a number is a floating point constant,
115 const char FLT_CHARS
[] = "dD";
117 /* The target specific pseudo-ops which we support. */
119 const pseudo_typeS md_pseudo_table
[] =
121 /* Pseudo-ops which must be overridden. */
122 { "byte", ppc_byte
, 0 },
125 /* Pseudo-ops specific to the RS/6000 XCOFF format. Some of these
126 legitimately belong in the obj-*.c file. However, XCOFF is based
127 on COFF, and is only implemented for the RS/6000. We just use
128 obj-coff.c, and add what we need here. */
129 { "comm", ppc_comm
, 0 },
130 { "lcomm", ppc_comm
, 1 },
134 { "bi", ppc_biei
, 0 },
136 { "csect", ppc_csect
, 0 },
137 { "data", ppc_section
, 'd' },
141 { "ei", ppc_biei
, 1 },
143 { "extern", ppc_extern
, 0 },
144 { "function", ppc_function
, 0 },
145 { "lglobl", ppc_lglobl
, 0 },
146 { "rename", ppc_rename
, 0 },
147 { "stabx", ppc_stabx
, 0 },
148 { "text", ppc_section
, 't' },
149 { "toc", ppc_toc
, 0 },
153 { "long", ppc_elf_cons
, 4 },
154 { "word", ppc_elf_cons
, 2 },
155 { "short", ppc_elf_cons
, 2 },
159 /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format */
160 { "previous", ppc_previous
, 0 },
161 { "pdata", ppc_pdata
, 0 },
162 { "ydata", ppc_ydata
, 0 },
163 { "reldata", ppc_reldata
, 0 },
164 { "rdata", ppc_rdata
, 0 },
165 { "ualong", ppc_ualong
, 0 },
166 { "znop", ppc_znop
, 0 },
167 { "comm", ppc_pe_comm
, 0 },
168 { "lcomm", ppc_pe_comm
, 1 },
169 { "section", ppc_pe_section
, 0 },
170 { "function", ppc_pe_function
,0 },
171 { "tocd", ppc_pe_tocd
, 0 },
174 /* This pseudo-op is used even when not generating XCOFF output. */
182 /* The Windows NT PowerPC assembler uses predefined names. */
184 /* In general, there are lots of them, in an attempt to be compatible */
185 /* with a number of other Windows NT assemblers. */
187 /* Structure to hold information about predefined registers. */
194 /* List of registers that are pre-defined:
196 Each general register has predefined names of the form:
197 1. r<reg_num> which has the value <reg_num>.
198 2. r.<reg_num> which has the value <reg_num>.
201 Each floating point register has predefined names of the form:
202 1. f<reg_num> which has the value <reg_num>.
203 2. f.<reg_num> which has the value <reg_num>.
205 Each condition register has predefined names of the form:
206 1. cr<reg_num> which has the value <reg_num>.
207 2. cr.<reg_num> which has the value <reg_num>.
209 There are individual registers as well:
210 sp or r.sp has the value 1
211 rtoc or r.toc has the value 2
212 fpscr has the value 0
218 dsisr has the value 18
220 sdr1 has the value 25
221 srr0 has the value 26
222 srr1 has the value 27
224 The table is sorted. Suitable for searching by a binary search. */
226 static const struct pd_reg pre_defined_registers
[] =
228 { "cr.0", 0 }, /* Condition Registers */
248 { "dar", 19 }, /* Data Access Register */
249 { "dec", 22 }, /* Decrementer */
250 { "dsisr", 18 }, /* Data Storage Interrupt Status Register */
252 { "f.0", 0 }, /* Floating point registers */
320 { "lr", 8 }, /* Link Register */
324 { "r.0", 0 }, /* General Purpose Registers */
357 { "r.sp", 1 }, /* Stack Pointer */
359 { "r.toc", 2 }, /* Pointer to the table of contents */
361 { "r0", 0 }, /* More general purpose registers */
394 { "rtoc", 2 }, /* Table of contents */
396 { "sdr1", 25 }, /* Storage Description Register 1 */
400 { "srr0", 26 }, /* Machine Status Save/Restore Register 0 */
401 { "srr1", 27 }, /* Machine Status Save/Restore Register 1 */
407 #define REG_NAME_CNT (sizeof(pre_defined_registers) / sizeof(struct pd_reg))
409 /* Given NAME, find the register number associated with that name, return
410 the integer value associated with the given name or -1 on failure. */
412 static int reg_name_search
PARAMS ( (char * name
) );
415 reg_name_search (name
)
418 int middle
, low
, high
;
422 high
= REG_NAME_CNT
- 1;
426 middle
= (low
+ high
) / 2;
427 cmp
= strcasecmp (name
, pre_defined_registers
[middle
].name
);
433 return pre_defined_registers
[middle
].value
;
443 /* Local variables. */
445 /* The type of processor we are assembling for. This is one or more
446 of the PPC_OPCODE flags defined in opcode/ppc.h. */
447 static int ppc_cpu
= 0;
449 /* The size of the processor we are assembling for. This is either
450 PPC_OPCODE_32 or PPC_OPCODE_64. */
451 static int ppc_size
= PPC_OPCODE_32
;
453 /* Opcode hash table. */
454 static struct hash_control
*ppc_hash
;
456 /* Macro hash table. */
457 static struct hash_control
*ppc_macro_hash
;
460 /* Whether to warn about non PC relative relocations that aren't
461 in the .got2 section. */
462 static boolean mrelocatable
= false;
464 /* Flags to set in the elf header */
465 static flagword ppc_flags
= 0;
470 /* The RS/6000 assembler uses the .csect pseudo-op to generate code
471 using a bunch of different sections. These assembler sections,
472 however, are all encompassed within the .text or .data sections of
473 the final output file. We handle this by using different
474 subsegments within these main segments. */
476 /* Next subsegment to allocate within the .text segment. */
477 static subsegT ppc_text_subsegment
= 2;
479 /* Linked list of csects in the text section. */
480 static symbolS
*ppc_text_csects
;
482 /* Next subsegment to allocate within the .data segment. */
483 static subsegT ppc_data_subsegment
= 2;
485 /* Linked list of csects in the data section. */
486 static symbolS
*ppc_data_csects
;
488 /* The current csect. */
489 static symbolS
*ppc_current_csect
;
491 /* The RS/6000 assembler uses a TOC which holds addresses of functions
492 and variables. Symbols are put in the TOC with the .tc pseudo-op.
493 A special relocation is used when accessing TOC entries. We handle
494 the TOC as a subsegment within the .data segment. We set it up if
495 we see a .toc pseudo-op, and save the csect symbol here. */
496 static symbolS
*ppc_toc_csect
;
498 /* The first frag in the TOC subsegment. */
499 static fragS
*ppc_toc_frag
;
501 /* The first frag in the first subsegment after the TOC in the .data
502 segment. NULL if there are no subsegments after the TOC. */
503 static fragS
*ppc_after_toc_frag
;
505 /* The current static block. */
506 static symbolS
*ppc_current_block
;
508 /* The COFF debugging section; set by md_begin. This is not the
509 .debug section, but is instead the secret BFD section which will
510 cause BFD to set the section number of a symbol to N_DEBUG. */
511 static asection
*ppc_coff_debug_section
;
513 #endif /* OBJ_XCOFF */
517 /* Various sections that we need for PE coff support. */
518 static segT ydata_section
;
519 static segT pdata_section
;
520 static segT reldata_section
;
521 static segT rdata_section
;
522 static segT tocdata_section
;
524 /* The current section and the previous section. See ppc_previous. */
525 static segT ppc_previous_section
;
526 static segT ppc_current_section
;
531 symbolS
*GOT_symbol
; /* Pre-defined "_GLOBAL_OFFSET_TABLE" */
534 #ifndef WORKING_DOT_WORD
535 const int md_short_jump_size
= 4;
536 const int md_long_jump_size
= 4;
540 CONST
char *md_shortopts
= "um:VQ:";
542 CONST
char *md_shortopts
= "um:";
544 struct option md_longopts
[] = {
545 {NULL
, no_argument
, NULL
, 0}
547 size_t md_longopts_size
= sizeof(md_longopts
);
550 md_parse_option (c
, arg
)
557 /* -u means that any undefined symbols should be treated as
558 external, which is the default for gas anyhow. */
562 /* -mpwrx and -mpwr2 mean to assemble for the IBM POWER/2
564 if (strcmp (arg
, "pwrx") == 0 || strcmp (arg
, "pwr2") == 0)
565 ppc_cpu
= PPC_OPCODE_POWER
| PPC_OPCODE_POWER2
;
566 /* -mpwr means to assemble for the IBM POWER (RIOS1). */
567 else if (strcmp (arg
, "pwr") == 0)
568 ppc_cpu
= PPC_OPCODE_POWER
;
569 /* -m601 means to assemble for the Motorola PowerPC 601, which includes
570 instructions that are holdovers from the Power. */
571 else if (strcmp (arg
, "601") == 0)
572 ppc_cpu
= PPC_OPCODE_PPC
| PPC_OPCODE_601
;
573 /* -mppc, -mppc32, -m603, and -m604 mean to assemble for the
574 Motorola PowerPC 603/604. */
575 else if (strcmp (arg
, "ppc") == 0
576 || strcmp (arg
, "ppc32") == 0
577 || strcmp (arg
, "403") == 0
578 || strcmp (arg
, "603") == 0
579 || strcmp (arg
, "604") == 0)
580 ppc_cpu
= PPC_OPCODE_PPC
;
581 /* -mppc64 and -m620 mean to assemble for the 64-bit PowerPC
583 else if (strcmp (arg
, "ppc64") == 0 || strcmp (arg
, "620") == 0)
585 ppc_cpu
= PPC_OPCODE_PPC
;
586 ppc_size
= PPC_OPCODE_64
;
588 /* -mcom means assemble for the common intersection between Power
589 and PowerPC. At present, we just allow the union, rather
590 than the intersection. */
591 else if (strcmp (arg
, "com") == 0)
592 ppc_cpu
= PPC_OPCODE_COMMON
;
593 /* -many means to assemble for any architecture (PWR/PWRX/PPC). */
594 else if (strcmp (arg
, "any") == 0)
595 ppc_cpu
= PPC_OPCODE_ANY
;
598 /* -mrelocatable/-mrelocatable-lib -- warn about initializations that require relocation */
599 else if (strcmp (arg
, "relocatable") == 0)
602 ppc_flags
|= EF_PPC_RELOCATABLE
;
605 else if (strcmp (arg
, "relocatable-lib") == 0)
608 ppc_flags
|= EF_PPC_RELOCATABLE_LIB
;
611 /* -memb, set embedded bit */
612 else if (strcmp (arg
, "emb") == 0)
613 ppc_flags
|= EF_PPC_EMB
;
615 /* -mlittle/-mbig set the endianess */
616 else if (strcmp (arg
, "little") == 0 || strcmp (arg
, "little-endian") == 0)
618 target_big_endian
= 0;
619 set_target_endian
= 1;
622 else if (strcmp (arg
, "big") == 0 || strcmp (arg
, "big-endian") == 0)
624 target_big_endian
= 1;
625 set_target_endian
= 1;
630 as_bad ("invalid switch -m%s", arg
);
636 /* -V: SVR4 argument to print version ID. */
641 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
642 should be emitted or not. FIXME: Not implemented. */
655 md_show_usage (stream
)
661 -mpwrx, -mpwr2 generate code for IBM POWER/2 (RIOS2)\n\
662 -mpwr generate code for IBM POWER (RIOS1)\n\
663 -m601 generate code for Motorola PowerPC 601\n\
664 -mppc, -mppc32, -m403, -m603, -m604\n\
665 generate code for Motorola PowerPC 603/604\n\
666 -mppc64, -m620 generate code for Motorola PowerPC 620\n\
667 -mcom generate code Power/PowerPC common instructions\n\
668 -many generate code for any architecture (PWR/PWRX/PPC)\n");
671 -mrelocatable support for GCC's -mrelocatble option\n\
672 -mrelocatable-lib support for GCC's -mrelocatble-lib option\n\
673 -memb set PPC_EMB bit in ELF flags\n\
674 -mlittle, -mlittle-endian\n\
675 generate code for a little endian machine\n\
676 -mbig, -mbig-endian generate code for a big endian machine\n\
677 -V print assembler version number\n\
678 -Qy, -Qn ignored\n");
682 /* Set ppc_cpu if it is not already set. */
687 const char *default_cpu
= TARGET_CPU
;
691 if (strcmp (default_cpu
, "rs6000") == 0)
692 ppc_cpu
= PPC_OPCODE_POWER
;
693 else if (strcmp (default_cpu
, "powerpc") == 0
694 || strcmp (default_cpu
, "powerpcle") == 0)
695 ppc_cpu
= PPC_OPCODE_PPC
;
697 as_fatal ("Unknown default cpu = %s", default_cpu
);
701 /* Figure out the BFD architecture to use. */
703 enum bfd_architecture
706 const char *default_cpu
= TARGET_CPU
;
709 if ((ppc_cpu
& PPC_OPCODE_PPC
) != 0)
710 return bfd_arch_powerpc
;
711 else if ((ppc_cpu
& PPC_OPCODE_POWER
) != 0)
712 return bfd_arch_rs6000
;
713 else if ((ppc_cpu
& (PPC_OPCODE_COMMON
| PPC_OPCODE_ANY
)) != 0)
715 if (strcmp (default_cpu
, "rs6000") == 0)
716 return bfd_arch_rs6000
;
717 else if (strcmp (default_cpu
, "powerpc") == 0
718 || strcmp (default_cpu
, "powerpcle") == 0)
719 return bfd_arch_powerpc
;
722 as_fatal ("Neither Power nor PowerPC opcodes were selected.");
723 return bfd_arch_unknown
;
726 /* This function is called when the assembler starts up. It is called
727 after the options have been parsed and the output file has been
733 register const struct powerpc_opcode
*op
;
734 const struct powerpc_opcode
*op_end
;
735 const struct powerpc_macro
*macro
;
736 const struct powerpc_macro
*macro_end
;
737 boolean dup_insn
= false;
742 /* Set the ELF flags if desired. */
744 bfd_set_private_flags (stdoutput
, ppc_flags
);
747 /* Insert the opcodes into a hash table. */
748 ppc_hash
= hash_new ();
750 op_end
= powerpc_opcodes
+ powerpc_num_opcodes
;
751 for (op
= powerpc_opcodes
; op
< op_end
; op
++)
753 know ((op
->opcode
& op
->mask
) == op
->opcode
);
755 if ((op
->flags
& ppc_cpu
) != 0
756 && ((op
->flags
& (PPC_OPCODE_32
| PPC_OPCODE_64
)) == 0
757 || (op
->flags
& (PPC_OPCODE_32
| PPC_OPCODE_64
)) == ppc_size
))
761 retval
= hash_insert (ppc_hash
, op
->name
, (PTR
) op
);
762 if (retval
!= (const char *) NULL
)
764 /* Ignore Power duplicates for -m601 */
765 if ((ppc_cpu
& PPC_OPCODE_601
) != 0
766 && (op
->flags
& PPC_OPCODE_POWER
) != 0)
769 as_bad ("Internal assembler error for instruction %s", op
->name
);
775 /* Insert the macros into a hash table. */
776 ppc_macro_hash
= hash_new ();
778 macro_end
= powerpc_macros
+ powerpc_num_macros
;
779 for (macro
= powerpc_macros
; macro
< macro_end
; macro
++)
781 if ((macro
->flags
& ppc_cpu
) != 0)
785 retval
= hash_insert (ppc_macro_hash
, macro
->name
, (PTR
) macro
);
786 if (retval
!= (const char *) NULL
)
788 as_bad ("Internal assembler error for macro %s", macro
->name
);
797 /* Tell the main code what the endianness is if it is not overidden by the user. */
798 if (!set_target_endian
)
800 set_target_endian
= 1;
801 target_big_endian
= PPC_BIG_ENDIAN
;
805 ppc_coff_debug_section
= coff_section_from_bfd_index (stdoutput
, N_DEBUG
);
807 /* Create dummy symbols to serve as initial csects. This forces the
808 text csects to precede the data csects. These symbols will not
810 ppc_text_csects
= symbol_make ("dummy\001");
811 ppc_text_csects
->sy_tc
.within
= ppc_text_csects
;
812 ppc_data_csects
= symbol_make ("dummy\001");
813 ppc_data_csects
->sy_tc
.within
= ppc_data_csects
;
818 ppc_current_section
= text_section
;
819 ppc_previous_section
= 0;
824 /* Insert an operand value into an instruction. */
827 ppc_insert_operand (insn
, operand
, val
, file
, line
)
829 const struct powerpc_operand
*operand
;
834 if (operand
->bits
!= 32)
839 if ((operand
->flags
& PPC_OPERAND_SIGNED
) != 0)
841 if ((operand
->flags
& PPC_OPERAND_SIGNOPT
) != 0
842 && ppc_size
== PPC_OPCODE_32
)
843 max
= (1 << operand
->bits
) - 1;
845 max
= (1 << (operand
->bits
- 1)) - 1;
846 min
= - (1 << (operand
->bits
- 1));
850 max
= (1 << operand
->bits
) - 1;
854 if ((operand
->flags
& PPC_OPERAND_NEGATIVE
) != 0)
859 if (test
< (offsetT
) min
|| test
> (offsetT
) max
)
862 "operand out of range (%s not between %ld and %ld)";
865 sprint_value (buf
, test
);
866 if (file
== (char *) NULL
)
867 as_warn (err
, buf
, min
, max
);
869 as_warn_where (file
, line
, err
, buf
, min
, max
);
878 insn
= (*operand
->insert
) (insn
, (long) val
, &errmsg
);
879 if (errmsg
!= (const char *) NULL
)
883 insn
|= (((long) val
& ((1 << operand
->bits
) - 1))
890 /* Parse @got, etc. and return the desired relocation. */
891 static bfd_reloc_code_real_type
892 ppc_elf_suffix (str_p
)
898 bfd_reloc_code_real_type reloc
;
908 #define MAP(str,reloc) { str, sizeof(str)-1, reloc }
910 static struct map_bfd mapping
[] = {
911 MAP ("l", BFD_RELOC_LO16
),
912 MAP ("h", BFD_RELOC_HI16
),
913 MAP ("ha", BFD_RELOC_HI16_S
),
914 MAP ("brtaken", BFD_RELOC_PPC_B16_BRTAKEN
),
915 MAP ("brntaken", BFD_RELOC_PPC_B16_BRNTAKEN
),
916 MAP ("got", BFD_RELOC_16_GOTOFF
),
917 MAP ("got@l", BFD_RELOC_LO16_GOTOFF
),
918 MAP ("got@h", BFD_RELOC_HI16_GOTOFF
),
919 MAP ("got@ha", BFD_RELOC_HI16_S_GOTOFF
),
920 MAP ("fixup", BFD_RELOC_CTOR
), /* warnings with -mrelocatable */
921 MAP ("pltrel24", BFD_RELOC_24_PLT_PCREL
),
922 MAP ("copy", BFD_RELOC_PPC_COPY
),
923 MAP ("globdat", BFD_RELOC_PPC_GLOB_DAT
),
924 MAP ("local24pc", BFD_RELOC_PPC_LOCAL24PC
),
925 MAP ("plt", BFD_RELOC_32_PLTOFF
),
926 MAP ("pltrel", BFD_RELOC_32_PLT_PCREL
),
927 MAP ("plt@l", BFD_RELOC_LO16_PLTOFF
),
928 MAP ("plt@h", BFD_RELOC_HI16_PLTOFF
),
929 MAP ("plt@ha", BFD_RELOC_HI16_S_PLTOFF
),
930 MAP ("sdarel", BFD_RELOC_GPREL16
),
931 MAP ("sectoff", BFD_RELOC_32_BASEREL
),
932 MAP ("sectoff@l", BFD_RELOC_LO16_BASEREL
),
933 MAP ("sectoff@h", BFD_RELOC_HI16_BASEREL
),
934 MAP ("sectoff@ha", BFD_RELOC_HI16_S_BASEREL
),
935 MAP ("xgot", BFD_RELOC_PPC_TOC16
),
937 { (char *)0, 0, BFD_RELOC_UNUSED
}
941 return BFD_RELOC_UNUSED
;
943 for (ch
= *str
, str2
= ident
;
944 str2
< ident
+ sizeof(ident
) - 1 && isalnum (ch
) || ch
== '@';
947 *str2
++ = (islower (ch
)) ? ch
: tolower (ch
);
954 for (ptr
= &mapping
[0]; ptr
->length
> 0; ptr
++)
955 if (ch
== ptr
->string
[0] && len
== ptr
->length
&& memcmp (ident
, ptr
->string
, ptr
->length
) == 0)
961 return BFD_RELOC_UNUSED
;
964 /* Like normal .long/.short/.word, except support @got, etc. */
965 /* clobbers input_line_pointer, checks */
968 ppc_elf_cons (nbytes
)
969 register int nbytes
; /* 1=.byte, 2=.word, 4=.long */
972 bfd_reloc_code_real_type reloc
;
974 if (is_it_end_of_statement ())
976 demand_empty_rest_of_line ();
983 if (exp
.X_op
== O_symbol
984 && *input_line_pointer
== '@'
985 && (reloc
= ppc_elf_suffix (&input_line_pointer
)) != BFD_RELOC_UNUSED
)
987 reloc_howto_type
*reloc_howto
= bfd_reloc_type_lookup (stdoutput
, reloc
);
988 int size
= bfd_get_reloc_size (reloc_howto
);
991 as_bad ("%s relocations do not fit in %d bytes\n", reloc_howto
->name
, nbytes
);
995 register char *p
= frag_more ((int) nbytes
);
996 int offset
= nbytes
- size
;
998 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
+ offset
, size
, &exp
, 0, reloc
);
1002 emit_expr (&exp
, (unsigned int) nbytes
);
1004 while (*input_line_pointer
++ == ',');
1006 input_line_pointer
--; /* Put terminator back into stream. */
1007 demand_empty_rest_of_line ();
1010 /* Validate any relocations emitted for -mrelocatable, possibly adding
1011 fixups for word relocations in writable segments, so we can adjust
1014 ppc_elf_validate_fix (fixp
, seg
)
1021 && fixp
->fx_r_type
<= BFD_RELOC_UNUSED
1022 && strcmp (segment_name (seg
), ".got2") != 0
1023 && strcmp (segment_name (seg
), ".dtors") != 0
1024 && strcmp (segment_name (seg
), ".ctors") != 0
1025 && strcmp (segment_name (seg
), ".fixup") != 0
1026 && strcmp (segment_name (seg
), ".stab") != 0)
1028 if ((seg
->flags
& (SEC_READONLY
| SEC_CODE
)) != 0
1029 || fixp
->fx_r_type
!= BFD_RELOC_CTOR
)
1031 as_warn_where (fixp
->fx_file
, fixp
->fx_line
,
1032 "Relocation cannot be done when using -mrelocatable");
1037 #endif /* OBJ_ELF */
1041 * Summary of register_name().
1043 * in: Input_line_pointer points to 1st char of operand.
1045 * out: A expressionS.
1046 * The operand may have been a register: in this case, X_op == O_register,
1047 * X_add_number is set to the register number, and truth is returned.
1048 * Input_line_pointer->(next non-blank) char after operand, or is in its
1053 register_name (expressionP
)
1054 expressionS
*expressionP
;
1060 /* Find the spelling of the operand */
1061 name
= input_line_pointer
;
1062 c
= get_symbol_end ();
1063 reg_number
= reg_name_search (name
);
1065 /* look to see if it's in the register table */
1066 if (reg_number
>= 0)
1068 expressionP
->X_op
= O_register
;
1069 expressionP
->X_add_number
= reg_number
;
1071 /* make the rest nice */
1072 expressionP
->X_add_symbol
= NULL
;
1073 expressionP
->X_op_symbol
= NULL
;
1074 *input_line_pointer
= c
; /* put back the delimiting char */
1079 /* reset the line as if we had not done anything */
1080 *input_line_pointer
= c
; /* put back the delimiting char */
1081 input_line_pointer
= name
; /* reset input_line pointer */
1087 * Summary of parse_toc_entry().
1089 * in: Input_line_pointer points to the '[' in one of:
1091 * [toc] [tocv] [toc32] [toc64]
1093 * Anything else is an error of one kind or another.
1096 * return value: success or failure
1097 * toc_kind: kind of toc reference
1098 * input_line_pointer:
1099 * success: first char after the ']'
1100 * failure: unchanged
1104 * [toc] - rv == success, toc_kind = default_toc
1105 * [tocv] - rv == success, toc_kind = data_in_toc
1106 * [toc32] - rv == success, toc_kind = must_be_32
1107 * [toc64] - rv == success, toc_kind = must_be_64
1111 enum toc_size_qualifier
1113 default_toc
, /* The toc cell constructed should be the system default size */
1114 data_in_toc
, /* This is a direct reference to a toc cell */
1115 must_be_32
, /* The toc cell constructed must be 32 bits wide */
1116 must_be_64
/* The toc cell constructed must be 64 bits wide */
1120 parse_toc_entry(toc_kind
)
1121 enum toc_size_qualifier
*toc_kind
;
1126 enum toc_size_qualifier t
;
1128 /* save the input_line_pointer */
1129 start
= input_line_pointer
;
1131 /* skip over the '[' , and whitespace */
1132 ++input_line_pointer
;
1135 /* find the spelling of the operand */
1136 toc_spec
= input_line_pointer
;
1137 c
= get_symbol_end ();
1139 if (strcmp(toc_spec
, "toc") == 0)
1143 else if (strcmp(toc_spec
, "tocv") == 0)
1147 else if (strcmp(toc_spec
, "toc32") == 0)
1151 else if (strcmp(toc_spec
, "toc64") == 0)
1157 as_bad ("syntax error: invalid toc specifier `%s'", toc_spec
);
1158 *input_line_pointer
= c
; /* put back the delimiting char */
1159 input_line_pointer
= start
; /* reset input_line pointer */
1163 /* now find the ']' */
1164 *input_line_pointer
= c
; /* put back the delimiting char */
1166 SKIP_WHITESPACE (); /* leading whitespace could be there. */
1167 c
= *input_line_pointer
++; /* input_line_pointer->past char in c. */
1171 as_bad ("syntax error: expected `]', found `%c'", c
);
1172 input_line_pointer
= start
; /* reset input_line pointer */
1176 *toc_kind
= t
; /* set return value */
1183 /* We need to keep a list of fixups. We can't simply generate them as
1184 we go, because that would require us to first create the frag, and
1185 that would screw up references to ``.''. */
1191 bfd_reloc_code_real_type reloc
;
1194 #define MAX_INSN_FIXUPS (5)
1196 /* This routine is called for each instruction to be assembled. */
1203 const struct powerpc_opcode
*opcode
;
1205 const unsigned char *opindex_ptr
;
1209 struct ppc_fixup fixups
[MAX_INSN_FIXUPS
];
1214 bfd_reloc_code_real_type reloc
;
1217 /* Get the opcode. */
1218 for (s
= str
; *s
!= '\0' && ! isspace (*s
); s
++)
1223 /* Look up the opcode in the hash table. */
1224 opcode
= (const struct powerpc_opcode
*) hash_find (ppc_hash
, str
);
1225 if (opcode
== (const struct powerpc_opcode
*) NULL
)
1227 const struct powerpc_macro
*macro
;
1229 macro
= (const struct powerpc_macro
*) hash_find (ppc_macro_hash
, str
);
1230 if (macro
== (const struct powerpc_macro
*) NULL
)
1231 as_bad ("Unrecognized opcode: `%s'", str
);
1233 ppc_macro (s
, macro
);
1238 insn
= opcode
->opcode
;
1241 while (isspace (*str
))
1244 /* PowerPC operands are just expressions. The only real issue is
1245 that a few operand types are optional. All cases which might use
1246 an optional operand separate the operands only with commas (in
1247 some cases parentheses are used, as in ``lwz 1,0(1)'' but such
1248 cases never have optional operands). There is never more than
1249 one optional operand for an instruction. So, before we start
1250 seriously parsing the operands, we check to see if we have an
1251 optional operand, and, if we do, we count the number of commas to
1252 see whether the operand should be omitted. */
1254 for (opindex_ptr
= opcode
->operands
; *opindex_ptr
!= 0; opindex_ptr
++)
1256 const struct powerpc_operand
*operand
;
1258 operand
= &powerpc_operands
[*opindex_ptr
];
1259 if ((operand
->flags
& PPC_OPERAND_OPTIONAL
) != 0)
1261 unsigned int opcount
;
1263 /* There is an optional operand. Count the number of
1264 commas in the input line. */
1271 while ((s
= strchr (s
, ',')) != (char *) NULL
)
1278 /* If there are fewer operands in the line then are called
1279 for by the instruction, we want to skip the optional
1281 if (opcount
< strlen (opcode
->operands
))
1288 /* Gather the operands. */
1292 for (opindex_ptr
= opcode
->operands
; *opindex_ptr
!= 0; opindex_ptr
++)
1294 const struct powerpc_operand
*operand
;
1300 if (next_opindex
== 0)
1301 operand
= &powerpc_operands
[*opindex_ptr
];
1304 operand
= &powerpc_operands
[next_opindex
];
1310 /* If this is a fake operand, then we do not expect anything
1312 if ((operand
->flags
& PPC_OPERAND_FAKE
) != 0)
1314 insn
= (*operand
->insert
) (insn
, 0L, &errmsg
);
1315 if (errmsg
!= (const char *) NULL
)
1320 /* If this is an optional operand, and we are skipping it, just
1322 if ((operand
->flags
& PPC_OPERAND_OPTIONAL
) != 0
1325 if (operand
->insert
)
1327 insn
= (*operand
->insert
) (insn
, 0L, &errmsg
);
1328 if (errmsg
!= (const char *) NULL
)
1331 if ((operand
->flags
& PPC_OPERAND_NEXT
) != 0)
1332 next_opindex
= *opindex_ptr
+ 1;
1336 /* Gather the operand. */
1337 hold
= input_line_pointer
;
1338 input_line_pointer
= str
;
1341 if (*input_line_pointer
== '[')
1343 /* We are expecting something like the second argument here:
1345 lwz r4,[toc].GS.0.static_int(rtoc)
1346 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
1347 The argument following the `]' must be a symbol name, and the
1348 register must be the toc register: 'rtoc' or '2'
1350 The effect is to 0 as the displacement field
1351 in the instruction, and issue an IMAGE_REL_PPC_TOCREL16 (or
1352 the appropriate variation) reloc against it based on the symbol.
1353 The linker will build the toc, and insert the resolved toc offset.
1356 o The size of the toc entry is currently assumed to be
1357 32 bits. This should not be assumed to be a hard coded
1359 o In an effort to cope with a change from 32 to 64 bits,
1360 there are also toc entries that are specified to be
1361 either 32 or 64 bits:
1362 lwz r4,[toc32].GS.0.static_int(rtoc)
1363 lwz r4,[toc64].GS.0.static_int(rtoc)
1364 These demand toc entries of the specified size, and the
1365 instruction probably requires it.
1369 enum toc_size_qualifier toc_kind
;
1370 bfd_reloc_code_real_type toc_reloc
;
1372 /* go parse off the [tocXX] part */
1373 valid_toc
= parse_toc_entry(&toc_kind
);
1377 /* Note: message has already been issued. */
1378 /* FIXME: what sort of recovery should we do? */
1379 /* demand_rest_of_line(); return; ? */
1382 /* Now get the symbol following the ']' */
1388 /* In this case, we may not have seen the symbol yet, since */
1389 /* it is allowed to appear on a .extern or .globl or just be */
1390 /* a label in the .data section. */
1391 toc_reloc
= BFD_RELOC_PPC_TOC16
;
1394 /* 1. The symbol must be defined and either in the toc */
1395 /* section, or a global. */
1396 /* 2. The reloc generated must have the TOCDEFN flag set in */
1397 /* upper bit mess of the reloc type. */
1398 /* FIXME: It's a little confusing what the tocv qualifier can */
1399 /* be used for. At the very least, I've seen three */
1400 /* uses, only one of which I'm sure I can explain. */
1401 if (ex
.X_op
== O_symbol
)
1403 assert (ex
.X_add_symbol
!= NULL
);
1404 if (ex
.X_add_symbol
->bsym
->section
!= tocdata_section
)
1406 as_warn("[tocv] symbol is not a toc symbol");
1410 toc_reloc
= BFD_RELOC_PPC_TOC16
;
1413 /* FIXME: these next two specifically specify 32/64 bit toc */
1414 /* entries. We don't support them today. Is this the */
1415 /* right way to say that? */
1416 toc_reloc
= BFD_RELOC_UNUSED
;
1417 as_bad ("Unimplemented toc32 expression modifier");
1420 /* FIXME: see above */
1421 toc_reloc
= BFD_RELOC_UNUSED
;
1422 as_bad ("Unimplemented toc64 expression modifier");
1426 "Unexpected return value [%d] from parse_toc_entry!\n",
1432 /* We need to generate a fixup for this expression. */
1433 if (fc
>= MAX_INSN_FIXUPS
)
1434 as_fatal ("too many fixups");
1436 fixups
[fc
].reloc
= toc_reloc
;
1437 fixups
[fc
].exp
= ex
;
1438 fixups
[fc
].opindex
= *opindex_ptr
;
1441 /* Ok. We've set up the fixup for the instruction. Now make it
1442 look like the constant 0 was found here */
1444 ex
.X_op
= O_constant
;
1445 ex
.X_add_number
= 0;
1446 ex
.X_add_symbol
= NULL
;
1447 ex
.X_op_symbol
= NULL
;
1451 if (!register_name(&ex
))
1457 str
= input_line_pointer
;
1458 input_line_pointer
= hold
;
1461 str
= input_line_pointer
;
1462 input_line_pointer
= hold
;
1465 if (ex
.X_op
== O_illegal
)
1466 as_bad ("illegal operand");
1467 else if (ex
.X_op
== O_absent
)
1468 as_bad ("missing operand");
1469 else if (ex
.X_op
== O_constant
)
1472 /* Allow @HA, @L, @H on constants. */
1473 char *orig_str
= str
;
1475 if ((reloc
= ppc_elf_suffix (&str
)) != BFD_RELOC_UNUSED
)
1482 case BFD_RELOC_LO16
:
1483 ex
.X_add_number
= ((ex
.X_add_number
& 0xffff) ^ 0x8000) - 0x8000;
1486 case BFD_RELOC_HI16
:
1487 ex
.X_add_number
= (ex
.X_add_number
>> 16) & 0xffff;
1490 case BFD_RELOC_HI16_S
:
1491 ex
.X_add_number
= ((ex
.X_add_number
>> 16) & 0xffff)
1492 + ((ex
.X_add_number
>> 15) & 1);
1496 insn
= ppc_insert_operand (insn
, operand
, ex
.X_add_number
,
1500 else if (ex
.X_op
== O_register
)
1502 insn
= ppc_insert_operand (insn
, operand
, ex
.X_add_number
,
1507 else if ((reloc
= ppc_elf_suffix (&str
)) != BFD_RELOC_UNUSED
)
1509 /* For the absoulte forms of branchs, convert the PC relative form back into
1511 if ((operand
->flags
& PPC_OPERAND_ABSOLUTE
) != 0)
1514 case BFD_RELOC_PPC_B26
: reloc
= BFD_RELOC_PPC_BA26
; break;
1515 case BFD_RELOC_PPC_B16
: reloc
= BFD_RELOC_PPC_BA16
; break;
1516 case BFD_RELOC_PPC_B16_BRTAKEN
: reloc
= BFD_RELOC_PPC_BA16_BRTAKEN
; break;
1517 case BFD_RELOC_PPC_B16_BRNTAKEN
: reloc
= BFD_RELOC_PPC_BA16_BRNTAKEN
; break;
1520 /* We need to generate a fixup for this expression. */
1521 if (fc
>= MAX_INSN_FIXUPS
)
1522 as_fatal ("too many fixups");
1523 fixups
[fc
].exp
= ex
;
1524 fixups
[fc
].opindex
= 0;
1525 fixups
[fc
].reloc
= reloc
;
1528 #endif /* OBJ_ELF */
1532 /* We need to generate a fixup for this expression. */
1533 if (fc
>= MAX_INSN_FIXUPS
)
1534 as_fatal ("too many fixups");
1535 fixups
[fc
].exp
= ex
;
1536 fixups
[fc
].opindex
= *opindex_ptr
;
1537 fixups
[fc
].reloc
= BFD_RELOC_UNUSED
;
1546 else if ((operand
->flags
& PPC_OPERAND_PARENS
) != 0)
1554 /* The call to expression should have advanced str past any
1557 && (endc
!= ',' || *str
!= '\0'))
1559 as_bad ("syntax error; found `%c' but expected `%c'", *str
, endc
);
1567 while (isspace (*str
))
1571 as_bad ("junk at end of line: `%s'", str
);
1573 /* Write out the instruction. */
1575 md_number_to_chars (f
, insn
, 4);
1577 /* Create any fixups. At this point we do not use a
1578 bfd_reloc_code_real_type, but instead just use the
1579 BFD_RELOC_UNUSED plus the operand index. This lets us easily
1580 handle fixups for any operand type, although that is admittedly
1581 not a very exciting feature. We pick a BFD reloc type in
1583 for (i
= 0; i
< fc
; i
++)
1585 const struct powerpc_operand
*operand
;
1587 operand
= &powerpc_operands
[fixups
[i
].opindex
];
1588 if (fixups
[i
].reloc
!= BFD_RELOC_UNUSED
)
1590 reloc_howto_type
*reloc_howto
= bfd_reloc_type_lookup (stdoutput
, fixups
[i
].reloc
);
1598 size
= bfd_get_reloc_size (reloc_howto
);
1599 offset
= target_big_endian
? (4 - size
) : 0;
1601 if (size
< 1 || size
> 4)
1604 fixP
= fix_new_exp (frag_now
, f
- frag_now
->fr_literal
+ offset
, size
,
1605 &fixups
[i
].exp
, reloc_howto
->pc_relative
,
1608 /* Turn off complaints that the addend is too large for things like
1610 switch (fixups
[i
].reloc
)
1612 case BFD_RELOC_LO16
:
1613 case BFD_RELOC_HI16
:
1614 case BFD_RELOC_HI16_S
:
1615 fixP
->fx_no_overflow
= 1;
1622 fix_new_exp (frag_now
, f
- frag_now
->fr_literal
, 4,
1624 (operand
->flags
& PPC_OPERAND_RELATIVE
) != 0,
1625 ((bfd_reloc_code_real_type
)
1626 (fixups
[i
].opindex
+ (int) BFD_RELOC_UNUSED
)));
1630 #ifndef WORKING_DOT_WORD
1631 /* Handle long and short jumps */
1633 md_create_short_jump (ptr
, from_addr
, to_addr
, frag
, to_symbol
)
1635 addressT from_addr
, to_addr
;
1643 md_create_long_jump (ptr
, from_addr
, to_addr
, frag
, to_symbol
)
1645 addressT from_addr
, to_addr
;
1653 /* Handle a macro. Gather all the operands, transform them as
1654 described by the macro, and call md_assemble recursively. All the
1655 operands are separated by commas; we don't accept parentheses
1656 around operands here. */
1659 ppc_macro (str
, macro
)
1661 const struct powerpc_macro
*macro
;
1672 /* Gather the users operands into the operands array. */
1677 if (count
>= sizeof operands
/ sizeof operands
[0])
1679 operands
[count
++] = s
;
1680 s
= strchr (s
, ',');
1681 if (s
== (char *) NULL
)
1686 if (count
!= macro
->operands
)
1688 as_bad ("wrong number of operands");
1692 /* Work out how large the string must be (the size is unbounded
1693 because it includes user input). */
1695 format
= macro
->format
;
1696 while (*format
!= '\0')
1705 arg
= strtol (format
+ 1, &send
, 10);
1706 know (send
!= format
&& arg
>= 0 && arg
< count
);
1707 len
+= strlen (operands
[arg
]);
1712 /* Put the string together. */
1713 complete
= s
= (char *) alloca (len
+ 1);
1714 format
= macro
->format
;
1715 while (*format
!= '\0')
1721 arg
= strtol (format
+ 1, &send
, 10);
1722 strcpy (s
, operands
[arg
]);
1729 /* Assemble the constructed instruction. */
1730 md_assemble (complete
);
1734 /* For ELF, add support for SHF_EXCLUDE and SHT_ORDERED */
1737 ppc_section_letter (letter
, ptr_msg
)
1744 *ptr_msg
= "Bad .section directive: want a,w,x,e in string";
1749 ppc_section_word (ptr_str
)
1752 if (strncmp (*ptr_str
, "exclude", sizeof ("exclude")-1) == 0)
1754 *ptr_str
+= sizeof ("exclude")-1;
1762 ppc_section_type (ptr_str
)
1765 if (strncmp (*ptr_str
, "ordered", sizeof ("ordered")-1) == 0)
1767 *ptr_str
+= sizeof ("ordered")-1;
1775 ppc_section_flags (flags
, attr
, type
)
1780 if (type
== SHT_ORDERED
)
1781 flags
|= SEC_ALLOC
| SEC_LOAD
| SEC_SORT_ENTRIES
;
1783 if (attr
& SHF_EXCLUDE
)
1784 flags
|= SEC_EXCLUDE
;
1788 #endif /* OBJ_ELF */
1791 /* Pseudo-op handling. */
1793 /* The .byte pseudo-op. This is similar to the normal .byte
1794 pseudo-op, but it can also take a single ASCII string. */
1800 if (*input_line_pointer
!= '\"')
1806 /* Gather characters. A real double quote is doubled. Unusual
1807 characters are not permitted. */
1808 ++input_line_pointer
;
1813 c
= *input_line_pointer
++;
1817 if (*input_line_pointer
!= '\"')
1819 ++input_line_pointer
;
1822 FRAG_APPEND_1_CHAR (c
);
1825 demand_empty_rest_of_line ();
1830 /* XCOFF specific pseudo-op handling. */
1832 /* This is set if we are creating a .stabx symbol, since we don't want
1833 to handle symbol suffixes for such symbols. */
1834 static boolean ppc_stab_symbol
;
1836 /* The .comm and .lcomm pseudo-ops for XCOFF. XCOFF puts common
1837 symbols in the .bss segment as though they were local common
1838 symbols, and uses a different smclas. */
1844 asection
*current_seg
= now_seg
;
1845 subsegT current_subseg
= now_subseg
;
1851 symbolS
*lcomm_sym
= NULL
;
1855 name
= input_line_pointer
;
1856 endc
= get_symbol_end ();
1857 end_name
= input_line_pointer
;
1860 if (*input_line_pointer
!= ',')
1862 as_bad ("missing size");
1863 ignore_rest_of_line ();
1866 ++input_line_pointer
;
1868 size
= get_absolute_expression ();
1871 as_bad ("negative size");
1872 ignore_rest_of_line ();
1878 /* The third argument to .comm is the alignment. */
1879 if (*input_line_pointer
!= ',')
1883 ++input_line_pointer
;
1884 align
= get_absolute_expression ();
1887 as_warn ("ignoring bad alignment");
1906 /* The third argument to .lcomm appears to be the real local
1907 common symbol to create. References to the symbol named in
1908 the first argument are turned into references to the third
1910 if (*input_line_pointer
!= ',')
1912 as_bad ("missing real symbol name");
1913 ignore_rest_of_line ();
1916 ++input_line_pointer
;
1918 lcomm_name
= input_line_pointer
;
1919 lcomm_endc
= get_symbol_end ();
1921 lcomm_sym
= symbol_find_or_make (lcomm_name
);
1923 *input_line_pointer
= lcomm_endc
;
1927 sym
= symbol_find_or_make (name
);
1930 if (S_IS_DEFINED (sym
)
1931 || S_GET_VALUE (sym
) != 0)
1933 as_bad ("attempt to redefine symbol");
1934 ignore_rest_of_line ();
1938 record_alignment (bss_section
, align
);
1941 || ! S_IS_DEFINED (lcomm_sym
))
1950 S_SET_EXTERNAL (sym
);
1954 lcomm_sym
->sy_tc
.output
= 1;
1955 def_sym
= lcomm_sym
;
1959 subseg_set (bss_section
, 1);
1960 frag_align (align
, 0);
1962 def_sym
->sy_frag
= frag_now
;
1963 pfrag
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, def_sym
,
1964 def_size
, (char *) NULL
);
1966 S_SET_SEGMENT (def_sym
, bss_section
);
1967 def_sym
->sy_tc
.align
= align
;
1971 /* Align the size of lcomm_sym. */
1972 lcomm_sym
->sy_frag
->fr_offset
=
1973 ((lcomm_sym
->sy_frag
->fr_offset
+ (1 << align
) - 1)
1974 &~ ((1 << align
) - 1));
1975 if (align
> lcomm_sym
->sy_tc
.align
)
1976 lcomm_sym
->sy_tc
.align
= align
;
1981 /* Make sym an offset from lcomm_sym. */
1982 S_SET_SEGMENT (sym
, bss_section
);
1983 sym
->sy_frag
= lcomm_sym
->sy_frag
;
1984 S_SET_VALUE (sym
, lcomm_sym
->sy_frag
->fr_offset
);
1985 lcomm_sym
->sy_frag
->fr_offset
+= size
;
1988 subseg_set (current_seg
, current_subseg
);
1990 demand_empty_rest_of_line ();
1993 /* The .csect pseudo-op. This switches us into a different
1994 subsegment. The first argument is a symbol whose value is the
1995 start of the .csect. In COFF, csect symbols get special aux
1996 entries defined by the x_csect field of union internal_auxent. The
1997 optional second argument is the alignment (the default is 2). */
2007 name
= input_line_pointer
;
2008 endc
= get_symbol_end ();
2010 sym
= symbol_find_or_make (name
);
2012 *input_line_pointer
= endc
;
2014 ppc_change_csect (sym
);
2016 if (*input_line_pointer
== ',')
2018 ++input_line_pointer
;
2019 sym
->sy_tc
.align
= get_absolute_expression ();
2022 demand_empty_rest_of_line ();
2025 /* Change to a different csect. */
2028 ppc_change_csect (sym
)
2031 if (S_IS_DEFINED (sym
))
2032 subseg_set (S_GET_SEGMENT (sym
), sym
->sy_tc
.subseg
);
2039 /* This is a new csect. We need to look at the symbol class to
2040 figure out whether it should go in the text section or the
2043 switch (sym
->sy_tc
.class)
2053 S_SET_SEGMENT (sym
, text_section
);
2054 sym
->sy_tc
.subseg
= ppc_text_subsegment
;
2055 ++ppc_text_subsegment
;
2056 list_ptr
= &ppc_text_csects
;
2065 if (ppc_toc_csect
!= NULL
2066 && ppc_toc_csect
->sy_tc
.subseg
+ 1 == ppc_data_subsegment
)
2068 S_SET_SEGMENT (sym
, data_section
);
2069 sym
->sy_tc
.subseg
= ppc_data_subsegment
;
2070 ++ppc_data_subsegment
;
2071 list_ptr
= &ppc_data_csects
;
2077 subseg_new (segment_name (S_GET_SEGMENT (sym
)), sym
->sy_tc
.subseg
);
2079 ppc_after_toc_frag
= frag_now
;
2081 sym
->sy_frag
= frag_now
;
2082 S_SET_VALUE (sym
, (valueT
) frag_now_fix ());
2084 sym
->sy_tc
.align
= 2;
2085 sym
->sy_tc
.output
= 1;
2086 sym
->sy_tc
.within
= sym
;
2088 for (list
= *list_ptr
;
2089 list
->sy_tc
.next
!= (symbolS
*) NULL
;
2090 list
= list
->sy_tc
.next
)
2092 list
->sy_tc
.next
= sym
;
2094 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
2095 symbol_append (sym
, list
->sy_tc
.within
, &symbol_rootP
, &symbol_lastP
);
2098 ppc_current_csect
= sym
;
2101 /* This function handles the .text and .data pseudo-ops. These
2102 pseudo-ops aren't really used by XCOFF; we implement them for the
2103 convenience of people who aren't used to XCOFF. */
2114 else if (type
== 'd')
2119 sym
= symbol_find_or_make (name
);
2121 ppc_change_csect (sym
);
2123 demand_empty_rest_of_line ();
2126 /* The .extern pseudo-op. We create an undefined symbol. */
2135 name
= input_line_pointer
;
2136 endc
= get_symbol_end ();
2138 (void) symbol_find_or_make (name
);
2140 *input_line_pointer
= endc
;
2142 demand_empty_rest_of_line ();
2145 /* The .lglobl pseudo-op. Keep the symbol in the symbol table. */
2155 name
= input_line_pointer
;
2156 endc
= get_symbol_end ();
2158 sym
= symbol_find_or_make (name
);
2160 *input_line_pointer
= endc
;
2162 sym
->sy_tc
.output
= 1;
2164 demand_empty_rest_of_line ();
2167 /* The .rename pseudo-op. The RS/6000 assembler can rename symbols,
2168 although I don't know why it bothers. */
2179 name
= input_line_pointer
;
2180 endc
= get_symbol_end ();
2182 sym
= symbol_find_or_make (name
);
2184 *input_line_pointer
= endc
;
2186 if (*input_line_pointer
!= ',')
2188 as_bad ("missing rename string");
2189 ignore_rest_of_line ();
2192 ++input_line_pointer
;
2194 sym
->sy_tc
.real_name
= demand_copy_C_string (&len
);
2196 demand_empty_rest_of_line ();
2199 /* The .stabx pseudo-op. This is similar to a normal .stabs
2200 pseudo-op, but slightly different. A sample is
2201 .stabx "main:F-1",.main,142,0
2202 The first argument is the symbol name to create. The second is the
2203 value, and the third is the storage class. The fourth seems to be
2204 always zero, and I am assuming it is the type. */
2215 name
= demand_copy_C_string (&len
);
2217 if (*input_line_pointer
!= ',')
2219 as_bad ("missing value");
2222 ++input_line_pointer
;
2224 ppc_stab_symbol
= true;
2225 sym
= symbol_make (name
);
2226 ppc_stab_symbol
= false;
2228 sym
->sy_tc
.real_name
= name
;
2230 (void) expression (&exp
);
2237 as_bad ("illegal .stabx expression; zero assumed");
2238 exp
.X_add_number
= 0;
2241 S_SET_VALUE (sym
, (valueT
) exp
.X_add_number
);
2242 sym
->sy_frag
= &zero_address_frag
;
2246 if (S_GET_SEGMENT (exp
.X_add_symbol
) == undefined_section
)
2247 sym
->sy_value
= exp
;
2251 exp
.X_add_number
+ S_GET_VALUE (exp
.X_add_symbol
));
2252 sym
->sy_frag
= exp
.X_add_symbol
->sy_frag
;
2257 /* The value is some complex expression. This will probably
2258 fail at some later point, but this is probably the right
2259 thing to do here. */
2260 sym
->sy_value
= exp
;
2264 S_SET_SEGMENT (sym
, ppc_coff_debug_section
);
2265 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2267 if (*input_line_pointer
!= ',')
2269 as_bad ("missing class");
2272 ++input_line_pointer
;
2274 S_SET_STORAGE_CLASS (sym
, get_absolute_expression ());
2276 if (*input_line_pointer
!= ',')
2278 as_bad ("missing type");
2281 ++input_line_pointer
;
2283 S_SET_DATA_TYPE (sym
, get_absolute_expression ());
2285 sym
->sy_tc
.output
= 1;
2287 if (S_GET_STORAGE_CLASS (sym
) == C_STSYM
)
2288 sym
->sy_tc
.within
= ppc_current_block
;
2290 if (exp
.X_op
!= O_symbol
2291 || ! S_IS_EXTERNAL (exp
.X_add_symbol
)
2292 || S_GET_SEGMENT (exp
.X_add_symbol
) != bss_section
)
2293 ppc_frob_label (sym
);
2296 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
2297 symbol_append (sym
, exp
.X_add_symbol
, &symbol_rootP
, &symbol_lastP
);
2298 if (ppc_current_csect
->sy_tc
.within
== exp
.X_add_symbol
)
2299 ppc_current_csect
->sy_tc
.within
= sym
;
2302 demand_empty_rest_of_line ();
2305 /* The .function pseudo-op. This takes several arguments. The first
2306 argument seems to be the external name of the symbol. The second
2307 argment seems to be the label for the start of the function. gcc
2308 uses the same name for both. I have no idea what the third and
2309 fourth arguments are meant to be. The optional fifth argument is
2310 an expression for the size of the function. In COFF this symbol
2311 gets an aux entry like that used for a csect. */
2314 ppc_function (ignore
)
2323 name
= input_line_pointer
;
2324 endc
= get_symbol_end ();
2326 /* Ignore any [PR] suffix. */
2327 name
= ppc_canonicalize_symbol_name (name
);
2328 s
= strchr (name
, '[');
2329 if (s
!= (char *) NULL
2330 && strcmp (s
+ 1, "PR]") == 0)
2333 ext_sym
= symbol_find_or_make (name
);
2335 *input_line_pointer
= endc
;
2337 if (*input_line_pointer
!= ',')
2339 as_bad ("missing symbol name");
2340 ignore_rest_of_line ();
2343 ++input_line_pointer
;
2345 name
= input_line_pointer
;
2346 endc
= get_symbol_end ();
2348 lab_sym
= symbol_find_or_make (name
);
2350 *input_line_pointer
= endc
;
2352 if (ext_sym
!= lab_sym
)
2354 ext_sym
->sy_value
.X_op
= O_symbol
;
2355 ext_sym
->sy_value
.X_add_symbol
= lab_sym
;
2356 ext_sym
->sy_value
.X_op_symbol
= NULL
;
2357 ext_sym
->sy_value
.X_add_number
= 0;
2360 if (ext_sym
->sy_tc
.class == -1)
2361 ext_sym
->sy_tc
.class = XMC_PR
;
2362 ext_sym
->sy_tc
.output
= 1;
2364 if (*input_line_pointer
== ',')
2368 /* Ignore the third argument. */
2369 ++input_line_pointer
;
2370 expression (&ignore
);
2371 if (*input_line_pointer
== ',')
2373 /* Ignore the fourth argument. */
2374 ++input_line_pointer
;
2375 expression (&ignore
);
2376 if (*input_line_pointer
== ',')
2378 /* The fifth argument is the function size. */
2379 ++input_line_pointer
;
2380 ext_sym
->sy_tc
.size
= symbol_new ("L0\001",
2383 &zero_address_frag
);
2384 pseudo_set (ext_sym
->sy_tc
.size
);
2389 S_SET_DATA_TYPE (ext_sym
, DT_FCN
<< N_BTSHFT
);
2390 SF_SET_FUNCTION (ext_sym
);
2391 SF_SET_PROCESS (ext_sym
);
2392 coff_add_linesym (ext_sym
);
2394 demand_empty_rest_of_line ();
2397 /* The .bf pseudo-op. This is just like a COFF C_FCN symbol named
2406 sym
= symbol_make (".bf");
2407 S_SET_SEGMENT (sym
, text_section
);
2408 sym
->sy_frag
= frag_now
;
2409 S_SET_VALUE (sym
, frag_now_fix ());
2410 S_SET_STORAGE_CLASS (sym
, C_FCN
);
2412 coff_line_base
= get_absolute_expression ();
2414 S_SET_NUMBER_AUXILIARY (sym
, 1);
2415 SA_SET_SYM_LNNO (sym
, coff_line_base
);
2417 sym
->sy_tc
.output
= 1;
2419 ppc_frob_label (sym
);
2421 demand_empty_rest_of_line ();
2424 /* The .ef pseudo-op. This is just like a COFF C_FCN symbol named
2425 ".ef", except that the line number is absolute, not relative to the
2426 most recent ".bf" symbol. */
2434 sym
= symbol_make (".ef");
2435 S_SET_SEGMENT (sym
, text_section
);
2436 sym
->sy_frag
= frag_now
;
2437 S_SET_VALUE (sym
, frag_now_fix ());
2438 S_SET_STORAGE_CLASS (sym
, C_FCN
);
2439 S_SET_NUMBER_AUXILIARY (sym
, 1);
2440 SA_SET_SYM_LNNO (sym
, get_absolute_expression ());
2441 sym
->sy_tc
.output
= 1;
2443 ppc_frob_label (sym
);
2445 demand_empty_rest_of_line ();
2448 /* The .bi and .ei pseudo-ops. These take a string argument and
2449 generates a C_BINCL or C_EINCL symbol, which goes at the start of
2461 name
= demand_copy_C_string (&len
);
2463 /* The value of these symbols is actually file offset. Here we set
2464 the value to the index into the line number entries. In
2465 ppc_frob_symbols we set the fix_line field, which will cause BFD
2466 to do the right thing. */
2468 sym
= symbol_make (name
);
2469 /* obj-coff.c currently only handles line numbers correctly in the
2471 S_SET_SEGMENT (sym
, text_section
);
2472 S_SET_VALUE (sym
, coff_n_line_nos
);
2473 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2475 S_SET_STORAGE_CLASS (sym
, ei
? C_EINCL
: C_BINCL
);
2476 sym
->sy_tc
.output
= 1;
2478 for (look
= symbol_rootP
;
2479 (look
!= (symbolS
*) NULL
2480 && (S_GET_STORAGE_CLASS (look
) == C_FILE
2481 || S_GET_STORAGE_CLASS (look
) == C_BINCL
2482 || S_GET_STORAGE_CLASS (look
) == C_EINCL
));
2483 look
= symbol_next (look
))
2485 if (look
!= (symbolS
*) NULL
)
2487 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
2488 symbol_insert (sym
, look
, &symbol_rootP
, &symbol_lastP
);
2491 demand_empty_rest_of_line ();
2494 /* The .bs pseudo-op. This generates a C_BSTAT symbol named ".bs".
2495 There is one argument, which is a csect symbol. The value of the
2496 .bs symbol is the index of this csect symbol. */
2507 if (ppc_current_block
!= NULL
)
2508 as_bad ("nested .bs blocks");
2510 name
= input_line_pointer
;
2511 endc
= get_symbol_end ();
2513 csect
= symbol_find_or_make (name
);
2515 *input_line_pointer
= endc
;
2517 sym
= symbol_make (".bs");
2518 S_SET_SEGMENT (sym
, now_seg
);
2519 S_SET_STORAGE_CLASS (sym
, C_BSTAT
);
2520 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2521 sym
->sy_tc
.output
= 1;
2523 sym
->sy_tc
.within
= csect
;
2525 ppc_frob_label (sym
);
2527 ppc_current_block
= sym
;
2529 demand_empty_rest_of_line ();
2532 /* The .es pseudo-op. Generate a C_ESTART symbol named .es. */
2540 if (ppc_current_block
== NULL
)
2541 as_bad (".es without preceding .bs");
2543 sym
= symbol_make (".es");
2544 S_SET_SEGMENT (sym
, now_seg
);
2545 S_SET_STORAGE_CLASS (sym
, C_ESTAT
);
2546 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2547 sym
->sy_tc
.output
= 1;
2549 ppc_frob_label (sym
);
2551 ppc_current_block
= NULL
;
2553 demand_empty_rest_of_line ();
2556 /* The .bb pseudo-op. Generate a C_BLOCK symbol named .bb, with a
2565 sym
= symbol_make (".bb");
2566 S_SET_SEGMENT (sym
, text_section
);
2567 sym
->sy_frag
= frag_now
;
2568 S_SET_VALUE (sym
, frag_now_fix ());
2569 S_SET_STORAGE_CLASS (sym
, C_BLOCK
);
2571 S_SET_NUMBER_AUXILIARY (sym
, 1);
2572 SA_SET_SYM_LNNO (sym
, get_absolute_expression ());
2574 sym
->sy_tc
.output
= 1;
2576 SF_SET_PROCESS (sym
);
2578 ppc_frob_label (sym
);
2580 demand_empty_rest_of_line ();
2583 /* The .eb pseudo-op. Generate a C_BLOCK symbol named .eb, with a
2592 sym
= symbol_make (".eb");
2593 S_SET_SEGMENT (sym
, text_section
);
2594 sym
->sy_frag
= frag_now
;
2595 S_SET_VALUE (sym
, frag_now_fix ());
2596 S_SET_STORAGE_CLASS (sym
, C_BLOCK
);
2597 S_SET_NUMBER_AUXILIARY (sym
, 1);
2598 SA_SET_SYM_LNNO (sym
, get_absolute_expression ());
2599 sym
->sy_tc
.output
= 1;
2601 SF_SET_PROCESS (sym
);
2603 ppc_frob_label (sym
);
2605 demand_empty_rest_of_line ();
2608 /* The .bc pseudo-op. This just creates a C_BCOMM symbol with a
2619 name
= demand_copy_C_string (&len
);
2620 sym
= symbol_make (name
);
2621 S_SET_SEGMENT (sym
, ppc_coff_debug_section
);
2622 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2623 S_SET_STORAGE_CLASS (sym
, C_BCOMM
);
2624 S_SET_VALUE (sym
, 0);
2625 sym
->sy_tc
.output
= 1;
2627 ppc_frob_label (sym
);
2629 demand_empty_rest_of_line ();
2632 /* The .ec pseudo-op. This just creates a C_ECOMM symbol. */
2640 sym
= symbol_make (".ec");
2641 S_SET_SEGMENT (sym
, ppc_coff_debug_section
);
2642 sym
->bsym
->flags
|= BSF_DEBUGGING
;
2643 S_SET_STORAGE_CLASS (sym
, C_ECOMM
);
2644 S_SET_VALUE (sym
, 0);
2645 sym
->sy_tc
.output
= 1;
2647 ppc_frob_label (sym
);
2649 demand_empty_rest_of_line ();
2652 /* The .toc pseudo-op. Switch to the .toc subsegment. */
2658 if (ppc_toc_csect
!= (symbolS
*) NULL
)
2659 subseg_set (data_section
, ppc_toc_csect
->sy_tc
.subseg
);
2666 subseg
= ppc_data_subsegment
;
2667 ++ppc_data_subsegment
;
2669 subseg_new (segment_name (data_section
), subseg
);
2670 ppc_toc_frag
= frag_now
;
2672 sym
= symbol_find_or_make ("TOC[TC0]");
2673 sym
->sy_frag
= frag_now
;
2674 S_SET_SEGMENT (sym
, data_section
);
2675 S_SET_VALUE (sym
, (valueT
) frag_now_fix ());
2676 sym
->sy_tc
.subseg
= subseg
;
2677 sym
->sy_tc
.output
= 1;
2678 sym
->sy_tc
.within
= sym
;
2680 ppc_toc_csect
= sym
;
2682 for (list
= ppc_data_csects
;
2683 list
->sy_tc
.next
!= (symbolS
*) NULL
;
2684 list
= list
->sy_tc
.next
)
2686 list
->sy_tc
.next
= sym
;
2688 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
2689 symbol_append (sym
, list
->sy_tc
.within
, &symbol_rootP
, &symbol_lastP
);
2692 ppc_current_csect
= ppc_toc_csect
;
2694 demand_empty_rest_of_line ();
2697 #endif /* OBJ_XCOFF */
2699 /* The .tc pseudo-op. This is used when generating either XCOFF or
2700 ELF. This takes two or more arguments.
2702 When generating XCOFF output, the first argument is the name to
2703 give to this location in the toc; this will be a symbol with class
2704 TC. The rest of the arguments are 4 byte values to actually put at
2705 this location in the TOC; often there is just one more argument, a
2706 relocateable symbol reference.
2708 When not generating XCOFF output, the arguments are the same, but
2709 the first argument is simply ignored. */
2717 /* Define the TOC symbol name. */
2723 if (ppc_toc_csect
== (symbolS
*) NULL
2724 || ppc_toc_csect
!= ppc_current_csect
)
2726 as_bad (".tc not in .toc section");
2727 ignore_rest_of_line ();
2731 name
= input_line_pointer
;
2732 endc
= get_symbol_end ();
2734 sym
= symbol_find_or_make (name
);
2736 *input_line_pointer
= endc
;
2738 if (S_IS_DEFINED (sym
))
2742 label
= ppc_current_csect
->sy_tc
.within
;
2743 if (label
->sy_tc
.class != XMC_TC0
)
2745 as_warn (".tc with no label");
2746 ignore_rest_of_line ();
2750 S_SET_SEGMENT (label
, S_GET_SEGMENT (sym
));
2751 label
->sy_frag
= sym
->sy_frag
;
2752 S_SET_VALUE (label
, S_GET_VALUE (sym
));
2754 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
2755 ++input_line_pointer
;
2760 S_SET_SEGMENT (sym
, now_seg
);
2761 sym
->sy_frag
= frag_now
;
2762 S_SET_VALUE (sym
, (valueT
) frag_now_fix ());
2763 sym
->sy_tc
.class = XMC_TC
;
2764 sym
->sy_tc
.output
= 1;
2766 ppc_frob_label (sym
);
2769 #else /* ! defined (OBJ_XCOFF) */
2771 /* Skip the TOC symbol name. */
2772 while (is_part_of_name (*input_line_pointer
)
2773 || *input_line_pointer
== '['
2774 || *input_line_pointer
== ']'
2775 || *input_line_pointer
== '{'
2776 || *input_line_pointer
== '}')
2777 ++input_line_pointer
;
2779 /* Align to a four byte boundary. */
2781 record_alignment (now_seg
, 2);
2783 #endif /* ! defined (OBJ_XCOFF) */
2785 if (*input_line_pointer
!= ',')
2786 demand_empty_rest_of_line ();
2789 ++input_line_pointer
;
2796 /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format */
2798 /* Set the current section. */
2800 ppc_set_current_section (new)
2803 ppc_previous_section
= ppc_current_section
;
2804 ppc_current_section
= new;
2807 /* pseudo-op: .previous
2808 behaviour: toggles the current section with the previous section.
2810 warnings: "No previous section"
2813 ppc_previous(ignore
)
2818 if (ppc_previous_section
== NULL
)
2820 as_warn("No previous section to return to. Directive ignored.");
2824 subseg_set(ppc_previous_section
, 0);
2826 ppc_set_current_section(ppc_previous_section
);
2829 /* pseudo-op: .pdata
2830 behaviour: predefined read only data section
2834 initial: .section .pdata "adr3"
2835 a - don't know -- maybe a misprint
2836 d - initialized data
2838 3 - double word aligned (that would be 4 byte boundary)
2841 Tag index tables (also known as the function table) for exception
2842 handling, debugging, etc.
2849 if (pdata_section
== 0)
2851 pdata_section
= subseg_new (".pdata", 0);
2853 bfd_set_section_flags (stdoutput
, pdata_section
,
2854 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
2855 | SEC_READONLY
| SEC_DATA
));
2857 bfd_set_section_alignment (stdoutput
, pdata_section
, 3);
2861 pdata_section
= subseg_new(".pdata", 0);
2863 ppc_set_current_section(pdata_section
);
2866 /* pseudo-op: .ydata
2867 behaviour: predefined read only data section
2871 initial: .section .ydata "drw3"
2872 a - don't know -- maybe a misprint
2873 d - initialized data
2875 3 - double word aligned (that would be 4 byte boundary)
2877 Tag tables (also known as the scope table) for exception handling,
2884 if (ydata_section
== 0)
2886 ydata_section
= subseg_new (".ydata", 0);
2887 bfd_set_section_flags (stdoutput
, ydata_section
,
2888 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
2889 | SEC_READONLY
| SEC_DATA
));
2891 bfd_set_section_alignment (stdoutput
, ydata_section
, 3);
2895 ydata_section
= subseg_new (".ydata", 0);
2897 ppc_set_current_section(ydata_section
);
2900 /* pseudo-op: .reldata
2901 behaviour: predefined read write data section
2902 double word aligned (4-byte)
2903 FIXME: relocation is applied to it
2904 FIXME: what's the difference between this and .data?
2907 initial: .section .reldata "drw3"
2908 d - initialized data
2911 3 - double word aligned (that would be 8 byte boundary)
2914 Like .data, but intended to hold data subject to relocation, such as
2915 function descriptors, etc.
2921 if (reldata_section
== 0)
2923 reldata_section
= subseg_new (".reldata", 0);
2925 bfd_set_section_flags (stdoutput
, reldata_section
,
2926 ( SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
2929 bfd_set_section_alignment (stdoutput
, reldata_section
, 3);
2933 reldata_section
= subseg_new (".reldata", 0);
2935 ppc_set_current_section(reldata_section
);
2938 /* pseudo-op: .rdata
2939 behaviour: predefined read only data section
2943 initial: .section .rdata "dr3"
2944 d - initialized data
2946 3 - double word aligned (that would be 4 byte boundary)
2952 if (rdata_section
== 0)
2954 rdata_section
= subseg_new (".rdata", 0);
2955 bfd_set_section_flags (stdoutput
, rdata_section
,
2956 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
2957 | SEC_READONLY
| SEC_DATA
));
2959 bfd_set_section_alignment (stdoutput
, rdata_section
, 2);
2963 rdata_section
= subseg_new (".rdata", 0);
2965 ppc_set_current_section(rdata_section
);
2968 /* pseudo-op: .ualong
2969 behaviour: much like .int, with the exception that no alignment is
2971 FIXME: test the alignment statement
2983 /* pseudo-op: .znop <symbol name>
2984 behaviour: Issue a nop instruction
2985 Issue a IMAGE_REL_PPC_IFGLUE relocation against it, using
2986 the supplied symbol name.
2988 warnings: Missing symbol name
2995 const struct powerpc_opcode
*opcode
;
3001 /* Strip out the symbol name */
3009 symbol_name
= input_line_pointer
;
3010 c
= get_symbol_end ();
3012 name
= xmalloc (input_line_pointer
- symbol_name
+ 1);
3013 strcpy (name
, symbol_name
);
3015 sym
= symbol_find_or_make (name
);
3017 *input_line_pointer
= c
;
3021 /* Look up the opcode in the hash table. */
3022 opcode
= (const struct powerpc_opcode
*) hash_find (ppc_hash
, "nop");
3024 /* stick in the nop */
3025 insn
= opcode
->opcode
;
3027 /* Write out the instruction. */
3029 md_number_to_chars (f
, insn
, 4);
3031 f
- frag_now
->fr_literal
,
3036 BFD_RELOC_16_GOT_PCREL
);
3049 register char *name
;
3053 register symbolS
*symbolP
;
3056 name
= input_line_pointer
;
3057 c
= get_symbol_end ();
3059 /* just after name is now '\0' */
3060 p
= input_line_pointer
;
3063 if (*input_line_pointer
!= ',')
3065 as_bad ("Expected comma after symbol-name: rest of line ignored.");
3066 ignore_rest_of_line ();
3070 input_line_pointer
++; /* skip ',' */
3071 if ((temp
= get_absolute_expression ()) < 0)
3073 as_warn (".COMMon length (%ld.) <0! Ignored.", (long) temp
);
3074 ignore_rest_of_line ();
3080 /* The third argument to .comm is the alignment. */
3081 if (*input_line_pointer
!= ',')
3085 ++input_line_pointer
;
3086 align
= get_absolute_expression ();
3089 as_warn ("ignoring bad alignment");
3096 symbolP
= symbol_find_or_make (name
);
3099 if (S_IS_DEFINED (symbolP
))
3101 as_bad ("Ignoring attempt to re-define symbol `%s'.",
3102 S_GET_NAME (symbolP
));
3103 ignore_rest_of_line ();
3107 if (S_GET_VALUE (symbolP
))
3109 if (S_GET_VALUE (symbolP
) != (valueT
) temp
)
3110 as_bad ("Length of .comm \"%s\" is already %ld. Not changed to %ld.",
3111 S_GET_NAME (symbolP
),
3112 (long) S_GET_VALUE (symbolP
),
3117 S_SET_VALUE (symbolP
, (valueT
) temp
);
3118 S_SET_EXTERNAL (symbolP
);
3121 demand_empty_rest_of_line ();
3125 * implement the .section pseudo op:
3126 * .section name {, "flags"}
3128 * | +--- optional flags: 'b' for bss
3130 * +-- section name 'l' for lib
3134 * 'd' (apparently m88k for data)
3136 * But if the argument is not a quoted string, treat it as a
3137 * subsegment number.
3139 * FIXME: this is a copy of the section processing from obj-coff.c, with
3140 * additions/changes for the moto-pas assembler support. There are three
3143 * FIXME: I just noticed this. This doesn't work at all really. It it
3144 * setting bits that bfd probably neither understands or uses. The
3145 * correct approach (?) will have to incorporate extra fields attached
3146 * to the section to hold the system specific stuff. (krk)
3149 * 'a' - unknown - referred to in documentation, but no definition supplied
3150 * 'c' - section has code
3151 * 'd' - section has initialized data
3152 * 'u' - section has uninitialized data
3153 * 'i' - section contains directives (info)
3154 * 'n' - section can be discarded
3155 * 'R' - remove section at link time
3157 * Section Protection:
3158 * 'r' - section is readable
3159 * 'w' - section is writeable
3160 * 'x' - section is executable
3161 * 's' - section is sharable
3163 * Section Alignment:
3164 * '0' - align to byte boundary
3165 * '1' - align to halfword undary
3166 * '2' - align to word boundary
3167 * '3' - align to doubleword boundary
3168 * '4' - align to quadword boundary
3169 * '5' - align to 32 byte boundary
3170 * '6' - align to 64 byte boundary
3175 ppc_pe_section (ignore
)
3178 /* Strip out the section name */
3187 section_name
= input_line_pointer
;
3188 c
= get_symbol_end ();
3190 name
= xmalloc (input_line_pointer
- section_name
+ 1);
3191 strcpy (name
, section_name
);
3193 *input_line_pointer
= c
;
3198 flags
= SEC_NO_FLAGS
;
3200 if (strcmp (name
, ".idata$2") == 0)
3204 else if (strcmp (name
, ".idata$3") == 0)
3208 else if (strcmp (name
, ".idata$4") == 0)
3212 else if (strcmp (name
, ".idata$5") == 0)
3216 else if (strcmp (name
, ".idata$6") == 0)
3221 align
= 4; /* default alignment to 16 byte boundary */
3223 if (*input_line_pointer
== ',')
3225 ++input_line_pointer
;
3227 if (*input_line_pointer
!= '"')
3228 exp
= get_absolute_expression ();
3231 ++input_line_pointer
;
3232 while (*input_line_pointer
!= '"'
3233 && ! is_end_of_line
[(unsigned char) *input_line_pointer
])
3235 switch (*input_line_pointer
)
3237 /* Section Contents */
3238 case 'a': /* unknown */
3239 as_warn ("Unsupported section attribute -- 'a'");
3241 case 'c': /* code section */
3244 case 'd': /* section has initialized data */
3247 case 'u': /* section has uninitialized data */
3248 /* FIXME: This is IMAGE_SCN_CNT_UNINITIALIZED_DATA
3252 case 'i': /* section contains directives (info) */
3253 /* FIXME: This is IMAGE_SCN_LNK_INFO
3255 flags
|= SEC_HAS_CONTENTS
;
3257 case 'n': /* section can be discarded */
3260 case 'R': /* Remove section at link time */
3261 flags
|= SEC_NEVER_LOAD
;
3264 /* Section Protection */
3265 case 'r': /* section is readable */
3266 flags
|= IMAGE_SCN_MEM_READ
;
3268 case 'w': /* section is writeable */
3269 flags
|= IMAGE_SCN_MEM_WRITE
;
3271 case 'x': /* section is executable */
3272 flags
|= IMAGE_SCN_MEM_EXECUTE
;
3274 case 's': /* section is sharable */
3275 flags
|= IMAGE_SCN_MEM_SHARED
;
3278 /* Section Alignment */
3279 case '0': /* align to byte boundary */
3280 flags
|= IMAGE_SCN_ALIGN_1BYTES
;
3283 case '1': /* align to halfword boundary */
3284 flags
|= IMAGE_SCN_ALIGN_2BYTES
;
3287 case '2': /* align to word boundary */
3288 flags
|= IMAGE_SCN_ALIGN_4BYTES
;
3291 case '3': /* align to doubleword boundary */
3292 flags
|= IMAGE_SCN_ALIGN_8BYTES
;
3295 case '4': /* align to quadword boundary */
3296 flags
|= IMAGE_SCN_ALIGN_16BYTES
;
3299 case '5': /* align to 32 byte boundary */
3300 flags
|= IMAGE_SCN_ALIGN_32BYTES
;
3303 case '6': /* align to 64 byte boundary */
3304 flags
|= IMAGE_SCN_ALIGN_64BYTES
;
3309 as_warn("unknown section attribute '%c'",
3310 *input_line_pointer
);
3313 ++input_line_pointer
;
3315 if (*input_line_pointer
== '"')
3316 ++input_line_pointer
;
3320 sec
= subseg_new (name
, (subsegT
) exp
);
3322 ppc_set_current_section(sec
);
3324 if (flags
!= SEC_NO_FLAGS
)
3326 if (! bfd_set_section_flags (stdoutput
, sec
, flags
))
3327 as_warn ("error setting flags for \"%s\": %s",
3328 bfd_section_name (stdoutput
, sec
),
3329 bfd_errmsg (bfd_get_error ()));
3332 bfd_set_section_alignment(stdoutput
, sec
, align
);
3337 ppc_pe_function (ignore
)
3344 name
= input_line_pointer
;
3345 endc
= get_symbol_end ();
3347 ext_sym
= symbol_find_or_make (name
);
3349 *input_line_pointer
= endc
;
3351 S_SET_DATA_TYPE (ext_sym
, DT_FCN
<< N_BTSHFT
);
3352 SF_SET_FUNCTION (ext_sym
);
3353 SF_SET_PROCESS (ext_sym
);
3354 coff_add_linesym (ext_sym
);
3356 demand_empty_rest_of_line ();
3360 ppc_pe_tocd (ignore
)
3363 if (tocdata_section
== 0)
3365 tocdata_section
= subseg_new (".tocd", 0);
3366 /* FIXME: section flags won't work */
3367 bfd_set_section_flags (stdoutput
, tocdata_section
,
3368 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
3369 | SEC_READONLY
| SEC_DATA
));
3371 bfd_set_section_alignment (stdoutput
, tocdata_section
, 2);
3375 rdata_section
= subseg_new (".tocd", 0);
3378 ppc_set_current_section(tocdata_section
);
3380 demand_empty_rest_of_line ();
3383 /* Don't adjust TOC relocs to use the section symbol. */
3386 ppc_pe_fix_adjustable (fix
)
3389 return fix
->fx_r_type
!= BFD_RELOC_PPC_TOC16
;
3396 /* XCOFF specific symbol and file handling. */
3398 /* Canonicalize the symbol name. We use the to force the suffix, if
3399 any, to use square brackets, and to be in upper case. */
3402 ppc_canonicalize_symbol_name (name
)
3407 if (ppc_stab_symbol
)
3410 for (s
= name
; *s
!= '\0' && *s
!= '{' && *s
!= '['; s
++)
3424 for (s
++; *s
!= '\0' && *s
!= brac
; s
++)
3428 if (*s
== '\0' || s
[1] != '\0')
3429 as_bad ("bad symbol suffix");
3437 /* Set the class of a symbol based on the suffix, if any. This is
3438 called whenever a new symbol is created. */
3441 ppc_symbol_new_hook (sym
)
3446 sym
->sy_tc
.next
= NULL
;
3447 sym
->sy_tc
.output
= 0;
3448 sym
->sy_tc
.class = -1;
3449 sym
->sy_tc
.real_name
= NULL
;
3450 sym
->sy_tc
.subseg
= 0;
3451 sym
->sy_tc
.align
= 0;
3452 sym
->sy_tc
.size
= NULL
;
3453 sym
->sy_tc
.within
= NULL
;
3455 if (ppc_stab_symbol
)
3458 s
= strchr (S_GET_NAME (sym
), '[');
3459 if (s
== (const char *) NULL
)
3461 /* There is no suffix. */
3470 if (strcmp (s
, "BS]") == 0)
3471 sym
->sy_tc
.class = XMC_BS
;
3474 if (strcmp (s
, "DB]") == 0)
3475 sym
->sy_tc
.class = XMC_DB
;
3476 else if (strcmp (s
, "DS]") == 0)
3477 sym
->sy_tc
.class = XMC_DS
;
3480 if (strcmp (s
, "GL]") == 0)
3481 sym
->sy_tc
.class = XMC_GL
;
3484 if (strcmp (s
, "PR]") == 0)
3485 sym
->sy_tc
.class = XMC_PR
;
3488 if (strcmp (s
, "RO]") == 0)
3489 sym
->sy_tc
.class = XMC_RO
;
3490 else if (strcmp (s
, "RW]") == 0)
3491 sym
->sy_tc
.class = XMC_RW
;
3494 if (strcmp (s
, "SV]") == 0)
3495 sym
->sy_tc
.class = XMC_SV
;
3498 if (strcmp (s
, "TC]") == 0)
3499 sym
->sy_tc
.class = XMC_TC
;
3500 else if (strcmp (s
, "TI]") == 0)
3501 sym
->sy_tc
.class = XMC_TI
;
3502 else if (strcmp (s
, "TB]") == 0)
3503 sym
->sy_tc
.class = XMC_TB
;
3504 else if (strcmp (s
, "TC0]") == 0 || strcmp (s
, "T0]") == 0)
3505 sym
->sy_tc
.class = XMC_TC0
;
3508 if (strcmp (s
, "UA]") == 0)
3509 sym
->sy_tc
.class = XMC_UA
;
3510 else if (strcmp (s
, "UC]") == 0)
3511 sym
->sy_tc
.class = XMC_UC
;
3514 if (strcmp (s
, "XO]") == 0)
3515 sym
->sy_tc
.class = XMC_XO
;
3519 if (sym
->sy_tc
.class == -1)
3520 as_bad ("Unrecognized symbol suffix");
3523 /* Set the class of a label based on where it is defined. This
3524 handles symbols without suffixes. Also, move the symbol so that it
3525 follows the csect symbol. */
3528 ppc_frob_label (sym
)
3531 if (ppc_current_csect
!= (symbolS
*) NULL
)
3533 if (sym
->sy_tc
.class == -1)
3534 sym
->sy_tc
.class = ppc_current_csect
->sy_tc
.class;
3536 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
3537 symbol_append (sym
, ppc_current_csect
->sy_tc
.within
, &symbol_rootP
,
3539 ppc_current_csect
->sy_tc
.within
= sym
;
3543 /* This variable is set by ppc_frob_symbol if any absolute symbols are
3544 seen. It tells ppc_adjust_symtab whether it needs to look through
3547 static boolean ppc_saw_abs
;
3549 /* Change the name of a symbol just before writing it out. Set the
3550 real name if the .rename pseudo-op was used. Otherwise, remove any
3551 class suffix. Return 1 if the symbol should not be included in the
3555 ppc_frob_symbol (sym
)
3558 static symbolS
*ppc_last_function
;
3559 static symbolS
*set_end
;
3561 /* Discard symbols that should not be included in the output symbol
3563 if (! sym
->sy_used_in_reloc
3564 && ((sym
->bsym
->flags
& BSF_SECTION_SYM
) != 0
3565 || (! S_IS_EXTERNAL (sym
)
3566 && ! sym
->sy_tc
.output
3567 && S_GET_STORAGE_CLASS (sym
) != C_FILE
)))
3570 if (sym
->sy_tc
.real_name
!= (char *) NULL
)
3571 S_SET_NAME (sym
, sym
->sy_tc
.real_name
);
3577 name
= S_GET_NAME (sym
);
3578 s
= strchr (name
, '[');
3579 if (s
!= (char *) NULL
)
3585 snew
= xmalloc (len
+ 1);
3586 memcpy (snew
, name
, len
);
3589 S_SET_NAME (sym
, snew
);
3593 if (set_end
!= (symbolS
*) NULL
)
3595 SA_SET_SYM_ENDNDX (set_end
, sym
);
3599 if (SF_GET_FUNCTION (sym
))
3601 if (ppc_last_function
!= (symbolS
*) NULL
)
3602 as_warn ("two .function pseudo-ops with no intervening .ef");
3603 ppc_last_function
= sym
;
3604 if (sym
->sy_tc
.size
!= (symbolS
*) NULL
)
3606 resolve_symbol_value (sym
->sy_tc
.size
);
3607 SA_SET_SYM_FSIZE (sym
, (long) S_GET_VALUE (sym
->sy_tc
.size
));
3610 else if (S_GET_STORAGE_CLASS (sym
) == C_FCN
3611 && strcmp (S_GET_NAME (sym
), ".ef") == 0)
3613 if (ppc_last_function
== (symbolS
*) NULL
)
3614 as_warn (".ef with no preceding .function");
3617 set_end
= ppc_last_function
;
3618 ppc_last_function
= NULL
;
3620 /* We don't have a C_EFCN symbol, but we need to force the
3621 COFF backend to believe that it has seen one. */
3622 coff_last_function
= NULL
;
3626 if (! S_IS_EXTERNAL (sym
)
3627 && (sym
->bsym
->flags
& BSF_SECTION_SYM
) == 0
3628 && S_GET_STORAGE_CLASS (sym
) != C_FILE
3629 && S_GET_STORAGE_CLASS (sym
) != C_FCN
3630 && S_GET_STORAGE_CLASS (sym
) != C_BLOCK
3631 && S_GET_STORAGE_CLASS (sym
) != C_BSTAT
3632 && S_GET_STORAGE_CLASS (sym
) != C_ESTAT
3633 && S_GET_STORAGE_CLASS (sym
) != C_BINCL
3634 && S_GET_STORAGE_CLASS (sym
) != C_EINCL
3635 && S_GET_SEGMENT (sym
) != ppc_coff_debug_section
)
3636 S_SET_STORAGE_CLASS (sym
, C_HIDEXT
);
3638 if (S_GET_STORAGE_CLASS (sym
) == C_EXT
3639 || S_GET_STORAGE_CLASS (sym
) == C_HIDEXT
)
3642 union internal_auxent
*a
;
3644 /* Create a csect aux. */
3645 i
= S_GET_NUMBER_AUXILIARY (sym
);
3646 S_SET_NUMBER_AUXILIARY (sym
, i
+ 1);
3647 a
= &coffsymbol (sym
->bsym
)->native
[i
+ 1].u
.auxent
;
3648 if (sym
->sy_tc
.class == XMC_TC0
)
3650 /* This is the TOC table. */
3651 know (strcmp (S_GET_NAME (sym
), "TOC") == 0);
3652 a
->x_csect
.x_scnlen
.l
= 0;
3653 a
->x_csect
.x_smtyp
= (2 << 3) | XTY_SD
;
3655 else if (sym
->sy_tc
.subseg
!= 0)
3657 /* This is a csect symbol. x_scnlen is the size of the
3659 if (sym
->sy_tc
.next
== (symbolS
*) NULL
)
3660 a
->x_csect
.x_scnlen
.l
= (bfd_section_size (stdoutput
,
3661 S_GET_SEGMENT (sym
))
3662 - S_GET_VALUE (sym
));
3665 resolve_symbol_value (sym
->sy_tc
.next
);
3666 a
->x_csect
.x_scnlen
.l
= (S_GET_VALUE (sym
->sy_tc
.next
)
3667 - S_GET_VALUE (sym
));
3669 a
->x_csect
.x_smtyp
= (sym
->sy_tc
.align
<< 3) | XTY_SD
;
3671 else if (S_GET_SEGMENT (sym
) == bss_section
)
3673 /* This is a common symbol. */
3674 a
->x_csect
.x_scnlen
.l
= sym
->sy_frag
->fr_offset
;
3675 a
->x_csect
.x_smtyp
= (sym
->sy_tc
.align
<< 3) | XTY_CM
;
3676 if (S_IS_EXTERNAL (sym
))
3677 sym
->sy_tc
.class = XMC_RW
;
3679 sym
->sy_tc
.class = XMC_BS
;
3681 else if (S_GET_SEGMENT (sym
) == absolute_section
)
3683 /* This is an absolute symbol. The csect will be created by
3684 ppc_adjust_symtab. */
3686 a
->x_csect
.x_smtyp
= XTY_LD
;
3687 if (sym
->sy_tc
.class == -1)
3688 sym
->sy_tc
.class = XMC_XO
;
3690 else if (! S_IS_DEFINED (sym
))
3692 /* This is an external symbol. */
3693 a
->x_csect
.x_scnlen
.l
= 0;
3694 a
->x_csect
.x_smtyp
= XTY_ER
;
3696 else if (sym
->sy_tc
.class == XMC_TC
)
3700 /* This is a TOC definition. x_scnlen is the size of the
3702 next
= symbol_next (sym
);
3703 while (next
->sy_tc
.class == XMC_TC0
)
3704 next
= symbol_next (next
);
3705 if (next
== (symbolS
*) NULL
3706 || next
->sy_tc
.class != XMC_TC
)
3708 if (ppc_after_toc_frag
== (fragS
*) NULL
)
3709 a
->x_csect
.x_scnlen
.l
= (bfd_section_size (stdoutput
,
3711 - S_GET_VALUE (sym
));
3713 a
->x_csect
.x_scnlen
.l
= (ppc_after_toc_frag
->fr_address
3714 - S_GET_VALUE (sym
));
3718 resolve_symbol_value (next
);
3719 a
->x_csect
.x_scnlen
.l
= (S_GET_VALUE (next
)
3720 - S_GET_VALUE (sym
));
3722 a
->x_csect
.x_smtyp
= (2 << 3) | XTY_SD
;
3728 /* This is a normal symbol definition. x_scnlen is the
3729 symbol index of the containing csect. */
3730 if (S_GET_SEGMENT (sym
) == text_section
)
3731 csect
= ppc_text_csects
;
3732 else if (S_GET_SEGMENT (sym
) == data_section
)
3733 csect
= ppc_data_csects
;
3737 /* Skip the initial dummy symbol. */
3738 csect
= csect
->sy_tc
.next
;
3740 if (csect
== (symbolS
*) NULL
)
3742 as_warn ("warning: symbol %s has no csect", S_GET_NAME (sym
));
3743 a
->x_csect
.x_scnlen
.l
= 0;
3747 while (csect
->sy_tc
.next
!= (symbolS
*) NULL
)
3749 resolve_symbol_value (csect
->sy_tc
.next
);
3750 if (S_GET_VALUE (csect
->sy_tc
.next
) > S_GET_VALUE (sym
))
3752 csect
= csect
->sy_tc
.next
;
3755 a
->x_csect
.x_scnlen
.p
= coffsymbol (csect
->bsym
)->native
;
3756 coffsymbol (sym
->bsym
)->native
[i
+ 1].fix_scnlen
= 1;
3758 a
->x_csect
.x_smtyp
= XTY_LD
;
3761 a
->x_csect
.x_parmhash
= 0;
3762 a
->x_csect
.x_snhash
= 0;
3763 if (sym
->sy_tc
.class == -1)
3764 a
->x_csect
.x_smclas
= XMC_PR
;
3766 a
->x_csect
.x_smclas
= sym
->sy_tc
.class;
3767 a
->x_csect
.x_stab
= 0;
3768 a
->x_csect
.x_snstab
= 0;
3770 /* Don't let the COFF backend resort these symbols. */
3771 sym
->bsym
->flags
|= BSF_NOT_AT_END
;
3773 else if (S_GET_STORAGE_CLASS (sym
) == C_BSTAT
)
3775 /* We want the value to be the symbol index of the referenced
3776 csect symbol. BFD will do that for us if we set the right
3779 (valueT
) coffsymbol (sym
->sy_tc
.within
->bsym
)->native
);
3780 coffsymbol (sym
->bsym
)->native
->fix_value
= 1;
3782 else if (S_GET_STORAGE_CLASS (sym
) == C_STSYM
)
3787 /* The value is the offset from the enclosing csect. */
3788 block
= sym
->sy_tc
.within
;
3789 csect
= block
->sy_tc
.within
;
3790 resolve_symbol_value (csect
);
3791 S_SET_VALUE (sym
, S_GET_VALUE (sym
) - S_GET_VALUE (csect
));
3793 else if (S_GET_STORAGE_CLASS (sym
) == C_BINCL
3794 || S_GET_STORAGE_CLASS (sym
) == C_EINCL
)
3796 /* We want the value to be a file offset into the line numbers.
3797 BFD will do that for us if we set the right flags. We have
3798 already set the value correctly. */
3799 coffsymbol (sym
->bsym
)->native
->fix_line
= 1;
3805 /* Adjust the symbol table. This creates csect symbols for all
3806 absolute symbols. */
3809 ppc_adjust_symtab ()
3816 for (sym
= symbol_rootP
; sym
!= NULL
; sym
= symbol_next (sym
))
3820 union internal_auxent
*a
;
3822 if (S_GET_SEGMENT (sym
) != absolute_section
)
3825 csect
= symbol_create (".abs[XO]", absolute_section
,
3826 S_GET_VALUE (sym
), &zero_address_frag
);
3827 csect
->bsym
->value
= S_GET_VALUE (sym
);
3828 S_SET_STORAGE_CLASS (csect
, C_HIDEXT
);
3829 i
= S_GET_NUMBER_AUXILIARY (csect
);
3830 S_SET_NUMBER_AUXILIARY (csect
, i
+ 1);
3831 a
= &coffsymbol (csect
->bsym
)->native
[i
+ 1].u
.auxent
;
3832 a
->x_csect
.x_scnlen
.l
= 0;
3833 a
->x_csect
.x_smtyp
= XTY_SD
;
3834 a
->x_csect
.x_parmhash
= 0;
3835 a
->x_csect
.x_snhash
= 0;
3836 a
->x_csect
.x_smclas
= XMC_XO
;
3837 a
->x_csect
.x_stab
= 0;
3838 a
->x_csect
.x_snstab
= 0;
3840 symbol_insert (csect
, sym
, &symbol_rootP
, &symbol_lastP
);
3842 i
= S_GET_NUMBER_AUXILIARY (sym
);
3843 a
= &coffsymbol (sym
->bsym
)->native
[i
].u
.auxent
;
3844 a
->x_csect
.x_scnlen
.p
= coffsymbol (csect
->bsym
)->native
;
3845 coffsymbol (sym
->bsym
)->native
[i
].fix_scnlen
= 1;
3848 ppc_saw_abs
= false;
3851 /* Set the VMA for a section. This is called on all the sections in
3855 ppc_frob_section (sec
)
3858 static bfd_size_type vma
= 0;
3860 bfd_set_section_vma (stdoutput
, sec
, vma
);
3861 vma
+= bfd_section_size (stdoutput
, sec
);
3864 #endif /* OBJ_XCOFF */
3866 /* Turn a string in input_line_pointer into a floating point constant
3867 of type type, and store the appropriate bytes in *litp. The number
3868 of LITTLENUMS emitted is stored in *sizep . An error message is
3869 returned, or NULL on OK. */
3872 md_atof (type
, litp
, sizep
)
3878 LITTLENUM_TYPE words
[4];
3894 return "bad call to md_atof";
3897 t
= atof_ieee (input_line_pointer
, type
, words
);
3899 input_line_pointer
= t
;
3903 if (target_big_endian
)
3905 for (i
= 0; i
< prec
; i
++)
3907 md_number_to_chars (litp
, (valueT
) words
[i
], 2);
3913 for (i
= prec
- 1; i
>= 0; i
--)
3915 md_number_to_chars (litp
, (valueT
) words
[i
], 2);
3923 /* Write a value out to the object file, using the appropriate
3927 md_number_to_chars (buf
, val
, n
)
3932 if (target_big_endian
)
3933 number_to_chars_bigendian (buf
, val
, n
);
3935 number_to_chars_littleendian (buf
, val
, n
);
3938 /* Align a section (I don't know why this is machine dependent). */
3941 md_section_align (seg
, addr
)
3945 int align
= bfd_get_section_alignment (stdoutput
, seg
);
3947 return ((addr
+ (1 << align
) - 1) & (-1 << align
));
3950 /* We don't have any form of relaxing. */
3953 md_estimate_size_before_relax (fragp
, seg
)
3961 /* Convert a machine dependent frag. We never generate these. */
3964 md_convert_frag (abfd
, sec
, fragp
)
3972 /* We have no need to default values of symbols. */
3976 md_undefined_symbol (name
)
3982 /* Functions concerning relocs. */
3984 /* The location from which a PC relative jump should be calculated,
3985 given a PC relative reloc. */
3988 md_pcrel_from_section (fixp
, sec
)
3993 if (fixp
->fx_addsy
!= (symbolS
*) NULL
3994 && (! S_IS_DEFINED (fixp
->fx_addsy
)
3995 || TC_FORCE_RELOCATION_SECTION (fixp
, sec
)))
3999 return fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
4004 /* This is called to see whether a fixup should be adjusted to use a
4005 section symbol. We take the opportunity to change a fixup against
4006 a symbol in the TOC subsegment into a reloc against the
4007 corresponding .tc symbol. */
4010 ppc_fix_adjustable (fix
)
4015 resolve_symbol_value (fix
->fx_addsy
);
4016 val
= S_GET_VALUE (fix
->fx_addsy
);
4017 if (ppc_toc_csect
!= (symbolS
*) NULL
4018 && fix
->fx_addsy
!= (symbolS
*) NULL
4019 && fix
->fx_addsy
!= ppc_toc_csect
4020 && S_GET_SEGMENT (fix
->fx_addsy
) == data_section
4021 && val
>= ppc_toc_frag
->fr_address
4022 && (ppc_after_toc_frag
== (fragS
*) NULL
4023 || val
< ppc_after_toc_frag
->fr_address
))
4027 for (sy
= symbol_next (ppc_toc_csect
);
4028 sy
!= (symbolS
*) NULL
;
4029 sy
= symbol_next (sy
))
4031 if (sy
->sy_tc
.class == XMC_TC0
)
4033 if (sy
->sy_tc
.class != XMC_TC
)
4035 resolve_symbol_value (sy
);
4036 if (val
== S_GET_VALUE (sy
))
4039 fix
->fx_addnumber
= val
- ppc_toc_frag
->fr_address
;
4044 as_bad_where (fix
->fx_file
, fix
->fx_line
,
4045 "symbol in .toc does not match any .tc");
4048 /* Possibly adjust the reloc to be against the csect. */
4049 if (fix
->fx_addsy
!= (symbolS
*) NULL
4050 && fix
->fx_addsy
->sy_tc
.subseg
== 0
4051 && fix
->fx_addsy
->sy_tc
.class != XMC_TC0
4052 && fix
->fx_addsy
->sy_tc
.class != XMC_TC
4053 && S_GET_SEGMENT (fix
->fx_addsy
) != bss_section
)
4057 if (S_GET_SEGMENT (fix
->fx_addsy
) == text_section
)
4058 csect
= ppc_text_csects
;
4059 else if (S_GET_SEGMENT (fix
->fx_addsy
) == data_section
)
4060 csect
= ppc_data_csects
;
4064 /* Skip the initial dummy symbol. */
4065 csect
= csect
->sy_tc
.next
;
4067 if (csect
!= (symbolS
*) NULL
)
4069 while (csect
->sy_tc
.next
!= (symbolS
*) NULL
4070 && (csect
->sy_tc
.next
->sy_frag
->fr_address
4071 <= fix
->fx_addsy
->sy_frag
->fr_address
))
4072 csect
= csect
->sy_tc
.next
;
4074 fix
->fx_offset
+= (S_GET_VALUE (fix
->fx_addsy
)
4075 - csect
->sy_frag
->fr_address
);
4076 fix
->fx_addsy
= csect
;
4080 /* Adjust a reloc against a .lcomm symbol to be against the base
4082 if (fix
->fx_addsy
!= (symbolS
*) NULL
4083 && S_GET_SEGMENT (fix
->fx_addsy
) == bss_section
4084 && ! S_IS_EXTERNAL (fix
->fx_addsy
))
4086 resolve_symbol_value (fix
->fx_addsy
->sy_frag
->fr_symbol
);
4087 fix
->fx_offset
+= (S_GET_VALUE (fix
->fx_addsy
)
4088 - S_GET_VALUE (fix
->fx_addsy
->sy_frag
->fr_symbol
));
4089 fix
->fx_addsy
= fix
->fx_addsy
->sy_frag
->fr_symbol
;
4097 /* See whether a symbol is in the TOC section. */
4100 ppc_is_toc_sym (sym
)
4104 return sym
->sy_tc
.class == XMC_TC
;
4106 return strcmp (segment_name (S_GET_SEGMENT (sym
)), ".got") == 0;
4110 /* Apply a fixup to the object code. This is called for all the
4111 fixups we generated by the call to fix_new_exp, above. In the call
4112 above we used a reloc code which was the largest legal reloc code
4113 plus the operand index. Here we undo that to recover the operand
4114 index. At this point all symbol values should be fully resolved,
4115 and we attempt to completely resolve the reloc. If we can not do
4116 that, we determine the correct reloc code and put it back in the
4120 md_apply_fix3 (fixp
, valuep
, seg
)
4127 /* FIXME FIXME FIXME: The value we are passed in *valuep includes
4128 the symbol values. Since we are using BFD_ASSEMBLER, if we are
4129 doing this relocation the code in write.c is going to call
4130 bfd_perform_relocation, which is also going to use the symbol
4131 value. That means that if the reloc is fully resolved we want to
4132 use *valuep since bfd_perform_relocation is not being used.
4133 However, if the reloc is not fully resolved we do not want to use
4134 *valuep, and must use fx_offset instead. However, if the reloc
4135 is PC relative, we do want to use *valuep since it includes the
4136 result of md_pcrel_from. This is confusing. */
4138 if (fixp
->fx_addsy
== (symbolS
*) NULL
)
4143 else if (fixp
->fx_pcrel
)
4147 value
= fixp
->fx_offset
;
4148 if (fixp
->fx_subsy
!= (symbolS
*) NULL
)
4150 if (S_GET_SEGMENT (fixp
->fx_subsy
) == absolute_section
)
4151 value
-= S_GET_VALUE (fixp
->fx_subsy
);
4154 /* We can't actually support subtracting a symbol. */
4155 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
4156 "expression too complex");
4161 if ((int) fixp
->fx_r_type
>= (int) BFD_RELOC_UNUSED
)
4164 const struct powerpc_operand
*operand
;
4168 opindex
= (int) fixp
->fx_r_type
- (int) BFD_RELOC_UNUSED
;
4170 operand
= &powerpc_operands
[opindex
];
4173 /* It appears that an instruction like
4175 when LC..1 is not a TOC symbol does not generate a reloc. It
4176 uses the offset of LC..1 within its csect. However, .long
4177 LC..1 will generate a reloc. I can't find any documentation
4178 on how these cases are to be distinguished, so this is a wild
4179 guess. These cases are generated by gcc -mminimal-toc. */
4180 if ((operand
->flags
& PPC_OPERAND_PARENS
) != 0
4181 && operand
->bits
== 16
4182 && operand
->shift
== 0
4183 && operand
->insert
== NULL
4184 && fixp
->fx_addsy
!= NULL
4185 && fixp
->fx_addsy
->sy_tc
.subseg
!= 0
4186 && fixp
->fx_addsy
->sy_tc
.class != XMC_TC
4187 && fixp
->fx_addsy
->sy_tc
.class != XMC_TC0
4188 && S_GET_SEGMENT (fixp
->fx_addsy
) != bss_section
)
4190 value
= fixp
->fx_offset
;
4195 /* Fetch the instruction, insert the fully resolved operand
4196 value, and stuff the instruction back again. */
4197 where
= fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
;
4198 if (target_big_endian
)
4199 insn
= bfd_getb32 ((unsigned char *) where
);
4201 insn
= bfd_getl32 ((unsigned char *) where
);
4202 insn
= ppc_insert_operand (insn
, operand
, (offsetT
) value
,
4203 fixp
->fx_file
, fixp
->fx_line
);
4204 if (target_big_endian
)
4205 bfd_putb32 ((bfd_vma
) insn
, (unsigned char *) where
);
4207 bfd_putl32 ((bfd_vma
) insn
, (unsigned char *) where
);
4211 /* Nothing else to do here. */
4215 /* Determine a BFD reloc value based on the operand information.
4216 We are only prepared to turn a few of the operands into
4218 FIXME: We need to handle the DS field at the very least.
4219 FIXME: Selecting the reloc type is a bit haphazard; perhaps
4220 there should be a new field in the operand table. */
4221 if ((operand
->flags
& PPC_OPERAND_RELATIVE
) != 0
4222 && operand
->bits
== 26
4223 && operand
->shift
== 0)
4224 fixp
->fx_r_type
= BFD_RELOC_PPC_B26
;
4225 else if ((operand
->flags
& PPC_OPERAND_RELATIVE
) != 0
4226 && operand
->bits
== 16
4227 && operand
->shift
== 0)
4228 fixp
->fx_r_type
= BFD_RELOC_PPC_B16
;
4229 else if ((operand
->flags
& PPC_OPERAND_ABSOLUTE
) != 0
4230 && operand
->bits
== 26
4231 && operand
->shift
== 0)
4232 fixp
->fx_r_type
= BFD_RELOC_PPC_BA26
;
4233 else if ((operand
->flags
& PPC_OPERAND_ABSOLUTE
) != 0
4234 && operand
->bits
== 16
4235 && operand
->shift
== 0)
4236 fixp
->fx_r_type
= BFD_RELOC_PPC_BA16
;
4237 else if ((operand
->flags
& PPC_OPERAND_PARENS
) != 0
4238 && operand
->bits
== 16
4239 && operand
->shift
== 0
4240 && operand
->insert
== NULL
4241 && fixp
->fx_addsy
!= NULL
4242 && ppc_is_toc_sym (fixp
->fx_addsy
))
4245 if (target_big_endian
)
4246 fixp
->fx_where
+= 2;
4247 fixp
->fx_r_type
= BFD_RELOC_PPC_TOC16
;
4251 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
4252 "unresolved expression that must be resolved");
4260 ppc_elf_validate_fix (fixp
, seg
);
4262 switch (fixp
->fx_r_type
)
4265 case BFD_RELOC_CTOR
:
4267 fixp
->fx_r_type
= BFD_RELOC_32_PCREL
;
4271 case BFD_RELOC_32_PCREL
:
4272 md_number_to_chars (fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
,
4276 case BFD_RELOC_LO16
:
4277 case BFD_RELOC_HI16
:
4278 case BFD_RELOC_HI16_S
:
4280 case BFD_RELOC_GPREL16
:
4281 case BFD_RELOC_16_GOT_PCREL
:
4282 case BFD_RELOC_16_GOTOFF
:
4283 case BFD_RELOC_LO16_GOTOFF
:
4284 case BFD_RELOC_HI16_GOTOFF
:
4285 case BFD_RELOC_HI16_S_GOTOFF
:
4286 case BFD_RELOC_PPC_TOC16
:
4290 md_number_to_chars (fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
,
4298 md_number_to_chars (fixp
->fx_frag
->fr_literal
+ fixp
->fx_where
,
4304 "Gas failure, reloc value %d\n", fixp
->fx_r_type
);
4311 fixp
->fx_addnumber
= value
;
4313 if (fixp
->fx_r_type
!= BFD_RELOC_PPC_TOC16
)
4314 fixp
->fx_addnumber
= 0;
4318 fixp
->fx_addnumber
= 0;
4320 /* We want to use the offset within the data segment of the
4321 symbol, not the actual VMA of the symbol. */
4322 fixp
->fx_addnumber
=
4323 - bfd_get_section_vma (stdoutput
, S_GET_SEGMENT (fixp
->fx_addsy
));
4331 /* Generate a reloc for a fixup. */
4334 tc_gen_reloc (seg
, fixp
)
4340 reloc
= (arelent
*) bfd_alloc_by_size_t (stdoutput
, sizeof (arelent
));
4342 reloc
->sym_ptr_ptr
= &fixp
->fx_addsy
->bsym
;
4343 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
4344 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
4345 if (reloc
->howto
== (reloc_howto_type
*) NULL
)
4347 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
4348 "reloc %d not supported by object file format", (int)fixp
->fx_r_type
);
4351 reloc
->addend
= fixp
->fx_addnumber
;