_bfd_real_fopen should not use ccs parameter on Windows
[binutils-gdb.git] / bfd / libxcoff.h
index b01eae0b4f5adf74090ef7a4b2f7774b978b6116..c6ad6dc2c4ae3b9c4a9572ab335df7b904c02bc6 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD XCOFF object file private structure.
-   Copyright (C) 2001-2017 Free Software Foundation, Inc.
+   Copyright (C) 2001-2022 Free Software Foundation, Inc.
    Written by Tom Rix, Redhat.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -63,11 +63,11 @@ struct xcoff_backend_data_rec
      2 : XCOFF64.  */
   unsigned long _xcoff_ldhdr_version;
 
-  bfd_boolean (* _xcoff_put_symbol_name)
+  bool (* _xcoff_put_symbol_name)
     (struct bfd_link_info *, struct bfd_strtab_hash *,
      struct internal_syment *, const char *);
 
-  bfd_boolean (* _xcoff_put_ldsymbol_name)
+  bool (* _xcoff_put_ldsymbol_name)
     (bfd *, struct xcoff_loader_info *, struct internal_ldsym *,
      const char *);
 
@@ -79,8 +79,8 @@ struct xcoff_backend_data_rec
   /* Line number and relocation overflow.
      XCOFF32 overflows to another section when the line number or the
      relocation count exceeds 0xffff.  XCOFF64 does not overflow.  */
-  bfd_boolean (*_xcoff_is_lineno_count_overflow) (bfd *, bfd_vma);
-  bfd_boolean (*_xcoff_is_reloc_count_overflow)  (bfd *, bfd_vma);
+  bool (*_xcoff_is_lineno_count_overflow) (bfd *, bfd_vma);
+  bool (*_xcoff_is_reloc_count_overflow)  (bfd *, bfd_vma);
 
   /* Loader section symbol and relocation table offset
      XCOFF32 is after the .loader header
@@ -90,15 +90,24 @@ struct xcoff_backend_data_rec
 
   /* Global linkage.  The first word of global linkage code must be be
      modified by filling in the correct TOC offset.  */
-  unsigned long *_xcoff_glink_code;
+  const unsigned long *_xcoff_glink_code;
 
   /* Size of the global link code in bytes of the xcoff_glink_code table.  */
   unsigned long _xcoff_glink_size;
 
   /* rtinit.  */
   unsigned int _xcoff_rtinit_size;
-  bfd_boolean (*_xcoff_generate_rtinit)
-    (bfd *, const char *, const char *, bfd_boolean);
+  bool (*_xcoff_generate_rtinit)
+    (bfd *, const char *, const char *, bool);
+
+  /* Stubs code generation.
+     The code part is an array which might need to be modified by
+     some relocations.
+     The size is in bytes.  */
+  const unsigned long *_xcoff_stub_indirect_call_code;
+  unsigned long _xcoff_stub_indirect_call_size;
+  const unsigned long *_xcoff_stub_shared_call_code;
+  unsigned long _xcoff_stub_shared_call_size;
 };
 
 /* Look up an entry in an XCOFF link hash table.  */
@@ -111,7 +120,7 @@ struct xcoff_backend_data_rec
 #define xcoff_link_hash_traverse(table, func, info)                    \
   (bfd_link_hash_traverse                                              \
    (&(table)->root,                                                    \
-    (bfd_boolean (*) (struct bfd_link_hash_entry *, void *)) (func),   \
+    (bool (*) (struct bfd_link_hash_entry *, void *)) (func),          \
     (info)))
 
 /* Get the XCOFF link hash table from the info structure.  This is
@@ -185,6 +194,11 @@ struct xcoff_backend_data_rec
 #define bfd_xcoff_glink_code(a, b)   ((xcoff_backend (a)->_xcoff_glink_code[(b)]))
 #define bfd_xcoff_glink_code_size(a) ((xcoff_backend (a)->_xcoff_glink_size))
 
+#define bfd_xcoff_stub_indirect_call_code(a, b)   ((xcoff_backend (a)->_xcoff_stub_indirect_call_code[(b)]))
+#define bfd_xcoff_stub_indirect_call_size(a) ((xcoff_backend (a)->_xcoff_stub_indirect_call_size))
+#define bfd_xcoff_stub_shared_call_code(a, b)   ((xcoff_backend (a)->_xcoff_stub_shared_call_code[(b)]))
+#define bfd_xcoff_stub_shared_call_size(a) ((xcoff_backend (a)->_xcoff_stub_shared_call_size))
+
 /* Check for the magic number U803XTOCMAGIC or U64_TOCMAGIC for 64 bit
    targets.  */
 #define bfd_xcoff_is_xcoff64(a) \
@@ -202,7 +216,7 @@ struct xcoff_backend_data_rec
 #define bfd_xcoff_data_align_power(a) ((xcoff_data (a)->data_align_power))
 
 /* xcoff*_ppc_relocate_section macros  */
-#define XCOFF_MAX_CALCULATE_RELOCATION (0x1c)
+#define XCOFF_MAX_CALCULATE_RELOCATION (0x32)
 #define XCOFF_MAX_COMPLAIN_OVERFLOW (4)
 /* N_ONES produces N one bits, without overflowing machine arithmetic.  */
 #ifdef N_ONES
@@ -210,30 +224,32 @@ struct xcoff_backend_data_rec
 #endif
 #define N_ONES(n) (((((bfd_vma) 1 << ((n) - 1)) - 1) << 1) | 1)
 
-#define XCOFF_RELOC_FUNCTION_ARGS \
-  bfd *, asection *, bfd *, struct internal_reloc *, \
-  struct internal_syment *, struct reloc_howto_struct *, bfd_vma, bfd_vma, \
-  bfd_vma *relocation, bfd_byte *contents
+typedef bool xcoff_reloc_function (bfd *, asection *, bfd *,
+                                  struct internal_reloc *,
+                                  struct internal_syment *,
+                                  struct reloc_howto_struct *,
+                                  bfd_vma, bfd_vma,
+                                  bfd_vma *, bfd_byte *,
+                                  struct bfd_link_info *);
 
-#define XCOFF_COMPLAIN_FUNCTION_ARGS \
-  bfd *, bfd_vma, bfd_vma, struct reloc_howto_struct *howto
+typedef bool xcoff_complain_function (bfd *, bfd_vma, bfd_vma,
+                                            struct reloc_howto_struct *);
 
-extern bfd_boolean (*xcoff_calculate_relocation[XCOFF_MAX_CALCULATE_RELOCATION])
-  (XCOFF_RELOC_FUNCTION_ARGS);
-extern bfd_boolean (*xcoff_complain_overflow[XCOFF_MAX_COMPLAIN_OVERFLOW])
-  (XCOFF_COMPLAIN_FUNCTION_ARGS);
+extern xcoff_reloc_function *const xcoff_calculate_relocation[];
+extern xcoff_complain_function *const xcoff_complain_overflow[];
 
-#define XCOFF_NO_LONG_SECTION_NAMES  (FALSE), bfd_coff_set_long_section_names_disallowed
+#define XCOFF_NO_LONG_SECTION_NAMES  (false), bfd_coff_set_long_section_names_disallowed
 
 /* Relocation functions */
-bfd_boolean xcoff_reloc_type_noop (XCOFF_RELOC_FUNCTION_ARGS);
-bfd_boolean xcoff_reloc_type_fail (XCOFF_RELOC_FUNCTION_ARGS);
-bfd_boolean xcoff_reloc_type_pos  (XCOFF_RELOC_FUNCTION_ARGS);
-bfd_boolean xcoff_reloc_type_neg  (XCOFF_RELOC_FUNCTION_ARGS);
-bfd_boolean xcoff_reloc_type_rel  (XCOFF_RELOC_FUNCTION_ARGS);
-bfd_boolean xcoff_reloc_type_toc  (XCOFF_RELOC_FUNCTION_ARGS);
-bfd_boolean xcoff_reloc_type_ba   (XCOFF_RELOC_FUNCTION_ARGS);
-bfd_boolean xcoff_reloc_type_crel (XCOFF_RELOC_FUNCTION_ARGS);
+extern xcoff_reloc_function xcoff_reloc_type_noop;
+extern xcoff_reloc_function xcoff_reloc_type_fail;
+extern xcoff_reloc_function xcoff_reloc_type_pos;
+extern xcoff_reloc_function xcoff_reloc_type_neg;
+extern xcoff_reloc_function xcoff_reloc_type_rel;
+extern xcoff_reloc_function xcoff_reloc_type_toc;
+extern xcoff_reloc_function xcoff_reloc_type_ba;
+extern xcoff_reloc_function xcoff_reloc_type_crel;
+extern xcoff_reloc_function xcoff_reloc_type_tls;
 
 /* Structure to describe dwarf sections.
    Useful to convert from XCOFF section name to flag and vice-versa.
@@ -243,18 +259,59 @@ struct xcoff_dwsect_name {
   unsigned int flag;
 
   /* Corresponding XCOFF section name.  */
-  const char *name;
+  const char *xcoff_name;
+
+  /* Corresponding DWARF section name.  */
+  const char *dwarf_name;
 
   /* True if size must be prepended.  */
-  bfd_boolean def_size;
+  bool def_size;
 };
 
 /* Number of entries in the array.  The number is known and public so that user
    can 'extend' this array by index.  */
-#define XCOFF_DWSECT_NBR_NAMES 8
+#define XCOFF_DWSECT_NBR_NAMES 11
 
 /* The dwarf sections array.  */
 extern const struct xcoff_dwsect_name
   xcoff_dwsect_names[XCOFF_DWSECT_NBR_NAMES];
 
+/* Structure and functions needed by backend in order to handle
+   stubs created in xcofflink.c.  */
+
+enum xcoff_stub_type
+  {
+    xcoff_stub_none,
+    xcoff_stub_indirect_call,
+    xcoff_stub_shared_call
+  };
+
+struct xcoff_stub_hash_entry
+{
+  /* Base hash table entry structure.  */
+  struct bfd_hash_entry root;
+
+  enum xcoff_stub_type stub_type;
+
+  /* The hash table entry of the stub's csect.  */
+  struct xcoff_link_hash_entry *hcsect;
+
+  /* Offset in the stub's csect.  */
+  bfd_vma stub_offset;
+
+  /* The target's section.  */
+  asection *target_section;
+
+  /* The target's hash table entry.  */
+  struct xcoff_link_hash_entry *htarget;
+};
+
+
+extern enum xcoff_stub_type bfd_xcoff_type_of_stub
+  (asection *, const struct internal_reloc *, bfd_vma,
+   struct xcoff_link_hash_entry *);
+
+extern struct xcoff_stub_hash_entry *bfd_xcoff_get_stub_entry
+  (asection *, struct xcoff_link_hash_entry *, struct bfd_link_info *);
+
 #endif /* LIBXCOFF_H */