gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gas / write.h
index 9872e9d82b435540d9b9e96a0792c7b78d38211c..b6132dd5f5238637d62d2f33b33bc913680c05b5 100644 (file)
@@ -1,12 +1,11 @@
 /* write.h
-   Copyright (C) 1987, 92, 93, 94, 95, 96, 97, 2000
-   Free Software Foundation, Inc.
+   Copyright (C) 1987-2020 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
    GAS is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
+   the Free Software Foundation; either version 3, or (at your option)
    any later version.
 
    GAS is distributed in the hope that it will be useful,
 
    You should have received a copy of the GNU General Public License
    along with GAS; see the file COPYING.  If not, write to the Free
-   Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.  */
+   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
+   02110-1301, USA.  */
 
 #ifndef __write_h__
 #define __write_h__
 
-#ifndef TC_I960
-#ifdef hpux
-#define EXEC_MACHINE_TYPE HP9000S200_ID
-#endif
-#endif /* TC_I960 */
-
-#ifndef BFD_ASSEMBLER
-
-#ifndef LOCAL_LABEL
-#define LOCAL_LABEL(name) (name [0] == 'L' )
-#endif
-
-#define S_LOCAL_NAME(s) (LOCAL_LABEL (S_GET_NAME (s)))
-
-#endif /* ! BFD_ASSEMBLER */
-
 /* This is the name of a fake symbol which will never appear in the
    assembler output.  S_IS_LOCAL detects it because of the \001.  */
+#ifndef FAKE_LABEL_NAME
 #define FAKE_LABEL_NAME "L0\001"
+#endif
 
-#include "bit_fix.h"
+/* This is a special character that is used to indicate a fake label.
+   It must be present in FAKE_LABEL_NAME, although it does not have to
+   be the first character.  It must not be a character that would be
+   found in a valid symbol name.
+
+   Also be aware that the function _bfd_elf_is_local_label_name in
+   bfd/elf.c has an implicit assumption that FAKE_LABEL_CHAR is '\001'.
+   If this is not the case then FAKE_LABEL_NAME must start with ".L" in
+   order for the function to continue working.  */
+#ifndef FAKE_LABEL_CHAR
+#define FAKE_LABEL_CHAR '\001'
+#endif
 
 /*
  * FixSs may be built up in any order.
 
 struct fix
 {
+  /* Next fixS in linked list, or NULL.  */
+  struct fix *fx_next;
+
   /* These small fields are grouped together for compactness of
      this structure, and efficiency of access on some architectures.  */
 
-  /* pc-relative offset adjust (only used by m68k) */
-  char fx_pcrel_adjust;
-
-  /* How many bytes are involved? */
-  unsigned char fx_size;
-
   /* Is this a pc-relative relocation?  */
   unsigned fx_pcrel : 1;
 
-  /* Is this a relocation to a procedure linkage table entry?  If so,
-     some of the reductions we try to apply are invalid.  A better way
-     might be to represent PLT entries with different kinds of
-     symbols, and use normal relocations (with undefined symbols);
-     look into it for version 2.6.  */
-  unsigned fx_plt : 1;
-
-  /* Is this value an immediate displacement?  */
-  /* Only used on i960 and ns32k; merge it into TC_FIX_TYPE sometime.  */
-  unsigned fx_im_disp : 2;
-
-  /* A bit for the CPU specific code.
-     This probably can be folded into tc_fix_data, below.  */
-  unsigned fx_tcbit : 1;
-
   /* Has this relocation already been applied?  */
   unsigned fx_done : 1;
 
@@ -90,11 +68,26 @@ struct fix
   /* The value is signed when checking for overflow.  */
   unsigned fx_signed : 1;
 
+  /* Some bits for the CPU specific code.  */
+  unsigned fx_tcbit : 1;
+  unsigned fx_tcbit2 : 1;
+
+  /* Spare bits.  */
+  unsigned fx_unused : 10;
+
+  /* pc-relative offset adjust (only used by some CPU specific code) */
+  int fx_pcrel_adjust : 8;
+
+  /* How many bytes are involved? */
+  unsigned fx_size : 8;
+
+  bfd_reloc_code_real_type fx_r_type;
+
   /* Which frag does this fix apply to?  */
   fragS *fx_frag;
 
-  /* Where is the first byte to fix up?  */
-  long fx_where;
+  /* The location within the frag where the fixup occurs.  */
+  unsigned long fx_where;
 
   /* NULL or Symbol whose value we add in.  */
   symbolS *fx_addsy;
@@ -105,25 +98,11 @@ struct fix
   /* Absolute number we add in.  */
   valueT fx_offset;
 
-  /* Next fixS in linked list, or NULL.  */
-  struct fix *fx_next;
-
-  /* If NULL, no bitfix's to do.  */
-  /* Only i960-coff and ns32k use this, and i960-coff stores an
-     integer.  This can probably be folded into tc_fix_data, below.
-     @@ Alpha also uses it, but only to disable certain relocation
-     processing.  */
-  bit_fixS *fx_bit_fixP;
+  /* The value of dot when the fixup expression was parsed.  */
+  addressT fx_dot_value;
 
-#ifdef BFD_ASSEMBLER
-  bfd_reloc_code_real_type fx_r_type;
-#else
-#ifdef NEED_FX_R_TYPE
-  /* Hack for machines where the type of reloc can't be
-     worked out by looking at how big it is.  */
-  int fx_r_type;
-#endif
-#endif
+  /* The frag fx_dot_value is based on.  */
+  fragS *fx_dot_frag;
 
   /* This field is sort of misnamed.  It appears to be a sort of random
      scratch field, for use by the back ends.  The main gas code doesn't
@@ -136,7 +115,7 @@ struct fix
 
   /* The location of the instruction which created the reloc, used
      in error messages.  */
-  char *fx_file;
+  const char *fx_file;
   unsigned fx_line;
 
 #ifdef USING_CGEN
@@ -145,6 +124,10 @@ struct fix
     const struct cgen_insn *insn;
     /* Target specific data, usually reloc number.  */
     int opinfo;
+    /* Which ifield this fixup applies to. */
+    struct cgen_maybe_multi_ifield * field;
+    /* is this field is the MSB field in a set? */
+    int msb_field_p;
   } fx_cgen;
 #endif
 
@@ -157,53 +140,49 @@ struct fix
 
 typedef struct fix fixS;
 
-#ifndef BFD_ASSEMBLER
-extern char *next_object_file_charP;
-
-#ifndef MANY_SEGMENTS
-COMMON fixS *text_fix_root, *text_fix_tail;    /* Chains fixSs.  */
-COMMON fixS *data_fix_root, *data_fix_tail;    /* Chains fixSs.  */
-COMMON fixS *bss_fix_root, *bss_fix_tail;      /* Chains fixSs.  */
-extern struct frag *text_last_frag;            /* Last frag in segment.  */
-extern struct frag *data_last_frag;            /* Last frag in segment.  */
-#endif
-COMMON fixS **seg_fix_rootP, **seg_fix_tailP;  /* -> one of above.  */
-#endif
-
-extern long string_byte_count;
-extern int section_alignment[];
-
-extern bit_fixS *bit_fix_new
-  PARAMS ((int size, int offset, long base_type, long base_adj, long min,
-          long max, long add));
-extern void append PARAMS ((char **charPP, char *fromP, unsigned long length));
-extern void record_alignment PARAMS ((segT seg, int align));
-extern int get_recorded_alignment PARAMS ((segT seg));
-extern void subsegs_finish PARAMS ((void));
-extern void write_object_file PARAMS ((void));
-extern long relax_frag PARAMS ((fragS *, long));
-extern void relax_segment
-  PARAMS ((struct frag * seg_frag_root, segT seg_type));
-
-extern void number_to_chars_littleendian PARAMS ((char *, valueT, int));
-extern void number_to_chars_bigendian    PARAMS ((char *, valueT, int));
-
-#ifdef BFD_ASSEMBLER
-extern fixS *fix_new
-  PARAMS ((fragS * frag, int where, int size, symbolS * add_symbol,
-          offsetT offset, int pcrel, bfd_reloc_code_real_type r_type));
-extern fixS *fix_new_exp
-  PARAMS ((fragS * frag, int where, int size, expressionS *exp, int pcrel,
-          bfd_reloc_code_real_type r_type));
-#else
-extern fixS *fix_new
-  PARAMS ((fragS * frag, int where, int size, symbolS * add_symbol,
-          offsetT offset, int pcrel, int r_type));
-extern fixS *fix_new_exp
-  PARAMS ((fragS * frag, int where, int size, expressionS *exp, int pcrel,
-          int r_type));
-#endif
+struct reloc_list
+{
+  struct reloc_list *next;
+  union
+  {
+    struct
+    {
+      symbolS *offset_sym;
+      reloc_howto_type *howto;
+      symbolS *sym;
+      bfd_vma addend;
+    } a;
+    struct
+    {
+      asection *sec;
+      asymbol *s;
+      arelent r;
+    } b;
+  } u;
+  const char *file;
+  unsigned int line;
+};
 
-extern void write_print_statistics PARAMS ((FILE *));
+extern int finalize_syms;
+extern symbolS *abs_section_sym;
+extern addressT dot_value;
+extern fragS *dot_frag;
+extern struct reloc_list* reloc_list;
+
+extern void append (char **, char *, unsigned long);
+extern void record_alignment (segT, unsigned);
+extern int get_recorded_alignment (segT);
+extern void write_object_file (void);
+extern long relax_frag (segT, fragS *, long);
+extern int relax_segment (struct frag *, segT, int);
+extern void number_to_chars_littleendian (char *, valueT, int);
+extern void number_to_chars_bigendian (char *, valueT, int);
+extern fixS *fix_new (fragS *, unsigned long, unsigned long, symbolS *,
+                     offsetT, int, bfd_reloc_code_real_type);
+extern fixS *fix_at_start (fragS *, unsigned long, symbolS *,
+                          offsetT, int, bfd_reloc_code_real_type);
+extern fixS *fix_new_exp (fragS *, unsigned long, unsigned long,
+                         expressionS *, int, bfd_reloc_code_real_type);
+extern void write_print_statistics (FILE *);
 
 #endif /* __write_h__ */
This page took 0.025429 seconds and 4 git commands to generate.