(root)/
binutils-2.41/
gas/
config/
tc-mmix.h
       1  /* tc-mmix.h -- Header file for tc-mmix.c.
       2     Copyright (C) 2001-2023 Free Software Foundation, Inc.
       3     Written by Hans-Peter Nilsson (hp@bitrange.com).
       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_MMIX
      23  
      24  /* See gas/doc/internals.texi for explanation of these macros.  */
      25  #define TARGET_FORMAT "elf64-mmix"
      26  #define TARGET_ARCH bfd_arch_mmix
      27  #define TARGET_BYTES_BIG_ENDIAN 1
      28  
      29  extern const char mmix_comment_chars[];
      30  #define tc_comment_chars mmix_comment_chars
      31  
      32  extern const char mmix_symbol_chars[];
      33  #define tc_symbol_chars mmix_symbol_chars
      34  
      35  /* "@" is a synonym for ".".  */
      36  #define LEX_AT (LEX_BEGIN_NAME)
      37  
      38  extern int mmix_label_without_colon_this_line (void);
      39  #define LABELS_WITHOUT_COLONS mmix_label_without_colon_this_line ()
      40  
      41  extern int mmix_next_semicolon_is_eoln;
      42  #define TC_EOL_IN_INSN(p) (*(p) == ';' && ! mmix_next_semicolon_is_eoln)
      43  
      44  /* This is one direction we can get mmixal compatibility.  */
      45  extern void mmix_handle_mmixal (void);
      46  #define md_start_line_hook mmix_handle_mmixal
      47  
      48  extern void mmix_md_begin (void);
      49  #define md_begin mmix_md_begin
      50  
      51  extern void mmix_md_finish (void);
      52  #define md_finish mmix_md_finish
      53  
      54  extern int mmix_current_location \
      55    (void (*fn) (expressionS *), expressionS *);
      56  extern int mmix_parse_predefined_name (char *, expressionS *);
      57  
      58  extern char *mmix_current_prefix;
      59  
      60  /* A bit ugly, since we "know" that there's a static function
      61     current_location that does what we want.  We also strip off a leading
      62     ':' in another ugly way.
      63  
      64     The [DVWIOUZX]_Handler symbols are provided when-used.  */
      65  
      66  extern int mmix_gnu_syntax;
      67  #define md_parse_name(name, exp, mode, cpos)			\
      68   (! mmix_gnu_syntax						\
      69    && (name[0] == '@'						\
      70        ? (! is_part_of_name (name[1])				\
      71  	 && mmix_current_location (current_location, exp))	\
      72        : ((name[0] == ':' || ISUPPER (name[0]))			\
      73  	 && mmix_parse_predefined_name (name, exp))))
      74  
      75  extern char *mmix_prefix_name (char *);
      76  
      77  /* We implement when *creating* a symbol, we also need to strip a ':' or
      78     prepend a prefix.  */
      79  #define tc_canonicalize_symbol_name(x) \
      80   (mmix_current_prefix == NULL && (x)[0] != ':' ? (x) : mmix_prefix_name (x))
      81  
      82  #define md_undefined_symbol(x) NULL
      83  
      84  extern void mmix_fb_label (expressionS *);
      85  
      86  /* Since integer_constant is local to expr.c, we have to make this a
      87     macro.  FIXME: Do it cleaner.  */
      88  #define md_operand(exp)							\
      89    do									\
      90      {									\
      91        if (input_line_pointer[0] == '#')					\
      92  	{								\
      93  	  input_line_pointer++;						\
      94  	  integer_constant (16, (exp));					\
      95  	}								\
      96        else if (input_line_pointer[0] == '&'				\
      97  	       && input_line_pointer[1] != '&')				\
      98  	as_bad (_("`&' serial number operator is not supported"));	\
      99        else								\
     100  	mmix_fb_label (exp);						\
     101      }									\
     102    while (0)
     103  
     104  /* Gas dislikes the 2ADD, 8ADD etc. insns, so we have to assemble them in
     105     the error-recovery loop.  Hopefully there are no significant
     106     differences.  Also, space on a line isn't gracefully handled.  */
     107  extern int mmix_assemble_return_nonzero (char *);
     108  #define tc_unrecognized_line(c)						\
     109   ((c) == ' '								\
     110    || (((c) == '1' || (c) == '2' || (c) == '4' || (c) == '8')		\
     111        && mmix_assemble_return_nonzero (input_line_pointer - 1)))
     112  
     113  #define md_number_to_chars number_to_chars_bigendian
     114  
     115  #define WORKING_DOT_WORD
     116  
     117  extern const struct relax_type mmix_relax_table[];
     118  #define TC_GENERIC_RELAX_TABLE mmix_relax_table
     119  
     120  /* We use the relax table for everything except the GREG frags and PUSHJ.  */
     121  extern long mmix_md_relax_frag (segT, fragS *, long);
     122  #define md_relax_frag mmix_md_relax_frag
     123  
     124  #define tc_fix_adjustable(FIX)					\
     125   (((FIX)->fx_addsy == NULL					\
     126     || S_GET_SEGMENT ((FIX)->fx_addsy) != reg_section)		\
     127    && (FIX)->fx_r_type != BFD_RELOC_VTABLE_INHERIT		\
     128    && (FIX)->fx_r_type != BFD_RELOC_VTABLE_ENTRY			\
     129    && (FIX)->fx_r_type != BFD_RELOC_MMIX_LOCAL)
     130  
     131  /* Adjust symbols which are registers.  */
     132  #define tc_adjust_symtab() mmix_adjust_symtab ()
     133  extern void mmix_adjust_symtab (void);
     134  
     135  /* Here's where we make all symbols global, when so requested.
     136     We must avoid doing that for expression symbols or section symbols,
     137     though.  */
     138  extern int mmix_globalize_symbols;
     139  #define tc_frob_symbol(sym, punt)				\
     140    do								\
     141      {								\
     142        if (S_GET_SEGMENT (sym) == reg_section)			\
     143  	{							\
     144  	  if (S_GET_NAME (sym)[0] != '$'			\
     145  	      && S_GET_VALUE (sym) < 256)			\
     146  	    {							\
     147  	      if (mmix_globalize_symbols)			\
     148  		S_SET_EXTERNAL (sym);				\
     149  	      else						\
     150  		symbol_mark_used_in_reloc (sym);		\
     151  	    }							\
     152  	}							\
     153        else if (mmix_globalize_symbols				\
     154  	       && ! symbol_section_p (sym)			\
     155  	       && sym != section_symbol (absolute_section)	\
     156  	       && ! S_IS_LOCAL (sym))				\
     157  	S_SET_EXTERNAL (sym);					\
     158      }								\
     159    while (0)
     160  
     161  /* No shared lib support, so we don't need to ensure externally
     162     visible symbols can be overridden.  */
     163  #define EXTERN_FORCE_RELOC 0
     164  
     165  /* When relaxing, we need to emit various relocs we otherwise wouldn't.  */
     166  #define TC_FORCE_RELOCATION(fix) mmix_force_relocation (fix)
     167  extern int mmix_force_relocation (struct fix *);
     168  
     169  /* Call md_pcrel_from_section(), not md_pcrel_from().  */
     170  #define MD_PCREL_FROM_SECTION(FIX, SEC) md_pcrel_from_section (FIX, SEC)
     171  
     172  #define md_section_align(seg, size) (size)
     173  
     174  #define LISTING_HEADER "GAS for MMIX"
     175  
     176  /* The default of 4 means Bcc expansion looks like it's missing a line.  */
     177  #define LISTING_LHS_CONT_LINES 5
     178  
     179  extern fragS *mmix_opcode_frag;
     180  #define TC_FRAG_TYPE fragS *
     181  #define TC_FRAG_INIT(frag, max_bytes) (frag)->tc_frag_data = mmix_opcode_frag
     182  
     183  /* We need to associate each section symbol with a list of GREGs defined
     184     for that section/segment and sorted on offset, between the point where
     185     all symbols have been evaluated and all frags mapped, and when the
     186     fixups are done and relocs are output.  Similarly for each unknown
     187     symbol.  */
     188  extern void mmix_frob_file (void);
     189  #define tc_frob_file_before_fix()					\
     190    do									\
     191      {									\
     192        int i = 0;							\
     193  									\
     194        /* It's likely mmix_frob_file changed (removed) sections, so make	\
     195  	 sure sections are correctly numbered as per renumber_sections,	\
     196  	 (static to write.c where this macro is called).  */		\
     197        mmix_frob_file ();						\
     198        bfd_map_over_sections (stdoutput, renumber_sections, &i);		\
     199      }									\
     200    while (0)
     201  
     202  /* Used by mmix_frob_file.  Hangs on section symbols and unknown symbols.  */
     203  struct mmix_symbol_gregs;
     204  #define TC_SYMFIELD_TYPE struct mmix_symbol_gregs *
     205  
     206  /* Used by relaxation, counting maximum needed PUSHJ stubs for a section.  */
     207  struct mmix_segment_info_type
     208   {
     209     /* We only need to keep track of the last stubbable frag because
     210        there's no less hackish way to keep track of different relaxation
     211        rounds.  */
     212     fragS *last_stubfrag;
     213     bfd_size_type nstubs;
     214   };
     215  #define TC_SEGMENT_INFO_TYPE struct mmix_segment_info_type
     216  
     217  extern void mmix_md_elf_section_change_hook (void);
     218  #define md_elf_section_change_hook mmix_md_elf_section_change_hook
     219  
     220  extern void mmix_md_do_align (int, char *, int, int);
     221  #define md_do_align(n, fill, len, max, label) \
     222   mmix_md_do_align (n, fill, len, max)
     223  
     224  /* Each insn is a tetrabyte (4 bytes) long, but if there are BYTE
     225     sequences sprinkled in, we can get unaligned DWARF2 offsets, so let's
     226     explicitly say one byte.  */
     227  #define DWARF2_LINE_MIN_INSN_LENGTH 1
     228  
     229  /* MMIX has global register symbols.  */
     230  #define TC_GLOBAL_REGISTER_SYMBOL_OK
     231  
     232  #define md_single_noop_insn "swym 0"