/* TILE-Gx ELF specific backend routines.
   Copyright 2011 Free Software Foundation, Inc.

   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 enum elf_reloc_type_class
tilegx_reloc_type_class (const Elf_Internal_Rela *);

extern reloc_howto_type *
tilegx_reloc_name_lookup (bfd *, const char *);

extern struct bfd_link_hash_table *
tilegx_elf_link_hash_table_create (bfd *);

extern reloc_howto_type *
tilegx_reloc_type_lookup (bfd *, bfd_reloc_code_real_type);

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

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

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

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

extern bfd_boolean
tilegx_elf_omit_section_dynsym (bfd *,
				struct bfd_link_info *,
				asection *);

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

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

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

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

extern bfd_vma
tilegx_elf_plt_sym_val (bfd_vma, const asection *, const arelent *);

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

extern int
tilegx_additional_program_headers (bfd *, struct bfd_link_info *);

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

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

extern bfd_boolean
_bfd_tilegx_elf_merge_private_bfd_data (bfd *, bfd *);
