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

Subversion Repositories or1k

[/] [or1k/] [tags/] [VER_5_3/] [gdb-5.3/] [bfd/] [elf32-ip2k.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1181 sfurman
/* Ubicom IP2xxx specific support for 32-bit ELF
2
   Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
3
 
4
   This file is part of BFD, the Binary File Descriptor library.
5
 
6
   This program is free software; you can redistribute it and/or modify
7
   it under the terms of the GNU General Public License as published by
8
   the Free Software Foundation; either version 2 of the License, or
9
   (at your option) any later version.
10
 
11
   This program is distributed in the hope that it will be useful,
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
   GNU General Public License for more details.
15
 
16
   You should have received a copy of the GNU General Public License
17
   along with this program; if not, write to the Free Software
18
   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
19
 
20
#include "bfd.h"
21
#include "sysdep.h"
22
#include "libbfd.h"
23
#include "elf-bfd.h"
24
#include "elf/ip2k.h"
25
 
26
/* Struct used to pass miscellaneous paramaters which
27
   helps to avoid overly long parameter lists.  */
28
struct misc
29
{
30
  Elf_Internal_Shdr *  symtab_hdr;
31
  Elf_Internal_Rela *  irelbase;
32
  bfd_byte *           contents;
33
  Elf_Internal_Sym *   isymbuf;
34
};
35
 
36
/* Prototypes.  */
37
static reloc_howto_type *    ip2k_reloc_type_lookup               PARAMS ((bfd *, bfd_reloc_code_real_type));
38
static void                  ip2k_info_to_howto_rela              PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
39
static asection *            ip2k_elf_gc_mark_hook                PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *, struct elf_link_hash_entry *, Elf_Internal_Sym *));
40
static boolean               ip2k_elf_gc_sweep_hook               PARAMS ((bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *));
41
static bfd_vma               symbol_value                         PARAMS ((bfd *, Elf_Internal_Shdr *, Elf32_Internal_Sym *, Elf_Internal_Rela *));
42
static void                  adjust_all_relocations               PARAMS ((bfd *, asection *, bfd_vma, bfd_vma, int, int));
43
static boolean               ip2k_elf_relax_delete_bytes          PARAMS ((bfd *, asection *, bfd_vma, int));
44
static boolean               ip2k_elf_relax_add_bytes             PARAMS ((bfd *, asection *, bfd_vma, const bfd_byte *, int, int));
45
static boolean               add_page_insn                        PARAMS ((bfd *, asection *, Elf_Internal_Rela *, struct misc *));
46
static boolean               ip2k_elf_relax_section               PARAMS ((bfd *, asection *, struct bfd_link_info *, boolean *));
47
static boolean               relax_switch_dispatch_tables_pass1   PARAMS ((bfd *, asection *, bfd_vma, struct misc *));
48
static boolean               unrelax_dispatch_table_entries       PARAMS ((bfd *, asection *, bfd_vma, bfd_vma, boolean *, struct misc *));
49
static boolean               unrelax_switch_dispatch_tables_passN PARAMS ((bfd *, asection *, bfd_vma, boolean *, struct misc *));
50
static boolean               is_switch_128_dispatch_table_p       PARAMS ((bfd *, bfd_vma, boolean, struct misc *));
51
static boolean               is_switch_256_dispatch_table_p       PARAMS ((bfd *, bfd_vma, boolean, struct misc *));
52
static boolean               ip2k_elf_relax_section_pass1         PARAMS ((bfd *, asection *, boolean *, struct misc *));
53
static boolean               ip2k_elf_relax_section_passN         PARAMS ((bfd *, asection *, boolean *, boolean *, struct misc *));
54
static bfd_reloc_status_type ip2k_final_link_relocate             PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, bfd_vma));
55
static boolean               ip2k_elf_relocate_section            PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
56
 
57
#define IS_OPCODE(CODE0,CODE1,OPCODE) \
58
  ((CODE0) == (OPCODE)[0] && (CODE1) == (OPCODE)[1])
59
 
60
#define PAGE_INSN_0             0x00
61
#define PAGE_INSN_1             0x10
62
 
63
static const bfd_byte page_opcode[] =
64
{
65
   PAGE_INSN_0, PAGE_INSN_1
66
};
67
 
68
#define IS_PAGE_OPCODE(CODE0,CODE1) \
69
  IS_OPCODE (CODE0, CODE1, page_opcode)
70
 
71
#define JMP_INSN_0              0xE0
72
#define JMP_INSN_1              0x00
73
 
74
static const bfd_byte jmp_opcode[] =
75
{
76
   JMP_INSN_0, JMP_INSN_1
77
};
78
 
79
#define IS_JMP_OPCODE(CODE0,CODE1) \
80
  IS_OPCODE (CODE0, CODE1, jmp_opcode)
81
 
82
#define CALL_INSN_0             0xC0
83
#define CALL_INSN_1             0x00
84
 
85
static const bfd_byte call_opcode[] =
86
{
87
  CALL_INSN_0, CALL_INSN_1
88
};
89
 
90
#define IS_CALL_OPCODE(CODE0,CODE1) \
91
  IS_OPCODE (CODE0, CODE1, call_opcode)
92
 
93
#define ADD_PCL_W_INSN_0        0x1E
94
#define ADD_PCL_W_INSN_1        0x09
95
 
96
static const bfd_byte add_pcl_w_opcode[] =
97
{
98
  ADD_PCL_W_INSN_0, ADD_PCL_W_INSN_1
99
};
100
 
101
#define IS_ADD_PCL_W_OPCODE(CODE0,CODE1) \
102
  IS_OPCODE (CODE0, CODE1, add_pcl_w_opcode)
103
 
104
#define ADD_W_WREG_INSN_0       0x1C
105
#define ADD_W_WREG_INSN_1       0x0A
106
 
107
static const bfd_byte add_w_wreg_opcode[] =
108
{
109
  ADD_W_WREG_INSN_0, ADD_W_WREG_INSN_1
110
};
111
 
112
#define IS_ADD_W_WREG_OPCODE(CODE0,CODE1) \
113
  IS_OPCODE (CODE0, CODE1, add_w_wreg_opcode)
114
 
115
#define SNC_INSN_0              0xA0
116
#define SNC_INSN_1              0x0B
117
 
118
static const bfd_byte snc_opcode[] =
119
{
120
   SNC_INSN_0, SNC_INSN_1
121
};
122
 
123
#define IS_SNC_OPCODE(CODE0,CODE1) \
124
  IS_OPCODE (CODE0, CODE1, snc_opcode)
125
 
126
#define INC_1_SP_INSN_0         0x2B
127
#define INC_1_SP_INSN_1         0x81
128
 
129
static const bfd_byte inc_1_sp_opcode[] =
130
{
131
   INC_1_SP_INSN_0, INC_1_SP_INSN_1
132
};
133
 
134
#define IS_INC_1_SP_OPCODE(CODE0,CODE1) \
135
  IS_OPCODE (CODE0, CODE1, inc_1_sp_opcode)
136
 
137
#define ADD_2_SP_W_INSN_0       0x1F
138
#define ADD_2_SP_W_INSN_1       0x82
139
 
140
static const bfd_byte add_2_sp_w_opcode[] =
141
{
142
   ADD_2_SP_W_INSN_0, ADD_2_SP_W_INSN_1
143
};
144
 
145
#define IS_ADD_2_SP_W_OPCODE(CODE0,CODE1) \
146
  IS_OPCODE (CODE0, CODE1, add_2_sp_w_opcode)
147
 
148
/* Relocation tables. */
149
static reloc_howto_type ip2k_elf_howto_table [] =
150
{
151
#define IP2K_HOWTO(t,rs,s,bs,pr,bp,name,sm,dm) \
152
    HOWTO(t,                    /* type */ \
153
          rs,                   /* rightshift */ \
154
          s,                    /* size (0 = byte, 1 = short, 2 = long) */ \
155
          bs,                   /* bitsize */ \
156
          pr,                   /* pc_relative */ \
157
          bp,                   /* bitpos */ \
158
          complain_overflow_dont,/* complain_on_overflow */ \
159
          bfd_elf_generic_reloc,/* special_function */ \
160
          name,                 /* name */ \
161
          false,                /* partial_inplace */ \
162
          sm,                   /* src_mask */ \
163
          dm,                   /* dst_mask */ \
164
          pr)                   /* pcrel_offset */
165
 
166
  /* This reloc does nothing. */
167
  IP2K_HOWTO (R_IP2K_NONE, 0,2,32, false, 0, "R_IP2K_NONE", 0, 0),
168
  /* A 16 bit absolute relocation.  */
169
  IP2K_HOWTO (R_IP2K_16, 0,1,16, false, 0, "R_IP2K_16", 0, 0xffff),
170
  /* A 32 bit absolute relocation.  */
171
  IP2K_HOWTO (R_IP2K_32, 0,2,32, false, 0, "R_IP2K_32", 0, 0xffffffff),
172
  /* A 8-bit data relocation for the FR9 field.  Ninth bit is computed specially.  */
173
  IP2K_HOWTO (R_IP2K_FR9, 0,1,9, false, 0, "R_IP2K_FR9", 0, 0x00ff),
174
  /* A 4-bit data relocation.  */
175
  IP2K_HOWTO (R_IP2K_BANK, 8,1,4, false, 0, "R_IP2K_BANK", 0, 0x000f),
176
  /* A 13-bit insn relocation - word address => right-shift 1 bit extra.  */
177
  IP2K_HOWTO (R_IP2K_ADDR16CJP, 1,1,13, false, 0, "R_IP2K_ADDR16CJP", 0, 0x1fff),
178
  /* A 3-bit insn relocation - word address => right-shift 1 bit extra.  */
179
  IP2K_HOWTO (R_IP2K_PAGE3, 14,1,3, false, 0, "R_IP2K_PAGE3", 0, 0x0007),
180
  /* Two 8-bit data relocations.  */
181
  IP2K_HOWTO (R_IP2K_LO8DATA, 0,1,8, false, 0, "R_IP2K_LO8DATA", 0, 0x00ff),
182
  IP2K_HOWTO (R_IP2K_HI8DATA, 8,1,8, false, 0, "R_IP2K_HI8DATA", 0, 0x00ff),
183
  /* Two 8-bit insn relocations.  word address => right-shift 1 bit extra.  */
184
  IP2K_HOWTO (R_IP2K_LO8INSN, 1,1,8, false, 0, "R_IP2K_LO8INSN", 0, 0x00ff),
185
  IP2K_HOWTO (R_IP2K_HI8INSN, 9,1,8, false, 0, "R_IP2K_HI8INSN", 0, 0x00ff),
186
 
187
  /* Special 1 bit relocation for SKIP instructions.  */
188
  IP2K_HOWTO (R_IP2K_PC_SKIP, 1,1,1, false, 12, "R_IP2K_PC_SKIP", 0xfffe, 0x1000),
189
  /* 16 bit word address.  */
190
  IP2K_HOWTO (R_IP2K_TEXT, 1,1,16, false, 0, "R_IP2K_TEXT", 0, 0xffff),
191
  /* A 7-bit offset relocation for the FR9 field.  Eigth and ninth bit comes from insn.  */
192
  IP2K_HOWTO (R_IP2K_FR_OFFSET, 0,1,9, false, 0, "R_IP2K_FR_OFFSET", 0x180, 0x007f),
193
  /* Bits 23:16 of an address.  */
194
  IP2K_HOWTO (R_IP2K_EX8DATA, 16,1,8, false, 0, "R_IP2K_EX8DATA", 0, 0x00ff),
195
};
196
 
197
 
198
/* Map BFD reloc types to IP2K ELF reloc types. */
199
static reloc_howto_type *
200
ip2k_reloc_type_lookup (abfd, code)
201
     bfd * abfd ATTRIBUTE_UNUSED;
202
     bfd_reloc_code_real_type code;
203
{
204
  /* Note that the ip2k_elf_howto_table is indxed by the R_
205
     constants.  Thus, the order that the howto records appear in the
206
     table *must* match the order of the relocation types defined in
207
     include/elf/ip2k.h. */
208
 
209
  switch (code)
210
    {
211
    case BFD_RELOC_NONE:
212
      return &ip2k_elf_howto_table[ (int) R_IP2K_NONE];
213
    case BFD_RELOC_16:
214
      return &ip2k_elf_howto_table[ (int) R_IP2K_16];
215
    case BFD_RELOC_32:
216
      return &ip2k_elf_howto_table[ (int) R_IP2K_32];
217
    case BFD_RELOC_IP2K_FR9:
218
      return &ip2k_elf_howto_table[ (int) R_IP2K_FR9];
219
    case BFD_RELOC_IP2K_BANK:
220
      return &ip2k_elf_howto_table[ (int) R_IP2K_BANK];
221
    case BFD_RELOC_IP2K_ADDR16CJP:
222
      return &ip2k_elf_howto_table[ (int) R_IP2K_ADDR16CJP];
223
    case BFD_RELOC_IP2K_PAGE3:
224
      return &ip2k_elf_howto_table[ (int) R_IP2K_PAGE3];
225
    case BFD_RELOC_IP2K_LO8DATA:
226
      return &ip2k_elf_howto_table[ (int) R_IP2K_LO8DATA];
227
    case BFD_RELOC_IP2K_HI8DATA:
228
      return &ip2k_elf_howto_table[ (int) R_IP2K_HI8DATA];
229
    case BFD_RELOC_IP2K_LO8INSN:
230
      return &ip2k_elf_howto_table[ (int) R_IP2K_LO8INSN];
231
    case BFD_RELOC_IP2K_HI8INSN:
232
      return &ip2k_elf_howto_table[ (int) R_IP2K_HI8INSN];
233
    case BFD_RELOC_IP2K_PC_SKIP:
234
      return &ip2k_elf_howto_table[ (int) R_IP2K_PC_SKIP];
235
    case BFD_RELOC_IP2K_TEXT:
236
      return &ip2k_elf_howto_table[ (int) R_IP2K_TEXT];
237
    case BFD_RELOC_IP2K_FR_OFFSET:
238
      return &ip2k_elf_howto_table[ (int) R_IP2K_FR_OFFSET];
239
    case BFD_RELOC_IP2K_EX8DATA:
240
      return &ip2k_elf_howto_table[ (int) R_IP2K_EX8DATA];
241
    default:
242
      /* Pacify gcc -Wall. */
243
      return NULL;
244
    }
245
  return NULL;
246
}
247
 
248
#define PAGENO(ABSADDR) ((ABSADDR) & 0x1C000)
249
#define BASEADDR(SEC)   ((SEC)->output_section->vma + (SEC)->output_offset)
250
 
251
#define UNDEFINED_SYMBOL (~(bfd_vma)0)
252
 
253
/* Return the value of the symbol associated with the relocation IREL.  */
254
 
255
static bfd_vma
256
symbol_value (abfd, symtab_hdr, isymbuf, irel)
257
     bfd *abfd;
258
     Elf_Internal_Shdr *symtab_hdr;
259
     Elf32_Internal_Sym *isymbuf;
260
     Elf_Internal_Rela *irel;
261
{
262
  if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
263
    {
264
      Elf_Internal_Sym *isym;
265
      asection *sym_sec;
266
 
267
      isym = isymbuf + ELF32_R_SYM (irel->r_info);
268
      if (isym->st_shndx == SHN_UNDEF)
269
        sym_sec = bfd_und_section_ptr;
270
      else if (isym->st_shndx == SHN_ABS)
271
        sym_sec = bfd_abs_section_ptr;
272
      else if (isym->st_shndx == SHN_COMMON)
273
        sym_sec = bfd_com_section_ptr;
274
      else
275
        sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
276
 
277
      return isym->st_value + BASEADDR (sym_sec);
278
    }
279
  else
280
    {
281
      unsigned long indx;
282
      struct elf_link_hash_entry *h;
283
 
284
      indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
285
      h = elf_sym_hashes (abfd)[indx];
286
      BFD_ASSERT (h != NULL);
287
 
288
      if (h->root.type != bfd_link_hash_defined
289
          && h->root.type != bfd_link_hash_defweak)
290
        return UNDEFINED_SYMBOL;
291
 
292
      return (h->root.u.def.value + BASEADDR (h->root.u.def.section));
293
    }
294
}
295
 
296
/* Determine if the instruction sequence matches that for
297
   the prologue of a switch dispatch table with fewer than
298
   128 entries.
299
 
300
          sc
301
          page    $nnn0
302
          jmp     $nnn0
303
          add     w,wreg
304
          add     pcl,w
305
  addr=>
306
          page    $nnn1
307
          jmp     $nnn1
308
           page    $nnn2
309
           jmp     $nnn2
310
           ...
311
           page    $nnnN
312
           jmp     $nnnN
313
 
314
  After relaxation.
315
           sc
316
           page    $nnn0
317
           jmp     $nnn0
318
           add     pcl,w
319
  addr=>
320
           jmp     $nnn1
321
           jmp     $nnn2
322
           ...
323
          jmp     $nnnN  */
324
 
325
static boolean
326
is_switch_128_dispatch_table_p (abfd, addr, relaxed, misc)
327
     bfd *abfd ATTRIBUTE_UNUSED;
328
     bfd_vma addr;
329
     boolean relaxed;
330
     struct misc *misc;
331
{
332
  bfd_byte code0, code1;
333
 
334
  if (addr < (3 * 2))
335
    return false;
336
 
337
  code0 = bfd_get_8 (abfd, misc->contents + addr - 2);
338
  code1 = bfd_get_8 (abfd, misc->contents + addr - 1);
339
 
340
  /* Is it ADD PCL,W */
341
  if (! IS_ADD_PCL_W_OPCODE (code0, code1))
342
    return false;
343
 
344
  code0 = bfd_get_8 (abfd, misc->contents + addr - 4);
345
  code1 = bfd_get_8 (abfd, misc->contents + addr - 3);
346
 
347
  if (relaxed)
348
    /* Is it ADD W,WREG  */
349
    return ! IS_ADD_W_WREG_OPCODE (code0, code1);
350
 
351
  else
352
    {
353
      /* Is it ADD W,WREG  */
354
      if (! IS_ADD_W_WREG_OPCODE (code0, code1))
355
        return false;
356
 
357
      code0 = bfd_get_8 (abfd, misc->contents + addr - 6);
358
      code1 = bfd_get_8 (abfd, misc->contents + addr - 5);
359
 
360
      /* Is it JMP $nnnn  */
361
      if (! IS_JMP_OPCODE (code0, code1))
362
        return false;
363
    }
364
 
365
  /* It looks like we've found the prologue for
366
     a 1-127 entry switch dispatch table.  */
367
  return true;
368
}
369
 
370
/* Determine if the instruction sequence matches that for
371
   the prologue switch dispatch table with fewer than
372
   256 entries but more than 127.
373
 
374
   Before relaxation.
375
          push    %lo8insn(label) ; Push address of table
376
          push    %hi8insn(label)
377
          add     w,wreg          ; index*2 => offset
378
          snc                     ; CARRY SET?
379
          inc     1(sp)           ; Propagate MSB into table address
380
          add     2(sp),w         ; Add low bits of offset to table address
381
          snc                     ; and handle any carry-out
382
          inc     1(sp)
383
   addr=>
384
          page    __indjmp        ; Do an indirect jump to that location
385
          jmp     __indjmp
386
   label:                         ; case dispatch table starts here
387
           page    $nnn1
388
           jmp     $nnn1
389
           page    $nnn2
390
           jmp     $nnn2
391
           ...
392
           page    $nnnN
393
           jmp     $nnnN
394
 
395
  After relaxation.
396
          push    %lo8insn(label) ; Push address of table
397
          push    %hi8insn(label)
398
          add     2(sp),w         ; Add low bits of offset to table address
399
          snc                     ; and handle any carry-out
400
          inc     1(sp)
401
  addr=>
402
          page    __indjmp        ; Do an indirect jump to that location
403
          jmp     __indjmp
404
   label:                         ; case dispatch table starts here
405
          jmp     $nnn1
406
          jmp     $nnn2
407
          ...
408
          jmp     $nnnN  */
409
 
410
static boolean
411
is_switch_256_dispatch_table_p (abfd, addr, relaxed,  misc)
412
     bfd *abfd ATTRIBUTE_UNUSED;
413
     bfd_vma addr;
414
     boolean relaxed;
415
     struct misc *misc;
416
{
417
  bfd_byte code0, code1;
418
 
419
  if (addr < (8 * 2))
420
    return false;
421
 
422
  code0 = bfd_get_8 (abfd, misc->contents + addr - 2);
423
  code1 = bfd_get_8 (abfd, misc->contents + addr - 1);
424
 
425
  /* Is it INC 1(SP).  */
426
  if (! IS_INC_1_SP_OPCODE (code0, code1))
427
    return false;
428
 
429
  code0 = bfd_get_8 (abfd, misc->contents + addr - 4);
430
  code1 = bfd_get_8 (abfd, misc->contents + addr - 3);
431
 
432
  /* Is it SNC.  */
433
  if (! IS_SNC_OPCODE (code0, code1))
434
    return false;
435
 
436
  code0 = bfd_get_8 (abfd, misc->contents + addr - 6);
437
  code1 = bfd_get_8 (abfd, misc->contents + addr - 5);
438
 
439
  /* Is it ADD 2(SP),W.  */
440
  if (! IS_ADD_2_SP_W_OPCODE (code0, code1))
441
    return false;
442
 
443
  code0 = bfd_get_8 (abfd, misc->contents + addr - 8);
444
  code1 = bfd_get_8 (abfd, misc->contents + addr - 7);
445
 
446
  if (relaxed)
447
    /* Is it INC 1(SP).  */
448
    return ! IS_INC_1_SP_OPCODE (code0, code1);
449
 
450
  else
451
    {
452
      /* Is it INC 1(SP).  */
453
      if (! IS_INC_1_SP_OPCODE (code0, code1))
454
        return false;
455
 
456
      code0 = bfd_get_8 (abfd, misc->contents + addr - 10);
457
      code1 = bfd_get_8 (abfd, misc->contents + addr - 9);
458
 
459
      /* Is it SNC.  */
460
      if (! IS_SNC_OPCODE (code0, code1))
461
        return false;
462
 
463
      code0 = bfd_get_8 (abfd, misc->contents + addr - 12);
464
      code1 = bfd_get_8 (abfd, misc->contents + addr - 11);
465
 
466
      /* Is it ADD W,WREG.  */
467
      if (! IS_ADD_W_WREG_OPCODE (code0, code1))
468
        return false;
469
    }
470
 
471
  /* It looks like we've found the prologue for
472
     a 128-255 entry switch dispatch table.  */
473
  return true;
474
}
475
 
476
static boolean
477
relax_switch_dispatch_tables_pass1 (abfd, sec, addr, misc)
478
     bfd *abfd;
479
     asection *sec;
480
     bfd_vma addr;
481
     struct misc *misc;
482
{
483
  if (addr + 3 < sec->_cooked_size)
484
    {
485
      bfd_byte code0 = bfd_get_8 (abfd, misc->contents + addr + 2);
486
      bfd_byte code1 = bfd_get_8 (abfd, misc->contents + addr + 3);
487
 
488
      if (IS_JMP_OPCODE (code0, code1)
489
          && is_switch_128_dispatch_table_p (abfd, addr, false, misc))
490
        {
491
          /* Delete ADD W,WREG from prologue.  */
492
          ip2k_elf_relax_delete_bytes (abfd, sec, addr - (2 * 2), (1 * 2));
493
          return true;
494
        }
495
 
496
      if (IS_JMP_OPCODE (code0, code1)
497
          && is_switch_256_dispatch_table_p (abfd, addr, false, misc))
498
        {
499
          /* Delete ADD W,WREG; SNC ; INC 1(SP) from prologue.  */
500
          ip2k_elf_relax_delete_bytes (abfd, sec, addr - 6 * 2, 3 * 2);
501
          return true;
502
        }
503
    }
504
 
505
  return true;
506
}
507
 
508
static boolean
509
unrelax_dispatch_table_entries (abfd, sec, first, last, changed, misc)
510
     bfd *abfd;
511
     asection *sec;
512
     bfd_vma first;
513
     bfd_vma last;
514
     boolean *changed;
515
     struct misc *misc;
516
{
517
  bfd_vma addr = first;
518
 
519
  while (addr < last)
520
    {
521
      bfd_byte code0 = bfd_get_8 (abfd, misc->contents + addr);
522
      bfd_byte code1 = bfd_get_8 (abfd, misc->contents + addr + 1);
523
 
524
      /* We are only expecting to find PAGE or JMP insns
525
         in the dispatch table. If we find anything else
526
         something has gone wrong failed the relaxation
527
         which will cause the link to be aborted.  */
528
 
529
      if (IS_PAGE_OPCODE (code0, code1))
530
        /* Skip the PAGE and JMP insns.  */
531
        addr += 4;
532
      else if (IS_JMP_OPCODE (code0, code1))
533
         {
534
            Elf_Internal_Rela * irelend = misc->irelbase
535
                                          + sec->reloc_count;
536
            Elf_Internal_Rela * irel;
537
 
538
            /* Find the relocation entry.  */
539
            for (irel = misc->irelbase; irel < irelend; irel++)
540
               {
541
                  if (irel->r_offset == addr
542
                      && ELF32_R_TYPE (irel->r_info) == R_IP2K_ADDR16CJP)
543
                    {
544
                      if (! add_page_insn (abfd, sec, irel, misc))
545
                        /* Something has gone wrong.  */
546
                        return false;
547
 
548
                      *changed = true;
549
                      break;
550
                    }
551
               }
552
 
553
            /* If we fell off the end something has gone wrong.  */
554
            if (irel >= irelend)
555
              /* Something has gone wrong.  */
556
              return false;
557
 
558
            /* Skip the PAGE and JMP isns.  */
559
            addr += 4;
560
            /* Acount for the new PAGE insn.  */
561
            last += 2;
562
          }
563
       else
564
         /* Something has gone wrong.  */
565
         return false;
566
    }
567
 
568
  return true;
569
}
570
 
571
static boolean
572
unrelax_switch_dispatch_tables_passN (abfd, sec, addr, changed, misc)
573
     bfd *abfd;
574
     asection *sec;
575
     bfd_vma addr;
576
     boolean *changed;
577
     struct misc *misc;
578
{
579
  if (2 <= addr && (addr + 3) < sec->_cooked_size)
580
    {
581
      bfd_byte code0 = bfd_get_8 (abfd, misc->contents + addr - 2);
582
      bfd_byte code1 = bfd_get_8 (abfd, misc->contents + addr - 1);
583
 
584
      if (IS_PAGE_OPCODE (code0, code1))
585
        {
586
          addr -= 2;
587
          code0 = bfd_get_8 (abfd, misc->contents + addr + 2);
588
          code1 = bfd_get_8 (abfd, misc->contents + addr + 3);
589
        }
590
      else
591
        {
592
          code0 = bfd_get_8 (abfd, misc->contents + addr);
593
          code1 = bfd_get_8 (abfd, misc->contents + addr + 1);
594
        }
595
 
596
      if (IS_JMP_OPCODE (code0, code1)
597
          && is_switch_128_dispatch_table_p (abfd, addr, true, misc))
598
        {
599
          bfd_vma first = addr;
600
          bfd_vma last  = first;
601
          boolean relaxed = true;
602
 
603
          /* On the final pass we must check if *all* entries in the
604
             dispatch table are relaxed. If *any* are not relaxed
605
             then we must unrelax *all* the entries in the dispach
606
             table and also unrelax the dispatch table prologue.  */
607
 
608
          /* Find the last entry in the dispach table.  */
609
          while (last < sec->_cooked_size)
610
             {
611
                code0 = bfd_get_8 (abfd, misc->contents + last);
612
                code1 = bfd_get_8 (abfd, misc->contents + last + 1);
613
 
614
                if (IS_PAGE_OPCODE (code0, code1))
615
                  relaxed = false;
616
                else if (! IS_JMP_OPCODE (code0, code1))
617
                    break;
618
 
619
                last += 2;
620
             }
621
 
622
          /* We should have found the end of the dispatch table
623
             before reaching the end of the section. If we've have
624
             reached the end then fail the relaxation which will
625
             cause the link to be aborted.  */
626
          if (last >= sec->_cooked_size)
627
            /* Something has gone wrong.  */
628
            return false;
629
 
630
          /* If we found an unrelaxed entry then
631
             unlrelax all the switch table entries.  */
632
          if (! relaxed )
633
            {
634
              if (! unrelax_dispatch_table_entries (abfd, sec, first,
635
                                                    last, changed, misc))
636
                /* Something has gone wrong.  */
637
                return false;
638
 
639
              if (! is_switch_128_dispatch_table_p (abfd, addr, true, misc))
640
                /* Something has gone wrong.  */
641
                return false;
642
 
643
              /* Unrelax the prologue.  */
644
 
645
              /* Insert an ADD W,WREG insnstruction.  */
646
              if (! ip2k_elf_relax_add_bytes (abfd, sec,
647
                                              addr - 2,
648
                                              add_w_wreg_opcode,
649
                                              sizeof (add_w_wreg_opcode),
650
                                              0))
651
                /* Something has gone wrong.  */
652
                return false;
653
            }
654
 
655
          return true;
656
        }
657
 
658
      if (IS_JMP_OPCODE (code0, code1)
659
          && is_switch_256_dispatch_table_p (abfd, addr, true, misc))
660
        {
661
          bfd_vma first = addr;
662
          bfd_vma last;
663
          boolean relaxed = true;
664
 
665
          /* On the final pass we must check if *all* entries in the
666
             dispatch table are relaxed. If *any* are not relaxed
667
             then we must unrelax *all* the entries in the dispach
668
             table and also unrelax the dispatch table prologue.  */
669
 
670
          /* Note the 1st PAGE/JMP instructions are part of the
671
             prologue and can safely be relaxed.  */
672
 
673
          code0 = bfd_get_8 (abfd, misc->contents + first);
674
          code1 = bfd_get_8 (abfd, misc->contents + first + 1);
675
 
676
          if (IS_PAGE_OPCODE (code0, code1))
677
            {
678
              first += 2;
679
              code0 = bfd_get_8 (abfd, misc->contents + first);
680
              code1 = bfd_get_8 (abfd, misc->contents + first + 1);
681
            }
682
 
683
          if (! IS_JMP_OPCODE (code0, code1))
684
            /* Something has gone wrong.  */
685
            return false;
686
 
687
          first += 2;
688
          last = first;
689
 
690
          /* Find the last entry in the dispach table.  */
691
          while (last < sec->_cooked_size)
692
             {
693
                code0 = bfd_get_8 (abfd, misc->contents + last);
694
                code1 = bfd_get_8 (abfd, misc->contents + last + 1);
695
 
696
                if (IS_PAGE_OPCODE (code0, code1))
697
                  relaxed = false;
698
                else if (! IS_JMP_OPCODE (code0, code1))
699
                    break;
700
 
701
                last += 2;
702
             }
703
 
704
          /* We should have found the end of the dispatch table
705
             before reaching the end of the section. If we have
706
             reached the end of the section then fail the
707
             relaxation.  */
708
          if (last >= sec->_cooked_size)
709
            return false;
710
 
711
          /* If we found an unrelaxed entry then
712
              unrelax all the switch table entries.  */
713
          if (! relaxed)
714
            {
715
              if (! unrelax_dispatch_table_entries (abfd, sec, first,
716
                                                    last, changed, misc))
717
                return false;
718
 
719
              if (! is_switch_256_dispatch_table_p (abfd, addr, true, misc))
720
                return false;
721
 
722
              /* Unrelax the prologue.  */
723
 
724
              /* Insert an INC 1(SP) insnstruction.  */
725
              if (! ip2k_elf_relax_add_bytes (abfd, sec,
726
                                              addr - 6,
727
                                              inc_1_sp_opcode,
728
                                              sizeof (inc_1_sp_opcode),
729
                                              0))
730
                return false;
731
 
732
              /* Insert an SNC insnstruction.  */
733
              if (! ip2k_elf_relax_add_bytes (abfd, sec,
734
                                              addr - 6,
735
                                              snc_opcode,
736
                                              sizeof (snc_opcode),
737
                                              0))
738
                return false;
739
 
740
              /* Insert an ADD W,WREG insnstruction.  */
741
              if (! ip2k_elf_relax_add_bytes (abfd, sec,
742
                                             addr - 6,
743
                                             add_w_wreg_opcode,
744
                                             sizeof (add_w_wreg_opcode),
745
                                             0))
746
                return false;
747
            }
748
 
749
          return true;
750
        }
751
    }
752
 
753
  return true;
754
}
755
 
756
/* This function handles relaxing for the ip2k.  */
757
 
758
static boolean
759
ip2k_elf_relax_section (abfd, sec, link_info, again)
760
     bfd *abfd;
761
     asection *sec;
762
     struct bfd_link_info *link_info;
763
     boolean *again;
764
{
765
  Elf_Internal_Shdr *symtab_hdr;
766
  Elf_Internal_Rela *internal_relocs;
767
  bfd_byte *contents = NULL;
768
  Elf_Internal_Sym *isymbuf = NULL;
769
  static asection * first_section = NULL;
770
  static asection * last_section = NULL;
771
  static boolean changed = false;
772
  static boolean final_pass = false;
773
  static unsigned int pass = 0;
774
  struct misc misc;
775
  asection *stab;
776
 
777
  /* Assume nothing changes.  */
778
  *again = false;
779
 
780
  if (first_section == NULL)
781
    first_section = sec;
782
 
783
  if (first_section == sec)
784
    {
785
      changed = false;
786
      pass++;
787
    }
788
 
789
  /* If we make too many passes then it's a sign that
790
     something is wrong and we fail the relaxation.
791
     Note if everything is working correctly then the
792
     relaxation should converge reasonably quickly.  */
793
  if (pass == 4096)
794
    return false;
795
 
796
  /* We don't have to do anything for a relocatable link,
797
     if this section does not have relocs, or if this is
798
     not a code section.  */
799
  if (link_info->relocateable
800
      || (sec->flags & SEC_RELOC) == 0
801
      || sec->reloc_count == 0
802
      || (sec->flags & SEC_CODE) == 0)
803
    return true;
804
 
805
  if (pass == 1)
806
    last_section = sec;
807
 
808
  /* If this is the first time we have been called
809
      for this section, initialise the cooked size.  */
810
  if (sec->_cooked_size == 0)
811
    sec->_cooked_size = sec->_raw_size;
812
 
813
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
814
 
815
  internal_relocs = _bfd_elf32_link_read_relocs (abfd, sec, NULL,
816
                                                 (Elf_Internal_Rela *)NULL,
817
                                                 link_info->keep_memory);
818
  if (internal_relocs == NULL)
819
    goto error_return;
820
 
821
  /* Make sure the stac.rela stuff gets read in.  */
822
  stab = bfd_get_section_by_name (abfd, ".stab");
823
 
824
  if (stab)
825
    {
826
      /* So stab does exits.  */
827
      Elf_Internal_Rela * irelbase;
828
 
829
      irelbase = _bfd_elf32_link_read_relocs (abfd, stab, NULL,
830
                                              (Elf_Internal_Rela *)NULL,
831
                                              link_info->keep_memory);
832
    }
833
 
834
  /* Get section contents cached copy if it exists.  */
835
  if (contents == NULL)
836
    {
837
      /* Get cached copy if it exists.  */
838
      if (elf_section_data (sec)->this_hdr.contents != NULL)
839
        contents = elf_section_data (sec)->this_hdr.contents;
840
      else
841
        {
842
          /* Go get them off disk.  */
843
          contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
844
          if (contents == NULL)
845
            goto error_return;
846
 
847
          if (! bfd_get_section_contents (abfd, sec, contents,
848
                                          (file_ptr) 0, sec->_raw_size))
849
            goto error_return;
850
        }
851
    }
852
 
853
  /* Read this BFD's symbols cached copy if it exists.  */
854
  if (isymbuf == NULL && symtab_hdr->sh_info != 0)
855
    {
856
      isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
857
      if (isymbuf == NULL)
858
        isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
859
                                        symtab_hdr->sh_info, 0,
860
                                        NULL, NULL, NULL);
861
      if (isymbuf == NULL)
862
        goto error_return;
863
    }
864
 
865
  misc.symtab_hdr = symtab_hdr;
866
  misc.isymbuf = isymbuf;
867
  misc.irelbase = internal_relocs;
868
  misc.contents = contents;
869
 
870
  /* This is where all the relaxation actually get done.  */
871
 
872
  if (pass == 1)
873
    {
874
      /* On the first pass we remove *all* page instructions and
875
         relax the prolog for switch dispatch tables. This gets
876
         us to the starting point for subsequent passes where
877
         we add page instructions back in as needed.  */
878
 
879
      if (! ip2k_elf_relax_section_pass1 (abfd, sec, again, &misc))
880
        goto error_return;
881
 
882
      changed |= *again;
883
    }
884
  else
885
    {
886
      /* Add page instructions back in as needed but we ignore
887
         the issue with sections (functions) crossing a page
888
         boundary until we have converged to an approximate
889
         solution (i.e. nothing has changed on this relaxation
890
         pass) and we then know roughly where the page boundaries
891
         will end up.
892
 
893
         After we have have converged to an approximate solution
894
         we set the final pass flag and continue relaxing. On these
895
         final passes if a section (function) cross page boundary
896
         we will add *all* the page instructions back into such
897
         sections.
898
 
899
         After adding *all* page instructions back into a section
900
         which crosses a page bounbdary we reset the final pass flag
901
         so the we will again interate until we find a new approximate
902
         solution which is closer to the final solution.  */
903
 
904
      if (! ip2k_elf_relax_section_passN (abfd, sec, again, &final_pass,
905
                                          &misc))
906
        goto error_return;
907
 
908
      changed |= *again;
909
 
910
      /* If nothing has changed on this relaxation
911
          pass restart the final relaxaton pass.  */
912
      if (! changed && last_section == sec)
913
        {
914
          /* If this was the final pass and we didn't reset
915
             the final pass flag then we are done, otherwise
916
             do another final pass.  */
917
          if (! final_pass)
918
            {
919
              final_pass = true;
920
              *again = true;
921
            }
922
        }
923
    }
924
 
925
  /* Perform some house keeping after relaxing the section.  */
926
 
927
  if (isymbuf != NULL
928
      && symtab_hdr->contents != (unsigned char *) isymbuf)
929
    {
930
      if (! link_info->keep_memory)
931
        free (isymbuf);
932
      else
933
        symtab_hdr->contents = (unsigned char *) isymbuf;
934
    }
935
 
936
  if (contents != NULL
937
      && elf_section_data (sec)->this_hdr.contents != contents)
938
    {
939
      if (! link_info->keep_memory)
940
        free (contents);
941
      else
942
        {
943
          /* Cache the section contents for elf_link_input_bfd.  */
944
          elf_section_data (sec)->this_hdr.contents = contents;
945
        }
946
    }
947
 
948
  if (internal_relocs != NULL
949
      && elf_section_data (sec)->relocs != internal_relocs)
950
    free (internal_relocs);
951
 
952
  return true;
953
 
954
 error_return:
955
  if (isymbuf != NULL
956
      && symtab_hdr->contents != (unsigned char *) isymbuf)
957
    free (isymbuf);
958
  if (contents != NULL
959
      && elf_section_data (sec)->this_hdr.contents != contents)
960
    free (contents);
961
  if (internal_relocs != NULL
962
      && elf_section_data (sec)->relocs != internal_relocs)
963
    free (internal_relocs);
964
  return false;
965
}
966
 
967
/* This function handles relaxation during the first pass.  */
968
 
969
static boolean
970
ip2k_elf_relax_section_pass1 (abfd, sec, again, misc)
971
     bfd *abfd;
972
     asection *sec;
973
     boolean *again;
974
     struct misc * misc;
975
{
976
  Elf_Internal_Rela *irelend = misc->irelbase + sec->reloc_count;
977
  Elf_Internal_Rela *irel;
978
 
979
  /* Walk thru the section looking for relaxation opertunities.  */
980
  for (irel = misc->irelbase; irel < irelend; irel++)
981
    {
982
      if (ELF32_R_TYPE (irel->r_info) == (int) R_IP2K_PAGE3)
983
      {
984
        bfd_byte code0 = bfd_get_8 (abfd,
985
                                    misc->contents + irel->r_offset);
986
        bfd_byte code1 = bfd_get_8 (abfd,
987
                                    misc->contents + irel->r_offset + 1);
988
 
989
        /* Verify that this is the PAGE opcode.  */
990
        if (IS_PAGE_OPCODE (code0, code1))
991
          {
992
            /* Note that we've changed the relocs, section contents, etc.  */
993
            elf_section_data (sec)->relocs = misc->irelbase;
994
            elf_section_data (sec)->this_hdr.contents = misc->contents;
995
            misc->symtab_hdr->contents = (bfd_byte *) misc->isymbuf;
996
 
997
            /* Handle switch dispatch tables/prologues.  */
998
            if (!  relax_switch_dispatch_tables_pass1 (abfd, sec,
999
                                                       irel->r_offset, misc))
1000
              return false;
1001
 
1002
            /* Fix the relocation's type.  */
1003
            irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1004
                                         R_IP2K_NONE);
1005
 
1006
            /* Delete the PAGE insn.  */
1007
            if (! ip2k_elf_relax_delete_bytes (abfd, sec,
1008
                                               irel->r_offset,
1009
                                               sizeof (page_opcode)))
1010
              return false;
1011
 
1012
            /* That will change things, so, we should relax again.
1013
               Note that this is not required, and it may be slow.  */
1014
            *again = true;
1015
          }
1016
      }
1017
    }
1018
 
1019
  return true;
1020
}
1021
 
1022
/* This function handles relaxation for 2nd and subsequent passes.  */
1023
 
1024
static boolean
1025
ip2k_elf_relax_section_passN (abfd, sec, again, final_pass, misc)
1026
     bfd *abfd;
1027
     asection *sec;
1028
     boolean *again;
1029
     boolean *final_pass;
1030
     struct misc * misc;
1031
{
1032
  Elf_Internal_Rela *irelend = misc->irelbase + sec->reloc_count;
1033
  Elf_Internal_Rela *irel;
1034
  boolean add_all;
1035
 
1036
  /* If we are on the final relaxation pass and the section crosses
1037
     then set a flag to indicate that *all* page instructions need
1038
     to be added back into this section.  */
1039
  if (*final_pass)
1040
    {
1041
      add_all = (PAGENO (BASEADDR (sec))
1042
                 != PAGENO (BASEADDR (sec) + sec->_cooked_size));
1043
 
1044
      /* If this section crosses a page boundary set the crossed
1045
         page boundary flag.  */
1046
      if (add_all)
1047
        sec->userdata = sec;
1048
      else
1049
        {
1050
          /* If the section had previously crossed a page boundary
1051
             but on this pass does not then reset crossed page
1052
             boundary flag and rerun the 1st relaxation pass on
1053
             this section.  */
1054
          if (sec->userdata)
1055
            {
1056
              sec->userdata = NULL;
1057
              if (! ip2k_elf_relax_section_pass1 (abfd, sec, again, misc))
1058
                return false;
1059
            }
1060
        }
1061
    }
1062
  else
1063
    add_all = false;
1064
 
1065
  /* Walk thru the section looking for call/jmp
1066
      instructions which need a page instruction.  */
1067
  for (irel = misc->irelbase; irel < irelend; irel++)
1068
    {
1069
      if (ELF32_R_TYPE (irel->r_info) == (int) R_IP2K_ADDR16CJP)
1070
      {
1071
        /* Get the value of the symbol referred to by the reloc.  */
1072
        bfd_vma symval = symbol_value (abfd, misc->symtab_hdr, misc->isymbuf,
1073
                                       irel);
1074
        bfd_byte code0, code1;
1075
 
1076
        if (symval == UNDEFINED_SYMBOL)
1077
          {
1078
            /* This appears to be a reference to an undefined
1079
               symbol.  Just ignore it--it will be caught by the
1080
               regular reloc processing.  */
1081
            continue;
1082
          }
1083
 
1084
        /* For simplicity of coding, we are going to modify the section
1085
           contents, the section relocs, and the BFD symbol table.  We
1086
           must tell the rest of the code not to free up this
1087
           information.  It would be possible to instead create a table
1088
           of changes which have to be made, as is done in coff-mips.c;
1089
           that would be more work, but would require less memory when
1090
           the linker is run.  */
1091
 
1092
        /* Get the opcode.  */
1093
        code0 = bfd_get_8 (abfd, misc->contents + irel->r_offset);
1094
        code1 = bfd_get_8 (abfd, misc->contents + irel->r_offset + 1);
1095
 
1096
        if (IS_JMP_OPCODE (code0, code1) || IS_CALL_OPCODE (code0, code1))
1097
          {
1098
            if (*final_pass)
1099
              {
1100
                if (! unrelax_switch_dispatch_tables_passN (abfd, sec,
1101
                                                            irel->r_offset,
1102
                                                            again, misc))
1103
                  return false;
1104
 
1105
                if (*again)
1106
                  add_all = false;
1107
              }
1108
 
1109
            code0 = bfd_get_8 (abfd, misc->contents + irel->r_offset - 2);
1110
            code1 = bfd_get_8 (abfd, misc->contents + irel->r_offset - 1);
1111
 
1112
            if (! IS_PAGE_OPCODE (code0, code1))
1113
              {
1114
                bfd_vma value = symval + irel->r_addend;
1115
                bfd_vma addr  = BASEADDR (sec) + irel->r_offset;
1116
 
1117
                if (add_all || PAGENO (addr) != PAGENO (value))
1118
                  {
1119
                    if (! add_page_insn (abfd, sec, irel, misc))
1120
                      return false;
1121
 
1122
                    /* That will have changed things, so,  we must relax again.  */
1123
                    *again = true;
1124
                  }
1125
               }
1126
           }
1127
        }
1128
    }
1129
 
1130
  /* If anything changed reset the final pass flag.  */
1131
  if (*again)
1132
    *final_pass = false;
1133
 
1134
  return true;
1135
}
1136
 
1137
/* Parts of a Stabs entry.  */
1138
 
1139
#define STRDXOFF  (0)
1140
#define TYPEOFF   (4)
1141
#define OTHEROFF  (5)
1142
#define DESCOFF   (6)
1143
#define VALOFF    (8)
1144
#define STABSIZE  (12)
1145
 
1146
/* Adjust all the relocations entries after adding or inserting instructions.  */
1147
 
1148
static void
1149
adjust_all_relocations (abfd, sec, addr, endaddr, count, noadj)
1150
     bfd *abfd;
1151
     asection *sec;
1152
     bfd_vma addr;
1153
     bfd_vma endaddr;
1154
     int count;
1155
     int noadj;
1156
{
1157
  Elf_Internal_Shdr *symtab_hdr;
1158
  Elf_Internal_Sym *isymbuf, *isym, *isymend;
1159
  unsigned int shndx;
1160
  bfd_byte *contents;
1161
  Elf_Internal_Rela *irel, *irelend, *irelbase;
1162
  struct elf_link_hash_entry **sym_hashes;
1163
  struct elf_link_hash_entry **end_hashes;
1164
  unsigned int symcount;
1165
 
1166
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1167
  isymbuf = (Elf32_Internal_Sym *) symtab_hdr->contents;
1168
 
1169
  shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1170
 
1171
  contents = elf_section_data (sec)->this_hdr.contents;
1172
 
1173
  irelbase = elf_section_data (sec)->relocs;
1174
  irelend = irelbase + sec->reloc_count;
1175
 
1176
  for (irel = irelbase; irel < irelend; irel++)
1177
    {
1178
      if (ELF32_R_TYPE (irel->r_info) != R_IP2K_NONE)
1179
        {
1180
          /* Get the value of the symbol referred to by the reloc.  */
1181
          if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1182
            {
1183
              asection *sym_sec;
1184
 
1185
              /* A local symbol.  */
1186
              isym = isymbuf + ELF32_R_SYM (irel->r_info);
1187
              sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1188
 
1189
              if (isym->st_shndx == shndx)
1190
                {
1191
                  bfd_vma baseaddr = BASEADDR (sec);
1192
                  bfd_vma symval = BASEADDR (sym_sec) + isym->st_value
1193
                                   + irel->r_addend;
1194
 
1195
                  if ((baseaddr + addr + noadj) <= symval
1196
                      && symval < (baseaddr + endaddr))
1197
                    irel->r_addend += count;
1198
                }
1199
            }
1200
        }
1201
 
1202
      /* Do this only for PC space relocations.  */
1203
      if (addr <= irel->r_offset && irel->r_offset < endaddr)
1204
        irel->r_offset += count;
1205
    }
1206
 
1207
  /* When adding an instruction back it is sometimes necessary to move any
1208
     global or local symbol that was referencing the first instruction of
1209
     the moved block to refer to the first instruction of the inserted block.
1210
 
1211
     For example adding a PAGE instruction before a CALL or JMP requires
1212
     that any label on the CALL or JMP is moved to the PAGE insn.  */
1213
  addr += noadj;
1214
 
1215
  /* Adjust the local symbols defined in this section.  */
1216
  isymend = isymbuf + symtab_hdr->sh_info;
1217
  for (isym = isymbuf; isym < isymend; isym++)
1218
    {
1219
      if (isym->st_shndx == shndx
1220
          && addr <= isym->st_value
1221
          && isym->st_value < endaddr)
1222
        isym->st_value += count;
1223
    }
1224
 
1225
    /* Now adjust the global symbols defined in this section.  */
1226
  symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1227
              - symtab_hdr->sh_info);
1228
  sym_hashes = elf_sym_hashes (abfd);
1229
  end_hashes = sym_hashes + symcount;
1230
  for (; sym_hashes < end_hashes; sym_hashes++)
1231
    {
1232
      struct elf_link_hash_entry *sym_hash = *sym_hashes;
1233
      if ((sym_hash->root.type == bfd_link_hash_defined
1234
           || sym_hash->root.type == bfd_link_hash_defweak)
1235
          && sym_hash->root.u.def.section == sec)
1236
        {
1237
          if (addr <= sym_hash->root.u.def.value
1238
              && sym_hash->root.u.def.value < endaddr)
1239
            {
1240
              sym_hash->root.u.def.value += count;
1241
            }
1242
        }
1243
    }
1244
 
1245
  return;
1246
}
1247
 
1248
static boolean
1249
add_page_insn (abfd, sec, irel, misc)
1250
      bfd *abfd;
1251
      asection *sec;
1252
      Elf_Internal_Rela *irel;
1253
      struct misc *misc;
1254
{
1255
  /* Note that we've changed the relocs, section contents, etc.  */
1256
  elf_section_data (sec)->relocs = misc->irelbase;
1257
  elf_section_data (sec)->this_hdr.contents = misc->contents;
1258
  misc->symtab_hdr->contents = (bfd_byte *) misc->isymbuf;
1259
 
1260
  /* Add the PAGE insn.  */
1261
  if (! ip2k_elf_relax_add_bytes (abfd, sec, irel->r_offset,
1262
                                  page_opcode,
1263
                                  sizeof (page_opcode),
1264
                                  sizeof (page_opcode)))
1265
    return false;
1266
  else
1267
    {
1268
       Elf32_Internal_Rela * jrel = irel - 1;
1269
 
1270
       /* Add relocation for PAGE insn added.  */
1271
       if (ELF32_R_TYPE (jrel->r_info) != R_IP2K_NONE)
1272
         {
1273
           bfd_byte code0, code1;
1274
           char *msg = NULL;
1275
 
1276
           /* Get the opcode.  */
1277
           code0 = bfd_get_8 (abfd, misc->contents + irel->r_offset);
1278
           code1 = bfd_get_8 (abfd, misc->contents + irel->r_offset + 1);
1279
 
1280
           if (IS_JMP_OPCODE (code0, code1))
1281
             msg = "\tJMP instruction missing a preceeding PAGE instruction in %s\n\n";
1282
 
1283
           else if (IS_CALL_OPCODE (code0, code1))
1284
             msg = "\tCALL instruction missing a preceeding PAGE instruction in %s\n\n";
1285
 
1286
           if (msg)
1287
             {
1288
               fprintf (stderr, "\n\t *** LINKER RELAXATION failure ***\n");
1289
               fprintf (stderr, msg, sec->owner->filename);
1290
             }
1291
 
1292
           return false;
1293
         }
1294
 
1295
       jrel->r_addend = irel->r_addend;
1296
       jrel->r_offset = irel->r_offset - sizeof (page_opcode);
1297
       jrel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1298
                                    R_IP2K_PAGE3);
1299
     }
1300
 
1301
   return true;
1302
}
1303
 
1304
/* Insert bytes into a section while relaxing.  */
1305
 
1306
static boolean
1307
ip2k_elf_relax_add_bytes (abfd, sec, addr, bytes, count, noadj)
1308
     bfd *abfd;
1309
     asection *sec;
1310
     bfd_vma addr;
1311
     const bfd_byte *bytes;
1312
     int count;
1313
     int noadj;
1314
{
1315
  bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
1316
  bfd_vma endaddr = sec->_cooked_size;
1317
 
1318
  /* Make room to insert the bytes.  */
1319
  memmove (contents + addr + count, contents + addr, endaddr - addr);
1320
 
1321
  /* Insert the bytes into the section.  */
1322
  memcpy  (contents + addr, bytes, count);
1323
 
1324
  sec->_cooked_size += count;
1325
 
1326
  adjust_all_relocations (abfd, sec, addr, endaddr, count, noadj);
1327
  return true;
1328
}
1329
 
1330
/* Delete some bytes from a section while relaxing.  */
1331
 
1332
static boolean
1333
ip2k_elf_relax_delete_bytes (abfd, sec, addr, count)
1334
     bfd *abfd;
1335
     asection *sec;
1336
     bfd_vma addr;
1337
     int count;
1338
{
1339
  bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
1340
  bfd_vma endaddr = sec->_cooked_size;
1341
 
1342
  /* Actually delete the bytes.  */
1343
  memmove (contents + addr, contents + addr + count,
1344
           endaddr - addr - count);
1345
 
1346
  sec->_cooked_size -= count;
1347
 
1348
  adjust_all_relocations (abfd, sec, addr + count, endaddr, -count, 0);
1349
  return true;
1350
}
1351
 
1352
/* -------------------------------------------------------------------- */
1353
 
1354
/* XXX: The following code is the result of a cut&paste.  This unfortunate
1355
   practice is very widespread in the various target back-end files.  */
1356
 
1357
/* Set the howto pointer for a IP2K ELF reloc.  */
1358
 
1359
static void
1360
ip2k_info_to_howto_rela (abfd, cache_ptr, dst)
1361
     bfd * abfd ATTRIBUTE_UNUSED;
1362
     arelent * cache_ptr;
1363
     Elf32_Internal_Rela * dst;
1364
{
1365
  unsigned int r_type;
1366
 
1367
  r_type = ELF32_R_TYPE (dst->r_info);
1368
  switch (r_type)
1369
    {
1370
    default:
1371
      cache_ptr->howto = & ip2k_elf_howto_table [r_type];
1372
      break;
1373
    }
1374
}
1375
 
1376
/* Perform a single relocation.
1377
   By default we use the standard BFD routines.  */
1378
 
1379
static bfd_reloc_status_type
1380
ip2k_final_link_relocate (howto, input_bfd, input_section, contents, rel,
1381
                          relocation)
1382
     reloc_howto_type *  howto;
1383
     bfd *               input_bfd;
1384
     asection *          input_section;
1385
     bfd_byte *          contents;
1386
     Elf_Internal_Rela * rel;
1387
     bfd_vma             relocation;
1388
{
1389
  bfd_reloc_status_type r = bfd_reloc_ok;
1390
 
1391
  switch (howto->type)
1392
    {
1393
      /* Handle data space relocations.  */
1394
    case R_IP2K_FR9:
1395
    case R_IP2K_BANK:
1396
      if ((relocation & IP2K_DATA_MASK) == IP2K_DATA_VALUE)
1397
        relocation &= ~IP2K_DATA_MASK;
1398
      else
1399
        r = bfd_reloc_notsupported;
1400
      break;
1401
 
1402
    case R_IP2K_LO8DATA:
1403
    case R_IP2K_HI8DATA:
1404
    case R_IP2K_EX8DATA:
1405
      break;
1406
 
1407
      /* Handle insn space relocations.  */
1408
    case R_IP2K_ADDR16CJP:
1409
    case R_IP2K_PAGE3:
1410
    case R_IP2K_LO8INSN:
1411
    case R_IP2K_HI8INSN:
1412
    case R_IP2K_PC_SKIP:
1413
      if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1414
        relocation &= ~IP2K_INSN_MASK;
1415
      else
1416
        r = bfd_reloc_notsupported;
1417
      break;
1418
 
1419
    case R_IP2K_16:
1420
      /* If this is a relocation involving a TEXT
1421
         symbol, reduce it to a word address.  */
1422
      if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1423
        howto = &ip2k_elf_howto_table[ (int) R_IP2K_TEXT];
1424
      break;
1425
 
1426
      /* Pass others through.  */
1427
    default:
1428
      break;
1429
    }
1430
 
1431
  /* Only install relocation if above tests did not disqualify it.  */
1432
  if (r == bfd_reloc_ok)
1433
    r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1434
                                  contents, rel->r_offset,
1435
                                  relocation, rel->r_addend);
1436
 
1437
  return r;
1438
}
1439
 
1440
/* Relocate a IP2K ELF section.
1441
 
1442
   The RELOCATE_SECTION function is called by the new ELF backend linker
1443
   to handle the relocations for a section.
1444
 
1445
   The relocs are always passed as Rela structures; if the section
1446
   actually uses Rel structures, the r_addend field will always be
1447
   zero.
1448
 
1449
   This function is responsible for adjusting the section contents as
1450
   necessary, and (if using Rela relocs and generating a relocateable
1451
   output file) adjusting the reloc addend as necessary.
1452
 
1453
   This function does not have to worry about setting the reloc
1454
   address or the reloc symbol index.
1455
 
1456
   LOCAL_SYMS is a pointer to the swapped in local symbols.
1457
 
1458
   LOCAL_SECTIONS is an array giving the section in the input file
1459
   corresponding to the st_shndx field of each local symbol.
1460
 
1461
   The global hash table entry for the global symbols can be found
1462
   via elf_sym_hashes (input_bfd).
1463
 
1464
   When generating relocateable output, this function must handle
1465
   STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
1466
   going to be the section symbol corresponding to the output
1467
   section, which means that the addend must be adjusted
1468
   accordingly.  */
1469
 
1470
static boolean
1471
ip2k_elf_relocate_section (output_bfd, info, input_bfd, input_section,
1472
                           contents, relocs, local_syms, local_sections)
1473
     bfd *                   output_bfd ATTRIBUTE_UNUSED;
1474
     struct bfd_link_info *  info;
1475
     bfd *                   input_bfd;
1476
     asection *              input_section;
1477
     bfd_byte *              contents;
1478
     Elf_Internal_Rela *     relocs;
1479
     Elf_Internal_Sym *      local_syms;
1480
     asection **             local_sections;
1481
{
1482
  Elf_Internal_Shdr *           symtab_hdr;
1483
  struct elf_link_hash_entry ** sym_hashes;
1484
  Elf_Internal_Rela *           rel;
1485
  Elf_Internal_Rela *           relend;
1486
 
1487
  if (info->relocateable)
1488
    return true;
1489
 
1490
  symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1491
  sym_hashes = elf_sym_hashes (input_bfd);
1492
  relend     = relocs + input_section->reloc_count;
1493
 
1494
  for (rel = relocs; rel < relend; rel ++)
1495
    {
1496
      reloc_howto_type *           howto;
1497
      unsigned long                r_symndx;
1498
      Elf_Internal_Sym *           sym;
1499
      asection *                   sec;
1500
      struct elf_link_hash_entry * h;
1501
      bfd_vma                      relocation;
1502
      bfd_reloc_status_type        r;
1503
      const char *                 name = NULL;
1504
      int                          r_type;
1505
 
1506
      /* This is a final link.  */
1507
      r_type = ELF32_R_TYPE (rel->r_info);
1508
      r_symndx = ELF32_R_SYM (rel->r_info);
1509
      howto  = ip2k_elf_howto_table + ELF32_R_TYPE (rel->r_info);
1510
      h      = NULL;
1511
      sym    = NULL;
1512
      sec    = NULL;
1513
 
1514
      if (r_symndx < symtab_hdr->sh_info)
1515
        {
1516
          sym = local_syms + r_symndx;
1517
          sec = local_sections [r_symndx];
1518
          relocation = BASEADDR (sec) + sym->st_value;
1519
 
1520
          name = bfd_elf_string_from_elf_section
1521
            (input_bfd, symtab_hdr->sh_link, sym->st_name);
1522
          name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
1523
        }
1524
      else
1525
        {
1526
          h = sym_hashes [r_symndx - symtab_hdr->sh_info];
1527
 
1528
          while (h->root.type == bfd_link_hash_indirect
1529
                 || h->root.type == bfd_link_hash_warning)
1530
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
1531
 
1532
          name = h->root.root.string;
1533
 
1534
          if (h->root.type == bfd_link_hash_defined
1535
              || h->root.type == bfd_link_hash_defweak)
1536
            {
1537
              sec = h->root.u.def.section;
1538
              relocation = h->root.u.def.value + BASEADDR (sec);
1539
            }
1540
          else if (h->root.type == bfd_link_hash_undefweak)
1541
            {
1542
              relocation = 0;
1543
            }
1544
          else
1545
            {
1546
              if (! ((*info->callbacks->undefined_symbol)
1547
                     (info, h->root.root.string, input_bfd,
1548
                      input_section, rel->r_offset,
1549
                     (! info->shared || info->no_undefined))))
1550
                return false;
1551
              relocation = 0;
1552
            }
1553
        }
1554
 
1555
      /* Finally, the sole IP2K-specific part.  */
1556
      r = ip2k_final_link_relocate (howto, input_bfd, input_section,
1557
                                     contents, rel, relocation);
1558
 
1559
      if (r != bfd_reloc_ok)
1560
        {
1561
          const char * msg = (const char *) NULL;
1562
 
1563
          switch (r)
1564
            {
1565
            case bfd_reloc_overflow:
1566
              r = info->callbacks->reloc_overflow
1567
                (info, name, howto->name, (bfd_vma) 0,
1568
                 input_bfd, input_section, rel->r_offset);
1569
              break;
1570
 
1571
            case bfd_reloc_undefined:
1572
              r = info->callbacks->undefined_symbol
1573
                (info, name, input_bfd, input_section, rel->r_offset, true);
1574
              break;
1575
 
1576
            case bfd_reloc_outofrange:
1577
              msg = _("internal error: out of range error");
1578
              break;
1579
 
1580
              /* This is how ip2k_final_link_relocate tells us of a non-kosher
1581
                 reference between insn & data address spaces.  */
1582
            case bfd_reloc_notsupported:
1583
              if (sym != NULL) /* Only if it's not an unresolved symbol.  */
1584
                 msg = _("unsupported relocation between data/insn address spaces");
1585
              break;
1586
 
1587
            case bfd_reloc_dangerous:
1588
              msg = _("internal error: dangerous relocation");
1589
              break;
1590
 
1591
            default:
1592
              msg = _("internal error: unknown error");
1593
              break;
1594
            }
1595
 
1596
          if (msg)
1597
            r = info->callbacks->warning
1598
              (info, msg, name, input_bfd, input_section, rel->r_offset);
1599
 
1600
          if (! r)
1601
            return false;
1602
        }
1603
    }
1604
 
1605
  return true;
1606
}
1607
 
1608
static asection *
1609
ip2k_elf_gc_mark_hook (sec, info, rel, h, sym)
1610
     asection *sec;
1611
     struct bfd_link_info *info ATTRIBUTE_UNUSED;
1612
     Elf_Internal_Rela *rel;
1613
     struct elf_link_hash_entry *h;
1614
     Elf_Internal_Sym *sym;
1615
{
1616
  if (h != NULL)
1617
    {
1618
      switch (ELF32_R_TYPE (rel->r_info))
1619
      {
1620
#if 0 
1621
      case R_IP2K_GNU_VTINHERIT:
1622
      case R_IP2K_GNU_VTENTRY:
1623
        break;
1624
#endif
1625
 
1626
      default:
1627
        switch (h->root.type)
1628
          {
1629
          case bfd_link_hash_defined:
1630
          case bfd_link_hash_defweak:
1631
            return h->root.u.def.section;
1632
 
1633
          case bfd_link_hash_common:
1634
            return h->root.u.c.p->section;
1635
 
1636
          default:
1637
            break;
1638
          }
1639
       }
1640
     }
1641
   else
1642
     {
1643
       if (!(elf_bad_symtab (sec->owner)
1644
             && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
1645
           && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
1646
                 && sym->st_shndx != SHN_COMMON))
1647
          {
1648
            return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
1649
          }
1650
      }
1651
  return NULL;
1652
}
1653
 
1654
static boolean
1655
ip2k_elf_gc_sweep_hook (abfd, info, sec, relocs)
1656
     bfd *abfd ATTRIBUTE_UNUSED;
1657
     struct bfd_link_info *info ATTRIBUTE_UNUSED;
1658
     asection *sec ATTRIBUTE_UNUSED;
1659
     const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
1660
{
1661
  /* we don't use got and plt entries for ip2k */
1662
  return true;
1663
}
1664
 
1665
 
1666
/* -------------------------------------------------------------------- */
1667
 
1668
 
1669
#define TARGET_BIG_SYM   bfd_elf32_ip2k_vec
1670
#define TARGET_BIG_NAME  "elf32-ip2k"
1671
 
1672
#define ELF_ARCH         bfd_arch_ip2k
1673
#define ELF_MACHINE_CODE EM_IP2K
1674
#define ELF_MAXPAGESIZE  1 /* No pages on the IP2K */
1675
 
1676
#define elf_info_to_howto_rel                   NULL
1677
#define elf_info_to_howto                       ip2k_info_to_howto_rela
1678
 
1679
#define elf_backend_can_gc_sections             1
1680
#define elf_backend_rela_normal                 1
1681
#define elf_backend_gc_mark_hook                ip2k_elf_gc_mark_hook
1682
#define elf_backend_gc_sweep_hook               ip2k_elf_gc_sweep_hook
1683
 
1684
#define elf_backend_relocate_section            ip2k_elf_relocate_section
1685
 
1686
#define elf_symbol_leading_char                 '_'
1687
#define bfd_elf32_bfd_reloc_type_lookup         ip2k_reloc_type_lookup
1688
#define bfd_elf32_bfd_relax_section             ip2k_elf_relax_section
1689
 
1690
 
1691
#include "elf32-target.h"
1692
 

powered by: WebSVN 2.1.0

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