/* 32-bit ELF support for S+core.
   Copyright (C) 2009-2018 Free Software Foundation, Inc.
   Contributed by
   Brain.lin (brain.lin@sunplusct.com)
   Mei Ligang (ligang@sunnorth.com.cn)
   Pei-Lin Tsai (pltsai@sunplus.com)

   This file is part of BFD, the Binary File Descriptor library.

   This program 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 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

#include "elf/common.h"
#include "elf/internal.h"

extern void
s7_bfd_score_elf_hide_symbol (struct bfd_link_info *,
			      struct elf_link_hash_entry *,
			      bfd_boolean);

extern void
s7_bfd_score_info_to_howto (bfd *, arelent *, Elf_Internal_Rela *);

extern bfd_boolean
s7_bfd_score_elf_relocate_section (bfd *,
				   struct bfd_link_info *,
				   bfd *,
				   asection *,
				   bfd_byte *,
				   Elf_Internal_Rela *,
				   Elf_Internal_Sym *,
				   asection **);

extern bfd_boolean
s7_bfd_score_elf_check_relocs (bfd *,
			       struct bfd_link_info *,
			       asection *,
			       const Elf_Internal_Rela *);

extern bfd_boolean
s7_bfd_score_elf_add_symbol_hook (bfd *,
				  struct bfd_link_info *,
				  Elf_Internal_Sym *,
				  const char **,
				  flagword *,
				  asection **,
				  bfd_vma *);

extern void
s7_bfd_score_elf_symbol_processing (bfd *, asymbol *);

extern int
s7_bfd_score_elf_link_output_symbol_hook (struct bfd_link_info *,
					  const char *,
					  Elf_Internal_Sym *,
					  asection *,
					  struct elf_link_hash_entry *);

extern bfd_boolean
s7_bfd_score_elf_section_from_bfd_section (bfd *,
					   asection *,
					   int *);

extern bfd_boolean
s7_bfd_score_elf_adjust_dynamic_symbol (struct bfd_link_info *,
					struct elf_link_hash_entry *);

extern bfd_boolean
s7_bfd_score_elf_always_size_sections (bfd *, struct bfd_link_info *);

extern bfd_boolean
s7_bfd_score_elf_size_dynamic_sections (bfd *, struct bfd_link_info *);

extern bfd_boolean
s7_bfd_score_elf_create_dynamic_sections (bfd *, struct bfd_link_info *);

extern bfd_boolean
s7_bfd_score_elf_finish_dynamic_symbol (bfd *,
					struct bfd_link_info *,
					struct elf_link_hash_entry *,
					Elf_Internal_Sym *);

extern bfd_boolean
s7_bfd_score_elf_finish_dynamic_sections (bfd *, struct bfd_link_info *);

extern bfd_boolean
s7_bfd_score_elf_fake_sections (bfd *,
				Elf_Internal_Shdr *,
				asection *);

extern bfd_boolean
s7_bfd_score_elf_section_processing (bfd *, Elf_Internal_Shdr *);

extern bfd_boolean
s7_bfd_score_elf_write_section (bfd *, asection *, bfd_byte *);

extern void
s7_bfd_score_elf_copy_indirect_symbol (struct bfd_link_info *,
				       struct elf_link_hash_entry *,
				       struct elf_link_hash_entry *);

extern bfd_boolean
s7_bfd_score_elf_discard_info (bfd *, struct elf_reloc_cookie *,
			       struct bfd_link_info *);

extern bfd_boolean
s7_bfd_score_elf_ignore_discarded_relocs (asection *);

extern asection *
s7_bfd_score_elf_gc_mark_hook (asection *,
			       struct bfd_link_info *,
			       Elf_Internal_Rela *,
			       struct elf_link_hash_entry *,
			       Elf_Internal_Sym *);

extern bfd_boolean
s7_bfd_score_elf_grok_prstatus (bfd *, Elf_Internal_Note *);

extern bfd_boolean
s7_bfd_score_elf_grok_psinfo (bfd *, Elf_Internal_Note *);

extern reloc_howto_type *
s7_elf32_score_reloc_type_lookup (bfd *, bfd_reloc_code_real_type);

extern struct bfd_link_hash_table *
s7_elf32_score_link_hash_table_create (bfd *);

extern bfd_boolean
s7_elf32_score_print_private_bfd_data (bfd *, void *);

extern bfd_boolean
s7_elf32_score_merge_private_bfd_data (bfd *, struct bfd_link_info *);

extern bfd_boolean
s7_elf32_score_new_section_hook (bfd *, asection *);

extern bfd_boolean
_bfd_score_elf_common_definition (Elf_Internal_Sym *);

#define elf_backend_common_definition   _bfd_score_elf_common_definition
