Blame bfd/elf32-nds32.h

Packit bbfece
/* NDS32-specific support for 32-bit ELF.
Packit bbfece
   Copyright (C) 2012-2018 Free Software Foundation, Inc.
Packit bbfece
   Contributed by Andes Technology Corporation.
Packit bbfece
Packit bbfece
   This file is part of BFD, the Binary File Descriptor library.
Packit bbfece
Packit bbfece
   This program is free software; you can redistribute it and/or modify
Packit bbfece
   it under the terms of the GNU General Public License as published by
Packit bbfece
   the Free Software Foundation; either version 3 of the License, or
Packit bbfece
   (at your option) any later version.
Packit bbfece
Packit bbfece
   This program is distributed in the hope that it will be useful,
Packit bbfece
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit bbfece
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit bbfece
   GNU General Public License for more details.
Packit bbfece
Packit bbfece
   You should have received a copy of the GNU General Public License
Packit bbfece
   along with this program; if not, write to the Free Software
Packit bbfece
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
Packit bbfece
   02110-1301, USA.*/
Packit bbfece
Packit bbfece
#ifndef ELF32_NDS32_H
Packit bbfece
#define ELF32_NDS32_H
Packit bbfece
Packit bbfece
#ifdef __cplusplus
Packit bbfece
extern "C" {
Packit bbfece
#endif
Packit bbfece
Packit bbfece
/* Relocation flags encoded in r_addend.  */
Packit bbfece
Packit bbfece
/* Relocation flags for R_NDS32_ERLAX_ENTRY.  */
Packit bbfece
Packit bbfece
/* Set if relax on this section is done or disabled.  */
Packit bbfece
#define R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG			(1 << 31)
Packit bbfece
/* Optimize for performance.  */
Packit bbfece
#define R_NDS32_RELAX_ENTRY_OPTIMIZE_FLAG			(1 << 30)
Packit bbfece
/* Optimize for size.  Branch destination 4-byte adjustment
Packit bbfece
   may be disabled.  */
Packit bbfece
#define R_NDS32_RELAX_ENTRY_OPTIMIZE_FOR_SPACE_FLAG		(1 << 29)
Packit bbfece
/* To distinguish the assembly code generated by compiler
Packit bbfece
   or written manually.  */
Packit bbfece
#define R_NDS32_RELAX_ENTRY_VERBATIM_FLAG			(1 << 28)
Packit bbfece
/* EX9 and link-time IFC must be explicitly enabled, so we
Packit bbfece
   won't mess up handcraft assembly code.  */
Packit bbfece
/* Enable EX9 optimization for this section.  */
Packit bbfece
#define R_NDS32_RELAX_ENTRY_EX9_FLAG				(1 << 2)
Packit bbfece
/* Enable IFC optimization for this section.  */
Packit bbfece
#define R_NDS32_RELAX_ENTRY_IFC_FLAG				(1 << 3)
Packit bbfece
Packit bbfece
Packit bbfece
/* Relocation flags for R_NDS32_INSN16.  */
Packit bbfece
Packit bbfece
/* Tag the nop16 can be removed.  */
Packit bbfece
#define R_NDS32_INSN16_CONVERT_FLAG				(1 << 0)
Packit bbfece
/* Convert a gp-relative access (e.g., lwi.gp)
Packit bbfece
   to fp-as-gp access (lwi37.fp).
Packit bbfece
   This value is used by linker internally only.
Packit bbfece
   It's fine to change the vlaue.  */
Packit bbfece
#define R_NDS32_INSN16_FP7U2_FLAG				(1 << 1)
Packit bbfece
Packit bbfece
/* Relocation flags for R_NDS32_RELAX_REGION_OMIT_FP_START/END.  */
Packit bbfece
Packit bbfece
/* OMIT_FP_FLAG marks the region for applying fp-as-gp
Packit bbfece
   optimization.  */
Packit bbfece
#define R_NDS32_RELAX_REGION_OMIT_FP_FLAG			(1 << 0)
Packit bbfece
/* NOT_OMIT_FP_FLAG is set if this region is not worth
Packit bbfece
   for fp-as-gp.  */
Packit bbfece
#define R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG			(1 << 1)
Packit bbfece
/* Suppress EX9 optimization in the region.  */
Packit bbfece
#define R_NDS32_RELAX_REGION_NO_EX9_FLAG			(1 << 2)
Packit bbfece
/* A Innermost loop region.  Some optimizations is suppressed
Packit bbfece
   in this region due to performance drop.  */
Packit bbfece
#define R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG		(1 << 4)
Packit bbfece
Packit bbfece
/* Tag range for LOADSTORE relocation.  */
Packit bbfece
enum
Packit bbfece
{
Packit bbfece
  NDS32_LOADSTORE_NONE = 0x0,
Packit bbfece
  NDS32_LOADSTORE_BYTE = 0x1,
Packit bbfece
  NDS32_LOADSTORE_HALF = 0x2,
Packit bbfece
  NDS32_LOADSTORE_WORD = 0x4,
Packit bbfece
  NDS32_LOADSTORE_FLOAT_S = 0x8,
Packit bbfece
  NDS32_LOADSTORE_FLOAT_D = 0x10,
Packit bbfece
  NDS32_LOADSTORE_IMM = 0x20
Packit bbfece
};
Packit bbfece
Packit bbfece
/* Relax tag for nds32_elf_relax_section, we have to specify which
Packit bbfece
   optimization do in this round.  */
Packit bbfece
enum
Packit bbfece
{
Packit bbfece
  NDS32_RELAX_NONE_ROUND = 0,
Packit bbfece
  NDS32_RELAX_NORMAL_ROUND,
Packit bbfece
  NDS32_RELAX_JUMP_IFC_ROUND,
Packit bbfece
  NDS32_RELAX_EX9_BUILD_ROUND,
Packit bbfece
  NDS32_RELAX_EX9_REPLACE_ROUND,
Packit bbfece
  NDS32_RELAX_EMPTY_ROUND
Packit bbfece
};
Packit bbfece
Packit bbfece
/* Optimization status mask.  */
Packit bbfece
#define NDS32_RELAX_JUMP_IFC_DONE	(1 << 0)
Packit bbfece
#define NDS32_RELAX_EX9_DONE		(1 << 1)
Packit bbfece
Packit bbfece
/* Optimization turn on mask.  */
Packit bbfece
#define NDS32_RELAX_JUMP_IFC_ON		(1 << 0)
Packit bbfece
#define NDS32_RELAX_EX9_ON		(1 << 1)
Packit bbfece

Packit bbfece
extern void nds32_insertion_sort
Packit bbfece
  (void *, size_t, size_t, int (*) (const void *, const void *));
Packit bbfece
Packit bbfece
extern int	   nds32_elf_ex9_init (void);
Packit bbfece
extern int	   nds32_convert_32_to_16 (bfd *, uint32_t, uint16_t *, int *);
Packit bbfece
extern int	   nds32_convert_16_to_32 (bfd *, uint16_t, uint32_t *);
Packit bbfece
extern void	   bfd_elf32_nds32_set_target_option (struct bfd_link_info *,
Packit bbfece
						      int, int, FILE *, int,
Packit bbfece
						      int, int, int, FILE *,
Packit bbfece
						      FILE *, int, int,
Packit bbfece
						      bfd_boolean, bfd_boolean);
Packit bbfece
Packit bbfece
#define nds32_elf_hash_table(info) \
Packit bbfece
  (elf_hash_table_id ((struct elf_link_hash_table *) ((info)->hash)) \
Packit bbfece
   == NDS32_ELF_DATA ? \
Packit bbfece
   ((struct elf_nds32_link_hash_table *) ((info)->hash)) : NULL)
Packit bbfece
Packit bbfece
/* Hash table structure for target nds32.  There are some members to
Packit bbfece
   save target options passed from nds32elf.em to bfd.  */
Packit bbfece
Packit bbfece
struct elf_nds32_link_hash_table
Packit bbfece
{
Packit bbfece
  struct elf_link_hash_table root;
Packit bbfece
Packit bbfece
  /* Short-cuts to get to dynamic linker sections.  */
Packit bbfece
  asection *sdynbss;
Packit bbfece
  asection *srelbss;
Packit bbfece
Packit bbfece
  /* Small local sym to section mapping cache.  */
Packit bbfece
  struct sym_cache sym_cache;
Packit bbfece
Packit bbfece
  /* Target dependent options.  */
Packit bbfece
  int relax_fp_as_gp;		/* --mrelax-omit-fp  */
Packit bbfece
  int eliminate_gc_relocs;	/* --meliminate-gc-relocs  */
Packit bbfece
  FILE *sym_ld_script;		/* --mgen-symbol-ld-script=<file>  */
Packit bbfece
  /* Disable if linking a dynamically linked executable.  */
Packit bbfece
  int load_store_relax;
Packit bbfece
  int target_optimize;		/* Switch optimization.  */
Packit bbfece
  int relax_status;		/* Finished optimization.  */
Packit bbfece
  int relax_round;		/* Going optimization.  */
Packit bbfece
  FILE *ex9_export_file;	/* --mexport-ex9=<file>  */
Packit bbfece
  FILE *ex9_import_file;	/* --mimport-ex9=<file>  */
Packit bbfece
  int update_ex9_table;		/* --mupdate-ex9.  */
Packit bbfece
  int ex9_limit;
Packit bbfece
  bfd_boolean ex9_loop_aware;	/* Ignore ex9 if inside a loop.  */
Packit bbfece
  bfd_boolean ifc_loop_aware;	/* Ignore ifc if inside a loop.  */
Packit bbfece
};
Packit bbfece
Packit bbfece
#ifdef __cplusplus
Packit bbfece
}
Packit bbfece
#endif
Packit bbfece
Packit bbfece
#endif