bfd/
[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,
aa820537 3 2004, 2005, 2006, 2007, 2008, 2009 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
fa452fa6
PB
25#include "opcode/ppc.h"
26
252b5132 27struct fix;
252b5132
RH
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
252b5132
RH
34/* If OBJ_COFF is defined, and TE_PE is not defined, we are assembling
35 XCOFF for AIX or PowerMac. If TE_PE is defined, we are assembling
36 COFF for Windows NT. */
37
38#ifdef OBJ_COFF
39#ifndef TE_PE
40#define OBJ_XCOFF
41#endif
42#endif
43
44/* The target BFD architecture. */
45#define TARGET_ARCH (ppc_arch ())
7f6d05e8 46#define TARGET_MACH (ppc_mach ())
98027b10
AM
47extern enum bfd_architecture ppc_arch (void);
48extern unsigned long ppc_mach (void);
252b5132
RH
49
50/* Whether or not the target is big endian */
51extern int target_big_endian;
52
53/* The target BFD format. */
7f6d05e8 54#define TARGET_FORMAT (ppc_target_format ())
98027b10 55extern char *ppc_target_format (void);
252b5132
RH
56
57/* Permit temporary numeric labels. */
58#define LOCAL_LABELS_FB 1
59
60/* $ is used to refer to the current location. */
61#define DOLLAR_DOT
62
63/* Strings do not use backslash escapes under COFF. */
64#ifdef OBJ_COFF
65#define NO_STRING_ESCAPES
66#endif
67
68#ifdef OBJ_ELF
69#define DIFF_EXPR_OK /* foo-. gets turned into PC relative relocs */
70#endif
71
72#if TARGET_BYTES_BIG_ENDIAN
73#define PPC_BIG_ENDIAN 1
74#else
75#define PPC_BIG_ENDIAN 0
76#endif
77
78/* We don't need to handle .word strangely. */
79#define WORKING_DOT_WORD
80
0baf16f2
AM
81#define MAX_MEM_FOR_RS_ALIGN_CODE 4
82#define HANDLE_ALIGN(FRAGP) \
3aeeedbb
AM
83 if ((FRAGP)->fr_type == rs_align_code) \
84 ppc_handle_align (FRAGP);
85
86extern void ppc_handle_align (struct frag *);
87
88#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
0baf16f2 89
09b935ac
AM
90#define md_frag_check(FRAGP) \
91 if ((FRAGP)->has_code \
92 && (((FRAGP)->fr_address + (FRAGP)->insn_addr) & 3) != 0) \
93 as_bad_where ((FRAGP)->fr_file, (FRAGP)->fr_line, \
94 _("instruction address is not a multiple of 4"));
783de163
AM
95
96/* Arrange to store the value of ppc_cpu at the site of a fixup
97 for later use in md_apply_fix. */
98struct _ppc_fix_extra
99{
fa452fa6 100 ppc_cpu_t ppc_cpu;
783de163
AM
101};
102
fa452fa6 103extern ppc_cpu_t ppc_cpu;
783de163
AM
104
105#define TC_FIX_TYPE struct _ppc_fix_extra
106#define TC_INIT_FIX_DATA(FIXP) \
107 do { (FIXP)->tc_fix_data.ppc_cpu = ppc_cpu; } while (0)
252b5132
RH
108\f
109#ifdef TE_PE
110
111/* Question marks are permitted in symbol names. */
112#define LEX_QM 1
113
114/* Don't adjust TOC relocs. */
a161fe53 115#define tc_fix_adjustable(FIX) ppc_pe_fix_adjustable (FIX)
98027b10 116extern int ppc_pe_fix_adjustable (struct fix *);
252b5132
RH
117
118#endif
119
120#ifdef OBJ_XCOFF
121
122/* Declarations needed when generating XCOFF code. XCOFF is an
123 extension of COFF, used only on the RS/6000. Rather than create an
124 obj-xcoff, we just use obj-coff, and handle the extensions here in
125 tc-ppc. */
126
127/* We need to keep some information for symbols. */
128struct ppc_tc_sy
129{
130 /* We keep a few linked lists of symbols. */
49309057 131 symbolS *next;
85645aed
TG
132 /* The real name, if the symbol was renamed. */
133 char *real_name;
252b5132
RH
134 /* Non-zero if the symbol should be output. The RS/6000 assembler
135 only outputs symbols that are external or are mentioned in a
136 .globl or .lglobl statement. */
85645aed 137 unsigned char output;
252b5132 138 /* The symbol class. */
85645aed
TG
139 short symbol_class;
140 /* For a csect or common symbol, the alignment to use. */
141 unsigned char align;
252b5132
RH
142 /* For a csect symbol, the subsegment we are using. This is zero
143 for symbols that are not csects. */
144 subsegT subseg;
252b5132 145 /* For a csect symbol, the last symbol which has been defined in
2fb4b302
TG
146 this csect, or NULL if none have been defined so far.
147 For a .bs symbol, the referenced csect symbol.
148 For a label, the enclosing csect. */
49309057 149 symbolS *within;
85645aed
TG
150 union
151 {
152 /* For a function symbol, a symbol whose value is the size. The
153 field is NULL if there is no size. */
154 symbolS *size;
155 /* For a dwarf symbol, the corresponding dwarf subsection. */
156 struct dw_subsection *dw;
157 } u;
252b5132
RH
158};
159
160#define TC_SYMFIELD_TYPE struct ppc_tc_sy
161
162/* We need an additional auxent for function symbols. */
163#define OBJ_COFF_MAX_AUXENTRIES 2
164
165/* Square and curly brackets are permitted in symbol names. */
166#define LEX_BR 3
167
168/* Canonicalize the symbol name. */
169#define tc_canonicalize_symbol_name(name) ppc_canonicalize_symbol_name (name)
98027b10 170extern char *ppc_canonicalize_symbol_name (char *);
252b5132
RH
171
172/* Get the symbol class from the name. */
173#define tc_symbol_new_hook(sym) ppc_symbol_new_hook (sym)
98027b10 174extern void ppc_symbol_new_hook (symbolS *);
252b5132
RH
175
176/* Set the symbol class of a label based on the csect. */
177#define tc_frob_label(sym) ppc_frob_label (sym)
98027b10 178extern void ppc_frob_label (symbolS *);
252b5132
RH
179
180/* TOC relocs requires special handling. */
a161fe53 181#define tc_fix_adjustable(FIX) ppc_fix_adjustable (FIX)
98027b10 182extern int ppc_fix_adjustable (struct fix *);
252b5132 183
252b5132
RH
184/* We need to set the section VMA. */
185#define tc_frob_section(sec) ppc_frob_section (sec)
98027b10 186extern void ppc_frob_section (asection *);
252b5132
RH
187
188/* Finish up the symbol. */
189#define tc_frob_symbol(sym, punt) punt = ppc_frob_symbol (sym)
98027b10 190extern int ppc_frob_symbol (symbolS *);
252b5132
RH
191
192/* Finish up the entire symtab. */
193#define tc_adjust_symtab() ppc_adjust_symtab ()
98027b10 194extern void ppc_adjust_symtab (void);
252b5132 195
2c1c4c62
GK
196/* We also need to copy, in particular, the class of the symbol,
197 over what obj-coff would otherwise have copied. */
198#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src) \
199do { \
200 if (SF_GET_GET_SEGMENT (dest)) \
201 S_SET_SEGMENT (dest, S_GET_SEGMENT (src)); \
85645aed 202 symbol_get_tc (dest)->u = symbol_get_tc (src)->u; \
2c1c4c62 203 symbol_get_tc (dest)->align = symbol_get_tc (src)->align; \
96d56e9f 204 symbol_get_tc (dest)->symbol_class = symbol_get_tc (src)->symbol_class; \
2c1c4c62
GK
205 symbol_get_tc (dest)->within = symbol_get_tc (src)->within; \
206} while (0)
207
85645aed
TG
208extern void ppc_xcoff_end (void);
209#define md_end ppc_xcoff_end
210
2fb4b302
TG
211#define tc_new_dot_label(sym) ppc_new_dot_label (sym)
212extern void ppc_new_dot_label (symbolS *);
213
252b5132
RH
214#endif /* OBJ_XCOFF */
215
5ce8663f
NC
216extern const char ppc_symbol_chars[];
217#define tc_symbol_chars ppc_symbol_chars
218
252b5132
RH
219#ifdef OBJ_ELF
220
18ae9cc1 221/* Support for SHT_ORDERED */
98027b10 222extern int ppc_section_type (char *, size_t);
01e1a5bc 223extern int ppc_section_flags (flagword, bfd_vma, int);
252b5132 224
9de8d8f1 225#define md_elf_section_type(STR, LEN) ppc_section_type (STR, LEN)
252b5132
RH
226#define md_elf_section_flags(FLAGS, ATTR, TYPE) ppc_section_flags (FLAGS, ATTR, TYPE)
227
252b5132
RH
228#define tc_comment_chars ppc_comment_chars
229extern const char *ppc_comment_chars;
230
81d4177b 231/* Keep relocations relative to the GOT, or non-PC relative. */
a161fe53 232#define tc_fix_adjustable(FIX) ppc_fix_adjustable (FIX)
98027b10 233extern int ppc_fix_adjustable (struct fix *);
252b5132 234
55cf6793 235/* Values passed to md_apply_fix don't include symbol values. */
a161fe53 236#define MD_APPLY_SYM_VALUE(FIX) 0
252b5132 237
7e8d4ab4 238#define tc_frob_file_before_adjust ppc_frob_file_before_adjust
98027b10 239extern void ppc_frob_file_before_adjust (void);
0baf16f2 240
252b5132
RH
241#endif /* OBJ_ELF */
242
5f5c1f75 243#if defined (OBJ_ELF) || defined (OBJ_XCOFF)
a161fe53 244#define TC_FORCE_RELOCATION(FIX) ppc_force_relocation (FIX)
98027b10 245extern int ppc_force_relocation (struct fix *);
5f5c1f75 246#endif
a161fe53 247
252b5132 248/* call md_pcrel_from_section, not md_pcrel_from */
a161fe53 249#define MD_PCREL_FROM_SECTION(FIX, SEC) md_pcrel_from_section(FIX, SEC)
98027b10 250extern long md_pcrel_from_section (struct fix *, segT);
252b5132 251
9497f5ac 252#define md_parse_name(name, exp, mode, c) ppc_parse_name (name, exp)
98027b10 253extern int ppc_parse_name (const char *, struct expressionS *);
252b5132
RH
254
255#define md_operand(x)
6a0c61b7
EZ
256
257#define md_cleanup() ppc_cleanup ()
98027b10 258extern void ppc_cleanup (void);
75e21f08 259
38462edf
JJ
260/* ppc uses different register numbers between .eh_frame and .debug_frame.
261 This macro translates the .eh_frame register numbers to .debug_frame
262 register numbers. */
263#define md_reg_eh_frame_to_debug_frame(regno) \
264 ((regno) == 70 ? 64 /* cr2 */ : (regno))
265
75e21f08
JJ
266#define TARGET_USE_CFIPOP 1
267
268#define tc_cfi_frame_initial_instructions ppc_cfi_frame_initial_instructions
98027b10 269extern void ppc_cfi_frame_initial_instructions (void);
75e21f08
JJ
270
271#define tc_regname_to_dw2regnum tc_ppc_regname_to_dw2regnum
98027b10 272extern int tc_ppc_regname_to_dw2regnum (char *);
75e21f08
JJ
273
274extern int ppc_cie_data_alignment;
275
276#define DWARF2_LINE_MIN_INSN_LENGTH 4
277#define DWARF2_DEFAULT_RETURN_COLUMN 0x41
278#define DWARF2_CIE_DATA_ALIGNMENT ppc_cie_data_alignment
This page took 0.728269 seconds and 4 git commands to generate.