1179407Sobrien/* bfd back-end for mips support 2179407Sobrien Copyright 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001, 3218822Sdim 2002, 2003, 2004, 2007 Free Software Foundation, Inc. 4179407Sobrien Written by Steve Chamberlain of Cygnus Support. 5179407Sobrien 6179407SobrienThis file is part of BFD, the Binary File Descriptor library. 7179407Sobrien 8179407SobrienThis program is free software; you can redistribute it and/or modify 9179407Sobrienit under the terms of the GNU General Public License as published by 10179407Sobrienthe Free Software Foundation; either version 2 of the License, or 11179407Sobrien(at your option) any later version. 12179407Sobrien 13179407SobrienThis program is distributed in the hope that it will be useful, 14179407Sobrienbut WITHOUT ANY WARRANTY; without even the implied warranty of 15179407SobrienMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16179407SobrienGNU General Public License for more details. 17179407Sobrien 18179407SobrienYou should have received a copy of the GNU General Public License 19179407Sobrienalong with this program; if not, write to the Free Software 20208737SjmallettFoundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ 21179407Sobrien 22218822Sdim#include "sysdep.h" 23179407Sobrien#include "bfd.h" 24179407Sobrien#include "libbfd.h" 25179407Sobrien 26179407Sobrienstatic const bfd_arch_info_type *mips_compatible 27179407Sobrien (const bfd_arch_info_type *, const bfd_arch_info_type *); 28179407Sobrien 29179407Sobrien/* The default routine tests bits_per_word, which is wrong on mips as 30179407Sobrien mips word size doesn't correlate with reloc size. */ 31179407Sobrien 32179407Sobrienstatic const bfd_arch_info_type * 33179407Sobrienmips_compatible (const bfd_arch_info_type *a, const bfd_arch_info_type *b) 34179407Sobrien{ 35179407Sobrien if (a->arch != b->arch) 36179407Sobrien return NULL; 37179407Sobrien 38179407Sobrien /* Machine compatibility is checked in 39179407Sobrien _bfd_mips_elf_merge_private_bfd_data. */ 40179407Sobrien 41179407Sobrien return a; 42179407Sobrien} 43179407Sobrien 44179407Sobrien#define N(BITS_WORD, BITS_ADDR, NUMBER, PRINT, DEFAULT, NEXT) \ 45179407Sobrien { \ 46179407Sobrien BITS_WORD, /* bits in a word */ \ 47179407Sobrien BITS_ADDR, /* bits in an address */ \ 48179407Sobrien 8, /* 8 bits in a byte */ \ 49179407Sobrien bfd_arch_mips, \ 50179407Sobrien NUMBER, \ 51179407Sobrien "mips", \ 52179407Sobrien PRINT, \ 53179407Sobrien 3, \ 54179407Sobrien DEFAULT, \ 55179407Sobrien mips_compatible, \ 56179407Sobrien bfd_default_scan, \ 57179407Sobrien NEXT, \ 58179407Sobrien } 59179407Sobrien 60179407Sobrienenum 61179407Sobrien{ 62179407Sobrien I_mips3000, 63179407Sobrien I_mips3900, 64179407Sobrien I_mips4000, 65179407Sobrien I_mips4010, 66179407Sobrien I_mips4100, 67179407Sobrien I_mips4111, 68179407Sobrien I_mips4120, 69179407Sobrien I_mips4300, 70179407Sobrien I_mips4400, 71179407Sobrien I_mips4600, 72179407Sobrien I_mips4650, 73179407Sobrien I_mips5000, 74179407Sobrien I_mips5400, 75179407Sobrien I_mips5500, 76179407Sobrien I_mips6000, 77179407Sobrien I_mips7000, 78179407Sobrien I_mips8000, 79208737Sjmallett I_mips9000, 80179407Sobrien I_mips10000, 81179407Sobrien I_mips12000, 82179407Sobrien I_mips16, 83179407Sobrien I_mips5, 84179407Sobrien I_mipsisa32, 85179407Sobrien I_mipsisa32r2, 86179407Sobrien I_mipsisa64, 87179407Sobrien I_mipsisa64r2, 88208737Sjmallett I_mipsocteon, 89179407Sobrien I_sb1, 90179407Sobrien}; 91179407Sobrien 92179407Sobrien#define NN(index) (&arch_info_struct[(index) + 1]) 93179407Sobrien 94179407Sobrienstatic const bfd_arch_info_type arch_info_struct[] = 95179407Sobrien{ 96179407Sobrien N (32, 32, bfd_mach_mips3000, "mips:3000", FALSE, NN(I_mips3000)), 97179407Sobrien N (32, 32, bfd_mach_mips3900, "mips:3900", FALSE, NN(I_mips3900)), 98179407Sobrien N (64, 64, bfd_mach_mips4000, "mips:4000", FALSE, NN(I_mips4000)), 99179407Sobrien N (64, 64, bfd_mach_mips4010, "mips:4010", FALSE, NN(I_mips4010)), 100179407Sobrien N (64, 64, bfd_mach_mips4100, "mips:4100", FALSE, NN(I_mips4100)), 101179407Sobrien N (64, 64, bfd_mach_mips4111, "mips:4111", FALSE, NN(I_mips4111)), 102179407Sobrien N (64, 64, bfd_mach_mips4120, "mips:4120", FALSE, NN(I_mips4120)), 103179407Sobrien N (64, 64, bfd_mach_mips4300, "mips:4300", FALSE, NN(I_mips4300)), 104179407Sobrien N (64, 64, bfd_mach_mips4400, "mips:4400", FALSE, NN(I_mips4400)), 105179407Sobrien N (64, 64, bfd_mach_mips4600, "mips:4600", FALSE, NN(I_mips4600)), 106179407Sobrien N (64, 64, bfd_mach_mips4650, "mips:4650", FALSE, NN(I_mips4650)), 107179407Sobrien N (64, 64, bfd_mach_mips5000, "mips:5000", FALSE, NN(I_mips5000)), 108179407Sobrien N (64, 64, bfd_mach_mips5400, "mips:5400", FALSE, NN(I_mips5400)), 109179407Sobrien N (64, 64, bfd_mach_mips5500, "mips:5500", FALSE, NN(I_mips5500)), 110179407Sobrien N (32, 32, bfd_mach_mips6000, "mips:6000", FALSE, NN(I_mips6000)), 111179407Sobrien N (64, 64, bfd_mach_mips7000, "mips:7000", FALSE, NN(I_mips7000)), 112179407Sobrien N (64, 64, bfd_mach_mips8000, "mips:8000", FALSE, NN(I_mips8000)), 113208737Sjmallett N (64, 64, bfd_mach_mips9000, "mips:9000", FALSE, NN(I_mips9000)), 114179407Sobrien N (64, 64, bfd_mach_mips10000,"mips:10000", FALSE, NN(I_mips10000)), 115179407Sobrien N (64, 64, bfd_mach_mips12000,"mips:12000", FALSE, NN(I_mips12000)), 116179407Sobrien N (64, 64, bfd_mach_mips16, "mips:16", FALSE, NN(I_mips16)), 117179407Sobrien N (64, 64, bfd_mach_mips5, "mips:mips5", FALSE, NN(I_mips5)), 118179407Sobrien N (32, 32, bfd_mach_mipsisa32, "mips:isa32", FALSE, NN(I_mipsisa32)), 119179407Sobrien N (32, 32, bfd_mach_mipsisa32r2,"mips:isa32r2", FALSE, NN(I_mipsisa32r2)), 120179407Sobrien N (64, 64, bfd_mach_mipsisa64, "mips:isa64", FALSE, NN(I_mipsisa64)), 121179407Sobrien N (64, 64, bfd_mach_mipsisa64r2,"mips:isa64r2", FALSE, NN(I_mipsisa64r2)), 122208737Sjmallett N (64, 64, bfd_mach_mips_octeon,"mips:octeon", FALSE, NN(I_mipsocteon)), 123179407Sobrien N (64, 64, bfd_mach_mips_sb1, "mips:sb1", FALSE, 0), 124179407Sobrien}; 125179407Sobrien 126179407Sobrien/* The default architecture is mips:3000, but with a machine number of 127179407Sobrien zero. This lets the linker distinguish between a default setting 128179407Sobrien of mips, and an explicit setting of mips:3000. */ 129179407Sobrien 130179407Sobrienconst bfd_arch_info_type bfd_mips_arch = 131179407SobrienN (32, 32, 0, "mips", TRUE, &arch_info_struct[0]); 132