tc-ppc.h revision 89857
1258945Sroberto/* tc-ppc.h -- Header file for tc-ppc.c.
2258945Sroberto   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
3258945Sroberto   Free Software Foundation, Inc.
4258945Sroberto   Written by Ian Lance Taylor, Cygnus Support.
5258945Sroberto
6258945Sroberto   This file is part of GAS, the GNU Assembler.
7258945Sroberto
8258945Sroberto   GAS is free software; you can redistribute it and/or modify
9258945Sroberto   it under the terms of the GNU General Public License as published by
10258945Sroberto   the Free Software Foundation; either version 2, or (at your option)
11258945Sroberto   any later version.
12280849Scy
13280849Scy   GAS is distributed in the hope that it will be useful,
14280849Scy   but WITHOUT ANY WARRANTY; without even the implied warranty of
15280849Scy   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16280849Scy   GNU General Public License for more details.
17280849Scy
18258945Sroberto   You should have received a copy of the GNU General Public License
19258945Sroberto   along with GAS; see the file COPYING.  If not, write to the Free
20258945Sroberto   Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21   02111-1307, USA.  */
22
23#define TC_PPC
24
25#ifdef ANSI_PROTOTYPES
26struct fix;
27#endif
28
29/* Set the endianness we are using.  Default to big endian.  */
30#ifndef TARGET_BYTES_BIG_ENDIAN
31#define TARGET_BYTES_BIG_ENDIAN 1
32#endif
33
34#ifndef BFD_ASSEMBLER
35 #error PowerPC support requires BFD_ASSEMBLER
36#endif
37
38/* If OBJ_COFF is defined, and TE_PE is not defined, we are assembling
39   XCOFF for AIX or PowerMac.  If TE_PE is defined, we are assembling
40   COFF for Windows NT.  */
41
42#ifdef OBJ_COFF
43#ifndef TE_PE
44#define OBJ_XCOFF
45#endif
46#endif
47
48/* The target BFD architecture.  */
49#define TARGET_ARCH (ppc_arch ())
50#define TARGET_MACH (ppc_mach ())
51extern enum bfd_architecture ppc_arch PARAMS ((void));
52extern unsigned long ppc_mach PARAMS ((void));
53
54/* Whether or not the target is big endian */
55extern int target_big_endian;
56
57/* The target BFD format.  */
58#define TARGET_FORMAT (ppc_target_format ())
59extern char *ppc_target_format PARAMS ((void));
60
61/* Permit temporary numeric labels.  */
62#define LOCAL_LABELS_FB 1
63
64/* $ is used to refer to the current location.  */
65#define DOLLAR_DOT
66
67/* Strings do not use backslash escapes under COFF.  */
68#ifdef OBJ_COFF
69#define NO_STRING_ESCAPES
70#endif
71
72#ifdef OBJ_ELF
73#define DIFF_EXPR_OK		/* foo-. gets turned into PC relative relocs */
74#endif
75
76#if TARGET_BYTES_BIG_ENDIAN
77#define PPC_BIG_ENDIAN 1
78#else
79#define PPC_BIG_ENDIAN 0
80#endif
81
82/* We don't need to handle .word strangely.  */
83#define WORKING_DOT_WORD
84
85#define MAX_MEM_FOR_RS_ALIGN_CODE 4
86#define HANDLE_ALIGN(FRAGP)						\
87  if ((FRAGP)->fr_type == rs_align_code) 				\
88    {									\
89      valueT count = ((FRAGP)->fr_next->fr_address			\
90		      - ((FRAGP)->fr_address + (FRAGP)->fr_fix));	\
91      if (count != 0 && (count & 3) == 0)				\
92	{								\
93	  unsigned char *dest = (FRAGP)->fr_literal + (FRAGP)->fr_fix;	\
94									\
95	  (FRAGP)->fr_var = 4;						\
96	  if (target_big_endian)					\
97	    {								\
98	      *dest++ = 0x60;						\
99	      *dest++ = 0;						\
100	      *dest++ = 0;						\
101	      *dest++ = 0;						\
102	    }								\
103	  else								\
104	    {								\
105	      *dest++ = 0;						\
106	      *dest++ = 0;						\
107	      *dest++ = 0;						\
108	      *dest++ = 0x60;						\
109	    }								\
110	}								\
111    }
112
113
114#ifdef TE_PE
115
116/* Question marks are permitted in symbol names.  */
117#define LEX_QM 1
118
119/* Don't adjust TOC relocs.  */
120#define tc_fix_adjustable(fixp) ppc_pe_fix_adjustable (fixp)
121extern int ppc_pe_fix_adjustable PARAMS ((struct fix *));
122
123#endif
124
125#ifdef OBJ_XCOFF
126
127/* Declarations needed when generating XCOFF code.  XCOFF is an
128   extension of COFF, used only on the RS/6000.  Rather than create an
129   obj-xcoff, we just use obj-coff, and handle the extensions here in
130   tc-ppc.  */
131
132/* We need to keep some information for symbols.  */
133struct ppc_tc_sy
134{
135  /* We keep a few linked lists of symbols.  */
136  symbolS *next;
137  /* Non-zero if the symbol should be output.  The RS/6000 assembler
138     only outputs symbols that are external or are mentioned in a
139     .globl or .lglobl statement.  */
140  int output;
141  /* The symbol class.  */
142  int class;
143  /* The real name, if the symbol was renamed.  */
144  char *real_name;
145  /* For a csect symbol, the subsegment we are using.  This is zero
146     for symbols that are not csects.  */
147  subsegT subseg;
148  /* For a csect or common symbol, the alignment to use.  */
149  int align;
150  /* For a function symbol, a symbol whose value is the size.  The
151     field is NULL if there is no size.  */
152  symbolS *size;
153  /* For a csect symbol, the last symbol which has been defined in
154     this csect, or NULL if none have been defined so far.  For a .bs
155     symbol, the referenced csect symbol.  */
156  symbolS *within;
157};
158
159#define TC_SYMFIELD_TYPE struct ppc_tc_sy
160
161/* We need an additional auxent for function symbols.  */
162#define OBJ_COFF_MAX_AUXENTRIES 2
163
164/* Square and curly brackets are permitted in symbol names.  */
165#define LEX_BR 3
166
167/* Canonicalize the symbol name.  */
168#define tc_canonicalize_symbol_name(name) ppc_canonicalize_symbol_name (name)
169extern char *ppc_canonicalize_symbol_name PARAMS ((char *));
170
171/* Get the symbol class from the name.  */
172#define tc_symbol_new_hook(sym) ppc_symbol_new_hook (sym)
173extern void ppc_symbol_new_hook PARAMS ((symbolS *));
174
175/* Set the symbol class of a label based on the csect.  */
176#define tc_frob_label(sym) ppc_frob_label (sym)
177extern void ppc_frob_label PARAMS ((symbolS *));
178
179/* TOC relocs requires special handling.  */
180#define tc_fix_adjustable(fixp) ppc_fix_adjustable (fixp)
181extern int ppc_fix_adjustable PARAMS ((struct fix *));
182
183/* A relocation from one csect to another must be kept.  */
184#define TC_FORCE_RELOCATION(FIXP) ppc_force_relocation (FIXP)
185extern int ppc_force_relocation PARAMS ((struct fix *));
186
187/* We need to set the section VMA.  */
188#define tc_frob_section(sec) ppc_frob_section (sec)
189extern void ppc_frob_section PARAMS ((asection *));
190
191/* Finish up the symbol.  */
192#define tc_frob_symbol(sym, punt) punt = ppc_frob_symbol (sym)
193extern int ppc_frob_symbol PARAMS ((symbolS *));
194
195/* Finish up the entire symtab.  */
196#define tc_adjust_symtab() ppc_adjust_symtab ()
197extern void ppc_adjust_symtab PARAMS ((void));
198
199/* Niclas Andersson <nican@ida.liu.se> says this is needed.  */
200extern int ppc_subseg_align PARAMS ((void));
201#define SUB_SEGMENT_ALIGN(SEG) ppc_subseg_align()
202
203/* We also need to copy, in particular, the class of the symbol,
204   over what obj-coff would otherwise have copied.  */
205#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src)			\
206do {								\
207  if (SF_GET_GET_SEGMENT (dest))				\
208    S_SET_SEGMENT (dest, S_GET_SEGMENT (src));			\
209  symbol_get_tc (dest)->size = symbol_get_tc (src)->size;	\
210  symbol_get_tc (dest)->align = symbol_get_tc (src)->align;	\
211  symbol_get_tc (dest)->class = symbol_get_tc (src)->class;	\
212  symbol_get_tc (dest)->within = symbol_get_tc (src)->within;	\
213} while (0)
214
215#endif /* OBJ_XCOFF */
216
217#ifdef OBJ_ELF
218
219/* Branch prediction relocations must force relocation, as must
220   the vtable description relocs.  */
221#define TC_FORCE_RELOCATION(FIXP)					\
222((FIXP)->fx_r_type == BFD_RELOC_PPC_B16_BRTAKEN				\
223 || (FIXP)->fx_r_type == BFD_RELOC_PPC_B16_BRNTAKEN			\
224 || (FIXP)->fx_r_type == BFD_RELOC_PPC_BA16_BRTAKEN			\
225 || (FIXP)->fx_r_type == BFD_RELOC_PPC_BA16_BRNTAKEN			\
226 || (BFD_DEFAULT_TARGET_SIZE == 64					\
227     && (FIXP)->fx_r_type == BFD_RELOC_PPC64_TOC)			\
228 || (FIXP)->fx_r_type == BFD_RELOC_VTABLE_INHERIT			\
229 || (FIXP)->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
230
231#define TC_FORCE_RELOCATION_SECTION(FIXP,SEC)				\
232(TC_FORCE_RELOCATION (FIXP)						\
233 || ((FIXP)->fx_addsy && !(FIXP)->fx_subsy				\
234     && S_GET_SEGMENT ((FIXP)->fx_addsy) != SEC))
235
236/* Support for SHF_EXCLUDE and SHT_ORDERED */
237extern int ppc_section_letter PARAMS ((int, char **));
238extern int ppc_section_type PARAMS ((char *, size_t));
239extern int ppc_section_word PARAMS ((char *, size_t));
240extern int ppc_section_flags PARAMS ((int, int, int));
241
242#define md_elf_section_letter(LETTER, PTR_MSG)	ppc_section_letter (LETTER, PTR_MSG)
243#define md_elf_section_type(STR, LEN)		ppc_section_type (STR, LEN)
244#define md_elf_section_word(STR, LEN)		ppc_section_word (STR, LEN)
245#define md_elf_section_flags(FLAGS, ATTR, TYPE)	ppc_section_flags (FLAGS, ATTR, TYPE)
246
247#if BFD_DEFAULT_TARGET_SIZE == 64
248/* Extra sections for 64-bit ELF PPC. */
249#define ELF_TC_SPECIAL_SECTIONS \
250  { ".toc",		SHT_PROGBITS,	SHF_ALLOC + SHF_WRITE}, \
251  { ".tocbss",		SHT_NOBITS,	SHF_ALLOC + SHF_WRITE},
252#else
253/* Add extra PPC sections -- Note, for now, make .sbss2 and .PPC.EMB.sbss0 a
254   normal section, and not a bss section so that the linker doesn't crater
255   when trying to make more than 2 sections.  */
256#define ELF_TC_SPECIAL_SECTIONS \
257  { ".tags",		SHT_ORDERED,	SHF_ALLOC }, \
258  { ".sdata",		SHT_PROGBITS,	SHF_ALLOC + SHF_WRITE }, \
259  { ".sbss",		SHT_NOBITS,	SHF_ALLOC + SHF_WRITE }, \
260  { ".sdata2",		SHT_PROGBITS,	SHF_ALLOC }, \
261  { ".sbss2",		SHT_PROGBITS,	SHF_ALLOC }, \
262  { ".PPC.EMB.sdata0",	SHT_PROGBITS,	SHF_ALLOC }, \
263  { ".PPC.EMB.sbss0",	SHT_PROGBITS,	SHF_ALLOC },
264#endif
265
266#define tc_comment_chars ppc_comment_chars
267extern const char *ppc_comment_chars;
268
269/* Keep relocations relative to the GOT, or non-PC relative.  */
270#define tc_fix_adjustable(fixp) ppc_fix_adjustable (fixp)
271extern int ppc_fix_adjustable PARAMS ((struct fix *));
272
273/* We must never ever try to resolve references to externally visible
274   symbols in the assembler, because the .o file might go into a shared
275   library, and some other shared library might override that symbol.  */
276#define TC_RELOC_RTSYM_LOC_FIXUP(FIX)  \
277  ((FIX)->fx_addsy == NULL \
278   || (! S_IS_EXTERNAL ((FIX)->fx_addsy) \
279       && ! S_IS_WEAK ((FIX)->fx_addsy) \
280       && S_IS_DEFINED ((FIX)->fx_addsy) \
281       && ! S_IS_COMMON ((FIX)->fx_addsy)))
282
283#if BFD_DEFAULT_TARGET_SIZE == 64
284/* Finish up the symbol.  */
285#define tc_frob_symbol(sym, punt) punt = ppc_elf_frob_symbol (sym)
286extern int ppc_elf_frob_symbol PARAMS ((symbolS *));
287#endif
288
289#define DWARF2_LINE_MIN_INSN_LENGTH 4
290#endif /* OBJ_ELF */
291
292/* call md_pcrel_from_section, not md_pcrel_from */
293#define MD_PCREL_FROM_SECTION(FIXP, SEC) md_pcrel_from_section(FIXP, SEC)
294extern long md_pcrel_from_section PARAMS ((struct fix *, segT));
295
296#define md_parse_name(name, exp, c) ppc_parse_name (name, exp)
297extern int ppc_parse_name PARAMS ((const char *, struct expressionS *));
298
299#define md_operand(x)
300