1/* tc-ppc.h -- Header file for tc-ppc.c.
2   Copyright (C) 1994-2017 Free Software Foundation, Inc.
3   Written by Ian Lance Taylor, Cygnus Support.
4
5   This file is part of GAS, the GNU Assembler.
6
7   GAS is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 3, or (at your option)
10   any later version.
11
12   GAS is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with GAS; see the file COPYING.  If not, write to the Free
19   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
20   02110-1301, USA.  */
21
22#define TC_PPC
23
24#include "opcode/ppc.h"
25
26struct fix;
27
28/* Set the endianness we are using.  Default to big endian.  */
29#ifndef TARGET_BYTES_BIG_ENDIAN
30#define TARGET_BYTES_BIG_ENDIAN 1
31#endif
32
33/* If OBJ_COFF is defined, and TE_PE is not defined, we are assembling
34   XCOFF for AIX or PowerMac.  If TE_PE is defined, we are assembling
35   COFF for Windows NT.  */
36
37#ifdef OBJ_COFF
38#ifndef TE_PE
39#define OBJ_XCOFF
40#endif
41#endif
42
43/* The target BFD architecture.  */
44#define TARGET_ARCH (ppc_arch ())
45#define TARGET_MACH (ppc_mach ())
46extern enum bfd_architecture ppc_arch (void);
47extern unsigned long ppc_mach (void);
48
49/* Whether or not the target is big endian */
50extern int target_big_endian;
51
52/* The target BFD format.  */
53#define TARGET_FORMAT (ppc_target_format ())
54extern const char *ppc_target_format (void);
55
56/* Permit temporary numeric labels.  */
57#define LOCAL_LABELS_FB 1
58
59/* $ is used to refer to the current location.  */
60#define DOLLAR_DOT
61
62/* Strings do not use backslash escapes under COFF.  */
63#ifdef OBJ_COFF
64#define NO_STRING_ESCAPES
65#endif
66
67#ifdef OBJ_ELF
68#define DIFF_EXPR_OK		/* foo-. gets turned into PC relative relocs */
69#endif
70
71#if TARGET_BYTES_BIG_ENDIAN
72#define PPC_BIG_ENDIAN 1
73#else
74#define PPC_BIG_ENDIAN 0
75#endif
76
77/* We don't need to handle .word strangely.  */
78#define WORKING_DOT_WORD
79
80#define MAX_MEM_FOR_RS_ALIGN_CODE 4
81#define HANDLE_ALIGN(FRAGP)						\
82  if ((FRAGP)->fr_type == rs_align_code)				\
83    ppc_handle_align (FRAGP);
84
85extern void ppc_handle_align (struct frag *);
86extern void ppc_frag_check (struct frag *);
87
88#ifdef OBJ_ELF
89#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
90#endif
91
92#define md_frag_check(FRAGP) ppc_frag_check (FRAGP)
93
94/* Arrange to store the value of ppc_cpu at the site of a fixup
95   for later use in md_apply_fix.  */
96struct _ppc_fix_extra
97{
98  ppc_cpu_t ppc_cpu;
99};
100
101extern ppc_cpu_t ppc_cpu;
102
103#define TC_FIX_TYPE struct _ppc_fix_extra
104#define TC_INIT_FIX_DATA(FIXP) \
105  do { (FIXP)->tc_fix_data.ppc_cpu = ppc_cpu; } while (0)
106
107#ifdef TE_PE
108
109/* Question marks are permitted in symbol names.  */
110#define LEX_QM 1
111
112/* Don't adjust TOC relocs.  */
113#define tc_fix_adjustable(FIX) ppc_pe_fix_adjustable (FIX)
114extern int ppc_pe_fix_adjustable (struct fix *);
115
116#endif
117
118#ifdef OBJ_XCOFF
119
120/* Declarations needed when generating XCOFF code.  XCOFF is an
121   extension of COFF, used only on the RS/6000.  Rather than create an
122   obj-xcoff, we just use obj-coff, and handle the extensions here in
123   tc-ppc.  */
124
125/* We need to keep some information for symbols.  */
126struct ppc_tc_sy
127{
128  /* We keep a few linked lists of symbols.  */
129  symbolS *next;
130  /* The real name, if the symbol was renamed.  */
131  char *real_name;
132  /* Non-zero if the symbol should be output.  The RS/6000 assembler
133     only outputs symbols that are external or are mentioned in a
134     .globl or .lglobl statement.  */
135  unsigned char output;
136  /* The symbol class.  */
137  short symbol_class;
138  /* For a csect or common symbol, the alignment to use.  */
139  unsigned char align;
140  /* For a csect symbol, the subsegment we are using.  This is zero
141     for symbols that are not csects.  */
142  subsegT subseg;
143  /* For a csect symbol, the last symbol which has been defined in
144     this csect, or NULL if none have been defined so far.
145     For a .bs symbol, the referenced csect symbol.
146     For a label, the enclosing csect.  */
147  symbolS *within;
148  union
149  {
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 dwarf symbol, the corresponding dwarf subsection.  */
154    struct dw_subsection *dw;
155  } u;
156};
157
158#define TC_SYMFIELD_TYPE struct ppc_tc_sy
159
160/* We need an additional auxent for function symbols.  */
161#define OBJ_COFF_MAX_AUXENTRIES 2
162
163/* Square and curly brackets are permitted in symbol names.  */
164#define LEX_BR 3
165
166/* Canonicalize the symbol name.  */
167#define tc_canonicalize_symbol_name(name) ppc_canonicalize_symbol_name (name)
168extern char *ppc_canonicalize_symbol_name (char *);
169
170/* Get the symbol class from the name.  */
171#define tc_symbol_new_hook(sym) ppc_symbol_new_hook (sym)
172extern void ppc_symbol_new_hook (symbolS *);
173
174/* Set the symbol class of a label based on the csect.  */
175#define tc_frob_label(sym) ppc_frob_label (sym)
176extern void ppc_frob_label (symbolS *);
177
178/* TOC relocs requires special handling.  */
179#define tc_fix_adjustable(FIX) ppc_fix_adjustable (FIX)
180extern int ppc_fix_adjustable (struct fix *);
181
182/* We need to set the section VMA.  */
183#define tc_frob_section(sec) ppc_frob_section (sec)
184extern void ppc_frob_section (asection *);
185
186/* Finish up the symbol.  */
187#define tc_frob_symbol(sym, punt) punt = ppc_frob_symbol (sym)
188extern int ppc_frob_symbol (symbolS *);
189
190/* Finish up the entire symtab.  */
191#define tc_adjust_symtab() ppc_adjust_symtab ()
192extern void ppc_adjust_symtab (void);
193
194/* We also need to copy, in particular, the class of the symbol,
195   over what obj-coff would otherwise have copied.  */
196#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src)			\
197do {								\
198  if (SF_GET_GET_SEGMENT (dest))				\
199    S_SET_SEGMENT (dest, S_GET_SEGMENT (src));			\
200  symbol_get_tc (dest)->u = symbol_get_tc (src)->u;		\
201  symbol_get_tc (dest)->align = symbol_get_tc (src)->align;	\
202  symbol_get_tc (dest)->symbol_class = symbol_get_tc (src)->symbol_class;	\
203  symbol_get_tc (dest)->within = symbol_get_tc (src)->within;	\
204} while (0)
205
206extern void ppc_xcoff_end (void);
207#define md_end ppc_xcoff_end
208
209#define tc_new_dot_label(sym) ppc_new_dot_label (sym)
210extern void ppc_new_dot_label (symbolS *);
211
212#endif /* OBJ_XCOFF */
213
214extern const char       ppc_symbol_chars[];
215#define tc_symbol_chars ppc_symbol_chars
216
217#ifdef OBJ_ELF
218
219/* Support for SHT_ORDERED */
220extern int ppc_section_type (char *, size_t);
221extern int ppc_section_flags (flagword, bfd_vma, int);
222
223#define md_elf_section_type(STR, LEN)		ppc_section_type (STR, LEN)
224#define md_elf_section_flags(FLAGS, ATTR, TYPE)	ppc_section_flags (FLAGS, ATTR, TYPE)
225
226#define tc_comment_chars ppc_comment_chars
227extern const char *ppc_comment_chars;
228
229/* Keep relocations relative to the GOT, or non-PC relative.  */
230#define tc_fix_adjustable(FIX) ppc_fix_adjustable (FIX)
231extern int ppc_fix_adjustable (struct fix *);
232
233/* Values passed to md_apply_fix don't include symbol values.  */
234#define MD_APPLY_SYM_VALUE(FIX) 0
235
236#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \
237  ppc_elf_parse_cons (EXP, NBYTES)
238extern bfd_reloc_code_real_type ppc_elf_parse_cons (expressionS *,
239						    unsigned int);
240#define TC_CONS_FIX_CHECK(EXP, NBYTES, FIX) \
241  ppc_elf_cons_fix_check (EXP, NBYTES, FIX)
242extern void ppc_elf_cons_fix_check (expressionS *, unsigned int, struct fix *);
243
244#define tc_frob_file_before_adjust ppc_frob_file_before_adjust
245extern void ppc_frob_file_before_adjust (void);
246
247#define tc_adjust_symtab() ppc_elf_adjust_symtab ()
248extern void ppc_elf_adjust_symtab (void);
249
250extern void ppc_elf_end (void);
251#define md_end ppc_elf_end
252
253#endif /* OBJ_ELF */
254
255#if defined (OBJ_ELF) || defined (OBJ_XCOFF)
256#define TC_FORCE_RELOCATION(FIX) ppc_force_relocation (FIX)
257extern int ppc_force_relocation (struct fix *);
258#endif
259
260#ifdef OBJ_ELF
261/* Don't allow the generic code to convert fixups involving the
262   subtraction of a label in the current section to pc-relative if we
263   don't have the necessary pc-relative relocation.  */
264#define TC_FORCE_RELOCATION_SUB_LOCAL(FIX, SEG)		\
265  (!((FIX)->fx_r_type == BFD_RELOC_LO16			\
266     || (FIX)->fx_r_type == BFD_RELOC_HI16		\
267     || (FIX)->fx_r_type == BFD_RELOC_HI16_S		\
268     || (FIX)->fx_r_type == BFD_RELOC_64		\
269     || (FIX)->fx_r_type == BFD_RELOC_32		\
270     || (FIX)->fx_r_type == BFD_RELOC_16		\
271     || (FIX)->fx_r_type == BFD_RELOC_PPC_16DX_HA))
272#endif
273
274#define TC_VALIDATE_FIX_SUB(FIX, SEG) 0
275
276/* call md_pcrel_from_section, not md_pcrel_from */
277#define MD_PCREL_FROM_SECTION(FIX, SEC) md_pcrel_from_section(FIX, SEC)
278extern long md_pcrel_from_section (struct fix *, segT);
279
280#define md_parse_name(name, exp, mode, c) ppc_parse_name (name, exp)
281extern int ppc_parse_name (const char *, struct expressionS *);
282
283#define md_operand(x)
284
285#define md_cleanup() ppc_cleanup ()
286extern void ppc_cleanup (void);
287
288#if (defined TE_AIX5 || defined TE_AIX					\
289     || defined TE_FreeBSD || defined TE_NetBSD || defined TE_LYNX)
290/* ppc uses different register numbers between .eh_frame and .debug_frame.
291   This macro translates the .eh_frame register numbers to .debug_frame
292   register numbers.  */
293#define md_reg_eh_frame_to_debug_frame(regno)				\
294  ((regno) == 70 ? 64	/* cr2 */					\
295   : (regno) == 65 ? 108 /* lr */					\
296   : (regno) == 66 ? 109 /* ctr */					\
297   : (regno) >= 68 && (regno) <= 75 ? (regno) + 86 - 68 /* crN */	\
298   : (regno) == 76 ? 101 /* xer */					\
299   : (regno) >= 77 && (regno) <= 108 ? (regno) + 1124 - 77 /* vrN */	\
300   : (regno) == 109 ? 356 /* vrsave */					\
301   : (regno) == 110 ? 67 /* vscr */					\
302   : (regno) == 111 ? 99 /* spe_acc */					\
303   : (regno) == 112 ? 612 /* spefscr */					\
304   : (regno))
305#endif
306
307#define TARGET_USE_CFIPOP 1
308
309#define tc_cfi_frame_initial_instructions ppc_cfi_frame_initial_instructions
310extern void ppc_cfi_frame_initial_instructions (void);
311
312#define tc_regname_to_dw2regnum tc_ppc_regname_to_dw2regnum
313extern int tc_ppc_regname_to_dw2regnum (char *);
314
315extern int ppc_cie_data_alignment;
316
317extern int ppc_dwarf2_line_min_insn_length;
318
319#define DWARF2_LINE_MIN_INSN_LENGTH     ppc_dwarf2_line_min_insn_length
320#define DWARF2_DEFAULT_RETURN_COLUMN    0x41
321#define DWARF2_CIE_DATA_ALIGNMENT       ppc_cie_data_alignment
322