~ubuntu-branches/ubuntu/utopic/binutils-arm64-cross/utopic

« back to all changes in this revision

Viewing changes to binutils-2.23.52.20130611/bfd/elf32-m68hc1x.h

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2013-06-20 17:38:09 UTC
  • Revision ID: package-import@ubuntu.com-20130620173809-app8lzgvymy5fg6c
Tags: 0.7
Build-depend on binutils-source (>= 2.23.52.20130620-1~).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Motorola 68HC11/68HC12-specific support for 32-bit ELF
 
2
   Copyright 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2012
 
3
   Free Software Foundation, Inc.
 
4
   Contributed by Stephane Carrez (stcarrez@nerim.fr)
 
5
 
 
6
   This file is part of BFD, the Binary File Descriptor library.
 
7
 
 
8
   This program is free software; you can redistribute it and/or modify
 
9
   it under the terms of the GNU General Public License as published by
 
10
   the Free Software Foundation; either version 3 of the License, or
 
11
   (at your option) any later version.
 
12
 
 
13
   This program is distributed in the hope that it will be useful,
 
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
16
   GNU General Public License for more details.
 
17
 
 
18
   You should have received a copy of the GNU General Public License
 
19
   along with this program; if not, write to the Free Software
 
20
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
 
21
   MA 02110-1301, USA.  */
 
22
 
 
23
#ifndef _ELF32_M68HC1X_H
 
24
#define _ELF32_M68HC1X_H
 
25
 
 
26
#include "elf-bfd.h"
 
27
#include "bfdlink.h"
 
28
#include "elf/m68hc11.h"
 
29
 
 
30
/* Name of symbols exported by HC11/HC12 linker when there is a memory
 
31
   bank window.  */
 
32
#define BFD_M68HC11_BANK_START_NAME   "__bank_start"
 
33
#define BFD_M68HC11_BANK_SIZE_NAME    "__bank_size"
 
34
#define BFD_M68HC11_BANK_VIRTUAL_NAME "__bank_virtual"
 
35
 
 
36
/* Set and control ELF flags in ELF header.  */
 
37
extern bfd_boolean _bfd_m68hc11_elf_merge_private_bfd_data (bfd*,bfd*);
 
38
extern bfd_boolean _bfd_m68hc11_elf_set_private_flags (bfd*,flagword);
 
39
extern bfd_boolean _bfd_m68hc11_elf_print_private_bfd_data (bfd*, void*);
 
40
 
 
41
/* This hash entry is used to record a trampoline that must be generated
 
42
   to call a far function using a normal calling convention ('jsr').
 
43
   The trampoline is used when a pointer to a far function is used.
 
44
   It takes care of installing the proper memory bank as well as creating
 
45
   the 'call/rtc' calling convention.  */
 
46
struct elf32_m68hc11_stub_hash_entry
 
47
{
 
48
  /* Base hash table entry structure.  */
 
49
  struct bfd_hash_entry root;
 
50
 
 
51
  /* The stub section.  */
 
52
  asection *stub_sec;
 
53
 
 
54
  /* Offset within stub_sec of the beginning of this stub.  */
 
55
  bfd_vma stub_offset;
 
56
 
 
57
  /* Given the symbol's value and its section we can determine its final
 
58
     value when building the stubs (so the stub knows where to jump.  */
 
59
  bfd_vma target_value;
 
60
  asection *target_section;
 
61
};
 
62
 
 
63
/* Placeholder for the parameters to compute memory page and physical address.
 
64
   The following formulas are used:
 
65
 
 
66
   sym > bank_virtual =>
 
67
     %addr(sym) = (((sym - bank_virtual) & bank_mask) + bank_physical
 
68
     %page(sym) = (((sym - bank_virtual) >> bank_shift) % 256
 
69
 
 
70
   sym < bank_virtual =>
 
71
     %addr(sym) = sym
 
72
     %page(sym) = 0
 
73
 
 
74
 
 
75
   These parameters are obtained from the symbol table by looking
 
76
   at the following:
 
77
 
 
78
   __bank_start         Symbol marking the start of memory bank window
 
79
                        (bank_physical)
 
80
   __bank_virtual       Logical address of symbols for which the transformation
 
81
                        must be computed
 
82
   __bank_page_size     Size in bytes of page size (this is *NOT* the memory
 
83
                        bank window size and the window size is always
 
84
                        less or equal to the page size)
 
85
 
 
86
   For 68HC12, the window is at 0x8000 and the page size is 16K (full window).
 
87
   For 68HC11 this is board specific (implemented by external hardware).  */
 
88
 
 
89
struct m68hc11_page_info
 
90
{
 
91
  bfd_vma bank_virtual;
 
92
  bfd_vma bank_physical;
 
93
  bfd_vma bank_physical_end;
 
94
  bfd_vma bank_mask;
 
95
  bfd_vma bank_size;
 
96
  int bank_shift;
 
97
  int bank_param_initialized;
 
98
  bfd_vma trampoline_addr;
 
99
};
 
100
 
 
101
struct m68hc11_elf_link_hash_table
 
102
{
 
103
  struct elf_link_hash_table root;
 
104
  struct m68hc11_page_info pinfo;
 
105
 
 
106
  /* The stub hash table.  */
 
107
  struct bfd_hash_table* stub_hash_table;
 
108
 
 
109
  /* Linker stub bfd.  */
 
110
  bfd *stub_bfd;
 
111
 
 
112
  asection* stub_section;
 
113
  asection* tramp_section;
 
114
 
 
115
  /* Linker call-backs.  */
 
116
  asection * (*add_stub_section) (const char *, asection *);
 
117
 
 
118
  /* Assorted information used by elf32_hppa_size_stubs.  */
 
119
  unsigned int bfd_count;
 
120
  int top_index;
 
121
  asection **input_list;
 
122
 
 
123
  /* Small local sym cache.  */
 
124
  struct sym_cache sym_cache;
 
125
 
 
126
  bfd_boolean (* size_one_stub)  (struct bfd_hash_entry*, void*);
 
127
  bfd_boolean (* build_one_stub) (struct bfd_hash_entry*, void*);
 
128
};
 
129
 
 
130
/* Get the Sparc64 ELF linker hash table from a link_info structure.  */
 
131
 
 
132
#define m68hc11_elf_hash_table(p) \
 
133
  (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
 
134
  == M68HC11_ELF_DATA ? ((struct m68hc11_elf_link_hash_table *) ((p)->hash)) : NULL)
 
135
 
 
136
/* Create a 68HC11/68HC12 ELF linker hash table.  */
 
137
 
 
138
extern struct m68hc11_elf_link_hash_table* m68hc11_elf_hash_table_create
 
139
  (bfd*);
 
140
extern void m68hc11_elf_bfd_link_hash_table_free (struct bfd_link_hash_table*);
 
141
 
 
142
extern void m68hc11_elf_get_bank_parameters (struct bfd_link_info*);
 
143
 
 
144
/* Return 1 if the address is in banked memory.
 
145
   This can be applied to a virtual address and to a physical address.  */
 
146
extern int m68hc11_addr_is_banked (struct m68hc11_page_info*, bfd_vma);
 
147
 
 
148
/* Return the physical address seen by the processor, taking
 
149
   into account banked memory.  */
 
150
extern bfd_vma m68hc11_phys_addr (struct m68hc11_page_info*, bfd_vma);
 
151
 
 
152
/* Return the page number corresponding to an address in banked memory.  */
 
153
extern bfd_vma m68hc11_phys_page (struct m68hc11_page_info*, bfd_vma);
 
154
 
 
155
bfd_reloc_status_type m68hc11_elf_ignore_reloc
 
156
  (bfd *abfd, arelent *reloc_entry,
 
157
   asymbol *symbol, void *data, asection *input_section,
 
158
   bfd *output_bfd, char **error_message);
 
159
bfd_reloc_status_type m68hc11_elf_special_reloc
 
160
  (bfd *abfd, arelent *reloc_entry,
 
161
    asymbol *symbol, void *data, asection *input_section,
 
162
    bfd *output_bfd, char **error_message);
 
163
 
 
164
bfd_boolean elf32_m68hc11_check_relocs
 
165
  (bfd * abfd, struct bfd_link_info * info,
 
166
   asection * sec, const Elf_Internal_Rela * relocs);
 
167
bfd_boolean elf32_m68hc11_relocate_section
 
168
  (bfd *output_bfd, struct bfd_link_info *info,
 
169
   bfd *input_bfd, asection *input_section,
 
170
   bfd_byte *contents, Elf_Internal_Rela *relocs,
 
171
   Elf_Internal_Sym *local_syms, asection **local_sections);
 
172
 
 
173
bfd_boolean elf32_m68hc11_add_symbol_hook
 
174
  (bfd *abfd, struct bfd_link_info *info,
 
175
   Elf_Internal_Sym *sym, const char **namep,
 
176
   flagword *flagsp, asection **secp,
 
177
   bfd_vma *valp);
 
178
 
 
179
void elf32_m68hc11_merge_symbol_attribute
 
180
  (struct elf_link_hash_entry *, const Elf_Internal_Sym *,
 
181
   bfd_boolean, bfd_boolean);
 
182
 
 
183
/* Tweak the OSABI field of the elf header.  */
 
184
 
 
185
extern void elf32_m68hc11_post_process_headers (bfd*, struct bfd_link_info*);
 
186
 
 
187
int elf32_m68hc11_setup_section_lists (bfd *, struct bfd_link_info *);
 
188
 
 
189
bfd_boolean elf32_m68hc11_size_stubs
 
190
  (bfd *, bfd *, struct bfd_link_info *,
 
191
   asection * (*) (const char *, asection *));
 
192
 
 
193
bfd_boolean elf32_m68hc11_build_stubs (bfd* abfd, struct bfd_link_info *);
 
194
#endif