binutils/
[deliverable/binutils-gdb.git] / gas / config / tc-ppc.h
CommitLineData
252b5132 1/* tc-ppc.h -- Header file for tc-ppc.c.
09b935ac 2 Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
98027b10 3 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
252b5132
RH
4 Written by Ian Lance Taylor, Cygnus Support.
5
6 This file is part of GAS, the GNU Assembler.
7
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
ec2655a6 10 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
11 any later version.
12
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
4b4da160
NC
20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 02110-1301, USA. */
252b5132
RH
22
23#define TC_PPC
24
252b5132 25struct fix;
252b5132
RH
26
27/* Set the endianness we are using. Default to big endian. */
28#ifndef TARGET_BYTES_BIG_ENDIAN
29#define TARGET_BYTES_BIG_ENDIAN 1
30#endif
31
252b5132
RH
32/* If OBJ_COFF is defined, and TE_PE is not defined, we are assembling
33 XCOFF for AIX or PowerMac. If TE_PE is defined, we are assembling
34 COFF for Windows NT. */
35
36#ifdef OBJ_COFF
37#ifndef TE_PE
38#define OBJ_XCOFF
39#endif
40#endif
41
42/* The target BFD architecture. */
43#define TARGET_ARCH (ppc_arch ())
7f6d05e8 44#define TARGET_MACH (ppc_mach ())
98027b10
AM
45extern enum bfd_architecture ppc_arch (void);
46extern unsigned long ppc_mach (void);
252b5132
RH
47
48/* Whether or not the target is big endian */
49extern int target_big_endian;
50
51/* The target BFD format. */
7f6d05e8 52#define TARGET_FORMAT (ppc_target_format ())
98027b10 53extern char *ppc_target_format (void);
252b5132
RH
54
55/* Permit temporary numeric labels. */
56#define LOCAL_LABELS_FB 1
57
58/* $ is used to refer to the current location. */
59#define DOLLAR_DOT
60
61/* Strings do not use backslash escapes under COFF. */
62#ifdef OBJ_COFF
63#define NO_STRING_ESCAPES
64#endif
65
66#ifdef OBJ_ELF
67#define DIFF_EXPR_OK /* foo-. gets turned into PC relative relocs */
68#endif
69
70#if TARGET_BYTES_BIG_ENDIAN
71#define PPC_BIG_ENDIAN 1
72#else
73#define PPC_BIG_ENDIAN 0
74#endif
75
76/* We don't need to handle .word strangely. */
77#define WORKING_DOT_WORD
78
0baf16f2
AM
79#define MAX_MEM_FOR_RS_ALIGN_CODE 4
80#define HANDLE_ALIGN(FRAGP) \
3aeeedbb
AM
81 if ((FRAGP)->fr_type == rs_align_code) \
82 ppc_handle_align (FRAGP);
83
84extern void ppc_handle_align (struct frag *);
85
86#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
0baf16f2 87
09b935ac
AM
88#define md_frag_check(FRAGP) \
89 if ((FRAGP)->has_code \
90 && (((FRAGP)->fr_address + (FRAGP)->insn_addr) & 3) != 0) \
91 as_bad_where ((FRAGP)->fr_file, (FRAGP)->fr_line, \
92 _("instruction address is not a multiple of 4"));
252b5132
RH
93\f
94#ifdef TE_PE
95
96/* Question marks are permitted in symbol names. */
97#define LEX_QM 1
98
99/* Don't adjust TOC relocs. */
a161fe53 100#define tc_fix_adjustable(FIX) ppc_pe_fix_adjustable (FIX)
98027b10 101extern int ppc_pe_fix_adjustable (struct fix *);
252b5132
RH
102
103#endif
104
105#ifdef OBJ_XCOFF
106
107/* Declarations needed when generating XCOFF code. XCOFF is an
108 extension of COFF, used only on the RS/6000. Rather than create an
109 obj-xcoff, we just use obj-coff, and handle the extensions here in
110 tc-ppc. */
111
112/* We need to keep some information for symbols. */
113struct ppc_tc_sy
114{
115 /* We keep a few linked lists of symbols. */
49309057 116 symbolS *next;
252b5132
RH
117 /* Non-zero if the symbol should be output. The RS/6000 assembler
118 only outputs symbols that are external or are mentioned in a
119 .globl or .lglobl statement. */
120 int output;
121 /* The symbol class. */
122 int class;
123 /* The real name, if the symbol was renamed. */
124 char *real_name;
125 /* For a csect symbol, the subsegment we are using. This is zero
126 for symbols that are not csects. */
127 subsegT subseg;
128 /* For a csect or common symbol, the alignment to use. */
129 int align;
130 /* For a function symbol, a symbol whose value is the size. The
131 field is NULL if there is no size. */
49309057 132 symbolS *size;
252b5132
RH
133 /* For a csect symbol, the last symbol which has been defined in
134 this csect, or NULL if none have been defined so far. For a .bs
135 symbol, the referenced csect symbol. */
49309057 136 symbolS *within;
252b5132
RH
137};
138
139#define TC_SYMFIELD_TYPE struct ppc_tc_sy
140
141/* We need an additional auxent for function symbols. */
142#define OBJ_COFF_MAX_AUXENTRIES 2
143
144/* Square and curly brackets are permitted in symbol names. */
145#define LEX_BR 3
146
147/* Canonicalize the symbol name. */
148#define tc_canonicalize_symbol_name(name) ppc_canonicalize_symbol_name (name)
98027b10 149extern char *ppc_canonicalize_symbol_name (char *);
252b5132
RH
150
151/* Get the symbol class from the name. */
152#define tc_symbol_new_hook(sym) ppc_symbol_new_hook (sym)
98027b10 153extern void ppc_symbol_new_hook (symbolS *);
252b5132
RH
154
155/* Set the symbol class of a label based on the csect. */
156#define tc_frob_label(sym) ppc_frob_label (sym)
98027b10 157extern void ppc_frob_label (symbolS *);
252b5132
RH
158
159/* TOC relocs requires special handling. */
a161fe53 160#define tc_fix_adjustable(FIX) ppc_fix_adjustable (FIX)
98027b10 161extern int ppc_fix_adjustable (struct fix *);
252b5132 162
252b5132
RH
163/* We need to set the section VMA. */
164#define tc_frob_section(sec) ppc_frob_section (sec)
98027b10 165extern void ppc_frob_section (asection *);
252b5132
RH
166
167/* Finish up the symbol. */
168#define tc_frob_symbol(sym, punt) punt = ppc_frob_symbol (sym)
98027b10 169extern int ppc_frob_symbol (symbolS *);
252b5132
RH
170
171/* Finish up the entire symtab. */
172#define tc_adjust_symtab() ppc_adjust_symtab ()
98027b10 173extern void ppc_adjust_symtab (void);
252b5132 174
2c1c4c62
GK
175/* We also need to copy, in particular, the class of the symbol,
176 over what obj-coff would otherwise have copied. */
177#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src) \
178do { \
179 if (SF_GET_GET_SEGMENT (dest)) \
180 S_SET_SEGMENT (dest, S_GET_SEGMENT (src)); \
181 symbol_get_tc (dest)->size = symbol_get_tc (src)->size; \
182 symbol_get_tc (dest)->align = symbol_get_tc (src)->align; \
183 symbol_get_tc (dest)->class = symbol_get_tc (src)->class; \
184 symbol_get_tc (dest)->within = symbol_get_tc (src)->within; \
185} while (0)
186
252b5132
RH
187#endif /* OBJ_XCOFF */
188
5ce8663f
NC
189extern const char ppc_symbol_chars[];
190#define tc_symbol_chars ppc_symbol_chars
191
252b5132
RH
192#ifdef OBJ_ELF
193
252b5132 194/* Support for SHF_EXCLUDE and SHT_ORDERED */
98027b10
AM
195extern int ppc_section_letter (int, char **);
196extern int ppc_section_type (char *, size_t);
197extern int ppc_section_word (char *, size_t);
198extern int ppc_section_flags (int, int, int);
252b5132
RH
199
200#define md_elf_section_letter(LETTER, PTR_MSG) ppc_section_letter (LETTER, PTR_MSG)
9de8d8f1
RH
201#define md_elf_section_type(STR, LEN) ppc_section_type (STR, LEN)
202#define md_elf_section_word(STR, LEN) ppc_section_word (STR, LEN)
252b5132
RH
203#define md_elf_section_flags(FLAGS, ATTR, TYPE) ppc_section_flags (FLAGS, ATTR, TYPE)
204
252b5132
RH
205#define tc_comment_chars ppc_comment_chars
206extern const char *ppc_comment_chars;
207
81d4177b 208/* Keep relocations relative to the GOT, or non-PC relative. */
a161fe53 209#define tc_fix_adjustable(FIX) ppc_fix_adjustable (FIX)
98027b10 210extern int ppc_fix_adjustable (struct fix *);
252b5132 211
55cf6793 212/* Values passed to md_apply_fix don't include symbol values. */
a161fe53 213#define MD_APPLY_SYM_VALUE(FIX) 0
252b5132 214
7e8d4ab4 215#define tc_frob_file_before_adjust ppc_frob_file_before_adjust
98027b10 216extern void ppc_frob_file_before_adjust (void);
0baf16f2 217
252b5132
RH
218#endif /* OBJ_ELF */
219
5f5c1f75 220#if defined (OBJ_ELF) || defined (OBJ_XCOFF)
a161fe53 221#define TC_FORCE_RELOCATION(FIX) ppc_force_relocation (FIX)
98027b10 222extern int ppc_force_relocation (struct fix *);
5f5c1f75 223#endif
a161fe53 224
252b5132 225/* call md_pcrel_from_section, not md_pcrel_from */
a161fe53 226#define MD_PCREL_FROM_SECTION(FIX, SEC) md_pcrel_from_section(FIX, SEC)
98027b10 227extern long md_pcrel_from_section (struct fix *, segT);
252b5132 228
9497f5ac 229#define md_parse_name(name, exp, mode, c) ppc_parse_name (name, exp)
98027b10 230extern int ppc_parse_name (const char *, struct expressionS *);
252b5132
RH
231
232#define md_operand(x)
6a0c61b7
EZ
233
234#define md_cleanup() ppc_cleanup ()
98027b10 235extern void ppc_cleanup (void);
75e21f08
JJ
236
237#define TARGET_USE_CFIPOP 1
238
239#define tc_cfi_frame_initial_instructions ppc_cfi_frame_initial_instructions
98027b10 240extern void ppc_cfi_frame_initial_instructions (void);
75e21f08
JJ
241
242#define tc_regname_to_dw2regnum tc_ppc_regname_to_dw2regnum
98027b10 243extern int tc_ppc_regname_to_dw2regnum (char *);
75e21f08
JJ
244
245extern int ppc_cie_data_alignment;
246
247#define DWARF2_LINE_MIN_INSN_LENGTH 4
248#define DWARF2_DEFAULT_RETURN_COLUMN 0x41
249#define DWARF2_CIE_DATA_ALIGNMENT ppc_cie_data_alignment
This page took 0.421635 seconds and 4 git commands to generate.