* config/tc-alpha.h: Fix formatting.
[external/binutils.git] / gas / config / tc-alpha.h
1 /* This file is tc-alpha.h
2    Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000
3    Free Software Foundation, Inc.
4    Written by Ken Raeburn <raeburn@cygnus.com>.
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_ALPHA
24
25 #define TARGET_BYTES_BIG_ENDIAN 0
26
27 #define WORKING_DOT_WORD
28
29 #define TARGET_ARCH                     bfd_arch_alpha
30
31 #define TARGET_FORMAT (OUTPUT_FLAVOR == bfd_target_ecoff_flavour        \
32                        ? "ecoff-littlealpha"                            \
33                        : OUTPUT_FLAVOR == bfd_target_elf_flavour        \
34                        ? "elf64-alpha"                                  \
35                        : OUTPUT_FLAVOR == bfd_target_evax_flavour       \
36                        ? "vms-alpha"                                    \
37                        : "unknown-format")
38
39 #define NEED_LITERAL_POOL
40 #define TC_HANDLES_FX_DONE
41 #define REPEAT_CONS_EXPRESSIONS
42
43 extern int alpha_force_relocation PARAMS ((struct fix *));
44 extern int alpha_fix_adjustable PARAMS ((struct fix *));
45
46 extern unsigned long alpha_gprmask, alpha_fprmask;
47 extern valueT alpha_gp_value;
48
49 #define TC_FORCE_RELOCATION(FIXP)       alpha_force_relocation (FIXP)
50 #define tc_fix_adjustable(FIXP)         alpha_fix_adjustable (FIXP)
51 #define RELOC_REQUIRES_SYMBOL
52
53 /* This expression evaluates to false if the relocation is for a local
54    object for which we still want to do the relocation at runtime.
55    True if we are willing to perform this relocation while building
56    the .o file.  This is only used for pcrel relocations.  */
57
58 #define TC_RELOC_RTSYM_LOC_FIXUP(FIX)                           \
59   ((FIX)->fx_addsy == NULL                                      \
60    || (! S_IS_EXTERNAL ((FIX)->fx_addsy)                        \
61        && ! S_IS_WEAK ((FIX)->fx_addsy)                         \
62        && S_IS_DEFINED ((FIX)->fx_addsy)                        \
63        && ! S_IS_COMMON ((FIX)->fx_addsy)))
64
65 #define md_convert_frag(b,s,f)          as_fatal ("alpha convert_frag\n")
66 #define md_estimate_size_before_relax(f,s) \
67                         (as_fatal ("estimate_size_before_relax called"),1)
68 #define md_operand(x)
69
70 #ifdef OBJ_EVAX
71
72 /* This field keeps the symbols position in the link section.  */
73 #define OBJ_SYMFIELD_TYPE valueT
74
75 #define TC_CONS_FIX_NEW(FRAG,OFF,LEN,EXP) \
76       fix_new_exp (FRAG, OFF, (int)LEN, EXP, 0, \
77         LEN == 2 ? BFD_RELOC_16 \
78         : LEN == 4 ? BFD_RELOC_32 \
79         : LEN == 8 ? BFD_RELOC_64 \
80         : BFD_RELOC_ALPHA_LINKAGE);
81 #endif
82
83 #define md_number_to_chars              number_to_chars_littleendian
84
85 extern int tc_get_register PARAMS ((int frame));
86 extern void alpha_frob_ecoff_data PARAMS ((void));
87
88 #define tc_frob_label(sym) alpha_define_label (sym)
89 extern void alpha_define_label PARAMS ((symbolS *));
90
91 #define md_cons_align(nbytes) alpha_cons_align (nbytes)
92 extern void alpha_cons_align PARAMS ((int));
93
94 #define HANDLE_ALIGN(fragp) alpha_handle_align (fragp)
95 extern void alpha_handle_align PARAMS ((struct frag *));
96
97 #define MAX_MEM_FOR_RS_ALIGN_CODE  (3 + 4 + 8)
98
99 #ifdef OBJ_ECOFF
100 #define tc_frob_file_before_adjust() alpha_frob_file_before_adjust ()
101 extern void alpha_frob_file_before_adjust PARAMS ((void));
102 #endif
103
104 #define DIFF_EXPR_OK   /* foo-. gets turned into PC relative relocs */
105
106 #ifdef OBJ_ELF
107 #define ELF_TC_SPECIAL_SECTIONS \
108   { ".sdata",   SHT_PROGBITS,   SHF_ALLOC + SHF_WRITE + SHF_ALPHA_GPREL  }, \
109   { ".sbss",    SHT_NOBITS,     SHF_ALLOC + SHF_WRITE + SHF_ALPHA_GPREL  },
110 #endif
111
112 /* Whether to add support for explict !relocation_op!sequence_number.  At the
113    moment, only do this for ELF, though ECOFF could use it as well.  */
114
115 #ifdef OBJ_ELF
116 #define RELOC_OP_P
117 #endif
118
119 #ifdef RELOC_OP_P
120 /* Before the relocations are written, reorder them, so that user supplied
121    !lituse relocations follow the appropriate !literal relocations.  Also
122    convert the gas-internal relocations to the appropriate linker relocations.
123    */
124 #define tc_adjust_symtab() alpha_adjust_symtab ()
125 extern void alpha_adjust_symtab PARAMS ((void));
126
127 /* New fields for supporting explicit relocations (such as !literal to mark
128    where a pointer is loaded from the global table, and !lituse_base to track
129    all of the normal uses of that pointer).  */
130
131 #define TC_FIX_TYPE struct alpha_fix_tag
132
133 struct alpha_fix_tag
134 {
135   struct fix *next_lituse;              /* next !lituse */
136   struct alpha_literal_tag *info;       /* other members with same sequence */
137 };
138
139 /* Initialize the TC_FIX_TYPE field.  */
140 #define TC_INIT_FIX_DATA(fixP)                                          \
141 do {                                                                    \
142   fixP->tc_fix_data.next_lituse = (struct fix *)0;                      \
143   fixP->tc_fix_data.info = (struct alpha_literal_tag *)0;               \
144 } while (0)
145
146 /* Work with DEBUG5 to print fields in tc_fix_type.  */
147 #define TC_FIX_DATA_PRINT(stream,fixP)                                  \
148 do {                                                                    \
149   if (fixP->tc_fix_data.info)                                           \
150     fprintf (stderr, "\tinfo = 0x%lx, next_lituse = 0x%lx\n", \
151              (long)fixP->tc_fix_data.info,                              \
152              (long)fixP->tc_fix_data.next_lituse);                      \
153 } while (0)
154 #endif
155
156 #define DWARF2_LINE_MIN_INSN_LENGTH 4