/* 32-bit ELF support for S+core.
   Copyright (C) 2009-2016 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 *, bfd *);

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
