OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [bfd/] [coff-z8k.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 104 markom
/* BFD back-end for Zilog Z800n COFF binaries.
2
   Copyright 1992, 93, 94, 95, 1997 Free Software Foundation, Inc.
3
   Contributed by Cygnus Support.
4
   Written by Steve Chamberlain, <sac@cygnus.com>.
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 2 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
21
 
22
#include "bfd.h"
23
#include "sysdep.h"
24
#include "libbfd.h"
25
#include "bfdlink.h"
26
#include "coff/z8k.h"
27
#include "coff/internal.h"
28
#include "libcoff.h"
29
 
30
#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (1)
31
 
32
static reloc_howto_type r_imm32 =
33
HOWTO (R_IMM32, 0, 1, 32, false, 0,
34
       complain_overflow_bitfield, 0, "r_imm32", true, 0xffffffff,
35
       0xffffffff, false);
36
 
37
static reloc_howto_type r_imm4l =
38
HOWTO (R_IMM4L, 0, 1, 4, false, 0,
39
       complain_overflow_bitfield, 0, "r_imm4l", true, 0xf, 0xf, false);
40
 
41
static reloc_howto_type r_da =
42
HOWTO (R_IMM16, 0, 1, 16, false, 0,
43
       complain_overflow_bitfield, 0, "r_da", true, 0x0000ffff, 0x0000ffff,
44
       false);
45
 
46
static reloc_howto_type r_imm8 =
47
HOWTO (R_IMM8, 0, 1, 8, false, 0,
48
       complain_overflow_bitfield, 0, "r_imm8", true, 0x000000ff, 0x000000ff,
49
       false);
50
 
51
static reloc_howto_type r_jr =
52
HOWTO (R_JR, 0, 1, 8, true, 0, complain_overflow_signed, 0,
53
       "r_jr", true, 0, 0, true);
54
 
55
/* Turn a howto into a reloc number */
56
 
57
static int
58
coff_z8k_select_reloc (howto)
59
     reloc_howto_type *howto;
60
{
61
  return howto->type;
62
}
63
 
64
#define SELECT_RELOC(x,howto) x.r_type = coff_z8k_select_reloc(howto)
65
 
66
 
67
#define BADMAG(x) Z8KBADMAG(x)
68
#define Z8K 1                   /* Customize coffcode.h */
69
#define __A_MAGIC_SET__
70
 
71
 
72
 
73
/* Code to swap in the reloc */
74
#define SWAP_IN_RELOC_OFFSET   bfd_h_get_32
75
#define SWAP_OUT_RELOC_OFFSET bfd_h_put_32
76
#define SWAP_OUT_RELOC_EXTRA(abfd, src, dst) \
77
  dst->r_stuff[0] = 'S'; \
78
  dst->r_stuff[1] = 'C';
79
 
80
/* Code to turn a r_type into a howto ptr, uses the above howto table
81
   */
82
 
83
static void
84
rtype2howto (internal, dst)
85
     arelent * internal;
86
     struct internal_reloc *dst;
87
{
88
  switch (dst->r_type)
89
    {
90
    default:
91
      abort ();
92
      break;
93
    case R_IMM8:
94
      internal->howto = &r_imm8;
95
      break;
96
     case R_IMM16:
97
      internal->howto = &r_da;
98
      break;
99
    case R_JR:
100
      internal->howto = &r_jr;
101
      break;
102
    case R_IMM32:
103
      internal->howto = &r_imm32;
104
      break;
105
    case R_IMM4L:
106
      internal->howto = &r_imm4l;
107
      break;
108
    }
109
}
110
 
111
#define RTYPE2HOWTO(internal, relocentry) rtype2howto(internal,relocentry)
112
 
113
 
114
/* Perform any necessary magic to the addend in a reloc entry */
115
 
116
 
117
#define CALC_ADDEND(abfd, symbol, ext_reloc, cache_ptr) \
118
 cache_ptr->addend =  ext_reloc.r_offset;
119
 
120
 
121
#define RELOC_PROCESSING(relent,reloc,symbols,abfd,section) \
122
 reloc_processing(relent, reloc, symbols, abfd, section)
123
 
124
static void
125
reloc_processing (relent, reloc, symbols, abfd, section)
126
     arelent * relent;
127
     struct internal_reloc *reloc;
128
     asymbol ** symbols;
129
     bfd * abfd;
130
     asection * section;
131
{
132
  relent->address = reloc->r_vaddr;
133
  rtype2howto (relent, reloc);
134
 
135
  if (reloc->r_symndx > 0)
136
    {
137
      relent->sym_ptr_ptr = symbols + obj_convert (abfd)[reloc->r_symndx];
138
    }
139
  else
140
    {
141
      relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
142
    }
143
 
144
 
145
  relent->addend = reloc->r_offset;
146
  relent->address -= section->vma;
147
}
148
 
149
static void
150
extra_case (in_abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)
151
     bfd *in_abfd;
152
     struct bfd_link_info *link_info;
153
     struct bfd_link_order *link_order;
154
     arelent *reloc;
155
     bfd_byte *data;
156
     unsigned int *src_ptr;
157
     unsigned int *dst_ptr;
158
{
159
  asection *input_section = link_order->u.indirect.section;
160
 
161
  switch (reloc->howto->type)
162
    {
163
    case R_IMM8:
164
      bfd_put_8 (in_abfd,
165
                 bfd_coff_reloc16_get_value (reloc, link_info, input_section),
166
                 data + *dst_ptr);
167
      (*dst_ptr) += 1;
168
      (*src_ptr) += 1;
169
      break;
170
 
171
    case R_IMM32:
172
      bfd_put_32 (in_abfd,
173
                  bfd_coff_reloc16_get_value (reloc, link_info, input_section),
174
                  data + *dst_ptr);
175
      (*dst_ptr) += 4;
176
      (*src_ptr) += 4;
177
      break;
178
 
179
    case R_IMM4L:
180
      bfd_put_8 (in_abfd,
181
                 ((bfd_get_8 (in_abfd, data + *dst_ptr) & 0xf0)
182
                  | (0x0f
183
                     & bfd_coff_reloc16_get_value (reloc, link_info,
184
                                                   input_section))),
185
                 data + *dst_ptr);
186
      (*dst_ptr) += 1;
187
      (*src_ptr) += 1;
188
      break;
189
 
190
    case R_IMM16:
191
      bfd_put_16 (in_abfd,
192
                  bfd_coff_reloc16_get_value (reloc, link_info, input_section),
193
                  data + *dst_ptr);
194
      (*dst_ptr) += 2;
195
      (*src_ptr) += 2;
196
      break;
197
 
198
    case R_JR:
199
      {
200
        bfd_vma dst = bfd_coff_reloc16_get_value (reloc, link_info,
201
                                                  input_section);
202
        bfd_vma dot = (link_order->offset
203
                       + *dst_ptr
204
                       + input_section->output_section->vma);
205
        int gap = dst - dot - 1;/* -1 since were in the odd byte of the
206
                                    word and the pc's been incremented */
207
 
208
        if (gap & 1)
209
          abort ();
210
        gap /= 2;
211
        if (gap > 128 || gap < -128)
212
          {
213
            if (! ((*link_info->callbacks->reloc_overflow)
214
                   (link_info, bfd_asymbol_name (*reloc->sym_ptr_ptr),
215
                    reloc->howto->name, reloc->addend, input_section->owner,
216
                    input_section, reloc->address)))
217
              abort ();
218
          }
219
        bfd_put_8 (in_abfd, gap, data + *dst_ptr);
220
        (*dst_ptr)++;
221
        (*src_ptr)++;
222
        break;
223
      }
224
    default:
225
      abort ();
226
    }
227
}
228
 
229
#define coff_reloc16_extra_cases extra_case
230
 
231
#include "coffcode.h"
232
 
233
 
234
#undef  coff_bfd_get_relocated_section_contents
235
#undef coff_bfd_relax_section
236
#define coff_bfd_get_relocated_section_contents \
237
  bfd_coff_reloc16_get_relocated_section_contents
238
#define coff_bfd_relax_section bfd_coff_reloc16_relax_section
239
 
240
CREATE_BIG_COFF_TARGET_VEC (z8kcoff_vec, "coff-z8k", 0, 0, '_', NULL)

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.