1  /* tc-mips.h -- header file for tc-mips.c.
       2     Copyright (C) 1993-2023 Free Software Foundation, Inc.
       3     Contributed by the OSF and Ralph Campbell.
       4     Written by Keith Knowles and Ralph Campbell, working independently.
       5     Modified for ECOFF support by Ian Lance Taylor of Cygnus Support.
       6  
       7     This file is part of GAS.
       8  
       9     GAS is free software; you can redistribute it and/or modify
      10     it under the terms of the GNU General Public License as published by
      11     the Free Software Foundation; either version 3, or (at your option)
      12     any later version.
      13  
      14     GAS is distributed in the hope that it will be useful,
      15     but WITHOUT ANY WARRANTY; without even the implied warranty of
      16     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      17     GNU General Public License for more details.
      18  
      19     You should have received a copy of the GNU General Public License
      20     along with GAS; see the file COPYING.  If not, write to the Free
      21     Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
      22     02110-1301, USA.  */
      23  
      24  #ifndef TC_MIPS
      25  #define TC_MIPS
      26  
      27  struct frag;
      28  struct expressionS;
      29  
      30  /* Default to big endian.  */
      31  #ifndef TARGET_BYTES_BIG_ENDIAN
      32  #define TARGET_BYTES_BIG_ENDIAN		1
      33  #endif
      34  
      35  #define TARGET_ARCH bfd_arch_mips
      36  
      37  #define WORKING_DOT_WORD	1
      38  #define OLD_FLOAT_READS
      39  #define REPEAT_CONS_EXPRESSIONS
      40  #define RELOC_EXPANSION_POSSIBLE
      41  #define MAX_RELOC_EXPANSION 3
      42  #define LOCAL_LABELS_FB 1
      43  
      44  #define TC_ADDRESS_BYTES mips_address_bytes
      45  extern int mips_address_bytes (void);
      46  
      47  /* Maximum symbol offset that can be encoded in a BFD_RELOC_GPREL16
      48     relocation.  */
      49  #define MAX_GPREL_OFFSET (0x7FF0)
      50  
      51  #define md_relax_frag(segment, fragp, stretch) \
      52    mips_relax_frag(segment, fragp, stretch)
      53  extern int mips_relax_frag (asection *, struct frag *, long);
      54  
      55  #define md_undefined_symbol(name)	(0)
      56  #define md_operand(x)
      57  
      58  extern char mips_nop_opcode (void);
      59  #define NOP_OPCODE (mips_nop_opcode ())
      60  
      61  extern void mips_handle_align (struct frag *);
      62  #define HANDLE_ALIGN(fragp)  mips_handle_align (fragp)
      63  
      64  #define MAX_MEM_FOR_RS_ALIGN_CODE  (3 + 4)
      65  
      66  struct insn_label_list;
      67  struct mips_segment_info {
      68    struct insn_label_list *labels;
      69    unsigned int mips16 : 1;
      70    unsigned int micromips : 1;
      71  };
      72  #define TC_SEGMENT_INFO_TYPE struct mips_segment_info
      73  
      74  /* This field is nonzero if the symbol is the target of a MIPS16 jump.  */
      75  #define TC_SYMFIELD_TYPE int
      76  
      77  /* Tell assembler that we have an itbl_mips.h header file to include.  */
      78  #define HAVE_ITBL_CPU
      79  
      80  /* The endianness of the target format may change based on command
      81     line arguments.  */
      82  #define TARGET_FORMAT mips_target_format()
      83  extern const char *mips_target_format (void);
      84  
      85  /* MIPS PIC level.  */
      86  
      87  enum mips_pic_level
      88  {
      89    /* Do not generate PIC code.  */
      90    NO_PIC,
      91  
      92    /* Generate PIC code as in the SVR4 MIPS ABI.  */
      93    SVR4_PIC,
      94  
      95    /* VxWorks's PIC model.  */
      96    VXWORKS_PIC
      97  };
      98  
      99  extern enum mips_pic_level mips_pic;
     100  
     101  extern int tc_get_register (int frame);
     102  
     103  #define md_after_parse_args() mips_after_parse_args()
     104  extern void mips_after_parse_args (void);
     105  
     106  #define tc_init_after_args() mips_init_after_args()
     107  extern void mips_init_after_args (void);
     108  
     109  #define md_parse_long_option(arg) mips_parse_long_option (arg)
     110  extern int mips_parse_long_option (const char *);
     111  
     112  #define tc_frob_label(sym) mips_define_label (sym)
     113  extern void mips_define_label (symbolS *);
     114  
     115  #define tc_new_dot_label(sym) mips_add_dot_label (sym)
     116  extern void mips_add_dot_label (symbolS *);
     117  
     118  #define tc_frob_file_before_adjust() mips_frob_file_before_adjust ()
     119  extern void mips_frob_file_before_adjust (void);
     120  
     121  #define tc_frob_file_before_fix() mips_frob_file ()
     122  extern void mips_frob_file (void);
     123  
     124  #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
     125  #define tc_frob_file_after_relocs mips_frob_file_after_relocs
     126  extern void mips_frob_file_after_relocs (void);
     127  #endif
     128  
     129  #ifdef TE_IRIX
     130  #define tc_frob_symbol(sym, punt) mips_frob_symbol (sym)
     131  extern void mips_frob_symbol (symbolS *);
     132  #endif
     133  
     134  #define tc_fix_adjustable(fixp) mips_fix_adjustable (fixp)
     135  extern int mips_fix_adjustable (struct fix *);
     136  
     137  /* Values passed to md_apply_fix don't include symbol values.  */
     138  #define MD_APPLY_SYM_VALUE(FIX) 0
     139  
     140  /* Global syms must not be resolved, to support ELF shared libraries.  */
     141  #define EXTERN_FORCE_RELOC			\
     142    (OUTPUT_FLAVOR == bfd_target_elf_flavour)
     143  
     144  #define TC_FORCE_RELOCATION(FIX) mips_force_relocation (FIX)
     145  extern int mips_force_relocation (struct fix *);
     146  
     147  #define TC_FORCE_RELOCATION_SUB_SAME(FIX, SEG) \
     148    (GENERIC_FORCE_RELOCATION_SUB_SAME (FIX, SEG) \
     149     || mips_force_relocation (FIX))
     150  
     151  #define TC_FORCE_RELOCATION_ABS(FIX) mips_force_relocation_abs (FIX)
     152  extern bool mips_force_relocation_abs (struct fix *);
     153  
     154  /* Register mask variables.  These are set by the MIPS assembly code
     155     and used by ECOFF and possibly other object file formats.  */
     156  extern unsigned long mips_gprmask;
     157  extern unsigned long mips_cprmask[4];
     158  
     159  #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
     160  
     161  #define elf_tc_final_processing mips_elf_final_processing
     162  extern void mips_elf_final_processing (void);
     163  
     164  #endif
     165  
     166  extern void mips_md_finish (void);
     167  #define md_finish()	mips_md_finish()
     168  
     169  extern void mips_pop_insert (void);
     170  #define md_pop_insert()		mips_pop_insert()
     171  
     172  extern void mips_emit_delays (void);
     173  #define md_flush_pending_output mips_emit_delays
     174  
     175  extern void mips_enable_auto_align (void);
     176  #define md_elf_section_change_hook()	mips_enable_auto_align()
     177  
     178  #ifdef TE_IRIX
     179  enum dwarf2_format;
     180  extern enum dwarf2_format mips_dwarf2_format (asection *);
     181  # define DWARF2_FORMAT(SEC) mips_dwarf2_format (SEC)
     182  #else
     183  /* Use GAS' defaults.  */
     184  #endif
     185  
     186  extern int mips_dwarf2_addr_size (void);
     187  #define DWARF2_ADDR_SIZE(bfd) mips_dwarf2_addr_size ()
     188  #define DWARF2_FDE_RELOC_SIZE (compact_eh ? 4 : mips_dwarf2_addr_size ())
     189  #define DWARF2_FDE_RELOC_ENCODING(enc) \
     190    (enc | (compact_eh ? DW_EH_PE_pcrel : 0))
     191  
     192  #define TARGET_USE_CFIPOP 1
     193  
     194  #define tc_cfi_frame_initial_instructions mips_cfi_frame_initial_instructions
     195  extern void mips_cfi_frame_initial_instructions (void);
     196  
     197  #define tc_regname_to_dw2regnum tc_mips_regname_to_dw2regnum
     198  extern int tc_mips_regname_to_dw2regnum (char *regname);
     199  
     200  #define DWARF2_DEFAULT_RETURN_COLUMN 31
     201  #define DWARF2_CIE_DATA_ALIGNMENT (-4)
     202  
     203  #if defined(OBJ_ELF)
     204  
     205  #define tc_cfi_reloc_for_encoding mips_cfi_reloc_for_encoding
     206  extern bfd_reloc_code_real_type mips_cfi_reloc_for_encoding (int encoding);
     207  
     208  #define tc_compact_eh_opcode_stop 0x5c
     209  #define tc_compact_eh_opcode_pad 0x5f
     210  
     211  #endif
     212  #define DIFF_EXPR_OK
     213  /* We define DIFF_EXPR_OK because of R_MIPS_PC32, but we have no
     214     64-bit form for n64 CFIs.  */
     215  #define CFI_DIFF_EXPR_OK 0
     216  
     217  #define CONVERT_SYMBOLIC_ATTRIBUTE(name) mips_convert_symbolic_attribute (name)
     218  extern int mips_convert_symbolic_attribute (const char *);
     219  
     220  #endif /* TC_MIPS */