/* 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 bfd_boolean
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
