1 /* This file is tc-alpha.h
2 Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
3 Free Software Foundation, Inc.
4 Written by Ken Raeburn <raeburn@cygnus.com>.
6 This file is part of GAS, the GNU Assembler.
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)
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.
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
25 #define TARGET_BYTES_BIG_ENDIAN 0
27 #define WORKING_DOT_WORD
29 #define TARGET_ARCH bfd_arch_alpha
31 #define TARGET_FORMAT (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
32 ? "ecoff-littlealpha" \
33 : OUTPUT_FLAVOR == bfd_target_elf_flavour \
35 : OUTPUT_FLAVOR == bfd_target_evax_flavour \
39 #define NEED_LITERAL_POOL
40 #define REPEAT_CONS_EXPRESSIONS
42 extern void alpha_validate_fix
PARAMS ((struct fix
*));
43 extern int alpha_force_relocation
PARAMS ((struct fix
*));
44 extern int alpha_fix_adjustable
PARAMS ((struct fix
*));
46 extern unsigned long alpha_gprmask
, alpha_fprmask
;
47 extern valueT alpha_gp_value
;
49 #define TC_VALIDATE_FIX(FIXP,SEGTYPE,SKIP) alpha_validate_fix (FIXP)
50 #define TC_FORCE_RELOCATION(FIXP) alpha_force_relocation (FIXP)
51 #define tc_fix_adjustable(FIXP) alpha_fix_adjustable (FIXP)
52 #define RELOC_REQUIRES_SYMBOL
54 /* This expression evaluates to false if the relocation is for a local
55 object for which we still want to do the relocation at runtime.
56 True if we are willing to perform this relocation while building
57 the .o file. This is only used for pcrel relocations. */
59 #define TC_RELOC_RTSYM_LOC_FIXUP(FIX) \
60 ((FIX)->fx_addsy == NULL \
61 || (! S_IS_EXTERNAL ((FIX)->fx_addsy) \
62 && ! S_IS_WEAK ((FIX)->fx_addsy) \
63 && S_IS_DEFINED ((FIX)->fx_addsy) \
64 && ! S_IS_COMMON ((FIX)->fx_addsy)))
66 #define md_convert_frag(b,s,f) as_fatal ("alpha convert_frag\n")
67 #define md_estimate_size_before_relax(f,s) \
68 (as_fatal ("estimate_size_before_relax called"),1)
73 /* This field keeps the symbols position in the link section. */
74 #define OBJ_SYMFIELD_TYPE valueT
76 #define TC_CONS_FIX_NEW(FRAG,OFF,LEN,EXP) \
77 fix_new_exp (FRAG, OFF, (int)LEN, EXP, 0, \
78 LEN == 2 ? BFD_RELOC_16 \
79 : LEN == 4 ? BFD_RELOC_32 \
80 : LEN == 8 ? BFD_RELOC_64 \
81 : BFD_RELOC_ALPHA_LINKAGE);
84 #define md_number_to_chars number_to_chars_littleendian
86 extern int tc_get_register
PARAMS ((int frame
));
87 extern void alpha_frob_ecoff_data
PARAMS ((void));
89 #define tc_frob_label(sym) alpha_define_label (sym)
90 extern void alpha_define_label
PARAMS ((symbolS
*));
92 #define md_cons_align(nbytes) alpha_cons_align (nbytes)
93 extern void alpha_cons_align
PARAMS ((int));
95 #define HANDLE_ALIGN(fragp) alpha_handle_align (fragp)
96 extern void alpha_handle_align
PARAMS ((struct frag
*));
98 #define MAX_MEM_FOR_RS_ALIGN_CODE (3 + 4 + 8)
101 #define tc_frob_file_before_adjust() alpha_frob_file_before_adjust ()
102 extern void alpha_frob_file_before_adjust
PARAMS ((void));
105 #define DIFF_EXPR_OK /* foo-. gets turned into PC relative relocs */
108 #define ELF_TC_SPECIAL_SECTIONS \
109 { ".sdata", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_ALPHA_GPREL }, \
110 { ".sbss", SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_ALPHA_GPREL },
112 #define md_elf_section_letter alpha_elf_section_letter
113 extern int alpha_elf_section_letter
PARAMS ((int, char **));
114 #define md_elf_section_flags alpha_elf_section_flags
115 extern flagword alpha_elf_section_flags
PARAMS ((flagword
, int, int));
118 /* Whether to add support for explict !relocation_op!sequence_number. At the
119 moment, only do this for ELF, though ECOFF could use it as well. */
125 /* Before the relocations are written, reorder them, so that user
126 supplied !lituse relocations follow the appropriate !literal
127 relocations. Also convert the gas-internal relocations to the
128 appropriate linker relocations. */
129 #define tc_adjust_symtab() alpha_adjust_symtab ()
130 extern void alpha_adjust_symtab
PARAMS ((void));
132 /* New fields for supporting explicit relocations (such as !literal to mark
133 where a pointer is loaded from the global table, and !lituse_base to track
134 all of the normal uses of that pointer). */
136 #define TC_FIX_TYPE struct alpha_fix_tag
140 struct fix
*next_reloc
; /* next !lituse or !gpdisp */
141 struct alpha_reloc_tag
*info
; /* other members with same sequence */
144 /* Initialize the TC_FIX_TYPE field. */
145 #define TC_INIT_FIX_DATA(fixP) \
147 fixP->tc_fix_data.next_reloc = (struct fix *)0; \
148 fixP->tc_fix_data.info = (struct alpha_literal_tag *)0; \
151 /* Work with DEBUG5 to print fields in tc_fix_type. */
152 #define TC_FIX_DATA_PRINT(stream,fixP) \
154 if (fixP->tc_fix_data.info) \
155 fprintf (stderr, "\tinfo = 0x%lx, next_reloc = 0x%lx\n", \
156 (long)fixP->tc_fix_data.info, \
157 (long)fixP->tc_fix_data.next_reloc); \
160 #define DWARF2_LINE_MIN_INSN_LENGTH 4