aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf32-ip2k.c
diff options
context:
space:
mode:
Diffstat (limited to 'bfd/elf32-ip2k.c')
-rw-r--r--bfd/elf32-ip2k.c374
1 files changed, 199 insertions, 175 deletions
diff --git a/bfd/elf32-ip2k.c b/bfd/elf32-ip2k.c
index 9181982..dd2bb97f 100644
--- a/bfd/elf32-ip2k.c
+++ b/bfd/elf32-ip2k.c
@@ -34,25 +34,49 @@ struct misc
};
/* Prototypes. */
-static reloc_howto_type * ip2k_reloc_type_lookup PARAMS ((bfd *, bfd_reloc_code_real_type));
-static void ip2k_info_to_howto_rela PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
-static asection * ip2k_elf_gc_mark_hook PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *, struct elf_link_hash_entry *, Elf_Internal_Sym *));
-static boolean ip2k_elf_gc_sweep_hook PARAMS ((bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *));
-static bfd_vma symbol_value PARAMS ((bfd *, Elf_Internal_Shdr *, Elf_Internal_Sym *, Elf_Internal_Rela *));
-static void adjust_all_relocations PARAMS ((bfd *, asection *, bfd_vma, bfd_vma, int, int));
-static boolean ip2k_elf_relax_delete_bytes PARAMS ((bfd *, asection *, bfd_vma, int));
-static boolean ip2k_elf_relax_add_bytes PARAMS ((bfd *, asection *, bfd_vma, const bfd_byte *, int, int));
-static boolean add_page_insn PARAMS ((bfd *, asection *, Elf_Internal_Rela *, struct misc *));
-static boolean ip2k_elf_relax_section PARAMS ((bfd *, asection *, struct bfd_link_info *, boolean *));
-static boolean relax_switch_dispatch_tables_pass1 PARAMS ((bfd *, asection *, bfd_vma, struct misc *));
-static boolean unrelax_dispatch_table_entries PARAMS ((bfd *, asection *, bfd_vma, bfd_vma, boolean *, struct misc *));
-static boolean unrelax_switch_dispatch_tables_passN PARAMS ((bfd *, asection *, bfd_vma, boolean *, struct misc *));
-static boolean is_switch_128_dispatch_table_p PARAMS ((bfd *, bfd_vma, boolean, struct misc *));
-static boolean is_switch_256_dispatch_table_p PARAMS ((bfd *, bfd_vma, boolean, struct misc *));
-static boolean ip2k_elf_relax_section_pass1 PARAMS ((bfd *, asection *, boolean *, struct misc *));
-static boolean ip2k_elf_relax_section_passN PARAMS ((bfd *, asection *, boolean *, boolean *, struct misc *));
-static bfd_reloc_status_type ip2k_final_link_relocate PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, bfd_vma));
-static boolean ip2k_elf_relocate_section PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
+static reloc_howto_type *ip2k_reloc_type_lookup
+ PARAMS ((bfd *, bfd_reloc_code_real_type));
+static void ip2k_info_to_howto_rela
+ PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
+static asection * ip2k_elf_gc_mark_hook
+ PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *,
+ struct elf_link_hash_entry *, Elf_Internal_Sym *));
+static bfd_boolean ip2k_elf_gc_sweep_hook
+ PARAMS ((bfd *, struct bfd_link_info *, asection *,
+ const Elf_Internal_Rela *));
+static bfd_vma symbol_value
+ PARAMS ((bfd *, Elf_Internal_Shdr *, Elf_Internal_Sym *,
+ Elf_Internal_Rela *));
+static void adjust_all_relocations
+ PARAMS ((bfd *, asection *, bfd_vma, bfd_vma, int, int));
+static bfd_boolean ip2k_elf_relax_delete_bytes
+ PARAMS ((bfd *, asection *, bfd_vma, int));
+static bfd_boolean ip2k_elf_relax_add_bytes
+ PARAMS ((bfd *, asection *, bfd_vma, const bfd_byte *, int, int));
+static bfd_boolean add_page_insn
+ PARAMS ((bfd *, asection *, Elf_Internal_Rela *, struct misc *));
+static bfd_boolean ip2k_elf_relax_section
+ PARAMS ((bfd *, asection *, struct bfd_link_info *, bfd_boolean *));
+static bfd_boolean relax_switch_dispatch_tables_pass1
+ PARAMS ((bfd *, asection *, bfd_vma, struct misc *));
+static bfd_boolean unrelax_dispatch_table_entries
+ PARAMS ((bfd *, asection *, bfd_vma, bfd_vma, bfd_boolean *, struct misc *));
+static bfd_boolean unrelax_switch_dispatch_tables_passN
+ PARAMS ((bfd *, asection *, bfd_vma, bfd_boolean *, struct misc *));
+static bfd_boolean is_switch_128_dispatch_table_p
+ PARAMS ((bfd *, bfd_vma, bfd_boolean, struct misc *));
+static bfd_boolean is_switch_256_dispatch_table_p
+ PARAMS ((bfd *, bfd_vma, bfd_boolean, struct misc *));
+static bfd_boolean ip2k_elf_relax_section_pass1
+ PARAMS ((bfd *, asection *, bfd_boolean *, struct misc *));
+static bfd_boolean ip2k_elf_relax_section_passN
+ PARAMS ((bfd *, asection *, bfd_boolean *, bfd_boolean *, struct misc *));
+static bfd_reloc_status_type ip2k_final_link_relocate
+ PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_byte *,
+ Elf_Internal_Rela *, bfd_vma));
+static bfd_boolean ip2k_elf_relocate_section
+ PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
+ Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
#define IS_OPCODE(CODE0,CODE1,OPCODE) \
((CODE0) == (OPCODE)[0] && (CODE1) == (OPCODE)[1])
@@ -158,40 +182,40 @@ static reloc_howto_type ip2k_elf_howto_table [] =
complain_overflow_dont,/* complain_on_overflow */ \
bfd_elf_generic_reloc,/* special_function */ \
name, /* name */ \
- false, /* partial_inplace */ \
+ FALSE, /* partial_inplace */ \
sm, /* src_mask */ \
dm, /* dst_mask */ \
pr) /* pcrel_offset */
/* This reloc does nothing. */
- IP2K_HOWTO (R_IP2K_NONE, 0,2,32, false, 0, "R_IP2K_NONE", 0, 0),
+ IP2K_HOWTO (R_IP2K_NONE, 0,2,32, FALSE, 0, "R_IP2K_NONE", 0, 0),
/* A 16 bit absolute relocation. */
- IP2K_HOWTO (R_IP2K_16, 0,1,16, false, 0, "R_IP2K_16", 0, 0xffff),
+ IP2K_HOWTO (R_IP2K_16, 0,1,16, FALSE, 0, "R_IP2K_16", 0, 0xffff),
/* A 32 bit absolute relocation. */
- IP2K_HOWTO (R_IP2K_32, 0,2,32, false, 0, "R_IP2K_32", 0, 0xffffffff),
+ IP2K_HOWTO (R_IP2K_32, 0,2,32, FALSE, 0, "R_IP2K_32", 0, 0xffffffff),
/* A 8-bit data relocation for the FR9 field. Ninth bit is computed specially. */
- IP2K_HOWTO (R_IP2K_FR9, 0,1,9, false, 0, "R_IP2K_FR9", 0, 0x00ff),
+ IP2K_HOWTO (R_IP2K_FR9, 0,1,9, FALSE, 0, "R_IP2K_FR9", 0, 0x00ff),
/* A 4-bit data relocation. */
- IP2K_HOWTO (R_IP2K_BANK, 8,1,4, false, 0, "R_IP2K_BANK", 0, 0x000f),
+ IP2K_HOWTO (R_IP2K_BANK, 8,1,4, FALSE, 0, "R_IP2K_BANK", 0, 0x000f),
/* A 13-bit insn relocation - word address => right-shift 1 bit extra. */
- IP2K_HOWTO (R_IP2K_ADDR16CJP, 1,1,13, false, 0, "R_IP2K_ADDR16CJP", 0, 0x1fff),
+ IP2K_HOWTO (R_IP2K_ADDR16CJP, 1,1,13, FALSE, 0, "R_IP2K_ADDR16CJP", 0, 0x1fff),
/* A 3-bit insn relocation - word address => right-shift 1 bit extra. */
- IP2K_HOWTO (R_IP2K_PAGE3, 14,1,3, false, 0, "R_IP2K_PAGE3", 0, 0x0007),
+ IP2K_HOWTO (R_IP2K_PAGE3, 14,1,3, FALSE, 0, "R_IP2K_PAGE3", 0, 0x0007),
/* Two 8-bit data relocations. */
- IP2K_HOWTO (R_IP2K_LO8DATA, 0,1,8, false, 0, "R_IP2K_LO8DATA", 0, 0x00ff),
- IP2K_HOWTO (R_IP2K_HI8DATA, 8,1,8, false, 0, "R_IP2K_HI8DATA", 0, 0x00ff),
+ IP2K_HOWTO (R_IP2K_LO8DATA, 0,1,8, FALSE, 0, "R_IP2K_LO8DATA", 0, 0x00ff),
+ IP2K_HOWTO (R_IP2K_HI8DATA, 8,1,8, FALSE, 0, "R_IP2K_HI8DATA", 0, 0x00ff),
/* Two 8-bit insn relocations. word address => right-shift 1 bit extra. */
- IP2K_HOWTO (R_IP2K_LO8INSN, 1,1,8, false, 0, "R_IP2K_LO8INSN", 0, 0x00ff),
- IP2K_HOWTO (R_IP2K_HI8INSN, 9,1,8, false, 0, "R_IP2K_HI8INSN", 0, 0x00ff),
+ IP2K_HOWTO (R_IP2K_LO8INSN, 1,1,8, FALSE, 0, "R_IP2K_LO8INSN", 0, 0x00ff),
+ IP2K_HOWTO (R_IP2K_HI8INSN, 9,1,8, FALSE, 0, "R_IP2K_HI8INSN", 0, 0x00ff),
/* Special 1 bit relocation for SKIP instructions. */
- IP2K_HOWTO (R_IP2K_PC_SKIP, 1,1,1, false, 12, "R_IP2K_PC_SKIP", 0xfffe, 0x1000),
+ IP2K_HOWTO (R_IP2K_PC_SKIP, 1,1,1, FALSE, 12, "R_IP2K_PC_SKIP", 0xfffe, 0x1000),
/* 16 bit word address. */
- IP2K_HOWTO (R_IP2K_TEXT, 1,1,16, false, 0, "R_IP2K_TEXT", 0, 0xffff),
+ IP2K_HOWTO (R_IP2K_TEXT, 1,1,16, FALSE, 0, "R_IP2K_TEXT", 0, 0xffff),
/* A 7-bit offset relocation for the FR9 field. Eigth and ninth bit comes from insn. */
- IP2K_HOWTO (R_IP2K_FR_OFFSET, 0,1,9, false, 0, "R_IP2K_FR_OFFSET", 0x180, 0x007f),
+ IP2K_HOWTO (R_IP2K_FR_OFFSET, 0,1,9, FALSE, 0, "R_IP2K_FR_OFFSET", 0x180, 0x007f),
/* Bits 23:16 of an address. */
- IP2K_HOWTO (R_IP2K_EX8DATA, 16,1,8, false, 0, "R_IP2K_EX8DATA", 0, 0x00ff),
+ IP2K_HOWTO (R_IP2K_EX8DATA, 16,1,8, FALSE, 0, "R_IP2K_EX8DATA", 0, 0x00ff),
};
@@ -257,7 +281,7 @@ symbol_value (abfd, symtab_hdr, isymbuf, irel)
bfd *abfd;
Elf_Internal_Shdr *symtab_hdr;
Elf_Internal_Sym *isymbuf;
- Elf_Internal_Rela *irel;
+ Elf_Internal_Rela *irel;
{
if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
{
@@ -296,7 +320,7 @@ symbol_value (abfd, symtab_hdr, isymbuf, irel)
/* Determine if the instruction sequence matches that for
the prologue of a switch dispatch table with fewer than
128 entries.
-
+
sc
page $nnn0
jmp $nnn0
@@ -310,7 +334,7 @@ symbol_value (abfd, symtab_hdr, isymbuf, irel)
...
page $nnnN
jmp $nnnN
-
+
After relaxation.
sc
page $nnn0
@@ -322,24 +346,24 @@ symbol_value (abfd, symtab_hdr, isymbuf, irel)
...
jmp $nnnN */
-static boolean
+static bfd_boolean
is_switch_128_dispatch_table_p (abfd, addr, relaxed, misc)
- bfd *abfd ATTRIBUTE_UNUSED;
+ bfd *abfd ATTRIBUTE_UNUSED;
bfd_vma addr;
- boolean relaxed;
+ bfd_boolean relaxed;
struct misc *misc;
{
bfd_byte code0, code1;
if (addr < (3 * 2))
- return false;
+ return FALSE;
code0 = bfd_get_8 (abfd, misc->contents + addr - 2);
code1 = bfd_get_8 (abfd, misc->contents + addr - 1);
/* Is it ADD PCL,W */
if (! IS_ADD_PCL_W_OPCODE (code0, code1))
- return false;
+ return FALSE;
code0 = bfd_get_8 (abfd, misc->contents + addr - 4);
code1 = bfd_get_8 (abfd, misc->contents + addr - 3);
@@ -352,25 +376,25 @@ is_switch_128_dispatch_table_p (abfd, addr, relaxed, misc)
{
/* Is it ADD W,WREG */
if (! IS_ADD_W_WREG_OPCODE (code0, code1))
- return false;
+ return FALSE;
code0 = bfd_get_8 (abfd, misc->contents + addr - 6);
code1 = bfd_get_8 (abfd, misc->contents + addr - 5);
/* Is it JMP $nnnn */
if (! IS_JMP_OPCODE (code0, code1))
- return false;
+ return FALSE;
}
/* It looks like we've found the prologue for
a 1-127 entry switch dispatch table. */
- return true;
+ return TRUE;
}
/* Determine if the instruction sequence matches that for
the prologue switch dispatch table with fewer than
256 entries but more than 127.
-
+
Before relaxation.
push %lo8insn(label) ; Push address of table
push %hi8insn(label)
@@ -391,7 +415,7 @@ is_switch_128_dispatch_table_p (abfd, addr, relaxed, misc)
...
page $nnnN
jmp $nnnN
-
+
After relaxation.
push %lo8insn(label) ; Push address of table
push %hi8insn(label)
@@ -407,38 +431,38 @@ is_switch_128_dispatch_table_p (abfd, addr, relaxed, misc)
...
jmp $nnnN */
-static boolean
+static bfd_boolean
is_switch_256_dispatch_table_p (abfd, addr, relaxed, misc)
bfd *abfd ATTRIBUTE_UNUSED;
bfd_vma addr;
- boolean relaxed;
+ bfd_boolean relaxed;
struct misc *misc;
{
bfd_byte code0, code1;
if (addr < (8 * 2))
- return false;
+ return FALSE;
code0 = bfd_get_8 (abfd, misc->contents + addr - 2);
code1 = bfd_get_8 (abfd, misc->contents + addr - 1);
/* Is it INC 1(SP). */
if (! IS_INC_1_SP_OPCODE (code0, code1))
- return false;
+ return FALSE;
code0 = bfd_get_8 (abfd, misc->contents + addr - 4);
code1 = bfd_get_8 (abfd, misc->contents + addr - 3);
/* Is it SNC. */
if (! IS_SNC_OPCODE (code0, code1))
- return false;
+ return FALSE;
code0 = bfd_get_8 (abfd, misc->contents + addr - 6);
code1 = bfd_get_8 (abfd, misc->contents + addr - 5);
/* Is it ADD 2(SP),W. */
if (! IS_ADD_2_SP_W_OPCODE (code0, code1))
- return false;
+ return FALSE;
code0 = bfd_get_8 (abfd, misc->contents + addr - 8);
code1 = bfd_get_8 (abfd, misc->contents + addr - 7);
@@ -451,29 +475,29 @@ is_switch_256_dispatch_table_p (abfd, addr, relaxed, misc)
{
/* Is it INC 1(SP). */
if (! IS_INC_1_SP_OPCODE (code0, code1))
- return false;
+ return FALSE;
code0 = bfd_get_8 (abfd, misc->contents + addr - 10);
code1 = bfd_get_8 (abfd, misc->contents + addr - 9);
-
+
/* Is it SNC. */
if (! IS_SNC_OPCODE (code0, code1))
- return false;
+ return FALSE;
code0 = bfd_get_8 (abfd, misc->contents + addr - 12);
code1 = bfd_get_8 (abfd, misc->contents + addr - 11);
/* Is it ADD W,WREG. */
if (! IS_ADD_W_WREG_OPCODE (code0, code1))
- return false;
+ return FALSE;
}
/* It looks like we've found the prologue for
a 128-255 entry switch dispatch table. */
- return true;
+ return TRUE;
}
-static boolean
+static bfd_boolean
relax_switch_dispatch_tables_pass1 (abfd, sec, addr, misc)
bfd *abfd;
asection *sec;
@@ -486,32 +510,32 @@ relax_switch_dispatch_tables_pass1 (abfd, sec, addr, misc)
bfd_byte code1 = bfd_get_8 (abfd, misc->contents + addr + 3);
if (IS_JMP_OPCODE (code0, code1)
- && is_switch_128_dispatch_table_p (abfd, addr, false, misc))
+ && is_switch_128_dispatch_table_p (abfd, addr, FALSE, misc))
{
/* Delete ADD W,WREG from prologue. */
ip2k_elf_relax_delete_bytes (abfd, sec, addr - (2 * 2), (1 * 2));
- return true;
+ return TRUE;
}
if (IS_JMP_OPCODE (code0, code1)
- && is_switch_256_dispatch_table_p (abfd, addr, false, misc))
+ && is_switch_256_dispatch_table_p (abfd, addr, FALSE, misc))
{
/* Delete ADD W,WREG; SNC ; INC 1(SP) from prologue. */
ip2k_elf_relax_delete_bytes (abfd, sec, addr - 6 * 2, 3 * 2);
- return true;
+ return TRUE;
}
}
-
- return true;
+
+ return TRUE;
}
-static boolean
+static bfd_boolean
unrelax_dispatch_table_entries (abfd, sec, first, last, changed, misc)
bfd *abfd;
asection *sec;
bfd_vma first;
bfd_vma last;
- boolean *changed;
+ bfd_boolean *changed;
struct misc *misc;
{
bfd_vma addr = first;
@@ -543,9 +567,9 @@ unrelax_dispatch_table_entries (abfd, sec, first, last, changed, misc)
{
if (! add_page_insn (abfd, sec, irel, misc))
/* Something has gone wrong. */
- return false;
+ return FALSE;
- *changed = true;
+ *changed = TRUE;
break;
}
}
@@ -553,7 +577,7 @@ unrelax_dispatch_table_entries (abfd, sec, first, last, changed, misc)
/* If we fell off the end something has gone wrong. */
if (irel >= irelend)
/* Something has gone wrong. */
- return false;
+ return FALSE;
/* Skip the PAGE and JMP isns. */
addr += 4;
@@ -562,18 +586,18 @@ unrelax_dispatch_table_entries (abfd, sec, first, last, changed, misc)
}
else
/* Something has gone wrong. */
- return false;
+ return FALSE;
}
- return true;
+ return TRUE;
}
-static boolean
+static bfd_boolean
unrelax_switch_dispatch_tables_passN (abfd, sec, addr, changed, misc)
bfd *abfd;
asection *sec;
bfd_vma addr;
- boolean *changed;
+ bfd_boolean *changed;
struct misc *misc;
{
if (2 <= addr && (addr + 3) < sec->_cooked_size)
@@ -594,11 +618,11 @@ unrelax_switch_dispatch_tables_passN (abfd, sec, addr, changed, misc)
}
if (IS_JMP_OPCODE (code0, code1)
- && is_switch_128_dispatch_table_p (abfd, addr, true, misc))
+ && is_switch_128_dispatch_table_p (abfd, addr, TRUE, misc))
{
bfd_vma first = addr;
bfd_vma last = first;
- boolean relaxed = true;
+ bfd_boolean relaxed = TRUE;
/* On the final pass we must check if *all* entries in the
dispatch table are relaxed. If *any* are not relaxed
@@ -612,7 +636,7 @@ unrelax_switch_dispatch_tables_passN (abfd, sec, addr, changed, misc)
code1 = bfd_get_8 (abfd, misc->contents + last + 1);
if (IS_PAGE_OPCODE (code0, code1))
- relaxed = false;
+ relaxed = FALSE;
else if (! IS_JMP_OPCODE (code0, code1))
break;
@@ -625,7 +649,7 @@ unrelax_switch_dispatch_tables_passN (abfd, sec, addr, changed, misc)
cause the link to be aborted. */
if (last >= sec->_cooked_size)
/* Something has gone wrong. */
- return false;
+ return FALSE;
/* If we found an unrelaxed entry then
unlrelax all the switch table entries. */
@@ -634,12 +658,12 @@ unrelax_switch_dispatch_tables_passN (abfd, sec, addr, changed, misc)
if (! unrelax_dispatch_table_entries (abfd, sec, first,
last, changed, misc))
/* Something has gone wrong. */
- return false;
+ return FALSE;
- if (! is_switch_128_dispatch_table_p (abfd, addr, true, misc))
+ if (! is_switch_128_dispatch_table_p (abfd, addr, TRUE, misc))
/* Something has gone wrong. */
- return false;
-
+ return FALSE;
+
/* Unrelax the prologue. */
/* Insert an ADD W,WREG insnstruction. */
@@ -649,18 +673,18 @@ unrelax_switch_dispatch_tables_passN (abfd, sec, addr, changed, misc)
sizeof (add_w_wreg_opcode),
0))
/* Something has gone wrong. */
- return false;
+ return FALSE;
}
- return true;
+ return TRUE;
}
if (IS_JMP_OPCODE (code0, code1)
- && is_switch_256_dispatch_table_p (abfd, addr, true, misc))
+ && is_switch_256_dispatch_table_p (abfd, addr, TRUE, misc))
{
bfd_vma first = addr;
bfd_vma last;
- boolean relaxed = true;
+ bfd_boolean relaxed = TRUE;
/* On the final pass we must check if *all* entries in the
dispatch table are relaxed. If *any* are not relaxed
@@ -682,10 +706,10 @@ unrelax_switch_dispatch_tables_passN (abfd, sec, addr, changed, misc)
if (! IS_JMP_OPCODE (code0, code1))
/* Something has gone wrong. */
- return false;
+ return FALSE;
first += 2;
- last = first;
+ last = first;
/* Find the last entry in the dispach table. */
while (last < sec->_cooked_size)
@@ -694,7 +718,7 @@ unrelax_switch_dispatch_tables_passN (abfd, sec, addr, changed, misc)
code1 = bfd_get_8 (abfd, misc->contents + last + 1);
if (IS_PAGE_OPCODE (code0, code1))
- relaxed = false;
+ relaxed = FALSE;
else if (! IS_JMP_OPCODE (code0, code1))
break;
@@ -706,7 +730,7 @@ unrelax_switch_dispatch_tables_passN (abfd, sec, addr, changed, misc)
reached the end of the section then fail the
relaxation. */
if (last >= sec->_cooked_size)
- return false;
+ return FALSE;
/* If we found an unrelaxed entry then
unrelax all the switch table entries. */
@@ -714,10 +738,10 @@ unrelax_switch_dispatch_tables_passN (abfd, sec, addr, changed, misc)
{
if (! unrelax_dispatch_table_entries (abfd, sec, first,
last, changed, misc))
- return false;
+ return FALSE;
- if (! is_switch_256_dispatch_table_p (abfd, addr, true, misc))
- return false;
+ if (! is_switch_256_dispatch_table_p (abfd, addr, TRUE, misc))
+ return FALSE;
/* Unrelax the prologue. */
@@ -727,7 +751,7 @@ unrelax_switch_dispatch_tables_passN (abfd, sec, addr, changed, misc)
inc_1_sp_opcode,
sizeof (inc_1_sp_opcode),
0))
- return false;
+ return FALSE;
/* Insert an SNC insnstruction. */
if (! ip2k_elf_relax_add_bytes (abfd, sec,
@@ -735,7 +759,7 @@ unrelax_switch_dispatch_tables_passN (abfd, sec, addr, changed, misc)
snc_opcode,
sizeof (snc_opcode),
0))
- return false;
+ return FALSE;
/* Insert an ADD W,WREG insnstruction. */
if (! ip2k_elf_relax_add_bytes (abfd, sec,
@@ -743,24 +767,24 @@ unrelax_switch_dispatch_tables_passN (abfd, sec, addr, changed, misc)
add_w_wreg_opcode,
sizeof (add_w_wreg_opcode),
0))
- return false;
+ return FALSE;
}
- return true;
+ return TRUE;
}
}
- return true;
+ return TRUE;
}
/* This function handles relaxing for the ip2k. */
-static boolean
+static bfd_boolean
ip2k_elf_relax_section (abfd, sec, link_info, again)
bfd *abfd;
asection *sec;
struct bfd_link_info *link_info;
- boolean *again;
+ bfd_boolean *again;
{
Elf_Internal_Shdr *symtab_hdr;
Elf_Internal_Rela *internal_relocs;
@@ -768,21 +792,21 @@ ip2k_elf_relax_section (abfd, sec, link_info, again)
Elf_Internal_Sym *isymbuf = NULL;
static asection * first_section = NULL;
static asection * last_section = NULL;
- static boolean changed = false;
- static boolean final_pass = false;
+ static bfd_boolean changed = FALSE;
+ static bfd_boolean final_pass = FALSE;
static unsigned int pass = 0;
struct misc misc;
asection *stab;
/* Assume nothing changes. */
- *again = false;
+ *again = FALSE;
if (first_section == NULL)
first_section = sec;
if (first_section == sec)
{
- changed = false;
+ changed = FALSE;
pass++;
}
@@ -791,7 +815,7 @@ ip2k_elf_relax_section (abfd, sec, link_info, again)
Note if everything is working correctly then the
relaxation should converge reasonably quickly. */
if (pass == 4096)
- return false;
+ return FALSE;
/* We don't have to do anything for a relocatable link,
if this section does not have relocs, or if this is
@@ -800,7 +824,7 @@ ip2k_elf_relax_section (abfd, sec, link_info, again)
|| (sec->flags & SEC_RELOC) == 0
|| sec->reloc_count == 0
|| (sec->flags & SEC_CODE) == 0)
- return true;
+ return TRUE;
if (pass == 1)
last_section = sec;
@@ -849,7 +873,7 @@ ip2k_elf_relax_section (abfd, sec, link_info, again)
goto error_return;
}
}
-
+
/* Read this BFD's symbols cached copy if it exists. */
if (isymbuf == NULL && symtab_hdr->sh_info != 0)
{
@@ -866,7 +890,7 @@ ip2k_elf_relax_section (abfd, sec, link_info, again)
misc.isymbuf = isymbuf;
misc.irelbase = internal_relocs;
misc.contents = contents;
-
+
/* This is where all the relaxation actually get done. */
if (pass == 1)
@@ -883,7 +907,7 @@ ip2k_elf_relax_section (abfd, sec, link_info, again)
}
else
{
- /* Add page instructions back in as needed but we ignore
+ /* Add page instructions back in as needed but we ignore
the issue with sections (functions) crossing a page
boundary until we have converged to an approximate
solution (i.e. nothing has changed on this relaxation
@@ -911,18 +935,18 @@ ip2k_elf_relax_section (abfd, sec, link_info, again)
pass restart the final relaxaton pass. */
if (! changed && last_section == sec)
{
- /* If this was the final pass and we didn't reset
+ /* If this was the final pass and we didn't reset
the final pass flag then we are done, otherwise
do another final pass. */
if (! final_pass)
{
- final_pass = true;
- *again = true;
+ final_pass = TRUE;
+ *again = TRUE;
}
}
}
- /* Perform some house keeping after relaxing the section. */
+ /* Perform some house keeping after relaxing the section. */
if (isymbuf != NULL
&& symtab_hdr->contents != (unsigned char *) isymbuf)
@@ -949,7 +973,7 @@ ip2k_elf_relax_section (abfd, sec, link_info, again)
&& elf_section_data (sec)->relocs != internal_relocs)
free (internal_relocs);
- return true;
+ return TRUE;
error_return:
if (isymbuf != NULL
@@ -961,16 +985,16 @@ ip2k_elf_relax_section (abfd, sec, link_info, again)
if (internal_relocs != NULL
&& elf_section_data (sec)->relocs != internal_relocs)
free (internal_relocs);
- return false;
+ return FALSE;
}
/* This function handles relaxation during the first pass. */
-static boolean
+static bfd_boolean
ip2k_elf_relax_section_pass1 (abfd, sec, again, misc)
bfd *abfd;
asection *sec;
- boolean *again;
+ bfd_boolean *again;
struct misc * misc;
{
Elf_Internal_Rela *irelend = misc->irelbase + sec->reloc_count;
@@ -997,8 +1021,8 @@ ip2k_elf_relax_section_pass1 (abfd, sec, again, misc)
/* Handle switch dispatch tables/prologues. */
if (! relax_switch_dispatch_tables_pass1 (abfd, sec,
irel->r_offset, misc))
- return false;
-
+ return FALSE;
+
/* Fix the relocation's type. */
irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
R_IP2K_NONE);
@@ -1007,31 +1031,31 @@ ip2k_elf_relax_section_pass1 (abfd, sec, again, misc)
if (! ip2k_elf_relax_delete_bytes (abfd, sec,
irel->r_offset,
sizeof (page_opcode)))
- return false;
+ return FALSE;
/* That will change things, so, we should relax again.
Note that this is not required, and it may be slow. */
- *again = true;
+ *again = TRUE;
}
}
}
- return true;
+ return TRUE;
}
/* This function handles relaxation for 2nd and subsequent passes. */
-static boolean
+static bfd_boolean
ip2k_elf_relax_section_passN (abfd, sec, again, final_pass, misc)
bfd *abfd;
asection *sec;
- boolean *again;
- boolean *final_pass;
+ bfd_boolean *again;
+ bfd_boolean *final_pass;
struct misc * misc;
{
Elf_Internal_Rela *irelend = misc->irelbase + sec->reloc_count;
Elf_Internal_Rela *irel;
- boolean add_all;
+ bfd_boolean add_all;
/* If we are on the final relaxation pass and the section crosses
then set a flag to indicate that *all* page instructions need
@@ -1055,12 +1079,12 @@ ip2k_elf_relax_section_passN (abfd, sec, again, final_pass, misc)
{
sec->userdata = NULL;
if (! ip2k_elf_relax_section_pass1 (abfd, sec, again, misc))
- return false;
+ return FALSE;
}
}
}
else
- add_all = false;
+ add_all = FALSE;
/* Walk thru the section looking for call/jmp
instructions which need a page instruction. */
@@ -1100,10 +1124,10 @@ ip2k_elf_relax_section_passN (abfd, sec, again, final_pass, misc)
if (! unrelax_switch_dispatch_tables_passN (abfd, sec,
irel->r_offset,
again, misc))
- return false;
+ return FALSE;
if (*again)
- add_all = false;
+ add_all = FALSE;
}
code0 = bfd_get_8 (abfd, misc->contents + irel->r_offset - 2);
@@ -1117,21 +1141,21 @@ ip2k_elf_relax_section_passN (abfd, sec, again, final_pass, misc)
if (add_all || PAGENO (addr) != PAGENO (value))
{
if (! add_page_insn (abfd, sec, irel, misc))
- return false;
+ return FALSE;
/* That will have changed things, so, we must relax again. */
- *again = true;
+ *again = TRUE;
}
}
}
}
}
-
+
/* If anything changed reset the final pass flag. */
if (*again)
- *final_pass = false;
+ *final_pass = FALSE;
- return true;
+ return TRUE;
}
/* Parts of a Stabs entry. */
@@ -1162,7 +1186,7 @@ adjust_all_relocations (abfd, sec, addr, endaddr, count, noadj)
struct elf_link_hash_entry **sym_hashes;
struct elf_link_hash_entry **end_hashes;
unsigned int symcount;
-
+
symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
@@ -1245,7 +1269,7 @@ adjust_all_relocations (abfd, sec, addr, endaddr, count, noadj)
return;
}
-static boolean
+static bfd_boolean
add_page_insn (abfd, sec, irel, misc)
bfd *abfd;
asection *sec;
@@ -1262,7 +1286,7 @@ add_page_insn (abfd, sec, irel, misc)
page_opcode,
sizeof (page_opcode),
sizeof (page_opcode)))
- return false;
+ return FALSE;
else
{
Elf_Internal_Rela * jrel = irel - 1;
@@ -1272,7 +1296,7 @@ add_page_insn (abfd, sec, irel, misc)
{
bfd_byte code0, code1;
char *msg = NULL;
-
+
/* Get the opcode. */
code0 = bfd_get_8 (abfd, misc->contents + irel->r_offset);
code1 = bfd_get_8 (abfd, misc->contents + irel->r_offset + 1);
@@ -1289,7 +1313,7 @@ add_page_insn (abfd, sec, irel, misc)
fprintf (stderr, msg, sec->owner->filename);
}
- return false;
+ return FALSE;
}
jrel->r_addend = irel->r_addend;
@@ -1298,12 +1322,12 @@ add_page_insn (abfd, sec, irel, misc)
R_IP2K_PAGE3);
}
- return true;
+ return TRUE;
}
/* Insert bytes into a section while relaxing. */
-static boolean
+static bfd_boolean
ip2k_elf_relax_add_bytes (abfd, sec, addr, bytes, count, noadj)
bfd *abfd;
asection *sec;
@@ -1320,16 +1344,16 @@ ip2k_elf_relax_add_bytes (abfd, sec, addr, bytes, count, noadj)
/* Insert the bytes into the section. */
memcpy (contents + addr, bytes, count);
-
+
sec->_cooked_size += count;
adjust_all_relocations (abfd, sec, addr, endaddr, count, noadj);
- return true;
+ return TRUE;
}
/* Delete some bytes from a section while relaxing. */
-static boolean
+static bfd_boolean
ip2k_elf_relax_delete_bytes (abfd, sec, addr, count)
bfd *abfd;
asection *sec;
@@ -1346,7 +1370,7 @@ ip2k_elf_relax_delete_bytes (abfd, sec, addr, count)
sec->_cooked_size -= count;
adjust_all_relocations (abfd, sec, addr + count, endaddr, -count, 0);
- return true;
+ return TRUE;
}
/* -------------------------------------------------------------------- */
@@ -1467,25 +1491,25 @@ ip2k_final_link_relocate (howto, input_bfd, input_section, contents, rel,
section, which means that the addend must be adjusted
accordingly. */
-static boolean
+static bfd_boolean
ip2k_elf_relocate_section (output_bfd, info, input_bfd, input_section,
contents, relocs, local_syms, local_sections)
- bfd * output_bfd ATTRIBUTE_UNUSED;
- struct bfd_link_info * info;
- bfd * input_bfd;
- asection * input_section;
- bfd_byte * contents;
- Elf_Internal_Rela * relocs;
- Elf_Internal_Sym * local_syms;
- asection ** local_sections;
+ bfd *output_bfd ATTRIBUTE_UNUSED;
+ struct bfd_link_info *info;
+ bfd *input_bfd;
+ asection *input_section;
+ bfd_byte *contents;
+ Elf_Internal_Rela *relocs;
+ Elf_Internal_Sym *local_syms;
+ asection **local_sections;
{
- Elf_Internal_Shdr * symtab_hdr;
- struct elf_link_hash_entry ** sym_hashes;
- Elf_Internal_Rela * rel;
- Elf_Internal_Rela * relend;
+ Elf_Internal_Shdr *symtab_hdr;
+ struct elf_link_hash_entry **sym_hashes;
+ Elf_Internal_Rela *rel;
+ Elf_Internal_Rela *relend;
if (info->relocateable)
- return true;
+ return TRUE;
symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
sym_hashes = elf_sym_hashes (input_bfd);
@@ -1502,7 +1526,7 @@ ip2k_elf_relocate_section (output_bfd, info, input_bfd, input_section,
bfd_reloc_status_type r;
const char * name = NULL;
int r_type;
-
+
/* This is a final link. */
r_type = ELF32_R_TYPE (rel->r_info);
r_symndx = ELF32_R_SYM (rel->r_info);
@@ -1510,13 +1534,13 @@ ip2k_elf_relocate_section (output_bfd, info, input_bfd, input_section,
h = NULL;
sym = NULL;
sec = NULL;
-
+
if (r_symndx < symtab_hdr->sh_info)
{
sym = local_syms + r_symndx;
sec = local_sections [r_symndx];
relocation = BASEADDR (sec) + sym->st_value;
-
+
name = bfd_elf_string_from_elf_section
(input_bfd, symtab_hdr->sh_link, sym->st_name);
name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
@@ -1524,13 +1548,13 @@ ip2k_elf_relocate_section (output_bfd, info, input_bfd, input_section,
else
{
h = sym_hashes [r_symndx - symtab_hdr->sh_info];
-
+
while (h->root.type == bfd_link_hash_indirect
|| h->root.type == bfd_link_hash_warning)
h = (struct elf_link_hash_entry *) h->root.u.i.link;
name = h->root.root.string;
-
+
if (h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak)
{
@@ -1547,7 +1571,7 @@ ip2k_elf_relocate_section (output_bfd, info, input_bfd, input_section,
(info, h->root.root.string, input_bfd,
input_section, rel->r_offset,
(! info->shared || info->no_undefined))))
- return false;
+ return FALSE;
relocation = 0;
}
}
@@ -1567,12 +1591,12 @@ ip2k_elf_relocate_section (output_bfd, info, input_bfd, input_section,
(info, name, howto->name, (bfd_vma) 0,
input_bfd, input_section, rel->r_offset);
break;
-
+
case bfd_reloc_undefined:
r = info->callbacks->undefined_symbol
- (info, name, input_bfd, input_section, rel->r_offset, true);
+ (info, name, input_bfd, input_section, rel->r_offset, TRUE);
break;
-
+
case bfd_reloc_outofrange:
msg = _("internal error: out of range error");
break;
@@ -1598,11 +1622,11 @@ ip2k_elf_relocate_section (output_bfd, info, input_bfd, input_section,
(info, msg, name, input_bfd, input_section, rel->r_offset);
if (! r)
- return false;
+ return FALSE;
}
}
- return true;
+ return TRUE;
}
static asection *
@@ -1617,7 +1641,7 @@ ip2k_elf_gc_mark_hook (sec, info, rel, h, sym)
{
switch (ELF32_R_TYPE (rel->r_info))
{
-#if 0
+#if 0
case R_IP2K_GNU_VTINHERIT:
case R_IP2K_GNU_VTENTRY:
break;
@@ -1651,7 +1675,7 @@ ip2k_elf_gc_mark_hook (sec, info, rel, h, sym)
return NULL;
}
-static boolean
+static bfd_boolean
ip2k_elf_gc_sweep_hook (abfd, info, sec, relocs)
bfd *abfd ATTRIBUTE_UNUSED;
struct bfd_link_info *info ATTRIBUTE_UNUSED;
@@ -1659,7 +1683,7 @@ ip2k_elf_gc_sweep_hook (abfd, info, sec, relocs)
const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
{
/* we don't use got and plt entries for ip2k */
- return true;
+ return TRUE;
}