1 /* BFD library support routines for the H8/500 architecture. 2 Copyright (C) 1993, 1994, 1995, 1999 Free Software Foundation, Inc. 3 Hacked by Steve Chamberlain of Cygnus Support. 4 5 This file is part of BFD, the Binary File Descriptor library. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 2 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 20 21 #include "bfd.h" 22 #include "sysdep.h" 23 #include "libbfd.h" 24 25 #if 0 26 27 /* 28 Relocations for the Z8K 29 30 */ 31 static bfd_reloc_status_type 32 howto16_callback (abfd, reloc_entry, symbol_in, data, 33 ignore_input_section, ignore_bfd) 34 bfd *abfd; 35 arelent *reloc_entry; 36 struct symbol_cache_entry *symbol_in; 37 PTR data; 38 asection *ignore_input_section; 39 bfd *ignore_bfd; 40 { 41 long relocation = 0; 42 bfd_vma addr = reloc_entry->address; 43 long x = bfd_get_16(abfd, (bfd_byte *)data + addr); 44 45 HOWTO_PREPARE(relocation, symbol_in); 46 47 x = (x + relocation + reloc_entry->addend); 48 49 bfd_put_16(abfd, x, (bfd_byte *)data + addr); 50 return bfd_reloc_ok; 51 } 52 53 54 static bfd_reloc_status_type 55 howto8_callback (abfd, reloc_entry, symbol_in, data, 56 ignore_input_section, ignore_bfd) 57 bfd *abfd; 58 arelent *reloc_entry; 59 struct symbol_cache_entry *symbol_in; 60 PTR data; 61 asection *ignore_input_section; 62 bfd *ignore_bfd; 63 { 64 long relocation = 0; 65 bfd_vma addr = reloc_entry->address; 66 long x = bfd_get_8(abfd, (bfd_byte *)data + addr); 67 68 HOWTO_PREPARE(relocation, symbol_in); 69 70 x = (x + relocation + reloc_entry->addend); 71 72 bfd_put_8(abfd, x, (bfd_byte *)data + addr); 73 return bfd_reloc_ok; 74 } 75 76 77 static bfd_reloc_status_type 78 howto8_FFnn_callback (abfd, reloc_entry, symbol_in, data, 79 ignore_input_section, ignore_bfd) 80 bfd *abfd; 81 arelent *reloc_entry; 82 struct symbol_cache_entry *symbol_in; 83 PTR data; 84 asection *ignore_input_section; 85 bfd *ignore_bfd; 86 { 87 long relocation = 0; 88 bfd_vma addr = reloc_entry->address; 89 90 long x = bfd_get_8(abfd, (bfd_byte *)data + addr); 91 abort(); 92 HOWTO_PREPARE(relocation, symbol_in); 93 94 x = (x + relocation + reloc_entry->addend); 95 96 bfd_put_8(abfd, x, (bfd_byte *)data + addr); 97 return bfd_reloc_ok; 98 } 99 100 static bfd_reloc_status_type 101 howto8_pcrel_callback (abfd, reloc_entry, symbol_in, data, 102 ignore_input_section, ignore_bfd) 103 bfd *abfd; 104 arelent *reloc_entry; 105 struct symbol_cache_entry *symbol_in; 106 PTR data; 107 asection *ignore_input_section; 108 bfd *ignore_bfd; 109 { 110 long relocation = 0; 111 bfd_vma addr = reloc_entry->address; 112 long x = bfd_get_8(abfd, (bfd_byte *)data + addr); 113 abort(); 114 HOWTO_PREPARE(relocation, symbol_in); 115 116 x = (x + relocation + reloc_entry->addend); 117 118 bfd_put_8(abfd, x, (bfd_byte *)data + addr); 119 return bfd_reloc_ok; 120 } 121 122 123 124 static reloc_howto_type howto_16 125 = NEWHOWTO(howto16_callback,"abs16",1,false,false); 126 static reloc_howto_type howto_8 127 = NEWHOWTO(howto8_callback,"abs8",0,false,false); 128 129 static reloc_howto_type howto_8_FFnn 130 = NEWHOWTO(howto8_FFnn_callback,"ff00+abs8",0,false,false); 131 132 static reloc_howto_type howto_8_pcrel 133 = NEWHOWTO(howto8_pcrel_callback,"pcrel8",0,false,true); 134 135 136 static reloc_howto_type * 137 local_bfd_reloc_type_lookup (arch, code) 138 const struct bfd_arch_info *arch; 139 bfd_reloc_code_real_type code; 140 { 141 switch (code) { 142 case BFD_RELOC_16: 143 return &howto_16; 144 case BFD_RELOC_8_FFnn: 145 return &howto_8_FFnn; 146 case BFD_RELOC_8: 147 return &howto_8; 148 case BFD_RELOC_8_PCREL: 149 return &howto_8_pcrel; 150 } 151 return (reloc_howto_type *)NULL; 152 } 153 #endif 154 155 int bfd_default_scan_num_mach(); 156 157 static boolean 158 scan_mach (info, string) 159 const struct bfd_arch_info *info ATTRIBUTE_UNUSED; 160 const char *string; 161 { 162 if (strcmp(string,"h8/500") == 0) return true; 163 if (strcmp(string,"H8/500") == 0) return true; 164 if (strcmp(string,"h8500") == 0) return true; 165 if (strcmp(string,"H8500") == 0) return true; 166 return false; 167 } 168 169 170 #if 0 /* not used currently */ 171 /* This routine is provided two arch_infos and returns whether 172 they'd be compatible */ 173 174 static const bfd_arch_info_type * 175 compatible (a,b) 176 const bfd_arch_info_type *a; 177 const bfd_arch_info_type *b; 178 { 179 if (a->arch != b->arch || a->mach != b->mach) 180 return NULL; 181 return a; 182 } 183 #endif 184 185 const bfd_arch_info_type bfd_h8500_arch = 186 { 187 16, /* 16 bits in a word */ 188 24, /* 24 bits in an address */ 189 8, /* 8 bits in a byte */ 190 bfd_arch_h8500, 191 0, /* only 1 machine */ 192 "h8500", /* arch_name */ 193 "h8500", /* printable name */ 194 1, 195 true, /* the default machine */ 196 bfd_default_compatible, 197 scan_mach, 198 0, 199 }; 200