source: trunk/binutils/gas/config/tc-ppc.h@ 2562

Last change on this file since 2562 was 610, checked in by bird, 22 years ago

This commit was generated by cvs2svn to compensate for changes in r609,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 8.7 KB
Line 
1/* tc-ppc.h -- Header file for tc-ppc.c.
2 Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
3 Free Software Foundation, Inc.
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
10 the Free Software Foundation; either version 2, or (at your option)
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
20 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
115#ifdef TE_PE
116
117/* Question marks are permitted in symbol names. */
118#define LEX_QM 1
119
120/* Don't adjust TOC relocs. */
121#define tc_fix_adjustable(FIX) ppc_pe_fix_adjustable (FIX)
122extern int ppc_pe_fix_adjustable PARAMS ((struct fix *));
123
124#endif
125
126#ifdef OBJ_XCOFF
127
128/* Declarations needed when generating XCOFF code. XCOFF is an
129 extension of COFF, used only on the RS/6000. Rather than create an
130 obj-xcoff, we just use obj-coff, and handle the extensions here in
131 tc-ppc. */
132
133/* We need to keep some information for symbols. */
134struct ppc_tc_sy
135{
136 /* We keep a few linked lists of symbols. */
137 symbolS *next;
138 /* Non-zero if the symbol should be output. The RS/6000 assembler
139 only outputs symbols that are external or are mentioned in a
140 .globl or .lglobl statement. */
141 int output;
142 /* The symbol class. */
143 int class;
144 /* The real name, if the symbol was renamed. */
145 char *real_name;
146 /* For a csect symbol, the subsegment we are using. This is zero
147 for symbols that are not csects. */
148 subsegT subseg;
149 /* For a csect or common symbol, the alignment to use. */
150 int align;
151 /* For a function symbol, a symbol whose value is the size. The
152 field is NULL if there is no size. */
153 symbolS *size;
154 /* For a csect symbol, the last symbol which has been defined in
155 this csect, or NULL if none have been defined so far. For a .bs
156 symbol, the referenced csect symbol. */
157 symbolS *within;
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)
170extern char *ppc_canonicalize_symbol_name PARAMS ((char *));
171
172/* Get the symbol class from the name. */
173#define tc_symbol_new_hook(sym) ppc_symbol_new_hook (sym)
174extern void ppc_symbol_new_hook PARAMS ((symbolS *));
175
176/* Set the symbol class of a label based on the csect. */
177#define tc_frob_label(sym) ppc_frob_label (sym)
178extern void ppc_frob_label PARAMS ((symbolS *));
179
180/* TOC relocs requires special handling. */
181#define tc_fix_adjustable(FIX) ppc_fix_adjustable (FIX)
182extern int ppc_fix_adjustable PARAMS ((struct fix *));
183
184/* We need to set the section VMA. */
185#define tc_frob_section(sec) ppc_frob_section (sec)
186extern void ppc_frob_section PARAMS ((asection *));
187
188/* Finish up the symbol. */
189#define tc_frob_symbol(sym, punt) punt = ppc_frob_symbol (sym)
190extern int ppc_frob_symbol PARAMS ((symbolS *));
191
192/* Finish up the entire symtab. */
193#define tc_adjust_symtab() ppc_adjust_symtab ()
194extern void ppc_adjust_symtab PARAMS ((void));
195
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)); \
202 symbol_get_tc (dest)->size = symbol_get_tc (src)->size; \
203 symbol_get_tc (dest)->align = symbol_get_tc (src)->align; \
204 symbol_get_tc (dest)->class = symbol_get_tc (src)->class; \
205 symbol_get_tc (dest)->within = symbol_get_tc (src)->within; \
206} while (0)
207
208#endif /* OBJ_XCOFF */
209
210#ifdef OBJ_ELF
211
212/* Support for SHF_EXCLUDE and SHT_ORDERED */
213extern int ppc_section_letter PARAMS ((int, char **));
214extern int ppc_section_type PARAMS ((char *, size_t));
215extern int ppc_section_word PARAMS ((char *, size_t));
216extern int ppc_section_flags PARAMS ((int, int, int));
217
218#define md_elf_section_letter(LETTER, PTR_MSG) ppc_section_letter (LETTER, PTR_MSG)
219#define md_elf_section_type(STR, LEN) ppc_section_type (STR, LEN)
220#define md_elf_section_word(STR, LEN) ppc_section_word (STR, LEN)
221#define md_elf_section_flags(FLAGS, ATTR, TYPE) ppc_section_flags (FLAGS, ATTR, TYPE)
222
223/* Add extra PPC sections -- Note, for now, make .sbss2 and .PPC.EMB.sbss0 a
224 normal section, and not a bss section so that the linker doesn't crater
225 when trying to make more than 2 sections. */
226#define ELF_TC_SPECIAL_SECTIONS \
227 { ".tags", SHT_ORDERED, SHF_ALLOC }, \
228 { ".sdata", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE }, \
229 { ".sbss", SHT_NOBITS, SHF_ALLOC + SHF_WRITE }, \
230 { ".sdata2", SHT_PROGBITS, SHF_ALLOC }, \
231 { ".sbss2", SHT_PROGBITS, SHF_ALLOC }, \
232 { ".PPC.EMB.apuinfo", SHT_NOTE, 0 }, \
233 { ".PPC.EMB.sdata0", SHT_PROGBITS, SHF_ALLOC }, \
234 { ".PPC.EMB.sbss0", SHT_PROGBITS, SHF_ALLOC }, \
235 /* Extra sections for 64-bit ELF PPC. */ \
236 { ".toc", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE}, \
237 { ".tocbss", SHT_NOBITS, SHF_ALLOC + SHF_WRITE},
238
239#define tc_comment_chars ppc_comment_chars
240extern const char *ppc_comment_chars;
241
242/* Keep relocations relative to the GOT, or non-PC relative. */
243#define tc_fix_adjustable(FIX) ppc_fix_adjustable (FIX)
244extern int ppc_fix_adjustable PARAMS ((struct fix *));
245
246/* Values passed to md_apply_fix3 don't include symbol values. */
247#define MD_APPLY_SYM_VALUE(FIX) 0
248
249#define tc_frob_file_before_adjust ppc_frob_file_before_adjust
250extern void ppc_frob_file_before_adjust PARAMS ((void));
251
252#define DWARF2_LINE_MIN_INSN_LENGTH 4
253#endif /* OBJ_ELF */
254
255#define TC_FORCE_RELOCATION(FIX) ppc_force_relocation (FIX)
256extern int ppc_force_relocation PARAMS ((struct fix *));
257
258/* call md_pcrel_from_section, not md_pcrel_from */
259#define MD_PCREL_FROM_SECTION(FIX, SEC) md_pcrel_from_section(FIX, SEC)
260extern long md_pcrel_from_section PARAMS ((struct fix *, segT));
261
262#define md_parse_name(name, exp, c) ppc_parse_name (name, exp)
263extern int ppc_parse_name PARAMS ((const char *, struct expressionS *));
264
265#define md_operand(x)
266
267#define md_cleanup() ppc_cleanup ()
268 extern void ppc_cleanup PARAMS ((void));
Note: See TracBrowser for help on using the repository browser.