]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-ppc.h
* elf64-ppc.c (maybe_strip_output): Heed SEC_KEEP.
[thirdparty/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 *);
b9c361e0 87extern void ppc_frag_check (struct frag *);
3aeeedbb
AM
88
89#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
0baf16f2 90
b9c361e0 91#define md_frag_check(FRAGP) ppc_frag_check (FRAGP)
783de163
AM
92
93/* Arrange to store the value of ppc_cpu at the site of a fixup
94 for later use in md_apply_fix. */
95struct _ppc_fix_extra
96{
fa452fa6 97 ppc_cpu_t ppc_cpu;
783de163
AM
98};
99
fa452fa6 100extern ppc_cpu_t ppc_cpu;
783de163
AM
101
102#define TC_FIX_TYPE struct _ppc_fix_extra
103#define TC_INIT_FIX_DATA(FIXP) \
104 do { (FIXP)->tc_fix_data.ppc_cpu = ppc_cpu; } while (0)
252b5132
RH
105\f
106#ifdef TE_PE
107
108/* Question marks are permitted in symbol names. */
109#define LEX_QM 1
110
111/* Don't adjust TOC relocs. */
a161fe53 112#define tc_fix_adjustable(FIX) ppc_pe_fix_adjustable (FIX)
98027b10 113extern int ppc_pe_fix_adjustable (struct fix *);
252b5132
RH
114
115#endif
116
117#ifdef OBJ_XCOFF
118
119/* Declarations needed when generating XCOFF code. XCOFF is an
120 extension of COFF, used only on the RS/6000. Rather than create an
121 obj-xcoff, we just use obj-coff, and handle the extensions here in
122 tc-ppc. */
123
124/* We need to keep some information for symbols. */
125struct ppc_tc_sy
126{
127 /* We keep a few linked lists of symbols. */
49309057 128 symbolS *next;
85645aed
TG
129 /* The real name, if the symbol was renamed. */
130 char *real_name;
252b5132
RH
131 /* Non-zero if the symbol should be output. The RS/6000 assembler
132 only outputs symbols that are external or are mentioned in a
133 .globl or .lglobl statement. */
85645aed 134 unsigned char output;
252b5132 135 /* The symbol class. */
85645aed
TG
136 short symbol_class;
137 /* For a csect or common symbol, the alignment to use. */
138 unsigned char align;
252b5132
RH
139 /* For a csect symbol, the subsegment we are using. This is zero
140 for symbols that are not csects. */
141 subsegT subseg;
252b5132 142 /* For a csect symbol, the last symbol which has been defined in
2fb4b302
TG
143 this csect, or NULL if none have been defined so far.
144 For a .bs symbol, the referenced csect symbol.
145 For a label, the enclosing csect. */
49309057 146 symbolS *within;
85645aed
TG
147 union
148 {
149 /* For a function symbol, a symbol whose value is the size. The
150 field is NULL if there is no size. */
151 symbolS *size;
152 /* For a dwarf symbol, the corresponding dwarf subsection. */
153 struct dw_subsection *dw;
154 } u;
252b5132
RH
155};
156
157#define TC_SYMFIELD_TYPE struct ppc_tc_sy
158
159/* We need an additional auxent for function symbols. */
160#define OBJ_COFF_MAX_AUXENTRIES 2
161
162/* Square and curly brackets are permitted in symbol names. */
163#define LEX_BR 3
164
165/* Canonicalize the symbol name. */
166#define tc_canonicalize_symbol_name(name) ppc_canonicalize_symbol_name (name)
98027b10 167extern char *ppc_canonicalize_symbol_name (char *);
252b5132
RH
168
169/* Get the symbol class from the name. */
170#define tc_symbol_new_hook(sym) ppc_symbol_new_hook (sym)
98027b10 171extern void ppc_symbol_new_hook (symbolS *);
252b5132
RH
172
173/* Set the symbol class of a label based on the csect. */
174#define tc_frob_label(sym) ppc_frob_label (sym)
98027b10 175extern void ppc_frob_label (symbolS *);
252b5132
RH
176
177/* TOC relocs requires special handling. */
a161fe53 178#define tc_fix_adjustable(FIX) ppc_fix_adjustable (FIX)
98027b10 179extern int ppc_fix_adjustable (struct fix *);
252b5132 180
252b5132
RH
181/* We need to set the section VMA. */
182#define tc_frob_section(sec) ppc_frob_section (sec)
98027b10 183extern void ppc_frob_section (asection *);
252b5132
RH
184
185/* Finish up the symbol. */
186#define tc_frob_symbol(sym, punt) punt = ppc_frob_symbol (sym)
98027b10 187extern int ppc_frob_symbol (symbolS *);
252b5132
RH
188
189/* Finish up the entire symtab. */
190#define tc_adjust_symtab() ppc_adjust_symtab ()
98027b10 191extern void ppc_adjust_symtab (void);
252b5132 192
2c1c4c62
GK
193/* We also need to copy, in particular, the class of the symbol,
194 over what obj-coff would otherwise have copied. */
195#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src) \
196do { \
197 if (SF_GET_GET_SEGMENT (dest)) \
198 S_SET_SEGMENT (dest, S_GET_SEGMENT (src)); \
85645aed 199 symbol_get_tc (dest)->u = symbol_get_tc (src)->u; \
2c1c4c62 200 symbol_get_tc (dest)->align = symbol_get_tc (src)->align; \
96d56e9f 201 symbol_get_tc (dest)->symbol_class = symbol_get_tc (src)->symbol_class; \
2c1c4c62
GK
202 symbol_get_tc (dest)->within = symbol_get_tc (src)->within; \
203} while (0)
204
85645aed
TG
205extern void ppc_xcoff_end (void);
206#define md_end ppc_xcoff_end
207
2fb4b302
TG
208#define tc_new_dot_label(sym) ppc_new_dot_label (sym)
209extern void ppc_new_dot_label (symbolS *);
210
252b5132
RH
211#endif /* OBJ_XCOFF */
212
5ce8663f
NC
213extern const char ppc_symbol_chars[];
214#define tc_symbol_chars ppc_symbol_chars
215
252b5132
RH
216#ifdef OBJ_ELF
217
18ae9cc1 218/* Support for SHT_ORDERED */
98027b10 219extern int ppc_section_type (char *, size_t);
01e1a5bc 220extern int ppc_section_flags (flagword, bfd_vma, int);
252b5132 221
9de8d8f1 222#define md_elf_section_type(STR, LEN) ppc_section_type (STR, LEN)
252b5132
RH
223#define md_elf_section_flags(FLAGS, ATTR, TYPE) ppc_section_flags (FLAGS, ATTR, TYPE)
224
252b5132
RH
225#define tc_comment_chars ppc_comment_chars
226extern const char *ppc_comment_chars;
227
81d4177b 228/* Keep relocations relative to the GOT, or non-PC relative. */
a161fe53 229#define tc_fix_adjustable(FIX) ppc_fix_adjustable (FIX)
98027b10 230extern int ppc_fix_adjustable (struct fix *);
252b5132 231
55cf6793 232/* Values passed to md_apply_fix don't include symbol values. */
a161fe53 233#define MD_APPLY_SYM_VALUE(FIX) 0
252b5132 234
7e8d4ab4 235#define tc_frob_file_before_adjust ppc_frob_file_before_adjust
98027b10 236extern void ppc_frob_file_before_adjust (void);
0baf16f2 237
252b5132
RH
238#endif /* OBJ_ELF */
239
5f5c1f75 240#if defined (OBJ_ELF) || defined (OBJ_XCOFF)
a161fe53 241#define TC_FORCE_RELOCATION(FIX) ppc_force_relocation (FIX)
98027b10 242extern int ppc_force_relocation (struct fix *);
5f5c1f75 243#endif
a161fe53 244
252b5132 245/* call md_pcrel_from_section, not md_pcrel_from */
a161fe53 246#define MD_PCREL_FROM_SECTION(FIX, SEC) md_pcrel_from_section(FIX, SEC)
98027b10 247extern long md_pcrel_from_section (struct fix *, segT);
252b5132 248
9497f5ac 249#define md_parse_name(name, exp, mode, c) ppc_parse_name (name, exp)
98027b10 250extern int ppc_parse_name (const char *, struct expressionS *);
252b5132
RH
251
252#define md_operand(x)
6a0c61b7
EZ
253
254#define md_cleanup() ppc_cleanup ()
98027b10 255extern void ppc_cleanup (void);
75e21f08 256
38462edf
JJ
257/* ppc uses different register numbers between .eh_frame and .debug_frame.
258 This macro translates the .eh_frame register numbers to .debug_frame
259 register numbers. */
260#define md_reg_eh_frame_to_debug_frame(regno) \
261 ((regno) == 70 ? 64 /* cr2 */ : (regno))
262
75e21f08
JJ
263#define TARGET_USE_CFIPOP 1
264
265#define tc_cfi_frame_initial_instructions ppc_cfi_frame_initial_instructions
98027b10 266extern void ppc_cfi_frame_initial_instructions (void);
75e21f08
JJ
267
268#define tc_regname_to_dw2regnum tc_ppc_regname_to_dw2regnum
98027b10 269extern int tc_ppc_regname_to_dw2regnum (char *);
75e21f08
JJ
270
271extern int ppc_cie_data_alignment;
272
8fbf7334
JL
273extern int ppc_dwarf2_line_min_insn_length;
274
275#define DWARF2_LINE_MIN_INSN_LENGTH ppc_dwarf2_line_min_insn_length
75e21f08
JJ
276#define DWARF2_DEFAULT_RETURN_COLUMN 0x41
277#define DWARF2_CIE_DATA_ALIGNMENT ppc_cie_data_alignment